ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDA2MGE3MWQuLjhkMTU4MzAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNDUsMyArNDUsNiBAQAogCiAjIGNzY29wZSBmaWxlcwogY3Njb3BlLioKKworKi5vcmlnCisqLnJlagpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKaW5kZXggZjA4Y2E5NS4uOGIwNTYzNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCkBAIC0xMiw2ICsxMiw4IEBACiAKIDAwLUlOREVYCiAJLSB0aGlzIGZpbGUuCitBQkkvCisJLSBpbmZvIG9uIGtlcm5lbCA8LT4gdXNlcnNwYWNlIEFCSSBhbmQgcmVsYXRpdmUgaW50ZXJmYWNlIHN0YWJpbGl0eS4KIEJVRy1IVU5USU5HCiAJLSBicnV0ZSBmb3JjZSBtZXRob2Qgb2YgZG9pbmcgYmluYXJ5IHNlYXJjaCBvZiBwYXRjaGVzIHRvIGZpbmQgYnVnLgogQ2hhbmdlcwpAQCAtMjUsMzcgKzI3LDU3IEBACiBEb2NCb29rLwogCS0gZGlyZWN0b3J5IHdpdGggRG9jQm9vayB0ZW1wbGF0ZXMgZXRjLiBmb3Iga2VybmVsIGRvY3VtZW50YXRpb24uCiBIT1dUTwotCS0gVGhlIHByb2Nlc3MgYW5kIHByb2NlZHVyZXMgb2YgaG93IHRvIGRvIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudC4KKwktIHRoZSBwcm9jZXNzIGFuZCBwcm9jZWR1cmVzIG9mIGhvdyB0byBkbyBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQuCiBJTy1tYXBwaW5nLnR4dAogCS0gaG93IHRvIGFjY2VzcyBJL08gbWFwcGVkIG1lbW9yeSBmcm9tIHdpdGhpbiBkZXZpY2UgZHJpdmVycy4KIElQTUkudHh0CiAJLSBpbmZvIG9uIExpbnV4IEludGVsbGlnZW50IFBsYXRmb3JtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChJUE1JKSBEcml2ZXIuCiBJUlEtYWZmaW5pdHkudHh0CiAJLSBob3cgdG8gc2VsZWN0IHdoaWNoIENQVShzKSBoYW5kbGUgd2hpY2ggaW50ZXJydXB0IGV2ZW50cyBvbiBTTVAuCitJUlEudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB3aGF0IGFuIElSUSBpcy4KIE1hbmFnZW1lbnRTdHlsZQogCS0gaG93IHRvIChhdHRlbXB0IHRvKSBtYW5hZ2Uga2VybmVsIGhhY2tlcnMuCiBNU0ktSE9XVE8udHh0CiAJLSB0aGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHRzIChNU0kpIERyaXZlciBHdWlkZSBIT1dUTyBhbmQgRkFRLgorUENJRUJVUy1IT1dUTy50eHQKKwktIGEgZ3VpZGUgZGVzY3JpYmluZyB0aGUgUENJIEV4cHJlc3MgUG9ydCBCdXMgZHJpdmVyLgogUkNVLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBvbiBSQ1UgKHJlYWQtY29weSB1cGRhdGUpLgogUkVBRE1FLkRBQzk2MAogCS0gaW5mbyBvbiBNeWxleCBEQUM5NjAvREFDMTEwMCBQQ0kgUkFJRCBDb250cm9sbGVyIERyaXZlciBmb3IgTGludXguCitSRUFETUUuY3ljbGFkZXNaCisJLSBpbmZvIG9uIEN5Y2xhZGVzLVogZmlybXdhcmUgbG9hZGluZy4KIFNBSy50eHQKIAktIGluZm8gb24gU2VjdXJlIEF0dGVudGlvbiBLZXlzLgorU2VjdXJpdHlCdWdzCisJLSBwcm9jZWR1cmUgZm9yIHJlcG9ydGluZyBzZWN1cml0eSBidWdzIGZvdW5kIGluIHRoZSBrZXJuZWwuCitTdWJtaXRDaGVja2xpc3QKKwktIExpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdC4KIFN1Ym1pdHRpbmdEcml2ZXJzCiAJLSBwcm9jZWR1cmUgdG8gZ2V0IGEgbmV3IGRyaXZlciBzb3VyY2UgaW5jbHVkZWQgaW50byB0aGUga2VybmVsIHRyZWUuCiBTdWJtaXR0aW5nUGF0Y2hlcwogCS0gcHJvY2VkdXJlIHRvIGdldCBhIHNvdXJjZSBwYXRjaCBpbmNsdWRlZCBpbnRvIHRoZSBrZXJuZWwgdHJlZS4KIFZHQS1zb2Z0Y3Vyc29yLnR4dAogCS0gaG93IHRvIGNoYW5nZSB5b3VyIFZHQSBjdXJzb3IgZnJvbSBhIGJsaW5raW5nIHVuZGVyc2NvcmUuCithY2NvdW50aW5nLworCS0gZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50aW5nIGFuZCB0YXNrc3RhdHMuCithb2UvCisJLSBkZXNjcmlwdGlvbiBvZiBBb0UgKEFUQSBvdmVyIEV0aGVybmV0KSBhbG9uZyB3aXRoIGNvbmZpZyBleGFtcGxlcy4KIGFwcGx5aW5nLXBhdGNoZXMudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB2YXJpb3VzIHRyZWVzIGFuZCBob3cgdG8gYXBwbHkgdGhlaXIgcGF0Y2hlcy4KIGFybS8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gYWJvdXQgTGludXggb24gdGhlIEFSTSBhcmNoaXRlY3R1cmUuCithdG9taWNfb3BzLnR4dAorCS0gc2VtYW50aWNzIGFuZCBiZWhhdmlvciBvZiBhdG9taWMgYW5kIGJpdG1hc2sgb3BlcmF0aW9ucy4KK2F1eGRpc3BsYXkvCisJLSBtaXNjLiBMQ0QgZHJpdmVyIGRvY3VtZW50YXRpb24gKGNmYWcxMjg2NGIsIGtzMDEwOCkuCiBiYXNpY19wcm9maWxpbmcudHh0CiAJLSBiYXNpYyBpbnN0cnVjdGlvbnMgZm9yIHRob3NlIHdobyB3YW50cyB0byBwcm9maWxlIExpbnV4IGtlcm5lbC4KIGJpbmZtdF9taXNjLnR4dAogCS0gaW5mbyBvbiB0aGUga2VybmVsIHN1cHBvcnQgZm9yIGV4dHJhIGJpbmFyeSBmb3JtYXRzLgorYmxhY2tmaW4vCisJLSBkaXJlY3Rvcnkgd2l0aCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQmxhY2tmaW4gYXJjaC4KIGJsb2NrLwogCS0gaW5mbyBvbiB0aGUgQmxvY2sgSS9PIChCSU8pIGxheWVyLgogY2FjaGV0bGIudHh0CkBAIC02OCwxNiArOTAsMzIgQEAKIAktIGNsaSgpL3N0aSgpIHJlbW92YWwgZ3VpZGUuCiBjb21wdXRvbmUudHh0CiAJLSBpbmZvIG9uIENvbXB1dG9uZSBJbnRlbGxpcG9ydCBJSS9QbHVzIE11bHRpcG9ydCBTZXJpYWwgRHJpdmVyLgorY29ubmVjdG9yLworCS0gZG9jcyBvbiB0aGUgbmV0bGluayBiYXNlZCB1c2Vyc3BhY2U8LT5rZXJuZWwgc3BhY2UgY29tbXVuaWNhdGlvbiBtb2QuCitjb25zb2xlLworCS0gZG9jdW1lbnRhdGlvbiBvbiBMaW51eCBjb25zb2xlIGRyaXZlcnMuCiBjcHFhcnJheS50eHQKIAktIGluZm8gb24gdXNpbmcgQ29tcGFxJ3MgU01BUlQyIEludGVsbGlnZW50IERpc2sgQXJyYXkgQ29udHJvbGxlcnMuCiBjcHUtZnJlcS8KIAktIGluZm8gb24gQ1BVIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBzY2FsaW5nLgorY3B1LWhvdHBsdWcudHh0CisJLSBkb2N1bWVudCBkZXNjcmliaW5nIENQVSBob3RwbHVnIHN1cHBvcnQgaW4gdGhlIExpbnV4IGtlcm5lbC4KK2NwdS1sb2FkLnR4dAorCS0gZG9jdW1lbnQgZGVzY3JpYmluZyBob3cgQ1BVIGxvYWQgc3RhdGlzdGljcyBhcmUgY29sbGVjdGVkLgorY3B1c2V0cy50eHQKKwktIGRvY3VtZW50cyB0aGUgY3B1c2V0cyBmZWF0dXJlOyBhc3NpZ24gQ1BVcyBhbmQgTWVtIHRvIGEgc2V0IG9mIHRhc2tzLgorY3B1dG9wb2xvZ3kudHh0CisJLSBkb2N1bWVudGF0aW9uIG9uIGhvdyBDUFUgdG9wb2xvZ3kgaW5mbyBpcyBleHBvcnRlZCB2aWEgc3lzZnMuCiBjcmlzLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBDUklTIGFyY2hpdGVjdHVyZS4KIGNyeXB0by8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIENyeXB0byBBUEkuCitkY2RiYXMudHh0CisJLSBpbmZvcm1hdGlvbiBvbiB0aGUgRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIuCiBkZWJ1Z2dpbmctbW9kdWxlcy50eHQKIAktIHNvbWUgbm90ZXMgb24gZGVidWdnaW5nIG1vZHVsZXMgYWZ0ZXIgTGludXggMi42LjMuCitkZWxsX3JidS50eHQKKwktIGRvY3VtZW50IGRlbW9uc3RyYXRpbmcgdGhlIHVzZSBvZiB0aGUgRGVsbCBSZW1vdGUgQklPUyBVcGRhdGUgZHJpdmVyLgogZGV2aWNlLW1hcHBlci8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gRGV2aWNlIE1hcHBlci4KIGRldmljZXMudHh0CkBAIC04NiwzMiArMTI0LDUyIEBACiAJLSBpbmZvIG9uIERpZ2kgSW50bC4ge1BDLFBDSSxFSVNBfVh4IGFuZCBYZW0gc2VyaWVzIGNhcmRzLgogZG5vdGlmeS50eHQKIAktIGluZm8gYWJvdXQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBpbiBMaW51eC4KK2RvbnRkaWZmCisJLSBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGVzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGRpZmYnZWQuCiBkcml2ZXItbW9kZWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IGRyaXZlciBtb2RlbC4KK2RyaXZlcnMvCisJLSBkaXJlY3Rvcnkgd2l0aCBkcml2ZXIgZG9jdW1lbnRhdGlvbiAoY3VycmVudGx5IG9ubHkgRURBQykuCiBkdmIvCiAJLSBpbmZvIG9uIExpbnV4IERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0IChEVkIpIHN1YnN5c3RlbS4KIGVhcmx5LXVzZXJzcGFjZS8KIAktIGluZm8gYWJvdXQgaW5pdHJhbWZzLCBrbGliYywgYW5kIHVzZXJzcGFjZSBlYXJseSBkdXJpbmcgYm9vdC4KK2VjcnlwdGZzLnR4dAorCS0gZG9jcyBvbiBlQ3J5cHRmczogc3RhY2tlZCBjcnlwdG9ncmFwaGljIGZpbGVzeXN0ZW0gZm9yIExpbnV4LgogZWlzYS50eHQKIAktIGluZm8gb24gRUlTQSBidXMgc3VwcG9ydC4KIGV4Y2VwdGlvbi50eHQKIAktIGhvdyBMaW51eCB2Mi4yIGhhbmRsZXMgZXhjZXB0aW9ucyB3aXRob3V0IHZlcmlmeV9hcmVhIGV0Yy4KK2ZhdWx0LWluamVjdGlvbi8KKwktIGRpciB3aXRoIGRvY3MgYWJvdXQgdGhlIGZhdWx0IGluamVjdGlvbiBjYXBhYmlsaXRpZXMgaW5mcmFzdHJ1Y3R1cmUuCiBmYi8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIGZyYW1lIGJ1ZmZlciBncmFwaGljcyBhYnN0cmFjdGlvbiBsYXllci4KK2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKwktIGxpc3Qgb2YgZmlsZXMgYW5kIGZlYXR1cmVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHJlbW92ZWQuCiBmaWxlc3lzdGVtcy8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIHZhcmlvdXMgZmlsZXN5c3RlbXMgdGhhdCBMaW51eCBzdXBwb3J0cy4KIGZpcm13YXJlX2NsYXNzLwogCS0gcmVxdWVzdF9maXJtd2FyZSgpIGhvdHBsdWcgaW50ZXJmYWNlIGluZm8uCiBmbG9wcHkudHh0CiAJLSBub3RlcyBhbmQgZHJpdmVyIG9wdGlvbnMgZm9yIHRoZSBmbG9wcHkgZGlzayBkcml2ZXIuCitmdWppdHN1LworCS0gRnVqaXRzdSBGUi1WIExpbnV4IGRvY3VtZW50YXRpb24uCitncGlvLnR4dAorCS0gb3ZlcnZpZXcgb2YgR1BJTyAoR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCkgYWNjZXNzIGNvbnZlbnRpb25zLgogaGF5ZXMtZXNwLnR4dAogCS0gaW5mbyBvbiB1c2luZyB0aGUgSGF5ZXMgRVNQIHNlcmlhbCBkcml2ZXIuCiBoaWdodWlkLnR4dAogCS0gbm90ZXMgb24gdGhlIGNoYW5nZSBmcm9tIDE2IGJpdCB0byAzMiBiaXQgdXNlci9ncm91cCBJRHMuCiBocGV0LnR4dAogCS0gSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgRHJpdmVyIGZvciBMaW51eC4KK2hydGltZXIvCisJLSBpbmZvIG9uIHRoZSB0aW1lcl9zdGF0cyBkZWJ1Z2dpbmcgZmFjaWxpdHkgZm9yIHRpbWVyIChhYil1c2UuCitocnRpbWVycy8KKwktIGluZm8gb24gdGhlIGhydGltZXJzIHN1YnN5c3RlbSBmb3IgaGlnaC1yZXNvbHV0aW9uIGtlcm5lbCB0aW1lcnMuCiBod19yYW5kb20udHh0CiAJLSBpbmZvIG9uIExpbnV4IHN1cHBvcnQgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluIGk4eHggY2hpcHNldHMuCitod21vbi8KKwktIGRpcmVjdG9yeSB3aXRoIGRvY3Mgb24gdmFyaW91cyBoYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlcnMuCiBpMmMvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IHRoZSBJMkMgYnVzL3Byb3RvY29sICgyIHdpcmUsIGtIeiBzcGVlZCkuCiBpMm8vCkBAIC0xMjIsMTYgKzE4MCwyMiBAQAogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBJbnRlbCA2NCBiaXQgYXJjaGl0ZWN0dXJlLgogaWRlLnR4dAogCS0gaW1wb3J0YW50IGluZm8gZm9yIHVzZXJzIG9mIEFUQSBkZXZpY2VzIChJREUvRUlERSBkaXNrcyBhbmQgQ0QtUk9NUykuCitpbmZpbmliYW5kLworCS0gZGlyZWN0b3J5IHdpdGggZG9jdW1lbnRzIGNvbmNlcm5pbmcgTGludXggSW5maW5pQmFuZCBzdXBwb3J0LgogaW5pdHJkLnR4dAogCS0gaG93IHRvIHVzZSB0aGUgUkFNIGRpc2sgYXMgYW4gaW5pdGlhbC90ZW1wb3Jhcnkgcm9vdCBmaWxlc3lzdGVtLgogaW5wdXQvCiAJLSBpbmZvIG9uIExpbnV4IGlucHV0IGRldmljZSBzdXBwb3J0LgogaW9fb3JkZXJpbmcudHh0CiAJLSBpbmZvIG9uIG9yZGVyaW5nIEkvTyB3cml0ZXMgdG8gbWVtb3J5LW1hcHBlZCBhZGRyZXNzZXMuCitpb2N0bC8KKwktIGRpcmVjdG9yeSB3aXRoIGRvY3VtZW50cyBkZXNjcmliaW5nIHZhcmlvdXMgSU9DVEwgY2FsbHMuCiBpb2N0bC1udW1iZXIudHh0CiAJLSBob3cgdG8gaW1wbGVtZW50IGFuZCByZWdpc3RlciBkZXZpY2UvZHJpdmVyIGlvY3RsIGNhbGxzLgogaW9zdGF0cy50eHQKIAktIGluZm8gb24gSS9PIHN0YXRpc3RpY3MgTGludXgga2VybmVsIHByb3ZpZGVzLgoraXJxZmxhZ3MtdHJhY2luZy50eHQKKwktIGhvdyB0byB1c2UgdGhlIGlycS1mbGFncyB0cmFjaW5nIGZlYXR1cmUuCiBpc2FwbnAudHh0CiAJLSBpbmZvIG9uIExpbnV4IElTQSBQbHVnICYgUGxheSBzdXBwb3J0LgogaXNkbi8KQEAgLTE0MCwyNiArMjA0LDQwIEBACiAJLSBpbmZvIG9uIHRoZSBpbi1rZXJuZWwgYmluYXJ5IHN1cHBvcnQgZm9yIEphdmEodG0pLgoga2J1aWxkLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCB0aGUga2VybmVsIGJ1aWxkIHByb2Nlc3MuCi1rZHVtcHQudHh0Ci0gICAgICAgLSBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgora2R1bXAvCisJLSBkaXJlY3Rvcnkgd2l0aCBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgoga2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAogCS0gbWluaSBIb3dUbyBvbiBnZW5lcmF0aW9uIGFuZCBsb2NhdGlvbiBvZiBrZXJuZWwgZG9jdW1lbnRhdGlvbiBmaWxlcy4KIGtlcm5lbC1kb2NzLnR4dAogCS0gbGlzdGluZyBvZiB2YXJpb3VzIFdXVyArIGJvb2tzIHRoYXQgZG9jdW1lbnQga2VybmVsIGludGVybmFscy4KIGtlcm5lbC1wYXJhbWV0ZXJzLnR4dAogCS0gc3VtbWFyeSBsaXN0aW5nIG9mIGNvbW1hbmQgbGluZSAvIGJvb3QgcHJvbXB0IGFyZ3MgZm9yIHRoZSBrZXJuZWwuCitrZXlzLXJlcXVlc3Qta2V5LnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIGtlcm5lbCBrZXkgcmVxdWVzdCBzZXJ2aWNlLgora2V5cy50eHQKKwktIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXJuZWwga2V5IHJldGVudGlvbiBzZXJ2aWNlLgoga29iamVjdC50eHQKIAktIGluZm8gb2YgdGhlIGtvYmplY3QgaW5mcmFzdHJ1Y3R1cmUgb2YgdGhlIExpbnV4IGtlcm5lbC4KK2twcm9iZXMudHh0CisJLSBkb2N1bWVudHMgdGhlIGtlcm5lbCBwcm9iZXMgZGVidWdnaW5nIGZlYXR1cmUuCitrcmVmLnR4dAorCS0gZG9jcyBvbiBhZGRpbmcgcmVmZXJlbmNlIGNvdW50ZXJzIChrcmVmcykgdG8ga2VybmVsIG9iamVjdHMuCiBsYXB0b3AtbW9kZS50eHQKLQktIEhvdyB0byBjb25zZXJ2ZSBiYXR0ZXJ5IHBvd2VyIHVzaW5nIGxhcHRvcC1tb2RlLgorCS0gaG93IHRvIGNvbnNlcnZlIGJhdHRlcnkgcG93ZXIgdXNpbmcgbGFwdG9wLW1vZGUuCiBsZG0udHh0CiAJLSBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIExETSAoV2luZG93cyBEeW5hbWljIERpc2tzKS4KK2xlZHMtY2xhc3MudHh0CisJLSBkb2N1bWVudHMgTEVEIGhhbmRsaW5nIHVuZGVyIExpbnV4LgorbG9jYWxfb3BzLnR4dAorCS0gc2VtYW50aWNzIGFuZCBiZWhhdmlvciBvZiBsb2NhbCBhdG9taWMgb3BlcmF0aW9ucy4KK2xvY2tkZXAtZGVzaWduLnR4dAorCS0gZG9jdW1lbnRhdGlvbiBvbiB0aGUgcnVudGltZSBsb2NraW5nIGNvcnJlY3RuZXNzIHZhbGlkYXRvci4KIGxvY2tzLnR4dAogCS0gaW5mbyBvbiBmaWxlIGxvY2tpbmcgaW1wbGVtZW50YXRpb25zLCBmbG9jaygpIHZzLiBmY250bCgpLCBldGMuCiBsb2dvLmdpZgotCS0gRnVsbCBjb2xvdXIgR0lGIGltYWdlIG9mIExpbnV4IGxvZ28gKHBlbmd1aW4pLgorCS0gZnVsbCBjb2xvdXIgR0lGIGltYWdlIG9mIExpbnV4IGxvZ28gKHBlbmd1aW4gLSBUdXgpLgogbG9nby50eHQKLQktIEluZm8gb24gY3JlYXRvciBvZiBhYm92ZSBsb2dvICYgc2l0ZSB0byBnZXQgYWRkaXRpb25hbCBpbWFnZXMgZnJvbS4KKwktIGluZm8gb24gY3JlYXRvciBvZiBhYm92ZSBsb2dvICYgc2l0ZSB0byBnZXQgYWRkaXRpb25hbCBpbWFnZXMgZnJvbS4KIG02OGsvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IG9uIE1vdG9yb2xhIDY4ayBhcmNoaXRlY3R1cmUuCiBtYWdpYy1udW1iZXIudHh0CkBAIC0xNzAsNiArMjQ4LDggQEAKIAktIGluZm8gb24gc3VwcG9ydGluZyBNaWNybyBDaGFubmVsIEFyY2hpdGVjdHVyZSAoZS5nLiBQUy8yKSBzeXN0ZW1zLgogbWQudHh0CiAJLSBpbmZvIG9uIGJvb3QgYXJndW1lbnRzIGZvciB0aGUgbXVsdGlwbGUgZGV2aWNlcyBkcml2ZXIuCittZW1vcnktYmFycmllcnMudHh0CisJLSBpbmZvIG9uIExpbnV4IGtlcm5lbCBtZW1vcnkgYmFycmllcnMuCiBtZW1vcnkudHh0CiAJLSBpbmZvIG9uIHR5cGljYWwgTGludXggbWVtb3J5IHByb2JsZW1zLgogbWlwcy8KQEAgLTE3Nyw5ICsyNTcsMTEgQEAKIG1vbm8udHh0CiAJLSBob3cgdG8gZXhlY3V0ZSBNb25vLWJhc2VkIC5ORVQgYmluYXJpZXMgd2l0aCB0aGUgaGVscCBvZiBCSU5GTVRfTUlTQy4KIG1veGEtc21hcnRpbwotCS0gaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisJLSBmaWxlIHdpdGggaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiBtdHJyLnR4dAogCS0gaG93IHRvIHVzZSBQUHJvIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZS4KK211dGV4LWRlc2lnbi50eHQKKwktIGluZm8gb24gdGhlIGdlbmVyaWMgbXV0ZXggc3Vic3lzdGVtLgogbmJkLnR4dAogCS0gaW5mbyBvbiBhIFRDUCBpbXBsZW1lbnRhdGlvbiBvZiBhIG5ldHdvcmsgYmxvY2sgZGV2aWNlLgogbmV0bGFiZWwvCkBAIC0xOTAsNiArMjcyLDggQEAKIAktIHNob3J0IGd1aWRlIG9uIHNldHRpbmcgdXAgYSBkaXNrbGVzcyBib3ggd2l0aCBORlMgcm9vdCBmaWxlc3lzdGVtLgogbm1pX3dhdGNoZG9nLnR4dAogCS0gaW5mbyBvbiBOTUkgd2F0Y2hkb2cgZm9yIFNNUCBzeXN0ZW1zLgorbm9tbXUtbW1hcC50eHQKKwktIGRvY3VtZW50YXRpb24gYWJvdXQgbm8tbW11IG1lbW9yeSBtYXBwaW5nIHN1cHBvcnQuCiBudW1hc3RhdC50eHQKIAktIGluZm8gb24gaG93IHRvIHJlYWQgTnVtYSBwb2xpY3kgaGl0L21pc3Mgc3RhdGlzdGljcyBpbiBzeXNmcy4KIG9vcHMtdHJhY2luZy50eHQKQEAgLTIwMiw4ICsyODYsMTYgQEAKIAktIGhvdyB0byB1c2UgdGhlIHBhcmFsbGVsLXBvcnQgZHJpdmVyLgogcGFycG9ydC1sb3dsZXZlbC50eHQKIAktIGRlc2NyaXB0aW9uIGFuZCB1c2FnZSBvZiB0aGUgbG93IGxldmVsIHBhcmFsbGVsIHBvcnQgZnVuY3Rpb25zLgorcGNpLWVycm9yLXJlY292ZXJ5LnR4dAorCS0gaW5mbyBvbiBQQ0kgZXJyb3IgcmVjb3ZlcnkuCiBwY2kudHh0CiAJLSBpbmZvIG9uIHRoZSBQQ0kgc3Vic3lzdGVtIGZvciBkZXZpY2UgZHJpdmVyIGF1dGhvcnMuCitwY2llYWVyLWhvd3RvLnR4dAorCS0gdGhlIFBDSSBFeHByZXNzIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyBEcml2ZXIgR3VpZGUgSE9XVE8uCitwY21jaWEvCisJLSBpbmZvIG9uIHRoZSBMaW51eCBQQ01DSUEgZHJpdmVyLgorcGktZnV0ZXgudHh0CisJLSBkb2N1bWVudGF0aW9uIG9uIGxpZ2h0d2VpZ2h0IFBJLWZ1dGV4ZXMuCiBwbS50eHQKIAktIGluZm8gb24gTGludXggcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0LgogcG5wLnR4dApAQCAtMjE0LDE4ICszMDYsMzIgQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggd2l0aCB0aGUgUG93ZXJQQy4KIHByZWVtcHQtbG9ja2luZy50eHQKIAktIGluZm8gb24gbG9ja2luZyB1bmRlciBhIHByZWVtcHRpdmUga2VybmVsLgorcHJpb190cmVlLnR4dAorCS0gaW5mbyBvbiByYWRpeC1wcmlvcml0eS1zZWFyY2gtdHJlZSB1c2UgZm9yIGluZGV4aW5nIHZtYXMuCiByYW1kaXNrLnR4dAogCS0gc2hvcnQgZ3VpZGUgb24gaG93IHRvIHNldCB1cCBhbmQgdXNlIHRoZSBSQU0gZGlzay4KK3JidHJlZS50eHQKKwktIGluZm8gb24gd2hhdCByZWQtYmxhY2sgdHJlZXMgYXJlIGFuZCB3aGF0IHRoZXkgYXJlIGZvci4KIHJpc2NvbTgudHh0CiAJLSBub3RlcyBvbiB1c2luZyB0aGUgUklTQ29tLzggbXVsdGktcG9ydCBzZXJpYWwgZHJpdmVyLgorcm9idXN0LWZ1dGV4LUFCSS50eHQKKwktIGRvY3VtZW50YXRpb24gb2YgdGhlIHJvYnVzdCBmdXRleCBBQkkuCityb2J1c3QtZnV0ZXhlcy50eHQKKwktIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCByb2J1c3QgZnV0ZXhlcyBhcmUuCiByb2NrZXQudHh0CiAJLSBpbmZvIG9uIHRoZSBDb210cm9sIFJvY2tldFBvcnQgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiBycGMtY2FjaGUudHh0CiAJLSBpbnRyb2R1Y3Rpb24gdG8gdGhlIGNhY2hpbmcgbWVjaGFuaXNtcyBpbiB0aGUgc3VucnBjIGxheWVyLgorcnQtbXV0ZXgtZGVzaWduLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIFJlYWxUaW1lIG11dGV4IGltcGxlbWVudGF0aW9uIGRlc2lnbi4KK3J0LW11dGV4LnR4dAorCS0gZGVzYy4gb2YgUlQtbXV0ZXggc3Vic3lzdGVtIHdpdGggUEkgKFByaW9yaXR5IEluaGVyaXRhbmNlKSBzdXBwb3J0LgogcnRjLnR4dAogCS0gbm90ZXMgb24gaG93IHRvIHVzZSB0aGUgUmVhbCBUaW1lIENsb2NrIChha2EgQ01PUyBjbG9jaykgZHJpdmVyLgogczM5MC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggb24gdGhlIElCTSBTMzkwLgorc2NoZWQtYXJjaC50eHQKKwktIENQVSBTY2hlZHVsZXIgaW1wbGVtZW50YXRpb24gaGludHMgZm9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLgogc2NoZWQtY29kaW5nLnR4dAogCS0gcmVmZXJlbmNlIGZvciB2YXJpb3VzIHNjaGVkdWxlci1yZWxhdGVkIG1ldGhvZHMgaW4gdGhlIE8oMSkgc2NoZWR1bGVyLgogc2NoZWQtZGVzaWduLnR4dApAQCAtMjQwLDIyICszNDYsMzIgQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIGxvdyBsZXZlbCBzZXJpYWwgQVBJLgogc2VyaWFsLWNvbnNvbGUudHh0CiAJLSBob3cgdG8gc2V0IHVwIExpbnV4IHdpdGggYSBzZXJpYWwgbGluZSBjb25zb2xlIGFzIHRoZSBkZWZhdWx0Lgorc2dpLWlvYzQudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB0aGUgU0dJIElPQzQgUENJIChtdWx0aSBmdW5jdGlvbikgZGV2aWNlLgogc2dpLXZpc3dzLnR4dAogCS0gc2hvcnQgYmx1cmIgb24gdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zLgogc2gvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHBvcnRpbmcgTGludXggdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLgorc2hhcmVkc3VidHJlZS50eHQKKwktIGEgZGVzY3JpcHRpb24gb2Ygc2hhcmVkIHN1YnRyZWVzIGZvciBuYW1lc3BhY2VzLgogc21hcnQtY29uZmlnLnR4dAogCS0gZGVzY3JpcHRpb24gb2YgdGhlIFNtYXJ0IENvbmZpZyBtYWtlZmlsZSBmZWF0dXJlLgogc21wLnR4dAogCS0gYSBmZXcgbm90ZXMgb24gc3ltbWV0cmljIG11bHRpLXByb2Nlc3NpbmcuCitzb255LWxhcHRvcC50eHQKKwktIFNvbnkgTm90ZWJvb2sgQ29udHJvbCBEcml2ZXIgKFNOQykgUmVhZG1lLgogc29ueXBpLnR4dAogCS0gaW5mbyBvbiBMaW51eCBTb255IFByb2dyYW1tYWJsZSBJL08gRGV2aWNlIHN1cHBvcnQuCiBzb3VuZC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gc291bmQgY2FyZCBzdXBwb3J0Lgogc3BhcmMvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHVzaW5nIExpbnV4IG9uIFNwYXJjIGFyY2hpdGVjdHVyZS4KK3NwYXJzZS50eHQKKwktIGluZm8gb24gaG93IHRvIG9idGFpbiBhbmQgdXNlIHRoZSBzcGFyc2UgdG9vbCBmb3IgdHlwZWNoZWNraW5nLgogc3BlY2lhbGl4LnR4dAogCS0gaW5mbyBvbiBoYXJkd2FyZS9kcml2ZXIgZm9yIHNwZWNpYWxpeCBJTzgrIG11bHRpcG9ydCBzZXJpYWwgY2FyZC4KK3NwaS8KKwktIG92ZXJ2aWV3IG9mIExpbnV4IGtlcm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgc3VwcG9ydC4KIHNwaW5sb2Nrcy50eHQKIAktIGluZm8gb24gdXNpbmcgc3BpbmxvY2tzIHRvIHByb3ZpZGUgZXhjbHVzaXZlIGFjY2VzcyBpbiBrZXJuZWwuCiBzdGFibGVfYXBpX25vbnNlbnNlLnR4dApAQCAtMjc0LDI0ICszOTAsMzIgQEAKIAktIGluZm8gb24gdGhlIG1hZ2ljIFN5c1JxIGtleS4KIHRlbGVwaG9ueS8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGVsZXBob255IChlLmcuIHZvaWNlIG92ZXIgSVApIHN1cHBvcnQuCit0aGlua3BhZC1hY3BpLnR4dAorCS0gaW5mb3JtYXRpb24gb24gdGhlIChJQk0gYW5kIExlbm92bykgVGhpbmtQYWQgQUNQSSBFeHRyYXMgZHJpdmVyLgogdGltZV9pbnRlcnBvbGF0b3JzLnR4dAogCS0gaW5mbyBvbiB0aW1lIGludGVycG9sYXRvcnMuCiB0aXBhci50eHQKIAktIGluZm9ybWF0aW9uIGFib3V0IFBhcmFsbGVsIGxpbmsgY2FibGUgZm9yIFRleGFzIEluc3RydW1lbnRzIGhhbmRoZWxkcy4KIHR0eS50eHQKIAktIGd1aWRlIHRvIHRoZSBsb2NraW5nIHBvbGljaWVzIG9mIHRoZSB0dHkgbGF5ZXIuCi11bmljb2RlLnR4dAotCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCiB1bWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBVc2VyIE1vZGUgTGludXguCit1bmljb2RlLnR4dAorCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCit1bnNoYXJlLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIExpbnV4IHVuc2hhcmUgc3lzdGVtIGNhbGwuCiB1c2IvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIHJlZ2FyZGluZyB0aGUgVW5pdmVyc2FsIFNlcmlhbCBCdXMuCit2aWRlby1vdXRwdXQudHh0CisJLSBzeXNmcyBjbGFzcyBkcml2ZXIgaW50ZXJmYWNlIHRvIGVuYWJsZS9kaXNhYmxlIGEgdmlkZW8gb3V0cHV0IGRldmljZS4KIHZpZGVvNGxpbnV4LwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyByZWdhcmRpbmcgdmlkZW8vVFYvcmFkaW8gY2FyZHMgYW5kIGxpbnV4Lgogdm0vCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHRoZSBMaW51eCB2bSBjb2RlLgogdm95YWdlci50eHQKIAktIGd1aWRlIHRvIHJ1bm5pbmcgTGludXggb24gdGhlIFZveWFnZXIgYXJjaGl0ZWN0dXJlLgordzEvCisJLSBkaXJlY3Rvcnkgd2l0aCBkb2N1bWVudHMgcmVnYXJkaW5nIHRoZSAxLXdpcmUgKHcxKSBzdWJzeXN0ZW0uCiB3YXRjaGRvZy8KIAktIGhvdyB0byBhdXRvLXJlYm9vdCBMaW51eCBpZiBpdCBoYXMgImZhbGxlbiBhbmQgY2FuJ3QgZ2V0IHVwIi4gOy0pCiB4ODZfNjQvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCBiNDliOTJlLi5hNjY3ZWIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTIxOCw2ICsyMTgsMTggQEAKIAogYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgJy4nIGFuZCAiLT4iIHN0cnVjdHVyZSBtZW1iZXIgb3BlcmF0b3JzLgogCitEbyBub3QgbGVhdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBhdCB0aGUgZW5kcyBvZiBsaW5lcy4gIFNvbWUgZWRpdG9ycyB3aXRoCisic21hcnQiIGluZGVudGF0aW9uIHdpbGwgaW5zZXJ0IHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBuZXcgbGluZXMgYXMKK2FwcHJvcHJpYXRlLCBzbyB5b3UgY2FuIHN0YXJ0IHR5cGluZyB0aGUgbmV4dCBsaW5lIG9mIGNvZGUgcmlnaHQgYXdheS4KK0hvd2V2ZXIsIHNvbWUgc3VjaCBlZGl0b3JzIGRvIG5vdCByZW1vdmUgdGhlIHdoaXRlc3BhY2UgaWYgeW91IGVuZCB1cCBub3QKK3B1dHRpbmcgYSBsaW5lIG9mIGNvZGUgdGhlcmUsIHN1Y2ggYXMgaWYgeW91IGxlYXZlIGEgYmxhbmsgbGluZS4gIEFzIGEgcmVzdWx0LAoreW91IGVuZCB1cCB3aXRoIGxpbmVzIGNvbnRhaW5pbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworR2l0IHdpbGwgd2FybiB5b3UgYWJvdXQgcGF0Y2hlcyB0aGF0IGludHJvZHVjZSB0cmFpbGluZyB3aGl0ZXNwYWNlLCBhbmQgY2FuCitvcHRpb25hbGx5IHN0cmlwIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZvciB5b3U7IGhvd2V2ZXIsIGlmIGFwcGx5aW5nIGEgc2VyaWVzCitvZiBwYXRjaGVzLCB0aGlzIG1heSBtYWtlIGxhdGVyIHBhdGNoZXMgaW4gdGhlIHNlcmllcyBmYWlsIGJ5IGNoYW5naW5nIHRoZWlyCitjb250ZXh0IGxpbmVzLgorCiAKIAkJQ2hhcHRlciA0OiBOYW1pbmcKIApAQCAtNzI2LDYgKzczOCwzMyBAQAogZGVmaW5lZCB0aGF0IHlvdSBzaG91bGRuJ3QgcmVwcm9kdWNlIGluIHlvdXIgY29kZS4KIAogCisJCUNoYXB0ZXIgMTg6ICBFZGl0b3IgbW9kZWxpbmVzIGFuZCBvdGhlciBjcnVmdAorCitTb21lIGVkaXRvcnMgY2FuIGludGVycHJldCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHNvdXJjZSBmaWxlcywKK2luZGljYXRlZCB3aXRoIHNwZWNpYWwgbWFya2Vycy4gIEZvciBleGFtcGxlLCBlbWFjcyBpbnRlcnByZXRzIGxpbmVzIG1hcmtlZAorbGlrZSB0aGlzOgorCistKi0gbW9kZTogYyAtKi0KKworT3IgbGlrZSB0aGlzOgorCisvKgorTG9jYWwgVmFyaWFibGVzOgorY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETUFHSUNfREVCVUdfRkxBRyBmb28uYyIKK0VuZDoKKyovCisKK1ZpbSBpbnRlcnByZXRzIG1hcmtlcnMgdGhhdCBsb29rIGxpa2UgdGhpczoKKworLyogdmltOnNldCBzdz04IG5vZXQgKi8KKworRG8gbm90IGluY2x1ZGUgYW55IG9mIHRoZXNlIGluIHNvdXJjZSBmaWxlcy4gIFBlb3BsZSBoYXZlIHRoZWlyIG93biBwZXJzb25hbAorZWRpdG9yIGNvbmZpZ3VyYXRpb25zLCBhbmQgeW91ciBzb3VyY2UgZmlsZXMgc2hvdWxkIG5vdCBvdmVycmlkZSB0aGVtLiAgVGhpcworaW5jbHVkZXMgbWFya2VycyBmb3IgaW5kZW50YXRpb24gYW5kIG1vZGUgY29uZmlndXJhdGlvbi4gIFBlb3BsZSBtYXkgdXNlIHRoZWlyCitvd24gY3VzdG9tIG1vZGUsIG9yIG1heSBoYXZlIHNvbWUgb3RoZXIgbWFnaWMgbWV0aG9kIGZvciBtYWtpbmcgaW5kZW50YXRpb24KK3dvcmsgY29ycmVjdGx5LgorCisKIAogCQlBcHBlbmRpeCBJOiBSZWZlcmVuY2VzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IDQ2YmNmZjIuLmZkMmVmNGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtMTM5LDggKzEzOSwxMCBAQAogIUVsaWIvY21kbGluZS5jCiAgICAgIDwvc2VjdDE+CiAKLSAgICAgPHNlY3QxPjx0aXRsZT5DUkMgRnVuY3Rpb25zPC90aXRsZT4KKyAgICAgPHNlY3QxIGlkPSJjcmMiPjx0aXRsZT5DUkMgRnVuY3Rpb25zPC90aXRsZT4KKyFFbGliL2NyYzcuYwogIUVsaWIvY3JjMTYuYworIUVsaWIvY3JjLWl0dS10LmMKICFFbGliL2NyYzMyLmMKICFFbGliL2NyYy1jY2l0dC5jCiAgICAgIDwvc2VjdDE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwKaW5kZXggNDVjYWQyMy4uMmRlODRkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmcy1ndWlkZS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9wcm9jZnMtZ3VpZGUudG1wbApAQCAtMzUyLDQ5ICszNTIsOTMgQEAKICAgICAgIDxmdW5jc3lub3BzaXM+CiAJPGZ1bmNwcm90b3R5cGU+CiAJICA8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPnJlYWRfZnVuYzwvZnVuY3Rpb24+PC9mdW5jZGVmPgotCSAgPHBhcmFtZGVmPmNoYXIqIDxwYXJhbWV0ZXI+cGFnZTwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJICA8cGFyYW1kZWY+Y2hhciogPHBhcmFtZXRlcj5idWZmZXI8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgogCSAgPHBhcmFtZGVmPmNoYXIqKiA8cGFyYW1ldGVyPnN0YXJ0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KIAkgIDxwYXJhbWRlZj5vZmZfdCA8cGFyYW1ldGVyPm9mZjwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CiAJICA8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+Y291bnQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgotCSAgPHBhcmFtZGVmPmludCogPHBhcmFtZXRlcj5lb2Y8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCSAgPHBhcmFtZGVmPmludCogPHBhcmFtZXRlcj5wZW9mPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KIAkgIDxwYXJhbWRlZj52b2lkKiA8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgogCTwvZnVuY3Byb3RvdHlwZT4KICAgICAgIDwvZnVuY3N5bm9wc2lzPgogCiAgICAgICA8cGFyYT4KICAgICAgICAgVGhlIHJlYWQgZnVuY3Rpb24gc2hvdWxkIHdyaXRlIGl0cyBpbmZvcm1hdGlvbiBpbnRvIHRoZQotICAgICAgICA8cGFyYW1ldGVyPnBhZ2U8L3BhcmFtZXRlcj4uIEZvciBwcm9wZXIgdXNlLCB0aGUgZnVuY3Rpb24KLSAgICAgICAgc2hvdWxkIHN0YXJ0IHdyaXRpbmcgYXQgYW4gb2Zmc2V0IG9mCi0gICAgICAgIDxwYXJhbWV0ZXI+b2ZmPC9wYXJhbWV0ZXI+IGluIDxwYXJhbWV0ZXI+cGFnZTwvcGFyYW1ldGVyPiBhbmQKLSAgICAgICAgd3JpdGUgYXQgbW9zdCA8cGFyYW1ldGVyPmNvdW50PC9wYXJhbWV0ZXI+IGJ5dGVzLCBidXQgYmVjYXVzZQotICAgICAgICBtb3N0IHJlYWQgZnVuY3Rpb25zIGFyZSBxdWl0ZSBzaW1wbGUgYW5kIG9ubHkgcmV0dXJuIGEgc21hbGwKLSAgICAgICAgYW1vdW50IG9mIGluZm9ybWF0aW9uLCB0aGVzZSB0d28gcGFyYW1ldGVycyBhcmUgdXN1YWxseQotICAgICAgICBpZ25vcmVkIChpdCBicmVha3MgcGFnZXJzIGxpa2UgPGxpdGVyYWw+bW9yZTwvbGl0ZXJhbD4gYW5kCi0gICAgICAgIDxsaXRlcmFsPmxlc3M8L2xpdGVyYWw+LCBidXQgPGxpdGVyYWw+Y2F0PC9saXRlcmFsPiBzdGlsbAotICAgICAgICB3b3JrcykuCisgICAgICAgIDxwYXJhbWV0ZXI+YnVmZmVyPC9wYXJhbWV0ZXI+LCB3aGljaCB3aWxsIGJlIGV4YWN0bHkKKyAgICAgICAgPGxpdGVyYWw+UEFHRV9TSVpFPC9saXRlcmFsPiBieXRlcyBsb25nLgogICAgICAgPC9wYXJhPgogCiAgICAgICA8cGFyYT4KLSAgICAgICAgSWYgdGhlIDxwYXJhbWV0ZXI+b2ZmPC9wYXJhbWV0ZXI+IGFuZAotICAgICAgICA8cGFyYW1ldGVyPmNvdW50PC9wYXJhbWV0ZXI+IHBhcmFtZXRlcnMgYXJlIHByb3Blcmx5IHVzZWQsCi0gICAgICAgIDxwYXJhbWV0ZXI+ZW9mPC9wYXJhbWV0ZXI+IHNob3VsZCBiZSB1c2VkIHRvIHNpZ25hbCB0aGF0IHRoZQorICAgICAgICBUaGUgcGFyYW1ldGVyCisgICAgICAgIDxwYXJhbWV0ZXI+cGVvZjwvcGFyYW1ldGVyPiBzaG91bGQgYmUgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUKICAgICAgICAgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgYnkgd3JpdGluZwogICAgICAgICA8bGl0ZXJhbD4xPC9saXRlcmFsPiB0byB0aGUgbWVtb3J5IGxvY2F0aW9uCi0gICAgICAgIDxwYXJhbWV0ZXI+ZW9mPC9wYXJhbWV0ZXI+IHBvaW50cyB0by4KKyAgICAgICAgPHBhcmFtZXRlcj5wZW9mPC9wYXJhbWV0ZXI+IHBvaW50cyB0by4KICAgICAgIDwvcGFyYT4KIAogICAgICAgPHBhcmE+Ci0gICAgICAgIFRoZSBwYXJhbWV0ZXIgPHBhcmFtZXRlcj5zdGFydDwvcGFyYW1ldGVyPiBkb2Vzbid0IHNlZW0gdG8gYmUKLSAgICAgICAgdXNlZCBhbnl3aGVyZSBpbiB0aGUga2VybmVsLiBUaGUgPHBhcmFtZXRlcj5kYXRhPC9wYXJhbWV0ZXI+CisgICAgICAgIFRoZSA8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj4KICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHNpbmdsZSBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yCiAgICAgICAgIHNldmVyYWwgZmlsZXMsIHNlZSA8eHJlZiBsaW5rZW5kPSJ1c2luZ2RhdGEiLz4uCiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgotICAgICAgICBUaGUgPGZ1bmN0aW9uPnJlYWRfZnVuYzwvZnVuY3Rpb24+IGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZQotICAgICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIHRoZSA8cGFyYW1ldGVyPnBhZ2U8L3BhcmFtZXRlcj4uCisgICAgICAgIFRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGFyZSBkZXNjcmliZWQKKwlieSBhIGNvbW1lbnQgaW4gPGZpbGVuYW1lPmZzL3Byb2MvZ2VuZXJpYy5jPC9maWxlbmFtZT4gYXMgZm9sbG93czoKICAgICAgIDwvcGFyYT4KIAorICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgIDxwYXJhPgorCVlvdSBoYXZlIHRocmVlIHdheXMgdG8gcmV0dXJuIGRhdGE6CisgICAgICAgCTwvcGFyYT4KKyAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorCSAgICAgIExlYXZlIDxsaXRlcmFsPipzdGFydCA9IE5VTEw8L2xpdGVyYWw+LiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKQorCSAgICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGF0CisJICAgICAgb2Zmc2V0IHdpdGhpbiB0aGUgYnVmZmVyLiAgUmV0dXJuIHRoZSBudW1iZXIgKDxsaXRlcmFsPm48L2xpdGVyYWw+KQorCSAgICAgIG9mIGJ5dGVzIHRoZXJlIGFyZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJICAgICAgYnVmZmVyIHVwIHRvIHRoZSBsYXN0IGJ5dGUgb2YgZGF0YS4gIElmIHRoZQorCSAgICAgIG51bWJlciBvZiBzdXBwbGllZCBieXRlcyAoPGxpdGVyYWw+PSBuIC0gb2Zmc2V0PC9saXRlcmFsPikgaXMKKwkgICAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91IGRpZG4ndCBzaWduYWwgZW9mCisJICAgICAgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8gdGFrZSBtb3JlIGRhdGEKKwkgICAgICB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgcmVxdWVzdGVkCisJICAgICAgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgICAgICBhYnNvcmJlZC4gIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWZ1bCBmb3IgZmlsZXMKKwkgICAgICBubyBsYXJnZXIgdGhhbiB0aGUgYnVmZmVyLgorCSAgICA8L3BhcmE+CisJICA8L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisJICAgICAgU2V0IDxsaXRlcmFsPipzdGFydDwvbGl0ZXJhbD4gdG8gYW4gdW5zaWduZWQgbG9uZyB2YWx1ZSBsZXNzIHRoYW4KKwkgICAgICB0aGUgYnVmZmVyIGFkZHJlc3MgYnV0IGdyZWF0ZXIgdGhhbiB6ZXJvLgorCSAgICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGUKKwkgICAgICBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gIFJldHVybiB0aGUgbnVtYmVyIG9mCisJICAgICAgYnl0ZXMgb2YgZGF0YSBwbGFjZWQgdGhlcmUuICBJZiB0aGlzIG51bWJlciBpcworCSAgICAgIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB5b3UgZGlkbid0IHNpZ25hbCBlb2YKKwkgICAgICBhbmQgdGhlIHJlYWRlciBpcyBwcmVwYXJlZCB0byB0YWtlIG1vcmUgZGF0YQorCSAgICAgIHlvdSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIHRoZSByZXF1ZXN0ZWQKKwkgICAgICBvZmZzZXQgYWR2YW5jZWQgYnkgPGxpdGVyYWw+KnN0YXJ0PC9saXRlcmFsPi4gIFRoaXMgaW50ZXJmYWNlIGlzCisJICAgICAgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBsYXJnZSBmaWxlIGNvbnNpc3RpbmcKKwkgICAgICBvZiBhIHNlcmllcyBvZiBibG9ja3Mgd2hpY2ggeW91IHdhbnQgdG8gY291bnQKKwkgICAgICBhbmQgcmV0dXJuIGFzIHdob2xlcy4KKwkgICAgICAoSGFjayBieSBQYXVsLlJ1c3NlbGxAcnVzdGNvcnAuY29tLmF1KQorCSAgICA8L3BhcmE+CisJICA8L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisJICAgICAgU2V0IDxsaXRlcmFsPipzdGFydDwvbGl0ZXJhbD4gdG8gYW4gYWRkcmVzcyB3aXRoaW4gdGhlIGJ1ZmZlci4KKwkgICAgICBQdXQgdGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBvZmZzZXQgYXQgPGxpdGVyYWw+KnN0YXJ0PC9saXRlcmFsPi4KKwkgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHBsYWNlZCB0aGVyZS4KKwkgICAgICBJZiB0aGlzIG51bWJlciBpcyBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91CisJICAgICAgZGlkbid0IHNpZ25hbCBlb2YgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8KKwkgICAgICB0YWtlIG1vcmUgZGF0YSB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUKKwkgICAgICByZXF1ZXN0ZWQgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgICAgICBhYnNvcmJlZC4KKwkgICAgPC9wYXJhPgorCSAgPC9saXN0aXRlbT4KKwk8L29yZGVyZWRsaXN0PgorICAgICAgPC9ibG9ja3F1b3RlPgorCiAgICAgICA8cGFyYT4KICAgICAgICAgPHhyZWYgbGlua2VuZD0iZXhhbXBsZSIvPiBzaG93cyBob3cgdG8gdXNlIGEgcmVhZCBjYWxsIGJhY2sKICAgICAgICAgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAppbmRleCBmNGRmZmFkLi40MmIwMWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKQEAgLTIyMiw3ICsyMjIsMTUgQEAKIAlkZWFkbG9jayBhcyBzb29uIGFzIHRoZSBSQ1UgY2FsbGJhY2sgaGFwcGVucyB0byBpbnRlcnJ1cHQgdGhhdAogCWFjcXVpc2l0aW9uJ3MgY3JpdGljYWwgc2VjdGlvbi4KIAotMTMuCVNSQ1UgKHNyY3VfcmVhZF9sb2NrKCksIHNyY3VfcmVhZF91bmxvY2soKSwgYW5kIHN5bmNocm9uaXplX3NyY3UoKSkKKzEzLglSQ1UgY2FsbGJhY2tzIGNhbiBiZSBhbmQgYXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgSW4gbWFueSBjYXNlcywKKwl0aGUgY2FsbGJhY2sgY29kZSBzaW1wbHkgd3JhcHBlcnMgYXJvdW5kIGtmcmVlKCksIHNvIHRoYXQgdGhpcworCWlzIG5vdCBhbiBpc3N1ZSAob3IsIG1vcmUgYWNjdXJhdGVseSwgdG8gdGhlIGV4dGVudCB0aGF0IGl0IGlzCisJYW4gaXNzdWUsIHRoZSBtZW1vcnktYWxsb2NhdG9yIGxvY2tpbmcgaGFuZGxlcyBpdCkuICBIb3dldmVyLAorCWlmIHRoZSBjYWxsYmFja3MgZG8gbWFuaXB1bGF0ZSBhIHNoYXJlZCBkYXRhIHN0cnVjdHVyZSwgdGhleQorCW11c3QgdXNlIHdoYXRldmVyIGxvY2tpbmcgb3Igb3RoZXIgc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkCisJdG8gc2FmZWx5IGFjY2VzcyBhbmQvb3IgbW9kaWZ5IHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCisKKzE0LglTUkNVIChzcmN1X3JlYWRfbG9jaygpLCBzcmN1X3JlYWRfdW5sb2NrKCksIGFuZCBzeW5jaHJvbml6ZV9zcmN1KCkpCiAJbWF5IG9ubHkgYmUgaW52b2tlZCBmcm9tIHByb2Nlc3MgY29udGV4dC4gIFVubGlrZSBvdGhlciBmb3JtcyBvZgogCVJDVSwgaXQgLWlzLSBwZXJtaXNzaWJsZSB0byBibG9jayBpbiBhbiBTUkNVIHJlYWQtc2lkZSBjcml0aWNhbAogCXNlY3Rpb24gKGRlbWFya2VkIGJ5IHNyY3VfcmVhZF9sb2NrKCkgYW5kIHNyY3VfcmVhZF91bmxvY2soKSksCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CmluZGV4IDZlYmZmYjUuLjE5ZTdmNjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CkBAIC0xLDQgKzEsNCBAQAotTGludXggS2VybmVsIHBhdGNoIHN1bWJpdHRhbCBjaGVja2xpc3QKK0xpbnV4IEtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogSGVyZSBhcmUgc29tZSBiYXNpYyB0aGluZ3MgdGhhdCBkZXZlbG9wZXJzIHNob3VsZCBkbyBpZiB0aGV5IHdhbnQgdG8gc2VlIHRoZWlyCkBAIC05LDcgKzksNiBAQAoga2VybmVsIHBhdGNoZXMuCiAKIAotCiAxOiBCdWlsZHMgY2xlYW5seSB3aXRoIGFwcGxpY2FibGUgb3IgbW9kaWZpZWQgQ09ORklHIG9wdGlvbnMgPXksID1tLCBhbmQKICAgID1uLiAgTm8gZ2NjIHdhcm5pbmdzL2Vycm9ycywgbm8gbGlua2VyIHdhcm5pbmdzL2Vycm9ycy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKaW5kZXggMDk1OGU5Ny4uM2Y5YTc5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC00NjQsOSArNDY0LDI1IEBACiBOdWZmIHNhaWQuICBJZiB5b3VyIGNvZGUgZGV2aWF0ZXMgdG9vIG11Y2ggZnJvbSB0aGlzLCBpdCBpcyBsaWtlbHkKIHRvIGJlIHJlamVjdGVkIHdpdGhvdXQgZnVydGhlciByZXZpZXcsIGFuZCB3aXRob3V0IGNvbW1lbnQuCiAKK09uY2Ugc2lnbmlmaWNhbnQgZXhjZXB0aW9uIGlzIHdoZW4gbW92aW5nIGNvZGUgZnJvbSBvbmUgZmlsZSB0bworYW5vdGhlciBpbiB0aGlzIGNhc2UgeW91IHNob3VsZCBub3QgbW9kaWZ5IHRoZSBtb3ZlZCBjb2RlIGF0IGFsbCBpbgordGhlIHNhbWUgcGF0Y2ggd2hpY2ggbW92ZXMgaXQuICBUaGlzIGNsZWFybHkgZGVsaW5lYXRlcyB0aGUgYWN0IG9mCittb3ZpbmcgdGhlIGNvZGUgYW5kIHlvdXIgY2hhbmdlcy4gIFRoaXMgZ3JlYXRseSBhaWRzIHJldmlldyBvZiB0aGUKK2FjdHVhbCBkaWZmZXJlbmNlcyBhbmQgYWxsb3dzIHRvb2xzIHRvIGJldHRlciB0cmFjayB0aGUgaGlzdG9yeSBvZgordGhlIGNvZGUgaXRzZWxmLgorCiBDaGVjayB5b3VyIHBhdGNoZXMgd2l0aCB0aGUgcGF0Y2ggc3R5bGUgY2hlY2tlciBwcmlvciB0byBzdWJtaXNzaW9uCi0oc2NyaXB0cy9jaGVja3BhdGNoLnBsKS4gIFlvdSBzaG91bGQgYmUgYWJsZSB0byBqdXN0aWZ5IGFsbAotdmlvbGF0aW9ucyB0aGF0IHJlbWFpbiBpbiB5b3VyIHBhdGNoLgorKHNjcmlwdHMvY2hlY2twYXRjaC5wbCkuICBUaGUgc3R5bGUgY2hlY2tlciBzaG91bGQgYmUgdmlld2VkIGFzCithIGd1aWRlIG5vdCBhcyB0aGUgZmluYWwgd29yZC4gIElmIHlvdXIgY29kZSBsb29rcyBiZXR0ZXIgd2l0aAorYSB2aW9sYXRpb24gdGhlbiBpdHMgcHJvYmFibHkgYmVzdCBsZWZ0IGFsb25lLgorCitUaGUgY2hlY2tlciByZXBvcnRzIGF0IHRocmVlIGxldmVsczoKKyAtIEVSUk9SOiB0aGluZ3MgdGhhdCBhcmUgdmVyeSBsaWtlbHkgdG8gYmUgd3JvbmcKKyAtIFdBUk5JTkc6IHRoaW5ncyByZXF1aXJpbmcgY2FyZWZ1bCByZXZpZXcKKyAtIENIRUNLOiB0aGluZ3MgcmVxdWlyaW5nIHRob3VnaHQKKworWW91IHNob3VsZCBiZSBhYmxlIHRvIGp1c3RpZnkgYWxsIHZpb2xhdGlvbnMgdGhhdCByZW1haW4gaW4geW91cgorcGF0Y2guCiAKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMKaW5kZXggNzFhY2MyOC4uMjRjNWFhZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jCisrKyBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYwpAQCAtNDksNiArNDksNyBAQAogaW50IGRiZzsKIGludCBwcmludF9kZWxheXM7CiBpbnQgcHJpbnRfaW9fYWNjb3VudGluZzsKK2ludCBwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50czsKIF9fdTY0IHN0aW1lLCB1dGltZTsKIAogI2RlZmluZSBQUklOVEYoZm10LCBhcmcuLi4pIHsJCQlcCkBAIC0xOTUsNyArMTk2LDcgQEAKIAkgICAgICAgIklPICAgICUxNXMlMTVzXG4iCiAJICAgICAgICIgICAgICAlMTVsbHUlMTVsbHVcbiIKIAkgICAgICAgIk1FTSAgICUxNXMlMTVzXG4iCi0JICAgICAgICIgICAgICAlMTVsbHUlMTVsbHVcblxuIiwKKwkgICAgICAgIiAgICAgICUxNWxsdSUxNWxsdVxuIgogCSAgICAgICAiY291bnQiLCAicmVhbCB0b3RhbCIsICJ2aXJ0dWFsIHRvdGFsIiwgImRlbGF5IHRvdGFsIiwKIAkgICAgICAgdC0+Y3B1X2NvdW50LCB0LT5jcHVfcnVuX3JlYWxfdG90YWwsIHQtPmNwdV9ydW5fdmlydHVhbF90b3RhbCwKIAkgICAgICAgdC0+Y3B1X2RlbGF5X3RvdGFsLApAQCAtMjA0LDYgKzIwNSwxNCBAQAogCSAgICAgICAiY291bnQiLCAiZGVsYXkgdG90YWwiLCB0LT5zd2FwaW5fY291bnQsIHQtPnN3YXBpbl9kZWxheV90b3RhbCk7CiB9CiAKK3ZvaWQgdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHMoc3RydWN0IHRhc2tzdGF0cyAqdCkKK3sKKwlwcmludGYoIlxuXG5UYXNrICAgJTE1cyUxNXNcbiIKKwkgICAgICAgIiAgICAgICAlMTVsdSUxNWx1XG4iLAorCSAgICAgICAidm9sdW50YXJ5IiwgIm5vbnZvbHVudGFyeSIsCisJICAgICAgIHQtPm52Y3N3LCB0LT5uaXZjc3cpOworfQorCiB2b2lkIHByaW50X2lvYWNjdChzdHJ1Y3QgdGFza3N0YXRzICp0KQogewogCXByaW50ZigiJXM6IHJlYWQ9JWxsdSwgd3JpdGU9JWxsdSwgY2FuY2VsbGVkX3dyaXRlPSVsbHVcbiIsCkBAIC0yMzUsNyArMjQ0LDcgQEAKIAlzdHJ1Y3QgbXNndGVtcGxhdGUgbXNnOwogCiAJd2hpbGUgKDEpIHsKLQkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGl3OnI6bTp0OnA6dmwiKTsKKwkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAicWRpdzpyOm06dDpwOnZsIik7CiAJCWlmIChjIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0yNDgsNiArMjU3LDEwIEBACiAJCQlwcmludGYoInByaW50aW5nIElPIGFjY291bnRpbmdcbiIpOwogCQkJcHJpbnRfaW9fYWNjb3VudGluZyA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlwcmludGYoInByaW50aW5nIHRhc2svcHJvY2VzcyBjb250ZXh0IHN3aXRjaCByYXRlc1xuIik7CisJCQlwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyA9IDE7CisJCQlicmVhazsKIAkJY2FzZSAndyc6CiAJCQlsb2dmaWxlID0gc3RyZHVwKG9wdGFyZyk7CiAJCQlwcmludGYoIndyaXRlIHRvIGZpbGUgJXNcbiIsIGxvZ2ZpbGUpOwpAQCAtMzg5LDYgKzQwMiw4IEBACiAJCQkJCQkJcHJpbnRfZGVsYXlhY2N0KChzdHJ1Y3QgdGFza3N0YXRzICopIE5MQV9EQVRBKG5hKSk7CiAJCQkJCQlpZiAocHJpbnRfaW9fYWNjb3VudGluZykKIAkJCQkJCQlwcmludF9pb2FjY3QoKHN0cnVjdCB0YXNrc3RhdHMgKikgTkxBX0RBVEEobmEpKTsKKwkJCQkJCWlmIChwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cykKKwkJCQkJCQl0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cygoc3RydWN0IHRhc2tzdGF0cyAqKSBOTEFfREFUQShuYSkpOwogCQkJCQkJaWYgKGZkKSB7CiAJCQkJCQkJaWYgKHdyaXRlKGZkLCBOTEFfREFUQShuYSksIG5hLT5ubGFfbGVuKSA8IDApIHsKIAkJCQkJCQkJZXJyKDEsIndyaXRlIGVycm9yXG4iKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMtc3RydWN0LnR4dCBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMtc3RydWN0LnR4dAppbmRleCA2NjFjNzk3Li44YWE3NTI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLXN0cnVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL3Rhc2tzdGF0cy1zdHJ1Y3QudHh0CkBAIC0yMiw2ICsyMiw4IEBACiAgICAgLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgZW5kICovCiAgICAgVGhlaXIgdmFsdWVzIGFyZSBjb2xsZWN0ZWQgaWYgQ09ORklHX1RBU0tfWEFDQ1QgaXMgc2V0LgogCis0KSBQZXItdGFzayBhbmQgcGVyLXRocmVhZCBjb250ZXh0IHN3aXRjaCBjb3VudCBzdGF0aXN0aWNzCisKIEZ1dHVyZSBleHRlbnNpb24gc2hvdWxkIGFkZCBmaWVsZHMgdG8gdGhlIGVuZCBvZiB0aGUgdGFza3N0YXRzIHN0cnVjdCwgYW5kCiBzaG91bGQgbm90IGNoYW5nZSB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgZWFjaCBmaWVsZCB3aXRoaW4gdGhlIHN0cnVjdC4KIApAQCAtMTU4LDQgKzE2MCw4IEBACiAKIAkvKiBFeHRlbmRlZCBhY2NvdW50aW5nIGZpZWxkcyBlbmQgKi8KIAorNCkgUGVyLXRhc2sgYW5kIHBlci10aHJlYWQgc3RhdGlzdGljcworCV9fdTY0CW52Y3N3OwkJCS8qIENvbnRleHQgdm9sdW50YXJ5IHN3aXRjaCBjb3VudGVyICovCisJX191NjQJbml2Y3N3OwkJCS8qIENvbnRleHQgaW52b2x1bnRhcnkgc3dpdGNoIGNvdW50ZXIgKi8KKwogfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQgYi9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dAppbmRleCBkZWJmNjgxLi44NjZiNzYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dApAQCAtMjUzLDcgKzI1Myw3IEBACiAKIAlUaGUgZmlyc3Qgb2YgdGhlc2UgdHdvIHJvdXRpbmVzIGlzIGludm9rZWQgYWZ0ZXIgbWFwX3ZtX2FyZWEoKQogCWhhcyBpbnN0YWxsZWQgdGhlIHBhZ2UgdGFibGUgZW50cmllcy4gIFRoZSBzZWNvbmQgaXMgaW52b2tlZAotCWJlZm9yZSB1bm1hcF92bV9hcmVhKCkgZGVsZXRlcyB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzLgorCWJlZm9yZSB1bm1hcF9rZXJuZWxfcmFuZ2UoKSBkZWxldGVzIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuCiAKIFRoZXJlIGV4aXN0cyBhbm90aGVyIHdob2xlIGNsYXNzIG9mIGNwdSBjYWNoZSBpc3N1ZXMgd2hpY2ggY3VycmVudGx5CiByZXF1aXJlIGEgd2hvbGUgZGlmZmVyZW50IHNldCBvZiBpbnRlcmZhY2VzIHRvIGhhbmRsZSBwcm9wZXJseS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2Nkcm9tLzAwLUlOREVYCmluZGV4IDkxNmRhZmUuLjQzM2VkZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS8wMC1JTkRFWApAQCAtMiwzMiArMiwxMCBAQAogCS0gdGhpcyBmaWxlIChpbmZvIG9uIENELVJPTXMgYW5kIExpbnV4KQogTWFrZWZpbGUKIAktIG9ubHkgdXNlZCB0byBnZW5lcmF0ZSBUZVggb3V0cHV0IGZyb20gdGhlIGRvY3VtZW50YXRpb24uCi1henRjZAotCS0gaW5mbyBvbiBBenRlY2gvT3JjaGlkL09rYW5vL1dlYXJuZXMvQ29ucmFkL0N5Q0RST00gZHJpdmVyLgogY2Ryb20tc3RhbmRhcmQudGV4CiAJLSBMYVRlWCBkb2N1bWVudCBvbiBzdGFuZGFyZGl6aW5nIHRoZSBDRC1ST00gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLgotY2R1MzFhCi0JLSBpbmZvIG9uIHRoZSBTb255IENEVTMxQS9DRFUzM0EgQ0QtUk9NIGRyaXZlci4KLWNtMjA2Ci0JLSBpbmZvIG9uIHRoZSBQaGlsaXBzL0xNUyBjbTIwNi9jbTI2MCBDRC1ST00gZHJpdmVyLgotZ3NjZAotCS0gaW5mbyBvbiB0aGUgR29sZHN0YXIgUjQyMCBDRC1ST00gZHJpdmVyLgogaWRlLWNkCiAJLSBpbmZvIG9uIHNldHRpbmcgdXAgYW5kIHVzaW5nIEFUQVBJIChha2EgSURFKSBDRC1ST01zLgotaXNwMTYKLQktIGluZm8gb24gdGhlIENELVJPTSBpbnRlcmZhY2Ugb24gSVNQMTYsIE1BRDE2IG9yIE1vemFydCBzb3VuZCBjYXJkLgotbWNkCi0JLSBpbmZvIG9uIGxpbWl0YXRpb25zIG9mIHN0YW5kYXJkIE1pdHN1bWkgQ0QtUk9NIGRyaXZlci4KLW1jZHgKLQktIGluZm8gb24gaW1wcm92ZWQgTWl0c3VtaSBDRC1ST00gZHJpdmVyLgotb3B0Y2QKLQktIGluZm8gb24gdGhlIE9wdGljcyBTdG9yYWdlIDgwMDAgQVQgQ0QtUk9NIGRyaXZlcgogcGFja2V0LXdyaXRpbmcudHh0CiAJLSBJbmZvIG9uIHRoZSBDRFJXIHBhY2tldCB3cml0aW5nIG1vZHVsZQotc2JwY2QKLQktIGluZm8gb24gdGhlIFNvdW5kQmxhc3Rlci9QYW5hc29uaWMgQ0QtUk9NIGludGVyZmFjZSBkcml2ZXIuCi1zamNkCi0JLSBpbmZvIG9uIHRoZSBTQU5ZTyBDRFItSDk0QSBDRC1ST00gaW50ZXJmYWNlIGRyaXZlci4KLXNvbnljZDUzNQotCS0gaW5mbyBvbiB0aGUgU29ueSBDRFUtNTM1IChhbmQgNTMxKSBDRC1ST00gZHJpdmVyLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2F6dGNkIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9henRjZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmMDI5MC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2F6dGNkCisrKyAvZGV2L251bGwKQEAgLTEsODIyICswLDAgQEAKLSRJZDogUkVBRE1FLmF6dGNkLHYgMi42MCAxOTk3LzExLzI5IDA5OjUxOjI1IHJvb3QgRXhwIHJvb3QgJAotICAgICAgICAgIFJlYWRtZS1GaWxlIERvY3VtZW50YXRpb24vY2Ryb20vYXp0Y2QKLSAgICAgICAgICAgCQkJZm9yIAotCSAgICAgQVpURUNIIENELVJPTSBDREEyNjgtMDFBLCBPUkNISUQgQ0QtMzExMCwKLSAgICAgIE9LQU5PL1dFQVJORVMgQ0REMTEwLCBDT05SQUQgVFhDLCBDeUNEUk9NIENSNTIwLCBDUjU0MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0QtUk9NIERyaXZlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjYgYW5kIG5ld2VyCi0gICAgICAgICAgICAgICAgICAgKGZvciBvdGhlciBkcml2ZXMgc2VlIDYuLTguKQotCi1OT1RFOiBUSElTIERSSVZFUiBXSUxMIFdPUksgV0lUSCBUSEUgQ0QtUk9NIERSSVZFUyBMSVNURUQsIFdISUNIIEhBVkUKLSAgICAgIEEgUFJPUFJJRVRBUlkgSU5URVJGQUNFIChpbXBsZW1lbnRlZCBvbiBhIHNvdW5kIGNhcmQgb3Igb24gYW4KLSAgICAgIElTQS1BVC1idXMgY2FyZCkuIAotICAgICAgSVQgV0lMTCBERUZJTklURUxZIE5PVCBXT1JLIFdJVEggQ0QtUk9NIERSSVZFUyBXSVRIICpJREUqLUlOVEVSRkFDRSwKLSAgICAgIHN1Y2ggYXMgdGhlIEF6dGVjaCBDREEyNjktMDMxU0UgISEhIChUaGUgb25seSBrbm93biBleGNlcHRpb25zIGFyZQotICAgICAgJ2Zha2VkJyBJREUgZHJpdmVzIGxpa2UgdGhlIEN5Q0RST00gQ1I1MjBpZSB3aGljaCB3b3JrIHdpdGggYXp0Y2QKLSAgICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgc2VlIDcuKS4gSUYgWU9VJ1JFIFVTSU5HIEEgQ0QtUk9NIERSSVZFCi0gICAgICBXSVRIIElERS1JTlRFUkZBQ0UsIFNPTUVUSU1FUyBBTFNPIENBTExFRCBBVEFQSS1DT01QQVRJQkxFLCBQTEVBU0UgCi0gICAgICBVU0UgVEhFIGlkZS1jZC5jIERSSVZFUiwgV1JJVFRFTiBCWSBNQVJLIExPUkQgQU5EIFNDT1RUIFNOWURFUiAhCi0gICAgICBUSEUgU1RBTkRBUkQtS0VSTkVMIDEuMi54IE5PVyBBTFNPIFNVUFBPUlRTIElERS1DRFJPTS1EUklWRVMsIFNFRSBUSEUKLSAgICAgIEhBUkRESVNLICghKSBTRUNUSU9OIE9GIG1ha2UgY29uZmlnLCBXSEVOIENPTVBJTElORyBBIE5FVyBLRVJORUwhISEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29udGVudHMgb2YgdGhpcyBmaWxlOgotICAgICAgICAgICAgICAgICAgICAgICAgIDEuICBOT1RFCi0gICAgICAgICAgICAgICAgICAgICAgICAgMi4gIElOU1RBTExBVElPTgotICAgICAgICAgICAgICAgICAgICAgICAgIDMuICBDT05GSUdVUklORyBZT1VSIEtFUk5FTAotICAgICAgICAgICAgICAgICAgICAgICAgIDQuICBSRUNPTVBJTElORyBZT1VSIEtFUk5FTAotICAgICAgICAgICAgICAgICAgICAgICAgIDQuMSAgIEFaVENEIEFTIEEgUlVOLVRJTUUgTE9BREFCTEUgTU9EVUxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgNC4yICAgQ0RST00gQ09OTkVDVEVEIFRPIEEgU09VTkRDQVJECi0gICAgICAgICAgICAgICAgICAgICAgICAgNS4gIEtOT1dOIFBST0JMRU1TLCBGVVRVUkUgREVWRUxPUE1FTlRTCi0JCQkgNS4xICAgTVVMVElTRVNTSU9OIFNVUFBPUlQKLQkJCSA1LjIgICBTVEFUVVMgUkVDT0dOSVRJT04KLQkJCSA1LjMgICBET1NFTVUncyBDRFJPTSBTVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgICAgICAgNi4gIEJVRyBSRVBPUlRTCi0gICAgICAgICAgICAgICAgICAgICAgICAgNy4gIE9USEVSIERSSVZFUwotICAgICAgICAgICAgICAgICAgICAgICAgIDguICBJRiBZT1UgRE9OJ1QgU1VDQ0VFRCAuLi4gREVCVUdHSU5HICAKLSAgICAgICAgICAgICAgICAgICAgICAgICA5LiAgVEVDSE5JQ0FMIEhJU1RPUlkgT0YgVEhFIERSSVZFUgotICAgICAgICAgICAgICAgICAgICAgICAgMTAuICBBQ0tOT1dMRURHTUVOVFMKLSAgICAgICAgICAgICAgICAgICAgICAgIDExLiAgUFJPR1JBTU1JTkcgQUREIE9OUzogQ0RQTEFZLkMKLSAgICAgICAgICAgICAgICAgICAgICAgIEFQUEVORElYOiBTb3VyY2UgY29kZSBvZiBjZHBsYXkuYwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBOT1RFIAotVGhpcyBzb2Z0d2FyZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW4gYWxwaGEgYW5kIGJldGEgdGVzdCBhbmQgaXMgcGFydCBvZgotdGhlIHN0YW5kYXJkIGtlcm5lbCBzaW5jZSBrZXJuZWwgMS4xLjh4IHNpbmNlIERlY2VtYmVyIDE5OTQuIEl0IHdvcmtzIHdpdGgKLUFaVEVDSCBDREEyNjgtMDFBLCBPUkNISUQgQ0RTLTMxMTAsIE9SQ0hJRC9XRUFSTkVTIENERDExMCBhbmQgQ09OUkFEIFRYQyAKLShOci45OSAzMSAyMyAtc2VyaWVzIDA0KSBhbmQgaGFzIHByb3ZlbiB0byBiZSBzdGFibGUgd2l0aCBrZXJuZWwgCi12ZXJzaW9ucyAxLjAuOSBhbmQgbmV3ZXIuIEJ1dCB3aXRoIGFueSBzb2Z0d2FyZSB0aGVyZSBzdGlsbCBtYXkgYmUgYnVncyBpbiBpdC4gCi1TbyBpZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zLCB5b3UgYXJlIGludml0ZWQgdG8gaGVscCB1cyBpbXByb3ZlIHRoaXMgc29mdHdhcmUuIAotUGxlYXNlIHNlbmQgbWUgYSBkZXRhaWxlZCBidWcgcmVwb3J0IChzZWUgY2hhcHRlciBCVUcgUkVQT1JUUykuIFlvdSBhcmUgYWxzbyAKLWludml0ZWQgaW4gaGVscGluZyB1cyB0byBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGRyaXZlcywgd2hpY2ggYXJlIHN1cHBvcnRlZC4KLQotUGxlYXNlIHJlYWQgdGhlIFJFQURNRS1maWxlcyBjYXJlZnVsbHkgYW5kIGFsd2F5cyBrZWVwIGEgYmFja3VwIGNvcHkgb2YgeW91ciAKLW9sZCBrZXJuZWwsIGluIG9yZGVyIHRvIHJlYm9vdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyEKLQotMi4gSU5TVEFMTEFUSU9OCi1UaGUgZHJpdmVyIGNvbnNpc3RzIG9mIGEgaGVhZGVyIGZpbGUgJ2F6dGNkLmgnLCB3aGljaCBub3JtYWxseSBzaG91bGQgcmVzaWRlIAotaW4gL3Vzci9zcmMvbGludXgvZHJpdmVycy9jZHJvbSBhbmQgdGhlIHNvdXJjZSBjb2RlICdhenRjZC5jJywgd2hpY2ggbm9ybWFsbHkgCi1yZXNpZGVzIGluIHRoZSBzYW1lIHBsYWNlLiBJdCB1c2VzIC9kZXYvYXp0Y2QgKC9kZXYvYXp0Y2QwIGluIHNvbWUgZGlzdHJpLQotYnV0aW9ucyksIHdoaWNoIG11c3QgYmUgYSB2YWxpZCBibG9jayBkZXZpY2Ugd2l0aCBtYWpvciBudW1iZXIgMjkgYW5kIHJlc2lkZSAKLWluIGRpcmVjdG9yeSAvZGV2LiBUbyBtb3VudCBhIENELVJPTSwgeW91ciBrZXJuZWwgbmVlZHMgdG8gaGF2ZSB0aGUgSVNPOTY2MC0KLWZpbGVzeXN0ZW0gc3VwcG9ydCBpbmNsdWRlZC4KLQotUExFQVNFIE5PVEU6IGF6dGNkLmMgaGFzIGJlZW4gZGV2ZWxvcGVkIGluIHBhcmFsbGVsIHRvIHRoZSBsaW51eCBrZXJuZWwsCi13aGljaCBoYWQgYW5kIGlzIGhhdmluZyBtYW55IG1ham9yIGFuZCBtaW5vciBjaGFuZ2VzIHdoaWNoIGFyZSBub3QgYmFja3dhcmQKLWNvbXBhdGlibGUuIFF1aXRlIGRlZmluaXRlbHkgYXp0Y2QuYyB2ZXJzaW9uIDEuODAgYW5kIG5ld2VyIHdpbGwgTk9UIHdvcmsKLWluIGtlcm5lbHMgb2xkZXIgdGhhbiAxLjMuMzMuIFNvIHBsZWFzZSBhbHdheXMgdXNlIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uCi1vZiBhenRjZC5jIHdpdGggdGhlIGFwcHJvcHJpYXRlIGxpbnV4LWtlcm5lbC4KLQotMy4gIENPTkZJR1VSSU5HIFlPVVIgS0VSTkVMCi1JZiB5b3VyIGtlcm5lbCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIHVzaW5nIHRoZSBBWlRFQ0ggZHJpdmVyIHlvdSB3aWxsCi1zZWUgdGhlIGZvbGxvd2luZyBtZXNzYWdlIHdoaWxlIExpbnV4IGJvb3RzOgotICAgIEF6dGVjaCBDRC1ST00gSW5pdDogRHJpdmVyVmVyc2lvbj08dmVyc2lvbiBudW1iZXI+IEJhc2VBZGRyZXNzPTxiYXNlYWRkcmVzcz4KLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IEZpcm13YXJlVmVyc2lvbj08ZmlybXdhcmUgdmVyc2lvbiBpZCBvZiB5b3VyIEkvTy1jYXJkPj4+Ci0gICAgQXp0ZWNoIENELVJPTSBJbml0OiA8ZHJpdmUgdHlwZT4gZGV0ZWN0ZWQKLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IEVuZAotSWYgdGhlIG1lc3NhZ2UgbG9va3MgZGlmZmVyZW50IGFuZCB5b3UgYXJlIHN1cmUgdG8gaGF2ZSBhIHN1cHBvcnRlZCBkcml2ZSwKLWl0IG1heSBoYXZlIGEgZGlmZmVyZW50IGJhc2UgYWRkcmVzcy4gVGhlIEF6dGVjaCBkcml2ZXIgZG9lcyBsb29rIGZvciB0aGUgCi1DRC1ST00gZHJpdmUgYXQgdGhlIGJhc2UgYWRkcmVzcyBzcGVjaWZpZWQgaW4gYXp0Y2QuaCBhdCBjb21waWxlIHRpbWUuIFRoaXMgCi1hZGRyZXNzIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBib290IHBhcmFtZXRlciBhenRjZD0uLi4uWW91IHNob3VsZCByZWJvb3QgYW5kIAotc3RhcnQgTGludXggd2l0aCBib290IHBhcmFtZXRlciBhenRjZD08YmFzZSBhZGRyZXNzPiwgZS5nLiBhenRjZD0weDMyMC4gSWYgCi15b3UgZG8gbm90IGtub3cgdGhlIGJhc2UgYWRkcmVzcywgc3RhcnQgeW91ciBQQyB3aXRoIERPUyBhbmQgbG9vayBhdCB0aGUgYm9vdCAKLW1lc3NhZ2Ugb2YgeW91ciBDRC1ST00ncyBET1MgZHJpdmVyLiBJZiB0aGF0IHN0aWxsIGRvZXMgbm90IGhlbHAsIHVzZSBib290Ci1wYXJhbWV0ZXIgYXp0Y2Q9PGJhc2UgYWRkcmVzcz4sMHg3OSAsIHRoaXMgdGVsbHMgYXp0Y2QgdG8gdHJ5IGEgbGl0dGxlIGhhcmRlci4KLWF6dGNkIG1heSBiZSBjb25maWd1cmVkIHRvIHVzZSBhdXRvcHJvYmluZyB0aGUgYmFzZSBhZGRyZXNzIGJ5IHJlY29tcGlsaW5nCi1pdCAoc2VlIGNoYXB0ZXIgNC4pLgotCi1JZiB0aGUgbWVzc2FnZSBsb29rcyBjb3JyZWN0LCBhcyB1c2VyICdyb290JyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gbW91bnQgdGhlIAotZHJpdmUgYnkKLSAgICAgICAgICBtb3VudCAtdCBpc285NjYwIC1yIC9kZXYvYXp0Y2QwIC9tbnQKLWFuZCB1c2UgaXQgYXMgYW55IG90aGVyIGZpbGVzeXN0ZW0uIChJZiB0aGlzIGRvZXMgbm90IHdvcmssIGNoZWNrIGlmCi0vZGV2L2F6dGNkMCBhbmQgL21udCBkbyBleGlzdCBhbmQgY3JlYXRlIHRoZW0sIGlmIG5lY2Vzc2FyeSBieSBkb2luZwotICAgICAgbWtub2QgL2Rldi9henRjZDAgYiAyOSAwCi0gICAgICBta2RpciAvbW50ICAgICAgICAgICAgICAgICAgICAgICAKLQotSWYgeW91IHN0aWxsIGdldCBhIGRpZmZlcmVudCBtZXNzYWdlIHdoaWxlIExpbnV4IGJvb3RzIG9yIHdoZW4geW91IGdldCB0aGUgCi1tZXNzYWdlLCB0aGF0IHRoZSBJU085NjYwLWZpbGVzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGtlcm5lbCwgd2hlbgoteW91IHRyeSB0byBtb3VudCB0aGUgQ0QtUk9NIGRyaXZlLCB5b3UgaGF2ZSB0byByZWNvbXBpbGUgeW91ciBrZXJuZWwuCi0KLUlmIHlvdSBkbyAqbm90KiBoYXZlIGFuIEF6dGVjaC9PcmNoaWQvT2thbm8vV2Vhcm5lcy9UWEMgZHJpdmUgYW5kIHdhbnQgdG8gCi1ieXBhc3MgZHJpdmUgZGV0ZWN0aW9uIGR1cmluZyBMaW51eCBib290IHVwLCBzdGFydCB3aXRoIGJvb3QgcGFyYW1ldGVyIGF6dGNkPTAuCi0KLU1vc3QgZGlzdHJpYnV0aW9ucyBub3dhZGF5cyBkbyBjb250YWluIGEgYm9vdCBkaXNrIGltYWdlIGNvbnRhaW5pbmcgYXp0Y2QuCi1QbGVhc2Ugbm90ZSwgdGhhdCB0aGlzIGRyaXZlciB3aWxsIG5vdCB3b3JrIHdpdGggSURFL0FUQVBJIGRyaXZlcyEgV2l0aCB0aGVzZSAKLXlvdSBtdXN0IHVzZSBpZGUtY2QuYyBpbnN0ZWFkLgotCi00LiBSRUNPTVBJTElORyBZT1VSIEtFUk5FTAotSWYgeW91ciBrZXJuZWwgaXMgbm90IHlldCBjb25maWd1cmVkIGZvciB0aGUgQVpURUNIIGRyaXZlciBhbmQgdGhlIElTTzk2NjAtCi1maWxlc3lzdGVtLCB5b3UgaGF2ZSB0byByZWNvbXBpbGUgeW91ciBrZXJuZWw6IAotCi0tIEVkaXQgYXp0Y2QuaCB0byBzZXQgdGhlIEkvTy1hZGRyZXNzIHRvIHlvdXIgSS9PLUJhc2UgYWRkcmVzcyAoQVpUX0JBU0VfQUREUiksIAotICB0aGUgZHJpdmVyIGRvZXMgbm90IHVzZSBpbnRlcnJ1cHRzIG9yIERNQSwgc28gaWYgeW91IGFyZSB1c2luZyBhbiBBWlRFQ0gKLSAgQ0QyNjgsIGFuIE9SQ0hJRCBDRC0zMTEwIG9yIE9SQ0hJRC9XRUFSTkVTIENERDExMCB0aGF0J3MgdGhlIG9ubHkgaXRlbSB5b3UgCi0gIGhhdmUgdG8gc2V0IHVwLiBJZiB5b3UgaGF2ZSBhIHNvdW5kY2FyZCwgcmVhZCBjaGFwdGVyIDQuMi4KLSAgVXNlcnMgb2Ygb3RoZXIgZHJpdmVzIHNob3VsZCByZWFkIGNoYXB0ZXIgT1RIRVIgRFJJVkVTIG9mIHRoaXMgZmlsZS4KLSAgWW91IGFsc28gY2FuIGNvbmZpZ3VyZSB0aGF0IGFkZHJlc3MgYnkga2VybmVsIGJvb3QgcGFyYW1ldGVyIGF6dGNkPS4uLiAKLS0gYXp0Y2QgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGF1dG9wcm9iaW5nIHRoZSBiYXNlIGFkZHJlc3MgYnkgc2V0dGluZwotICBBWlRfQkFTRV9BRERSIHRvICctMScuIEluIHRoYXQgY2FzZSBhenRjZCBwcm9iZXMgdGhlIGFkZHJlc3NlcyBsaXN0ZWQgCi0gIHVuZGVyIEFaVF9CQVNFX0FVVE8uIEJ1dCBwbGVhc2UgcmVtZW1iZXIsIHRoYXQgYXV0b3Byb2JpbmcgYWx3YXlzIG1heSAKLSAgaW5jb3JyZWN0bHkgaW5mbHVlbmNlIG90aGVyIGhhcmR3YXJlIGNvbXBvbmVudHMgdG9vIQotLSBUaGVyZSBhcmUgc29tZSBvdGhlciBwb2ludHMsIHdoaWNoIG1heSBiZSBjb25maWd1cmVkLCBlLmcuIGF1dG8tZWplY3QgdGhlCi0gIENEIHdoZW4gdW5tb3VudGluZyBhIGRyaXZlLCB0cmF5IGxvY2tpbmcgZXRjLiwgc2VlIGF6dGNkLmggZm9yIGRldGFpbHMuCi0tIElmIHlvdSdyZSB1c2luZyBhIGxpbnV4IGtlcm5lbCB2ZXJzaW9uIHByaW9yIHRvIDIuMS4wLCBpbiBhenRjZC5oCi0gIHVuY29tbWVudCB0aGUgbGluZSAnI2RlZmluZSBBWlRfS0VSTkVMX1BSSU9SXzJfMScKLS0gQnVpbGQgYSBuZXcga2VybmVsLCBjb25maWd1cmUgaXQgZm9yICdBenRlY2gvT3JjaGlkL09rYW5vL1dlYXJuZXMgc3VwcG9ydCcgCi0gIChpZiB5b3Ugd2FudCBhenRjZCB0byBiZSBwYXJ0IG9mIHRoZSBrZXJuZWwpLiBEbyBub3QgY29uZmlndXJlIGl0IGZvcgotICAnQXp0ZWNoLi4uIHN1cHBvcnQnLCBpZiB5b3Ugd2FudCB0byB1c2UgYXp0Y2QgYXMgYSBydW4gdGltZSBsb2FkYWJsZSBtb2R1bGUuIAotICBCdXQgaW4gYW55IGNhc2UgeW91IG11c3QgaGF2ZSB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIGluY2x1ZGVkIGluIHlvdXIKLSAga2VybmVsLgotLSBBY3RpdmF0ZSB0aGUgbmV3IGtlcm5lbCwgbm9ybWFsbHkgdGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgTElMTyAoZG9uJ3QgZm9yLQotICBnZXQgdG8gY29uZmlndXJlIGl0IGJlZm9yZSBhbmQgdG8ga2VlcCBhIGNvcHkgb2YgeW91ciBvbGQga2VybmVsIGluIGNhc2UKLSAgc29tZXRoaW5nIGdvZXMgd3JvbmchKS4KLS0gUmVib290Ci0tIElmIHlvdSd2ZSBpbmNsdWRlZCBhenRjZCBpbiB5b3VyIGtlcm5lbCwgeW91IG5vdyBzaG91bGQgc2VlIGR1cmluZyBib290IAotICBzb21lIG1lc3NhZ2VzIGxpa2UKLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IERyaXZlclZlcnNpb249PHZlcnNpb24gbnVtYmVyPiBCYXNlQWRkcmVzcz08YmFzZWFkZHJlc3M+Ci0gICAgQXp0ZWNoIENELVJPTSBJbml0OiBGaXJtd2FyZVZlcnNpb249PGZpcm13YXJlIHZlcnNpb24gaWQgb2YgeW91ciBJL08tY2FyZD4KLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IDxkcml2ZSB0eXBlPiBkZXRlY3RlZAotICAgIEF6dGVjaCBDRC1ST00gSW5pdDogRW5kCi0tIElmIHlvdSBoYXZlIG5vdCBpbmNsdWRlZCBhenRjZCBpbiB5b3VyIGtlcm5lbCwgYnV0IHdhbnQgdG8gbG9hZCBhenRjZCBhcyBhIAotICBydW4gdGltZSBsb2FkYWJsZSBtb2R1bGUgc2VlIDQuMS4gCi0tIElmIHRoZSBtZXNzYWdlIGxvb2tzIGNvcnJlY3QsIGFzIHVzZXIgJ3Jvb3QnIHlvdSBzaG91bGQgYmUgYWJsZSB0byBtb3VudCAKLSAgdGhlIGRyaXZlIGJ5Ci0gICAgICAgICAgbW91bnQgLXQgaXNvOTY2MCAtciAvZGV2L2F6dGNkMCAvbW50Ci0gIGFuZCB1c2UgaXQgYXMgYW55IG90aGVyIGZpbGVzeXN0ZW0uIChJZiB0aGlzIGRvZXMgbm90IHdvcmssIGNoZWNrIGlmCi0gIC9kZXYvYXp0Y2QwIGFuZCAvbW50IGRvIGV4aXN0IGFuZCBjcmVhdGUgdGhlbSwgaWYgbmVjZXNzYXJ5IGJ5IGRvaW5nCi0gICAgICBta25vZCAvZGV2L2F6dGNkMCBiIDI5IDAKLSAgICAgIG1rZGlyIC9tbnQgICAgICAgICAgICAgICAgICAgICAgIAotLSBJZiB0aGlzIHN0aWxsIGRvZXMgbm90IGhlbHAsIHNlZSBjaGFwdGVycyBPVEhFUiBEUklWRVMgYW5kIERFQlVHR0lORy4KLQotNC4xIEFaVENEIEFTIEEgUlVOLVRJTUUgTE9BREFCTEUgTU9EVUxFCi1JZiB5b3UgZG8gbm90IG5lZWQgYXp0Y2QgcGVybWFuZW50bHksIHlvdSBjYW4gYWxzbyBsb2FkIGFuZCByZW1vdmUgdGhlIGRyaXZlcgotZHVyaW5nIHJ1bnRpbWUgdmlhIGluc21vZCBhbmQgcm1tb2QuIFRvIGJ1aWxkIGF6dGNkIGFzIGEgbG9hZGFibGUgbW9kdWxlIHlvdSAKLW11c3QgY29uZmlndXJlIHlvdXIga2VybmVsIGZvciBBWlRFQ0ggbW9kdWxlIHN1cHBvcnQgKGFuc3dlciAnbScgd2hlbiBjb24tCi1maWd1cmluZyB0aGUga2VybmVsKS4gQW55aG93LCB5b3UgbWF5IHJ1biBpbnRvIHByb2JsZW1zLCBpZiB0aGUgdmVyc2lvbiBvZiAKLXlvdXIgYm9vdCBrZXJuZWwgaXMgbm90IHRoZSBzYW1lIHRoYW4gdGhlIHNvdXJjZSBrZXJuZWwgdmVyc2lvbiwgZnJvbSB3aGljaCAKLXlvdSBjcmVhdGUgdGhlIG1vZHVsZXMuIFNvIHJlYnVpbGQgeW91ciBrZXJuZWwsIGlmIG5lY2Vzc2FyeS4gCi0KLU5vdyBlZGl0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgeW91ciBBWlRFQ0ggaW50ZXJmYWNlIGNhcmQgaW4KLS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2Ryb20vYXp0Y2QuaCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuIAotYXp0Y2QgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGF1dG9wcm9iaW5nIHRoZSBiYXNlIGFkZHJlc3MgYnkgc2V0dGluZwotQVpUX0JBU0VfQUREUiB0byAnLTEnLiBJbiB0aGF0IGNhc2UgYXp0Y2QgcHJvYmVzIHRoZSBhZGRyZXNzZXMgbGlzdGVkIAotdW5kZXIgQVpUX0JBU0VfQVVUTy4gQnV0IHBsZWFzZSByZW1lbWJlciwgdGhhdCBhdXRvcHJvYmluZyBhbHdheXMgbWF5IAotaW5jb3JyZWN0bHkgaW5mbHVlbmNlIG90aGVyIGhhcmR3YXJlIGNvbXBvbmVudHMgdG9vIQotVGhlcmUgYXJlIGFsc28gc29tZSBzcGVjaWFsIGZlYXR1cmVzIHdoaWNoIG1heSBiZSBjb25maWd1cmVkLCBlLmcuIAotYXV0by1lamVjdCBhIENEIHdoZW4gdW5tb3VudGluZyB0aGUgZHJpdmUgZXRjOyBzZWUgYXp0Y2QuaCBmb3IgZGV0YWlscy4gCi1UaGVuIGNoYW5nZSB0byAvdXNyL3NyYy9saW51eCBhbmQgZG8gYSAKLSAgICAgICAgICAgICAgICAgICAgbWFrZSBtb2R1bGVzICAKLQkgICAgICAgICAgICBtYWtlIG1vZHVsZXNfaW5zdGFsbAotQWZ0ZXIgdGhhdCB5b3UgY2FuIHJ1bi10aW1lIGxvYWQgdGhlIGRyaXZlciB2aWEKLSAgICAgICAgICAgICAgICAgICAgaW5zbW9kIC9saWIvbW9kdWxlcy9YLlguWC9taXNjL2F6dGNkLm8KLWFuZCByZW1vdmUgaXQgdmlhICAgcm1tb2QgIGF6dGNkLgotSWYgeW91IGRpZCBub3Qgc2V0IHRoZSBjb3JyZWN0IGJhc2UgYWRkcmVzcyBpbiBhenRjZC5oLCB5b3UgY2FuIGFsc28gc3VwcGx5IHRoZQotYmFzZSBhZGRyZXNzIHdoZW4gbG9hZGluZyB0aGUgZHJpdmVyIHZpYQotICAgICAgICAgICAgICAgICAgICBpbnNtb2QgL2xpYi9tb2R1bGVzL1guWC5YL21pc2MvYXp0Y2QubyBhenRjZD08YmFzZSBhZGRyZXNzPgotQWdhaW4gc3BlY2lmeWluZyBhenRjZD0tMSB3aWxsIGNhdXNlIGF1dG9wcm9iaW5nLgotSWYgeW91IGRvIG5vdCBoYXZlIHRoZSBpc285NjYwLWZpbGVzeXN0ZW0gaW4geW91ciBib290IGtlcm5lbCwgeW91IGFsc28gaGF2ZQotdG8gbG9hZCBpdCBiZWZvcmUgeW91IGNhbiBtb3VudCB0aGUgQ0RST006Ci0gICAgICAgICAgICAgICAgICAgIGluc21vZCAvbGliL21vZHVsZXMvWC5YLlgvZnMvaXNvZnMubwotVGhlIG1vdW50IHByb2NlZHVyZSB3b3JrcyBhcyBkZXNjcmliZWQgaW4gNC4gYWJvdmUuCi0oSW4gYWxsIGNvbW1hbmRzICdYLlguWCcgaXMgdGhlIGN1cnJlbnQgbGludXgga2VybmVsIHZlcnNpb24gbnVtYmVyKQotCi00LjIgQ0RST00gQ09OTkVDVEVEIFRPIEEgU09VTkRDQVJECi1Nb3N0IHNvdW5kY2FyZHMgZG8gaGF2ZSBhIGJ1cyBpbnRlcmZhY2UgdG8gdGhlIENEUk9NLWRyaXZlLiBJbiBtYW55IGNhc2VzCi10aGlzIHNvdW5kY2FyZCBuZWVkcyB0byBiZSBjb25maWd1cmVkLCBiZWZvcmUgdGhlIENEUk9NIGNhbiBiZSB1c2VkLiBUaGlzCi1jb25maWd1cmF0aW9uIHByb2NlZHVyZSBjb25zaXN0cyBvZiB3cml0aW5nIHNvbWUga2luZCBvZiBpbml0aWFsaXphdGlvbgotZGF0YSB0byB0aGUgc291bmRjYXJkIHJlZ2lzdGVycy4gVGhlIEFaVEVDSC1DRFJPTSBkcml2ZXIgaW4gdGhlIG1vbWVudCBkb2VzCi1vbmx5IHN1cHBvcnQgb25lIHR5cGUgb2Ygc291bmRjYXJkIChTb3VuZFdhdmUzMikuIFVzZXJzIG9mIG90aGVyIHNvdW5kY2FyZHMKLXNob3VsZCB0cnkgdG8gYm9vdCBET1MgZmlyc3QgYW5kIGxldCB0aGVpciBET1MgZHJpdmVycyBpbml0aWFsaXplIHRoZQotc291bmRjYXJkIGFuZCBDRFJPTSwgdGhlbiB3YXJtIGJvb3QgKG9yIHVzZSBsb2FkbGluKSB0aGVpciBQQyB0byBzdGFydAotTGludXguCi1TdXBwb3J0IGZvciB0aGUgQ0RST00taW50ZXJmYWNlIG9mIFNvdW5kV2F2ZTMyLXNvdW5kY2FyZHMgaXMgZGlyZWN0bHkKLWltcGxlbWVudGVkIGluIHRoZSBBWlRFQ0ggZHJpdmVyLiBQbGVhc2UgZWRpdCBsaW51eC9kcml2ZXJzL2Nkcm9tL2F6dGRjLmgsCi11bmNvbW1lbnQgbGluZSAnI2RlZmluZSBBWlRfU1czMicgYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yCi1BWlRfQkFTRV9BRERSIGFuZCBBWlRfU1czMl9CQVNFX0FERFIuIFRoaXMgc3VwcG9ydCB3YXMgdGVzdGVkIHdpdGggYW4gT3JjaGlkCi1DRFMtMzExMCBjb25uZWN0ZWQgdG8gYSBTb3VuZFdhdmUzMi4KLUlmIHlvdSB3YW50IHlvdXIgc291bmRjYXJkIHRvIGJlIHN1cHBvcnRlZCwgZmluZCBvdXQsIGhvdyBpdCBuZWVkcyB0byBiZQotY29uZmlndXJlZCBhbmQgbWFpbCBtZSAoc2VlIDYuKSB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIAotCi01LiBLTk9XTiBQUk9CTEVNUywgRlVUVVJFIERFVkVMT1BNRU5UUwotNS4xIE1VTFRJU0VTU0lPTiBTVVBQT1JUCi1NdWx0aXNlc3Npb24gc3VwcG9ydCBmb3IgQ0QncyBzdGlsbCBpcyBhIG15dGguIEkgaW1wbGVtZW50ZWQgYW5kIHRlc3RlZCBhIGJhc2ljCi1zdXBwb3J0IGZvciBtdWx0aXNlc3Npb24gYW5kIFhBIENEcywgYnV0IEkgc3RpbGwgaGF2ZSBub3QgZW5vdWdoIENEcyBhbmQgYXBwbGktCi1jYXRpb25zIHRvIHRlc3QgaXQgcmlnb3JvdXNseS4gU28gaWYgeW91J2QgbGlrZSB0byBoZWxwIG1lLCBwbGVhc2UgY29udGFjdCBtZQotKEVtYWlsIGFkZHJlc3Mgc2VlIGJlbG93KS4gQXMgb2YgdmVyc2lvbiAxLjQgYW5kIG5ld2VyIHlvdSBjYW4gZW5hYmxlIHRoZSAKLW11bHRpc2Vzc2lvbiBzdXBwb3J0IGluIGF6dGNkLmggYnkgc2V0dGluZyBBWlRfTVVMVElTRVNTSU9OIHRvIDEuIERvaW5nIHNvIAotd2lsbCBjYXVzZSB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIHRvIGRlYWwgd2l0aCBtdWx0aXNlc3Npb24gQ0RzLCBpZS4gcmVkaXJlY3QgCi1yZXF1ZXN0cyB0byB0aGUgVGFibGUgb2YgQ29udGVudHMgKFRPQykgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCBzZXNzaW9uLCAKLXdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvIG9mIGFsbCBwcmV2aW91cyBzZXNzaW9ucyBldGMuLiBJZiB5b3UgZG8gc2V0IAotQVpUX01VTFRJU0VTU0lPTiB0byAwLCB5b3UgY2FuIHVzZSBtdWx0aXNlc3Npb24gQ0RzIGFueXdheS4gSW4gdGhhdCBjYXNlIHRoZSAKLWRyaXZlJ3MgZmlybXdhcmUgd2lsbCBkbyBhdXRvbWF0aWMgcmVkaXJlY3Rpb24uIEZvciB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIGFueSAKLW11bHRpc2Vzc2lvbiBDRCAgd2lsbCB0aGVuIGxvb2sgbGlrZSBhICdub3JtYWwnIHNpbmdsZSBzZXNzaW9uIENELiBCdXQgbmV2ZXItCi10aGVsZXNzIHRoZSBkYXRhIG9mIGFsbCBzZXNzaW9ucyBhcmUgdmlld2FibGUgYW5kIGFjY2Vzc2libGUuIFNvIHdpdGggcHJhY3RpY2FsLQotbHkgYWxsIHJlYWwgd29ybGQgYXBwbGljYXRpb25zIHlvdSB3b24ndCBub3RpY2UgdGhlIGRpZmZlcmVuY2UuIEJ1dCBhcyBmdXR1cmUKLWFwcGxpY2F0aW9ucyBtYXkgbWFrZSB1c2Ugb2YgYWR2YW5jZWQgbXVsdGlzZXNzaW9uIGZlYXR1cmVzLCBJJ3ZlIHN0YXJ0ZWQgdG8KLWltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGZvciB0aGUgSVNPOTY2MCBtdWx0aXNlc3Npb24gaW50ZXJmYWNlIHZpYSBpb2N0bAotQ0RST01NVUxUSVNFU1NJT04uCi0KLTUuMiBTVEFUVVMgUkVDT0dOSVRJT04KLVRoZSBkcml2ZSBzdGF0dXMgcmVjb2duaXRpb24gZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLiBDaGFuZ2luZwotYSBkaXNrIG9yIGhhdmluZyB0aGUgZG9vciBvcGVuLCB3aGVuIGEgZHJpdmUgaXMgYWxyZWFkeSBtb3VudGVkLCBpcyBkZXRlY3RlZCAKLWJ5IHRoZSBBenRlY2ggZHJpdmVyIGl0c2VsZiwgYnV0IG5ldmVydGhlbGVzcyBjYXVzZXMgbXVsdGlwbGUgcmVhZCBhdHRlbXB0cwotYnkgdGhlIGRpZmZlcmVudCBsYXllcnMgb2YgdGhlIElTTzk2NjAtZmlsZXN5c3RlbSBkcml2ZXIsIHdoaWNoIGZpbmFsbHkgdGltZW91dCwKLXNvIHlvdSBoYXZlIHRvIHdhaXQgcXVpdGUgYSBsaXR0bGUuLi4gQnV0IGlzbid0IGl0IGJhZCBzdHlsZSB0byBjaGFuZ2UgYSBkaXNrIAotaW4gYSBtb3VudGVkIGRyaXZlLCBhbnlob3cgPyEKLQotVGhlIGRyaXZlciB1c2VzIGJ1c3kgd2FpdCBpbiBtb3N0IGNhc2VzIGZvciB0aGUgZHJpdmUgaGFuZHNoYWtlIChtYWNyb3MKLVNURU5fTE9XIGFuZCBEVEVOX0xPVykuIEkgdGVzdGVkIHdpdGggYSA0ODYvRFgyIGF0IDY2TUh6IGFuZCBhIFBlbnRpdW0gYXQKLTYwTUh6IGFuZCA5ME1Iei4gV2hlbmV2ZXIgeW91IHVzZSBhIG11Y2ggZmFzdGVyIG1hY2hpbmUgeW91IGFyZSBsaWtlbHkgdG8gZ2V0IAotdGltZW91dCBtZXNzYWdlcy4gSW4gdGhhdCBjYXNlIGVkaXQgYXp0Y2QuaCBhbmQgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgCi1BWlRfVElNRU9VVC4gCi0KLUZvciBzb21lICdzbG93JyBkcml2ZSBjb21tYW5kcyBJIGltcGxlbWVudGVkIHdhaXRpbmcgd2l0aCBhIHRpbWVyIHdhaXRxdWV1ZQotKG1hY3JvIFNURU5fTE9XX1dBSVQpLiBJZiB5b3UgZ2V0IHRoaXMgdGltZW91dCBtZXNzYWdlLCB5b3UgbWF5IGFsc28gZWRpdAotYXp0Y2QuaCBhbmQgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgQVpUX1NUQVRVU19ERUxBWS4gVGhlIHdhaXRxdWV1ZSBoYXMKLXNob3duIHRvIGJlIGEgbGl0dGxlIGNyaXRpY2FsLiBJZiB5b3UgZ2V0IGtlcm5lbCBwYW5pYyBtZXNzYWdlcywgZWRpdCBhenRjZC5jCi1hbmQgc3Vic3RpdHV0ZSBTVEVOX0xPV19XQUlUIGJ5IFNURU5fTE9XLiBCdXN5IHdhaXRpbmcgd2l0aCBTVEVOX0xPVyBpcyBtb3JlCi1zdGFibGUsIGJ1dCBhbHNvIGNhdXNlcyBDUFUgb3ZlcmhlYWQuCi0KLTUuMyBET1NFTVUncyBDRC1ST00gU1VQUE9SVAotV2l0aCByZWxlYXNlIDEuMjAgYXp0Y2Qgd2FzIG1vZGlmaWVkIHRvIGFsbG93IGFjY2VzcyB0byBDRC1ST01TIHdoZW4gcnVubmluZwotdW5kZXIgZG9zZW11LTAuNjAuMCBhenRjZC12ZXJzaW9ucyBiZWZvcmUgMS4yMCBhcmUgbW9zdCBsaWtlbHkgdG8gY3Jhc2gKLUxpbnV4LCB3aGVuIGEgQ0QtUk9NIGlzIGFjY2Vzc2VkIHVuZGVyIGRvc2VtdS4gVGhpcyBwcm9ibGVtIGhhcyBwYXJ0bHkgYmVlbgotZml4ZWQsIGJ1dCBzdGlsbCB3aGVuIGFjY2Vzc2luZyBhIGRpcmVjdG9yeSBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlIHN5c3RlbQotbWlnaHQgaGFuZyBmb3Igc29tZSAzMHNlYy4gU28gYmUgcGF0aWVudCwgd2hlbiB1c2luZyBkb3NlbXUncyBDRC1ST00gc3VwcG9ydAotaW4gY29tYmluYXRpb24gd2l0aCBhenRjZCA6LSkgISAKLVRoaXMgcHJvYmxlbSBoYXMgbm93IChKdWx5IDE5OTUpIGJlZW4gZml4ZWQgYnkgYSBtb2RpZmljYXRpb24gdG8gZG9zZW11J3MKLUNELVJPTSBkcml2ZXIuIFRoZSBuZXcgdmVyc2lvbiBjYW1lIHdpdGggZG9zZW11LTAuNjAuMiwgc2VlIGRvc2VtdSdzCi1SRUFETUUuQ0RST00uCi0KLTYuIEJVRyBSRVBPUlRTCi1QbGVhc2Ugc2VuZCBkZXRhaWxlZCBidWcgcmVwb3J0cyBhbmQgYnVnIGZpeGVzIHZpYSBFTWFpbCB0bwotCi0gICAgICAgIFdlcm5lci5aaW1tZXJtYW5uQGZodC1lc3NsaW5nZW4uZGUKLQotUGxlYXNlIGluY2x1ZGUgYSBkZXNjcmlwdGlvbiBvZiB5b3VyIENELVJPTSBkcml2ZSB0eXBlIGFuZCBpbnRlcmZhY2UgY2FyZCwgCi10aGUgZXhhY3QgZmlybXdhcmUgbWVzc2FnZSBkdXJpbmcgTGludXggYm9vdHVwLCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIAotQVpURUNILUNEUk9NLWRyaXZlciBhbmQgdGhlIExpbnV4IGtlcm5lbCB2ZXJzaW9uLiBBbHNvIGEgZGVzY3JpcHRpb24gb2YgeW91ciAKLXN5c3RlbSdzIG90aGVyIGhhcmR3YXJlIGNvdWxkIGJlIG9mIGludGVyZXN0LCBlc3BlY2lhbGx5IG1pY3JvcHJvY2Vzc29yIHR5cGUsIAotY2xvY2sgZnJlcXVlbmN5LCBvdGhlciBpbnRlcmZhY2UgY2FyZHMgc3VjaCBhcyBzb3VuZGNhcmRzLCBldGhlcm5ldCBhZGFwdGVyLCAKLWdhbWUgY2FyZHMgZXRjLi4KLQotSSB3aWxsIHRyeSB0byBjb2xsZWN0IHRoZSByZXBvcnRzIGFuZCBtYWtlIHRoZSBuZWNlc3NhcnkgbW9kaWZpY2F0aW9ucyBmcm9tIAotdGltZSB0byB0aW1lLiBJIG1heSBhbHNvIGNvbWUgYmFjayB0byB5b3UgZGlyZWN0bHkgd2l0aCBzb21lIGJ1ZyBmaXhlcyBhbmQgCi1hc2sgeW91IHRvIGRvIGZ1cnRoZXIgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCi1FZGl0b3JzIG9mIENELVJPTXMgYXJlIGludml0ZWQgdG8gc2VuZCBhICdjb29wZXJhdGlvbicgY29weSBvZiB0aGVpcgotQ0QtUk9NcyB0byB0aGUgdm9sdW50ZWVycywgd2hvIHByb3ZpZGVkIHRoZSBDRC1ST00gc3VwcG9ydCBmb3IgTGludXguIE15Ci1zbmFpbCBtYWlsIGFkZHJlc3MgZm9yIHN1Y2ggJ3N0dWZmJyBpcwotICAgICAgICAgICBQcm9mLiBEci4gVy4gWmltbWVybWFubgotICAgICAgICAgICBGYWNoaG9jaHNjaHVsZSBmdWVyIFRlY2huaWsgRXNzbGluZ2VuCi0gICAgICAgICAgIEZhY2hiZXJlaWNoIElUCi0gICAgICAgICAgIEZsYW5kZXJuc3RyYXNzZSAxMDEKLSAgICAgICAgICAgRC03MzczMiBFc3NsaW5nZW4KLSAgICAgICAgICAgR2VybWFueQotCi0KLTcuIE9USEVSIERSSVZFUwotVGhlIGZvbGxvd2luZyBkcml2ZXMgT1JDSElEIENEUzMxMTAsIE9LQU5PIENERDExMCwgV0VBUk5FUyBDREQxMTAgYW5kIENvbnJhZAotVFhDIE5yLiA5OTMxMjMtc2VyaWVzIDA0IG5lYXJseSBsb29rIHRoZSBzYW1lIGFzIEFaVEVDSCBDREEyNjgtMDFBLCBlc3BlY2lhbGx5IAotdGhleSBzZWVtIHRvIHVzZSB0aGUgc2FtZSBjb21tYW5kIGNvZGVzLiBTbyBpdCB3YXMgcXVpdGUgc2ltcGxlIHRvIG1ha2UgdGhlIAotQVpURUNIIGRyaXZlciB3b3JrIHdpdGggdGhlc2UgZHJpdmVzLiAKLQotVW5mb3J0dW5hdGVseSBJIGRvIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBkcml2ZXMgYXZhaWxhYmxlLCBzbyBJIGNvdWxkbid0IHRlc3QKLWl0IG15c2VsZi4gSW4gc29tZSBpbnN0YWxsYXRpb25zLCBpdCBzZWVtcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZHJpdmUgCi13aXRoIHRoZSBET1MgZHJpdmVyIGJlZm9yZSAoZXNwZWNpYWxseSBpZiBjb21iaW5lZCB3aXRoIGEgc291bmQgY2FyZCkgYW5kIHRoZW4gCi1kbyBhIHdhcm0gYm9vdCAoQ1RSTC1BTFQtUkVTRVQpIG9yIHN0YXJ0IExpbnV4IGZyb20gRE9TLCBlLmcuIHdpdGggJ2xvYWRsaW4nLgotCi1JZiB5b3UgZG8gbm90IHN1Y2NlZWQsIHJlYWQgY2hhcHRlciBERUJVR0dJTkcuIFRoYW5rcyBpbiBhZHZhbmNlIQotCi1Tb3JyeSBmb3IgdGhlIGluY29udmVuaWVuY2UsIGJ1dCBpdCBpcyBkaWZmaWN1bHQgdG8gZGV2ZWxvcCBmb3IgaGFyZHdhcmUsIAotd2hpY2ggeW91IGRvbid0IGhhdmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nLiBTbyBpZiB5b3UgbGlrZSwgcGxlYXNlIGhlbHAgdXMuCi0KLUlmIHlvdSBkbyBoYXZlIGEgQ3lDRFJPTSBDUjUyMGllIHRoYW5rcyB0byBIaWxtYXIgQmVyZ2VyJ3MgaGVscCB5b3VyIGNoYW5jZXMKLWFyZSBnb29kLCB0aGF0IGl0IHdpbGwgd29yayB3aXRoIGF6dGNkLiBUaGUgQ1I1MjBpZSBpcyBzb2xkIGFzIGFuIElERS1kcml2ZQotYW5kIHJlYWxseSBpcyBjb25uZWN0ZWQgdG8gdGhlIElERSBpbnRlcmZhY2UgKHByaW1hcnkgYXQgMHgxRjAgb3Igc2Vjb25kYXJ5Ci1hdCAweDE3MCwgY29uZmlndXJlZCBhcyBzbGF2ZSwgbm90IGFzIG1hc3RlcikuIE5ldmVydGhlbGVzcyBpdCBpcyBub3QgQVRBUEkKLWNvbXBhdGlibGUgYnV0IHN0aWxsIHVzZXMgQXp0ZWNoJ3MgY29tbWFuZCBjb2Rlcy4KLQotCi04LiBERUJVR0dJTkcgOiBJRiBZT1UgRE9OJ1QgU1VDQ0VFRCwgVFJZIFRIRSBGT0xMT1dJTkcKLS1yZXJlYWQgdGhlIGNvbXBsZXRlIFJFQURNRSBmaWxlCi0tbWFrZSBzdXJlLCB0aGF0IHlvdXIgZHJpdmUgaXMgaGFyZHdhcmUgY29uZmlndXJlZCBmb3IgCi0gICAgdHJhbnNmZXIgbW9kZTogcG9sbGVkCi0gICAgSVJROiAgICAgICAgICAgbm90IHVzZWQKLSAgICBETUE6ICAgICAgICAgICBub3QgdXNlZAotICAgIEJhc2UgQWRkcmVzczogIHNvbWV0aGluZyBsaWtlIDMwMCwgMzIwIC4uLgotIFlvdSBjYW4gY2hlY2sgdGhpcywgd2hlbiB5b3Ugc3RhcnQgdGhlIERPUyBkcml2ZXIsIHdoaWNoIGNhbWUgd2l0aCB5b3VyCi0gZHJpdmUuIEJ5IGFwcHJvcHJpYXRlbHkgY29uZmlndXJpbmcgdGhlIGRyaXZlIGFuZCB0aGUgRE9TIGRyaXZlciB5b3UgY2FuCi0gY2hlY2ssIHdoZXRoZXIgeW91ciBkcml2ZSBkb2VzIG9wZXJhdGUgaW4gdGhpcyBtb2RlIGNvcnJlY3RseSB1bmRlciBET1MuIElmCi0gaXQgZG9lcyBub3Qgb3BlcmF0ZSB1bmRlciBET1MsIGl0IHdvbid0IHVuZGVyIExpbnV4LgotIElmIHlvdXIgZHJpdmUncyBiYXNlIGFkZHJlc3MgaXMgc29tZXRoaW5nIGxpa2UgMHgxNzAgb3IgMHgxRjAgKGFuZCBpdCBpcwotIG5vdCBhIEN5Q0RST00gQ1I1MjBpZSBvciBDUiA5NDBpZSkgeW91IG1vc3QgbGlrZWx5IGFyZSBoYXZpbmcgYW4gSURFL0FUQVBJLQotIGNvbXBhdGlibGUgZHJpdmUsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYXp0Y2QuYywgdXNlIGlkZS1jZC5jIGluc3RlYWQuCi0gTWFrZSBzdXJlIHRoZSBCYXNlIEFkZHJlc3MgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgaW4gYXp0Y2QuaCwgYWxzbyBtYWtlCi0gc3VyZSwgdGhhdCAvZGV2L2F6dGNkMCBleGlzdHMgd2l0aCB0aGUgY29ycmVjdCBtYWpvciBudW1iZXIgKGNvbXBhcmUgaXQgd2l0aAotIHRoZSBlbnRyeSBpbiBmaWxlIC91c3IvaW5jbHVkZS9saW51eC9tYWpvci5oIGZvciB0aGUgQXp0ZWNoIGRyaXZlKS4gCi0taW5zZXJ0IGEgQ0QtUk9NIGFuZCBjbG9zZSB0aGUgdHJheQotLWNvbGQgYm9vdCB5b3VyIFBDIChpLmUuIHZpYSB0aGUgcG93ZXIgb24gc3dpdGNoIG9yIHRoZSByZXNldCBidXR0b24pCi0taWYgeW91IHN0YXJ0IExpbnV4IHZpYSBET1MsIGUuZy4gdXNpbmcgbG9hZGxpbiwgbWFrZSBzdXJlLCB0aGF0IHRoZSBET1MKLSBkcml2ZXIgZm9yIHRoZSBDRC1ST00gZHJpdmUgaXMgbm90IGxvYWRlZCAoY29tbWVudCBvdXQgdGhlIGNhbGxpbmcgbGluZXMgCi0gaW4gRE9TJyBjb25maWcuc3lzISkKLS1sb29rIGZvciB0aGUgYXp0Y2Q6IGluaXQgbWVzc2FnZSBkdXJpbmcgTGludXggaW5pdCBhbmQgbm90ZSB0aGVtIGV4YWN0bHkKLS1sb2cgaW4gYXMgcm9vdCBhbmQgZG8gYSBtb3VudCAtdCBpc285NjYwIC9kZXYvYXp0Y2QwIC9tbnQKLS1pZiB5b3UgZG9uJ3Qgc3VjY2VlZCBpbiB0aGUgZmlyc3QgdGltZSwgdHJ5IHNldmVyYWwgdGltZXMuIFRyeSBhbHNvIHRvIG9wZW4KLSBhbmQgY2xvc2UgdGhlIHRyYXksIHRoZW4gbW91bnQgYWdhaW4uIFBsZWFzZSBub3RlIGNhcmVmdWxseSBhbGwgY29tbWFuZHMKLSB5b3UgdHlwZWQgaW4gYW5kIHRoZSBhenRjZC1tZXNzYWdlcywgd2hpY2ggeW91IGdldC4KLS1pZiB5b3UgZ2V0IGFuICdBenRlY2ggQ0QtUk9NIGluaXQ6IGFib3J0ZWQnIG1lc3NhZ2UsIHJlYWQgdGhlIHJlbWFya3MgYWJvdXQKLSB0aGUgdmVyc2lvbiBzdHJpbmcgYmVsb3cuCi0KLUlmIHRoaXMgZG9lcyBub3QgaGVscCwgZG8gdGhlIHNhbWUgd2l0aCB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzIAotLXN0YXJ0IERPUyBiZWZvcmU7IG1ha2Ugbm93IHN1cmUsIHRoYXQgdGhlIERPUyBkcml2ZXIgZm9yIHRoZSBDRC1ST00gaXMgCi0gbG9hZGVkIHVuZGVyIERPUyAoaS5lLiB1bmNvbW1lbnQgaXQgYWdhaW4gaW4gY29uZmlnLnN5cykKLS13YXJtIGJvb3QgeW91ciBQQyAoaS5lLiB2aWEgQ1RSTC1BTFQtREVMKQotIGlmIHlvdSBoYXZlIGl0LCB5b3UgY2FuIGFsc28gc3RhcnQgdmlhIGxvYWRsaW4gKHRyeSBib3RoKS4KLSAuLi4KLSBBZ2FpbiBub3RlIGFsbCBjb21tYW5kcyBhbmQgdGhlIGF6dGNkLW1lc3NhZ2VzLgotCi1JZiB5b3Ugc2VlIFNURU5fTE9XIG9yIFNURU5fTE9XX1dBSVQgZXJyb3IgbWVzc2FnZXMsIGluY3JlYXNlIHRoZSB0aW1lb3V0Ci12YWx1ZXMuCi0KLUlmIHRoaXMgc3RpbGwgZG9lcyBub3QgaGVscCwgCi0tbG9vayBpbiBhenRjZC5jIGZvciB0aGUgbGluZXMgICNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgQVpUX1RFU1QxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKLSBhbmQgc3Vic3RpdHV0ZSAnI2lmIDAnIGJ5ICcjaWYgMScuCi0tcmVjb21waWxlIHlvdXIga2VybmVsIGFuZCByZXBlYXQgdGhlIGFib3ZlIHR3byBwcm9jZWR1cmVzLiBZb3Ugd2lsbCBub3cgZ2V0IAotIGEgYnVuZGxlIG9mIGRlYnVnZ2luZyBtZXNzYWdlcyBmcm9tIHRoZSBkcml2ZXIuIEFnYWluIG5vdGUgeW91ciBjb21tYW5kcwotIGFuZCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZXMuIElmIHlvdSBoYXZlIHN5c2xvZ2QgcnVubmluZywgdGhlc2UgbWVzc2FnZXMKLSBtYXkgYWxzbyBiZSBmb3VuZCBpbiBzeXNsb2dkJ3Mga2VybmVsIGxvZyBmaWxlLiBOZXZlcnRoZWxlc3MgaW4gc29tZQotIGluc3RhbGxhdGlvbnMgc3lzbG9nZCBkb2VzIG5vdCB5ZXQgcnVuLCB3aGVuIGluaXQoKSBpcyBjYWxsZWQsIHRodXMgbG9vayBmb3IKLSB0aGUgYXp0Y2QtbWVzc2FnZXMgZHVyaW5nIGluaXQsIGJlZm9yZSB0aGUgbG9naW4tcHJvbXB0IGFwcGVhcnMuCi0gVGhlbiBsb29rIGluIGF6dGNkLmMsIHRvIGZpbmQgb3V0LCB3aGF0IGhhcHBlbmVkLiBUaGUgbm9ybWFsIGNhbGxpbmcgc2VxdWVuY2UgCi0gaXM6IGF6dGNkX2luaXQoKSBkdXJpbmcgTGludXggYm9vdHVwIHByb2NlZHVyZSBpbml0KCkKLSBhZnRlciBkb2luZyBhICdtb3VudCAtdCBpc285NjYwIC9kZXYvYXp0Y2QwIC9tbnQnIHRoZSBub3JtYWwgY2FsbGluZyBzZXF1ZW5jZSBpcwotICAgICBhenRjZF9vcGVuKCkgICAgLT4gU3RhdHVzIDJjIGFmdGVyIGNvbGQgcmVib290IHdpdGggQ0RST00gb3IgYXVkaW8gQ0QgaW5zZXJ0ZWQKLSAgICAgICAgICAgICAgICAgICAgIC0+IFN0YXR1cyA4ICBhZnRlciB3YXJtIHJlYm9vdCB3aXRoIENEUk9NIGluc2VydGVkICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgLT4gU3RhdHVzIDJlIGFmdGVyIGNvbGQgcmVib290IHdpdGggbm8gZGlzaywgY2xvc2VkIHRyYXkKLSAgICAgICAgICAgICAgICAgICAgIC0+IFN0YXR1cyA2ZSBhZnRlciBjb2xkIHJlYm9vdCwgbW91bnQgd2l0aCBkb29yIG9wZW4KLSAgICAgYXp0VXBkYXRlVG9jKCkKLSAgICAgYXp0R2V0RGlza0luZm8oKQotICAgICBhenRHZXRRQ2hhbm5lbEluZm8oKSAgIHJlcGVhdGVkIHNldmVyYWwgdGltZXMKLSAgICAgYXp0R2V0VG9jKCkKLSAgICAgYXp0R2V0UUNoYW5uZWxJbmZvKCkgICByZXBlYXRlZCBzZXZlcmFsIHRpbWVzCi0gICAgIGEgbGlzdCBvZiB0cmFjayBpbmZvcm1hdGlvbgotICAgICBkb19henRjZF9yZXF1ZXN0KCkgIH0gIAotICAgICBhenRfdHJhbnNmZXIoKSAgICB9IHJlcGVhdGVkIHNldmVyYWwgdGltZXMKLSAgICAgYXp0X3BvbGwgICAgICAgICAgfQotIENoZWNrLCBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb3IgdGhlIHN0YXR1cyBmbGFncyEKLSAKLSBUaGVyZSBhcmUgYSBsb3Qgb2Ygb3RoZXIgbWVzc2FnZXMsIGVnLiB0aGUgQUNNRC1jb21tYW5kIGNvZGUgKGRlZmluZWQgaW4KLSBhenRjZC5oKSwgc3RhdHVzIGluZm8gZnJvbSB0aGUgZ2V0QXp0U3RhdHVzLWNvbW1hbmQgYW5kIHRoZSBzdGF0ZSBzZXF1ZW5jZSBvZgotIHRoZSBmaW5pdGUgc3RhdGUgbWFjaGluZSBpbiBhenRfcG9sbCgpLiBUaGUgbW9zdCBpbXBvcnRhbnQgYXJlIHRoZSBzdGF0dXMKLSBtZXNzYWdlcywgbG9vayBob3cgdGhleSBhcmUgZGVmaW5lZCBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQsIGlmIHRoZXkgbWFrZQotIHNlbnNlIGluIHRoZSBjb250ZXh0IHdoZXJlIHRoZXkgYXBwZWFyLiBXaXRoIGEgQ0QtUk9NIGluc2VydGVkIHRoZSBzdGF0dXMgCi0gc2hvdWxkIGFsd2F5cyBiZSA4LCBleGNlcHQgaW4gYXp0Y2Rfb3BlbigpLiBUcnkgdG8gb3BlbiB0aGUgdHJheSwgaW5zZXJ0IGFuCi0gYXVkaW8gZGlzaywgaW5zZXJ0IG5vIGRpc2sgb3IgcmVpbnNlcnQgdGhlIENELVJPTSBhbmQgY2hlY2ssIGlmIHRoZSBzdGF0dXMKLSBiaXRzIGNoYW5nZSBhY2NvcmRpbmdseS4gVGhlIHN0YXR1cyBiaXRzIGFyZSB0aGUgbW9zdCBsaWtlbHkgcG9pbnQsIHdoZXJlIAotIHRoZSBkcml2ZSBtYW51ZmFjdHVyZXJzIG1heSBpbXBsZW1lbnQgY2hhbmdlcy4KLSAgICAgICAgICAgIAotSWYgeW91IHN0aWxsIGRvbid0IHN1Y2NlZWQsIGEgZ29vZCBwb2ludCB0byBzdGFydCBpcyB0byBsb29rIGluIGF6dGNkLmMgaW4gCi1mdW5jdGlvbiBhenRjZF9pbml0LCB3aGVyZSB0aGUgZHJpdmUgc2hvdWxkIGJlIGRldGVjdGVkIGR1cmluZyBpbml0LiBEbyB0aGUKLWZvbGxvd2luZzoKLS1yZWJvb3QgdGhlIHN5c3RlbSB3aXRoIGJvb3QgcGFyYW1ldGVyICdhenRjZD08eW91ciBiYXNlIGFkZHJlc3M+LDB4NzknLiBXaXRoCi0gcGFyYW1ldGVyIDB4NzkgbW9zdCBvZiB0aGUgZHJpdmUgdmVyc2lvbiBkZXRlY3Rpb24gaXMgYnlwYXNzZWQuIEFmdGVyIHRoYXQgCi0geW91IHNob3VsZCBzZWUgdGhlIGNvbXBsZXRlIHZlcnNpb24gc3RyaW5nIGluY2x1ZGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyAKLSBibGFua3MgZHVyaW5nIGluaXQuIAotIE5vdyBhZGFwdCB0aGUgc3RhdGVtZW50Ci0gICAgICBpZiAoKHJlc3VsdFsxXT09J0EnKSYmKHJlc3VsdFsyXT09J1onIC4uLikKLSBpbiBhenRjZF9pbml0KCkgdG8gZXhhY3RseSBtYXRjaCB0aGUgZmlyc3QgMyBvciA0IGxldHRlcnMgeW91IGhhdmUgc2Vlbi4KLS1Bbm90aGVyIHBvaW50IGlzIHRoZSAnc21hcnQnIGNhcmQgZGV0ZWN0aW9uIGZlYXR1cmUgaW4gYXp0Y2RfaW5pdCgpLiBOb3JtYWxseQotIHRoZSBDRC1ST00gZHJpdmUgaXMgcmVhZHksIHdoZW4gYXp0Y2RfaW5pdCBpcyB0cnlpbmcgdG8gcmVhZCB0aGUgdmVyc2lvbgotIHN0cmluZyBhbmQgYSB0aW1lIGNvbnN1bWluZyBBQ01EX1NPRlRfUkVTRVQgY29tbWFuZCBjYW4gYmUgYXZvaWRlZC4gVGhpcyBpcwotIGRldGVjdGVkIGJ5IGxvb2tpbmcsIGlmIEFGTF9PUF9PSyBjYW4gYmUgcmVhZCBjb3JyZWN0bHkuIElmIHRoZSBDRC1ST00gZHJpdmUgCi0gaGFuZ3MgaW4gc29tZSB1bmtub3duIHN0YXRlLCBlLmcuIGJlY2F1c2Ugb2YgYW4gZXJyb3IgYmVmb3JlIGEgd2FybSBzdGFydCBvciAKLSBiZWNhdXNlIHlvdSBmaXJzdCBvcGVyYXRlZCB1bmRlciBET1MsIGV2ZW4gdGhlIHZlcnNpb24gc3RyaW5nIG1heSBiZSBjb3JyZWN0LCAKLSBidXQgdGhlIGZvbGxvd2luZyBjb21tYW5kcyB3aWxsIG5vdC4gVGhlbiBjaGFuZ2UgdGhlIGNvZGUgaW4gc3VjaCBhIHdheSwgCi0gdGhhdCB0aGUgQUNNRF9TT0ZUX1JFU0VUIGlzIGlzc3VlZCBpbiBhbnkgY2FzZSwgYnkgc3Vic3RpdHV0aW5nIHRoZQotIGlmLXN0YXRlbWVudCAnaWYgKCAuLi49QUZMX09QX09LKScgYnkgJ2lmICgxKScuCi0KLUlmIHlvdSBzdWNjZWVkLCBwbGVhc2UgbWFpbCBtZSB0aGUgZXhhY3QgdmVyc2lvbiBzdHJpbmcgb2YgeW91ciBkcml2ZSBhbmQKLXRoZSBjb2RlIG1vZGlmaWNhdGlvbnMsIHlvdSBoYXZlIG1hZGUgdG9nZXRoZXIgd2l0aCBhIHNob3J0IGV4cGxhbmF0aW9uLgotSWYgeW91IGRvbid0IHN1Y2NlZWQsIHlvdSBtYXkgbWFpbCBtZSB0aGUgb3V0cHV0IG9mIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi1CdXQgcmVtZW1iZXIsIHRoZXkgYXJlIG9ubHkgdXNlZnVsLCBpZiB0aGV5IGFyZSBleGFjdCBhbmQgY29tcGxldGUgYW5kIHlvdQotZGVzY3JpYmUgaW4gZGV0YWlsIHlvdXIgaGFyZHdhcmUgc2V0dXAgYW5kIHdoYXQgeW91IGRpZCAoY29sZC93YXJtIHJlYm9vdCwKLXdpdGgvd2l0aG91dCBET1MsIERPUy1kcml2ZXIgc3RhcnRlZC9ub3Qgc3RhcnRlZCwgd2hpY2ggTGludXgtY29tbWFuZHMgZXRjLikKLQotCi05LiBURUNITklDQUwgSElTVE9SWSBPRiBUSEUgRFJJVkVSCi1UaGUgQVpURUNILURyaXZlciBpcyBhIHJld29yayBvZiB0aGUgTWl0c3VtaS1Ecml2ZXIuIEZvdXIgbWFqb3IgaXRlbXMgaGFkIHRvCi1iZSByZXdvcmtlZDoKLQotYSkgVGhlIE1pdHN1bWkgZHJpdmUgZG9lcyBpc3N1ZSBjb21wbGV0ZSBzdGF0dXMgaW5mb3JtYXRpb24gYWNrbm93bGVkZ2luZwotZWFjaCBjb21tYW5kLCB0aGUgQXp0ZWNoIGRyaXZlIGRvZXMgb25seSBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCB3YXMKLXByb2Nlc3NlZC4gU28gd2hlbmV2ZXIgdGhlIGNvbXBsZXRlIHN0YXR1cyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQsIGFuIGV4dHJhCi1BQ01EX0dFVF9TVEFUVVMgY29tbWFuZCBpcyBpc3N1ZWQuIFRoZSBoYW5kc2hha2UgcHJvY2VkdXJlIGZvciB0aGUgZHJpdmUKLWNhbiBiZSBmb3VuZCBpbiB0aGUgZnVuY3Rpb25zIGF6dFNlbmRDbWQoKSwgc2VuZEF6dENtZCgpIGFuZCBnZXRBenRTdGF0dXMoKS4KLQotYikgVGhlIEF6dGVjaCBEcml2ZSBkb2VzIG5vdCBoYXZlIGEgQUNNRF9HRVRfRElTS19JTkZPIGNvbW1hbmQsIHNvIHRoZQotbmVjZXNzYXJ5IGluZm8gYWJvdXQgdGhlIG51bWJlciBvZiB0cmFja3MgKGZpcnN0VHJhY2ssIGxhc3RUcmFjayksIGRpc2sKLWxlbmd0aCBldGMuIGhhcyB0byBiZSByZWFkIGZyb20gdGhlIFRPQyBpbiB0aGUgbGVhZCBpbiB0cmFjayAoc2VlIGZ1bmN0aW9uCi1henRHZXREaXNrSW5mbygpKS4KLQotYykgV2hlbmV2ZXIgZGF0YSBpcyByZWFkIGZyb20gdGhlIGRyaXZlLCB0aGUgTWl0c3VtaSBkcml2ZSBpcyBzdGFydGVkIHdpdGggYQotY29tbWFuZCB0byByZWFkIGFuIGluZGVmaW5pdGUgKDB4ZmZmZmZmKSBudW1iZXIgb2Ygc2VjdG9ycy4gV2hlbiB0aGUgYXBwcm9wcmlhdGUgCi1udW1iZXIgb2Ygc2VjdG9ycyBpcyByZWFkLCB0aGUgZHJpdmUgaXMgc3RvcHBlZCBieSBhIEFDRE1fU1RPUCBjb21tYW5kLiBUaGlzCi1kb2VzIG5vdCB3b3JrIHdpdGggdGhlIEF6dGVjaCBkcml2ZS4gSSBkaWQgbm90IGZpbmQgYSB3YXkgdG8gc3RvcCBpdC4gVGhlCi1zdG9wIGFuZCBwYXVzZSBjb21tYW5kcyBkbyBvbmx5IHdvcmsgaW4gQVVESU8gbW9kZSBidXQgbm90IGluIERBVEEgbW9kZS4KLVRoZXJlZm9yZSBJIGhhZCB0byBtb2RpZnkgdGhlICdmaW5pdGUgc3RhdGUgbWFjaGluZScgaW4gZnVuY3Rpb24gYXp0X3BvbGwgdG8KLW9ubHkgcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIHNlY3RvcnMgYW5kIHRoZW4gc3RhcnQgYSBuZXcgcmVhZCBvbiBkZW1hbmQuIEFzIEkgCi1oYXZlIG5vdCBjb21wbGV0ZWx5IHVuZGVyc3Rvb2QsIGhvdyB0aGUgYnVmZmVyL2NhY2hpbmcgc2NoZW1lIG9mIHRoZSBNaXRzdW1pIAotZHJpdmVyIHdhcyBpbXBsZW1lbnRlZCwgSSBhbSBub3Qgc3VyZSwgaWYgSSBoYXZlIGNvdmVyZWQgYWxsIGNhc2VzIGNvcnJlY3RseSwgCi13aGVuZXZlciB5b3UgZ2V0IHRpbWVvdXQgbWVzc2FnZXMsIHRoZSBidWcgaXMgbW9zdCBsaWtlbHkgdG8gYmUgaW4gdGhhdAotZnVuY3Rpb24gYXp0X3BvbGwoKSBhcm91bmQgc3dpdGNoKGNtZCkgLi4uLiBjYXNlIEFDRF9TX0RBVEEuIAotCi1kKSBJIGRpZCBub3QgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGNoYW5naW5nIGRyaXZlIG1vZGUuIFNvIEkgZG91YnQsIHRoYXQgdGhlCi1jb2RlIGFyb3VuZCBmdW5jdGlvbiBhenRfcG9sbCgpIGNhc2UgQVpUX1NfTU9ERSBkb2VzIHdvcmsuIEluIG15IHRlc3QgSSBoYXZlCi1ub3QgYmVlbiBhYmxlIHRvIHN3aXRjaCB0byByZWFkaW5nIGluIHJhdyBtb2RlLiBGb3IgcmVhZGluZyByYXcgbW9kZSwgQXp0ZWNoCi11c2VzIGEgZGlmZmVyZW50IGNvbW1hbmQgdGhhbiBmb3IgY29va2VkIG1vZGUsIHdoaWNoIEkgb25seSBoYXZlIGltcGxlbWVuLQotdGVkIGluIHRoZSBpb2N0bC1zZWN0aW9uIGJ1dCBub3QgaW4gdGhlIHNlY3Rpb24gd2hpY2ggaXMgdXNlZCBieSB0aGUgSVNPOTY2MC4gCi0KLVRoZSBkcml2ZXIgd2FzIGRldmVsb3BlZCBvbiBhbiBBU1QgUEMgd2l0aCBJbnRlbCA0ODYvRFgyLCA4TUIgUkFNLCAzNDBNQiBJREUgCi1oYXJkIGRpc2sgYW5kIG9uIGFuIEFTVCBQQyB3aXRoIEludGVsIFBlbnRpdW0gNjBNSHosIDE2TUIgUkFNLCA1MjBNQiBJREUgCi1ydW5uaW5nIExpbnV4IGtlcm5lbCB2ZXJzaW9uIDEuMC45IGZyb20gdGhlIExTVCAxLjggRGlzdHJpYnV0aW9uLiBUaGUga2VybmVsIAotd2FzIGNvbXBpbGVkIHdpdGggZ2NjLjIuNS44LiBNeSBDRC1ST00gZHJpdmUgaXMgYW4gQXp0ZWNoIENEQTI2OC0wMUEuIE15Ci1kcml2ZSBzYXlzLCB0aGF0IGl0IGhhcyBGaXJtd2FyZSBWZXJzaW9uIEFaVDI2ODAxQTEuMy4gSXQgY2FtZSB3aXRoIGFuIElTQS1idXMKLWludGVyZmFjZSBjYXJkIGFuZCB3b3JrcyB3aXRoIHBvbGxlZCBJL08gd2l0aG91dCBETUEgYW5kIHdpdGhvdXQgaW50ZXJydXB0cy4KLVRoZSBjb2RlIGZvciBhbGwgb3RoZXIgZHJpdmVzIHdhcyAncmVtb3RlJyB0ZXN0ZWQgYW5kIGRlYnVnZ2VkIGJ5IGEgbnVtYmVyIG9mIAotdm9sdW50ZWVycyBvbiB0aGUgSW50ZXJuZXQuCi0KLVBvaW50cywgd2hlcmUgSSBmZWVsIHRoYXQgcG9zc2libGUgcHJvYmxlbXMgbWlnaHQgYmUgYW5kIGFsbCBwb2ludHMgd2hlcmUgSSAKLWRpZCBub3QgY29tcGxldGVseSB1bmRlcnN0YW5kIHRoZSBkcml2ZSdzIGJlaGF2aW91ciBvciB0cnVzdCBteSBvd24gY29kZSBhcmUgCi1tYXJrZWQgd2l0aCAvKj8/PyovIGluIHRoZSBzb3VyY2UgY29kZS4gVGhlcmUgYXJlIGFsc28gc29tZSBwYXJ0cyBpbiB0aGUgCi1NaXRzdW1pIGRyaXZlciwgd2hlcmUgSSBkaWQgbm90IGNvbXBsZXRlbHkgdW5kZXJzdGFuZCB0aGVpciBjb2RlLgotCi0KLTEwLiBBQ0tOT1dMRURHTUVOVFMKLVdpdGhvdXQgdGhlIGhlbHAgb2YgUC5CdXNoLCBBenRlY2gsIHdobyBkZWxpdmVyZWQgdGVjaG5pY2FsIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgQXp0ZWNoIERyaXZlIGFuZCB3aXRob3V0IHRoZSBoZWxwIG9mIEUuTW9lbmtlYmVyZywgR1dERywgd2hvIGRpZCBhCi1ncmVhdCBqb2IgaW4gYW5hbHl6aW5nIHRoZSBjb21tYW5kIHN0cnVjdHVyZSBvZiB2YXJpb3VzIENELVJPTSBkcml2ZXMsIHRoaXMKLXdvcmsgd291bGQgbm90IGhhdmUgYmVlbiBwb3NzaWJsZS4gRS5Nb2Vua2ViZXJnIHdhcyBhbHNvIGEgZ3JlYXQgaGVscCBpbiAKLW1ha2luZyB0aGUgc29mdHdhcmUgJ2tlcm5lbCByZWFkeScgYW5kIGluIGFuc3dlcmluZyBtYW55IG9mIHRoZSBDRFJPTS1yZWxhdGVkIAotcXVlc3Rpb25zIGluIHRoZSBuZXdzZ3JvdXBzLiBIZSByZWFsbHkgaXMgKnRoZSogTGludXggQ0QtUk9NIGd1cnUuIFRoYW5rcyAKLWFsc28gdG8gYWxsIHRoZSBndXlzIG9uIHRoZSBJbnRlcm5ldCwgd2hvIGNvbGxlY3RlZCB2YWx1YWJsZSB0ZWNobmljYWwgCi1pbmZvcm1hdGlvbiBhYm91dCBDRFJPTXMuIAotCi1Kb2UgTmFyZG9uZSAoam9lQGFjY2Vzcy5kaWdleC5uZXQpIHdhcyBhIHBhdGllbnQgdGVzdGVyIGV2ZW4gZm9yIG15IGZpcnN0Ci10cmlhbCwgd2hpY2ggd2FzIG1vcmUgdGhhbiBzbG93LCBhbmQgbWFkZSBzdWdnZXN0aW9ucyBmb3IgY29kZSBpbXByb3ZlbWVudC4KLUVzcGVjaWFsbHkgdGhlICdmaW5pdGUgc3RhdGUgbWFjaGluZScgYXp0X3BvbGwoKSB3YXMgcmV3cml0dGVuIGJ5IEpvZSB0byBnZXQKLWNsZWFuIEMgY29kZSBhbmQgYXZvaWQgdGhlIHVnbHkgJ2dvdG9zJywgd2hpY2ggSSBjb3BpZWQgZnJvbSBtY2QuYy4KLQotUm9iYnkgU2NoaXJtZXIgKHNjaGlybWVyQGZtaS51bmktcGFzc2F1LmRlKSB0ZXN0ZWQgdGhlIGF1ZGlvIHN0dWZmIChpb2N0bHMpIAotYW5kIHN1Z2dlc3RlZCBhIGxvdCBvZiBwYXRjaGVzIGZvciB0aGVtLgotCi1Kb3NlcGggUGlza29yIGFuZCBQZXRlciBOdWdlbnQgd2VyZSB0aGUgZmlyc3QgdXNlcnMgd2l0aCB0aGUgT1JDSElEIENEMzExMAotYW5kIGFsc28gd2VyZSB2ZXJ5IHBhdGllbnQgd2l0aCB0aGUgcHJvYmxlbXMgd2hpY2ggb2NjdXJyZWQuCi0KLVJlaW5oYXJkIE1heCBkZWxpdmVyZWQgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgQ0RST00taW50ZXJmYWNlIG9mIHRoZQotU291bmRXYXZlMzIgc291bmRjYXJkcy4KLQotSm9jaGVuIEt1bnogYW5kIE9sYWYgS2FsdXphIGRlbGl2ZXJlZCB0aGUgaW5mb3JtYXRpb24gZm9yIHN1cHBvcnRpbmcgQ29ucmFkJ3MgCi1UWEMgZHJpdmUuCi0KLUhpbG1hciBCZXJnZXIgZGVsaXZlcmVkIHRoZSBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIEN5Q0RST00gQ1I1MjBpZS4KLQotQW55Ym9keSwgd2hvIGlzIGludGVyZXN0ZWQgaW4gdGhlc2UgaXRlbXMgc2hvdWxkIGhhdmUgYSBsb29rIGF0ICdmdHAuZ3dkZy5kZScsCi1kaXJlY3RvcnkgJ3B1Yi9saW51eC9jZHJvbScgYW5kIGF0ICdmdHAuY2Ryb20uY29tJywgZGlyZWN0b3J5ICdwdWIvY2Ryb20nLgotCi0xMS4gUFJPR1JBTU1JTkcgQUREIE9OczogY2RwbGF5LmMKLVlvdSBjYW4gdXNlIHRoZSBpb2N0bC1mdW5jdGlvbnMgaW5jbHVkZWQgaW4gYXp0Y2QuYyBpbiB5b3VyIG93biBwcm9ncmFtcy4gQXMKLWFuIGV4YW1wbGUgb24gaG93IHRvIGRvIHRoaXMsIHlvdSB3aWxsIGZpbmQgYSB0aW55IENEIFBsYXllciBmb3IgYXVkaW8gQ0RzIAotbmFtZWQgJ2NkcGxheS5jJy4gSXQgYWxsb3dzIHlvdSB0byBwbGF5IGF1ZGlvIENEcy4gWW91IGNhbiBwbGF5IGEgc3BlY2lmaWVkIAotdHJhY2ssIHBhdXNlIGFuZCByZXN1bWUgb3Igc2tpcCB0cmFja3MgZm9yd2FyZCBhbmQgYmFja3dhcmRzLiBJZiB5b3UgcXVpdCB0aGUgCi1wcm9ncmFtIHdpdGhvdXQgc3RvcHBpbmcgdGhlICBkcml2ZSwgcGxheWluZyBpcyBjb250aW51ZWQuIFlvdSBjYW4gYWxzbyAKLShtaXMpdXNlIGNkcGxheSB0byByZWFkIGFuZCBoZXhkdW1wIGRhdGEgZGlza3MuIFlvdSBjYW4gZmluZCB0aGUgY29kZSBpbiB0aGUgCi1BUFBFTkRJWCBvZiB0aGlzIGZpbGUsIHdoaWNoIHlvdSBzaG91bGQgY3V0IG91dCB3aXRoIGFuIGVkaXRvciBhbmQgc3RvcmUgaW4gYSAKLXNlcGFyYXRlIGZpbGUgJ2NkcGxheS5jJy4gVG8gY29tcGlsZSBpdCBhbmQgbWFrZSBpdCBleGVjdXRhYmxlLCBkbwotICBnY2MgLXMgLVdhbGwgLU8yIC1ML3Vzci9saWIgY2RwbGF5LmMgLW8gL3Vzci9sb2NhbC9iaW4vY2RwbGF5ICMgY29tcGlsZXMgaXQKLSAgY2htb2QgKzc1NSAvdXNyL2xvY2FsL2Jpbi9jZHBsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2VzIGl0IGV4ZWN1dGFibGUKLSAgbG4gLXMgL2Rldi9henRjZDAgL2Rldi9jZHJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyZWF0ZXMgYSBsaW5rCi0gICAoZm9yIC91c3IvbGliIHN1YnN0aXR1dGUgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnksIHdoZXJlIHlvdXIgaW5jbHVkZSBmaWxlcyAKLSAgICByZXNpZGUsICBhbmQgZm9yIC91c3IvbG9jYWwvYmluIHRoZSBkaXJlY3RvcnksIHdoZXJlIHlvdSB3YW50IHRoZSBleGVjdXRhYmxlIAotICAgIGJpbmFyeSB0byByZXNpZGUgKQotCi1Zb3UgaGF2ZSB0byBzZXQgdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMgZm9yIGNkcGxheSAqYW5kKiBmb3IgL2Rldi9tY2QwIG9yCi0vZGV2L2F6dGNkMCBpbiBvcmRlciB0byB1c2UgaXQuIFJlbWVtYmVyLCB0aGF0IHlvdSBzaG91bGQgbm90IGhhdmUgL2Rldi9jZHJvbSAKLW1vdW50ZWQsIHdoZW4geW91J3JlIHBsYXlpbmcgYXVkaW8gQ0RzLiAKLQotVGhpcyBwcm9ncmFtIGlzIGp1c3QgYSBoYWNrIGZvciB0ZXN0aW5nIHRoZSBpb2N0bC1mdW5jdGlvbnMgaW4gYXp0Y2QuYy4gSSB3aWxsIAotbm90IG1haW50YWluIGl0LCBzbyBpZiB5b3UgcnVuIGludG8gcHJvYmxlbXMsIGRpc2NhcmQgaXQgb3IgaGF2ZSBhIGxvb2sgaW50byAKLXRoZSBzb3VyY2UgY29kZSAnY2RwbGF5LmMnLiBUaGUgcHJvZ3JhbSBkb2VzIG9ubHkgY29udGFpbiBhIG1pbmltdW0gb2YgdXNlciAKLXByb3RlY3Rpb24gYW5kIGlucHV0IGVycm9yIGRldGVjdGlvbi4gSWYgeW91IHVzZSB0aGUgY29tbWFuZHMgaW4gdGhlIHdyb25nIAotb3JkZXIgb3IgaWYgeW91IHRyeSB0byByZWFkIGEgQ0QgYXQgd3JvbmcgYWRkcmVzc2VzLCB5b3UgbWF5IGdldCBlcnJvciBtZXNzYWdlcwotb3IgZXZlbiBoYW5nIHlvdXIgbWFjaGluZS4gSWYgeW91IGdldCBTVEVOX0xPVywgU1RFTl9MT1dfV0FJVCBvciBzZWdtZW50IHZpb2xhdGlvbiAKLWVycm9yIG1lc3NhZ2VzIHdoZW4gdXNpbmcgY2RwbGF5LCBhZnRlciB0aGF0LCB0aGUgc3lzdGVtIG1pZ2h0IG5vdCBiZSBzdGFibGUgCi1hbnkgbW9yZSwgc28geW91J2QgYmV0dGVyIHJlYm9vdC4gQXMgdGhlIGlvY3RsLWZ1bmN0aW9ucyBydW4gaW4ga2VybmVsIG1vZGUsCi1tb3N0IG5vcm1hbCBMaW51eC1tdWx0aXRhc2tpbmcgcHJvdGVjdGlvbiBmZWF0dXJlcyBkbyBub3Qgd29yay4gQnkgdXNpbmcKLXVuaW5pdGlhbGl6ZWQgJ3dpbGQnIHBvaW50ZXJzIGV0Yy4sIGl0IGlzIGVhc3kgdG8gd3JpdGUgdG8gb3RoZXIgdXNlcnMnIGRhdGEgCi1hbmQgcHJvZ3JhbSBhcmVhcywgZGVzdHJveSBrZXJuZWwgdGFibGVzIGV0Yy4uIFNvIGlmIHlvdSBleHBlcmltZW50IHdpdGggaW9jdGxzCi1hcyBhbHdheXMgd2hlbiB5b3UgYXJlIGRvaW5nIHN5c3RlbXMgcHJvZ3JhbW1pbmcgYW5kIGtlcm5lbCBoYWNraW5nLCB5b3UKLXNob3VsZCBoYXZlIGEgYmFja3VwIGNvcHkgb2YgeW91ciBzeXN0ZW0gaW4gYSBzYWZlIHBsYWNlIChhbmQgeW91IGFsc28KLXNob3VsZCB0cnkgcmVzdG9yaW5nIGZyb20gYSBiYWNrdXAgY29weSBmaXJzdCkhCi0KLUEgcmV3b3JrZWQgYW5kIGltcHJvdmVkIHZlcnNpb24gY2FsbGVkICdjZHRlc3Rlci5jJywgd2hpY2ggaGFzIHlldCBtb3JlCi1mZWF0dXJlcyBmb3IgdGVzdGluZyBDRFJPTS1kcml2ZXMgY2FuIGJlIGZvdW5kIGluCi1Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkLCB3cml0dGVuIGJ5IEUuTW9lbmtlYmVyZy4KLQotV2VybmVyIFppbW1lcm1hbm4KLUZhY2hob2Noc2NodWxlIGZ1ZXIgVGVjaG5payBFc3NsaW5nZW4KLShFTWFpbDogV2VybmVyLlppbW1lcm1hbm5AZmh0LWVzc2xpbmdlbi5kZSkKLU9jdG9iZXIsIDE5OTcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BUFBFTkRJWDogU291cmNlIGNvZGUgb2YgY2RwbGF5LmMKLQotLyogVGlueSBBdWRpbyBDRCBQbGF5ZXIKLQotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYgV2VybmVyIFppbW1lcm1hbm4gKFdlcm5lci5aaW1tZXJtYW5uQGZodC1lc3NsaW5nZW4uZGUpCi0KLVRoaXMgcHJvZ3JhbSBvcmlnaW5hbGx5IHdhcyB3cml0dGVuIHRvIHRlc3QgdGhlIGF1ZGlvIGZ1bmN0aW9ucyBvZiB0aGUKLUFaVEVDSC5DRFJPTS1kcml2ZXIsIGJ1dCBpdCBzaG91bGQgd29yayB3aXRoIGV2ZXJ5IENELVJPTSBkcml2ZS4gQmVmb3JlIAotdXNpbmcgaXQsIHlvdSBzaG91bGQgc2V0IGEgc3ltbGluayBmcm9tIC9kZXYvY2Ryb20gdG8geW91ciByZWFsIENEUk9NCi1kZXZpY2UuCi0KLVRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIHRoaXMgcHJvZ3JhbS4KLQotSGlzdG9yeTogIFYwLjEgIFcuWmltbWVybWFubjogRmlyc3QgcmVsZWFzZS4gTm92LiA4LCAxOTk0Ci0gICAgICAgICAgVjAuMiAgVy5aaW1tZXJtYW5uOiBFbmhhbmNlZCBmdW5jdGlvbmFsaXR5LiBOb3YuIDksIDE5OTQKLSAgICAgICAgICBWMC4zICBXLlppbW1lcm1hbm46IEFkZGl0aW9uYWwgZnVuY3Rpb25zLiBOb3YuIDI4LCAxOTk0ICAgICAgICAgIAotICAgICAgICAgIFYwLjQgIFcuWmltbWVybWFubjogZml4ZWQgc29tZSBidWdzLiBEZWMuIDE3LCAxOTk0Ci0gICAgICAgICAgVjAuNSAgVy5aaW1tZXJtYW5uOiBjbGVhbiAnc2NhbmYnIGNvbW1hbmRzIHdpdGhvdXQgY29tcGlsZXIgd2FybmluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gNiwgMTk5NQotICAgICAgICAgIFYwLjYgIFcuWmltbWVybWFubjogdm9sdW1lIGNvbnRyb2wgKHN0aWxsIGV4cGVyaW1lbnRhbCkuIEphbi4gMjQsIDE5OTUKLSAgICAgICAgICBWMC43ICBXLlppbW1lcm1hbm46IHJlYWQgcmF3IG1vZGlmaWVkLiBKdWx5IDI2LCA5NQotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+Ci0jaW5jbHVkZSA8bGludXgvLi4vLi4vZHJpdmVycy9jZHJvbS9henRjZC5oPgotCi12b2lkIGhlbHAodm9pZCkKLXsgcHJpbnRmKCJBdmFpbGFibGUgQ29tbWFuZHM6ICBTVE9QICAgICAgICAgcyAgICAgIEVKRUNUL0NMT1NFICBlICAgICAgIFFVSVQgICAgICAgICBxXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBQTEFZIFRSQUNLICAgdCAgICAgIFBBVVNFICAgICAgICBwICAgICAgIFJFU1VNRSAgICAgICByXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBORVhUIFRSQUNLICAgbiAgICAgIFJFUEVBVCBMQVNUICBsICAgICAgIEhFTFAgICAgICAgICBoXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBTVUIgQ0hBTk5FTCAgYyAgICAgIFRSQUNLIElORk8gICBpICAgICAgIFBMQVkgQVQgICAgICBhXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBSRUFEICAgICAgICAgZCAgICAgIFJFQUQgUkFXICAgICB3ICAgICAgIFZPTFVNRSAgICAgICB2XG4iKTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsgaW50IGhhbmRsZTsKLSAgdW5zaWduZWQgY2hhciBjb21tYW5kPScgJywgaW5pPTAsIGZpcnN0PTEsIGxhc3Q9MTsKLSAgdW5zaWduZWQgaW50IGNtZCwgaSxqLGssIGFyZzEsYXJnMixhcmczOwotICBzdHJ1Y3QgY2Ryb21fdGkgICAgICAgdGk7Ci0gIHN0cnVjdCBjZHJvbV90b2NoZHIgICB0b2NIZHI7Ci0gIHN0cnVjdCBjZHJvbV9zdWJjaG5sICBzdWJjaG5sOwotICBzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgZW50cnk7Ci0gIHN0cnVjdCBjZHJvbV9tc2YgICAgICBtc2Y7Ci0gIHVuaW9uICB7IHN0cnVjdCBjZHJvbV9tc2YgbXNmOwotICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZltDRF9GUkFNRVNJWkVfUkFXXTsKLSAgICAgICAgIH0gYXp0OwotICBzdHJ1Y3QgY2Ryb21fdm9sY3RybCAgdm9sY3RybDsKLQotICBwcmludGYoIlxuTWluaS1BdWRpbyBDRC1QbGF5ZXIgVjAuNzIgICAoQykgMTk5NCwxOTk1LDE5OTYgIFcuWmltbWVybWFublxuIik7Ci0gIGhhbmRsZT1vcGVuKCIvZGV2L2Nkcm9tIixPX1JEV1IpOwotICBpb2N0bChoYW5kbGUsQ0RST01SRVNVTUUpOwotICAKLSAgaWYgKGhhbmRsZTw9MCkgCi0gICAgeyBwcmludGYoIkRyaXZlIEVycm9yOiBhbHJlYWR5IHBsYXlpbmcsIG5vIGF1ZGlvIGRpc2ssIGRvb3Igb3BlblxuIik7Ci0gICAgICBwcmludGYoIiAgICAgICAgICAgICBvciBubyBwZXJtaXNzaW9uICh5b3UgbXVzdCBiZSBST09UIGluIG9yZGVyIHRvIHVzZSB0aGlzIHByb2dyYW0pXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7IGhlbHAoKTsKLSAgICAgIHdoaWxlICgxKQotICAgICAgICB7IHByaW50ZigiVHlwZSBjb21tYW5kIChoID0gaGVscCk6ICAiKTsKLSAgICAgICAgICBzY2FuZigiJXMiLCZjb21tYW5kKTsgCi0gICAgICAgICAgc3dpdGNoIChjb21tYW5kKQotICAgICAgICAgICAgeyBjYXNlICdlJzogICBjbWQ9Q0RST01FSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGwoaGFuZGxlLGNtZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCi0gICAgICAgICAgICAgIGNhc2UgJ3AnOiAgIGlmICghaW5pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiQ29tbWFuZCBub3QgYWxsb3dlZCAtIHBsYXkgdHJhY2sgZmlyc3RcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjbWQ9Q0RST01QQVVTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCkpIHByaW50ZigiRHJpdmUgRXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdyJzogICBpZiAoIWluaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkNvbW1hbmQgbm90IGFsbG93ZWQgLSBwbGF5IHRyYWNrIGZpcnN0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY21kPUNEUk9NUkVTVU1FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3MnOiAgIGNtZD1DRFJPTVBBVVNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCkpIHByaW50ZigiRHJpdmUgZXJyb3Igb3IgYWxyZWFkeSBzdG9wcGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY21kPUNEUk9NU1RPUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQpKSBwcmludGYoIkRyaXZlIGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3QnOiAgIGNtZD1DRFJPTVJFQURUT0NIRFI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZ0b2NIZHIpKSBwcmludGYoIkRyaXZlIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Q9dG9jSGRyLmNkdGhfdHJrMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiLS1maXJzdCB0cmFjazogJWQgICAtLWxhc3QgdHJhY2s6ICVkICAgLS1lbnRlciB0cmFjayBudW1iZXI6ICIsZmlyc3QsbGFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9Q0RST01QTEFZVFJLSU5EOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVpIiwmYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aS5jZHRpX3RyazA8Zmlyc3QpIHRpLmNkdGlfdHJrMD1maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aS5jZHRpX3RyazA+bGFzdCkgIHRpLmNkdGlfdHJrMD1sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQwPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazE9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfaW5kMT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQsJnRpKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmk9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnbic6ICAgaWYgKCFpbmkrKykgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaW9jdGwoaGFuZGxlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD10b2NIZHIuY2R0aF90cmswOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMD1maXJzdC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNtZD1DRFJPTVBMQVlUUktJTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKyt0aS5jZHRpX3RyazAgPiBsYXN0KSAgdGkuY2R0aV90cmswPWxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX2luZDA9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMT1sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQxPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmdGkpKSBwcmludGYoIkRyaXZlIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaT0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2wnOiAgIGlmICghaW5pKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaW9jdGwoaGFuZGxlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD10b2NIZHIuY2R0aF90cmswOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMD1maXJzdCsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNtZD1DRFJPTVBMQVlUUktJTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS10aS5jZHRpX3RyazAgPCBmaXJzdCkgdGkuY2R0aV90cmswPWZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQwPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazE9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfaW5kMT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQsJnRpKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmk9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2MnOiAgIHN1YmNobmwuY2RzY19mb3JtYXQ9Q0RST01fTVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLENEUk9NU1VCQ0hOTCwmc3ViY2hubCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRHJpdmUgRXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkF1ZGlvU3RhdHVzOiVzICAgVHJhY2s6JWQgIE1vZGU6JWQgICBNU0Y9JWQ6JWQ6JWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNobmwuY2RzY19hdWRpb3N0YXR1cz09Q0RST01fQVVESU9fUExBWSA/ICJQTEFZSU5HIjoiTk9UIFBMQVlJTkciLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNobmwuY2RzY190cmssc3ViY2hubC5jZHNjX2FkciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSwgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLmZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGNhc2UgJ2knOiAgIGlmICghaW5pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJDb21tYW5kIG5vdCBhbGxvd2VkIC0gcGxheSB0cmFjayBmaXJzdFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjbWQ9Q0RST01SRUFEVE9DRU5UUlk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRyYWNrIE5vLjogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZhcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNkdGVfdHJhY2s9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jZHRlX3RyYWNrPGZpcnN0KSBlbnRyeS5jZHRlX3RyYWNrPWZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNkdGVfdHJhY2s+bGFzdCkgIGVudHJ5LmNkdGVfdHJhY2s9bGFzdDsKLQkJCSAgICAgIGVudHJ5LmNkdGVfZm9ybWF0PUNEUk9NX01TRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZlbnRyeSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciBvciBpbnZhbGlkIHRyYWNrIG5vLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJNb2RlICVkIFRyYWNrLCBzdGFydHMgYXQgJWQ6JWQ6JWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5jZHRlX2FkcixlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNkdGVfYWRkci5tc2Yuc2Vjb25kLGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdhJzogICBjbWQ9Q0RST01QTEFZTVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkFkZHJlc3MgKG1pbjpzZWM6ZnJhbWUpICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkOiVkOiVkIiwmYXJnMSwmYXJnMiwmYXJnMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmLmNkbXNmX3NlYzAgID1hcmcyOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YuY2Rtc2ZfZnJhbWUwPWFyZzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2YuY2Rtc2Zfc2VjMCAgPiA1OSkgbXNmLmNkbXNmX3NlYzAgID01OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZi5jZG1zZl9mcmFtZTA+IDc0KSBtc2YuY2Rtc2ZfZnJhbWUwPTc0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YuY2Rtc2ZfbWluMT02MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmLmNkbXNmX3NlYzE9MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZi5jZG1zZl9mcmFtZTE9MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZtc2YpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciBvciBpbnZhbGlkIGFkZHJlc3NcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBBWlRfUFJJVkFURV9JT0NUTFMgLypub3Qgc3VwcG9ydGVkIGJ5IGV2ZXJ5IENEUk9NIGRyaXZlciovCi0gICAgICAgICAgICAgIGNhc2UgJ2QnOiAgIGNtZD1DRFJPTVJFQURDT09LRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQ6JWQ6JWQiLCZhcmcxLCZhcmcyLCZhcmczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9zZWMwICA9YXJnMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9YXJnMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF6dC5tc2YuY2Rtc2Zfc2VjMCAgPiA1OSkgYXp0Lm1zZi5jZG1zZl9zZWMwICA9NTk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhenQubXNmLmNkbXNmX2ZyYW1lMD4gNzQpIGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPTc0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmYXp0Lm1zZikpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkRyaXZlIGVycm9yLCBpbnZhbGlkIGFkZHJlc3Mgb3IgdW5zdXBwb3J0ZWQgY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Y2hhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPDEyODtpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiJTRkOiIsaSoxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8MTY7aisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlMnggIixhenQuYnVmW2kqMTYral0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajwxNjtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaXNhbG51bShhenQuYnVmW2kqMTYral0pKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsYXp0LmJ1ZltpKjE2K2pdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrPj0yMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJwcmVzcyBFTlRFUiB0byBjb250aW51ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGNoYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3cnOiAgIGNtZD1DRFJPTVJFQURSQVc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQ6JWQ6JWQiLCZhcmcxLCZhcmcyLCZhcmczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9zZWMwICA9YXJnMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9YXJnMzsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXp0Lm1zZi5jZG1zZl9zZWMwICA+IDU5KSBhenQubXNmLmNkbXNmX3NlYzAgID01OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPiA3NCkgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9NzQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZhenQpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciwgaW52YWxpZCBhZGRyZXNzIG9yIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBrPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8MTQ3O2krKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlNGQ6IixpKjE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajwxNjtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIiUyeCAiLGF6dC5idWZbaSoxNitqXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPDE2O2orKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmIChpc2FsbnVtKGF6dC5idWZbaSoxNitqXSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVjIixhenQuYnVmW2kqMTYral0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGs+PTIwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnZXRjaGFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICAgIGNhc2UgJ3YnOiAgIGNtZD1DRFJPTVZPTENUUkw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS1DaGFubmVsIDAgTGVmdCAgKDAtMjU1KTogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsJmFyZzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi0tQ2hhbm5lbCAxIFJpZ2h0ICgwLTI1NSk6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZhcmcyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY3RybC5jaGFubmVsMD1hcmcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xjdHJsLmNoYW5uZWwxPWFyZzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGN0cmwuY2hhbm5lbDI9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY3RybC5jaGFubmVsMz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmdm9sY3RybCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkRyaXZlIGVycm9yIG9yIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAotICAgICAgICAgICAgICBjYXNlICdxJzogICBpZiAoY2xvc2UoaGFuZGxlKSkgcHJpbnRmKCJEcml2ZSBFcnJvcjogQ0xPU0VcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgICBjYXNlICdoJzogICBoZWxwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OiAgICBwcmludGYoInVua25vd24gY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jZHUzMWEgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2NkdTMxYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2NjdkYS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2NkdTMxYQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0KLQkJQ0RVMzFBL0NEVTMzQSBEcml2ZXIgSW5mbwotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUluZm9ybWF0aW9uIG9uIHRoZSBTb255IENEVTMxQS9DRFUzM0EgQ0RST00gZHJpdmVyIGZvciB0aGUgTGludXgKLWtlcm5lbC4KLQotICAgQ29yZXkgTWlueWFyZCAobWlueWFyZEBtZXRyb25ldC5jb20pCi0gIAotICAgQ29sb3NzaWFucyAzOjE3Ci0KLUNydWRlIFRhYmxlIG9mIENvbnRlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFNldHRpbmcgVXAgdGhlIEhhcmR3YXJlCi0gIENvbmZpZ3VyaW5nIHRoZSBLZXJuZWwKLSAgQ29uZmlndXJpbmcgYXMgYSBNb2R1bGUKLSAgRHJpdmVyIFNwZWNpYWwgRmVhdHVyZXMKLQotICAKLVRoaXMgZGV2aWNlIGRyaXZlciBoYW5kbGVzIFNvbnkgQ0RVMzFBL0NEVTMzQSBDRFJPTSBkcml2ZXMgYW5kCi1wcm92aWRlcyBhIGNvbXBsZXRlIGJsb2NrLWxldmVsIGludGVyZmFjZSBhcyB3ZWxsIGFzIGFuIGlvY3RsKCkKLWludGVyZmFjZSBhcyBzcGVjaWZpZWQgaW4gaW5jbHVkZS9saW51eC9jZHJvbS5oKS4gIFdpdGggdGhpcwotaW50ZXJmYWNlLCBDRFJPTXMgY2FuIGJlIGFjY2Vzc2VkLCBzdGFuZGFyZCBhdWRpbyBDRHMgY2FuIGJlIHBsYXllZAotYmFjayBub3JtYWxseSwgYW5kIENEIGF1ZGlvIGluZm9ybWF0aW9uIGNhbiBiZSByZWFkIG9mZiB0aGUgZHJpdmUuCi0KLU5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSB3b3JrIGZvciBDRFUzMUEvQ0RVMzNBIGRyaXZlcy4gIFNvbWUgdmVuZG9ycwotbWFya2V0IHRoZWlyIGRyaXZlcyBhcyBDRFUzMUEgY29tcGF0aWJsZS4gIFRoZXkgbGllLiAgVGhlaXIgZHJpdmVzIGFyZQotcmVhbGx5IENEVTMxQSBoYXJkd2FyZSBpbnRlcmZhY2UgY29tcGF0aWJsZSAodGhleSBjYW4gcGx1ZyBpbnRvIHRoZQotc2FtZSBjYXJkKS4gIFRoZXkgYXJlIG5vdCBzb2Z0d2FyZSBjb21wYXRpYmxlLgotCi1TZXR0aW5nIFVwIHRoZSBIYXJkd2FyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIENEVTMxQSBkcml2ZXIgaXMgdW5hYmxlIHRvIHNhZmVseSB0ZWxsIGlmIGFuIGludGVyZmFjZSBjYXJkIGlzCi1wcmVzZW50IHRoYXQgaXQgY2FuIHVzZSBiZWNhdXNlIHRoZSBpbnRlcmZhY2UgY2FyZCBkb2VzIG5vdCBhbm5vdW5jZQotaXRzIHByZXNlbmNlIGluIGFueSB3YXkgYmVzaWRlcyBwbGFjaW5nIDQgSS9PIGxvY2F0aW9ucyBpbiBtZW1vcnkuICBJdAotdXNlZCB0byBqdXN0IHByb2JlIG1lbW9yeSBhbmQgYXR0ZW1wdCBjb21tYW5kcywgYnV0IExpbnVzIHdpc2VseSBhc2tlZAotbWUgdG8gcmVtb3ZlIHRoYXQgYmVjYXVzZSBpdCBjb3VsZCByZWFsbHkgc2NyZXcgdXAgb3RoZXIgaGFyZHdhcmUgaW4KLXRoZSBzeXN0ZW0uCi0KLUJlY2F1c2Ugb2YgdGhpcywgeW91IG11c3QgdGVsbCB0aGUga2VybmVsIHdoZXJlIHRoZSBkcml2ZSBpbnRlcmZhY2UKLWlzLCB3aGF0IGludGVycnVwdHMgYXJlIHVzZWQsIGFuZCBwb3NzaWJseSBpZiB5b3UgYXJlIG9uIGEgUEFTLTE2Ci1zb3VuZGNhcmQuCi0KLUlmIHlvdSBoYXZlIHRoZSBTb255IENEVTMxQS9DRFUzM0EgZHJpdmUgaW50ZXJmYWNlIGNhcmQsIHRoZSBmb2xsb3dpbmcKLWRpYWdyYW0gd2lsbCBoZWxwIHlvdSBzZXQgaXQgdXAuICBJZiB5b3UgaGF2ZSBhbm90aGVyIGNhcmQsIHlvdSBhcmUgb24KLXlvdXIgb3duLiAgWW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIEkvTyBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgaXMKLW5vdCB1c2VkIGJ5IGFub3RoZXIgY2FyZCBpbiB0aGUgc3lzdGVtLiAgWW91IHdpbGwgbmVlZCB0byBrbm93IHRoZSBJL08KLWFkZHJlc3MgYW5kIGludGVycnVwdCB5b3UgaGF2ZSBzZXQuICBOb3RlIHRoYXQgdXNlIG9mIGludGVycnVwdHMgaXMKLWhpZ2hseSByZWNvbW1lbmRlZCwgaWYgcG9zc2libGUsIGl0IHJlYWxseSBjdXRzIGRvd24gb24gQ1BVIHVzZWQuCi1VbmZvcnR1bmF0ZWx5LCBtb3N0IHNvdW5kY2FyZHMgZG8gbm90IHN1cHBvcnQgaW50ZXJydXB0cyBmb3IgdGhlaXIKLUNEUk9NIGludGVyZmFjZXMuICBCeSBkZWZhdWx0LCB0aGUgU29ueSBpbnRlcmZhY2UgY2FyZCBjb21lcyB3aXRoCi1pbnRlcnJ1cHRzIGRpc2FibGVkLgotICAgCi0gICAgICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgIHwgIEpQMSAgICAgfCAgMzQgUGluIENvbm4gICAgfCAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQMiAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0rCi0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLSsKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgfCAgRXh0ZXJuYWwKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgfCAgQ29ubmVjdG9yCi0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8IHwKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICstKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgCi0gICAgICBKUDEgc2V0cyB0aGUgQmFzZSBBZGRyZXNzLCB1c2luZyB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgotICAgCi0gICAgICAgIEFkZHJlc3MgICAgICAgICBQaW4gMSAgICAgICAgICAgUGluIDIKLSAgICAgICAgLS0tLS0tLSAgICAgICAgIC0tLS0tICAgICAgICAgICAtLS0tLQotICAgICAgICAweDMyMCAgICAgICAgICAgU2hvcnQgICAgICAgICAgIFNob3J0Ci0gICAgICAgIDB4MzMwICAgICAgICAgICBTaG9ydCAgICAgICAgICAgT3BlbgotICAgICAgICAweDM0MCAgICAgICAgICAgT3BlbiAgICAgICAgICAgIFNob3J0Ci0gICAgICAgIDB4MzYwICAgICAgICAgICBPcGVuICAgICAgICAgICAgT3BlbgotICAgCi0gICAgICBKUDIgYW5kIEpQMyBjb25maWd1cmUgdGhlIERNQSBjaGFubmVsOyB0aGV5IG11c3QgYmUgc2V0IHRoZSBzYW1lLgotICAgCi0gICAgICAgIERNQSAgICAgICAgICAgICBQaW4gMSAgICAgICAgICAgUGluIDIgICAgICAgICAgIFBpbiAzCi0gICAgICAgIC0tLSAgICAgICAgICAgICAtLS0tLSAgICAgICAgICAgLS0tLS0gICAgICAgICAgIC0tLS0tCi0gICAgICAgIDEgICAgICAgICAgICAgICBPbiAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uCi0gICAgICAgIDIgICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT24gICAgICAgICAgICAgIE9mZgotICAgICAgICAzICAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICBPbgotICAgCi0gICAgICBKUDQgQ29uZmlndXJlcyB0aGUgSVJROgotICAgCi0gICAgICAgIElSUSAgICAgUGluIDEgICAgICAgICAgIFBpbiAyICAgICAgICAgICBQaW4gMyAgICAgICAgICAgUGluIDQKLSAgICAgICAgLS0tICAgICAtLS0tLSAgICAgICAgICAgLS0tLS0gICAgICAgICAgIC0tLS0tICAgICAgICAgICAtLS0tLQotICAgICAgICAzICAgICAgIE9mZiAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT24gICAgICAgICAgICAgIE9mZgotICAgICAgICA0ICAgICAgIE9mZiAgICAgICAgICAgICBPZmYqICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uCi0gICAgICAgIDUgICAgICAgT24gICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmCi0gICAgICAgIDYgICAgICAgT2ZmICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmCi0gICAKLSAgICAgICAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0byBzZXQgdGhpcyBmb3IgaW50ZXJydXB0Ci0gICAgICAgICAgICAgICAgICA0LCBidXQgSSB0aGluayB0aGF0IGlzIGEgbWlzdGFrZS4KLQotTm90ZSB0aGF0IGlmIHlvdSBoYXZlIGFub3RoZXIgaW50ZXJmYWNlIGNhcmQsIHlvdSB3aWxsIG5lZWQgdG8gbG9vayBhdAotdGhlIGRvY3VtZW50YXRpb24gdG8gZmluZCB0aGUgSS9PIGJhc2UgYWRkcmVzcy4gIFRoaXMgaXMgc3BlY2lmaWVkIHRvCi10aGUgU0xDRC5TWVMgZHJpdmVyIGZvciBET1Mgd2l0aCB0aGUgL0I6IHBhcmFtZXRlciwgc28geW91IGNhbiBsb29rIGF0Ci15b3UgRE9TIGRyaXZlciBzZXR1cCB0byBmaW5kIHRoZSBhZGRyZXNzLCBpZiBuZWNlc3NhcnkuCi0KLUNvbmZpZ3VyaW5nIHRoZSBLZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotWW91IG11c3QgdGVsbCB0aGUga2VybmVsIHdoZXJlIHRoZSBkcml2ZSBpcyBhdCBib290IHRpbWUuICBUaGlzIGNhbiBiZQotZG9uZSBhdCB0aGUgTGludXggYm9vdCBwcm9tcHQsIGJ5IHVzaW5nIExJTE8sIG9yIGJ5IHVzaW5nIEJvb3RsaW4uCi1Ob3RlIHRoYXQgdGhpcyBpcyBubyBzdWJzdGl0dXRlIGZvciBIT1dUT3MgYW5kIExJTE8gZG9jdW1lbnRhdGlvbiwgaWYKLXlvdSBhcmUgY29uZnVzZWQgcGxlYXNlIHJlYWQgdGhvc2UgZm9yIGluZm8gb24gYm9vdGxpbmUgY29uZmlndXJhdGlvbgotYW5kIExJTE8uCi0KLUF0IHRoZSBsaW51eCBib290IHByb21wdCwgcHJlc3MgdGhlIEFMVCBrZXkgYW5kIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUKLWFmdGVyIHRoZSBib290IG5hbWUgKHlvdSBjYW4gbGV0IHRoZSBrZXJuZWwgYm9vdCwgaXQgd2lsbCB0ZWxsIHlvdSB0aGUKLWRlZmF1bHQgYm9vdCBuYW1lIHdoaWxlIGJvb3RpbmcpOgotCi0JY2R1MzFhPTxiYXNlIGFkZHJlc3M+LDxpbnRlcnJ1cHQ+WyxQQVNdCi0KLVRoZSBiYXNlIGFkZHJlc3MgbmVlZHMgdG8gaGF2ZSAiMHgiIGluIGZyb250IG9mIGl0LCBzaW5jZSBpdCBpcyBpbgotaGV4LiAgRm9yIGluc3RhbmNlLCB0byBjb25maWd1cmUgYSBkcml2ZSBhdCBhZGRyZXNzIDMyMCBvbiBpbnRlcnJ1cHQgNSwKLXVzZSB0aGUgZm9sbG93aW5nOgotCi0JY2R1MzFhPTB4MzIwLDUKLQotSSB1c2UgdGhlIGZvbGxvd2luZyBib290IGxpbmU6Ci0KLQljZHUzMWE9MHgxZjg4LDAsUEFTCi0KLWJlY2F1c2UgSSBoYXZlIGEgUEFTLTE2IHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJydXB0IGZvciB0aGUKLUNEVTMxQSBpbnRlcmZhY2UuCi0KLUFkZGluZyB0aGlzIGFzIGFuIGFwcGVuZCBsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIC9ldGMvbGlsby5jb25mCi1maWxlIHdpbGwgc2V0IGl0IGZvciBsaWxvIGNvbmZpZ3VyYXRpb25zLiAgSSBoYXZlIHRoZSBmb2xsb3dpbmcgYXMgdGhlCi1maXJzdCBsaW5lIGluIG15IGxpbG8uY29uZiBmaWxlOgotCi0JYXBwZW5kPSJjZHUzMWE9MHgxZjg4LDAiCi0KLUknbSBub3Qgc3VyZSBob3cgdG8gc2V0IHVwIEJvb3RsaW4gKEkgaGF2ZSBuZXZlciB1c2VkIGl0KSwgaWYgc29tZW9uZQotd291bGQgbGlrZSB0byBmaWxsIGluIHRoaXMgc2VjdGlvbiBwbGVhc2UgZG8uCi0KLQotQ29uZmlndXJpbmcgYXMgYSBNb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgc3VwcG9ydHMgbG9hZGluZyBhcyBhIG1vZHVsZS4gIEhvd2V2ZXIsIHlvdSBtdXN0IHNwZWNpZnkKLXRoZSBib290IGFkZHJlc3MgYW5kIGludGVycnVwdCBvbiB0aGUgYm9vdCBsaW5lIHRvIGluc21vZC4gIFlvdSBjYW4ndAotdXNlIG1vZHByb2JlIHRvIGxvYWQgaXQsIHNpbmNlIG1vZHByb2JlIGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nCi12YXJpYWJsZXMuCi0KLUFueXdheSwgSSB1c2UgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGxvYWQgbXkgZHJpdmVyIGFzIGEgbW9kdWxlCi0KLSAgL3NiaW4vaW5zbW9kIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL21pc2MvY2R1MzFhLm8gY2R1MzFhX3BvcnQ9MHgxZjg4Ci0KLVlvdSBjYW4gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGluIHRoZSBkcml2ZXI6Ci0KLSAgY2R1MzFhX3BvcnQ9PEkvTyBhZGRyZXNzPiAtIHNldHMgdGhlIGJhc2UgSS9PLiAgSWYgaGV4LCBwdXQgMHggaW4KLQkJCSAgICAgIGZyb250IG9mIGl0LiAgVGhpcyBtdXN0IGJlIHNwZWNpZmllZC4KLQotICBjZHUzMWFfaXJxPTxpbnRlcnJ1cHQ+IC0gU2V0cyB0aGUgaW50ZXJydXB0IG51bWJlci4gIExlYXZpbmcgdGhpcwotCQkJICAgb2ZmIHdpbGwgdHVybiBpbnRlcnJ1cHRzIG9mZi4KLQotCi1Ecml2ZXIgU3BlY2lhbCBGZWF0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmZWF0dXJlcyBiZXlvbmQgdGhlIG5vcm1hbCBhdWRpbyBhbmQgQ0QtUk9NCi1mdW5jdGlvbnMgb2YgdGhlIGRyaXZlLgotCi0yMDQ4IGJ5dGUgYnVmZmVyIG1vZGUKLQotSWYgYSBkaXNrIGlzIG1vdW50ZWQgd2l0aCAtbyBibG9jaz0yMDQ4LCBkYXRhIGlzIGNvcGllZCBzdHJhaWdodCBmcm9tCi10aGUgZHJpdmUgZGF0YSBwb3J0IHRvIHRoZSBidWZmZXIuICBPdGhlcndpc2UsIHRoZSByZWFkYWhlYWQgYnVmZmVyCi1tdXN0IGJlIGludm9sdmVkIHRvIGhvbGQgdGhlIG90aGVyIDFLIG9mIGRhdGEgd2hlbiBhIDFLIGJsb2NrCi1vcGVyYXRpb24gaXMgZG9uZS4gIE5vdGUgdGhhdCB3aXRoIDIwNDggYnl0ZSBibG9ja3MgeW91IGNhbm5vdCBleGVjdXRlCi1maWxlcyBmcm9tIHRoZSBDRC4KLQotWEEgY29tcGF0aWJpbGl0eQotCi1UaGUgZHJpdmVyIHNob3VsZCBzdXBwb3J0IFhBIGRpc2tzIGZvciBib3RoIHRoZSBDRFUzMUEgYW5kIENEVTMzQS4gIEl0Ci1kb2VzIHRoaXMgdHJhbnNwYXJlbnRseSwgdGhlIHVzaW5nIHByb2dyYW0gZG9lc24ndCBuZWVkIHRvIHNldCBpdC4KLQotTXVsdGktU2Vzc2lvbgotCi1BIG11bHRpLXNlc3Npb24gZGlzayBsb29rcyBqdXN0IGxpa2UgYSBub3JtYWwgZGlzayB0byB0aGUgdXNlci4gIEp1c3QKLW1vdW50IG9uZSBub3JtYWxseSwgYW5kIGFsbCB0aGUgZGF0YSBzaG91bGQgYmUgdGhlcmUuICBBIHNwZWNpYWwKLXRoYW5rcyB0byBLb2VuIGZvciBoZWxwIHdpdGggdGhpcyEKLQotUmF3IHNlY3RvciBJL08KLQotVXNpbmcgdGhlIENEUk9NUkVBREFVRElPIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgcmF3IGF1ZGlvIGFuZCBkYXRhCi10cmFja3MuICBCb3RoIG9wZXJhdGlvbnMgcmV0dXJuIDIzNTIgYnl0ZXMgcGVyIHNlY3Rvci4gIE9uIHRoZSBkYXRhCi10cmFja3MsIHRoZSBmaXJzdCAxMiBieXRlcyBpcyBub3QgcmV0dXJuZWQgYnkgdGhlIGRyaXZlIGFuZCB0aGUgdmFsdWUKLW9mIHRoYXQgZGF0YSBpcyBpbmRldGVybWluYXRlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jbTIwNiBiL0RvY3VtZW50YXRpb24vY2Ryb20vY20yMDYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMDM2OGYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jbTIwNgorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi1UaGlzIGlzIHRoZSByZWFkbWUgZmlsZSBmb3IgdGhlIGRyaXZlciBmb3IgdGhlIFBoaWxpcHMvTE1TIGNkcm9tIGRyaXZlCi1jbTIwNiBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBjbTI2MCBob3N0IGFkYXB0ZXIgY2FyZC4gCi0KLQkJCQkoYykgMTk5NSBEYXZpZCBBLiB2YW4gTGVldXdlbgotICAgCi1DaGFuZ2VzIHNpbmNlIHZlcnNpb24gMC45OQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gSW50ZXJmYWNpbmcgdG8gdGhlIGtlcm5lbCBpcyByb3V0ZWQgdGhvdWdoIGFuIGV4dHJhIGludGVyZmFjZSBsYXllciwgCi0gIGNkcm9tLmMuIFRoaXMgYWxsb3dzIHJ1bnRpbWUtY29uZmlndXJhYmxlIGBiZWhhdmlvcicgb2YgdGhlIGNkcm9tLWRyaXZlLCAKLSAgaW5kZXBlbmRlbnQgb2YgdGhlIGRyaXZlci4gCi0KLUZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMC4zMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEZ1bGwgYXVkaW8gc3VwcG9ydCwgdGhhdCBpcywgYm90aCAgd29ya21hbiwgd29ya2JvbmUgYW5kIGNkcCB3b3JrCi0gIG5vdyByZWFzb25hYmx5LiBSZWFkaW5nIFRPQyBzdGlsbCB0YWtlcyBzb21lIHRpbWUuIHhtY2QgaGFzIGJlZW4KLSAgcmVwb3J0ZWQgdG8gcnVuIHN1Y2Nlc3NmdWxseS4gCi0tIE1hZGUgYXV0by1wcm9iZSBjb2RlIGEgbGl0dGxlIGJldHRlciwgSSBob3BlCi0KLUZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMC4yOAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEZ1bGwgc3BlZWQgdHJhbnNmZXIgcmF0ZSAoMzAwIGtCL3MpLgotLSBNaW5pbXVtIGtlcm5lbCBtZW1vcnkgdXNhZ2UgZm9yIGJ1ZmZlcmluZyAobGVzcyB0aGFuIDMga0IpLgotLSBNdWx0aXNlc3Npb24gc3VwcG9ydC4KLS0gVHJheSBsb2NraW5nLgotLSBTdGF0aXN0aWNzIG9mIGRyaXZlciBhY2Nlc3NpYmxlIHRvIHRoZSB1c2VyLgotLSBNb2R1bGUgc3VwcG9ydC4KLS0gQXV0by1wcm9iaW5nIG9mIGFkYXB0ZXIgY2FyZCdzIGJhc2UgcG9ydCBhbmQgaXJxIGxpbmUsCi0gIGFsc28gY29uZmlndXJhYmxlIGF0IGJvb3QgdGltZSBvciBtb2R1bGUgbG9hZCB0aW1lLgotCi0KLURlY2lkZSBob3cgeW91IGFyZSBnb2luZyB0byB1c2UgdGhlIGRyaXZlci4gVGhlcmUgYXJlIHR3bwotb3B0aW9uczoKLQotICAgKGEpIGluc3RhbGxpbmcgdGhlIGRyaXZlciBhcyBhIHJlc2lkZW50IHBhcnQgb2YgdGhlIGtlcm5lbAotICAgKGIpIGNvbXBpbGluZyB0aGUgZHJpdmVyIGFzIGEgbG9hZGFibGUgbW9kdWxlCi0KLSAgIEZ1cnRoZXIsIHlvdSBtdXN0IGRlY2lkZSBpZiB5b3UgYXJlIGdvaW5nIHRvIHNwZWNpZnkgdGhlIGJhc2UgcG9ydAotICAgYWRkcmVzcyBhbmQgdGhlIGludGVycnVwdCByZXF1ZXN0IGxpbmUgb2YgdGhlIGFkYXB0ZXIgY2FyZCBjbTI2MCBhcwotICAgYm9vdCBvcHRpb25zIGZvciAoYSksIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciAoYiksIHVzZSBhdXRvbWF0aWMKLSAgIHByb2Jpbmcgb2YgdGhlc2UgdmFsdWVzLCBvciBoYXJkLXdpcmUgeW91ciBhZGFwdG9yIGNhcmQncyBzZXR0aW5ncwotICAgaW50byB0aGUgc291cmNlIGNvZGUuIElmIHlvdSBkb24ndCBjYXJlLCB5b3UgY2FuIGNob29zZSAKLSAgIGF1dG9wcm9iaW5nLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4gSW4gdGhhdCBjYXNlIHlvdSBjYW4gbW92ZSBvbiB0bwotICAgdGhlIG5leHQgc3RlcC4KLQotQ29tcGlsaW5nIHRoZSBrZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0xKSBtb3ZlIHRvIC91c3Ivc3JjL2xpbnV4IGFuZCBkbyBhIAotCi0JbWFrZSBjb25maWcKLQotICAgSWYgeW91IGhhdmUgY2hvc2VuIG9wdGlvbiAoYSksIGFuc3dlciB5ZXMgdG8gQ09ORklHX0NNMjA2IGFuZAotICAgQ09ORklHX0lTTzk2NjBfRlMuCi0KLSAgIElmIHlvdSBoYXZlIGNob3NlbiBvcHRpb24gKGIpLCBhbnN3ZXIgeWVzIHRvIENPTkZJR19NT0RWRVJTSU9OUwotICAgYW5kIG5vICghKSB0byBDT05GSUdfQ00yMDYgYW5kIENPTkZJR19JU085NjYwX0ZTLiAKLQotMikgdGhlbiBkbyBhIAotCQotCW1ha2UgY2xlYW47IG1ha2UgekltYWdlOyBtYWtlIG1vZHVsZXMKLQotMykgZG8gdGhlIHVzdWFsIHRoaW5ncyB0byBpbnN0YWxsIGEgbmV3IGltYWdlIChiYWNrdXAgdGhlIG9sZCBvbmUsIHJ1bgotICAgYHJkZXYgLVIgekltYWdlIDEnLCBjb3B5IHRoZSBuZXcgaW1hZ2UgaW4gcGxhY2UsIHJ1biBsaWxvKS4gIE1pZ2h0Ci0gICBiZSBgbWFrZSB6bGlsbycuCi0KLVVzaW5nIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIHlvdSB3aWxsIG9ubHkgb2NjYXNpb25hbGx5IHVzZSB0aGUgY2Qtcm9tIGRyaXZlciwgeW91IGNhbiBjaG9vc2UKLW9wdGlvbiAoYiksIGluc3RhbGwgYXMgYSBsb2FkYWJsZSBtb2R1bGUuIFlvdSBtYXkgaGF2ZSB0byByZS1jb21waWxlCi10aGUgbW9kdWxlIHdoZW4geW91IHVwZ3JhZGUgdGhlIGtlcm5lbCB0byBhIG5ldyB2ZXJzaW9uLiAKLQotU2luY2UgdmVyc2lvbiAwLjk2LCBtdWNoIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvCi1hIGdlbmVyaWMgY2Ryb20gaW50ZXJmYWNlIGluIHRoZSBmaWxlIGNkcm9tLmMuIFRoZSBtb2R1bGUgY20yMDYubwotZGVwZW5kcyBvbiBjZHJvbS5vLiBJZiB0aGUgbGF0dGVyIGlzIG5vdCBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsCi15b3UgbXVzdCBleHBsaWNpdGx5IGxvYWQgaXQgYmVmb3JlIGNtMjA2Lm86Ci0KLQkgaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvY2Ryb20ubwotCi1UbyBpbnN0YWxsIHRoZSBtb2R1bGUsIHlvdSB1c2UgdGhlIGNvbW1hbmQsIGFzIHJvb3QKLQotCWluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2NtMjA2Lm8KLQotWW91IGNhbiBzcGVjaWZ5IHRoZSBiYXNlIGFkZHJlc3Mgb24gdGhlIGNvbW1hbmQgbGluZSBhcyB3ZWxsIGFzIHRoZSBpcnEgCi1saW5lIHRvIGJlIHVzZWQsIGUuZy4KLQotCWluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2NtMjA2Lm8gY20yMDY9MHgzMDAsMTEKLQotVGhlIG9yZGVyIG9mIGJhc2UgcG9ydCBhbmQgaXJxIGxpbmUgZG9lc24ndCBtYXR0ZXI7IGlmIHlvdSBzcGVjaWZ5IG9ubHkKLW9uZSwgdGhlIG90aGVyIHdpbGwgaGF2ZSB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGVkLWluIGRlZmF1bHQuICBZb3UKLW1heSBhbHNvIGhhdmUgdG8gaW5zdGFsbCB0aGUgZmlsZS1zeXN0ZW0gbW9kdWxlIGBpc285NjYwLm8nLCBpZiB5b3UKLWRpZG4ndCBjb21waWxlIHRoYXQgaW50byB0aGUga2VybmVsLiAKLQotCi1Vc2luZyB0aGUgZHJpdmVyIGFzIHBhcnQgb2YgdGhlIGtlcm5lbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIHlvdSBoYXZlIGNob3NlbiBvcHRpb24gKGEpLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGJhc2UtcG9ydAotYWRkcmVzcyBhbmQgaXJxIG9uIHRoZSBsaWxvIGJvb3QgY29tbWFuZCBsaW5lLCBlLmcuOgotCi0JTElMTzogbGludXggY20yMDY9MHgzNDAsMTEKLQotVGhpcyBhc3N1bWVzIHRoYXQgeW91ciBsaW51eCBrZXJuZWwgaW1hZ2Uga2V5d29yZCBpcyBgbGludXgnLiAKLUlmIHlvdSBzcGVjaWZ5IGVpdGhlciBJUlEgKDMtLTExKSBvciBiYXNlIHBvcnQgKDB4MzAwLS0weDM3MCksCi1hdXRvIHByb2JpbmcgaXMgdHVybmVkIG9mZiBmb3IgYm90aCBzZXR0aW5ncywgdGh1cyBzZXR0aW5nIHRoZSAKLW90aGVyIHZhbHVlIHRvIHRoZSBjb21waWxlZC1pbiBkZWZhdWx0LgotCi1Ob3RlIHRoYXQgeW91IGNhbiBhbHNvIHB1dCB0aGVzZSBwYXJhbWV0ZXJzIGluIHRoZSBsaWxvIGNvbmZpZ3VyYXRpb24gZmlsZToKLQotIyBsaW51eCBjb25maWcKLWltYWdlID0gL3ZtbGludXoKLSAgIHJvb3QgPSAvZGV2L2hkYTEKLSAgIGxhYmVsID0gTGludXgKLSAgIGFwcGVuZCA9ICJjbTIwNj0weDM0MCwxMSIKLSAgIHJlYWQtb25seQotCi0KLUlmIG1vZHVsZSBwYXJhbWV0ZXJzIGFuZCBMSUxPIGNvbmZpZyBvcHRpb25zIGRvbid0IHdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIGF1dG9wcm9iaW5nIGRvZXMgbm90IHdvcmssIHlvdSBjYW4gaGFyZC13aXJlIHRoZSBkZWZhdWx0IHZhbHVlcwotb2YgdGhlIGJhc2UgcG9ydCBhZGRyZXNzIChDTTIwNl9CQVNFKSBhbmQgaW50ZXJydXB0IHJlcXVlc3QgbGluZQotKENNMjA2X0lSUSkgaW50byB0aGUgZmlsZSAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL2NtMjA2LmguIENoYW5nZQotdGhlIGRlZmluZXMgb2YgQ00yMDZfSVJRIGFuZCBDTTIwNl9CQVNFLgotCi0KLU1vdW50aW5nIHRoZSBjZHJvbQotLS0tLS0tLS0tLS0tLS0tLS0tCi0xKSBNYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgZGV2aWNlIGlzIGluc3RhbGxlZCBpbiAvZGV2LgotCi0gIAlta25vZCAvZGV2L2NtMjA2Y2QgYiAzMiAwCi0KLTIpIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIG1vdW50IHBvaW50LCBlLmcuLCAvY2Ryb20gCi0KLQlta2RpciAvY2Ryb20KLQotMykgbW91bnQgdXNpbmcgYSBjb21tYW5kIGxpa2UgdGhpcyAocnVuIGFzIHJvb3QpOgotCi0JbW91bnQgLXJ0IGlzbzk2NjAgL2Rldi9jbTIwNmNkIC9jZHJvbQotCi00KSBGb3IgdXNlci1tb3VudHMsIGFkZCBhIGxpbmUgaW4gL2V0Yy9mc3RhYgotCi0JL2Rldi9jbTIwNmNkICAgICAgL2Nkcm9tICAgICBpc285NjYwIAlybyxub2F1dG8sdXNlcgotCi0gICBUaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gZ2l2ZSB0aGUgY29tbWFuZHMKLQotCW1vdW50IC9jZHJvbQotCXVtb3VudCAvY2Ryb20KLQotSWYgdGhpbmdzIGRvbid0IHdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gVHJ5IHRvIGRvIGEgYGRtZXNnJyB0byBmaW5kIG91dCBpZiB0aGUgZHJpdmVyIHNhaWQgYW55dGhpbmcgYWJvdXQKLSAgd2hhdCBpcyBnb2luZyB3cm9uZyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLgotCi0tIFRyeSB0byBkbyBhIGBkZCBpZj0vZGV2L2NtMjA2Y2QgfCBvZCAtdGMgfCBsZXNzJyB0byByZWFkIGZyb20gdGhlCi0gIENELgotCi0tIExvb2sgaW4gdGhlIC9wcm9jIGRpcmVjdG9yeSB0byBzZWUgaWYgYGNtMjA2JyBzaG93cyB1cCB1bmRlciBvbmUgb2YKLSAgYGludGVycnVwdHMnLCBgaW9wb3J0cycsIGBkZXZpY2VzJyBvciBgbW9kdWxlcycgKGlmIGFwcGxpY2FibGUpLgotCi0KLURJU0NMQUlNRVIgCi0tLS0tLS0tLS0tIAotSSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgdGhpcyBkcml2ZXIgd29ya3MsIG9yIHRoYXQgdGhlIGhhcmR3YXJlIHdpbGwKLW5vdCBiZSBoYXJtZWQsIGFsdGhvdWdoIEkgY29uc2lkZXIgaXQgbW9zdCB1bmxpa2VseS4gCi0KLUkgaG9wZSB0aGF0IHlvdSdsbCBmaW5kIHRoaXMgZHJpdmVyIGluIHNvbWUgd2F5IHVzZWZ1bC4gCi0KLQkJCQkJRGF2aWQgdmFuIExlZXV3ZW4KLQkJCQkJZGF2aWRAdG0udG5vLm5sCi0KLU5vdGUgZm9yIExpbnV4IENEUk9NIHZlbmRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Zb3UgYXJlIGVuY291cmFnZWQgdG8gaW5jbHVkZSB0aGlzIGRyaXZlciBvbiB5b3VyIExpbnV4IENEUk9NLiBJZgoteW91IGRvLCB5b3UgbWlnaHQgY29uc2lkZXIgc2VuZGluZyBtZSBhIGZyZWUgY29weSBvZiB0aGF0IGNkLXJvbS4KLVlvdSBjYW4gY29udGFjdCBtZSB0aHJvdWdoIG15IGUtbWFpbCBhZGRyZXNzLCBkYXZpZEB0bS50bm8ubmwuIAotSWYgdGhpcyBkcml2ZXIgaXMgY29tcGlsZWQgaW50byBhIGtlcm5lbCB0byBib290IG9mZiBhIGNkcm9tLCAKLXlvdSBzaG91bGQgYWN0dWFsbHkgc2VuZCBtZSBhIGZyZWUgY29weSBvZiB0aGF0IGNkLXJvbS4gCi0KLUNvcHlyaWdodAotLS0tLS0tLS0tCi1UaGUgY29weXJpZ2h0IG9mIHRoZSBjbTIwNiBkcml2ZXIgZm9yIExpbnV4IGlzIAotCi0gICAgKGMpIDE5OTUgRGF2aWQgQS4gdmFuIExlZXV3ZW4KLQotVGhlIGRyaXZlciBpcyByZWxlYXNlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiB0aGUgR05VIGdlbmVyYWwgcHVibGljCi1saWNlbnNlLCB3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgcm9vdCBvZiB0aGlzCi1zb3VyY2UgdHJlZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vZ3NjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vZ3NjZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxY2EzNi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2dzY2QKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0JR29sZHN0YXIgUjQyMCBDRC1Sb20gZGV2aWNlIGRyaXZlciBSRUFETUUKLQotRm9yIGFsbCBraW5kIG9mIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHb2xkU3RhciBSNDIwIENEUk9NCi1hbmQgdGhpcyBMaW51eCBkZXZpY2UgZHJpdmVyIHNlZSB0aGUgV1dXIHBhZ2U6Ci0KLSAgICAgICAgaHR0cDovL2xpbnV4LnJ6LmZoLWhhbm5vdmVyLmRlL35yYXVwYWNoICAgICAgICAKLQotCi0gICAgICBJZiB5b3UgYXJlIHRoZSBlZGl0b3Igb2YgYSBMaW51eCBDRCwgeW91IHNob3VsZAotICAgICAgZW5hYmxlIGdzY2QuYyB3aXRoaW4geW91ciBib290IGZsb3BweSBrZXJuZWwuIFBsZWFzZSwKLSAgICAgIHNlbmQgbWUgb25lIG9mIHlvdXIgQ0RzIGZvciBmcmVlLgotCi0KLVRoaXMgY3VycmVudCBkcml2ZXIgdmVyc2lvbiAwLjRhIG9ubHkgc3VwcG9ydHMgcmVhZGluZyBkYXRhIGZyb20gdGhlIGRpc2suCi1DdXJyZW50bHkgd2UgaGF2ZSBubyBhdWRpbyBhbmQgbm8gbXVsdGlzZXNzaW9uIG9yIFhBIHN1cHBvcnQuCi1UaGUgcG9sbGluZyBpbnRlcmZhY2UgaXMgdXNlZCwgbm8gRE1BLgotCi0KLVNvbWV0aW1lcyB0aGUgR29sZFN0YXIgUjQyMCBpcyBzb2xkIGluIGEgJ1JldmVhbCBNdWx0aW1lZGlhIEtpdCcuIFRoaXMga2l0J3MKLWRyaXZlIGludGVyZmFjZSBpcyBjb21wYXRpYmxlLCB0b28uCi0KLQotSW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlIHRvICcvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tJyBhbmQgZWRpdCB0aGUgZmlsZSAnZ3NjZC5oJy4gSW5zZXJ0Ci10aGUgaS9vIGFkZHJlc3Mgb2YgeW91ciBpbnRlcmZhY2UgY2FyZC4KLQotVGhlIGRlZmF1bHQgYmFzZSBhZGRyZXNzIGlzIDB4MzQwLiBUaGlzIHdpbGwgd29yayBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuIAotQWRkcmVzcyBzZWxlY3Rpb24gaXMgYWNjb21wbGlzaGVkIGJ5IGp1bXBlcnMgUE44MDEtMSB0byBQTjgwMS00IG9uIHRoZSAKLUdvbGRTdGFyIEludGVyZmFjZSBDYXJkLgotQXBwcm9wcmlhdGUgc2V0dGluZ3MgYXJlOiAweDMwMCwgMHgzMTAsIDB4MzIwLCAweDMzMCwgMHgzNDAsIDB4MzUwLCAweDM2MAotMHgzNzAsIDB4MzgwLCAweDM5MCwgMHgzQTAsIDB4M0IwLCAweDNDMCwgMHgzRDAsIDB4M0UwLCAweDNGMCAgICAgICAgICAgICAKLQotVGhlbiBnbyBiYWNrIHRvICcvdXNyL3NyYy9saW51eC8nIGFuZCAnbWFrZSBjb25maWcnIHRvIGJ1aWxkIHRoZSBuZXcKLWNvbmZpZ3VyYXRpb24gZm9yIHlvdXIga2VybmVsLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIEdvbGRTdGFyIGRyaXZlcgotbGlrZSBhIG1vZHVsZSwgZG9uJ3Qgc2VsZWN0ICdHb2xkU3RhciBDRFJPTSBzdXBwb3J0Jy4gQnkgdGhlIHdheSwgeW91Ci1oYXZlIHRvIGluY2x1ZGUgdGhlIGlzbzk2NjAgZmlsZXN5c3RlbS4KLQotTm93IHN0YXJ0IGNvbXBpbGluZyB0aGUga2VybmVsIHdpdGggJ21ha2UgekltYWdlJy4KLUlmIHlvdSB3YW50IHRvIHVzZSB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCB5b3UgaGF2ZSB0byBkbyAnbWFrZSBtb2R1bGVzJyAKLWFuZCAnbWFrZSBtb2R1bGVzX2luc3RhbGwnLCBhZGRpdGlvbmFsbHkuCi1JbnN0YWxsIHlvdXIgbmV3IGtlcm5lbCBhcyB1c3VhbCAtIG1heWJlIHlvdSBkbyBpdCB3aXRoICdtYWtlIHpsaWxvJy4KLQotQmVmb3JlIHlvdSBjYW4gdXNlIHRoZSBkcml2ZXIsIHlvdSBoYXZlIHRvCi0gICBta25vZCAvZGV2L2dzY2QwIGIgMTYgMAotdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgZmlsZSAoeW91IG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UpLgotCi1JZiB5b3UgdXNlIG1vZHVsZXMsIHlvdSBjYW4gdHJ5IHRvIGluc2VydCB0aGUgZHJpdmVyLgotU2F5OiAnaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvZ3NjZC5vJwotb3I6ICAnaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvZ3NjZC5vIGdzY2Q9PGFkZHJlc3M+JwotVGhlIGRyaXZlciBzaG91bGQgcmVwb3J0IGl0cyByZXN1bHRzLgotCi1UaGF0J3MgaXQhIE1vdW50IGEgZGlzaywgaS5lLiAnbW91bnQgLXJ0IGlzbzk2NjAgL2Rldi9nc2NkMCAvY2Ryb20nCi0KLUZlZWwgZnJlZSB0byByZXBvcnQgZXJyb3JzIGFuZCBzdWdnZXN0aW9ucyB0byB0aGUgZm9sbG93aW5nIGFkZHJlc3MuCi1CZSBzdXJlLCBJJ20gdmVyeSBoYXBweSB0byByZWNlaXZlIHlvdXIgY29tbWVudHMhCi0gCi0gICAgICAgIE9saXZlciBSYXVwYWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5ub3ZlciwgSnVuaSAxOTk1Ci0ocmF1cGFjaEBud2ZzMS5yei5maC1oYW5ub3Zlci5kZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2lzcDE2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzg2NTMzLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIC0tIERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYKLQotRG9jcyBieSBFcmljIHZhbiBkZXIgTWFhcmVsIDxILlQuTS52LmQuTWFhcmVsQG1hcmluLm5sPgotCi1UaGlzIGlzIHRoZSBSRUFETUUgZm9yIHZlcnNpb24gMC42IG9mIHRoZSBjZHJvbSBpbnRlcmZhY2Ugb24gYW4KLUlTUDE2LCBNQUQxNiBvciBNb3phcnQgc291bmQgY2FyZC4KLQotVGhlIGRldGVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB1c2VkIHRvIGJlIGluY2x1ZGVkCi1pbiBib3RoIHRoZSBzamNkIGFuZCBvcHRjZCBjZHJvbSBkcml2ZXIuIERyaXZlcyBzdXBwb3J0ZWQgYnkgdGhlc2UKLWRyaXZlcnMgY2FtZSBwYWNrZWQgd2l0aCBNZWRpYSBNYWdpYydzIG11bHRpIG1lZGlhIGtpdCwgd2hpY2ggYWxzbwotaW5jbHVkZWQgdGhlIElTUDE2IGNhcmQuIFRoZSBpZGVhICh0aGFua3MgTGVvIFNwaWVrbWFuKQotdG8gbW92ZSBpdCBmcm9tIHRoZXNlIGRyaXZlcnMgaW50byBhIHNlcGFyYXRlIG1vZHVsZSBhbmQgbW9yZW92ZXIsIG5vdCB0bwotcmVseSBvbiB0aGUgTUFEMTYgc291bmQgZHJpdmVyLCBhcmUgYXMgZm9sbG93czoKLS1kdXBsaWNhdGlvbiBvZiBjb2RlIGluIHRoZSBrZXJuZWwgaXMgYSB3YXN0ZSBvZiByZXNvdXJjZXMgYW5kIHNob3VsZAotIGJlIGF2b2lkZWQ7Ci0taG93ZXZlciwga2VybmVscyBhbmQgbm90YWJseSB0aG9zZSBpbmNsdWRlZCB3aXRoIExpbnV4IGRpc3RyaWJ1dGlvbnMKLSAoY2YgU2xhY2t3YXJlIDMuMCBpbmNsdWRlZCB2ZXJzaW9uIDAuNSBvZiB0aGUgaXNwMTYgY29uZmlndXJhdGlvbgotIGNvZGUgaW5jbHVkZWQgaW4gdGhlIGRyaXZlcnMpIGRvbid0IGFsd2F5cyBjb21lIHdpdGggc291bmQgc3VwcG9ydAotIGluY2x1ZGVkLiBFc3BlY2lhbGx5IHdoZW4gdGhleSBhbHJlYWR5IGluY2x1ZGUgYSBidW5jaCBvZiBjZHJvbSBkcml2ZXJzLgotIEhlbmNlLCB0aGUgY2Ryb20gaW50ZXJmYWNlIHNob3VsZCBiZSBjb25maWd1cmFibGUgX2luZGVwZW5kZW50bHlfIG9mCi0gc291bmQgc3VwcG9ydC4KLQotVGhlIElTUDE2LCBNQUQxNiBhbmQgTW96YXJ0IHNvdW5kIGNhcmRzIGhhdmUgYW4gT1BUaSA4MkM5Mjggb3IgYW4KLU9QVGkgODJDOTI5IGNoaXAuICBUaGUgaW50ZXJmYWNlIG9uIHRoZXNlIGNhcmRzIHNob3VsZCB3b3JrIHdpdGgKLWFueSBjZHJvbSBhdHRhY2hlZCB0byB0aGUgY2FyZCwgd2hpY2ggaXMgJ2VsZWN0cmljYWxseScgY29tcGF0aWJsZQotd2l0aCBTYW55by9QYW5hc29uaWMsIFNvbnkgb3IgTWl0c3VtaSBub24taWRlIGRyaXZlcy4gSG93ZXZlciwgdGhlCi1jb21tYW5kIHNldHMgZm9yIGFueSBwcm9wcmlldGFyeSBkcml2ZXMgbWF5IGRpZmZlcgotKGFuZCBoZW5jZSBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiB0aGUga2VybmVsKSBmcm9tIHRoZXNlIGZvdXIgdHlwZXMuCi1Gb3IgYSBmYWN0IEkga25vdyB0aGUgaW50ZXJmYWNlIHdvcmtzIGFuZCB0aGUgd2F5IG9mIGNvbmZpZ3VyYXRpb24KLWFzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50YXRpb24gd29ya3MgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKLXNqY2QgKGluIFNhbnlvL1BhbmFzb25pYyBjb21wYXRpYmlsaXR5IG1vZGUpIGNkcm9tIGRyaXZlcnMKLShwcm9iYWJseSB3aXRoIHRoZSBvcHRjZCAoaW4gU29ueSBjb21wYXRpYmlsaXR5IG1vZGUpIGFzIHdlbGwpLgotSWYgeW91IGhhdmUgc3VjaCBhbiBPUFRpIGJhc2VkIHNvdW5kIGNhcmQgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUKLWNkcm9tIGludGVyZmFjZSB3aXRoIGEgY2Ryb20gZHJpdmUgc3VwcG9ydGVkIGJ5IGFueSBvZiB0aGUgb3RoZXIgY2Ryb20KLWRyaXZlcnMsIGl0IHdpbGwgcHJvYmFibHkgd29yay4gUGxlYXNlIGxldCBtZSBrbm93IGFueSBleHBlcmllbmNlIHlvdQotbWlnaHQgaGF2ZSkuCi1JIHVuZGVyc3RhbmQgdGhhdCBjYXJkcyBiYXNlZCBvbiB0aGUgT1BUaSA4MkM5MjkgY2hpcHMgbWF5IGJlIGNvbmZpZ3VyZWQKLShoYXJkd2FyZSBqdW1wZXJzIHRoYXQgaXMpIGFzIGFuIElERSBpbnRlcmZhY2UuIEluaXRpYWxpc2F0aW9uIG9mIHN1Y2ggYQotY2FyZCBpbiB0aGlzIG1vZGUgaXMgbm90IHN1cHBvcnRlZCAoeWV0PykuCi0KLVRoZSBzdWdnZXN0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgSVNQMTYgZXRjLiBzb3VuZCBjYXJkIGJ5IGJvb3RpbmcgRE9TIGFuZCAKLWRvIGEgd2FybSByZWJvb3QgdG8gYm9vdCBMaW51eCBzb21laG93IGRvZXNuJ3Qgd29yaywgYXQgbGVhc3Qgbm90Ci1vbiBteSBtYWNoaW5lIChJUEMgUDkwKSwgd2l0aCB0aGUgT1BUaSA4MkM5MjggYmFzZWQgY2FyZC4KLQotQm9vdGluZyB0aGUga2VybmVsIHRocm91Z2ggdGhlIGJvb3QgbWFuYWdlciBMSUxPIGFsbG93cyB0aGUgdXNlCi1vZiBzb21lIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uIHRoZSAnTElMTyBib290OicgcHJvbXB0LiBBdCBib290IHRpbWUKLXByZXNzIEFsdCBvciBTaGlmdCB3aGlsZSB0aGUgTElMTyBwcm9tcHQgaXMgd3JpdHRlbiBvbiB0aGUgc2NyZWVuIGFuZCBlbnRlcgotYW55IGtlcm5lbCBvcHRpb25zLiBBbHRlcm5hdGl2ZWx5IHRoZXNlIG9wdGlvbnMgbWF5IGJlIHVzZWQgaW4KLXRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIGluIC9ldGMvbGlsby5jb25mLiBBZGRpbmcgJ2FwcGVuZD0iPGNtZF9saW5lX29wdGlvbnM+IicKLXdpbGwgZG8gdGhlIHRyaWNrIGFzIHdlbGwuCi1UaGUgc3ludGF4IG9mICdjbWRfbGluZV9vcHRpb25zJyBpcwotCi0gICAgICAgIGlzcDE2PVs8cG9ydD5bLDxpcnE+Wyw8ZG1hPl1dXVtbLF08ZHJpdmVfdHlwZT5dCi0KLUlmIHRoZXJlIGlzIG5vIElTUDE2IG9yIGNvbXBhdGlibGVzIGRldGVjdGVkLCB0aGVyZSdzIHByb2JhYmx5IG5vIGhhcm0gZG9uZS4KLVRoZXNlIG9wdGlvbnMgaW5kaWNhdGUgdGhlIHZhbHVlcyB0aGF0IHlvdXIgY2Ryb20gZHJpdmUgaGFzIGJlZW4gKG9yIHdpbGwgYmUpCi1jb25maWd1cmVkIHRvIHVzZS4KLVZhbGlkIHZhbHVlcyBmb3IgdGhlIGJhc2UgaS9vIGFkZHJlc3MgYXJlOgotICBwb3J0PTB4MzQwLDB4MzIwLDB4MzMwLDB4MzYwCi1mb3IgdGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciAKLSAgaXJxPTAsMyw1LDcsOSwxMCwxMQotZm9yIHRoZSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBsaW5lCi0gIGRtYT0wLDMsNSw2LDcKLWFuZCBmb3IgdGhlIHR5cGUgb2YgZHJpdmUKLSAgZHJpdmVfdHlwZT1ub2lzcDE2LFNhbnlvLFBhbmFzb25pYyxTb255LE1pdHN1bWkuCi1Ob3RlIHRoYXQgdGhlc2Ugb3B0aW9ucyBhcmUgY2FzZSBzZW5zaXRpdmUuCi1UaGUgdmFsdWVzIDAgZm9yIGlycSBhbmQgZG1hIGluZGljYXRlIHRoYXQgdGhleSBhcmUgbm90IHVzZWQsIGFuZAotdGhlIGRyaXZlIHdpbGwgYmUgdXNlZCBpbiAncG9sbGluZycgbW9kZS4gVGhlIHZhbHVlcyA1IGFuZCA3IGZvciBpcnEKLXNob3VsZCBiZSBhdm9pZGVkIGluIG9yZGVyIHRvIGF2b2lkIGFueSBjb25mbGljdHMgd2l0aCBvcHRpb25hbAotc291bmQgY2FyZCBjb25maWd1cmF0aW9uLgotVGhlIHN5bnRheCBvZiB0aGUgY29tbWFuZCBsaW5lIGRvZXMgbm90IGFsbG93IHRoZSBzcGVjaWZpY2F0aW9uIG9mCi1pcnEgd2hlbiB0aGVyZSdzIG5vdGhpbmcgc3BlY2lmaWVkIGZvciB0aGUgYmFzZSBhZGRyZXNzIGFuZCBubwotc3BlY2lmaWNhdGlvbiBvZiBkbWEgd2hlbiB0aGVyZSBpcyBubyBzcGVjaWZpY2F0aW9uIG9mIGlycS4KLVRoZSB2YWx1ZSAnbm9pc3AxNicgZm9yIGRyaXZlX3R5cGUsIHdoaWNoIG1heSBiZSB1c2VkIGFzIHRoZSBmaXJzdAotbm9uLWludGVnZXIgb3B0aW9uIHZhbHVlIChlLmcuICdpc3AxNj1ub2lzcDE2JyksIG1ha2VzIHN1cmUgdGhhdCBwcm9iaW5nCi1mb3IgYW5kIHN1YnNlcXVlbnQgY29uZmlndXJhdGlvbiBvZiBhbiBJU1AxNi1jb21wYXRpYmxlIGNhcmQgaXMgc2tpcHBlZAotYWxsIHRvZ2V0aGVyLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gb3ZlcmNvbWUgcG9zc2libGUgY29uZmxpY3RzIHdoaWNoCi1tYXkgYXJpc2Ugd2hpbGUgdGhlIGtlcm5lbCBpcyBwcm9iaW5nIHlvdXIgaGFyZHdhcmUuCi1UaGUgZGVmYXVsdCB2YWx1ZXMgYXJlCi0gIHBvcnQ9MHgzNDAKLSAgaXJxPTAKLSAgZG1hPTAKLSAgZHJpdmVfdHlwZT1TYW55bwotcmVmbGVjdGluZyBteSBvd24gY29uZmlndXJhdGlvbi4gVGhlIGRlZmF1bHRzIGNhbiBiZSBjaGFuZ2VkIGluCi10aGUgZmlsZSBsaW51eC9kcml2ZXJzL2Nkcm9tL2lwczE2LmguCi0KLVRoZSBjZHJvbSBpbnRlcmZhY2UgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgcnVuIHRpbWUgYnkgbG9hZGluZyB0aGUKLWluaXRpYWxpc2F0aW9uIGRyaXZlciBhcyBhIG1vZHVsZS4gSW4gdGhhdCBjYXNlLCB0aGUgaW50ZXJmYWNlCi1wYXJhbWV0ZXJzIGNhbiBiZSBzZXQgYnkgZ2l2aW5nIGFwcHJvcHJpYXRlIHZhbHVlcyBvbiB0aGUgY29tbWFuZAotbGluZS4gQ29uZmlndXJpbmcgdGhlIGRyaXZlciBjYW4gdGhlbiBiZSBkb25lIGJ5IHRoZSBmb2xsb3dpbmcKLWNvbW1hbmQgKGFzc3VtaW5nIHlvdSBoYXZlIGlzbzE2Lm8gaW5zdGFsbGVkIGluIGEgcHJvcGVyIHBsYWNlKToKLQotICBpbnNtb2QgaXNwMTYubyBpc3AxNl9jZHJvbV9iYXNlPTxwb3J0PiBpc3AxNl9jZHJvbV9pcnE9PGlycT4gXAotICAgIGlzcDE2X2Nkcm9tX2RtYT08ZG1hPiBpc3AxNl9jZHJvbV90eXBlPTxkcml2ZV90eXBlPgotCi13aGVyZSBwb3J0LCBpcnEsIGRtYSBhbmQgZHJpdmVfdHlwZSBjYW4gaGF2ZSBhbnkgb2YgdGhlIHZhbHVlcyBtZW50aW9uZWQKLWFib3ZlLgotCi0KLUhhdmUgZnVuIQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9tY2R4IGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9tY2R4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFjNGI3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vbWNkeAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUlmIHlvdSBhcmUgdXNpbmcgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSwgeW91IGNhbiBzcGVjaWZ5IHlvdXIgcG9ydHMgYW5kIElSUXMKLWxpa2UKLQotICMgaW5zbW9kIG1jZHgubyBtY2R4PTB4MzAwLDExLDB4MzA0LDUKLQotYW5kIHNvIG9uICgiYWRkcmVzcyxJUlEiIHBhaXJzKS4KLVRoaXMgd2lsbCBvdmVycmlkZSB0aGUgY29uZmlndXJhdGlvbiBpbiBtY2R4LmguCi0KLVRoaXMgZHJpdmVyOgotCi0gICAgbyAgIGhhbmRsZXMgWEEgYW5kIChob3BlZnVsbHkpIG11bHRpIHNlc3Npb24gQ0RzIGFzIHdlbGwgYXMKLSAgICAgICAgb3JkaW5hcnkgQ0RzOwotICAgIG8gICBzdXBwb3J0cyB1cCB0byA1IGRyaXZlcyAob2YgY291cnNlLCB5b3UnbGwgbmVlZCBmcmVlIAotICAgICAgICBJUlFzLCBpL28gcG9ydHMgYW5kIHNsb3RzKTsKLSAgICBvICAgcGxheXMgYXVkaW8KLQotVGhpcyB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCB5ZXQ6Ci0KLSAgICBvICAgc2hhcmVkIElSUXMgKGJ1dCBpdCBzZWVtcyB0byBiZSBwb3NzaWJsZSAtIEkndmUgc3VjY2Vzc2Z1bGx5Ci0gICAgICAgICAgICAgICAgY29ubmVjdGVkIHR3byBkcml2ZXMgdG8gdGhlIHNhbWUgaXJxLiAgU28gaXQncyBgb25seScgYSAKLSAgICAgICAgICAgICAgICBwcm9ibGVtIG9mIHRoZSBkcml2ZXIuKQotCi1UaGlzIGRyaXZlciBuZXZlciB3aWxsOgotCi0gICAgbyAgIFJlYWQgZGlnaXRhbCBhdWRpbyAoaS5lLiBjb3B5IGRpcmVjdGx5KSwgZHVlIHRvIG1pc3NpbmcKLSAgICAgICAgaGFyZHdhcmUgZmVhdHVyZXMuIAotCi0KLWhlaWtvQGxvdHRlLnNheC5kZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9vcHRjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vb3B0Y2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDZjN2EuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9vcHRjZAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLVRoaXMgaXMgdGhlIFJFQURNRSBmaWxlIGZvciB0aGUgT3B0aWNzIFN0b3JhZ2UgODAwMCBBVCBDRFJPTSBkZXZpY2UgZHJpdmVyLgotCi1UaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBzby1jYWxsZWQgJ0RPTFBISU4nIGRyaXZlLCB3aXRoIHRoZSAzNC1waW4KLVNvbnktY29tcGF0aWJsZSBpbnRlcmZhY2UuIEZvciB0aGUgSURFLWNvbXBhdGlibGUgT3B0aWNzIFN0b3JhZ2UgODAwMQotZHJpdmUsIHlvdSB3aWxsIHdhbnQgdGhlIEFUQVBJIENEUk9NIGRyaXZlci4gVGhlIGRyaXZlciBhbHNvIHNlZW1zIHRvCi13b3JrIHdpdGggdGhlIExhc2VybWF0ZSBDUjMyOEEuIElmIHlvdSBoYXZlIGEgZHJpdmUgdGhhdCB3b3JrcyB3aXRoCi10aGlzIGRyaXZlciwgYW5kIHRoYXQgZG9lc24ndCByZXBvcnQgaXRzZWxmIGFzIERPTFBISU4sIHBsZWFzZSBkcm9wIG1lCi1hIG1haWwuCi0KLVRoZSBzdXBwb3J0IGZvciBtdWx0aXNlc3Npb24gQ0RzIGlzIGluIEFMUEhBIHN0YWdlLiBJZiB5b3UgdXNlIGl0LAotcGxlYXNlIG1haWwgbWUgeW91ciBleHBlcmllbmNlcy4gTXVsdGlzZXNzaW9uIHN1cHBvcnQgY2FuIGJlIGRpc2FibGVkCi1hdCBjb21waWxlIHRpbWUuCi0KLVlvdSBjYW4gZmluZCBzb21lIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgYXQKLSAgICAgIGR1dGV0dGUuZXQudHVkZWxmdC5ubDovcHViL2xpbnV4LwotYW5kIGF0IEViZXJoYXJkJ3MgbWlycm9yCi0gICAgICBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L2Nkcm9tL2RyaXZlcnMvb3B0aWNzLwotCi1CZWZvcmUgeW91IGNhbiB1c2UgdGhlIGRyaXZlciwgeW91IGhhdmUgdG8gY3JlYXRlIHRoZSBkZXZpY2UgZmlsZSBvbmNlOgotICMgbWtub2QgL2Rldi9vcHRjZDAgYiAxNyAwCi0KLVRvIHNwZWNpZnkgdGhlIGJhc2UgYWRkcmVzcyBpZiB0aGUgZHJpdmVyIGlzICJjb21waWxlZC1pbiIgdG8geW91ciBrZXJuZWwsCi15b3UgY2FuIHVzZSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBpdGVtIChMSUxPIG9wdGlvbikKLSAgICAgICAgICAgICBvcHRjZD0weDM0MAotd2l0aCB0aGUgcmlnaHQgYWRkcmVzcy4KLQotSWYgeW91IGhhdmUgY29tcGlsZWQgb3B0Y2QgYXMgYSBtb2R1bGUsIHlvdSBjYW4gbG9hZCBpdCB3aXRoCi0gIyBpbnNtb2QgL3Vzci9zcmMvbGludXgvbW9kdWxlcy9vcHRjZC5vCi1vcgotICMgaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvb3B0Y2QubyBvcHRjZD0weDM0MAotd2l0aCB0aGUgbWF0Y2hpbmcgYWRkcmVzcyB2YWx1ZSBvZiB5b3VyIGludGVyZmFjZSBjYXJkLgotCi1UaGUgZHJpdmVyIGVtcGxveXMgYSBudW1iZXIgb2YgYnVmZmVycyB0byBkbyByZWFkLWFoZWFkIGFuZCBibG9jayBzaXplCi1jb252ZXJzaW9uLiBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgY29uZmlndXJhYmxlIGluIG9wdGNkLmgsIGFuZCBoYXMKLWluZmx1ZW5jZSBvbiB0aGUgZHJpdmVyIHBlcmZvcm1hbmNlLiBGb3IgbXkgbWFjaGluZSAoYSBQNzUpLCA2IGJ1ZmZlcnMKLXNlZW1zIG9wdGltYWwsIGFzIGNhbiBiZSBzZWVuIGZyb20gdGhpcyB0YWJsZToKLQotI2J1ZnMJa2IvcwklY3B1Ci0xCTk3CTAuMQotMgkxOTEJMC4zCi0zCTE4OAkwLjIKLTQJMjQ2CTAuMwotNQkxODkJMTkKLTYJMjgwCTAuNAotNwkyODEJNy4wCi04CTI0NgkyLjgKLTE2CTI4MQkzLjQKLQotSWYgeW91IGdldCBhIHRocm91Z2hwdXQgc2lnbmlmaWNhbnRseSBiZWxvdyAzMDAga2IvcywgdHJ5IHR3ZWFraW5nCi1OX0JVRlMsIGFuZCBkb24ndCBmb3JnZXQgdG8gbWFpbCBtZSB5b3VyIHJlc3VsdHMhCi0KLUknZCBhcHByZWNpYXRlIHN1Y2Nlc3MvZmFpbHVyZSByZXBvcnRzLiBJZiB5b3UgZmluZCBhIGJ1ZywgdHJ5Ci1yZWNvbXBpbGluZyB0aGUgZHJpdmVyIHdpdGggc29tZSBzdHJhdGVnaWNhbGx5IGNob3NlbiBkZWJ1ZyBvcHRpb25zCi0odGhlc2UgY2FuIGJlIGZvdW5kIGluIG9wdGNkLmgpIGFuZCBpbmNsdWRlIHRoZSBtZXNzYWdlcyBnZW5lcmF0ZWQgaW4KLXlvdXIgYnVnIHJlcG9ydC4gR29vZCBsdWNrLgotCi1MZW8gU3BpZWttYW4gKHNwaWVrbWFuQGR1dGV0dGUuZXQudHVkZWxmdC5ubCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JhNjNmLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLVRoaXMgUkVBRE1FIGJlbG9uZ3MgdG8gcmVsZWFzZSA0LjIgb3IgbmV3ZXIgb2YgdGhlIFNvdW5kQmxhc3RlciBQcm8KLShNYXRzdXNoaXRhLCBLb3RvYnVraSwgUGFuYXNvbmljLCBDcmVhdGl2ZUxhYnMsIExvbmdzaGluZSBhbmQgVGVhYykKLUNELVJPTSBkcml2ZXIgZm9yIExpbnV4LgotCi1zYnBjZCByZWFsbHksIHJlYWxseSBpcyBOT1QgZm9yIEFOWSBJREUvQVRBUEkgZHJpdmUhCi1Ob3QgZXZlbiBpZiB5b3UgaGF2ZSBhbiAib3JpZ2luYWwiIFNvdW5kQmxhc3RlciBjYXJkIHdpdGggYW4gSURFIGludGVyZmFjZSEKLVNvLCB5b3UnZCBiZXR0ZXIgaGF2ZSBhIGxvb2sgaW50byBSRUFETUUuaWRlIGlmIHlvdXIgcG9ydCBhZGRyZXNzIGlzIDB4MUYwLAotMHgxNzAsIDB4MUU4LCAweDE2OCBvciBzaW1pbGFyLgotSSBnZXQgdG9ucyBvZiBtYWlscyBmcm9tIElERS9BVEFQSSBkcml2ZSB1c2VycyAtIEkgcmVhbGx5IGNhbid0IGNvbnRpbnVlCi1hbnkgbW9yZSB0byBhbnN3ZXIgdGhlbSBhbGwuIFNvLCBpZiB5b3VyIGRyaXZlL2ludGVyZmFjZSBpbmZvcm1hdGlvbiBzaGVldHMKLW1lbnRpb24gIklERSIgKHByaW1hcnksIHNlY29uZGFyeSwgdGVydGlhcnksIHF1YXRlcm5hcnkpIGFuZCB0aGUgRE9TIGRyaXZlcgotaW52b2tpbmcgbGluZSB3aXRoaW4geW91ciBDT05GSUcuU1lTIGlzIHVzaW5nIGFuIGFkZHJlc3MgYmVsb3cgMHgyMzA6Ci1ET04nVCBST0IgTVkgTEFTVCBORVJWRSAtIGp1bXBlciB5b3VyIGludGVyZmFjZSB0byBhZGRyZXNzIDB4MTcwIGFuZCBJUlEgMTUKLSh0aGF0IGlzIHRoZSAic2Vjb25kYXJ5IElERSIgY29uZmlndXJhdGlvbiksIHNldCB5b3VyIGRyaXZlIHRvICJtYXN0ZXIiIGFuZAotdXNlIGlkZS1jZCBhcyB5b3VyIGRyaXZlci4gSWYgeW91IGRvIG5vdCBoYXZlIGEgc2Vjb25kIElERSBoYXJkIGRpc2ssIHVzZSB0aGUKLUxJTE8gY29tbWFuZHMKLSAgIGhkYj1ub3Byb2JlIGhkYz1jZHJvbQotYW5kIGdldCBsdWNreS4KLVRvIG1ha2UgaXQgZnVsbHkgY2xlYXIgdG8geW91OiBpZiB5b3UgbWFpbCBtZSBhYm91dCBJREUvQVRBUEkgZHJpdmUgcHJvYmxlbXMsCi1teSBhbnN3ZXIgaXMgYWJvdmUsIGFuZCBJIHNpbXBseSB3aWxsIGRpc2NhcmQgeW91ciBtYWlsLCBob3BpbmcgdG8gc3RvcCB0aGUKLWZsb29kIGFuZCB0byBmaW5kIHRpbWUgdG8gbGVhZCBteSAxMi15ZWFyIG9sZCBzb24gdG93YXJkcyBoYXBweSBjb21wdXRpbmcuCi0KLVRoZSBkcml2ZXIgaXMgYWJsZSB0byBkcml2ZSB0aGUgd2hvbGUgZmFtaWx5IG9mICJ0cmFkaXRpb25hbCIgQVQtc3R5bGUgKHRoYXQKLWlzIE5PVCB0aGUgbmV3ICJFbmhhbmNlZCBJREUiIG9yICJBVEFQSSIgZHJpdmUgc3RhbmRhcmQpIE1hdHN1c2hpdGEsCi1Lb3RvYnVraSwgUGFuYXNvbmljIGRyaXZlcywgc29tZXRpbWVzIGxhYmVsbGVkIGFzICJDcmVhdGl2ZUxhYnMiLiBUaGUKLXdlbGwta25vd24gZHJpdmVzIGFyZSBDUi01MjEsIENSLTUyMiwgQ1ItNTIzLCBDUi01NjIsIENSLTU2My4KLUNSLTU3NCBpcyBhbiBJREUvQVRBUEkgZHJpdmUuCi0KLVRoZSBMb25nc2hpbmUgTENTLTcyNjAgaXMgYSBkb3VibGUtc3BlZWQgZHJpdmUgd2hpY2ggdXNlcyB0aGUgIm9sZCIKLU1hdHN1c2hpdGEgY29tbWFuZCBzZXQuIEl0IGlzIHN1cHBvcnRlZCAtIHdpdGggaGVscCBieSBTZXJnZSBSb2J5bnMuCi1WZXJ0b3MgKCJFbGl0ZWdyb3VwIENvbXB1dGVyIFN5c3RlbXMiLCBFQ1MpIGhhcyBhIHNpbWlsYXIgZHJpdmUgLSBzdXBwb3J0Ci1oYXMgc3RhcnRlZDsgZ2V0IGluIGNvbnRhY3QgaWYgeW91IGhhdmUgc3VjaCBhICJWZXJ0b3MgMTAwIiBvciAiRUNTLUFUIgotZHJpdmUuCi0KLVRoZXJlIGV4aXN0cyBhbiAiSUJNIEV4dGVybmFsIElTQSBDRC1ST00gRHJpdmUiIHdoaWNoIGluIGZhY3QgaXMgYSBDUi01NjMKLXdpdGggYSBzcGVjaWFsIGNvbnRyb2xsZXIgYm9hcmQuIFRoaXMgZHJpdmUgaXMgc3VwcG9ydGVkICh0aGUgaW50ZXJmYWNlIGlzCi1vZiB0aGUgIkxhc2VyTWF0ZSIgdHlwZSksIGFuZCBpdCBpcyBwb3NzaWJseSB0aGUgYmVzdCBidXkgdG9kYXkgKGNoZWFwZXIgdGhhbgotYW4gaW50ZXJuYWwgZHJpdmUsIGFuZCB5b3UgY2FuIHVzZSBpdCBhcyBhbiBpbnRlcm5hbCwgdG9vIC0gZS5nLiBwbHVnIGl0IGludG8KLWEgc291bmRjYXJkKS4KLQotQ3JlYXRpdmVMYWJzIGhhcyBhIG5ldyBkcml2ZSAiQ0QyMDAiIGFuZCBhIHNpbWlsYXIgZHJpdmUgIkNEMjAwRiIuIFRoZSBsYXR0ZXIKLWlzIG1hZGUgYnkgRnVuYWkgYW5kIHNvbWV0aW1lcyBuYW1lZCAiRTI1NTBVQSIsIG5ld2VyIG1vZGVscyBtYXkgYmUgbmFtZWQKLSJNSzQwMTUiLiBUaGUgQ0QyMDBGIGRyaXZlcyBzaG91bGQgZnVsbHkgd29yay4KLUNEMjAwIGRyaXZlcyB3aXRob3V0ICJGIiBhcmUgc3RpbGwgZ2l2aW5nIHByb2JsZW1zOiBkcml2ZSBkZXRlY3Rpb24gYW5kCi1wbGF5aW5nIGF1ZGlvIHNob3VsZCB3b3JrLCBkYXRhIGFjY2VzcyB3aWxsIHJlc3VsdCBpbiBlcnJvcnMuIEkgbmVlZCBxdWFsaWZpZWQKLWZlZWRiYWNrIGFib3V0IHRoZSBidWdzIHdpdGhpbiB0aGUgZGF0YSBmdW5jdGlvbnMgb3IgYSBkcml2ZSAoSSBuZXZlciBzYXcgYQotQ0QyMDApLgotCi1UaGUgcXVhZC1zcGVlZCBUZWFjIENELTU1QSBkcml2ZSBpcyBzdXBwb3J0ZWQsIGJ1dCBzdGlsbCBkb2VzIG5vdCByZWFjaCAiZnVsbAotc3BlZWQiLiBUaGUgZGF0YSByYXRlIGFscmVhZHkgcmVhY2hlcyA1MDAga0Ivc2VjIGlmIHlvdSBzZXQgU0JQX0JVRkZFUl9GUkFNRVMKLXRvIDY0IChpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZG8gdGhhdCBmb3Igbm9ybWFsICJmaWxlIGFjY2VzcyIgdXNhZ2UsIGJ1dCBpdAotY2FuIHNwZWVkIHVwIHRoaW5ncyBhIGxvdCBpZiB5b3UgdXNlIHNvbWV0aGluZyBsaWtlICJkZCIgdG8gcmVhZCBmcm9tIHRoZQotZHJpdmU7IEkgdXNlIGl0IGZvciB2ZXJpZnlpbmcgc2VsZi13cml0dGVuIENEcyB0aGlzIHdheSkuCi1UaGUgZHJpdmUgaXRzZWxmIGlzIGFibGUgdG8gZGVsaXZlciA2MDAga0Ivc2VjLCBzbyB0aGlzIG5lZWRzCi13b3JrOyB3aXRoIHRoZSBub3JtYWwgc2V0dXAsIHRoZSBwZXJmb3JtYW5jZSBjdXJyZW50bHkgaXMgbm90IGV2ZW4gYXMgZ29vZCBhcwotZG91YmxlLXNwZWVkLgotCi1UaGlzIGRyaXZlciBpcyBOT1QgZm9yIE1pdHN1bWkgb3IgU29ueSBvciBBenRlY2ggb3IgUGhpbGlwcyBvciBYWFggZHJpdmVzLAotYW5kIGFnYWluOiB0aGlzIGRyaXZlciBpcyBpbiBubyB3YXkgdXNhYmxlIGZvciBhbnkgSURFL0FUQVBJIGRyaXZlLiBJZiB5b3UgCi10aGluayB5b3VyIGRyaXZlIHNob3VsZCB3b3JrIGFuZCBpdCBkb2Vzbid0OiBzZW5kIG1lIHRoZSBET1MgZHJpdmVyIGZvciB5b3VyCi1iZWFzdCAoZ3ppcHBlZCArIHV1ZW5jb2RlZCkgYW5kIHlvdXIgQ09ORklHLlNZUyBpZiB5b3Ugd2FudCB0byBhc2sgbWUgZm9yIGhlbHAsCi1hbmQgaW5jbHVkZSBhbiBvcmlnaW5hbCBsb2cgbWVzc2FnZSBleGNlcnB0LCBhbmQgdHJ5IHRvIGdpdmUgYWxsIGluZm9ybWF0aW9uCi1hIGNvbXBsZXRlIGlkaW90IG5lZWRzIHRvIHVuZGVyc3RhbmQgeW91ciBoYXNzbGUgYWxyZWFkeSB3aXRoIHlvdXIgZmlyc3QKLW1haWwuIEFuZCBpZiB5b3Ugd2FudCB0byBzYXkgImFzIEkgaGF2ZSBtYWlsZWQgeW91IGJlZm9yZSIsIGJlIHN1cmUgdGhhdCBJCi1kb24ndCByZW1lbWJlciB5b3VyICJjYXNlIiBieSBzdWNoIHJlbWFya3M7IGF0IHRoZSBtb21lbnQsIEkgaGF2ZSBzb21lIAotaHVuZHJlZHMgb2Ygb3BlbiBjb3JyZXNwb25kZW5jZXMgYWJvdXQgTGludXggQ0RST00gcXVlc3Rpb25zIChob3BlIHRvIHJlZHVjZSBpZgotdGhlIElERS9BVEFQSSB1c2VyIHF1ZXN0aW9ucyBkaXNhcHBlYXIpLiAKLQotCi1UaGlzIGRyaXZlciB3aWxsIHdvcmsgd2l0aCB0aGUgc291bmRjYXJkIGludGVyZmFjZXMgKFNCIFBybywgU0IgMTYsIEdhbGF4eSwKLVNvdW5kRlgsIE1vemFydCwgTUFEMTYgLi4uKSBhbmQgd2l0aCB0aGUgIm5vLXNvdW5kIiBjYXJkcyAoUGFuYXNvbmljIENJLTEwMVAsCi1MYXNlck1hdGUsIFdESC03MDAxQywgTG9uZ3NoaW5lIExDUy02ODUzLCBUZWFjIC4uLikuCi0KLUl0IHdvcmtzIHdpdGggdGhlICJjb25maWd1cmFibGUiIGludGVyZmFjZSAiU2VxdW9pYSBTLTEwMDAiLCB0b28sIHdoaWNoIGlzIAotdXNlZCBvbiB0aGUgU3BlYSBNZWRpYSBGWCBhbmQgRW5zb25pYyBTb3VuZHNjYXBlIHNvdW5kIGNhcmRzLiBZb3UgaGF2ZSB0bwotc3BlY2lmeSB0aGUgdHlwZSAiU0JQUk8gMiIgYW5kIHRoZSB0cnVlIENEUk9NIHBvcnQgYWRkcmVzcyB3aXRoIGl0LCBub3QgdGhlCi0iY29uZmlndXJhdGlvbiBwb3J0IiBhZGRyZXNzLgotCi1JZiB5b3UgaGF2ZSBhIHNvdW5kIGNhcmQgd2hpY2ggbmVlZHMgYSAiY29uZmlndXJhdGlvbiBkcml2ZXIiIGluc3RlYWQgb2YKLWp1bXBlcnMgZm9yIGludGVyZmFjZSB0eXBlcyBhbmQgYWRkcmVzc2VzIChsaWtlIE1vemFydCBjYXJkcykgLSB0aG9zZQotZHJpdmVycyBnZXQgaW52b2tlZCBiZWZvcmUgdGhlIERPUyBDRFJPTSBkcml2ZXIgaW4geW91ciBDT05GSUcuU1lTLCB0eXBpY2FsCi1uYW1lcyBhcmUgImNkc2V0dXAuc3lzIiBhbmQgIm16dGluaXQuc3lzIiAtIGxldCB0aGUgc291bmQgZHJpdmVyIGRvIHRoZQotQ0RST00gcG9ydCBjb25maWd1cmF0aW9uICh0aGUgbGVhZGluZyBjb21tZW50cyBpbiBsaW51eC9kcml2ZXJzL3NvdW5kL21hZDE2LmMKLWFyZSBqdXN0IGZvciB5b3UhKS4gSGFubnUgU2F2b2xhaW5lbidzIG1hZDE2LmMgY29kZSBpcyBhYmxlIHRvIHNldCB1cCBteQotTW96YXJ0IGNhcmQgLSBJIHNpbXBseSBoYWQgdG8gYWRkCi0gICAjZGVmaW5lIE1BRDE2X0NPTkYgMHgwNgotICAgI2RlZmluZSBNQUQxNl9DRFNFTCAweDAzCi10byBjb25maWd1cmUgdGhlIENEUk9NIGludGVyZmFjZSBmb3IgdHlwZSAiUGFuYXNvbmljIiAoTGFzZXJNYXRlKSBhbmQgYWRkcmVzcwotMHgzNDAuCi0KLVRoZSBpbnRlcmZhY2UgdHlwZSBoYXMgdG8gZ2V0IGNvbmZpZ3VyZWQgaW4gbGludXgvZHJpdmVycy9jZHJvbS9zYnBjZC5oLCAKLWJlY2F1c2UgdGhlIHJlZ2lzdGVyIGxheW91dCBpcyBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgIlNvdW5kQmxhc3RlciIgYW5kIHRoZQotIkxhc2VyTWF0ZSIgdHlwZS4KLQotSSBnb3QgYSByZXBvcnQgdGhhdCB0aGUgVGVhYyBpbnRlcmZhY2UgY2FyZCAiSS9GIEUxMTcwOTgiIGlzIG9mIHR5cGUKLSJTb3VuZEJsYXN0ZXIiIChpLmUuIHlvdSBoYXZlIHRvIHNldCBTQlBSTyB0byAxKSBldmVuIHdpdGggdGhlIGFkZHJlc3NlcwotMHgzMDAgYW5kIGFib3ZlLiBUaGlzIGlzIHVudXN1YWwsIGFuZCBpdCBjYW4ndCBnZXQgY292ZXJlZCBieSB0aGUgYXV0bwotcHJvYmluZyBzY2hlbWUuCi1UaGUgVGVhYyAxNi1iaXQgaW50ZXJmYWNlIGNhcmRzIChsaWtlIFAvTiBFOTUwMjI4LTAwQSwgZGVmYXVsdCBhZGRyZXNzIDB4MkMwKQotbmVlZCB0aGUgU0JQUk8gMyBzZXR1cC4KLQotSWYgYXV0by1wcm9iaW5nIGZvdW5kIHRoZSBkcml2ZSwgdGhlIGFkZHJlc3MgaXMgY29ycmVjdC4gVGhlIHJlcG9ydGVkIHR5cGUKLW1heSBiZSB3cm9uZy4gQSAibW91bnQiIHdpbGwgZ2l2ZSBzdWNjZXNzIG9ubHkgaWYgdGhlIGludGVyZmFjZSB0eXBlIGlzIHNldAotcmlnaHQuIFBsYXlpbmcgYXVkaW8gc2hvdWxkIHdvcmsgd2l0aCBhIHdyb25nIHNldCBpbnRlcmZhY2UgdHlwZSwgdG9vLgotCi1XaXRoIHNvbWUgVGVhYyBhbmQgc29tZSBDRDIwMCBkcml2ZXMgSSBoYXZlIHNlZW4gaW50ZXJmYWNlIGNhcmRzIHdoaWNoIHNlZW0KLXRvIGxhY2sgdGhlICJkcml2ZSBzZWxlY3QiIGxpbmVzOyBhbHdheXMgZHJpdmUgMCBnZXRzIGFkZHJlc3NlZC4gVG8gYXZvaWQKLSJtaXJyb3IgZHJpdmVzIiAoZm91ciBkcml2ZXMgZGV0ZWN0ZWQgd2hlcmUgeW91IG9ubHkgaGF2ZSBvbmUpIHdpdGggc3VjaAotaW50ZXJmYWNlIGNhcmRzLCBzZXQgTUFYX0RSSVZFUyB0byAxIGFuZCBqdW1wZXIgeW91ciBkcml2ZSB0byBJRCAwIChpZgotcG9zc2libGUpLgotCi0KLVVwIHRvIDQgZHJpdmVzIHBlciBpbnRlcmZhY2UgY2FyZCwgYW5kIHVwIHRvIDQgaW50ZXJmYWNlIGNhcmRzIGFyZSBzdXBwb3J0ZWQuCi1BbGwgc3VwcG9ydGVkIGRyaXZlIGZhbWlsaWVzIGNhbiBiZSBtaXhlZCwgYnV0IHRoZSBDUi01MjEgZHJpdmVzIGFyZSAKLWhhcmQtd2lyZWQgdG8gZHJpdmUgSUQgMC4gVGhlIGRyaXZlcyBoYXZlIHRvIHVzZSBkaWZmZXJlbnQgZHJpdmUgSURzLCBhbmQgZWFjaAotZHJpdmUgaGFzIHRvIGdldCBhIHVuaXF1ZSBtaW5vciBudW1iZXIgKDAuLi4zKSwgY29ycmVzcG9uZGluZyBpbmRpcmVjdGx5IHRvIAotaXRzIGRyaXZlIElELgotVGhlIGRyaXZlIElEcyBtYXkgYmUgc2VsZWN0ZWQgZnJlZWx5IGZyb20gMCB0byAzIC0gdGhleSBkbyBub3QgaGF2ZSB0byBiZSBpbgotY29uc2VjdXRpdmUgb3JkZXIuCi0KLUFzIERvbiBDYXJyb2xsLCBkb25AZHM5LnVzLmRlbGwuY29tIG9yIEZJRE8gMTozODIvMTQsIHRvbGQgbWUsIGl0IGlzIHBvc3NpYmxlCi10byBjaGFuZ2Ugb2xkIGRyaXZlcyB0byBhbnkgSUQsIHRvby4gSGUgd3JpdGVzIGluIHRoaXMgc2Vuc2U6Ci0gICAiSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgbW9yZSB0aGFuIG9uZSBzaW5nbGUgc3BlZWQgZHJpdmUKLSAgICh0aGV5IGRvIG5vdCBoYXZlIHRoZSBJRCBqdW1wZXJzKSB5b3UgbXVzdCBhZGQgYSBESVAgc3dpdGNoCi0gICBhbmQgdHdvIHJlc2lzdG9ycy4gVGhlIHBhZHMgYXJlIGFscmVhZHkgb24gdGhlIGJvYXJkIG5leHQgdG8KLSAgIHRoZSBwb3dlciBjb25uZWN0b3IuIFlvdSB3aWxsIHNlZSB0aGUgc2lsa3NjcmVlbiBmb3IgdGhlCi0gICBzd2l0Y2ggaWYgeW91IHJlbW92ZSB0aGUgdG9wIGNvdmVyLgotICAgICAgICAgICAgICAgICAgICAxIDIgMyA0Ci0gICAgICAgICAgICAgSUQgMCA9IHggRiBGIHggICAgICAgICAgICAgTyA9ICJvbiIKLSAgICAgICAgICAgICBJRCAxID0geCBPIEYgeCAgICAgICAgICAgICBGID0gIm9mZiIKLSAgICAgICAgICAgICBJRCAyID0geCBGIE8geCAgICAgICAgICAgICB4ID0gImRvbid0IGNhcmUiCi0gICAgICAgICAgICAgSUQgMyA9IHggTyBPIHgKLSAgIE5leHQgdG8gdGhlIHN3aXRjaCBhcmUgdGhlIHBvc2l0aW9ucyBmb3IgUjc2ICg3aykgYW5kIFI3OAotICAgKDEyaykuIEkgaGFkIHRvIHBsYXkgYXJvdW5kIHdpdGggdGhlIHJlc2lzdG9yIHZhbHVlcyAtIElEIDMKLSAgIGRpZCBub3Qgd29yayB3aXRoIG90aGVyIHZhbHVlcy4gSWYgdGhlIHZhbHVlcyBhcmUgbm90IGdvb2QsCi0gICBJRCAzIGJlaGF2ZXMgbGlrZSBJRCAwLiIKLQotVG8gdXNlIG1vcmUgdGhhbiA0IGRyaXZlcywgeW91IHNpbXBseSBuZWVkIGEgc2Vjb25kIGNvbnRyb2xsZXIgY2FyZCBhdCBhIAotZGlmZmVyZW50IGFkZHJlc3MgYW5kIGEgc2Vjb25kIGNhYmxlLgotCi1UaGUgZHJpdmVyIHN1cHBvcnRzIHJlYWRpbmcgb2YgZGF0YSBmcm9tIHRoZSBDRCBhbmQgcGxheWluZyBvZiBhdWRpbyB0cmFja3MuCi1UaGUgYXVkaW8gcGFydCBzaG91bGQgcnVuIHdpdGggV29ya01hbiwgeGNkcGxheWVyLCB3aXRoIHRoZSAibm9uLVgxMSIgcHJvZHVjdHMKLUNEcGxheWVyIGFuZCBXb3JrQm9uZSAtIHRlbGwgbWUgaWYgaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBzb2Z0d2FyZS4KLVRoZSBvbmx5IGFjY2VwdGVkIG1lYXN1cmUgZm9yIGNvcnJlY3RuZXNzIHdpdGggdGhlIGF1ZGlvIGZ1bmN0aW9ucyBpcyB0aGUKLSJjZHRlc3RlciIgdXRpbGl0eSAoYXBwZW5kZWQpIC0gbW9zdCBhdWRpbyBwbGF5ZXIgcHJvZ3JhbW1lcnMgc2VlbSB0byBiZQotYmV0dGVyIG11c2ljaWFucyB0aGFuIHByb2dyYW1tZXJzLiA7LSkKLQotV2l0aCB0aGUgQ1ItNTZ4IGFuZCB0aGUgQ0QyMDAgZHJpdmVzLCB0aGUgcmVhZGluZyBvZiBhdWRpbyBmcmFtZXMgaXMgcG9zc2libGUuCi1UaGlzIGlzIGltcGxlbWVudGVkIGJ5IGFuIElPQ1RMIGZ1bmN0aW9uIHdoaWNoIHJlYWRzIFJFQURfQVVESU8gZnJhbWVzIG9mCi0yMzUyIGJ5dGVzIGF0IG9uY2UgKGNvbmZpZ3VyYWJsZSB3aXRoIHRoZSAiUkVBRF9BVURJTyIgZGVmaW5lLCBkZWZhdWx0IGlzIDApLgotUmVhZGluZyB0aGUgc2FtZSBmcmFtZSBhIHNlY29uZCB0aW1lIGdpdmVzIGRpZmZlcmVudCBkYXRhOyB0aGUgZnJhbWUgZGF0YSAKLXN0YXJ0IGF0IGEgZGlmZmVyZW50IHBvc2l0aW9uLCBidXQgYWxsIHJlYWQgYnl0ZXMgYXJlIHZhbGlkLCBhbmQgd2UgYWx3YXlzCi1yZWFkIDk4IGNvbnNlY3V0aXZlIGNodW5rcyAob2YgMjQgQnl0ZXMpIGFzIGEgZnJhbWUuIFJlYWRpbmcgbW9yZSB0aGFuIDEgZnJhbWUKLWF0IG9uY2UgcG9zc2libHkgbWlzc2VzIHNvbWUgY2h1bmtzIGF0IGVhY2ggZnJhbWUgYm91bmRhcnkuIFRoaXMgbGFjayBoYXMgdG8KLWdldCBjb3JyZWN0ZWQgYnkgZXh0ZXJuYWwsICJoaWdoZXIgbGV2ZWwiIHNvZnR3YXJlIHdoaWNoIHJlYWRzIHRoZSBzYW1lIGZyYW1lIAotYWdhaW4gYW5kIHRyaWVzIHRvIGZpbmQgYW5kIGVsaW1pbmF0ZSBvdmVybGFwcGluZyBjaHVua3MgKDI0LWJ5dGUtcGllY2VzKS4KLQotVGhlIHRyYW5zZmVyIHJhdGUgd2l0aCByZWFkaW5nIGF1ZGlvICgxLWZyYW1lLXBpZWNlcykgY3VycmVudGx5IGlzIHZlcnkgc2xvdy4KLVRoaXMgY2FuIGJlIGJldHRlciByZWFkaW5nIGJpZ2dlciBjaHVua3MsIGJ1dCB0aGUgIm1pc3NpbmciIGNodW5rcyBwb3NzaWJseQotb2NjdXIgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNpbmdsZSBmcmFtZS4KLVRoZSBzb2Z0d2FyZSBpbnRlcmZhY2UgcG9zc2libHkgbWF5IGNoYW5nZSBhIGJpdCB0aGUgZGF5IHRoZSBTQ1NJIGRyaXZlcgotc3VwcG9ydHMgaXQgdG9vLgotCi1XaXRoIGFsbCBidXQgdGhlIENSLTUyeCBkcml2ZXMsIE11bHRpU2Vzc2lvbiBpcyBzdXBwb3J0ZWQuCi1QaG90byBDRHMgd29yayAodGhlICJvbGQiIGRyaXZlcyBsaWtlIENSLTUyMSBjYW4gYWNjZXNzIG9ubHkgdGhlIGZpcnN0Ci1zZXNzaW9uIG9mIGEgcGhvdG9DRCkuCi1BdCBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L2hwY2R0b3BwbS8geW91IHdpbGwgZmluZCBIYWRtdXQgRGFuaXNjaCdzIHBhY2thZ2UgdG8KLWNvbnZlcnQgcGhvdG8gQ0QgaW1hZ2UgZmlsZXMgYW5kIEdlcmQgS25vcnIncyB2aWV3aW5nIHV0aWxpdHkuCi0KLVRoZSB0cmFuc2ZlciByYXRlIHdpbGwgcmVhY2ggMTUwIGtCL3NlYyB3aXRoIENSLTUyeCBkcml2ZXMsIDMwMCBrQi9zZWMgd2l0aAotQ1ItNTZ4IGRyaXZlcywgYW5kIGN1cnJlbnRseSBub3QgbW9yZSB0aGFuIDUwMCBrQi9zZWMgKHVzdWFsbHkgbGVzcyB0aGFuCi0yNTAga0Ivc2VjKSB3aXRoIHRoZSBUZWFjIHF1YWQgc3BlZWQgZHJpdmVzLgotWEEgKFBob3RvQ0QpIGRpc2tzIHdpdGggIm9sZCIgZHJpdmVzIGdpdmUgb25seSA1MCBrQi9zZWMuCi0KLVRoaXMgcmVsZWFzZSBjb25zaXN0cyBvZgotLSB0aGlzIFJFQURNRSBmaWxlCi0tIHRoZSBkcml2ZXIgZmlsZSBsaW51eC9kcml2ZXJzL2Nkcm9tL3NicGNkLmMKLS0gdGhlIHN0dWIgZmlsZXMgbGludXgvZHJpdmVycy9jZHJvbS9zYnBjZFsyMzRdLmMKLS0gdGhlIGhlYWRlciBmaWxlIGxpbnV4L2RyaXZlcnMvY2Ryb20vc2JwY2QuaC4KLQotCi1UbyBpbnN0YWxsOgotLS0tLS0tLS0tLS0KLQotMS4gU2V0dXAgeW91ciBoYXJkd2FyZSBwYXJhbWV0ZXJzLiBUaG91Z2ggdGhlIGRyaXZlciBkb2VzICJhdXRvLXByb2JpbmciIGF0IGEKLSAgIGxvdCBvZiAobm90IGFsbCBwb3NzaWJsZSEpIGFkZHJlc3NlcywgdGhpcyBzdGVwIGlzIHJlY29tbWVuZGVkIGZvcgotICAgZXZlcnlkYXkgdXNlLiBZb3Ugc2hvdWxkIGxldCBzYnBjZCBhdXRvLXByb2JlIG9uY2UgYW5kIHVzZSB0aGUgcmVwb3J0ZWQKLSAgIGFkZHJlc3MgaWYgYSBkcml2ZSBnb3QgZm91bmQuIFRoZSByZXBvcnRlZCB0eXBlIG1heSBiZSBpbmNvcnJlY3Q7IGl0IGlzCi0gICBjb3JyZWN0IGlmIHlvdSBjYW4gbW91bnQgYSBkYXRhIENELiBUaGVyZSBpcyBubyBjaG9pY2UgZm9yIHlvdSB3aXRoIHRoZQotICAgdHlwZTsgb25seSBvbmUgaXMgcmlnaHQsIHRoZSBvdGhlcnMgYXJlIGRlYWRseSB3cm9uZy4KLQotICAgYS4gR28gaW50byAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL3NicGNkLmggYW5kIGNvbmZpZ3VyZSBpdCBmb3IgeW91cgotICAgICAgaGFyZHdhcmUgKG5lYXIgdGhlIGJlZ2lubmluZyk6Ci0gICAgICBhMS4gU2V0IGl0IHVwIGZvciB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBpbnRlcmZhY2UgYm9hcmQuCi0gICAgICAgICAgIk9yaWdpbmFsIiBDcmVhdGl2ZUxhYnMgc291bmQgY2FyZHMgbmVlZCAiU0JQUk8gMSIuCi0gICAgICAgICAgTW9zdCAiY29tcGF0aWJsZSIgc291bmQgY2FyZHMgKGFsbW9zdCBhbGwgIm5vbi1DcmVhdGl2ZUxhYnMiIGNhcmRzKQotICAgICAgICAgIG5lZWQgIlNCUFJPIDAiLgotICAgICAgICAgIFRoZSAibm8tc291bmQiIGJvYXJkIGZyb20gT21uaUNkIG5lZWRzIHRoZSAiU0JQUk8gMSIgc2V0dXAuCi0gICAgICAgICAgVGhlIFRlYWMgOC1iaXQgIm5vLXNvdW5kIiBib2FyZHMgbmVlZCB0aGUgIlNCUFJPIDEiIHNldHVwLgotICAgICAgICAgIFRoZSBUZWFjIDE2LWJpdCAibm8tc291bmQiIGJvYXJkcyBuZWVkIHRoZSAiU0JQUk8gMyIgc2V0dXAuCi0gICAgICAgICAgQWxsIG90aGVyICJuby1zb3VuZCIgYm9hcmRzIG5lZWQgdGhlICJTQlBSTyAwIiBzZXR1cC4KLSAgICAgICAgICBUaGUgU3BlYSBNZWRpYSBGWCBhbmQgRW5zb25pcSBTb3VuZFNjYXBlIGNhcmRzIG5lZWQgIlNCUFJPIDIiLgotICAgICAgICAgIHNicGNkLmMgaG9sZHMgc29tZSBleGFtcGxlcyBpbiBpdHMgYXV0by1wcm9iZSBsaXN0LgotICAgICAgICAgIElmIHlvdSBjb25maWd1cmUgIlNCUFJPIiB3cm9uZywgdGhlIHBsYXlpbmcgb2YgYXVkaW8gQ0RzIHdpbGwgd29yaywKLSAgICAgICAgICBidXQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gbW91bnQgYSBkYXRhIENELgotICAgICAgYTIuIFRlbGwgdGhlIGFkZHJlc3Mgb2YgeW91ciBDRFJPTV9QT1JUIChub3Qgb2YgdGhlIHNvdW5kIHBvcnQpLgotICAgICAgYTMuIElmIDQgZHJpdmVzIGdldCBmb3VuZCwgYnV0IHlvdSBoYXZlIG9ubHkgb25lLCBzZXQgTUFYX0RSSVZFUyB0byAxLgotICAgICAgYTQuIFNldCBESVNUUklCVVRJT04gdG8gMC4KLSAgIGIuIEFkZGl0aW9uYWxseSBmb3IgMi5hMSBhbmQgMi5hMiwgdGhlIHNldHVwIG1heSBiZSBkb25lIGR1cmluZwotICAgICAgYm9vdCB0aW1lICh2aWEgdGhlICJrZXJuZWwgY29tbWFuZCBsaW5lIiBvciAiTElMTyBvcHRpb24iKToKLSAgICAgICAgICBzYnBjZD0weDMyMCxMYXNlck1hdGUKLSAgICAgIG9yCi0gICAgICAgICAgc2JwY2Q9MHgyMzAsU291bmRCbGFzdGVyCi0gICAgICBvcgotICAgICAgICAgIHNicGNkPTB4MzM4LFNvdW5kU2NhcGUKLSAgICAgIG9yCi0gICAgICAgICAgc2JwY2Q9MHgyQzAsVGVhYzE2Yml0Ci0gICAgICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSBpbnN0YWxsIGEgZnJlc2ggZGlzdHJpYnV0aW9uLgotICAgICAgSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBudW1iZXIsIGl0IGdldHMgdGFrZW4gYXMgdGhlIHR5cGUKLSAgICAgIHNldHRpbmc7IDAgaXMgIkxhc2VyTWF0ZSIsIDEgaXMgIlNvdW5kQmxhc3RlciIsIDIgaXMgIlNvdW5kU2NhcGUiLAotICAgICAgMyBpcyAiVGVhYzE2Yml0Ii4KLSAgICAgIFNvLCBmb3IgZXhhbXBsZQotICAgICAgICAgIHNicGNkPTB4MjMwLDEKLSAgICAgIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgICBzYnBjZD0weDIzMCxTb3VuZEJsYXN0ZXIKLQotMi4gImNkIC91c3Ivc3JjL2xpbnV4IiBhbmQgZG8gYSAibWFrZSBjb25maWciIGFuZCBzZWxlY3QgInkiIGZvciBNYXRzdXNoaXRhCi0gICBDRC1ST00gc3VwcG9ydCBhbmQgZm9yIElTTzk2NjAgRmlsZVN5c3RlbSBzdXBwb3J0LiBJZiB5b3UgZG8gbm90IGhhdmUgYQotICAgc2Vjb25kLCB0aGlyZCwgb3IgZm91cnRoIGNvbnRyb2xsZXIgaW5zdGFsbGVkLCBkbyBub3Qgc2F5ICJ5IiB0byB0aGUgCi0gICBzZWNvbmRhcnkgTWF0c3VzaGl0YSBDRC1ST00gcXVlc3Rpb25zLgotCi0zLiBUaGVuIG1ha2UgdGhlIGtlcm5lbCBpbWFnZSAoIm1ha2UgemxpbG8iIG9yIHNpbWlsYXIpLgotCi00LiBNYWtlIHRoZSBkZXZpY2UgZmlsZShzKS4gVGhpcyBzdGVwIHVzdWFsbHkgYWxyZWFkeSBoYXMgYmVlbiBkb25lIGJ5IHRoZQotICAgTUFLRURFViBzY3JpcHQuCi0gICBUaGUgZHJpdmVyIHVzZXMgTUFKT1IgMjUsIHNvLCBpZiBuZWNlc3NhcnksIGRvCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2QgIGIgMjUgMCAgICAgICAoaWYgeW91IGhhdmUgb25seSBvbmUgZHJpdmUpCi0gICBhbmQvb3IKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDAgYiAyNSAwCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2QxIGIgMjUgMQotICAgICAgICBta25vZCAvZGV2L3NicGNkMiBiIDI1IDIKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDMgYiAyNSAzCi0gICB0byBtYWtlIHRoZSBub2RlKHMpLgotCi0gICBUaGUgImZpcnN0IGZvdW5kIiBkcml2ZSBnZXRzIE1JTk9SIDAgKHJlZ2FyZGxlc3Mgb2YgaXRzIGp1bXBlcmVkIElEKSwgdGhlCi0gICAibmV4dCBmb3VuZCIgKGF0IHRoZSBzYW1lIGNhYmxlKSBnZXRzIE1JTk9SIDEsIC4uLgotICAgCi0gICBGb3IgYSBzZWNvbmQgaW50ZXJmYWNlIGJvYXJkLCB5b3UgaGF2ZSB0byBtYWtlIG5vZGVzIGxpa2UKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDQgYiAyNiAwCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2Q1IGIgMjYgMQotICAgYW5kIHNvIG9uLiBVc2UgdGhlIE1BSk9ScyAyNiwgMjcsIDI4LgotCi0gICBJZiB5b3UgZnVydGhlciBtYWtlIGEgbGluayBsaWtlCi0gICAgICAgIGxuIC1zIHNicGNkIC9kZXYvY2Ryb20KLSAgIHlvdSBjYW4gdXNlIHRoZSBuYW1lIC9kZXYvY2Ryb20sIHRvby4KLQotNS4gUmVib290IHdpdGggdGhlIG5ldyBrZXJuZWwuCi0KLVlvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG8KLSAgICAgICAgICAgICAgbWtkaXIgL0NECi1hbmQgCi0gICAgICAgICAgICAgIG1vdW50IC1ydCBpc285NjYwIC9kZXYvc2JwY2QgL0NECi1vcgotICAgICAgICAgICAgICBtb3VudCAtcnQgaXNvOTY2MCAtbyBibG9jaz0yMDQ4IC9kZXYvc2JwY2QgL0NECi1hbmQgc2VlIHRoZSBjb250ZW50cyBvZiB5b3VyIENEIGluIHRoZSAvQ0QgZGlyZWN0b3J5LgotVG8gdXNlIGF1ZGlvIENEcywgYSBtb3VudGluZyBpcyBub3QgcmVjb21tZW5kZWQgKGFuZCBpdCB3b3VsZCBmYWlsIGlmIHRoZQotZmlyc3QgdHJhY2sgaXMgbm90IGEgZGF0YSB0cmFjaykuCi0KLQotVXNpbmcgc2JwY2QgYXMgYSAibG9hZGFibGUgbW9kdWxlIjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIHlvdSBkbyBOT1Qgc2VsZWN0ICJNYXRzdXNoaXRhL1BhbmFzb25pYyBDRFJPTSBkcml2ZXIgc3VwcG9ydCIgZHVyaW5nIHRoZQotIm1ha2UgY29uZmlnIiBvZiB5b3VyIGtlcm5lbCwgeW91IGNhbiBidWlsZCB0aGUgImxvYWRhYmxlIG1vZHVsZSIgc2JwY2Quby4KLQotSWYgc2JwY2QgZ2V0cyB1c2VkIGFzIGEgbW9kdWxlLCB0aGUgc3VwcG9ydCBvZiBtb3JlIHRoYW4gb25lIGludGVyZmFjZQotY2FyZCAoaS5lLiBkcml2ZXMgNC4uLjE1KSBpcyBkaXNhYmxlZC4KLQotWW91IGNhbiBzcGVjaWZ5IGludGVyZmFjZSBhZGRyZXNzIGFuZCB0eXBlIHdpdGggdGhlICJpbnNtb2QiIGNvbW1hbmQgbGlrZToKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgzNDAsMAotb3IKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgyMzAsMQotb3IKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgzMzgsMgotd2hlcmUgdGhlIGxhc3QgbnVtYmVyIHJlcHJlc2VudHMgdGhlIFNCUFJPIHNldHRpbmcgKG5vIHN0cmluZ3MgYWxsb3dlZCBoZXJlKS4KLQotCi1UaGluZ3Mgb2YgaW50ZXJlc3Q6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgaXMgY29uZmlndXJlZCB0byB0cnkgdGhlIExhc2VyTWF0ZSB0eXBlIG9mIGludGVyZmFjZSBhdCBJL08gcG9ydAotMHgwMzQwIGZpcnN0LiBJZiB0aGlzIGlzIG5vdCBhcHByb3ByaWF0ZSwgc2JwY2QuaCBzaG91bGQgZ2V0IGNoYW5nZWQKLSh5b3Ugd2lsbCBmaW5kIHRoZSByaWdodCBwbGFjZSAtIGp1c3QgYXQgdGhlIGJlZ2lubmluZykuCi0KLU5vIERNQSBhbmQgbm8gSVJRIGlzIHVzZWQuCi0KLVRvIHJlZHVjZSBvciBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIGtlcm5lbCBtZXNzYWdlcywgZWRpdCBzYnBjZC5jIGFuZCBwbGF5Ci13aXRoIHRoZSAiREJHX3h4eCIgc3dpdGNoZXMgKGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YXJpYWJsZSAic2JwY2RfZGVidWciKS4KLURvbid0IGZvcmdldCB0byByZWZsZWN0IG9uIHdoYXQgeW91IGRvOyBlbmFibGluZyBhbGwgREJHX3h4eCBzd2l0Y2hlcyBhdCBvbmNlCi1tYXkgY3Jhc2ggeW91ciBzeXN0ZW0sIGFuZCBlYWNoIG1lc3NhZ2UgbGluZSBpcyBhY2NvbXBhbmllZCBieSBhIGRlbGF5LgotCi1UaGUgZHJpdmVyIHVzZXMgdGhlICJ2YXJpYWJsZSBCTE9DS19TSVpFIiBmZWF0dXJlLiBUbyB1c2UgaXQsIHlvdSBoYXZlIHRvCi1zcGVjaWZ5ICJibG9jaz0yMDQ4IiBhcyBhIG1vdW50IG9wdGlvbi4gRG9pbmcgdGhpcyB3aWxsIGRpc2FibGUgdGhlIGRpcmVjdAotZXhlY3V0aW9uIG9mIGEgYmluYXJ5IGZyb20gdGhlIENEOyB5b3UgaGF2ZSB0byBjb3B5IGl0IHRvIGEgZGV2aWNlIHdpdGggdGhlCi1zdGFuZGFyZCBCTE9DS19TSVpFICgxMDI0KSBmaXJzdC4gU28sIGRvIG5vdCB1c2UgdGhpcyBpZiB5b3VyIHN5c3RlbSBpcwotZGlyZWN0bHkgInJ1bm5pbmcgZnJvbSB0aGUgQ0RST00iIChsaWtlIHNvbWUgb2YgWWdnZHJhc2lsJ3MgaW5zdGFsbGF0aW9uCi12YXJpYW50cykuIFRoZXJlIGFyZSBDRHMgb24gdGhlIG1hcmtldCAobGlrZSB0aGUgR2VybWFuICJ1bmlmaXgiIExpbnV4Ci1kaXN0cmlidXRpb24pIHdoaWNoIE1VU1QgZ2V0IGhhbmRsZWQgd2l0aCBhIGJsb2NrX3NpemUgb2YgMTAyNC4gR2VuZXJhbGx5LAotb25lIGNhbiBzYXkgYWxsIHRoZSBDRHMgd2hpY2ggaG9sZCBmaWxlcyBvZiB0aGUgbmFtZSBZTVRSQU5TLlRCTCBhcmUgZGVmZWN0aXZlOwotZG8gbm90IHVzZSBibG9jaz0yMDQ4IHdpdGggdGhvc2UuCi0KLVdpdGhpbiBzYnBjZC5oLCB5b3Ugd2lsbCBmaW5kIHNvbWUgIiNkZWZpbmUicyAoZS5nLiBFSkVDVCBhbmQgSlVLRUJPWCkuIFdpdGgKLXRoZXNlLCB5b3UgY2FuIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGZvciBzb21lIHNwZWNpYWwgdGhpbmdzLgotWW91IGNhbiB1c2UgdGhlIGFwcGVuZGVkIHByb2dyYW0gImNkdGVzdGVyIiB0byBzZXQgdGhlIGF1dG8tZWplY3QgZmVhdHVyZQotZHVyaW5nIHJ1bnRpbWUuIEplZmYgVHJhbnRlcidzICJlamVjdCIgdXRpbGl0eSBjYW4gZG8gdGhpcywgdG9vIChhbmQgbW9yZSkKLWZvciB5b3UuCi0KLVRoZXJlIGlzIGFuIGlvY3RsIENEUk9NTVVMVElTRVNTSU9OIHRvIG9idGFpbiB3aXRoIGEgdXNlciBwcm9ncmFtIGlmCi10aGUgQ0QgaXMgYW4gWEEgZGlzayBhbmQgLSBpZiBpdCBpcyAtIHdoZXJlIHRoZSBsYXN0IHNlc3Npb24gc3RhcnRzLiBUaGUKLSJjZHRlc3RlciIgcHJvZ3JhbSBpbGx1c3RyYXRlcyBob3cgdG8gY2FsbCBpdC4KLQotCi1BdXRvLXByb2JpbmcgYXQgYm9vdCB0aW1lOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGRyaXZlciBkb2VzIGF1dG8tcHJvYmluZyBhdCBtYW55IHdlbGwta25vd24gaW50ZXJmYWNlIGNhcmQgYWRkcmVzc2VzLAotYnV0IG5vdCBhbGw6Ci1Tb21lIHByb2JpbmdzIGNhbiBjYXVzZSBhIGhhbmcgaWYgYW4gTkUyMDAwIGV0aGVybmV0IGNhcmQgZ2V0cyB0b3VjaGVkLCBiZWNhdXNlCi1TQlBDRCdzIGF1dG8tcHJvYmluZyBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG5ldCBkcml2ZXJzLgotVGhvc2UgImhhemFyZG91cyIgYWRkcmVzc2VzIGFyZSBleGNsdWRlZCBmcm9tIGF1dG8tcHJvYmluZzsgdGhlICJrZXJuZWwgCi1jb21tYW5kIGxpbmUiIGZlYXR1cmUgaGFzIHRvIGJlIHVzZWQgZHVyaW5nIGluc3RhbGxhdGlvbiBpZiB5b3UgaGF2ZSB5b3VyIAotZHJpdmUgYXQgdGhvc2UgYWRkcmVzc2VzLiBUaGUgIm1vZHVsZSIgdmVyc2lvbiBpcyBhbGxvd2VkIHRvIHByb2JlIGF0IHRob3NlCi1hZGRyZXNzZXMsIHRvby4KLQotVGhlIGF1dG8tcHJvYmluZyBsb29rcyBmaXJzdCBhdCB0aGUgY29uZmlndXJlZCBhZGRyZXNzIHJlc3AuIHRoZSBhZGRyZXNzCi1zdWJtaXR0ZWQgYnkgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuIFdpdGggdGhpcywgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoaXMKLWRyaXZlciB3aXRoaW4gaW5zdGFsbGF0aW9uIGJvb3QgZmxvcHBpZXMsIGFuZCBmb3IgYW55IG5vbi1zdGFuZGFyZCBhZGRyZXNzLAotdG9vLgotCi1BdXRvLXByb2Jpbmcgd2lsbCBtYWtlIGFuIGFzc3VtcHRpb24gYWJvdXQgdGhlIGludGVyZmFjZSB0eXBlICgiU0JQUk8iIG9yIG5vdCksCi1iYXNlZCB1cG9uIHRoZSBhZGRyZXNzLiBUaGF0IGFzc3VtcHRpb24gbWF5IGJlIHdyb25nIChpbml0aWFsaXphdGlvbiB3aWxsIGJlCi1vLmsuLCBidXQgeW91IHdpbGwgZ2V0IEkvTyBlcnJvcnMgZHVyaW5nIG1vdW50KS4gSW4gdGhhdCBjYXNlLCB1c2UgdGhlICJrZXJuZWwKLWNvbW1hbmQgbGluZSIgZmVhdHVyZSBhbmQgc3BlY2lmeSBhZGRyZXNzICYgdHlwZSBhdCBib290IHRpbWUgdG8gZmluZCBvdXQgdGhlCi1yaWdodCBzZXR1cC4KLQotRm9yIGV2ZXJ5ZGF5IHVzZSwgYWRkcmVzcyBhbmQgdHlwZSBzaG91bGQgZ2V0IGNvbmZpZ3VyZWQgd2l0aGluIHNicGNkLmguIFRoYXQKLXdpbGwgc3RvcCB0aGUgYXV0by1wcm9iaW5nIGR1ZSB0byBzdWNjZXNzIHdpdGggdGhlIGZpcnN0IHRyeS4KLQotVGhlIGtlcm5lbCBjb21tYW5kICJzYnBjZD0wIiBzdXBwcmVzc2VzIGVhY2ggYXV0by1wcm9iaW5nIGFuZCBjYXVzZXMKLXRoZSBkcml2ZXIgbm90IHRvIGZpbmQgYW55IGRyaXZlOyBpdCBpcyBtZWFudCBmb3IgcGVvcGxlIHdobyBsb3ZlIHNicGNkCi1zbyBtdWNoIHRoYXQgdGhleSBkbyBub3Qgd2FudCB0byBtaXNzIGl0LCBldmVuIGlmIHRoZXkgbWlzcyB0aGUgZHJpdmVzLiA7LSkgIAotCi1JZiB5b3UgY29uZmlndXJlICIjZGVmaW5lIENEUk9NX1BPUlQgMCIgaW4gc2JwY2QuaCwgdGhlIGF1dG8tcHJvYmluZyBpcwotaW5pdGlhbGx5IGRpc2FibGVkIGFuZCBuZWVkcyBhbiBleHBsaWNpdCBrZXJuZWwgY29tbWFuZCB0byBnZXQgYWN0aXZhdGVkLgotT25jZSBhY3RpdmF0ZWQsIGl0IGRvZXMgbm90IHN0b3AgYmVmb3JlIHN1Y2Nlc3Mgb3IgZW5kLW9mLWxpc3QuIFRoaXMgbWF5IGJlCi11c2VmdWwgd2l0aGluICJ1bml2ZXJzYWwiIENEUk9NIGluc3RhbGxhdGlvbiBib290IGZsb3BwaWVzIChidXQgdXNpbmcgdGhlIAotbG9hZGFibGUgbW9kdWxlIHdvdWxkIGJlIGJldHRlciBiZWNhdXNlIGl0IGFsbG93cyBhbiAiZXh0ZW5kZWQiIGF1dG8tcHJvYmluZwotd2l0aG91dCBmZWFyaW5nIE5FMjAwMCBjYXJkcykuCi0KLVRvIHNob3J0ZW4gdGhlIGF1dG8tcHJvYmluZyBsaXN0IHRvIGEgc2luZ2xlIGVudHJ5LCBzZXQgRElTVFJJQlVUSU9OIDAgd2l0aGluCi1zYnBjZC5oLgotCi0KLVNldHRpbmcgdXAgYWRkcmVzcyBhbmQgaW50ZXJmYWNlIHR5cGU6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3VyIEkvTyBwb3J0IGFkZHJlc3MgaXMgbm90IDB4MzQwLCB5b3UgaGF2ZSB0byBsb29rIGZvciB0aGUgI2RlZmluZXMgbmVhcgotdGhlIGJlZ2lubmluZyBvZiBzYnBjZC5oIGFuZCBjb25maWd1cmUgdGhlbTogc2V0IFNCUFJPIHRvIDAgb3IgMSBvciAyLCBhbmQKLWNoYW5nZSBDRFJPTV9QT1JUIHRvIHRoZSBhZGRyZXNzIG9mIHlvdXIgQ0RST00gSS9PIHBvcnQuCi0KLUFsbW9zdCBhbGwgb2YgdGhlICJTb3VuZEJsYXN0ZXIgY29tcGF0aWJsZSIgY2FyZHMgYmVoYXZlIGxpa2UgdGhlIG5vLXNvdW5kCi1pbnRlcmZhY2VzLCBpLmUuIG5lZWQgU0JQUk8gMCEgCi0KLVdpdGggIm9yaWdpbmFsIiBTQiBQcm8gY2FyZHMsIGFuIGluaXRpYWwgc2V0dGluZyBvZiBDRF92b2x1bWUgdGhyb3VnaCB0aGUKLXNvdW5kIGNhcmQncyBNSVhFUiByZWdpc3RlciBnZXRzIGRvbmUuCi1JZiB5b3UgYXJlIHVzaW5nIGEgImNvbXBhdGlibGUiIHNvdW5kIGNhcmQgb2YgdHlwZXMgIkxhc2VyTWF0ZSIgb3IgIlNQRUEiLAoteW91IGNhbiBzZXQgU09VTkRfQkFTRSAoaW4gc2JwY2QuaCkgdG8gZ2V0IGl0IGRvbmUgd2l0aCB5b3VyIGNhcmQsIHRvby4uLgotCi0KLVVzaW5nIGF1ZGlvIENEczoKLS0tLS0tLS0tLS0tLS0tLS0KLQotV29ya21hbiwgV29ya0JvbmUsIHhjZHBsYXllciwgY2RwbGF5ZXIgYW5kIHRoZSBuaWNlIGxpdHRsZSB0b29sICJjZHBsYXkiIChzZWUKLVJFQURNRS5henRjZCBmcm9tIHRoZSBBenRlY2ggZHJpdmVyIHBhY2thZ2UpIHNob3VsZCB3b3JrLgotCi1UaGUgcHJvZ3JhbSBDRHBsYXllciBsaWtlcyB0byB0YWxrIHRvICIvZGV2L21jZCIgb25seSwgeGNkcGxheWVyIHdhbnRzCi0iL2Rldi9yc3IwIiwgd29ya21hbiBsb3ZlcyAiL2Rldi9zcjAiIG9yICIvZGV2L2Nkcm9tIiAtIHNvLCBtYWtlIHRoZSAKLWFwcHJvcHJpYXRlIGxpbmtzIHRvIHVzZSB0aGVtIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3VwcGx5IHBhcmFtZXRlcnMuCi0KLQotQ29weWluZyBhdWRpbyB0cmFja3M6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBwcm9ncmFtIHdpbGwgY29weSB0cmFjayAxIChvciBhIHBpZWNlIG9mIGl0KSBmcm9tIGFuIGF1ZGlvIENECi1pbnRvIHRoZSBmaWxlICJ0cmFjazAxIjoKLQotLyo9PT09PT09PT09PT09PT09PT09IGJlZ2luIHByb2dyYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotICogcmVhZCBhbiBhdWRpbyB0cmFjayBmcm9tIGEgQ0QKLSAqCi0gKiAoYykgMTk5NCBFYmVyaGFyZCBNb2Vua2ViZXJnIDxlbW9lbmtlQGd3ZGcuZGU+Ci0gKiAgICAgICAgICBtYXkgYmUgdXNlZCAmIGVuaGFuY2VkIGZyZWVseQotICoKLSAqIER1ZSB0byBub24tZXhpc3RlbnQgc3luYyBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggYXVkaW8gZnJhbWUgKG9yIGR1ZQotICogdG8gYSBmaXJtd2FyZSBidWcgd2l0aGluIGFsbCBrbm93biBkcml2ZXM/KSwgaXQgaXMgY3VycmVudGx5IGEga2luZCBvZgotICogZm9ydHVuZSBpZiB0d28gY29uc2VjdXRpdmUgZnJhbWVzIGZpdCB0b2dldGhlci4KLSAqIFVzdWFsbHksIHRoZXkgb3ZlcmxhcCwgb3IgYSBsaXR0bGUgcGllY2UgaXMgbWlzc2luZy4gVGhpcyBoYXBwZW5zIGluIHVuaXRzCi0gKiBvZiAyNC1ieXRlIGNodW5rcy4gSXQgaGFzIHRvIGdldCBmaXhlZCBieSBoaWdoZXItbGV2ZWwgc29mdHdhcmUgKHJlYWRpbmcKLSAqIHVudGlsIGFuIG92ZXJsYXAgb2NjdXJzLCBhbmQgdGhlbiBlbGltaW5hdGUgdGhlIG92ZXJsYXBwaW5nIGNodW5rcykuIAotICogZnRwLmd3ZGcuZGU6L3B1Yi9saW51eC9taXNjL2NkZGEyd2F2LXNicGNkLioudGFyLmd6IGhvbGRzIGFuIGV4YW1wbGUgb2YKLSAqIHN1Y2ggYW4gYWxnb3JpdGhtLgotICogVGhpcyBleGFtcGxlIHByb2dyYW0gZnVydGhlciBpcyBtaXNzaW5nIHRvIG9idGFpbiB0aGUgU3ViQ2hhbm5lbCBkYXRhCi0gKiB3aGljaCBiZWxvbmcgdG8gZWFjaCBmcmFtZS4KLSAqCi0gKiBUaGlzIGlzIG9ubHkgYW4gZXhhbXBsZSBvZiB0aGUgbG93LWxldmVsIGFjY2VzcyByb3V0aW5lLiBUaGUgcmVhZCBkYXRhIGFyZQotICogcHVyZSAxNi1iaXQgQ0REQSB2YWx1ZXM7IHRoZXkgaGF2ZSB0byBnZXQgY29udmVydGVkIHRvIG1ha2Ugc291bmQgb3V0IG9mCi0gKiB0aGVtLgotICogSXQgaXMgbm8gZnVuIHRvIGxpc3RlbiB0byBpdCB3aXRob3V0IHByaW9yIG92ZXJsYXAvdW5kZXJsYXAgY29ycmVjdGlvbiEKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KLQotc3RhdGljIHN0cnVjdCBjZHJvbV90b2NoZHIgaGRyOwotc3RhdGljIHN0cnVjdCBjZHJvbV90b2NlbnRyeSBlbnRyeVsxMDFdOwotc3RhdGljIHN0cnVjdCBjZHJvbV9yZWFkX2F1ZGlvIGFyZzsKLXN0YXRpYyB1X2NoYXIgYnVmZmVyW0NEX0ZSQU1FU0laRV9SQVddOwotc3RhdGljIGludCBkYXRhZmlsZSwgZHJpdmU7Ci1zdGF0aWMgaW50IGksIGosIGxpbWl0LCB0cmFjaywgZXJyOwotc3RhdGljIGNoYXIgZmlsZW5hbWVbMzJdOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotLyoKLSAqIG9wZW4gL2Rldi9jZHJvbQotICovCi0gIGRyaXZlPW9wZW4oIi9kZXYvY2Ryb20iLCAwKTsKLSAgaWYgKGRyaXZlPDApCi0gICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuIGRyaXZlLlxuIik7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotLyoKLSAqIGdldCBUb2NIZWFkZXIKLSAqLwotICBmcHJpbnRmKHN0ZG91dCwgImdldHRpbmcgVG9jSGVhZGVyLi4uXG4iKTsKLSAgZXJyPWlvY3RsKGRyaXZlLCBDRFJPTVJFQURUT0NIRFIsICZoZHIpOwotICBpZiAoZXJyIT0wKQotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZ2V0IFRvY0hlYWRlciAoZXJyb3IgJWQpLlxuIiwgZXJyKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHJpbnRmKHN0ZG91dCwgIlRvY0hlYWRlcjogJWQgJWRcbiIsIGhkci5jZHRoX3RyazAsIGhkci5jZHRoX3RyazEpOwotLyoKLSAqIGdldCBhbmQgZGlzcGxheSBhbGwgVG9jRW50cmllcwotICovCi0gIGZwcmludGYoc3Rkb3V0LCAiZ2V0dGluZyBUb2NFbnRyaWVzLi4uXG4iKTsKLSAgZm9yIChpPTE7aTw9aGRyLmNkdGhfdHJrMSsxO2krKykKLSAgICB7Ci0gICAgICBpZiAoaSE9aGRyLmNkdGhfdHJrMSsxKSBlbnRyeVtpXS5jZHRlX3RyYWNrID0gaTsKLSAgICAgIGVsc2UgZW50cnlbaV0uY2R0ZV90cmFjayA9IENEUk9NX0xFQURPVVQ7Ci0gICAgICBlbnRyeVtpXS5jZHRlX2Zvcm1hdCA9IENEUk9NX0xCQTsKLSAgICAgIGVycj1pb2N0bChkcml2ZSwgQ0RST01SRUFEVE9DRU5UUlksICZlbnRyeVtpXSk7Ci0gICAgICBpZiAoZXJyIT0wKQotCXsKLQkgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZ2V0IFRvY0VudHJ5ICMlZCAoZXJyb3IgJWQpLlxuIiwgaSwgZXJyKTsKLQkgIGV4aXQgKC0xKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZihzdGRvdXQsICJUb2NFbnRyeSAjJWQ6ICUxWCAlMVggJTA2WCAlMDJYXG4iLAotCQkgZW50cnlbaV0uY2R0ZV90cmFjaywKLQkJIGVudHJ5W2ldLmNkdGVfYWRyLAotCQkgZW50cnlbaV0uY2R0ZV9jdHJsLAotCQkgZW50cnlbaV0uY2R0ZV9hZGRyLmxiYSwKLQkJIGVudHJ5W2ldLmNkdGVfZGF0YW1vZGUpOwotCX0KLSAgICB9Ci0gIGZwcmludGYoc3Rkb3V0LCAiZ290IGFsbCBUb2NFbnRyaWVzLlxuIik7Ci0vKgotICogYXNrIGZvciB0cmFjayBudW1iZXIgKG5vdCBpbXBsZW1lbnRlZCBoZXJlKQotICovCi10cmFjaz0xOwotI2lmIDAgLyoganVzdCByZWFkIGEgbGl0dGxlIHBpZWNlICg0IHNlY29uZHMpICovCi1lbnRyeVt0cmFjaysxXS5jZHRlX2FkZHIubGJhPWVudHJ5W3RyYWNrXS5jZHRlX2FkZHIubGJhKzMwMDsKLSNlbmRpZgotLyoKLSAqIHJlYWQgdHJhY2sgaW50byBmaWxlCi0gKi8KLSAgc3ByaW50ZihmaWxlbmFtZSwgInRyYWNrJTAyZFwwIiwgdHJhY2spOwotICBkYXRhZmlsZT1jcmVhdChmaWxlbmFtZSwgMDc1NSk7Ci0gIGlmIChkYXRhZmlsZTwwKQotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiBkYXRhZmlsZSAlcy5cbiIsIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGFyZy5hZGRyLmxiYT1lbnRyeVt0cmFja10uY2R0ZV9hZGRyLmxiYTsKLSAgYXJnLmFkZHJfZm9ybWF0PUNEUk9NX0xCQTsgLyogQ0RST01fTVNGIHdvdWxkIGJlIHBvc3NpYmxlIGhlcmUsIHRvby4gKi8KLSAgYXJnLm5mcmFtZXM9MTsKLSAgYXJnLmJ1Zj0mYnVmZmVyWzBdOwotICBsaW1pdD1lbnRyeVt0cmFjaysxXS5jZHRlX2FkZHIubGJhOwotICBmb3IgKDthcmcuYWRkci5sYmE8bGltaXQ7YXJnLmFkZHIubGJhKyspCi0gICAgewotICAgICAgZXJyPWlvY3RsKGRyaXZlLCBDRFJPTVJFQURBVURJTywgJmFyZyk7Ci0gICAgICBpZiAoZXJyIT0wKQotCXsKLQkgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgcmVhZCBhYnMuIGZyYW1lICMlZCAoZXJyb3IgJWQpLlxuIiwgCi0JCSBhcmcuYWRkci5sYmEsIGVycik7Ci0JfQotICAgICAgaj13cml0ZShkYXRhZmlsZSwgJmJ1ZmZlclswXSwgQ0RfRlJBTUVTSVpFX1JBVyk7Ci0gICAgICBpZiAoaiE9Q0RfRlJBTUVTSVpFX1JBVykKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwiSS9PIGVycm9yIChkYXRhZmlsZSkgYXQgcmVsLiBmcmFtZSAlZFxuIiwKLQkJCSBhcmcuYWRkci5sYmEtZW50cnlbdHJhY2tdLmNkdGVfYWRkci5sYmEpOwotCX0KLSAgICAgIGFyZy5hZGRyLmxiYSsrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09IGVuZCBwcm9ncmFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1BdCBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L21pc2MvY2RkYTJ3YXYtc2JwY2QuKi50YXIuZ3ogaXMgYW4gYWRhcHRlZCB2ZXJzaW9uIG9mCi1IZWlrbyBFaXNzZmVsZHQncyBkaWdpdGFsLWF1ZGlvIHRvIC5XQVYgY29udmVydGVyICh0aGUgb3JpZ2luYWwgaXMgdGhlcmUsIHRvbykuCi1UaGlzIGlzIHByZWxpbWluYXJ5LCBhcyBIZWlrbyBoaW1zZWxmIHdpbGwgY2FyZSBhYm91dCBpdC4KLQotCi1Lbm93biBwcm9ibGVtczoKLS0tLS0tLS0tLS0tLS0tLQotCi1DdXJyZW50bHksIHRoZSBkZXRlY3Rpb24gb2YgZGlzayBjaGFuZ2Ugb3IgcmVtb3ZhbCBpcyBhY3RpdmVseSBkaXNhYmxlZC4KLQotTW9zdCBhdHRlbXB0cyB0byByZWFkIHRoZSBVUEMvRUFOIGNvZGUgcmVzdWx0IGluIGEgc3RyZWFtIG9mIHplcm9lcy4gQWxsIG15Ci1kcml2ZXMgYXJlIG1vc3RseSB0ZWxsaW5nIHRoZXJlIGlzIG5vIFVQQy9FQU4gY29kZSBvbiBkaXNrIG9yIHRoZXJlIGlzLCBidXQgaXQKLWlzIGFuIGFsbC16ZXJvIG51bWJlci4gSSBndWVzcyBub3cgYWxtb3N0IG5vIENEIGhvbGRzIHN1Y2ggYSBudW1iZXIuCi0KLUJ1ZyByZXBvcnRzLCBjb21tZW50cywgd2lzaGVzLCBkb25hdGlvbnMgKHRlY2huaWNhbCBpbmZvcm1hdGlvbiBpcyBhIGRvbmF0aW9uLAotdG9vIDotKSBldGMuIHRvIGVtb2Vua2VAZ3dkZy5kZS4KLQotU25haWxNYWlsIGFkZHJlc3MsIHByZWZlcmFibGUgZm9yIENEIGVkaXRvcnMgaWYgdGhleSB3YW50IHRvIHN1Ym1pdCBhIGZyZWUKLSJjb29wZXJhdGlvbiIgY29weToKLSAgICAgICAgICAgICAgICAgICAgICAgICBFYmVyaGFyZCBNb2Vua2ViZXJnCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVpbmhvbGRzdHIuIDE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgRC0zNzA4MyBHb2V0dGluZ2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2VybWFueQotLS0tCi0KLQotQXBwZW5kaXggLS0gdGhlICJjZHRlc3RlciIgdXRpbGl0eToKLQotLyoKLSAqIGNkdGVzdGVyLmMgLS0gdGVzdCB0aGUgYXVkaW8gZnVuY3Rpb25zIG9mIGEgQ0QgZHJpdmVyCi0gKgotICogKGMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPgotICogICAgICAgICAgcHVibGlzaGVkIHVuZGVyIHRoZSBHUEwKLSAqCi0gKiAgICAgICAgICBtYWRlIHVuZGVyIGhlYXZ5IHVzZSBvZiB0aGUgIlRpbnkgQXVkaW8gQ0QgUGxheWVyIgotICogICAgICAgICAgZnJvbSBXZXJuZXIgWmltbWVybWFubiA8emltbWVybWFAcnouZmh0LWVzc2xpbmdlbi5kZT4KLSAqICAgICAgICAgIChzZWUgbGludXgvZHJpdmVycy9ibG9jay9SRUFETUUuYXp0Y2QpCi0gKi8KLSN1bmRlZiBBWlRfUFJJVkFURV9JT0NUTFMgLyogbm90IHN1cHBvcnRlZCBieSBldmVyeSBDRFJPTSBkcml2ZXIgKi8KLSNkZWZpbmUgU0JQX1BSSVZBVEVfSU9DVExTIC8qIG5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgQ0RST00gZHJpdmVyICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KLQotI2lmZGVmIEFaVF9QUklWQVRFX0lPQ1RMUwotI2luY2x1ZGUgPGxpbnV4Ly4uLy4uL2RyaXZlcnMvY2Ryb20vYXp0Y2QuaD4KLSNlbmRpZiAvKiBBWlRfUFJJVkFURV9JT0NUTFMgKi8KLSNpZmRlZiBTQlBfUFJJVkFURV9JT0NUTFMKLSNpbmNsdWRlIDxsaW51eC8uLi8uLi9kcml2ZXJzL2Nkcm9tL3NicGNkLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNlbmRpZiAvKiBTQlBfUFJJVkFURV9JT0NUTFMgKi8KLQotc3RydWN0IGNkcm9tX3RvY2hkciBoZHI7Ci1zdHJ1Y3QgY2Ryb21fdG9jaGRyIHRvY0hkcjsKLXN0cnVjdCBjZHJvbV90b2NlbnRyeSBUb2NFbnRyeVsxMDFdOwotc3RydWN0IGNkcm9tX3RvY2VudHJ5IGVudHJ5Owotc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiBtc19pbmZvOwotc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8gcmVhZF9hdWRpbzsKLXN0cnVjdCBjZHJvbV90aSB0aTsKLXN0cnVjdCBjZHJvbV9zdWJjaG5sIHN1YmNobmw7Ci1zdHJ1Y3QgY2Ryb21fbXNmIG1zZjsKLXN0cnVjdCBjZHJvbV92b2xjdHJsIHZvbGN0cmw7Ci0jaWZkZWYgQVpUX1BSSVZBVEVfSU9DVExTCi11bmlvbgotewotCXN0cnVjdCBjZHJvbV9tc2YgbXNmOwotCXVuc2lnbmVkIGNoYXIgYnVmW0NEX0ZSQU1FU0laRV9SQVddOwotfSBhenQ7Ci0jZW5kaWYgLyogQVpUX1BSSVZBVEVfSU9DVExTICovCi1pbnQgaSwgaTEsIGkyLCBpMywgaiwgazsKLXVuc2lnbmVkIGNoYXIgc2VxdWVuY2U9MDsKLXVuc2lnbmVkIGNoYXIgY29tbWFuZFs4MF07Ci11bnNpZ25lZCBjaGFyIGZpcnN0PTEsIGxhc3Q9MTsKLWNoYXIgKmRlZmF1bHRfZGV2aWNlPSIvZGV2L2Nkcm9tIjsKLWNoYXIgZGV2WzIwXTsKLWNoYXIgZmlsZW5hbWVbMjBdOwotaW50IGRyaXZlOwotaW50IGRhdGFmaWxlOwotaW50IHJjOwotCi12b2lkIGhlbHAodm9pZCkKLXsKLQlwcmludGYoIkF2YWlsYWJsZSBDb21tYW5kczpcbiIpOwotCXByaW50ZigiU1RPUCAgICAgICAgICBzICAgICAgRUpFQ1QgICAgICAgIGUgICAgICAgUVVJVCAgICAgICAgIHFcbiIpOwotCXByaW50ZigiUExBWSBUUkFDSyAgICB0ICAgICAgUEFVU0UgICAgICAgIHAgICAgICAgUkVTVU1FICAgICAgIHJcbiIpOwotCXByaW50ZigiTkVYVCBUUkFDSyAgICBuICAgICAgUkVQRUFUIExBU1QgIGwgICAgICAgSEVMUCAgICAgICAgIGhcbiIpOwotCXByaW50ZigiU1VCQ0hBTk5FTF9RICBjICAgICAgVFJBQ0sgSU5GTyAgIGkgICAgICAgUExBWSBBVCAgICAgIGFcbiIpOwotCXByaW50ZigiUkVBRCAgICAgICAgICBkICAgICAgUkVBRCBSQVcgICAgIHcgICAgICAgUkVBRCBBVURJTyAgIEFcbiIpOwotCXByaW50ZigiTVMtSU5GTyAgICAgICBNICAgICAgVE9DICAgICAgICAgIFQgICAgICAgU1RBUlQgICAgICAgIFNcbiIpOwotCXByaW50ZigiU0VUIEVKRUNUU1cgICBYICAgICAgREVWSUNFICAgICAgIEQgICAgICAgREVCVUcgICAgICAgIFlcbiIpOwotCXByaW50ZigiQVVESU9fQlVGU0laICBaICAgICAgUkVTRVQgICAgICAgIFIgICAgICAgU0VUIFZPTFVNRSAgIHZcbiIpOwotCXByaW50ZigiR0VUIFZPTFVNRSAgICBWXG4iKTsKLX0KLQotLyoKLSAqICBjb252ZXJ0IE1TRiBudW1iZXIgKDMgYnl0ZXMgb25seSkgdG8gTG9naWNhbF9CbG9ja19BZGRyZXNzIAotICovCi1pbnQgbXNmMmxiYSh1X2NoYXIgKm1zZikKLXsKLQlpbnQgaTsKLQkKLQlpPShtc2ZbMF0gKiBDRF9TRUNTICsgbXNmWzFdKSAqIENEX0ZSQU1FUyArIG1zZlsyXSAtIENEX0JMT0NLX09GRlNFVDsKLQlpZiAoaTwwKSByZXR1cm4gKDApOwotCXJldHVybiAoaSk7Ci19Ci0vKgotICogIGNvbnZlcnQgbG9naWNhbF9ibG9ja19hZGRyZXNzIHRvIG0tcy1mX251bWJlciAoMyBieXRlcyBvbmx5KQotICovCi12b2lkIGxiYTJtc2YoaW50IGxiYSwgdW5zaWduZWQgY2hhciAqbXNmKQotewotCWxiYSArPSBDRF9CTE9DS19PRkZTRVQ7Ci0JbXNmWzBdID0gbGJhIC8gKENEX1NFQ1MqQ0RfRlJBTUVTKTsKLQlsYmEgJT0gQ0RfU0VDUypDRF9GUkFNRVM7Ci0JbXNmWzFdID0gbGJhIC8gQ0RfRlJBTUVTOwotCW1zZlsyXSA9IGxiYSAlIENEX0ZSQU1FUzsKLX0KLQotaW50IGluaXRfZHJpdmUoY2hhciAqZGV2KQotewotCXVuc2lnbmVkIGNoYXIgbXNmX2VudFszXTsKLQotCS8qCi0JICogb3BlbiB0aGUgZGV2aWNlCi0JICovCi0JZHJpdmU9b3BlbihkZXYsMCk7Ci0JaWYgKGRyaXZlPDApIHJldHVybiAoLTEpOwotCS8qCi0JICogZ2V0IFRvY0hlYWRlcgotCSAqLwotCXByaW50ZigiZ2V0dGluZyBUb2NIZWFkZXIuLi5cbiIpOwotCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0hEUiwmaGRyKTsKLQlpZiAocmMhPTApCi0JewotCQlwcmludGYoImNhbid0IGdldCBUb2NIZWFkZXIgKGVycm9yICVkKS5cbiIscmMpOwotCQlyZXR1cm4gKC0yKTsKLQl9Ci0JZWxzZQotCQlmaXJzdD1oZHIuY2R0aF90cmswOwotCQlsYXN0PWhkci5jZHRoX3RyazE7Ci0JCXByaW50ZigiVG9jSGVhZGVyOiAlZCAlZFxuIixoZHIuY2R0aF90cmswLGhkci5jZHRoX3RyazEpOwotCS8qCi0JICogZ2V0IGFuZCBkaXNwbGF5IGFsbCBUb2NFbnRyaWVzCi0JICovCi0JcHJpbnRmKCJnZXR0aW5nIFRvY0VudHJpZXMuLi5cbiIpOwotCWZvciAoaT0xO2k8PWhkci5jZHRoX3RyazErMTtpKyspCi0JewotCQlpZiAoaSE9aGRyLmNkdGhfdHJrMSsxKSBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrID0gaTsKLQkJZWxzZSBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrID0gQ0RST01fTEVBRE9VVDsKLQkJVG9jRW50cnlbaV0uY2R0ZV9mb3JtYXQgPSBDRFJPTV9MQkE7Ci0JCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0VOVFJZLCZUb2NFbnRyeVtpXSk7Ci0JCWlmIChyYyE9MCkKLQkJewotCQkJcHJpbnRmKCJjYW4ndCBnZXQgVG9jRW50cnkgIyVkIChlcnJvciAlZCkuXG4iLGkscmMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbGJhMm1zZihUb2NFbnRyeVtpXS5jZHRlX2FkZHIubGJhLCZtc2ZfZW50WzBdKTsKLQkJCWlmIChUb2NFbnRyeVtpXS5jZHRlX3RyYWNrPT1DRFJPTV9MRUFET1VUKQotCQkJewotCQkJCXByaW50ZigiVG9jRW50cnkgIyUwMlg6ICUxWCAlMVggJTAyZDolMDJkOiUwMmQgKGxiYTogMHglMDZYKSAlMDJYXG4iLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkciwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9jdHJsLAotCQkJCSAgICAgICBtc2ZfZW50WzBdLAotCQkJCSAgICAgICBtc2ZfZW50WzFdLAotCQkJCSAgICAgICBtc2ZfZW50WzJdLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkZHIubGJhLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2RhdGFtb2RlKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGYoIlRvY0VudHJ5ICMlMDJkOiAlMVggJTFYICUwMmQ6JTAyZDolMDJkIChsYmE6IDB4JTA2WCkgJTAyWFxuIiwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV90cmFjaywKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZHIsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfY3RybCwKLQkJCQkgICAgICAgbXNmX2VudFswXSwKLQkJCQkgICAgICAgbXNmX2VudFsxXSwKLQkJCQkgICAgICAgbXNmX2VudFsyXSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZGRyLmxiYSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9kYXRhbW9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIChoZHIuY2R0aF90cmsxKTsgLyogbnVtYmVyIG9mIHRyYWNrcyAqLwotfQotCi12b2lkIGRpc3BsYXkoaW50IHNpemUsdW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotCWs9MDsKLQlnZXRjaGFyKCk7Ci0JZm9yIChpPTA7aTwoc2l6ZSsxKS8xNjtpKyspCi0JewotCQlwcmludGYoIiU0ZDoiLGkqMTYpOwotCQlmb3IgKGo9MDtqPDE2O2orKykKLQkJewotCQkJcHJpbnRmKCIgJTAyWCIsYnVmZmVyW2kqMTYral0pOwotCQl9Ci0JCXByaW50ZigiICAiKTsKLQkJZm9yIChqPTA7ajwxNjtqKyspCi0JCXsKLQkJCWlmIChpc2FsbnVtKGJ1ZmZlcltpKjE2K2pdKSkgCi0JCQkJcHJpbnRmKCIlYyIsYnVmZmVyW2kqMTYral0pOwotCQkJZWxzZQotCQkJCXByaW50ZigiLiIpOwotCQl9Ci0JCXByaW50ZigiXG4iKTsgCi0JCWsrKzsKLQkJaWYgKGs+PTIwKQotCQl7Ci0JCQlwcmludGYoInByZXNzIEVOVEVSIHRvIGNvbnRpbnVlXG4iKTsKLQkJCWdldGNoYXIoKTsKLQkJCWs9MDsKLQkJfQotCX0gCi19IAotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXByaW50ZigiXG5UZXN0aW5nIHRvb2wgZm9yIGEgQ0RST00gZHJpdmVyJ3MgYXVkaW8gZnVuY3Rpb25zIFYwLjFcbiIpOwotCXByaW50ZigiKEMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPlxuIik7Ci0JcHJpbnRmKCJpbml0aWFsaXppbmcuLi5cbiIpOwotCQotCXJjPWluaXRfZHJpdmUoZGVmYXVsdF9kZXZpY2UpOwotCWlmIChyYzwwKSBwcmludGYoImNvdWxkIG5vdCBvcGVuICVzIChyYz0lZCkuXG4iLGRlZmF1bHRfZGV2aWNlLHJjKTsKLQloZWxwKCk7Ci0Jd2hpbGUgKDEpCi0JewotCQlwcmludGYoIkdpdmUgYSBvbmUtbGV0dGVyIGNvbW1hbmQgKGggPSBoZWxwKTogIik7Ci0JCXNjYW5mKCIlcyIsY29tbWFuZCk7Ci0JCWNvbW1hbmRbMV09MDsKLQkJc3dpdGNoIChjb21tYW5kWzBdKQotCQl7Ci0JCWNhc2UgJ0QnOgotCQkJcHJpbnRmKCJkZXZpY2UgbmFtZSAoZi5lLiAvZGV2L3NicGNkMyk6ID8gIik7Ci0JCQlzY2FuZigiJXMiLCZkZXYpOwotCQkJY2xvc2UoZHJpdmUpOwotCQkJcmM9aW5pdF9kcml2ZShkZXYpOwotCQkJaWYgKHJjPDApIHByaW50ZigiY291bGQgbm90IG9wZW4gJXMgKHJjICVkKS5cbiIsZGV2LHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdlJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NRUpFQ1QpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01FSkVDVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUEFVU0UpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QQVVTRTogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdyJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVTVU1FKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NUkVTVU1FOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NU1RPUDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdTJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RBUlQpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01TVEFSVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICd0JzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKTsKLQkJCWlmIChyYzwwKQotCQkJewotCQkJCXByaW50ZigiQ0RST01SRUFEVE9DSERSOiByYz0lZC5cbiIscmMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZmlyc3Q9dG9jSGRyLmNkdGhfdHJrMDsKLQkJCWxhc3Q9IHRvY0hkci5jZHRoX3RyazE7Ci0JCQlpZiAoKGZpcnN0PT0wKXx8KGZpcnN0Pmxhc3QpKQotCQkJewotCQkJCXByaW50ZiAoIi0tZ290IGludmFsaWQgVE9DIGRhdGEuXG4iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGYoIi0tZW50ZXIgdHJhY2sgbnVtYmVyKGZpcnN0PSVkLCBsYXN0PSVkKTogIixmaXJzdCxsYXN0KTsKLQkJCQlzY2FuZigiJWQiLCZpMSk7Ci0JCQkJdGkuY2R0aV90cmswPWkxOwotCQkJCWlmICh0aS5jZHRpX3RyazA8Zmlyc3QpIHRpLmNkdGlfdHJrMD1maXJzdDsKLQkJCQlpZiAodGkuY2R0aV90cmswPmxhc3QpIHRpLmNkdGlfdHJrMD1sYXN0OwotCQkJCXRpLmNkdGlfaW5kMD0wOwotCQkJCXRpLmNkdGlfdHJrMT1sYXN0OwotCQkJCXRpLmNkdGlfaW5kMT0wOwotCQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RPUCk7Ci0JCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01QTEFZVFJLSU5ELCZ0aSk7Ci0JCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QTEFZVFJLSU5EOiByYz0lZC5cbiIscmMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmICgrK3RpLmNkdGlfdHJrMD5sYXN0KSB0aS5jZHRpX3RyazA9bGFzdDsKLQkJCXRpLmNkdGlfaW5kMD0wOwotCQkJdGkuY2R0aV90cmsxPWxhc3Q7Ci0JCQl0aS5jZHRpX2luZDE9MDsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUExBWVRSS0lORCwmdGkpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QTEFZVFJLSU5EOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmICgtLXRpLmNkdGlfdHJrMDxmaXJzdCkgdGkuY2R0aV90cmswPWZpcnN0OwotCQkJdGkuY2R0aV9pbmQwPTA7Ci0JCQl0aS5jZHRpX3RyazE9bGFzdDsKLQkJCXRpLmNkdGlfaW5kMT0wOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01QTEFZVFJLSU5ELCZ0aSk7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVBMQVlUUktJTkQ6IHJjPSVkLlxuIixyYyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnYyc6Ci0JCQlzdWJjaG5sLmNkc2NfZm9ybWF0PUNEUk9NX01TRjsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1VCQ0hOTCwmc3ViY2hubCk7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVNVQkNITkw6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRmKCJBdWRpb1N0YXR1czolcyAgVHJhY2s6JWQgIE1vZGU6JWQgIE1TRj0lMDJkOiUwMmQ6JTAyZFxuIiwKLQkJCQkgICAgICAgc3ViY2hubC5jZHNjX2F1ZGlvc3RhdHVzPT1DRFJPTV9BVURJT19QTEFZID8gIlBMQVlJTkciOiJOT1QgUExBWUlORyIsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY190cmssc3ViY2hubC5jZHNjX2FkciwgCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5taW51dGUsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5mcmFtZSk7Ci0JCQl9Ci0JCQlicmVhazsgICAgICAgICAgICAgIAotCQljYXNlICdpJzoKLQkJCXByaW50ZigiVHJhY2sgTm8uOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkxKTsKLQkJCWVudHJ5LmNkdGVfdHJhY2s9aTE7Ci0JCQlpZiAoZW50cnkuY2R0ZV90cmFjazxmaXJzdCkgZW50cnkuY2R0ZV90cmFjaz1maXJzdDsKLQkJCWlmIChlbnRyeS5jZHRlX3RyYWNrPmxhc3QpICBlbnRyeS5jZHRlX3RyYWNrPWxhc3Q7Ci0JCQllbnRyeS5jZHRlX2Zvcm1hdD1DRFJPTV9NU0Y7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVJFQURUT0NFTlRSWSwmZW50cnkpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01SRUFEVE9DRU5UUlk6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRmKCJNb2RlICVkIFRyYWNrLCBzdGFydHMgYXQgJTAyZDolMDJkOiUwMmRcbiIsCi0JCQkJICAgICAgIGVudHJ5LmNkdGVfYWRyLAotCQkJCSAgICAgICBlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwKLQkJCQkgICAgICAgZW50cnkuY2R0ZV9hZGRyLm1zZi5zZWNvbmQsCi0JCQkJICAgICAgIGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ2EnOgotCQkJcHJpbnRmKCJBZGRyZXNzIChtaW46c2VjOmZybSkgICIpOwotCQkJc2NhbmYoIiVkOiVkOiVkIiwmaTEsJmkyLCZpMyk7Ci0JCQltc2YuY2Rtc2ZfbWluMD1pMTsKLQkJCW1zZi5jZG1zZl9zZWMwPWkyOwotCQkJbXNmLmNkbXNmX2ZyYW1lMD1pMzsKLQkJCWlmIChtc2YuY2Rtc2Zfc2VjMD41OSkgbXNmLmNkbXNmX3NlYzA9NTk7Ci0JCQlpZiAobXNmLmNkbXNmX2ZyYW1lMD43NCkgbXNmLmNkbXNmX2ZyYW1lMD03NDsKLQkJCWxiYTJtc2YoVG9jRW50cnlbbGFzdCsxXS5jZHRlX2FkZHIubGJhLTEsJm1zZi5jZG1zZl9taW4xKTsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RPUCk7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVBMQVlNU0YsJm1zZik7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVBMQVlNU0Y6IHJjPSVkLlxuIixyYyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnVic6Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVZPTFJFQUQsJnZvbGN0cmwpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01WT0xDVFJMOiByYz0lZC5cbiIscmMpOwotCQkJcHJpbnRmKCJWb2x1bWU6IGNoYW5uZWwgMCAobGVmdCkgJWQsIGNoYW5uZWwgMSAocmlnaHQpICVkXG4iLHZvbGN0cmwuY2hhbm5lbDAsdm9sY3RybC5jaGFubmVsMSk7Ci0JCQlicmVhazsgIAotCQljYXNlICdSJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVTRVQpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01SRVNFVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotI2lmZGVmIEFaVF9QUklWQVRFX0lPQ1RMUyAvKm5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgQ0RST00gZHJpdmVyKi8KLQkJY2FzZSAnZCc6Ci0JCQlwcmludGYoIkFkZHJlc3MgKG1pbjpzZWM6ZnJtKSAgIik7Ci0JCQlzY2FuZigiJWQ6JWQ6JWQiLCZpMSwmaTIsJmkzKTsKLQkJCWF6dC5tc2YuY2Rtc2ZfbWluMD1pMTsKLQkJCWF6dC5tc2YuY2Rtc2Zfc2VjMD1pMjsKLQkJCWF6dC5tc2YuY2Rtc2ZfZnJhbWUwPWkzOwotCQkJaWYgKGF6dC5tc2YuY2Rtc2Zfc2VjMD41OSkgYXp0Lm1zZi5jZG1zZl9zZWMwPTU5OwotCQkJaWYgKGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPjc0KSBhenQubXNmLmNkbXNmX2ZyYW1lMD03NDsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRE1PREUxLCZhenQubXNmKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NUkVBRE1PREUxOiByYz0lZC5cbiIscmMpOwotCQkJZWxzZSBkaXNwbGF5KENEX0ZSQU1FU0laRSxhenQuYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlICd3JzoKLQkJCXByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotCQkJc2NhbmYoIiVkOiVkOiVkIiwmaTEsJmkyLCZpMyk7Ci0JCQlhenQubXNmLmNkbXNmX21pbjA9aTE7Ci0JCQlhenQubXNmLmNkbXNmX3NlYzA9aTI7Ci0JCQlhenQubXNmLmNkbXNmX2ZyYW1lMD1pMzsKLQkJCWlmIChhenQubXNmLmNkbXNmX3NlYzA+NTkpIGF6dC5tc2YuY2Rtc2Zfc2VjMD01OTsKLQkJCWlmIChhenQubXNmLmNkbXNmX2ZyYW1lMD43NCkgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9NzQ7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVJFQURNT0RFMiwmYXp0Lm1zZik7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVJFQURNT0RFMjogcmM9JWQuXG4iLHJjKTsKLQkJCWVsc2UgZGlzcGxheShDRF9GUkFNRVNJWkVfUkFXLGF6dC5idWYpOyAvKiBjdXJyZW50bHkgb25seSAyMzM2ICovCi0JCQlicmVhazsgIAotI2VuZGlmCi0JCWNhc2UgJ3YnOgotCQkJcHJpbnRmKCItLUNoYW5uZWwgMCAoTGVmdCkgICgwLTI1NSk6ICIpOwotCQkJc2NhbmYoIiVkIiwmaTEpOwotCQkJdm9sY3RybC5jaGFubmVsMD1pMTsKLQkJCXByaW50ZigiLS1DaGFubmVsIDEgKFJpZ2h0KSAoMC0yNTUpOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkxKTsKLQkJCXZvbGN0cmwuY2hhbm5lbDE9aTE7Ci0JCQl2b2xjdHJsLmNoYW5uZWwyPTA7Ci0JCQl2b2xjdHJsLmNoYW5uZWwzPTA7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVZPTENUUkwsJnZvbGN0cmwpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01WT0xDVFJMOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7ICAKLQkJY2FzZSAncSc6Ci0JCQljbG9zZShkcml2ZSk7Ci0JCQlleGl0KDApOwotCQljYXNlICdoJzoKLQkJCWhlbHAoKTsKLQkJCWJyZWFrOwotCQljYXNlICdUJzogLyogZGlzcGxheSBUT0MgZW50cnkgLSB3aXRob3V0IGludm9sdmluZyB0aGUgZHJpdmVyICovCi0JCQlzY2FuZigiJWQiLCZpKTsKLQkJCWlmICgoaTxoZHIuY2R0aF90cmswKXx8KGk+aGRyLmNkdGhfdHJrMSkpCi0JCQkJcHJpbnRmKCJpbnZhbGlkIHRyYWNrIG51bWJlci5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ZigiVG9jRW50cnkgJTAyZDogYWRyPSUwMVggY3RybD0lMDFYIG1zZj0lMDJkOiUwMmQ6JTAyZCBtb2RlPSUwMlhcbiIsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfdHJhY2ssCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfYWRyLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2N0cmwsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfYWRkci5tc2YubWludXRlLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkZHIubXNmLnNlY29uZCwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZGRyLm1zZi5mcmFtZSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9kYXRhbW9kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnQSc6IC8qIHJlYWQgYXVkaW8gZGF0YSBpbnRvIGZpbGUgKi8KLQkJCXByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcm0pID8gIik7Ci0JCQlzY2FuZigiJWQ6JWQ6JWQiLCZpMSwmaTIsJmkzKTsKLQkJCXJlYWRfYXVkaW8uYWRkci5tc2YubWludXRlPWkxOwotCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5zZWNvbmQ9aTI7Ci0JCQlyZWFkX2F1ZGlvLmFkZHIubXNmLmZyYW1lPWkzOwotCQkJcmVhZF9hdWRpby5hZGRyX2Zvcm1hdD1DRFJPTV9NU0Y7Ci0JCQlwcmludGYoIiMgb2YgZnJhbWVzID8gIik7Ci0JCQlzY2FuZigiJWQiLCZpMSk7Ci0JCQlyZWFkX2F1ZGlvLm5mcmFtZXM9aTE7Ci0JCQlrPXJlYWRfYXVkaW8ubmZyYW1lcypDRF9GUkFNRVNJWkVfUkFXOwotCQkJcmVhZF9hdWRpby5idWY9bWFsbG9jKGspOwotCQkJaWYgKHJlYWRfYXVkaW8uYnVmPT1OVUxMKQotCQkJewotCQkJCXByaW50ZigiY2FuJ3QgbWFsbG9jICVkIGJ5dGVzLlxuIixrKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNwcmludGYoZmlsZW5hbWUsImF1ZGlvXyUwMmQlMDJkJTAyZF8lMDJkLiUwMmRcMCIsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5taW51dGUsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5zZWNvbmQsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5mcmFtZSwKLQkJCQlyZWFkX2F1ZGlvLm5mcmFtZXMsCi0JCQkJKytzZXF1ZW5jZSk7Ci0JCQlkYXRhZmlsZT1jcmVhdChmaWxlbmFtZSwgMDc1NSk7Ci0JCQlpZiAoZGF0YWZpbGU8MCkKLQkJCXsKLQkJCQlwcmludGYoImNhbid0IG9wZW4gZGF0YWZpbGUgJXMuXG4iLGZpbGVuYW1lKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBREFVRElPLCZyZWFkX2F1ZGlvKTsKLQkJCWlmIChyYyE9MCkKLQkJCXsKLQkJCQlwcmludGYoIkNEUk9NUkVBREFVRElPOiByYz0lZC5cbiIscmMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJjPXdyaXRlKGRhdGFmaWxlLCZyZWFkX2F1ZGlvLmJ1ZixrKTsKLQkJCQlpZiAocmMhPWspIHByaW50ZigiZGF0YWZpbGUgSS9PIGVycm9yICglZCkuXG4iLHJjKTsKLQkJCX0KLQkJCWNsb3NlKGRhdGFmaWxlKTsKLQkJCWJyZWFrOwotCQljYXNlICdYJzogLyogc2V0IEVKRUNUX1NXICgwOiBkaXNhYmxlLCAxOiBlbmFibGUgYXV0by1lamVjdGluZykgKi8KLQkJCXNjYW5mKCIlZCIsJmkpOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01FSkVDVF9TVyxpKTsKLQkJCWlmIChyYyE9MCkKLQkJCQlwcmludGYoIkNEUk9NRUpFQ1RfU1c6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCJFSkVDVF9TVyBzZXQgdG8gJWRcbiIsaSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnTSc6IC8qIGdldCB0aGUgbXVsdGlzZXNzaW9uIHJlZGlyZWN0aW9uIGluZm8gKi8KLQkJCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTEJBOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01NVUxUSVNFU1NJT04sJm1zX2luZm8pOwotCQkJaWYgKHJjIT0wKQotCQkJewotCQkJCXByaW50ZigiQ0RST01NVUxUSVNFU1NJT04obGJhKTogcmM9JWQuXG4iLHJjKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobXNfaW5mby54YV9mbGFnKSBwcmludGYoIk11bHRpU2Vzc2lvbiBvZmZzZXQgKGxiYSk6ICVkICgweCUwNlgpXG4iLG1zX2luZm8uYWRkci5sYmEsbXNfaW5mby5hZGRyLmxiYSk7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRmKCJ0aGlzIENEIGlzIG5vdCBhbiBYQSBkaXNrLlxuIik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTVNGOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01NVUxUSVNFU1NJT04sJm1zX2luZm8pOwotCQkJaWYgKHJjIT0wKQotCQkJewotCQkJCXByaW50ZigiQ0RST01NVUxUSVNFU1NJT04obXNmKTogcmM9JWQuXG4iLHJjKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobXNfaW5mby54YV9mbGFnKQotCQkJCQlwcmludGYoIk11bHRpU2Vzc2lvbiBvZmZzZXQgKG1zZik6ICUwMmQ6JTAyZDolMDJkICgweCUwMlglMDJYJTAyWClcbiIsCi0JCQkJCSAgICAgICBtc19pbmZvLmFkZHIubXNmLm1pbnV0ZSwKLQkJCQkJICAgICAgIG1zX2luZm8uYWRkci5tc2Yuc2Vjb25kLAotCQkJCQkgICAgICAgbXNfaW5mby5hZGRyLm1zZi5mcmFtZSwKLQkJCQkJICAgICAgIG1zX2luZm8uYWRkci5tc2YubWludXRlLAotCQkJCQkgICAgICAgbXNfaW5mby5hZGRyLm1zZi5zZWNvbmQsCi0JCQkJCSAgICAgICBtc19pbmZvLmFkZHIubXNmLmZyYW1lKTsKLQkJCQllbHNlIHByaW50ZigidGhpcyBDRCBpcyBub3QgYW4gWEEgZGlzay5cbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgU0JQX1BSSVZBVEVfSU9DVExTCi0JCWNhc2UgJ1knOiAvKiBzZXQgdGhlIGRyaXZlcidzIG1lc3NhZ2UgbGV2ZWwgKi8KLSNpZiAwIC8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLQkJCXByaW50ZigiZW50ZXIgc3dpdGNoIG5hbWUgKGYuZS4gREJHX0NNRCk6ICIpOwotCQkJc2NhbmYoIiVzIiwmZGJnX3N3aXRjaCk7Ci0JCQlqPWdldF9kYmdfbnVtKGRiZ19zd2l0Y2gpOwotI2Vsc2UKLQkJCXByaW50ZigiZW50ZXIgRERJT0NTREJHIHN3aXRjaCBudW1iZXI6ICIpOwotCQkJc2NhbmYoIiVkIiwmaik7Ci0jZW5kaWYKLQkJCXByaW50ZigiZW50ZXIgMCBmb3IgXCJvZmZcIiwgMSBmb3IgXCJvblwiOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkpOwotCQkJaWYgKGk9PTApIGp8PTB4ODA7Ci0JCQlwcmludGYoImNhbGxpbmcgXCJpb2N0bChkcml2ZSxERElPQ1NEQkcsJWQpXCJcbiIsaik7Ci0JCQlyYz1pb2N0bChkcml2ZSxERElPQ1NEQkcsaik7Ci0JCQlwcmludGYoIkRESU9DU0RCRzogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdaJzogLyogc2V0IHRoZSBhdWRpbyBidWZmZXIgc2l6ZSAqLwotCQkJcHJpbnRmKCIjIGZyYW1lcyB3YW50ZWQ6ID8gIik7Ci0JCQlzY2FuZigiJWQiLCZqKTsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NQVVESU9CVUZTSVosaik7Ci0JCQlwcmludGYoIiVkIGZyYW1lcyBncmFudGVkLlxuIixyYyk7Ci0JCQlicmVhazsKLSNlbmRpZiAvKiBTQlBfUFJJVkFURV9JT0NUTFMgKi8KLQkJZGVmYXVsdDoKLQkJCXByaW50ZigidW5rbm93biBjb21tYW5kOiBcIiVzXCIuXG4iLGNvbW1hbmQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zamNkIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9zamNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGExNDg0Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2pjZAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSAtLSBEb2N1bWVudGF0aW9uL2Nkcm9tL3NqY2QKLQkJCQk4MCUgb2YgdGhlIHdvcmsgdGFrZXMgMjAlIG9mIHRoZSB0aW1lLAotCQkJCTIwJSBvZiB0aGUgd29yayB0YWtlcyA4MCUgb2YgdGhlIHRpbWUuLi4KLQkJCQkJCShNdXJwaHkncyBsYXcpCi0KLQkJCQlPbmNlIHN0YXJ0ZWQsIHRyYWluaW5nIGNhbiBub3QgYmUgc3RvcHBlZC4uLgotCQkJCQkJKFN0YXIgV2FycykKLQotVGhpcyBpcyB0aGUgUkVBRE1FIGZvciB0aGUgc2pjZCBjZHJvbSBkcml2ZXIsIHZlcnNpb24gMS42LgotCi1UaGlzIGZpbGUgaXMgbWVhbnQgYXMgYSB0aXBzICYgdHJpY2tzIGVkZ2UgZm9yIHRoZSB1c2FnZSBvZiB0aGUgU0FOWU8gQ0RSLUg5NEEKLWNkcm9tIGRyaXZlLiBJdCB3aWxsIGdyb3cgYXMgdGhlIHF1ZXN0aW9ucyBhcmlzZS4gOy0pCi1Gb3IgaW5mbyBvbiBjb25maWd1cmluZyB0aGUgSVNQMTYgc291bmQgY2FyZCBsb29rIGF0IERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYuCi0KLVRoZSBkcml2ZXIgc2hvdWxkIHdvcmsgd2l0aCBhbnkgb2YgdGhlIFBhbmFzb25pYywgU29ueSBvciBNaXRzdW1pIHN0eWxlCi1DRFJPTSBpbnRlcmZhY2VzLgotVGhlIGNkcm9tIGludGVyZmFjZSBvbiBNZWRpYSBNYWdpYydzIHNvZnQgY29uZmlndXJhYmxlIHNvdW5kIGNhcmQgSVNQMTYsCi13aGljaCB1c2VkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIsIGlzIG5vdyBzdXBwb3J0ZWQgaW4gYSBzZXBhcmF0ZSBtb2R1bGUuCi1UaGlzIGluaXRpYWxpc2F0aW9uIG1vZHVsZSB3aWxsIHByb2JhYmx5IGFsc28gd29yayB3aXRoIG90aGVyIGludGVyZmFjZXMKLWJhc2VkIG9uIGFuIE9QVGkgODJDOTI4IG9yIDgyQzkyOSBjaGlwIChsaWtlIE1BRDE2IGFuZCBNb3phcnQpOiBzZWUgdGhlCi1kb2N1bWVudGF0aW9uIERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYuCi0KLVRoZSBkZXZpY2UgbWFqb3IgZm9yIHNqY2QgaXMgMTgsIGFuZCBtaW5vciBpcyAwLiBDcmVhdGUgYSBibG9jayBzcGVjaWFsCi1maWxlIGluIHlvdXIgL2RldiBkaXJlY3RvcnkgKGUuZy4sIC9kZXYvc2pjZCkgd2l0aCB0aGVzZSBudW1iZXJzLgotKEZvciB0aG9zZSB3aG8gZG9uJ3Qga25vdywgYmVpbmcgcm9vdCBhbmQgZG9pbmcgdGhlIGZvbGxvd2luZyBzaG91bGQgZG8KLXRoZSB0cmljazoKLSAgbWtub2QgLW0gNjQ0IC9kZXYvc2pjZCBiIDE4IDAKLWFuZCBtb3VudCB0aGUgY2Ryb20gYnkgL2Rldi9zamNkKS4KLQotVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZToKLSAgYmFzZSBhZGRyZXNzIDB4MzQwCi0gIG5vIGlycQotICBubyBkbWEKLShBY3R1YWxseSB0aGUgQ0RSLUg5NEEgZG9lc24ndCBrbm93IGhvdyB0byB1c2UgaXJxIGFuZCBkbWEuKQotQXMgb2YgdmVyc2lvbiAxLjIsIHNldHRpbmcgYmFzZSBhZGRyZXNzIGF0IGJvb3QgdGltZSBpcyBzdXBwb3J0ZWQKLXRocm91Z2ggdGhlIHVzZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9uczogdHlwZSBhdCB0aGUgImJvb3Q6IiBwcm9tcHQ6Ci0gIGxpbnV4IHNqY2Q9PGJhc2VfYWRkcmVzcz4KLSh3aGVyZSB5b3Ugd291bGQgdXNlIHRoZSBrZXJuZWwgbGFiZWxlZCAibGludXgiIGluIGxpbG8ncyBjb25maWd1cmF0aW9uCi1maWxlIC9ldGMvbGlsby5jb25mKS4gWW91IGNvdWxkIGFsc28gdXNlICdhcHBlbmQ9InNqY2Q9PGNvbmZpZ3VyYXRpb25faW5mbz4iJwotaW4gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24gb2YgL2V0Yy9saWxvLmNvbmYKLUlmIHlvdSdyZSBidWlsZGluZyBhIGtlcm5lbCB5b3Vyc2VsZiB5b3UgY2FuIHNldCB5b3VyIGRlZmF1bHQgYmFzZQotaS9vIGFkZHJlc3Mgd2l0aCBTSkNEX0JBU0VfQUREUiBpbiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL3NqY2QuaC4KLQotVGhlIHNqY2QgZHJpdmVyIHN1cHBvcnRzIGJlaW5nIGxvYWRlZCBhcyBhIG1vZHVsZS4gVGhlIGZvbGxvd2luZwotY29tbWFuZCB3aWxsIHNldCB0aGUgYmFzZSBpL28gYWRkcmVzcyBvbiB0aGUgZmx5IChhc3N1bWluZyB5b3UKLWhhdmUgaW5zdGFsbGVkIHRoZSBtb2R1bGUgaW4gYW4gYXBwcm9wcmlhdGUgcGxhY2UpLgotICBpbnNtb2Qgc2pjZC5vIHNqY2RfYmFzZT08YmFzZV9hZGRyZXNzPgotCi0KLUhhdmUgZnVuIQotCi1JZiBzb21ldGhpbmcgaXMgd3JvbmcsIHBsZWFzZSBlbWFpbCB0bwkJdmFkaW1AcmJyZi5ydQotCQkJCQlvciAJdmFkaW1AaXBzdW4ucmFzLnJ1Ci0JCQkJCW9yCW1vZGVsQGNlY21vdy5lbmV0LmRlYy5jb20KLQkJCQkJb3IJSC5ULk0udi5kLk1hYXJlbEBtYXJpbi5ubAotCi1JdCBoYXBwZW5zIHNvbWV0aW1lcyB0aGF0IFZhZGltIGlzIG5vdCByZWFjaGFibGUgYnkgbWFpbC4gRm9yIHRoZXNlCi1pbnN0YW5jZXMsIEVyaWMgdmFuIGRlciBNYWFyZWwgd2lsbCBoZWxwIHRvby4KLQotCQlWYWRpbSBWLiBNb2RlbCwgRXJpYyB2YW4gZGVyIE1hYXJlbCwgRWJlcmhhcmQgTW9lbmtlYmVyZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zb255Y2Q1MzUgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZTEwOS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0gICAgICAgICAgICAgIFJFQURNRSBGT1IgTElOVVggU09OWSBDRFUtNTM1LzUzMSBEUklWRVIKLSAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGlzIHRoZSBTb255IENEVS01MzUgKGFuZCA1MzEpIGRyaXZlciB2ZXJzaW9uIDAuNyBmb3IgTGludXguCi1JIGRvIG5vdCB0aGluayBJIGhhdmUgdGhlIGRvY3VtZW50YXRpb24gdG8gYWRkIGZlYXR1cmVzIGxpa2UgRE1BIHN1cHBvcnQKLXNvIGlmIGFueW9uZSBlbHNlIHdhbnRzIHRvIHB1cnN1ZSBpdCBvciBoZWxwIG1lIHdpdGggaXQsIHBsZWFzZSBkby4KLShJIG5lZWQgdG8gc2VlIHdoYXQgd2FzIGRvbmUgZm9yIHRoZSBDRFUtMzFBIGRyaXZlciAtLSBwZXJoYXBzIEkgY2FuCi1zdGVhbCBzb21lIG9mIHRoYXQgY29kZS4pCi0KLVRoaXMgaXMgYSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU29ueSBDRFUtNTM1IENEUk9NIGRyaXZlLiAgVGhpcyBpcwotb25lIG9mIHRoZSBvbGRlciBTb255IGRyaXZlcyB3aXRoIGl0cyBvd24gaW50ZXJmYWNlIGNhcmQgKFNvbnkgYnVzKS4KLVRoZSBET1MgZHJpdmVyIGZvciB0aGlzIGRyaXZlIGlzIG5hbWVkIFNPTllfQ0RVLlNZUyAtIHdoZW4geW91IGJvb3QgRE9TCi15b3VyIGRyaXZlIHNob3VsZCBiZSBpZGVudGlmaWVkIGFzIGEgU09OWSBDRFUtNTM1LiAgVGhlIGRyaXZlciB3b3Jrcwotd2l0aCBhIENEVS01MzEgYWxzby4gIE9uZSB1c2VyIHJlcG9ydGVkIHRoYXQgdGhlIGRyaXZlciB3b3JrZWQgb24gZHJpdmVzCi1PRU0nZWQgYnkgUHJvY29tbSwgZHJpdmUgYW5kIGludGVyZmFjZSBib2FyZCB3ZXJlIGxhYmVsbGVkIFByb2NvbW0uCi0KLVRoZSBMaW51eCBkcml2ZXIgaXMgYmFzZWQgb24gQ29yZXkgTWlueWFyZCdzIHNvbnljZCAwLjMgZHJpdmVyIGZvcgotdGhlIENEVS0zMUEuICBSb24gSmVwcGVzZW4ganVzdCBjaGFuZ2VkIHRoZSBjb21tYW5kcyB0aGF0IHdlcmUgc2VudAotdG8gdGhlIGRyaXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIENEVS01MzUgY29tbWFuZHMgYW5kIHJlZ2lzdGVycy4KLVRoZXJlIHdlcmUgZW5vdWdoIGNoYW5nZXMgdG8gbGV0IGJ1Z3MgY3JlZXAgaW4gYnV0IGl0IHNlZW1zIHRvIGJlIHN0YWJsZS4KLVJvbiB3YXMgYWJsZSB0byB0YXIgYW4gZW50aXJlIENEUk9NIChzaG91bGQgcmVhZCBhbGwgYmxvY2tzKSBhbmQgYnVpbHQKLWdob3N0dmlldyBhbmQgeGZpZyBvZmYgV2FsbnV0IENyZWVrJ3MgWDExUjUvR05VIENEUk9NLiAgeGNkcGxheWVyIGFuZAotd29ya21hbiB3b3JrIHdpdGggdGhlIGRyaXZlci4gIE90aGVycyBoYXZlIHVzZWQgdGhlIGRyaXZlciB3aXRob3V0Ci1wcm9ibGVtcyBleGNlcHQgdGhvc2UgZGVhbGluZyB3aXRoIHdhaXQgbG9vcHMgKGZpeGVkIGluIHRoaXJkIHJlbGVhc2UpLgotTGlrZSBNaW55YXJkJ3Mgb3JpZ2luYWwgZHJpdmVyIHRoaXMgb25lIHVzZXMgYSBwb2xsZWQgaW50ZXJmYWNlICh0aGlzCi1pcyBhbHNvIHRoZSBkZWZhdWx0IHNldHVwIGZvciB0aGUgRE9TIGRyaXZlcikuICBJdCBoYXMgbm90IGJlZW4gdHJpZWQKLXdpdGggaW50ZXJydXB0cyBvciBETUEgZW5hYmxlZCBvbiB0aGUgYm9hcmQuCi0KLVJFUVVJUkVNRU5UUwotPT09PT09PT09PT09Ci0KLQktIFNvbnkgQ0RVLTUzNSBkcml2ZSwgcHJlZmVyYWJseSB3aXRob3V0IGludGVycnVwdHMgYW5kIERNQSAKLQkgIGVuYWJsZWQgb24gdGhlIGNhcmQuCi0KLQktIERyaXZlIG11c3QgYmUgc2V0IHVwIGFzIHVuaXQgMS4gIE9ubHkgdGhlIGZpcnN0IHVuaXQgd2lsbCBiZSAKLQkgIHJlY29nbml6ZWQKLQotCS0gWW91IG11c3QgZW50ZXIgeW91ciBpbnRlcmZhY2UgYWRkcmVzcyBpbnRvIAotICAgICAgICAgIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2Ryb20vc29ueWNkNTM1LmggYW5kIGJ1aWxkIHRoZQotICAgICAgICAgIGFwcHJvcHJpYXRlIGtlcm5lbCBvciB1c2UgdGhlICJrZXJuZWwgY29tbWFuZCBsaW5lIiBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICBzb255Y2Q1MzU9MHgzMjAKLSAgICAgICAgICB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSBhZGRyZXNzLgotCi1OT1RFUzoKLT09PT09PQotCi0xKSBUaGUgZHJpdmUgTVVTVCBiZSB0dXJuZWQgb24gd2hlbiBib290aW5nIG9yIGl0IHdpbGwgbm90IGJlIHJlY29nbml6ZWQhCi0gICAoYnV0IHNlZSBjb21tZW50cyBvbiBtb2R1bGFyaXplZCB2ZXJzaW9uIGJlbG93KQotCi0yKSB3aGVuIHRoZSBjZHJvbSBkZXZpY2UgaXMgb3BlbmVkIHRoZSBlamVjdCBidXR0b24gaXMgZGlzYWJsZWQgdG8ga2VlcCB0aGUKLSAgIHVzZXIgZnJvbSBlamVjdGluZyBhIG1vdW50ZWQgZGlzayBhbmQgcmVwbGFjaW5nIGl0IHdpdGggYW5vdGhlci4KLSAgIFVuZm9ydHVuYXRlbHkgeGNkcGxheWVyIGFuZCB3b3JrbWFuIGFsc28gb3BlbiB0aGUgY2Ryb20gZGV2aWNlIHNvIHlvdQotICAgaGF2ZSB0byB1c2UgdGhlIGVqZWN0IGJ1dHRvbiBpbiB0aGUgc29mdHdhcmUuICBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3VyCi0gICBjZHJvbSBwbGF5ZXIgcmVmdXNlcyB0byBnaXZlIHVwIGl0cyBkaXNrIC0tIGV4aXQgd29ya21hbiBvciB4Y2RwbGF5ZXIsIG9yCi0gICB1bW91bnQgdGhlIGRyaXZlIGlmIGl0IGhhcyBiZWVuIG1vdW50ZWQuCi0KLVRIQU5LUwotPT09PT09Ci0KLU1hbnkgdGhhbmtzIHRvIFJvbiBKZXBwZXNlbiAocm9uai5hbkBzaXRlMDA3LnNhaWMuY29tKSBmb3IgZ2V0dGluZwotdGhpcyBwcm9qZWN0IG9mZiB0aGUgZ3JvdW5kLiAgSGUgd3JvdGUgdGhlIGluaXRpYWwgcmVsZWFzZQotYW5kIHRoZSBmaXJzdCB0d28gcGF0Y2hlcyB0byB0aGlzIGRyaXZlciAoMC4xLCAwLjIsIGFuZCAwLjMpLgotVGhhbmtzIGFsc28gdG8gRWJlcmhhcmQgTW9lbmtlYmVyZyAoZW1vZW5rZUBnd2RnLmRlKSBmb3IgcHJvZGRpbmcKLW1lIHRvIHBsYWNlIHRoaXMgY29kZSBpbnRvIHRoZSBtYWluc3RyZWFtIExpbnV4IHNvdXJjZSB0cmVlCi0oYXMgb2YgTGludXggdmVyc2lvbiAxLjEuOTEpLCBhcyB3ZWxsIGFzIHNvbWUgcGF0Y2hlcyB0byBtYWtlCi1pdCBhIGJldHRlciBkZXZpY2UgY2l0aXplbi4gIEZ1cnRoZXIgdGhhbmtzIHRvIEpvZWwgS2F0egotPGpvZWxrYXR6QHdlYmNoYXQub3JnPiBmb3IgaGlzIE1PRFVMRSBwYXRjaGVzIChzZWUgZGV0YWlscyBiZWxvdyksCi1Qb3JmaXJpIENsYXVkaW8gPEMuUG9yZmlyaUBuaXNtcy50ZWkuZXJpY3Nzb24uc2U+IGZvciBwYXRjaGVzCi10byBtYWtlIHRoZSBkcml2ZXIgd29yayB3aXRoIHRoZSBvbGRlciBDRFUtNTEwLzUxNSBzZXJpZXMsIGFuZAotSGVpa28gRWlzc2ZlbGR0IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+IGZvciBwb2ludGluZyBvdXQgdGhhdAotdGhlIHZlcmlmeV9hcmVhKCkgY2hlY2tzIHdlcmUgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2Ygc2FpZCBjaGVja3MKLShub3RlOiB2ZXJpZnlfYXJlYSgpIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpKS4KLQotKEFja25vd2xlZGdtZW50cyBmcm9tIFJvbiBKZXBwZXNlbiBpbiB0aGUgMC4zIHJlbGVhc2U6KQotVGhhbmtzIHRvIENvcmV5IE1pbnlhcmQgd2hvIHdyb3RlIHRoZSBvcmlnaW5hbCBDRFUtMzFBIGRyaXZlciBvbiB3aGljaAotdGhpcyBkcml2ZXIgaXMgYmFzZWQuICBUaGFua3MgdG8gS2VuIFBpenppbmkgYW5kIEJvYiBCbGFpciB3aG8gcHJvdmlkZWQgCi1wYXRjaGVzIGFuZCBmZWVkYmFjayBvbiB0aGUgZmlyc3QgcmVsZWFzZSBvZiB0aGlzIGRyaXZlci4KLQotS2VuIFBpenppbmkKLWtlbkBoYWxjeW9uLmNvbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShUaGUgZm9sbG93aW5nIGlzIGZyb20gSm9lbCBLYXR6IDxqb2Vsa2F0ekB3ZWJjaGF0Lm9yZz4uKQotCi0JVG8gYnVpbGQgYSB2ZXJzaW9uIG9mIHNvbnk1MzUubyB0aGF0IGNhbiBiZSBpbnN0YWxsZWQgYXMgYSBtb2R1bGUsCi11c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi1nY2MgLWMgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1PMiBzb255Y2Q1MzUuYyAtbyBzb255Y2Q1MzUubwotCi0JVG8gaW5zdGFsbCB0aGUgbW9kdWxlLCBzaW1wbHkgdHlwZToKLQotaW5zbW9kIHNvbnk1MzUubwotCW9yCi1pbnNtb2Qgc29ueTUzNS5vIHNvbnljZDUzNT08YWRkcmVzcz4KLQotCUFuZCB0byByZW1vdmUgaXQ6Ci0KLXJtbW9kIHNvbnk1MzUKLQotCVRoZSBjb2RlIGNoZWNrcyB0byBzZWUgaWYgTU9EVUxFIGlzIGRlZmluZWQgYW5kIGJlaGF2ZXMgYXMgaXQgdXNlZAotdG8gaWYgTU9EVUxFIGlzIG5vdCBkZWZpbmVkLiBUaGF0IG1lYW5zIHlvdXIgcGF0Y2hlZCBmaWxlIHNob3VsZCBiZWhhdmUKLWV4YWN0bHkgYXMgaXQgdXNlZCB0byBpZiBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuCi0KLQlJIGhhdmUgYW4gZXh0ZXJuYWwgZHJpdmUsIGFuZCBJIHVzdWFsbHkgbGVhdmUgaXQgcG93ZXJlZCBvZmYuIEkgdXNlZAotdG8gaGF2ZSB0byByZWJvb3QgaWYgSSBuZWVkZWQgdG8gdXNlIHRoZSBDRFJPTSBkcml2ZS4gTm93IEkgZG9uJ3QuCi0KLQlFdmVuIGlmIHlvdSBoYXZlIGFuIGludGVybmFsIGRyaXZlLCB3aHkgd2FzdGUgdGhlIDk2SyBvZiBtZW1vcnkKLSh1bnN3YXBwYWJsZSkgdGhhdCB0aGUgZHJpdmVyIHVzZXMgaWYgeW91IHVzZSB5b3VyIENELVJPTSBkcml2ZSBpbmZyZXF1ZW50bHk/Ci0KLQlUaGlzIGRyaXZlciB3aWxsIG5vdCBpbnN0YWxsICh3aGV0aGVyIGNvbXBpbGVkIGluIG9yIGxvYWRlZCBhcyBhCi1tb2R1bGUpIGlmIHRoZSBDRFJPTSBkcml2ZSBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24uIFRoaXMKLW1lYW5zIHRoYXQgeW91IGNhbiBoYXZlIHRoZSBkcml2ZXIgY29tcGlsZWQgaW50byB0aGUga2VybmVsIGFuZCBzdGlsbCBsb2FkCi10aGUgbW9kdWxlIGxhdGVyIChhc3N1bWluZyB0aGUgZHJpdmVyIGRvZXNuJ3QgaW5zdGFsbCBpdHNlbGYgZHVyaW5nCi1wb3dlci1vbikuIFRoaXMgb25seSB3YXN0ZXMgMTJLIHdoZW4geW91IGJvb3Qgd2l0aCB0aGUgQ0RST00gZHJpdmUgb2ZmLgotCi0JVGhpcyBpcyB3aGF0IEkgdXN1YWxseSBkbzsgSSBsZWF2ZSB0aGUgZHJpdmVyIGNvbXBpbGVkIGludG8gdGhlCi1rZXJuZWwsIGJ1dCBsb2FkIGl0IGFzIGEgbW9kdWxlIGlmIEkgcG93ZXJlZCB0aGUgc3lzdGVtIHVwIHdpdGggdGhlIGRyaXZlCi1vZmYgYW5kIHRoZW4gbGF0ZXIgZGVjaWRlZCB0byB1c2UgdGhlIENEUk9NIGRyaXZlLgotCi0JU2luY2UgdGhlIGRyaXZlciBvbmx5IHVzZXMgYSBzaW5nbGUgcGFnZSB0byBwb2ludCB0byB0aGUgY2h1bmtzLAotYXR0ZW1wdGluZyB0byBzZXQgdGhlIGJ1ZmZlciBjYWNoZSB0byBtb3JlIHRoYW4gMiBNZWdhYnl0ZXMgd291bGQgYmUgdmVyeQotYmFkOyBkb24ndCBkbyB0aGF0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmFpbGNtZC5zaCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxjbWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTc3YWIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmFpbGNtZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotZWNobyAxID4gL3Byb2Mvc2VsZi9tYWtlLWl0LWZhaWwKLWV4ZWMgJCoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2ggYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsbW9kdWxlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzRhOGI5Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBVc2FnZTogZmFpbG1vZHVsZSA8ZmFpbG5hbWU+IDxtb2R1bGVuYW1lPiBbc3RhY2t0cmFjZS1kZXB0aF0KLSMKLSMJPGZhaWxuYW1lPjogImZhaWxzbGFiIiwgImZhaWxfYWxsb2NfcGFnZSIsIG9yICJmYWlsX21ha2VfcmVxdWVzdCIKLSMKLSMJPG1vZHVsZW5hbWU+OiBtb2R1bGUgbmFtZSB0aGF0IHlvdSB3YW50IHRvIGluamVjdCBmYXVsdHMuCi0jCi0jCVtzdGFja3RyYWNlLWRlcHRoXTogdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrdHJhY2Ugd2Fsa2luZyBhbGxvd2VkCi0jCi0KLVNUQUNLVFJBQ0VfREVQVEg9NQotaWYgWyAkIyAtZ3QgMiBdOyB0aGVuCi0JU1RBQ0tUUkFDRV9ERVBUSD0kMwotZmkKLQotaWYgWyAhIC1kIC9kZWJ1Zy8kMSBdOyB0aGVuCi0JZWNobyAiRmF1bHQtaW5qZWN0aW9uICQxIGRvZXMgbm90IGV4aXN0IiA+JjIKLQlleGl0IDEKLWZpCi1pZiBbICEgLWQgL3N5cy9tb2R1bGUvJDIgXTsgdGhlbgotCWVjaG8gIk1vZHVsZSAkMiBkb2VzIG5vdCBleGlzdCIgPiYyCi0JZXhpdCAxCi1maQotCi0jIERpc2FibGUgYW55IGZhdWx0IGluamVjdGlvbgotZWNobyAwID4gL2RlYnVnLyQxL3N0YWNrdHJhY2UtZGVwdGgKLQotZWNobyBgY2F0IC9zeXMvbW9kdWxlLyQyL3NlY3Rpb25zLy50ZXh0YCA+IC9kZWJ1Zy8kMS9yZXF1aXJlLXN0YXJ0Ci1lY2hvIGBjYXQgL3N5cy9tb2R1bGUvJDIvc2VjdGlvbnMvLmV4aXQudGV4dGAgPiAvZGVidWcvJDEvcmVxdWlyZS1lbmQKLWVjaG8gJFNUQUNLVFJBQ0VfREVQVEggPiAvZGVidWcvJDEvc3RhY2t0cmFjZS1kZXB0aApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKaW5kZXggYjdjYTU2MC4uNGJjMzc0YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0CkBAIC0xMDMsNiArMTAzLDExIEBACiAJZGVmYXVsdCBpcyAnTicsIHNldHRpbmcgaXQgdG8gJ1knIHdpbGwgaW5qZWN0IGZhaWx1cmVzCiAJb25seSBpbnRvIG5vbi1zbGVlcCBhbGxvY2F0aW9ucyAoR0ZQX0FUT01JQyBhbGxvY2F0aW9ucykuCiAKKy0gL2RlYnVnL2ZhaWxfcGFnZV9hbGxvYy9taW4tb3JkZXI6CisKKwlzcGVjaWZpZXMgdGhlIG1pbmltdW0gcGFnZSBhbGxvY2F0aW9uIG9yZGVyIHRvIGJlIGluamVjdGVkCisJZmFpbHVyZXMuCisKIG8gQm9vdCBvcHRpb24KIAogSW4gb3JkZXIgdG8gaW5qZWN0IGZhdWx0cyB3aGlsZSBkZWJ1Z2ZzIGlzIG5vdCBhdmFpbGFibGUgKGVhcmx5IGJvb3QgdGltZSksCkBAIC0xNTYsNzAgKzE2MSw3NyBAQAogQXBwbGljYXRpb24gRXhhbXBsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW8gaW5qZWN0IHNsYWIgYWxsb2NhdGlvbiBmYWlsdXJlcyBpbnRvIG1vZHVsZSBpbml0L2NsZWFudXAgY29kZQorbyBJbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIGludG8gbW9kdWxlIGluaXQvZXhpdCBjb2RlCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyEvYmluL2Jhc2gKIAotRkFJTENNRD1Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsY21kLnNoCi1CTEFDS0xJU1Q9InJvb3RfcGx1ZyBldmJ1ZyIKK0ZBSUxUWVBFPWZhaWxzbGFiCitlY2hvIFkgPiAvZGVidWcvJEZBSUxUWVBFL3Rhc2stZmlsdGVyCitlY2hvIDEwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eQorZWNobyAxMDAgPiAvZGVidWcvJEZBSUxUWVBFL2ludGVydmFsCitlY2hvIC0xID4gL2RlYnVnLyRGQUlMVFlQRS90aW1lcworZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9zcGFjZQorZWNobyAyID4gL2RlYnVnLyRGQUlMVFlQRS92ZXJib3NlCitlY2hvIDEgPiAvZGVidWcvJEZBSUxUWVBFL2lnbm9yZS1nZnAtd2FpdAogCi1GQUlMTkFNRT1mYWlsc2xhYgotZWNobyBZID4gL2RlYnVnLyRGQUlMTkFNRS90YXNrLWZpbHRlcgotZWNobyAxMCA+IC9kZWJ1Zy8kRkFJTE5BTUUvcHJvYmFiaWxpdHkKLWVjaG8gMTAwID4gL2RlYnVnLyRGQUlMTkFNRS9pbnRlcnZhbAotZWNobyAtMSA+IC9kZWJ1Zy8kRkFJTE5BTUUvdGltZXMKLWVjaG8gMiA+IC9kZWJ1Zy8kRkFJTE5BTUUvdmVyYm9zZQotZWNobyAxID4gL2RlYnVnLyRGQUlMTkFNRS9pZ25vcmUtZ2ZwLXdhaXQKLQotYmxhY2tsaXN0KCkKK2ZhdWx0eV9zeXN0ZW0oKQogewotCWVjaG8gJEJMQUNLTElTVCB8IGdyZXAgJDEgPiAvZGV2L251bGwgMj4mMQorCWJhc2ggLWMgImVjaG8gMSA+IC9wcm9jL3NlbGYvbWFrZS1pdC1mYWlsICYmIGV4ZWMgJCoiCiB9CiAKLW9vcHMoKQotewotCWRtZXNnIHwgZ3JlcCBCVUcgPiAvZGV2L251bGwgMj4mMQotfQoraWYgWyAkIyAtZXEgMCBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICQwIG1vZHVsZW5hbWUgWyBtb2R1bGVuYW1lIC4uLiBdIgorCWV4aXQgMQorZmkKIAotZmluZCAvbGliL21vZHVsZXMvYHVuYW1lIC1yYCAtbmFtZSAnKi5rbycgLWV4ZWMgYmFzZW5hbWUge30gLmtvIFw7IHwKLQl3aGlsZSByZWFkIGkKLQlkbwotCQlvb3BzICYmIGV4aXQgMQorZm9yIG0gaW4gJCoKK2RvCisJZWNobyBpbnNlcnRpbmcgJG0uLi4KKwlmYXVsdHlfc3lzdGVtIG1vZHByb2JlICRtCiAKLQkJaWYgISBibGFja2xpc3QgJGkKLQkJdGhlbgotCQkJZWNobyBpbnNlcnRpbmcgJGkuLi4KLQkJCWJhc2ggJEZBSUxDTUQgbW9kcHJvYmUgJGkKLQkJZmkKLQlkb25lCi0KLWxzbW9kIHwgYXdrICd7IGlmICgkMyA9PSAwKSB7IHByaW50ICQxIH0gfScgfAotCXdoaWxlIHJlYWQgaQotCWRvCi0JCW9vcHMgJiYgZXhpdCAxCi0KLQkJaWYgISBibGFja2xpc3QgJGkKLQkJdGhlbgotCQkJZWNobyByZW1vdmluZyAkaS4uLgotCQkJYmFzaCAkRkFJTENNRCBtb2Rwcm9iZSAtciAkaQotCQlmaQotCWRvbmUKKwllY2hvIHJlbW92aW5nICRtLi4uCisJZmF1bHR5X3N5c3RlbSBtb2Rwcm9iZSAtciAkbQorZG9uZQogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotbyBpbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIG9ubHkgZm9yIGEgc3BlY2lmaWMgbW9kdWxlCitvIEluamVjdCBwYWdlIGFsbG9jYXRpb24gZmFpbHVyZXMgb25seSBmb3IgYSBzcGVjaWZpYyBtb2R1bGUKIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIS9iaW4vYmFzaAogCi1GQUlMTU9EPURvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2gKK0ZBSUxUWVBFPWZhaWxfcGFnZV9hbGxvYworbW9kdWxlPSQxCiAKLWVjaG8gaW5qZWN0aW5nIGVycm9ycyBpbnRvIHRoZSBtb2R1bGUgJDEuLi4KK2lmIFsgLXogJG1vZHVsZSBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICQwIDxtb2R1bGVuYW1lPiIKKwlleGl0IDEKK2ZpCiAKLW1vZHByb2JlICQxCi1iYXNoICRGQUlMTU9EIGZhaWxzbGFiICQxIDEwCi1lY2hvIDI1ID4gL2RlYnVnL2ZhaWxzbGFiL3Byb2JhYmlsaXR5Cittb2Rwcm9iZSAkbW9kdWxlCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgWyAhIC1kIC9zeXMvbW9kdWxlLyRtb2R1bGUvc2VjdGlvbnMgXQordGhlbgorCWVjaG8gTW9kdWxlICRtb2R1bGUgaXMgbm90IGxvYWRlZAorCWV4aXQgMQorZmkKKworY2F0IC9zeXMvbW9kdWxlLyRtb2R1bGUvc2VjdGlvbnMvLnRleHQgPiAvZGVidWcvJEZBSUxUWVBFL3JlcXVpcmUtc3RhcnQKK2NhdCAvc3lzL21vZHVsZS8kbW9kdWxlL3NlY3Rpb25zLy5kYXRhID4gL2RlYnVnLyRGQUlMVFlQRS9yZXF1aXJlLWVuZAorCitlY2hvIE4gPiAvZGVidWcvJEZBSUxUWVBFL3Rhc2stZmlsdGVyCitlY2hvIDEwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eQorZWNobyAxMDAgPiAvZGVidWcvJEZBSUxUWVBFL2ludGVydmFsCitlY2hvIC0xID4gL2RlYnVnLyRGQUlMVFlQRS90aW1lcworZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9zcGFjZQorZWNobyAyID4gL2RlYnVnLyRGQUlMVFlQRS92ZXJib3NlCitlY2hvIDEgPiAvZGVidWcvJEZBSUxUWVBFL2lnbm9yZS1nZnAtd2FpdAorZWNobyAxID4gL2RlYnVnLyRGQUlMVFlQRS9pZ25vcmUtZ2ZwLWhpZ2htZW0KK2VjaG8gMTAgPiAvZGVidWcvJEZBSUxUWVBFL3N0YWNrdHJhY2UtZGVwdGgKKwordHJhcCAiZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eSIgU0lHSU5UIFNJR1RFUk0gRVhJVAorCitlY2hvICJJbmplY3RpbmcgZXJyb3JzIGludG8gdGhlIG1vZHVsZSAkbW9kdWxlLi4uIChpbnRlcnJ1cHQgdG8gc3RvcCkiCitzbGVlcCAxMDAwMDAwCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCAwOTJjNjVkLi5kMDVlNjI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC00MSwxNCArNDEsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJUkFXIGRyaXZlciAoQ09ORklHX1JBV19EUklWRVIpCi1XaGVuOglEZWNlbWJlciAyMDA1Ci1XaHk6CWRlY2xhcmVkIG9ic29sZXRlIHNpbmNlIGtlcm5lbCAyLjYuMwotCU9fRElSRUNUIGNhbiBiZSB1c2VkIGluc3RlYWQKLVdobzoJQWRyaWFuIEJ1bmsgPGJ1bmtAc3R1c3RhLmRlPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJb2xkIE5DUjUzQzl4IGRyaXZlcgogV2hlbjoJT2N0b2JlciAyMDA3CiBXaHk6CVJlcGxhY2VkIGJ5IHRoZSBtdWNoIGJldHRlciBlc3Bfc2NzaSBkcml2ZXIuICBBY3R1YWwgbG93LWxldmVsCkBAIC0xMTksMTMgKzExMSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OiAgZHJpdmVycyBkZXBlbmRpbmcgb24gT1NTX09CU09MRVRFX0RSSVZFUgotV2hlbjogIG9wdGlvbnMgaW4gMi42LjIwLCBjb2RlIGluIDIuNi4yMgotV2h5OiAgIE9TUyBkcml2ZXJzIHdpdGggQUxTQSByZXBsYWNlbWVudHMKLVdobzogICBBZHJpYW4gQnVuayA8YnVua0BzdHVzdGEuZGU+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglVbnVzZWQgRVhQT1JUX1NZTUJPTC9FWFBPUlRfU1lNQk9MX0dQTCBleHBvcnRzCiAJKHRlbXBvcmFyeSB0cmFuc2l0aW9uIGNvbmZpZyBvcHRpb24gcHJvdmlkZWQgdW50aWwgdGhlbikKIAlUaGUgdHJhbnNpdGlvbiBjb25maWcgb3B0aW9uIHdpbGwgYWxzbyBiZSByZW1vdmVkIGF0IHRoZSBzYW1lIHRpbWUuCkBAIC0yNjQsNiArMjQ5LDE0IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OgkndGltZScga2VybmVsIGJvb3QgcGFyYW1ldGVyCitXaGVuOglKYW51YXJ5IDIwMDgKK1doeToJcmVwbGFjZWQgYnkgJ3ByaW50ay50aW1lPTx2YWx1ZT4nIHNvIHRoYXQgcHJpbnRrIHRpbWVzdGFtcHMgY2FuIGJlCisJZW5hYmxlZCBvciBkaXNhYmxlZCBhcyBuZWVkZWQKK1dobzoJUmFuZHkgRHVubGFwIDxyYW5keS5kdW5sYXBAb3JhY2xlLmNvbT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIFdoYXQ6ICBkcml2ZXJzIGRlcGVuZGluZyBvbiBPU1NfT0JTT0xFVEUKIFdoZW46ICBvcHRpb25zIGluIDIuNi4yMywgY29kZSBpbiAyLjYuMjUKIFdoeTogICBvYnNvbGV0ZSBPU1MgZHJpdmVycwpAQCAtMzA0LDMgKzI5NywxNiBAQAogV2hvOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6IFRoZSBhcmNoL3BwYyBhbmQgaW5jbHVkZS9hc20tcHBjIGRpcmVjdG9yaWVzCitXaGVuOiBKdW4gMjAwOAorV2h5OiAgVGhlIGFyY2gvcG93ZXJwYyB0cmVlIGlzIHRoZSBtZXJnZWQgYXJjaGl0ZWN0dXJlIGZvciBwcGMzMiBhbmQgcHBjNjQKKyAgICAgIHBsYXRmb3Jtcy4gIEN1cnJlbnRseSB0aGVyZSBhcmUgZWZmb3J0cyB1bmRlcndheSB0byBwb3J0IHRoZSByZW1haW5pbmcKKyAgICAgIGFyY2gvcHBjIHBsYXRmb3JtcyB0byB0aGUgbWVyZ2VkIHRyZWUuICBOZXcgc3VibWlzc2lvbnMgdG8gdGhlIGFyY2gvcHBjCisgICAgICB0cmVlIGhhdmUgYmVlbiBmcm96ZW4gd2l0aCB0aGUgMi42LjIyIGtlcm5lbCByZWxlYXNlIGFuZCB0aGF0IHRyZWUgd2lsbAorICAgICAgcmVtYWluIGluIGJ1Zy1maXggb25seSBtb2RlIHVudGlsIGl0cyBzY2hlZHVsZWQgcmVtb3ZhbC4gIFBsYXRmb3JtcworICAgICAgdGhhdCBhcmUgbm90IHBvcnRlZCBieSBKdW5lIDIwMDggd2lsbCBiZSByZW1vdmVkIGR1ZSB0byB0aGUgbGFjayBvZiBhbgorICAgICAgaW50ZXJlc3RlZCBtYWludGFpbmVyLgorV2hvOiAgbGludXhwcGMtZGV2QG96bGFicy5vcmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CmluZGV4IGIzNGNkYjUuLmQxYjk4MjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CkBAIC0yMzgsNiArMjM4LDggQEAKIAkJc3RydWN0IGNvbmZpZ19ncm91cCAqKCptYWtlX2dyb3VwKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpOwogCQlpbnQgKCpjb21taXRfaXRlbSkoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKKwkJdm9pZCAoKmRpc2Nvbm5lY3Rfbm90aWZ5KShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKKwkJCQkJICBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogCQl2b2lkICgqZHJvcF9pdGVtKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkgIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CiAJfTsKQEAgLTI2OCw2ICsyNzAsMTYgQEAKIGZvciB0aGUgaXRlbSB0byBhY3R1YWxseSBkaXNhcHBlYXIgZnJvbSB0aGUgc3Vic3lzdGVtJ3MgdXNhZ2UuICBCdXQgaXQKIGlzIGdvbmUgZnJvbSBjb25maWdmcy4KIAorV2hlbiBkcm9wX2l0ZW0oKSBpcyBjYWxsZWQsIHRoZSBpdGVtJ3MgbGlua2FnZSBoYXMgYWxyZWFkeSBiZWVuIHRvcm4KK2Rvd24uICBJdCBubyBsb25nZXIgaGFzIGEgcmVmZXJlbmNlIG9uIGl0cyBwYXJlbnQgYW5kIGhhcyBubyBwbGFjZSBpbgordGhlIGl0ZW0gaGllcmFyY2h5LiAgSWYgYSBjbGllbnQgbmVlZHMgdG8gZG8gc29tZSBjbGVhbnVwIGJlZm9yZSB0aGlzCit0ZWFyZG93biBoYXBwZW5zLCB0aGUgc3Vic3lzdGVtIGNhbiBpbXBsZW1lbnQgdGhlCitjdF9ncm91cF9vcHMtPmRpc2Nvbm5lY3Rfbm90aWZ5KCkgbWV0aG9kLiAgVGhlIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIKK2NvbmZpZ2ZzIGhhcyByZW1vdmVkIHRoZSBpdGVtIGZyb20gdGhlIGZpbGVzeXN0ZW0gdmlldyBidXQgYmVmb3JlIHRoZQoraXRlbSBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBncm91cC4gIExpa2UgZHJvcF9pdGVtKCksCitkaXNjb25uZWN0X25vdGlmeSgpIGlzIHZvaWQgYW5kIGNhbm5vdCBmYWlsLiAgQ2xpZW50IHN1YnN5c3RlbXMgc2hvdWxkCitub3QgZHJvcCBhbnkgcmVmZXJlbmNlcyBoZXJlLCBhcyB0aGV5IHN0aWxsIG11c3QgZG8gaXQgaW4gZHJvcF9pdGVtKCkuCisKIEEgY29uZmlnX2dyb3VwIGNhbm5vdCBiZSByZW1vdmVkIHdoaWxlIGl0IHN0aWxsIGhhcyBjaGlsZCBpdGVtcy4gIFRoaXMKIGlzIGltcGxlbWVudGVkIGluIHRoZSBjb25maWdmcyBybWRpcigyKSBjb2RlLiAgLT5kcm9wX2l0ZW0oKSB3aWxsIG5vdCBiZQogY2FsbGVkLCBhcyB0aGUgaXRlbSBoYXMgbm90IGJlZW4gZHJvcHBlZC4gIHJtZGlyKDIpIHdpbGwgZmFpbCwgYXMgdGhlCkBAIC0yODAsMTggKzI5MiwxOCBAQAogCiAJc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSB7CiAJCXN0cnVjdCBjb25maWdfZ3JvdXAJc3VfZ3JvdXA7Ci0JCXN0cnVjdCBzZW1hcGhvcmUJc3Vfc2VtOworCQlzdHJ1Y3QgbXV0ZXgJCXN1X211dGV4OwogCX07CiAKIAlpbnQgY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cyk7CiAJdm9pZCBjb25maWdmc191bnJlZ2lzdGVyX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMpOwogCi0JQSBzdWJzeXN0ZW0gY29uc2lzdHMgb2YgYSB0b3BsZXZlbCBjb25maWdfZ3JvdXAgYW5kIGEgc2VtYXBob3JlLgorCUEgc3Vic3lzdGVtIGNvbnNpc3RzIG9mIGEgdG9wbGV2ZWwgY29uZmlnX2dyb3VwIGFuZCBhIG11dGV4LgogVGhlIGdyb3VwIGlzIHdoZXJlIGNoaWxkIGNvbmZpZ19pdGVtcyBhcmUgY3JlYXRlZC4gIEZvciBhIHN1YnN5c3RlbSwKIHRoaXMgZ3JvdXAgaXMgdXN1YWxseSBkZWZpbmVkIHN0YXRpY2FsbHkuICBCZWZvcmUgY2FsbGluZwogY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCksIHRoZSBzdWJzeXN0ZW0gbXVzdCBoYXZlIGluaXRpYWxpemVkIHRoZQogZ3JvdXAgdmlhIHRoZSB1c3VhbCBncm91cCBfaW5pdCgpIGZ1bmN0aW9ucywgYW5kIGl0IG11c3QgYWxzbyBoYXZlCi1pbml0aWFsaXplZCB0aGUgc2VtYXBob3JlLgoraW5pdGlhbGl6ZWQgdGhlIG11dGV4LgogCVdoZW4gdGhlIHJlZ2lzdGVyIGNhbGwgcmV0dXJucywgdGhlIHN1YnN5c3RlbSBpcyBsaXZlLCBhbmQgaXQKIHdpbGwgYmUgdmlzaWJsZSB2aWEgY29uZmlnZnMuICBBdCB0aGF0IHBvaW50LCBta2RpcigyKSBjYW4gYmUgY2FsbGVkIGFuZAogdGhlIHN1YnN5c3RlbSBtdXN0IGJlIHJlYWR5IGZvciBpdC4KQEAgLTMwMyw3ICszMTUsNyBAQAogc2hvd3MgYSB0cml2aWFsIG9iamVjdCBkaXNwbGF5aW5nIGFuZCBzdG9yaW5nIGFuIGF0dHJpYnV0ZSwgYW5kIGEgc2ltcGxlCiBncm91cCBjcmVhdGluZyBhbmQgZGVzdHJveWluZyB0aGVzZSBjaGlsZHJlbi4KIAotW0hpZXJhcmNoeSBOYXZpZ2F0aW9uIGFuZCB0aGUgU3Vic3lzdGVtIFNlbWFwaG9yZV0KK1tIaWVyYXJjaHkgTmF2aWdhdGlvbiBhbmQgdGhlIFN1YnN5c3RlbSBNdXRleF0KIAogVGhlcmUgaXMgYW4gZXh0cmEgYm9udXMgdGhhdCBjb25maWdmcyBwcm92aWRlcy4gIFRoZSBjb25maWdfZ3JvdXBzIGFuZAogY29uZmlnX2l0ZW1zIGFyZSBhcnJhbmdlZCBpbiBhIGhpZXJhcmNoeSBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGV5CkBAIC0zMTQsMTkgKzMyNiwxOSBAQAogCiBBIHN1YnN5c3RlbSBjYW4gbmF2aWdhdGUgdGhlIGNnX2NoaWxkcmVuIGxpc3QgYW5kIHRoZSBjaV9wYXJlbnQgcG9pbnRlcgogdG8gc2VlIHRoZSB0cmVlIGNyZWF0ZWQgYnkgdGhlIHN1YnN5c3RlbS4gIFRoaXMgY2FuIHJhY2Ugd2l0aCBjb25maWdmcycKLW1hbmFnZW1lbnQgb2YgdGhlIGhpZXJhcmNoeSwgc28gY29uZmlnZnMgdXNlcyB0aGUgc3Vic3lzdGVtIHNlbWFwaG9yZSB0bworbWFuYWdlbWVudCBvZiB0aGUgaGllcmFyY2h5LCBzbyBjb25maWdmcyB1c2VzIHRoZSBzdWJzeXN0ZW0gbXV0ZXggdG8KIHByb3RlY3QgbW9kaWZpY2F0aW9ucy4gIFdoZW5ldmVyIGEgc3Vic3lzdGVtIHdhbnRzIHRvIG5hdmlnYXRlIHRoZQogaGllcmFyY2h5LCBpdCBtdXN0IGRvIHNvIHVuZGVyIHRoZSBwcm90ZWN0aW9uIG9mIHRoZSBzdWJzeXN0ZW0KLXNlbWFwaG9yZS4KK211dGV4LgogCi1BIHN1YnN5c3RlbSB3aWxsIGJlIHByZXZlbnRlZCBmcm9tIGFjcXVpcmluZyB0aGUgc2VtYXBob3JlIHdoaWxlIGEgbmV3bHkKK0Egc3Vic3lzdGVtIHdpbGwgYmUgcHJldmVudGVkIGZyb20gYWNxdWlyaW5nIHRoZSBtdXRleCB3aGlsZSBhIG5ld2x5CiBhbGxvY2F0ZWQgaXRlbSBoYXMgbm90IGJlZW4gbGlua2VkIGludG8gdGhpcyBoaWVyYXJjaHkuICAgU2ltaWxhcmx5LCBpdAotd2lsbCBub3QgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgd2hpbGUgYSBkcm9wcGluZyBpdGVtIGhhcyBub3QKK3dpbGwgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbXV0ZXggd2hpbGUgYSBkcm9wcGluZyBpdGVtIGhhcyBub3QKIHlldCBiZWVuIHVubGlua2VkLiAgVGhpcyBtZWFucyB0aGF0IGFuIGl0ZW0ncyBjaV9wYXJlbnQgcG9pbnRlciB3aWxsCiBuZXZlciBiZSBOVUxMIHdoaWxlIHRoZSBpdGVtIGlzIGluIGNvbmZpZ2ZzLCBhbmQgdGhhdCBhbiBpdGVtIHdpbGwgb25seQogYmUgaW4gaXRzIHBhcmVudCdzIGNnX2NoaWxkcmVuIGxpc3QgZm9yIHRoZSBzYW1lIGR1cmF0aW9uLiAgVGhpcyBhbGxvd3MKIGEgc3Vic3lzdGVtIHRvIHRydXN0IGNpX3BhcmVudCBhbmQgY2dfY2hpbGRyZW4gd2hpbGUgdGhleSBob2xkIHRoZQotc2VtYXBob3JlLgorbXV0ZXguCiAKIFtJdGVtIEFnZ3JlZ2F0aW9uIFZpYSBzeW1saW5rKDIpXQogCkBAIC0zODYsNiArMzk4LDMzIEBACiBybWRpcigyKS4gIFRoZXkgYWxzbyBhcmUgbm90IGNvbnNpZGVyZWQgd2hlbiBybWRpcigyKSBvbiB0aGUgcGFyZW50CiBncm91cCBpcyBjaGVja2luZyBmb3IgY2hpbGRyZW4uCiAKK1tEZXBlbmRhbnQgU3Vic3lzdGVtc10KKworU29tZXRpbWVzIG90aGVyIGRyaXZlcnMgZGVwZW5kIG9uIHBhcnRpY3VsYXIgY29uZmlnZnMgaXRlbXMuICBGb3IKK2V4YW1wbGUsIG9jZnMyIG1vdW50cyBkZXBlbmQgb24gYSBoZWFydGJlYXQgcmVnaW9uIGl0ZW0uICBJZiB0aGF0CityZWdpb24gaXRlbSBpcyByZW1vdmVkIHdpdGggcm1kaXIoMiksIHRoZSBvY2ZzMiBtb3VudCBtdXN0IEJVRyBvciBnbworcmVhZG9ubHkuICBOb3QgaGFwcHkuCisKK2NvbmZpZ2ZzIHByb3ZpZGVzIHR3byBhZGRpdGlvbmFsIEFQSSBjYWxsczogY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBhbmQKK2NvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0oKS4gIEEgY2xpZW50IGRyaXZlciBjYW4gY2FsbAorY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBvbiBhbiBleGlzdGluZyBpdGVtIHRvIHRlbGwgY29uZmlnZnMgdGhhdCBpdCBpcworZGVwZW5kZWQgb24uICBjb25maWdmcyB3aWxsIHRoZW4gcmV0dXJuIC1FQlVTWSBmcm9tIHJtZGlyKDIpIGZvciB0aGF0CitpdGVtLiAgV2hlbiB0aGUgaXRlbSBpcyBubyBsb25nZXIgZGVwZW5kZWQgb24sIHRoZSBjbGllbnQgZHJpdmVyIGNhbGxzCitjb25maWdmc191bmRlcGVuZF9pdGVtKCkgb24gaXQuCisKK1RoZXNlIEFQSSBjYW5ub3QgYmUgY2FsbGVkIHVuZGVybmVhdGggYW55IGNvbmZpZ2ZzIGNhbGxiYWNrcywgYXMKK3RoZXkgd2lsbCBjb25mbGljdC4gIFRoZXkgY2FuIGJsb2NrIGFuZCBhbGxvY2F0ZS4gIEEgY2xpZW50IGRyaXZlcgorcHJvYmFibHkgc2hvdWxkbid0IGNhbGxpbmcgdGhlbSBvZiBpdHMgb3duIGd1bXB0aW9uLiAgUmF0aGVyIGl0IHNob3VsZAorYmUgcHJvdmlkaW5nIGFuIEFQSSB0aGF0IGV4dGVybmFsIHN1YnN5c3RlbXMgY2FsbC4KKworSG93IGRvZXMgdGhpcyB3b3JrPyAgSW1hZ2luZSB0aGUgb2NmczIgbW91bnQgcHJvY2Vzcy4gIFdoZW4gaXQgbW91bnRzLAoraXQgYXNrcyBmb3IgYSBoZWFydGJlYXQgcmVnaW9uIGl0ZW0uICBUaGlzIGlzIGRvbmUgdmlhIGEgY2FsbCBpbnRvIHRoZQoraGVhcnRiZWF0IGNvZGUuICBJbnNpZGUgdGhlIGhlYXJ0YmVhdCBjb2RlLCB0aGUgcmVnaW9uIGl0ZW0gaXMgbG9va2VkCit1cC4gIEhlcmUsIHRoZSBoZWFydGJlYXQgY29kZSBjYWxscyBjb25maWdmc19kZXBlbmRfaXRlbSgpLiAgSWYgaXQKK3N1Y2NlZWRzLCB0aGVuIGhlYXJ0YmVhdCBrbm93cyB0aGUgcmVnaW9uIGlzIHNhZmUgdG8gZ2l2ZSB0byBvY2ZzMi4KK0lmIGl0IGZhaWxzLCBpdCB3YXMgYmVpbmcgdG9ybiBkb3duIGFueXdheSwgYW5kIGhlYXJ0YmVhdCBjYW4gZ3JhY2VmdWxseQorcGFzcyB1cCBhbiBlcnJvci4KKwogW0NvbW1pdHRhYmxlIEl0ZW1zXQogCiBOT1RFOiBDb21taXR0YWJsZSBpdGVtcyBhcmUgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2V4YW1wbGUuYyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCmluZGV4IDJkNmExNGEuLmU1NmQ0OTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAkJc3Vic3lzID0gZXhhbXBsZV9zdWJzeXNbaV07CiAKIAkJY29uZmlnX2dyb3VwX2luaXQoJnN1YnN5cy0+c3VfZ3JvdXApOwotCQlpbml0X01VVEVYKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2luaXQoJnN1YnN5cy0+c3VfbXV0ZXgpOwogCQlyZXQgPSBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oc3Vic3lzKTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlZCB3aGlsZSByZWdpc3RlcmluZyBzdWJzeXN0ZW0gJXNcbiIsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2VjcnlwdGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZWNyeXB0ZnMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2VjcnlwdGZzLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9lY3J5cHRmcy50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDg3NTZhMDcuLmViZmZkZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTcxLDcgKzE3MSw5IEBACiBUaGlzIHNob3dzIHlvdSBuZWFybHkgdGhlIHNhbWUgaW5mb3JtYXRpb24geW91IHdvdWxkIGdldCBpZiB5b3Ugdmlld2VkIGl0IHdpdGgKIHRoZSBwcyAgY29tbWFuZC4gIEluICBmYWN0LCAgcHMgIHVzZXMgIHRoZSAgcHJvYyAgZmlsZSAgc3lzdGVtICB0byAgb2J0YWluIGl0cwogaW5mb3JtYXRpb24uIFRoZSAgc3RhdG0gIGZpbGUgIGNvbnRhaW5zICBtb3JlICBkZXRhaWxlZCAgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1wcm9jZXNzIG1lbW9yeSB1c2FnZS4gSXRzIHNldmVuIGZpZWxkcyBhcmUgZXhwbGFpbmVkIGluIFRhYmxlIDEtMi4KK3Byb2Nlc3MgbWVtb3J5IHVzYWdlLiBJdHMgc2V2ZW4gZmllbGRzIGFyZSBleHBsYWluZWQgaW4gVGFibGUgMS0yLiAgVGhlIHN0YXQKK2ZpbGUgY29udGFpbnMgZGV0YWlscyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvY2VzcyBpdHNlbGYuICBJdHMgZmllbGRzIGFyZQorZXhwbGFpbmVkIGluIFRhYmxlIDEtMy4KIAogCiBUYWJsZSAxLTI6IENvbnRlbnRzIG9mIHRoZSBzdGF0bSBmaWxlcyAoYXMgb2YgMi42LjgtcmMzKQpAQCAtMTg4LDE2ICsxOTAsNjUgQEAKICBkdCAgICAgICBudW1iZXIgb2YgZGlydHkgcGFnZXMJCQkoYWx3YXlzIDAgb24gMi42KQogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKKworVGFibGUgMS0zOiBDb250ZW50cyBvZiB0aGUgc3RhdCBmaWxlcyAoYXMgb2YgMi42LjIyLXJjMykKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIEZpZWxkICAgICAgICAgIENvbnRlbnQKKyAgcGlkICAgICAgICAgICBwcm9jZXNzIGlkCisgIHRjb21tICAgICAgICAgZmlsZW5hbWUgb2YgdGhlIGV4ZWN1dGFibGUKKyAgc3RhdGUgICAgICAgICBzdGF0ZSAoUiBpcyBydW5uaW5nLCBTIGlzIHNsZWVwaW5nLCBEIGlzIHNsZWVwaW5nIGluIGFuCisgICAgICAgICAgICAgICAgdW5pbnRlcnJ1cHRpYmxlIHdhaXQsIFogaXMgem9tYmllLCBUIGlzIHRyYWNlZCBvciBzdG9wcGVkKQorICBwcGlkICAgICAgICAgIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBwcm9jZXNzCisgIHBncnAgICAgICAgICAgcGdycCBvZiB0aGUgcHJvY2VzcworICBzaWQgICAgICAgICAgIHNlc3Npb24gaWQKKyAgdHR5X25yICAgICAgICB0dHkgdGhlIHByb2Nlc3MgdXNlcworICB0dHlfcGdycCAgICAgIHBncnAgb2YgdGhlIHR0eQorICBmbGFncyAgICAgICAgIHRhc2sgZmxhZ3MKKyAgbWluX2ZsdCAgICAgICBudW1iZXIgb2YgbWlub3IgZmF1bHRzCisgIGNtaW5fZmx0ICAgICAgbnVtYmVyIG9mIG1pbm9yIGZhdWx0cyB3aXRoIGNoaWxkJ3MKKyAgbWFqX2ZsdCAgICAgICBudW1iZXIgb2YgbWFqb3IgZmF1bHRzCisgIGNtYWpfZmx0ICAgICAgbnVtYmVyIG9mIG1ham9yIGZhdWx0cyB3aXRoIGNoaWxkJ3MKKyAgdXRpbWUgICAgICAgICB1c2VyIG1vZGUgamlmZmllcworICBzdGltZSAgICAgICAgIGtlcm5lbCBtb2RlIGppZmZpZXMKKyAgY3V0aW1lICAgICAgICB1c2VyIG1vZGUgamlmZmllcyB3aXRoIGNoaWxkJ3MKKyAgY3N0aW1lICAgICAgICBrZXJuZWwgbW9kZSBqaWZmaWVzIHdpdGggY2hpbGQncworICBwcmlvcml0eSAgICAgIHByaW9yaXR5IGxldmVsCisgIG5pY2UgICAgICAgICAgbmljZSBsZXZlbAorICBudW1fdGhyZWFkcyAgIG51bWJlciBvZiB0aHJlYWRzCisgIHN0YXJ0X3RpbWUgICAgdGltZSB0aGUgcHJvY2VzcyBzdGFydGVkIGFmdGVyIHN5c3RlbSBib290CisgIHZzaXplICAgICAgICAgdmlydHVhbCBtZW1vcnkgc2l6ZQorICByc3MgICAgICAgICAgIHJlc2lkZW50IHNldCBtZW1vcnkgc2l6ZQorICByc3NsaW0gICAgICAgIGN1cnJlbnQgbGltaXQgaW4gYnl0ZXMgb24gdGhlIHJzcworICBzdGFydF9jb2RlICAgIGFkZHJlc3MgYWJvdmUgd2hpY2ggcHJvZ3JhbSB0ZXh0IGNhbiBydW4KKyAgZW5kX2NvZGUgICAgICBhZGRyZXNzIGJlbG93IHdoaWNoIHByb2dyYW0gdGV4dCBjYW4gcnVuCisgIHN0YXJ0X3N0YWNrICAgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrCisgIGVzcCAgICAgICAgICAgY3VycmVudCB2YWx1ZSBvZiBFU1AKKyAgZWlwICAgICAgICAgICBjdXJyZW50IHZhbHVlIG9mIEVJUAorICBwZW5kaW5nICAgICAgIGJpdG1hcCBvZiBwZW5kaW5nIHNpZ25hbHMgKG9ic29sZXRlKQorICBibG9ja2VkICAgICAgIGJpdG1hcCBvZiBibG9ja2VkIHNpZ25hbHMgKG9ic29sZXRlKQorICBzaWdpZ24gICAgICAgIGJpdG1hcCBvZiBpZ25vcmVkIHNpZ25hbHMgKG9ic29sZXRlKQorICBzaWdjYXRjaCAgICAgIGJpdG1hcCBvZiBjYXRjaGVkIHNpZ25hbHMgKG9ic29sZXRlKQorICB3Y2hhbiAgICAgICAgIGFkZHJlc3Mgd2hlcmUgcHJvY2VzcyB3ZW50IHRvIHNsZWVwCisgIDAgICAgICAgICAgICAgKHBsYWNlIGhvbGRlcikKKyAgMCAgICAgICAgICAgICAocGxhY2UgaG9sZGVyKQorICBleGl0X3NpZ25hbCAgIHNpZ25hbCB0byBzZW5kIHRvIHBhcmVudCB0aHJlYWQgb24gZXhpdAorICB0YXNrX2NwdSAgICAgIHdoaWNoIENQVSB0aGUgdGFzayBpcyBzY2hlZHVsZWQgb24KKyAgcnRfcHJpb3JpdHkgICByZWFsdGltZSBwcmlvcml0eQorICBwb2xpY3kgICAgICAgIHNjaGVkdWxpbmcgcG9saWN5IChtYW4gc2NoZWRfc2V0c2NoZWR1bGVyKQorICBibGtpb190aWNrcyAgIHRpbWUgc3BlbnQgd2FpdGluZyBmb3IgYmxvY2sgSU8KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCisKIDEuMiBLZXJuZWwgZGF0YQogLS0tLS0tLS0tLS0tLS0tCiAKIFNpbWlsYXIgdG8gIHRoZSAgcHJvY2VzcyBlbnRyaWVzLCB0aGUga2VybmVsIGRhdGEgZmlsZXMgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dAogdGhlIHJ1bm5pbmcga2VybmVsLiBUaGUgZmlsZXMgdXNlZCB0byBvYnRhaW4gdGhpcyBpbmZvcm1hdGlvbiBhcmUgY29udGFpbmVkIGluCi0vcHJvYyBhbmQgIGFyZSAgbGlzdGVkICBpbiBUYWJsZSAxLTMuIE5vdCBhbGwgb2YgdGhlc2Ugd2lsbCBiZSBwcmVzZW50IGluIHlvdXIKKy9wcm9jIGFuZCAgYXJlICBsaXN0ZWQgIGluIFRhYmxlIDEtNC4gTm90IGFsbCBvZiB0aGVzZSB3aWxsIGJlIHByZXNlbnQgaW4geW91cgogc3lzdGVtLiBJdCAgZGVwZW5kcyAgb24gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGFuZCB0aGUgbG9hZGVkIG1vZHVsZXMsIHdoaWNoCiBmaWxlcyBhcmUgdGhlcmUsIGFuZCB3aGljaCBhcmUgbWlzc2luZy4KIAotVGFibGUgMS0zOiBLZXJuZWwgaW5mbyBpbiAvcHJvYyAKK1RhYmxlIDEtNDogS2VybmVsIGluZm8gaW4gL3Byb2MKIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIEZpbGUgICAgICAgIENvbnRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgYXBtICAgICAgICAgQWR2YW5jZWQgcG93ZXIgbWFuYWdlbWVudCBpbmZvICAgICAgICAgICAgICAgICAgICAKQEAgLTQ3MywxMCArNTI0LDEwIEBACiAKIE1vcmUgZGV0YWlsZWQgIGluZm9ybWF0aW9uICBjYW4gIGJlICBmb3VuZCAgaW4gIHRoZSAgY29udHJvbGxlciAgc3BlY2lmaWMKIHN1YmRpcmVjdG9yaWVzLiBUaGVzZSAgYXJlICBuYW1lZCAgaWRlMCwgIGlkZTEgIGFuZCAgc28gIG9uLiAgRWFjaCAgb2YgIHRoZXNlCi1kaXJlY3RvcmllcyBjb250YWlucyB0aGUgZmlsZXMgc2hvd24gaW4gdGFibGUgMS00LgorZGlyZWN0b3JpZXMgY29udGFpbnMgdGhlIGZpbGVzIHNob3duIGluIHRhYmxlIDEtNS4KIAogCi1UYWJsZSAxLTQ6IElERSBjb250cm9sbGVyIGluZm8gaW4gIC9wcm9jL2lkZS9pZGU/IAorVGFibGUgMS01OiBJREUgY29udHJvbGxlciBpbmZvIGluICAvcHJvYy9pZGUvaWRlPwogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgY2hhbm5lbCBJREUgY2hhbm5lbCAoMCBvciAxKSAgICAgICAgICAgICAgICAgICAgCkBAIC00ODYsMTEgKzUzNywxMSBAQAogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKIEVhY2ggZGV2aWNlICBjb25uZWN0ZWQgIHRvICBhICBjb250cm9sbGVyICBoYXMgIGEgc2VwYXJhdGUgc3ViZGlyZWN0b3J5IGluIHRoZQotY29udHJvbGxlcnMgZGlyZWN0b3J5LiAgVGhlICBmaWxlcyAgbGlzdGVkIGluIHRhYmxlIDEtNSBhcmUgY29udGFpbmVkIGluIHRoZXNlCitjb250cm9sbGVycyBkaXJlY3RvcnkuICBUaGUgIGZpbGVzICBsaXN0ZWQgaW4gdGFibGUgMS02IGFyZSBjb250YWluZWQgaW4gdGhlc2UKIGRpcmVjdG9yaWVzLgogCiAKLVRhYmxlIDEtNTogSURFIGRldmljZSBpbmZvcm1hdGlvbiAKK1RhYmxlIDEtNjogSURFIGRldmljZSBpbmZvcm1hdGlvbgogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgY2FjaGUgICAgICAgICAgICBUaGUgY2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0xMjk3LDYgKzEzNDgsMjEgQEAKIGh1Z2V0bGJfc2htX2dyb3VwIGNvbnRhaW5zIGdyb3VwIGlkIHRoYXQgaXMgYWxsb3dlZCB0byBjcmVhdGUgU3lzViBzaGFyZWQKIG1lbW9yeSBzZWdtZW50IHVzaW5nIGh1Z2V0bGIgcGFnZS4KIAoraHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZnVsIHdoZW4ga2VybmVsY29yZT0gaXMgc3BlY2lmaWVkIGF0IGJvb3QgdGltZSB0bworY3JlYXRlIFpPTkVfTU9WQUJMRSBmb3IgcGFnZXMgdGhhdCBtYXkgYmUgcmVjbGFpbWVkIG9yIG1pZ3JhdGVkLiBIdWdlIHBhZ2VzCithcmUgbm90IG1vdmFibGUgc28gYXJlIG5vdCBub3JtYWxseSBhbGxvY2F0ZWQgZnJvbSBaT05FX01PVkFCTEUuIEEgbm9uLXplcm8KK3ZhbHVlIHdyaXR0ZW4gdG8gaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUgYWxsb3dzIGh1Z2UgcGFnZXMgdG8gYmUgYWxsb2NhdGVkCitmcm9tIFpPTkVfTU9WQUJMRS4KKworT25jZSBlbmFibGVkLCB0aGUgWk9ORV9NT1ZBQkxFIGlzIHRyZWF0ZWQgYXMgYW4gYXJlYSBvZiBtZW1vcnkgdGhlIGh1Z2UKK3BhZ2VzIHBvb2wgY2FuIGVhc2lseSBncm93IG9yIHNocmluayB3aXRoaW4uIEFzc3VtaW5nIHRoYXQgYXBwbGljYXRpb25zIGFyZQorbm90IHJ1bm5pbmcgdGhhdCBtbG9jaygpIGEgbG90IG9mIG1lbW9yeSwgaXQgaXMgbGlrZWx5IHRoZSBodWdlIHBhZ2VzIHBvb2wKK2NhbiBncm93IHRvIHRoZSBzaXplIG9mIFpPTkVfTU9WQUJMRSBieSByZXBlYXRlZGx5IGVudGVyaW5nIHRoZSBkZXNpcmVkIHZhbHVlCitpbnRvIG5yX2h1Z2VwYWdlcyBhbmQgdHJpZ2dlcmluZyBwYWdlIHJlY2xhaW0uCisKIGxhcHRvcF9tb2RlCiAtLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKaW5kZXggYTQ3Y2M4MS4uMDQ1ZjNlMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dApAQCAtMyw3ICszLDcgQEAKIAogCU9yaWdpbmFsIGF1dGhvcjogUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAKLQkJICBMYXN0IHVwZGF0ZWQgb24gT2N0b2JlciAyOCwgMjAwNQorCQkgIExhc3QgdXBkYXRlZCBvbiBKdW5lIDI0LCAyMDA3LgogCiAgIENvcHlyaWdodCAoQykgMTk5OSBSaWNoYXJkIEdvb2NoCiAgIENvcHlyaWdodCAoQykgMjAwNSBQZWtrYSBFbmJlcmcKQEAgLTEwNyw3ICsxMDcsNyBAQAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoaXMgZGVzY3JpYmVzIHRoZSBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nCitUaGlzIGRlc2NyaWJlcyB0aGUgZmlsZXN5c3RlbS4gQXMgb2Yga2VybmVsIDIuNi4yMiwgdGhlIGZvbGxvd2luZwogbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewpAQCAtMTE5LDYgKzExOSw4IEBACiAgICAgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyOwogICAgICAgICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqIG5leHQ7CiAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgZnNfc3VwZXJzOworCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBzX2xvY2tfa2V5OworCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBzX3Vtb3VudF9rZXk7CiB9OwogCiAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaWxlc3lzdGVtIHR5cGUsIHN1Y2ggYXMgImV4dDIiLCAiaXNvOTY2MCIsCkBAIC0xMzcsMTEgKzEzOSwxMiBAQAogCiAgIG5leHQ6IGZvciBpbnRlcm5hbCBWRlMgdXNlOiB5b3Ugc2hvdWxkIGluaXRpYWxpemUgdGhpcyB0byBOVUxMCiAKKyAgc19sb2NrX2tleSwgc191bW91bnRfa2V5OiBsb2NrZGVwLXNwZWNpZmljCisKIFRoZSBnZXRfc2IoKSBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogCi0gIHN0cnVjdCBzdXBlcl9ibG9jayAqc2I6IHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZS4gVGhpcyBpcyBwYXJ0aWFsbHkKLQlpbml0aWFsaXplZCBieSB0aGUgVkZTIGFuZCB0aGUgcmVzdCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IHRoZQotCWdldF9zYigpIG1ldGhvZAorICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZTogZGVjcmliZXMgdGhlIGZpbGVzeXN0ZW0sIHBhcnRseSBpbml0aWFsaXplZAorICAJYnkgdGhlIHNwZWNpZmljIGZpbGVzeXN0ZW0gY29kZQogCiAgIGludCBmbGFnczogbW91bnQgZmxhZ3MKIApAQCAtMTUwLDEyICsxNTMsMTMgQEAKICAgdm9pZCAqZGF0YTogYXJiaXRyYXJ5IG1vdW50IG9wdGlvbnMsIHVzdWFsbHkgY29tZXMgYXMgYW4gQVNDSUkKIAlzdHJpbmcKIAotICBpbnQgc2lsZW50OiB3aGV0aGVyIG9yIG5vdCB0byBiZSBzaWxlbnQgb24gZXJyb3IKKyAgc3RydWN0IHZmc21vdW50ICptbnQ6IGEgdmZzLWludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbW91bnQgcG9pbnQKIAogVGhlIGdldF9zYigpIG1ldGhvZCBtdXN0IGRldGVybWluZSBpZiB0aGUgYmxvY2sgZGV2aWNlIHNwZWNpZmllZAotaW4gdGhlIHN1cGVyYmxvY2sgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKLXN1cHBvcnRzLiBPbiBzdWNjZXNzIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgc3VwZXJibG9jayBwb2ludGVyLCBvbgotZmFpbHVyZSBpdCByZXR1cm5zIE5VTEwuCitpbiB0aGUgZGV2X25hbWUgYW5kIGZzX3R5cGUgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKK3N1cHBvcnRzLiBJZiBpdCBzdWNjZWVkcyBpbiBvcGVuaW5nIHRoZSBuYW1lZCBibG9jayBkZXZpY2UsIGl0IGluaXRpYWxpemVzIGEKK3N0cnVjdCBzdXBlcl9ibG9jayBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZXN5c3RlbSBjb250YWluZWQgYnkgdGhlIGJsb2NrIGRldmljZS4KK09uIGZhaWx1cmUgaXQgcmV0dXJucyBhbiBlcnJvci4KIAogVGhlIG1vc3QgaW50ZXJlc3RpbmcgbWVtYmVyIG9mIHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZSB0aGF0IHRoZQogZ2V0X3NiKCkgbWV0aG9kIGZpbGxzIGluIGlzIHRoZSAic19vcCIgZmllbGQuIFRoaXMgaXMgYSBwb2ludGVyIHRvCkBAIC0xOTMsNyArMTk3LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIHRoZSBzdXBlcmJsb2NrIG9mIHlvdXIKLWZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKK2ZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgewogICAgICAgICBzdHJ1Y3QgaW5vZGUgKigqYWxsb2NfaW5vZGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMjE2LDggKzIyMCw2IEBACiAgICAgICAgIHZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKICAgICAgICAgdm9pZCAoKnVtb3VudF9iZWdpbikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAotICAgICAgICB2b2lkICgqc3luY19pbm9kZXMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiAgICAgICAgIGludCAoKnNob3dfb3B0aW9ucykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAogICAgICAgICBzc2l6ZV90ICgqcXVvdGFfcmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CkBAIC0zMDAsOSArMzAyLDYgQEAKIAogICB1bW91bnRfYmVnaW46IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgdW5tb3VudGluZyBhIGZpbGVzeXN0ZW0uCiAKLSAgc3luY19pbm9kZXM6IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgd3JpdGluZyBvdXQgZGlydHkgZGF0YSBhc3NvY2lhdGVkIHdpdGgKLSAgCWEgc3VwZXJibG9jay4KLQogICBzaG93X29wdGlvbnM6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHNob3cgbW91bnQgb3B0aW9ucyBmb3IgL3Byb2MvPHBpZD4vbW91bnRzLgogCiAgIHF1b3RhX3JlYWQ6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHJlYWQgZnJvbSBmaWxlc3lzdGVtIHF1b3RhIGZpbGUuCkBAIC0zMjQsNyArMzIzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIGFuIGlub2RlIGluIHlvdXIKLWZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKK2ZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgewogCWludCAoKmNyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CkBAIC0zNDgsNiArMzQ3LDcgQEAKIAlzc2l6ZV90ICgqZ2V0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOwogCXNzaXplX3QgKCpsaXN0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIAlpbnQgKCpyZW1vdmV4YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKwl2b2lkICgqdHJ1bmNhdGVfcmFuZ2UpKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QsIGxvZmZfdCk7CiB9OwogCiBBZ2FpbiwgYWxsIG1ldGhvZHMgYXJlIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrcyBiZWluZyBoZWxkLCB1bmxlc3MKQEAgLTQ0NCw2ICs0NDQsOSBAQAogICByZW1vdmV4YXR0cjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmcm9tCiAgIAlhIGZpbGUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZW1vdmV4YXR0cigyKSBzeXN0ZW0gY2FsbC4KIAorICB0cnVuY2F0ZV9yYW5nZTogYSBtZXRob2QgcHJvdmlkZWQgYnkgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSB0byB0cnVuY2F0ZSBhCisgIAlyYW5nZSBvZiBibG9ja3MgLCBpLmUuIHB1bmNoIGEgaG9sZSBzb21ld2hlcmUgaW4gYSBmaWxlLgorCiAKIFRoZSBBZGRyZXNzIFNwYWNlIE9iamVjdAogPT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MjIsNyArNTI1LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhpcyBkZXNjcmliZXMgaG93IHRoZSBWRlMgY2FuIG1hbmlwdWxhdGUgbWFwcGluZyBvZiBhIGZpbGUgdG8gcGFnZSBjYWNoZSBpbgoteW91ciBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjE2LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6Cit5b3VyIGZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB7CiAJaW50ICgqd3JpdGVwYWdlKShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwpAQCAtNTQzLDYgKzU0Niw3IEBACiAJCQlpbnQpOwogCS8qIG1pZ3JhdGUgdGhlIGNvbnRlbnRzIG9mIGEgcGFnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCAqLwogCWludCAoKm1pZ3JhdGVwYWdlKSAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CisJaW50ICgqbGF1bmRlcl9wYWdlKSAoc3RydWN0IHBhZ2UgKik7CiB9OwogCiAgIHdyaXRlcGFnZTogY2FsbGVkIGJ5IHRoZSBWTSB0byB3cml0ZSBhIGRpcnR5IHBhZ2UgdG8gYmFja2luZyBzdG9yZS4KQEAgLTY4OSw2ICs2OTMsMTAgQEAKIAl0cmFuc2ZlciBhbnkgcHJpdmF0ZSBkYXRhIGFjcm9zcyBhbmQgdXBkYXRlIGFueSByZWZlcmVuY2VzCiAgICAgICAgIHRoYXQgaXQgaGFzIHRvIHRoZSBwYWdlLgogCisgIGxhdW5kZXJfcGFnZTogQ2FsbGVkIGJlZm9yZSBmcmVlaW5nIGEgcGFnZSAtIGl0IHdyaXRlcyBiYWNrIHRoZSBkaXJ0eSBwYWdlLiBUbworICAJcHJldmVudCByZWRpcnR5aW5nIHRoZSBwYWdlLCBpdCBpcyBrZXB0IGxvY2tlZCBkdXJpbmcgdGhlIHdob2xlCisJb3BlcmF0aW9uLgorCiBUaGUgRmlsZSBPYmplY3QKID09PT09PT09PT09PT09PQogCkBAIC02OTksOSArNzA3LDEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIGFuIG9wZW4gZmlsZS4gQXMgb2Yga2VybmVsCi0yLjYuMTcsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKKzIuNi4yMiwgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGFyZSBkZWZpbmVkOgogCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlsb2ZmX3QgKCpsbHNlZWspIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiAJc3NpemVfdCAoKnJlYWQpIChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIAlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKQEAgLTcyOCwxMCArNzM3LDggQEAKIAlpbnQgKCpjaGVja19mbGFncykoaW50KTsKIAlpbnQgKCpkaXJfbm90aWZ5KShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCWludCAoKmZsb2NrKSAoc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOwotCXNzaXplX3QgKCpzcGxpY2Vfd3JpdGUpKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc2l6ZV90LCB1bnNpZ25lZCAKLWludCk7Ci0Jc3NpemVfdCAoKnNwbGljZV9yZWFkKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHNpemVfdCwgdW5zaWduZWQgIAotaW50KTsKKwlzc2l6ZV90ICgqc3BsaWNlX3dyaXRlKShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHN0cnVjdCBmaWxlICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKwlzc2l6ZV90ICgqc3BsaWNlX3JlYWQpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogfTsKIAogQWdhaW4sIGFsbCBtZXRob2RzIGFyZSBjYWxsZWQgd2l0aG91dCBhbnkgbG9ja3MgYmVpbmcgaGVsZCwgdW5sZXNzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVyL3RpbWVyX3N0YXRzLnR4dAppbmRleCAyMmIwODE0Li4yMGQzNjhjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaHJ0aW1lci90aW1lcl9zdGF0cy50eHQKQEAgLTY3LDMgKzY3LDcgQEAKIAogICAgIFRob21hcywgSW5nbwogCitBZGRlZCBmbGFnIHRvIGluZGljYXRlICdkZWZlcnJhYmxlIHRpbWVyJyBpbiAvcHJvYy90aW1lcl9zdGF0cy4gQSBkZWZlcnJhYmxlCit0aW1lciB3aWxsIGFwcGVhciBhcyBmb2xsb3dzCisgIDEwRCwgICAgIDEgc3dhcHBlciAgICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmtfb24gKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0CmluZGV4IDNkZTdkMzcuLjVjN2ZiZjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwtbnVtYmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvY3RsLW51bWJlci50eHQKQEAgLTY3LDcgKzY3LDcgQEAKIDB4MDAJMDAtMUYJbGludXgvd2F2ZWZyb250LmgJY29uZmxpY3QhCiAweDAyCWFsbAlsaW51eC9mZC5oCiAweDAzCWFsbAlsaW51eC9oZHJlZy5oCi0weDA0CWFsbAlsaW51eC91bXNkb3NfZnMuaAorMHgwNAlEMi1EQwlsaW51eC91bXNkb3NfZnMuaAlEZWFkIHNpbmNlIDIuNi4xMSwgYnV0IGRvbid0IHJldXNlIHRoZXNlLgogMHgwNglhbGwJbGludXgvbHAuaAogMHgwOQlhbGwJbGludXgvbWQuaAogMHgxMglhbGwJbGludXgvZnMuaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA0ZDg4MGIzLi45YTU0MTQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMzQsNyArMzQsNiBAQAogCUFQSUMJQVBJQyBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJQVBNCUFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBpcyBlbmFibGVkLgogCUFYMjUJQXBwcm9wcmlhdGUgQVguMjUgc3VwcG9ydCBpcyBlbmFibGVkLgotCUNECUFwcHJvcHJpYXRlIENEIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlEUk0JRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VtZW50IHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlFREQJQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIFNlcnZpY2VzIChFREQpIGlzIGVuYWJsZWQKIAlFRkkJRUZJIFBhcnRpdGlvbmluZyAoR1BUKSBpcyBlbmFibGVkCkBAIC0yMzgsMTYgKzIzNyw5IEBACiAJCQlEaXNhYmxlIFBJTiAxIG9mIEFQSUMgdGltZXIKIAkJCUNhbiBiZSB1c2VmdWwgdG8gd29yayBhcm91bmQgY2hpcHNldCBidWdzLgogCi0JYWQxODE2PQkJW0hXLE9TU10KLQkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4KLQkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vc291bmQvb3NzL0FEMTgxNi4KLQogCWFkMTg0OD0JCVtIVyxPU1NdCiAJCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDx0eXBlPgogCi0JYWRsaWI9CQlbSFcsT1NTXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlhZHZhbnN5cz0JW0hXLFNDU0ldCiAJCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS9hZHZhbnN5cy5jLgogCkBAIC0zMjYsOSArMzE4LDYgQEAKIAogCWF1dG90ZXN0CVtJQTY0XQogCi0JYXp0Y2Q9CQlbSFcsQ0RdIEF6dGVjaCBDRDI2OCBDRFJPTSBkcml2ZXIKLQkJCUZvcm1hdDogPGlvPiwweDc5ICg/KQotCiAJYmF5Y29tX2VwcD0JW0hXLEFYMjVdCiAJCQlGb3JtYXQ6IDxpbz4sPG1vZGU+CiAKQEAgLTM3MSwxMCArMzYwLDYgQEAKIAkJCXBvc3NpYmxlIHRvIGRldGVybWluZSB3aGF0IHRoZSBjb3JyZWN0IHNpemUgc2hvdWxkIGJlLgogCQkJVGhpcyBvcHRpb24gcHJvdmlkZXMgYW4gb3ZlcnJpZGUgZm9yIHRoZXNlIHNpdHVhdGlvbnMuCiAKLQljZHUzMWE9CQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz4sPGlycT5bLFBBU10KLQkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9jZHJvbS9jZHUzMWEuYy4KLQogCWNoYW5kZXY9CVtIVyxORVRdIEdlbmVyaWMgY2hhbm5lbCBkZXZpY2UgaW5pdGlhbGlzYXRpb24KIAogCWNoZWNrcmVxcHJvdAlbU0VMSU5VWF0gU2V0IGluaXRpYWwgY2hlY2tyZXFwcm90IGZsYWcgdmFsdWUuCkBAIC00MjgsOSArNDEzLDYgQEAKIAlocGV0PQkJW0lBLTMyLEhQRVRdIG9wdGlvbiB0byBkaXNhYmxlIEhQRVQgYW5kIHVzZSBQSVQuCiAJCQlGb3JtYXQ6IGRpc2FibGUKIAotCWNtMjA2PQkJW0hXLENEXQotCQkJRm9ybWF0OiB7IGF1dG8gfCBbPGlvPixdWzxpcnE+XSB9Ci0KIAljb20yMDAyMD0JW0hXLE5FVF0gQVJDbmV0IC0gQ09NMjAwMjAgY2hpcHNldAogCQkJRm9ybWF0OgogCQkJPGlvPlssPGlycT5bLDxub2RlSUQ+Wyw8YmFja3BsYW5lPlssPGNrcD5bLDx0aW1lb3V0Pl1dXV1dCkBAIC00NjIsMTMgKzQ0NCwyMCBAQAogCQkJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGNvbnNvbGUudHh0IGZvciBhbgogCQkJYWx0ZXJuYXRpdmUuCiAKLQkJdWFydCxpbyw8YWRkcj5bLG9wdGlvbnNdCi0JCXVhcnQsbW1pbyw8YWRkcj5bLG9wdGlvbnNdCisJCXVhcnRbODI1MF0saW8sPGFkZHI+WyxvcHRpb25zXQorCQl1YXJ0WzgyNTBdLG1taW8sPGFkZHI+WyxvcHRpb25zXQogCQkJU3RhcnQgYW4gZWFybHksIHBvbGxlZC1tb2RlIGNvbnNvbGUgb24gdGhlIDgyNTAvMTY1NTAKIAkJCVVBUlQgYXQgdGhlIHNwZWNpZmllZCBJL08gcG9ydCBvciBNTUlPIGFkZHJlc3MsCiAJCQlzd2l0Y2hpbmcgdG8gdGhlIG1hdGNoaW5nIHR0eVMgZGV2aWNlIGxhdGVyLiAgVGhlCiAJCQlvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgdHR5UywgYWJvdmUuCiAKKwllYXJseWNvbj0JW0tOTF0gT3V0cHV0IGVhcmx5IGNvbnNvbGUgZGV2aWNlIGFuZCBvcHRpb25zLgorCQl1YXJ0WzgyNTBdLGlvLDxhZGRyPlssb3B0aW9uc10KKwkJdWFydFs4MjUwXSxtbWlvLDxhZGRyPlssb3B0aW9uc10KKwkJCVN0YXJ0IGFuIGVhcmx5LCBwb2xsZWQtbW9kZSBjb25zb2xlIG9uIHRoZSA4MjUwLzE2NTUwCisJCQlVQVJUIGF0IHRoZSBzcGVjaWZpZWQgSS9PIHBvcnQgb3IgTU1JTyBhZGRyZXNzLgorCQkJVGhlIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciB0dHlTLCBhYm92ZS4KKwogCWNwY2locF9nZW5lcmljPQlbSFcsUENJXSBHZW5lcmljIHBvcnQgSS9PIENvbXBhY3RQQ0kgZHJpdmVyCiAJCQlGb3JtYXQ6CiAJCQk8Zmlyc3Rfc2xvdD4sPGxhc3Rfc2xvdD4sPHBvcnQ+LDxlbnVtX2JpdD5bLDxkZWJ1Zz5dCkBAIC02NjAsOSArNjQ5LDYgQEAKIAlncHQJCVtFRkldIEZvcmNlcyBkaXNrIHdpdGggdmFsaWQgR1BUIHNpZ25hdHVyZSBidXQKIAkJCWludmFsaWQgUHJvdGVjdGl2ZSBNQlIgdG8gYmUgdHJlYXRlZCBhcyBHUFQuCiAKLQlnc2NkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlndnAxMT0JCVtIVyxTQ1NJXQogCiAJaGFzaGRpc3Q9CVtLTkwsTlVNQV0gTGFyZ2UgaGFzaGVzIGFsbG9jYXRlZCBkdXJpbmcgYm9vdApAQCAtODI2LDE0ICs4MTIsMzcgQEAKIAkJCXRhc2tzIGluIHRoZSBzeXN0ZW0gLS0gY2FuIGNhdXNlIHByb2JsZW1zIGFuZAogCQkJc3Vib3B0aW1hbCBsb2FkIGJhbGFuY2VyIHBlcmZvcm1hbmNlLgogCi0JaXNwMTY9CQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPHNldHVwPgotCiAJaXVjdj0JCVtIVyxORVRdCiAKIAlqcz0JCVtIVyxKT1ldIEFuYWxvZyBqb3lzdGljawogCQkJU2VlIERvY3VtZW50YXRpb24vaW5wdXQvam95c3RpY2sudHh0LgogCisJa2VybmVsY29yZT1ubltLTUddCVtLTkwsSUEtMzIsSUEtNjQsUFBDLFg4Ni02NF0gVGhpcyBwYXJhbWV0ZXIKKwkJCXNwZWNpZmllcyB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2FibGUgYnkgdGhlIGtlcm5lbAorCQkJZm9yIG5vbi1tb3ZhYmxlIGFsbG9jYXRpb25zLiAgVGhlIHJlcXVlc3RlZCBhbW91bnQgaXMKKwkJCXNwcmVhZCBldmVubHkgdGhyb3VnaG91dCBhbGwgbm9kZXMgaW4gdGhlIHN5c3RlbS4gVGhlCisJCQlyZW1haW5pbmcgbWVtb3J5IGluIGVhY2ggbm9kZSBpcyB1c2VkIGZvciBNb3ZhYmxlCisJCQlwYWdlcy4gSW4gdGhlIGV2ZW50LCBhIG5vZGUgaXMgdG9vIHNtYWxsIHRvIGhhdmUgYm90aAorCQkJa2VybmVsY29yZSBhbmQgTW92YWJsZSBwYWdlcywga2VybmVsY29yZSBwYWdlcyB3aWxsCisJCQl0YWtlIHByaW9yaXR5IGFuZCBvdGhlciBub2RlcyB3aWxsIGhhdmUgYSBsYXJnZXIgbnVtYmVyCisJCQlvZiBrZXJuZWxjb3JlIHBhZ2VzLiAgVGhlIE1vdmFibGUgem9uZSBpcyB1c2VkIGZvciB0aGUKKwkJCWFsbG9jYXRpb24gb2YgcGFnZXMgdGhhdCBtYXkgYmUgcmVjbGFpbWVkIG9yIG1vdmVkCisJCQlieSB0aGUgcGFnZSBtaWdyYXRpb24gc3Vic3lzdGVtLiAgVGhpcyBtZWFucyB0aGF0CisJCQlIdWdlVExCIHBhZ2VzIG1heSBub3QgYmUgYWxsb2NhdGVkIGZyb20gdGhpcyB6b25lLgorCQkJTm90ZSB0aGF0IGFsbG9jYXRpb25zIGxpa2UgUFRFcy1mcm9tLUhpZ2hNZW0gc3RpbGwKKwkJCXVzZSB0aGUgSGlnaE1lbSB6b25lIGlmIGl0IGV4aXN0cywgYW5kIHRoZSBOb3JtYWwKKwkJCXpvbmUgaWYgaXQgZG9lcyBub3QuCisKKwltb3ZhYmxlY29yZT1ubltLTUddCVtLTkwsSUEtMzIsSUEtNjQsUFBDLFg4Ni02NF0gVGhpcyBwYXJhbWV0ZXIKKwkJCWlzIHNpbWlsYXIgdG8ga2VybmVsY29yZSBleGNlcHQgaXQgc3BlY2lmaWVzIHRoZQorCQkJYW1vdW50IG9mIG1lbW9yeSB1c2VkIGZvciBtaWdyYXRhYmxlIGFsbG9jYXRpb25zLgorCQkJSWYgYm90aCBrZXJuZWxjb3JlIGFuZCBtb3ZhYmxlY29yZSBpcyBzcGVjaWZpZWQsCisJCQl0aGVuIGtlcm5lbGNvcmUgd2lsbCBiZSBhdCAqbGVhc3QqIHRoZSBzcGVjaWZpZWQKKwkJCXZhbHVlIGJ1dCBtYXkgYmUgbW9yZS4gSWYgbW92YWJsZWNvcmUgb24gaXRzIG93bgorCQkJaXMgc3BlY2lmaWVkLCB0aGUgYWRtaW5pc3RyYXRvciBtdXN0IGJlIGNhcmVmdWwKKwkJCXRoYXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNhYmxlIGZvciBhbGwgYWxsb2NhdGlvbnMKKwkJCWlzIG5vdCB0b28gc21hbGwuCisKIAlrZWVwaW5pdHJkCVtIVyxBUk1dCiAKIAlrc3RhY2s9TglbSUEtMzIsWDg2LTY0XSBQcmludCBOIHdvcmRzIGZyb20gdGhlIGtlcm5lbCBzdGFjawpAQCAtOTY3LDExICs5NzYsNiBAQAogCiAJbWNhdGVzdD0JW0lBLTY0XQogCi0JbWNkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8cG9ydD4sPGlycT4sPG1pdHN1bWlfYnVnXzkzX3dhaXQ+Ci0KLQltY2R4PQkJW0hXLENEXQotCiAJbWNlCQlbSUEtMzJdIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uCiAKIAltZD0JCVtIV10gUkFJRCBzdWJzeXN0ZW1zIGRldmljZXMgYW5kIGxldmVsCkBAIC0xMTgxLDYgKzExODUsOCBAQAogCiAJbm9zbXAJCVtTTVBdIFRlbGxzIGFuIFNNUCBrZXJuZWwgdG8gYWN0IGFzIGEgVVAga2VybmVsLgogCisJbm9zb2Z0bG9ja3VwCVtLTkxdIERpc2FibGUgdGhlIHNvZnQtbG9ja3VwIGRldGVjdG9yLgorCiAJbm9zeW5jCQlbSFcsTTY4S10gRGlzYWJsZXMgc3luYyBuZWdvdGlhdGlvbiBmb3IgYWxsIGRldmljZXMuCiAKIAlub3RzYwkJW0JVR1M9SUEtMzJdIERpc2FibGUgVGltZSBTdGFtcCBDb3VudGVyCkBAIC0xMTg5LDIwICsxMTk1LDE5IEBACiAKIAlub3diCQlbQVJNXQogCisJbnVtYV96b25lbGlzdF9vcmRlcj0gW0tOTCwgQk9PVF0gU2VsZWN0IHpvbmVsaXN0IG9yZGVyIGZvciBOVU1BLgorCQkJb25lIG9mIFsnem9uZScsICdub2RlJywgJ2RlZmF1bHQnXSBjYW4gYmUgc3BlY2lmaWVkCisJCQlUaGlzIGNhbiBiZSBzZXQgZnJvbSBzeXNjdGwgYWZ0ZXIgYm9vdC4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgZm9yIGRldGFpbHMuCisKIAlucl91YXJ0cz0JW1NFUklBTF0gbWF4aW11bSBudW1iZXIgb2YgVUFSVHMgdG8gYmUgcmVnaXN0ZXJlZC4KIAogCW9wbDM9CQlbSFcsT1NTXQogCQkJRm9ybWF0OiA8aW8+CiAKLQlvcGwzc2EyPQlbSFcsT1NTXSBGb3JtYXQ6Ci0JCQk8aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXNzX2lvPiw8bXB1X2lvPiw8eW1vZGU+LDxsb29wYmFjaz5bLDxpc2FwbnA+LDxtdWx0aXBsZV0KLQogCW9wcm9maWxlLnRpbWVyPQlbSFddCiAJCQlVc2UgdGltZXIgaW50ZXJydXB0IGluc3RlYWQgb2YgcGVyZm9ybWFuY2UgY291bnRlcnMKIAotCW9wdGNkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlvc3N0PQkJW0hXLFNDU0ldIFNDU0kgVGFwZSBEcml2ZXIKIAkJCUZvcm1hdDogPGJ1ZmZlcl9zaXplPiw8d3JpdGVfdGhyZXNob2xkPgogCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dC4KQEAgLTEzODEsNiArMTM4NiwxNSBAQAogCQkJYXV0b2NvbmZpZ3VyYXRpb24uCiAJCQlSYW5nZXMgYXJlIGluIHBhaXJzIChtZW1vcnkgYmFzZSBhbmQgc2l6ZSkuCiAKKwlwcmludC1mYXRhbC1zaWduYWxzPQorCQkJW0tOTF0gZGVidWc6IHByaW50IGZhdGFsIHNpZ25hbHMKKwkJCXByaW50LWZhdGFsLXNpZ25hbHM9MTogcHJpbnQgc2VnZmF1bHQgaW5mbyB0bworCQkJdGhlIGtlcm5lbCBjb25zb2xlLgorCQkJZGVmYXVsdDogb2ZmLgorCisJcHJpbnRrLnRpbWU9CVNob3cgdGltaW5nIGRhdGEgcHJlZml4ZWQgdG8gZWFjaCBwcmludGsgbWVzc2FnZSBsaW5lCisJCQlGb3JtYXQ6IDxib29sPiAgKDEvWS95PWVuYWJsZSwgMC9OL249ZGlzYWJsZSkKKwogCXByb2ZpbGU9CVtLTkxdIEVuYWJsZSBrZXJuZWwgcHJvZmlsaW5nIHZpYSAvcHJvYy9wcm9maWxlCiAJCQlGb3JtYXQ6IFtzY2hlZHVsZSxdPG51bWJlcj4KIAkJCVBhcmFtOiAic2NoZWR1bGUiIC0gcHJvZmlsZSBzY2hlZHVsZSBwb2ludHMuCkBAIC0xNDkzLDYgKzE1MDcsMTAgQEAKIAogCXJvb3Rmc3R5cGU9CVtLTkxdIFNldCByb290IGZpbGVzeXN0ZW0gdHlwZQogCisJcm9vdHdhaXQJW0tOTF0gV2FpdCAoaW5kZWZpbml0ZWx5KSBmb3Igcm9vdCBkZXZpY2UgdG8gc2hvdyB1cC4KKwkJCVVzZWZ1bCBmb3IgZGV2aWNlcyB0aGF0IGFyZSBkZXRlY3RlZCBhc3luY2hyb25vdXNseQorCQkJKGUuZy4gVVNCIGFuZCBNTUMgZGV2aWNlcykuCisKIAlydwkJW0tOTF0gTW91bnQgcm9vdCBkZXZpY2UgcmVhZC13cml0ZSBvbiBib290CiAKIAlTCQlbS05MXSBSdW4gaW5pdCBpbiBzaW5nbGUgbW9kZQpAQCAtMTUwNSwxMSArMTUyMyw2IEBACiAKIAlzYm5pPQkJW05FVF0gR3JhbmNoIFNCTkkxMiBsZWFzZWQgbGluZSBhZGFwdGVyCiAKLQlzYnBjZD0JCVtIVyxDRF0gU291bmRibGFzdGVyIENEIGFkYXB0ZXIKLQkJCUZvcm1hdDogPGlvPiw8dHlwZT4KLQkJCVNlZSBhIGNvbW1lbnQgYmVmb3JlIGZ1bmN0aW9uIHNicGNkX3NldHVwKCkgaW4KLQkJCWRyaXZlcnMvY2Ryb20vc2JwY2QuYy4KLQogCXNjMTIwMHdkdD0JW0hXLFdEVF0gU0MxMjAwIFdEVCAod2F0Y2hkb2cpIGRyaXZlcgogCQkJRm9ybWF0OiA8aW8+Wyw8dGltZW91dD5bLDxpc2FwbnA+XV0KIApAQCAtMTU2Miw0MSArMTU3NSw0MSBAQAogCXNpbWV0aD0JCVtJQS02NF0KIAlzaW1zY3NpPQogCi0Jc2pjZD0JCVtIVyxDRF0KLQkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPgotCQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL2Nkcm9tL3NqY2QuYy4KLQogCXNscmFtPQkJW0hXLE1URF0KIAotCXNsdWJfZGVidWcJW01NLCBTTFVCXQotCQkJRW5hYmxpbmcgc2x1Yl9kZWJ1ZyBhbGxvd3Mgb25lIHRvIGRldGVybWluZSB0aGUgY3VscHJpdAotCQkJaWYgc2xhYiBvYmplY3RzIGJlY29tZSBjb3JydXB0ZWQuIEVuYWJsaW5nIHNsdWJfZGVidWcKLQkJCWNyZWF0ZXMgZ3VhcmQgem9uZXMgYXJvdW5kIG9iamVjdHMgYW5kIHBvaXNvbnMgb2JqZWN0cwotCQkJd2hlbiBub3QgaW4gdXNlLiBBbHNvIHRyYWNrcyB0aGUgbGFzdCBhbGxvYyAvIGZyZWUuCi0JCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KKwlzbHViX2RlYnVnWz1vcHRpb25zWyxzbGFic11dCVtNTSwgU0xVQl0KKwkJCUVuYWJsaW5nIHNsdWJfZGVidWcgYWxsb3dzIG9uZSB0byBkZXRlcm1pbmUgdGhlCisJCQljdWxwcml0IGlmIHNsYWIgb2JqZWN0cyBiZWNvbWUgY29ycnVwdGVkLiBFbmFibGluZworCQkJc2x1Yl9kZWJ1ZyBjYW4gY3JlYXRlIGd1YXJkIHpvbmVzIGFyb3VuZCBvYmplY3RzIGFuZAorCQkJbWF5IHBvaXNvbiBvYmplY3RzIHdoZW4gbm90IGluIHVzZS4gQWxzbyB0cmFja3MgdGhlCisJCQlsYXN0IGFsbG9jIC8gZnJlZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCisJCQlEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0LgogCiAJc2x1Yl9tYXhfb3JkZXI9IFtNTSwgU0xVQl0KLQkJCURldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBvcmRlciBmb3Igc2xhYnMuIFNldHRpbmcKLQkJCXRoaXMgdG9vIGhpZ2ggbWF5IGNhdXNlIGZyYWdtZW50YXRpb24uCi0JCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KKwkJCURldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBvcmRlciBmb3Igc2xhYnMuCisJCQlBIGhpZ2ggc2V0dGluZyBtYXkgY2F1c2UgT09NcyBkdWUgdG8gbWVtb3J5CisJCQlmcmFnbWVudGF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUKKwkJCURvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQuCiAKIAlzbHViX21pbl9vYmplY3RzPQlbTU0sIFNMVUJdCi0JCQlUaGUgbWluaW11bSBvYmplY3RzIHBlciBzbGFiLiBTTFVCIHdpbGwgaW5jcmVhc2UgdGhlCi0JCQlzbGFiIG9yZGVyIHVwIHRvIHNsdWJfbWF4X29yZGVyIHRvIGdlbmVyYXRlIGEKLQkJCXN1ZmZpY2llbnRseSBiaWcgc2xhYiB0byBzYXRpc2Z5IHRoZSBudW1iZXIgb2Ygb2JqZWN0cy4KLQkJCVRoZSBoaWdoZXIgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoZSBzbWFsbGVyIHRoZSBvdmVyaGVhZAotCQkJb2YgdHJhY2tpbmcgc2xhYnMuCisJCQlUaGUgbWluaW11bSBudW1iZXIgb2Ygb2JqZWN0cyBwZXIgc2xhYi4gU0xVQiB3aWxsCisJCQlpbmNyZWFzZSB0aGUgc2xhYiBvcmRlciB1cCB0byBzbHViX21heF9vcmRlciB0bworCQkJZ2VuZXJhdGUgYSBzdWZmaWNpZW50bHkgbGFyZ2Ugc2xhYiBhYmxlIHRvIGNvbnRhaW4KKwkJCXRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbmRpY2F0ZWQuIFRoZSBoaWdoZXIgdGhlIG51bWJlcgorCQkJb2Ygb2JqZWN0cyB0aGUgc21hbGxlciB0aGUgb3ZlcmhlYWQgb2YgdHJhY2tpbmcgc2xhYnMKKwkJCWFuZCB0aGUgbGVzcyBmcmVxdWVudGx5IGxvY2tzIG5lZWQgdG8gYmUgYWNxdWlyZWQuCiAJCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KIAogCXNsdWJfbWluX29yZGVyPQlbTU0sIFNMVUJdCiAJCQlEZXRlcm1pbmVzIHRoZSBtaW5pbnVtIHBhZ2Ugb3JkZXIgZm9yIHNsYWJzLiBNdXN0IGJlCi0JCQlsb3dlciB0aGFuIHNsdWJfbWF4X29yZGVyCisJCQlsb3dlciB0aGFuIHNsdWJfbWF4X29yZGVyLgogCQkJRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIERvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQuCiAKIAlzbHViX25vbWVyZ2UJW01NLCBTTFVCXQotCQkJRGlzYWJsZSBtZXJnaW5nIG9mIHNsYWJzIG9mIHNpbWlsYXIgc2l6ZS4gTWF5IGJlCisJCQlEaXNhYmxlIG1lcmdpbmcgb2Ygc2xhYnMgd2l0aCBzaW1pbGFyIHNpemUuIE1heSBiZQogCQkJbmVjZXNzYXJ5IGlmIHRoZXJlIGlzIHNvbWUgcmVhc29uIHRvIGRpc3Rpbmd1aXNoCi0JCQlhbGxvY3MgdG8gZGlmZmVyZW50IHNsYWJzLgorCQkJYWxsb2NzIHRvIGRpZmZlcmVudCBzbGFicy4gRGVidWcgb3B0aW9ucyBkaXNhYmxlCisJCQltZXJnaW5nIG9uIHRoZWlyIG93bi4KIAkJCUZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0LgogCiAJc21hcnQyPQkJW0hXXQpAQCAtMTczOCw5ICsxNzUxLDYgQEAKIAogCXNuZC15bWZwY2k9CVtIVyxBTFNBXQogCi0Jc29ueWNkNTM1PQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz5bLDxpcnE+XQotCiAJc29ueXBpLio9CVtIV10gU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlcgogCQkJU2VlIERvY3VtZW50YXRpb24vc29ueXBpLnR4dAogCkBAIC0xODEyLDYgKzE4MjIsNyBAQAogCQkJU2V0IG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIFRDUCBjb25uZWN0aW9uCiAKIAl0aW1lCQlTaG93IHRpbWluZyBkYXRhIHByZWZpeGVkIHRvIGVhY2ggcHJpbnRrIG1lc3NhZ2UgbGluZQorCQkJW2RlcHJlY2F0ZWQsIHNlZSAncHJpbnRrLnRpbWUnXQogCiAJdGlwYXIudGltZW91dD0JW0hXLFBQVF0KIAkJCVNldCBjb21tdW5pY2F0aW9ucyB0aW1lb3V0IGluIHRlbnRocyBvZiBhIHNlY29uZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQKaW5kZXggMWM0MWRiMi4uNTkxMDhjZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0CkBAIC04MiwxMyArODIsNiBAQAogICAvZGV2L2ZkIDogLT4gMHgwMjAwIChmbG9wcHkgZGlzaykKICAgL2Rldi94ZGE6IC0+IDB4MGMwMCAoZmlyc3QgWFQgZGlzaywgdW51c2VkIGluIExpbnV4L202OGspCiAgIC9kZXYveGRiOiAtPiAweDBjNDAgKHNlY29uZCBYVCBkaXNrLCB1bnVzZWQgaW4gTGludXgvbTY4aykKLSAgL2Rldi9hZGE6IC0+IDB4MWMwMCAoZmlyc3QgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRiOiAtPiAweDFjMTAgKHNlY29uZCBBQ1NJIGRldmljZSkKLSAgL2Rldi9hZGM6IC0+IDB4MWMyMCAodGhpcmQgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRkOiAtPiAweDFjMzAgKGZvcnRoIEFDU0kgZGV2aWNlKQotCi1UaGUgbGFzdCBmb3VyIG5hbWVzIGFyZSBhdmFpbGFibGUgb25seSBpZiB0aGUga2VybmVsIGhhcyBiZWVuIGNvbXBpbGVkCi13aXRoIEF0YXJpIGFuZCBBQ1NJIHN1cHBvcnQuCiAKICAgVGhlIG5hbWUgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGRlY2ltYWwgbnVtYmVyLCB0aGF0IHN0YW5kcyBmb3IgdGhlCiBwYXJ0aXRpb24gbnVtYmVyLiBJbnRlcm5hbGx5LCB0aGUgdmFsdWUgb2YgdGhlIG51bWJlciBpcyBqdXN0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dAppbmRleCAwYjI3ODYzLi45OGM0MzkyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQKQEAgLTE0NiwxMiArMTQ2LDYgQEAKIAlpcnEgPSAwCiAJKFByb2JlcyBwb3J0czogMHgyNjAsIDB4MjgwLCAweDJBMCwgMHgyNDAsIDB4MzQwLCAweDMyMCwgMHgzODAsIDB4MzAwKQogCi1hdGFyaV9iaW9uZXQuYzoKLQlTdXBwb3J0cyBmdWxsIGF1dG9wcm9iaW5nLiAobTY4ay9BdGFyaSkKLQotYXRhcmlfcGFtc25ldC5jOgotCVN1cHBvcnRzIGZ1bGwgYXV0b3Byb2JpbmcuIChtNjhrL0F0YXJpKQotCiBhdGFyaWxhbmNlLmM6CiAJU3VwcG9ydHMgZnVsbCBhdXRvcHJvYmluZy4gKG02OGsvQXRhcmkpCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dAppbmRleCA3ZDViNjBkLi43ZjYwZGZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL29vcHMtdHJhY2luZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0CkBAIC04Niw2ICs4NiwyMCBAQAogYW5kIGRvIGEgcmVwbGFjZSBvZiBzcGFjZXMgdG8gIlx4IiAtIHRoYXQncyB3aGF0IEkgZG8sIGFzIEknbSB0b28gbGF6eSAKIHRvIHdyaXRlIGEgcHJvZ3JhbSB0byBhdXRvbWF0ZSB0aGlzIGFsbCkuCiAKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBzaGVsbCBzY3JpcHQgaW4gc2NyaXB0cy9kZWNvZGVjb2RlLgorSXRzIHVzYWdlIGlzOiAgZGVjb2RlY29kZSA8IG9vcHMudHh0CisKK1RoZSBoZXggYnl0ZXMgdGhhdCBmb2xsb3cgIkNvZGU6IiBtYXkgKGluIHNvbWUgYXJjaGl0ZWN0dXJlcykgaGF2ZSBhIHNlcmllcworb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgYXMgd2VsbCBhcyBieXRlcyBhdCBhbmQKK2ZvbGxvd2luZyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyLiAgSW4gc29tZSBjYXNlcywgb25lIGluc3RydWN0aW9uCitieXRlIG9yIHdvcmQgaXMgc3Vycm91bmRlZCBieSA8PiBvciAoKSwgYXMgaW4gIjw4Nj4iIG9yICIoZjAwZCkiLiAgVGhlc2UKKzw+IG9yICgpIG1hcmtpbmdzIGluZGljYXRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIuICBFeGFtcGxlIGZyb20KK2kzODYsIHNwbGl0IGludG8gbXVsdGlwbGUgbGluZXMgZm9yIHJlYWRhYmlsaXR5OgorCitDb2RlOiBmOSAwZiA4ZCBmOSAwMCAwMCAwMCA4ZCA0MiAwYyBlOCBkZCAyNiAxMSBjNyBhMSA2MCBlYSAyYiBmOSA4YiA1MCAwOCBhMQorNjQgZWEgMmIgZjkgOGQgMzQgODIgOGIgMWUgODUgZGIgNzQgNmQgOGIgMTUgNjAgZWEgMmIgZjkgPDhiPiA0MyAwNCAzOSA0MiA1NAorN2UgMDQgNDAgODkgNDIgNTQgOGIgNDMgMDQgM2IgMDUgMDAgZjYgNTIgYzAKKwogRmluYWxseSwgaWYgeW91IHdhbnQgdG8gc2VlIHdoZXJlIHRoZSBjb2RlIGNvbWVzIGZyb20sIHlvdSBjYW4gZG8KIAogCWNkIC91c3Ivc3JjL2xpbnV4CkBAIC0yMzcsNiArMjUxLDggQEAKICAgNzogJ1UnIGlmIGEgdXNlciBvciB1c2VyIGFwcGxpY2F0aW9uIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgdGhhdCB0aGUKICAgICAgVGFpbnRlZCBmbGFnIGJlIHNldCwgJyAnIG90aGVyd2lzZS4KIAorICA4OiAnRCcgaWYgdGhlIGtlcm5lbCBoYXMgZGllZCByZWNlbnRseSwgaS5lLiB0aGVyZSB3YXMgYW4gT09QUyBvciBCVUcuCisKIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhlICdUYWludGVkOiAnIHN0cmluZyBpcyB0byB0ZWxsIGtlcm5lbAogZGVidWdnZXJzIGlmIHRoaXMgaXMgYSBjbGVhbiBrZXJuZWwgb3IgaWYgYW55dGhpbmcgdW51c3VhbCBoYXMKIG9jY3VycmVkLiAgVGFpbnRpbmcgaXMgcGVybWFuZW50OiBldmVuIGlmIGFuIG9mZmVuZGluZyBtb2R1bGUgaXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9mcmVlemluZy1vZi10YXNrcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxYTI4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CkBAIC0wLDAgKzEsMTYwIEBACitGcmVlemluZyBvZiB0YXNrcworCShDKSAyMDA3IFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4sIEdQTAorCitJLiBXaGF0IGlzIHRoZSBmcmVlemluZyBvZiB0YXNrcz8KKworVGhlIGZyZWV6aW5nIG9mIHRhc2tzIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIHVzZXIgc3BhY2UgcHJvY2Vzc2VzIGFuZCBzb21lCitrZXJuZWwgdGhyZWFkcyBhcmUgY29udHJvbGxlZCBkdXJpbmcgaGliZXJuYXRpb24gb3Igc3lzdGVtLXdpZGUgc3VzcGVuZCAob24gc29tZQorYXJjaGl0ZWN0dXJlcykuCisKK0lJLiBIb3cgZG9lcyBpdCB3b3JrPworCitUaGVyZSBhcmUgZm91ciBwZXItdGFzayBmbGFncyB1c2VkIGZvciB0aGF0LCBQRl9OT0ZSRUVaRSwgUEZfRlJPWkVOLCBUSUZfRlJFRVpFCithbmQgUEZfRlJFRVpFUl9TS0lQICh0aGUgbGFzdCBvbmUgaXMgYXV4aWxpYXJ5KS4gIFRoZSB0YXNrcyB0aGF0IGhhdmUKK1BGX05PRlJFRVpFIHVuc2V0IChhbGwgdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUga2VybmVsIHRocmVhZHMpIGFyZQorcmVnYXJkZWQgYXMgJ2ZyZWV6YWJsZScgYW5kIHRyZWF0ZWQgaW4gYSBzcGVjaWFsIHdheSBiZWZvcmUgdGhlIHN5c3RlbSBlbnRlcnMgYQorc3VzcGVuZCBzdGF0ZSBhcyB3ZWxsIGFzIGJlZm9yZSBhIGhpYmVybmF0aW9uIGltYWdlIGlzIGNyZWF0ZWQgKGluIHdoYXQgZm9sbG93cword2Ugb25seSBjb25zaWRlciBoaWJlcm5hdGlvbiwgYnV0IHRoZSBkZXNjcmlwdGlvbiBhbHNvIGFwcGxpZXMgdG8gc3VzcGVuZCkuCisKK05hbWVseSwgYXMgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIGhpYmVybmF0aW9uIHByb2NlZHVyZSB0aGUgZnVuY3Rpb24KK2ZyZWV6ZV9wcm9jZXNzZXMoKSAoZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jKSBpcyBjYWxsZWQuICBJdCBleGVjdXRlcwordHJ5X3RvX2ZyZWV6ZV90YXNrcygpIHRoYXQgc2V0cyBUSUZfRlJFRVpFIGZvciBhbGwgb2YgdGhlIGZyZWV6YWJsZSB0YXNrcyBhbmQKK3NlbmRzIGEgZmFrZSBzaWduYWwgdG8gZWFjaCBvZiB0aGVtLiAgQSB0YXNrIHRoYXQgcmVjZWl2ZXMgc3VjaCBhIHNpZ25hbCBhbmQgaGFzCitUSUZfRlJFRVpFIHNldCwgc2hvdWxkIHJlYWN0IHRvIGl0IGJ5IGNhbGxpbmcgdGhlIHJlZnJpZ2VyYXRvcigpIGZ1bmN0aW9uCisoZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jKSwgd2hpY2ggc2V0cyB0aGUgdGFzaydzIFBGX0ZST1pFTiBmbGFnLAorY2hhbmdlcyBpdHMgc3RhdGUgdG8gVEFTS19VTklOVEVSUlVQVElCTEUgYW5kIG1ha2VzIGl0IGxvb3AgdW50aWwgUEZfRlJPWkVOIGlzCitjbGVhcmVkIGZvciBpdC4gIFRoZW4sIHdlIHNheSB0aGF0IHRoZSB0YXNrIGlzICdmcm96ZW4nIGFuZCB0aGVyZWZvcmUgdGhlIHNldCBvZgorZnVuY3Rpb25zIGhhbmRsaW5nIHRoaXMgbWVjaGFuaXNtIGlzIGNhbGxlZCAndGhlIGZyZWV6ZXInICh0aGVzZSBmdW5jdGlvbnMgYXJlCitkZWZpbmVkIGluIGtlcm5lbC9wb3dlci9wcm9jZXNzLmMgYW5kIGluY2x1ZGUvbGludXgvZnJlZXplci5oKS4gIFVzZXIgc3BhY2UKK3Byb2Nlc3NlcyBhcmUgZ2VuZXJhbGx5IGZyb3plbiBiZWZvcmUga2VybmVsIHRocmVhZHMuCisKK0l0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBjYWxsIHJlZnJpZ2VyYXRvcigpIGRpcmVjdGx5LiAgSW5zdGVhZCwgaXQgaXMKK3JlY29tbWVuZGVkIHRvIHVzZSB0aGUgdHJ5X3RvX2ZyZWV6ZSgpIGZ1bmN0aW9uIChkZWZpbmVkIGluCitpbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaCksIHRoYXQgY2hlY2tzIHRoZSB0YXNrJ3MgVElGX0ZSRUVaRSBmbGFnIGFuZCBtYWtlcyB0aGUKK3Rhc2sgZW50ZXIgcmVmcmlnZXJhdG9yKCkgaWYgdGhlIGZsYWcgaXMgc2V0LgorCitGb3IgdXNlciBzcGFjZSBwcm9jZXNzZXMgdHJ5X3RvX2ZyZWV6ZSgpIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlCitzaWduYWwtaGFuZGxpbmcgY29kZSwgYnV0IHRoZSBmcmVlemFibGUga2VybmVsIHRocmVhZHMgbmVlZCB0byBjYWxsIGl0CitleHBsaWNpdGx5IGluIHN1aXRhYmxlIHBsYWNlcy4gIFRoZSBjb2RlIHRvIGRvIHRoaXMgbWF5IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorCisJZG8geworCQlodWJfZXZlbnRzKCk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LAorCQkJCQkhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisKKyhmcm9tIGRyaXZlcnMvdXNiL2NvcmUvaHViLmM6Omh1Yl90aHJlYWQoKSkuCisKK0lmIGEgZnJlZXphYmxlIGtlcm5lbCB0aHJlYWQgZmFpbHMgdG8gY2FsbCB0cnlfdG9fZnJlZXplKCkgYWZ0ZXIgdGhlIGZyZWV6ZXIgaGFzCitzZXQgVElGX0ZSRUVaRSBmb3IgaXQsIHRoZSBmcmVlemluZyBvZiB0YXNrcyB3aWxsIGZhaWwgYW5kIHRoZSBlbnRpcmUKK2hpYmVybmF0aW9uIG9wZXJhdGlvbiB3aWxsIGJlIGNhbmNlbGxlZC4gIEZvciB0aGlzIHJlYXNvbiwgZnJlZXphYmxlIGtlcm5lbAordGhyZWFkcyBtdXN0IGNhbGwgdHJ5X3RvX2ZyZWV6ZSgpIHNvbWV3aGVyZS4KKworQWZ0ZXIgdGhlIHN5c3RlbSBtZW1vcnkgc3RhdGUgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIGhpYmVybmF0aW9uIGltYWdlIGFuZAorZGV2aWNlcyBoYXZlIGJlZW4gcmVpbml0aWFsaXplZCwgdGhlIGZ1bmN0aW9uIHRoYXdfcHJvY2Vzc2VzKCkgaXMgY2FsbGVkIGluCitvcmRlciB0byBjbGVhciB0aGUgUEZfRlJPWkVOIGZsYWcgZm9yIGVhY2ggZnJvemVuIHRhc2suICBUaGVuLCB0aGUgdGFza3MgdGhhdAoraGF2ZSBiZWVuIGZyb3plbiBsZWF2ZSByZWZyaWdlcmF0b3IoKSBhbmQgY29udGludWUgcnVubmluZy4KKworSUlJLiBXaGljaCBrZXJuZWwgdGhyZWFkcyBhcmUgZnJlZXphYmxlPworCitLZXJuZWwgdGhyZWFkcyBhcmUgbm90IGZyZWV6YWJsZSBieSBkZWZhdWx0LiAgSG93ZXZlciwgYSBrZXJuZWwgdGhyZWFkIG1heSBjbGVhcgorUEZfTk9GUkVFWkUgZm9yIGl0c2VsZiBieSBjYWxsaW5nIHNldF9mcmVlemFibGUoKSAodGhlIHJlc2V0dGluZyBvZiBQRl9OT0ZSRUVaRQorZGlyZWN0bHkgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQpLiAgRnJvbSB0aGlzIHBvaW50IGl0IGlzIHJlZ2FyZGVkIGFzIGZyZWV6YWJsZQorYW5kIG11c3QgY2FsbCB0cnlfdG9fZnJlZXplKCkgaW4gYSBzdWl0YWJsZSBwbGFjZS4KKworSVYuIFdoeSBkbyB3ZSBkbyB0aGF0PworCitHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXJlIGlzIGEgY291cGxlIG9mIHJlYXNvbnMgdG8gdXNlIHRoZSBmcmVlemluZyBvZiB0YXNrczoKKworMS4gVGhlIHByaW5jaXBhbCByZWFzb24gaXMgdG8gcHJldmVudCBmaWxlc3lzdGVtcyBmcm9tIGJlaW5nIGRhbWFnZWQgYWZ0ZXIKK2hpYmVybmF0aW9uLiAgQXQgdGhlIG1vbWVudCB3ZSBoYXZlIG5vIHNpbXBsZSBtZWFucyBvZiBjaGVja3BvaW50aW5nCitmaWxlc3lzdGVtcywgc28gaWYgdGhlcmUgYXJlIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gZmlsZXN5c3RlbSBkYXRhIGFuZC9vcgorbWV0YWRhdGEgb24gZGlza3MsIHdlIGNhbm5vdCBicmluZyB0aGVtIGJhY2sgdG8gdGhlIHN0YXRlIGZyb20gYmVmb3JlIHRoZQorbW9kaWZpY2F0aW9ucy4gIEF0IHRoZSBzYW1lIHRpbWUgZWFjaCBoaWJlcm5hdGlvbiBpbWFnZSBjb250YWlucyBzb21lCitmaWxlc3lzdGVtLXJlbGF0ZWQgaW5mb3JtYXRpb24gdGhhdCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3RhdGUgb2YgdGhlCitvbi1kaXNrIGRhdGEgYW5kIG1ldGFkYXRhIGFmdGVyIHRoZSBzeXN0ZW0gbWVtb3J5IHN0YXRlIGhhcyBiZWVuIHJlc3RvcmVkIGZyb20KK3RoZSBpbWFnZSAob3RoZXJ3aXNlIHRoZSBmaWxlc3lzdGVtcyB3aWxsIGJlIGRhbWFnZWQgaW4gYSBuYXN0eSB3YXksIHVzdWFsbHkKK21ha2luZyB0aGVtIGFsbW9zdCBpbXBvc3NpYmxlIHRvIHJlcGFpcikuICBXZSB0aGVyZWZvcmUgZnJlZXplIHRhc2tzIHRoYXQgbWlnaHQKK2NhdXNlIHRoZSBvbi1kaXNrIGZpbGVzeXN0ZW1zJyBkYXRhIGFuZCBtZXRhZGF0YSB0byBiZSBtb2RpZmllZCBhZnRlciB0aGUKK2hpYmVybmF0aW9uIGltYWdlIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGJlZm9yZSB0aGUgc3lzdGVtIGlzIGZpbmFsbHkgcG93ZXJlZCBvZmYuCitUaGUgbWFqb3JpdHkgb2YgdGhlc2UgYXJlIHVzZXIgc3BhY2UgcHJvY2Vzc2VzLCBidXQgaWYgYW55IG9mIHRoZSBrZXJuZWwgdGhyZWFkcworbWF5IGNhdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gaGFwcGVuLCB0aGV5IGhhdmUgdG8gYmUgZnJlZXphYmxlLgorCisyLiBUaGUgc2Vjb25kIHJlYXNvbiBpcyB0byBwcmV2ZW50IHVzZXIgc3BhY2UgcHJvY2Vzc2VzIGFuZCBzb21lIGtlcm5lbCB0aHJlYWRzCitmcm9tIGludGVyZmVyaW5nIHdpdGggdGhlIHN1c3BlbmRpbmcgYW5kIHJlc3VtaW5nIG9mIGRldmljZXMuICBBIHVzZXIgc3BhY2UKK3Byb2Nlc3MgcnVubmluZyBvbiBhIHNlY29uZCBDUFUgd2hpbGUgd2UgYXJlIHN1c3BlbmRpbmcgZGV2aWNlcyBtYXksIGZvcgorZXhhbXBsZSwgYmUgdHJvdWJsZXNvbWUgYW5kIHdpdGhvdXQgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIHdlIHdvdWxkIG5lZWQgc29tZQorc2FmZWd1YXJkcyBhZ2FpbnN0IHJhY2UgY29uZGl0aW9ucyB0aGF0IG1pZ2h0IG9jY3VyIGluIHN1Y2ggYSBjYXNlLgorCitBbHRob3VnaCBMaW51cyBUb3J2YWxkcyBkb2Vzbid0IGxpa2UgdGhlIGZyZWV6aW5nIG9mIHRhc2tzLCBoZSBzYWlkIHRoaXMgaW4gb25lCitvZiB0aGUgZGlzY3Vzc2lvbnMgb24gTEtNTCAoaHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNy80LzI3LzYwOCk6CisKKyJSSlc6PiBXaHkgd2UgZnJlZXplIHRhc2tzIGF0IGFsbCBvciB3aHkgd2UgZnJlZXplIGtlcm5lbCB0aHJlYWRzPworCitMaW51czogSW4gbWFueSB3YXlzLCAnYXQgYWxsJy4KKworSSBfZG9fIHJlYWxpemUgdGhlIElPIHJlcXVlc3QgcXVldWUgaXNzdWVzLCBhbmQgdGhhdCB3ZSBjYW5ub3QgYWN0dWFsbHkgZG8KK3MycmFtIHdpdGggc29tZSBkZXZpY2VzIGluIHRoZSBtaWRkbGUgb2YgYSBETUEuICBTbyB3ZSB3YW50IHRvIGJlIGFibGUgdG8KK2F2b2lkICp0aGF0KiwgdGhlcmUncyBubyBxdWVzdGlvbiBhYm91dCB0aGF0LiAgQW5kIEkgc3VzcGVjdCB0aGF0IHN0b3BwaW5nCit1c2VyIHRocmVhZHMgYW5kIHRoZW4gd2FpdGluZyBmb3IgYSBzeW5jIGlzIHByYWN0aWNhbGx5IG9uZSBvZiB0aGUgZWFzaWVyCit3YXlzIHRvIGRvIHNvLgorCitTbyBpbiBwcmFjdGljZSwgdGhlICdhdCBhbGwnIG1heSBiZWNvbWUgYSAnd2h5IGZyZWV6ZSBrZXJuZWwgdGhyZWFkcz8nIGFuZAorZnJlZXppbmcgdXNlciB0aHJlYWRzIEkgZG9uJ3QgZmluZCByZWFsbHkgb2JqZWN0aW9uYWJsZS4iCisKK1N0aWxsLCB0aGVyZSBhcmUga2VybmVsIHRocmVhZHMgdGhhdCBtYXkgd2FudCB0byBiZSBmcmVlemFibGUuICBGb3IgZXhhbXBsZSwgaWYKK2Ega2VybmVsIHRoYXQgYmVsb25ncyB0byBhIGRldmljZSBkcml2ZXIgYWNjZXNzZXMgdGhlIGRldmljZSBkaXJlY3RseSwgaXQgaW4KK3ByaW5jaXBsZSBuZWVkcyB0byBrbm93IHdoZW4gdGhlIGRldmljZSBpcyBzdXNwZW5kZWQsIHNvIHRoYXQgaXQgZG9lc24ndCB0cnkgdG8KK2FjY2VzcyBpdCBhdCB0aGF0IHRpbWUuICBIb3dldmVyLCBpZiB0aGUga2VybmVsIHRocmVhZCBpcyBmcmVlemFibGUsIGl0IHdpbGwgYmUKK2Zyb3plbiBiZWZvcmUgdGhlIGRyaXZlcidzIC5zdXNwZW5kKCkgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIGl0IHdpbGwgYmUKK3RoYXdlZCBhZnRlciB0aGUgZHJpdmVyJ3MgLnJlc3VtZSgpIGNhbGxiYWNrIGhhcyBydW4sIHNvIGl0IHdvbid0IGJlIGFjY2Vzc2luZwordGhlIGRldmljZSB3aGlsZSBpdCdzIHN1c3BlbmRlZC4KKworMy4gQW5vdGhlciByZWFzb24gZm9yIGZyZWV6aW5nIHRhc2tzIGlzIHRvIHByZXZlbnQgdXNlciBzcGFjZSBwcm9jZXNzZXMgZnJvbQorcmVhbGl6aW5nIHRoYXQgaGliZXJuYXRpb24gKG9yIHN1c3BlbmQpIG9wZXJhdGlvbiB0YWtlcyBwbGFjZS4gIElkZWFsbHksIHVzZXIKK3NwYWNlIHByb2Nlc3NlcyBzaG91bGQgbm90IG5vdGljZSB0aGF0IHN1Y2ggYSBzeXN0ZW0td2lkZSBvcGVyYXRpb24gaGFzIG9jY3VycmVkCithbmQgc2hvdWxkIGNvbnRpbnVlIHJ1bm5pbmcgd2l0aG91dCBhbnkgcHJvYmxlbXMgYWZ0ZXIgdGhlIHJlc3RvcmUgKG9yIHJlc3VtZQorZnJvbSBzdXNwZW5kKS4gIFVuZm9ydHVuYXRlbHksIGluIHRoZSBtb3N0IGdlbmVyYWwgY2FzZSB0aGlzIGlzIHF1aXRlIGRpZmZpY3VsdAordG8gYWNoaWV2ZSB3aXRob3V0IHRoZSBmcmVlemluZyBvZiB0YXNrcy4gIENvbnNpZGVyLCBmb3IgZXhhbXBsZSwgYSBwcm9jZXNzCit0aGF0IGRlcGVuZHMgb24gYWxsIENQVXMgYmVpbmcgb25saW5lIHdoaWxlIGl0J3MgcnVubmluZy4gIFNpbmNlIHdlIG5lZWQgdG8KK2Rpc2FibGUgbm9uYm9vdCBDUFVzIGR1cmluZyB0aGUgaGliZXJuYXRpb24sIGlmIHRoaXMgcHJvY2VzcyBpcyBub3QgZnJvemVuLCBpdAorbWF5IG5vdGljZSB0aGF0IHRoZSBudW1iZXIgb2YgQ1BVcyBoYXMgY2hhbmdlZCBhbmQgbWF5IHN0YXJ0IHRvIHdvcmsgaW5jb3JyZWN0bHkKK2JlY2F1c2Ugb2YgdGhhdC4KKworVi4gQXJlIHRoZXJlIGFueSBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSBmcmVlemluZyBvZiB0YXNrcz8KKworWWVzLCB0aGVyZSBhcmUuCisKK0ZpcnN0IG9mIGFsbCwgdGhlIGZyZWV6aW5nIG9mIGtlcm5lbCB0aHJlYWRzIG1heSBiZSB0cmlja3kgaWYgdGhleSBkZXBlbmQgb25lCitvbiBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGlmIGtlcm5lbCB0aHJlYWQgQSB3YWl0cyBmb3IgYSBjb21wbGV0aW9uIChpbiB0aGUKK1RBU0tfVU5JTlRFUlJVUFRJQkxFIHN0YXRlKSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgYnkgZnJlZXphYmxlIGtlcm5lbCB0aHJlYWQgQgorYW5kIEIgaXMgZnJvemVuIGluIHRoZSBtZWFudGltZSwgdGhlbiBBIHdpbGwgYmUgYmxvY2tlZCB1bnRpbCBCIGlzIHRoYXdlZCwgd2hpY2gKK21heSBiZSB1bmRlc2lyYWJsZS4gIFRoYXQncyB3aHkga2VybmVsIHRocmVhZHMgYXJlIG5vdCBmcmVlemFibGUgYnkgZGVmYXVsdC4KKworU2Vjb25kLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyB0d28gcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgZnJlZXppbmcgb2YgdXNlcgorc3BhY2UgcHJvY2Vzc2VzOgorMS4gUHV0dGluZyBwcm9jZXNzZXMgaW50byBhbiB1bmludGVycnVwdGlibGUgc2xlZXAgZGlzdG9ydHMgdGhlIGxvYWQgYXZlcmFnZS4KKzIuIE5vdyB0aGF0IHdlIGhhdmUgRlVTRSwgcGx1cyB0aGUgZnJhbWV3b3JrIGZvciBkb2luZyBkZXZpY2UgZHJpdmVycyBpbgordXNlcnNwYWNlLCBpdCBnZXRzIGV2ZW4gbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIHNvbWUgdXNlcnNwYWNlIHByb2Nlc3NlcyBhcmUKK25vdyBkb2luZyB0aGUgc29ydHMgb2YgdGhpbmdzIHRoYXQga2VybmVsIHRocmVhZHMgZG8KKyhodHRwczovL2xpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnL3BpcGVybWFpbC9saW51eC1wbS8yMDA3LU1heS8wMTIzMDkuaHRtbCkuCisKK1RoZSBwcm9ibGVtIDEuIHNlZW1zIHRvIGJlIGZpeGFibGUsIGFsdGhvdWdoIGl0IGhhc24ndCBiZWVuIGZpeGVkIHNvIGZhci4gIFRoZQorb3RoZXIgb25lIGlzIG1vcmUgc2VyaW91cywgYnV0IGl0IHNlZW1zIHRoYXQgd2UgY2FuIHdvcmsgYXJvdW5kIGl0IGJ5IHVzaW5nCitoaWJlcm5hdGlvbiAoYW5kIHN1c3BlbmQpIG5vdGlmaWVycyAoaW4gdGhhdCBjYXNlLCB0aG91Z2gsIHdlIHdvbid0IGJlIGFibGUgdG8KK2F2b2lkIHRoZSByZWFsaXphdGlvbiBieSB0aGUgdXNlciBzcGFjZSBwcm9jZXNzZXMgdGhhdCB0aGUgaGliZXJuYXRpb24gaXMgdGFraW5nCitwbGFjZSkuCisKK1RoZXJlIGFyZSBhbHNvIHByb2JsZW1zIHRoYXQgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIHRlbmRzIHRvIGV4cG9zZSwgYWx0aG91Z2gKK3RoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHJlcXVlc3RfZmlybXdhcmUoKSBpcworY2FsbGVkIGZyb20gYSBkZXZpY2UgZHJpdmVyJ3MgLnJlc3VtZSgpIHJvdXRpbmUsIGl0IHdpbGwgdGltZW91dCBhbmQgZXZlbnR1YWxseQorZmFpbCwgYmVjYXVzZSB0aGUgdXNlciBsYW5kIHByb2Nlc3MgdGhhdCBzaG91bGQgcmVzcG9uZCB0byB0aGUgcmVxdWVzdCBpcyBmcm96ZW4KK2F0IHRoaXMgcG9pbnQuICBTbywgc2VlbWluZ2x5LCB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gdGhlIGZyZWV6aW5nIG9mIHRhc2tzLgorU3VwcG9zZSwgaG93ZXZlciwgdGhhdCB0aGUgZmlybXdhcmUgZmlsZSBpcyBsb2NhdGVkIG9uIGEgZmlsZXN5c3RlbSBhY2Nlc3NpYmxlCitvbmx5IHRocm91Z2ggYW5vdGhlciBkZXZpY2UgdGhhdCBoYXNuJ3QgYmVlbiByZXN1bWVkIHlldC4gIEluIHRoYXQgY2FzZSwKK3JlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGZhaWwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZnJlZXppbmcgb2YgdGFza3MKK2lzIHVzZWQuICBDb25zZXF1ZW50bHksIHRoZSBwcm9ibGVtIGlzIG5vdCByZWFsbHkgcmVsYXRlZCB0byB0aGUgZnJlZXppbmcgb2YKK3Rhc2tzLCBzaW5jZSBpdCBnZW5lcmFsbHkgZXhpc3RzIGFueXdheS4gIFtUaGUgc29sdXRpb24gdG8gdGhpcyBwYXJ0aWN1bGFyCitwcm9ibGVtIGlzIHRvIGtlZXAgdGhlIGZpcm13YXJlIGluIG1lbW9yeSBhZnRlciBpdCdzIGxvYWRlZCBmb3IgdGhlIGZpcnN0IHRpbWUKK2FuZCB1cGxvYWQgaWYgZnJvbSBtZW1vcnkgdG8gdGhlIGRldmljZSB3aGVuZXZlciBuZWNlc3NhcnkuXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9rZXJuZWxfdGhyZWFkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1Nzc4NC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLUtFUk5FTCBUSFJFQURTCi0KLQotRnJlZXplcgotCi1VcG9uIGVudGVyaW5nIGEgc3VzcGVuZGVkIHN0YXRlIHRoZSBzeXN0ZW0gd2lsbCBmcmVlemUgYWxsCi10YXNrcy4gVGhpcyBpcyBkb25lIGJ5IGRlbGl2ZXJpbmcgcHNldWRvc2lnbmFscy4gVGhpcyBhZmZlY3RzCi1rZXJuZWwgdGhyZWFkcywgdG9vLiBUbyBzdWNjZXNzZnVsbHkgZnJlZXplIGEga2VybmVsIHRocmVhZAotdGhlIHRocmVhZCBoYXMgdG8gY2hlY2sgZm9yIHRoZSBwc2V1ZG9zaWduYWwgYW5kIGVudGVyIHRoZQotcmVmcmlnZXJhdG9yLiBDb2RlIHRvIGRvIHRoaXMgbG9va3MgbGlrZSB0aGlzOgotCi0JZG8gewotCQlodWJfZXZlbnRzKCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LCAhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7Ci0KLWZyb20gZHJpdmVycy91c2IvY29yZS9odWIuYzo6aHViX3RocmVhZCgpCi0KLQotVGhlIFVuZnJlZXphYmxlCi0KLVNvbWUga2VybmVsIHRocmVhZHMgaG93ZXZlciwgbXVzdCBub3QgYmUgZnJvemVuLiBUaGUga2VybmVsIG11c3QKLWJlIGFibGUgdG8gZmluaXNoIHBlbmRpbmcgSU8gb3BlcmF0aW9ucyBhbmQgbGF0ZXIgb24gYmUgYWJsZSB0bwotd3JpdGUgdGhlIG1lbW9yeSBpbWFnZSB0byBkaXNrLiBLZXJuZWwgdGhyZWFkcyBuZWVkZWQgdG8gZG8gSU8KLW11c3Qgc3RheSBhd2FrZS4gU3VjaCB0aHJlYWRzIG11c3QgbWFyayB0aGVtc2VsdmVzIHVuZnJlZXphYmxlCi1saWtlIHRoaXM6Ci0KLQkvKgotCSAqIFRoaXMgdGhyZWFkIGRvZXNuJ3QgbmVlZCBhbnkgdXNlci1sZXZlbCBhY2Nlc3MsCi0JICogc28gZ2V0IHJpZCBvZiBhbGwgb3VyIHJlc291cmNlcy4KLQkgKi8KLQlkYWVtb25pemUoInVzYi1zdG9yYWdlIik7Ci0KLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQotZnJvbSBkcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jOjp1c2Jfc3Rvcl9jb250cm9sX3RocmVhZCgpCi0KLVN1Y2ggZHJpdmVycyBhcmUgdGhlbXNlbHZlcyByZXNwb25zaWJsZSBmb3Igc3RheWluZyBxdWlldCBkdXJpbmcKLXRoZSBhY3R1YWwgc25hcHNob3R0aW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CmluZGV4IDE1MmI1MTAuLmFlYTdlOTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKQEAgLTE0MCwyMSArMTQwLDExIEBACiB3ZWJzaXRlLCBhbmQgbm90IHRvIHRoZSBMaW51eCBLZXJuZWwgTWFpbGluZyBMaXN0LiBXZSBhcmUgd29ya2luZwogdG93YXJkIG1lcmdpbmcgc3VzcGVuZDIgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgogCi1ROiBBIGtlcm5lbCB0aHJlYWQgbXVzdCB2b2x1bnRhcmlseSBmcmVlemUgaXRzZWxmIChjYWxsICdyZWZyaWdlcmF0b3InKS4KLUkgZm91bmQgc29tZSBrZXJuZWwgdGhyZWFkcyB0aGF0IGRvbid0IGRvIGl0LCBhbmQgdGhleSBkb24ndCBmcmVlemUKLXNvIHRoZSBzeXN0ZW0gY2FuJ3Qgc2xlZXAuIElzIHRoaXMgYSBrbm93biBiZWhhdmlvcj8KK1E6IFdoYXQgaXMgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIGFuZCB3aHkgYXJlIHdlIHVzaW5nIGl0PwogCi1BOiBBbGwgc3VjaCBrZXJuZWwgdGhyZWFkcyBuZWVkIHRvIGJlIGZpeGVkLCBvbmUgYnkgb25lLiBTZWxlY3QgdGhlCi1wbGFjZSB3aGVyZSB0aGUgdGhyZWFkIGlzIHNhZmUgdG8gYmUgZnJvemVuIChubyBrZXJuZWwgc2VtYXBob3Jlcwotc2hvdWxkIGJlIGhlbGQgYXQgdGhhdCBwb2ludCBhbmQgaXQgbXVzdCBiZSBzYWZlIHRvIHNsZWVwIHRoZXJlKSwgYW5kCi1hZGQ6Ci0KLSAgICAgICB0cnlfdG9fZnJlZXplKCk7Ci0KLUlmIHRoZSB0aHJlYWQgaXMgbmVlZGVkIGZvciB3cml0aW5nIHRoZSBpbWFnZSB0byBzdG9yYWdlLCB5b3Ugc2hvdWxkCi1pbnN0ZWFkIHNldCB0aGUgUEZfTk9GUkVFWkUgcHJvY2VzcyBmbGFnIHdoZW4gY3JlYXRpbmcgdGhlIHRocmVhZCAoYW5kCi1iZSB2ZXJ5IGNhcmVmdWwpLgotCitBOiBUaGUgZnJlZXppbmcgb2YgdGFza3MgaXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUKK2tlcm5lbCB0aHJlYWRzIGFyZSBjb250cm9sbGVkIGR1cmluZyBoaWJlcm5hdGlvbiBvciBzeXN0ZW0td2lkZSBzdXNwZW5kIChvbiBzb21lCithcmNoaXRlY3R1cmVzKS4gIFNlZSBmcmVlemluZy1vZi10YXNrcy50eHQgZm9yIGRldGFpbHMuCiAKIFE6IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAicGxhdGZvcm0iIGFuZCAic2h1dGRvd24iPwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CmluZGV4IGQ0MmQ5ODEuLjBjMjQzNDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CkBAIC00MiwxNSArNDIsMTYgQEAKICAgICAxKSBEZWZpbmluZyBjaGlsZCBub2RlcyBvZiBhbiBTT0MKICAgICAyKSBSZXByZXNlbnRpbmcgZGV2aWNlcyB3aXRob3V0IGEgY3VycmVudCBPRiBzcGVjaWZpY2F0aW9uCiAgICAgICBhKSBNRElPIElPIGRldmljZQotICAgICAgYykgUEhZIG5vZGVzCiAgICAgICBiKSBHaWFuZmFyLWNvbXBhdGlibGUgZXRoZXJuZXQgbm9kZXMKKyAgICAgIGMpIFBIWSBub2RlcwogICAgICAgZCkgSW50ZXJydXB0IGNvbnRyb2xsZXJzCiAgICAgICBlKSBJMkMKICAgICAgIGYpIEZyZWVzY2FsZSBTT0MgVVNCIGNvbnRyb2xsZXJzCiAgICAgICBnKSBGcmVlc2NhbGUgU09DIFNFQyBTZWN1cml0eSBFbmdpbmVzCiAgICAgICBoKSBCb2FyZCBDb250cm9sIGFuZCBTdGF0dXMgKEJDU1IpCiAgICAgICBpKSBGcmVlc2NhbGUgUVVJQ0MgRW5naW5lIG1vZHVsZSAoUUUpCi0gICAgICBnKSBGbGFzaCBjaGlwIG5vZGVzCisgICAgICBqKSBGbGFzaCBjaGlwIG5vZGVzCisgICAgICBrKSBHbG9iYWwgVXRpbGl0aWVzIEJsb2NrCiAKICAgVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKICAgICAxKSBpbnRlcnJ1cHRzIHByb3BlcnR5CkBAIC02MjYsNiArNjI3LDE0IEBACiBhIGxpc3Qgb2YgcHJvcGVydGllcywgYSBsaXN0IG9mIGNoaWxkIG5vZGVzLCBhbmQgYW4gZW5kIHRva2VuLiBFdmVyeQogY2hpbGQgbm9kZSBpcyBhIGZ1bGwgbm9kZSBzdHJ1Y3R1cmUgaXRzZWxmIGFzIGRlZmluZWQgYWJvdmUuCiAKK05PVEU6IFRoZSBhYm92ZSBkZWZpbml0aW9uIHJlcXVpcmVzIHRoYXQgYWxsIHByb3BlcnR5IGRlZmluaXRpb25zIGZvcgorYSBwYXJ0aWN1bGFyIG5vZGUgTVVTVCBwcmVjZWRlIGFueSBzdWJub2RlIGRlZmluaXRpb25zIGZvciB0aGF0IG5vZGUuCitBbHRob3VnaCB0aGUgc3RydWN0dXJlIHdvdWxkIG5vdCBiZSBhbWJpZ3VvdXMgaWYgcHJvcGVydGllcyBhbmQKK3N1Ym5vZGVzIHdlcmUgaW50ZXJtaW5nbGVkLCB0aGUga2VybmVsIHBhcnNlciByZXF1aXJlcyB0aGF0IHRoZQorcHJvcGVydGllcyBjb21lIGZpcnN0ICh1cCB1bnRpbCBhdCBsZWFzdCAyLjYuMjIpLiAgQW55IHRvb2xzCittYW5pcHVsYXRpbmcgYSBmbGF0dGVuZWQgdHJlZSBtdXN0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSB0aGlzCitjb25zdHJhaW50LgorCiA0KSBEZXZpY2UgdHJlZSAic3RyaW5ncyIgYmxvY2sKIAogSW4gb3JkZXIgdG8gc2F2ZSBzcGFjZSwgcHJvcGVydHkgbmFtZXMsIHdoaWNoIGFyZSBnZW5lcmFsbHkgcmVkdW5kYW50LApAQCAtMTc4Miw2ICsxNzkxLDMzIEBACiAgCQlwYXJ0aXRpb24tbmFtZXMgPSAiZnNcMGZpcm13YXJlIjsKICAJfTsKIAorICAgaykgR2xvYmFsIFV0aWxpdGllcyBCbG9jaworCisgICBUaGUgZ2xvYmFsIHV0aWxpdGllcyBibG9jayBjb250cm9scyBwb3dlciBtYW5hZ2VtZW50LCBJL08gZGV2aWNlCisgICBlbmFibGluZywgcG93ZXItb24tcmVzZXQgY29uZmlndXJhdGlvbiBtb25pdG9yaW5nLCBnZW5lcmFsLXB1cnBvc2UKKyAgIEkvTyBzaWduYWwgY29uZmlndXJhdGlvbiwgYWx0ZXJuYXRlIGZ1bmN0aW9uIHNlbGVjdGlvbiBmb3IgbXVsdGlwbGV4ZWQKKyAgIHNpZ25hbHMsIGFuZCBjbG9jayBjb250cm9sLgorCisgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgICAgLSBjb21wYXRpYmxlIDogU2hvdWxkIGRlZmluZSB0aGUgY29tcGF0aWJsZSBkZXZpY2UgdHlwZSBmb3IKKyAgICAgIGdsb2JhbC11dGlsaXRpZXMuCisgICAgLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgorCisgIFJlY29tbWVuZGVkIHByb3BlcnRpZXM6CisKKyAgICAtIGZzbCxoYXMtcnN0Y3IgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgZ2xvYmFsIHV0aWxpdGllcyByZWdpc3RlciBzZXQKKyAgICAgIGNvbnRhaW5zIGEgZnVuY3Rpb25pbmcgInJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIiIChpLmUuIHRoZSBib2FyZAorICAgICAgaXMgd2lyZWQgdG8gcmVzZXQgdXBvbiBzZXR0aW5nIHRoZSBIUkVTRVRfUkVRIGJpdCBpbiB0aGlzIHJlZ2lzdGVyKS4KKworICAgIEV4YW1wbGU6CisKKwlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLyogZ2xvYmFsIHV0aWxpdGllcyBibG9jayAqLworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOworCQlyZWcgPSA8ZTAwMDAgMTAwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJfTsKKwogICAgTW9yZSBkZXZpY2VzIHdpbGwgYmUgZGVmaW5lZCBhcyB0aGlzIHNwZWMgbWF0dXJlcy4KIAogVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcnRjLnR4dCBiL0RvY3VtZW50YXRpb24vcnRjLnR4dAppbmRleCA3YzcwMWI4Li5jOTMxZDYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ydGMudHh0CkBAIC0zODUsNyArMzg1LDcgQEAKIAkJLyogbm90IGFsbCBSVENzIHN1cHBvcnQgcGVyaW9kaWMgSVJRcyAqLwogCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CiAJCQlmcHJpbnRmKHN0ZGVyciwgIlxuTm8gcGVyaW9kaWMgSVJRIHN1cHBvcnRcbiIpOwotCQkJcmV0dXJuIDA7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAkJcGVycm9yKCJSVENfSVJRUF9SRUFEIGlvY3RsIik7CiAJCWV4aXQoZXJybm8pOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQUQxODE2IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQUQxODE2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJkOGYyLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL0FEMTgxNgorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLURvY3VtZW50YXRpb24gZm9yIHRoZSBBRDE4MTYoQSkgc291bmQgZHJpdmVyCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbnN0YWxsYXRpb246Ci0tLS0tLS0tLS0tLS0tCi0KLVRvIGdldCB5b3VyIEFEMTgxNihBKSBiYXNlZCBzb3VuZCBjYXJkIHdvcmssIHlvdSdsbCBoYXZlIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgotZXhwZXJpbWVudGFsIGNvZGUgKCJQcm9tcHQgZm9yIGRldmVsb3BtZW50IGFuZC9vciBpbmNvbXBsZXRlIGNvZGUvZHJpdmVycyIpCi1hbmQgaXNhcG5wICgiUGx1ZyBhbmQgUGxheSBzdXBwb3J0IiwgIklTQSBQbHVnIGFuZCBQbGF5IHN1cHBvcnQiKS4gRW5hYmxlCi0iU291bmQgY2FyZCBzdXBwb3J0IiwgIk9TUyBtb2R1bGVzIHN1cHBvcnQiIGFuZCAiU3VwcG9ydCBmb3IgQUQxODE2KEEpIGJhc2VkCi1jYXJkcyAoRVhQRVJJTUVOVEFMKSIgaW4gdGhlIHNvdW5kIGNvbmZpZ3VyYXRpb24gbWVudSwgdG9vLiBOb3cgYnVpbGQsIGluc3RhbGwKLWFuZCByZWJvb3QgdGhlIG5ldyBrZXJuZWwgYXMgdXN1YWwuCi0KLUZlYXR1cmVzOgotLS0tLS0tLS0tCi0KLUxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOgotLSBmdWxsLWR1cGxleCBzdXBwb3J0Ci0tIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzOiB1bnNpZ25lZCA4Yml0LCBzaWduZWQgMTZiaXQgbGl0dGxlIGVuZGlhbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgMTZiaXQgYmlnIGVuZGlhbiwgtS1sYXcsIEEtbGF3Ci0tIHN1cHBvcnRlZCBjaGFubmVsczogbW9ubyBhbmQgc3RlcmVvCi0tIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlczogTWFzdGVyLCBDRCwgTGluZSwgTGluZTEsIExpbmUyLCBNaWMKLS0gc3VwcG9ydHMgcGhhdCAzZCBzdGVyZW8gY2lyY3VpdCAoTGluZSAzKQotCi0KLVN1cHBvcnRlZCBjYXJkczoKLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBjYXJkcyBhcmUga25vd24gdG8gd29yayB3aXRoIHRoaXMgZHJpdmVyOgotLSBUZXJyYXRlYyBCYXNlIDEgCi0tIFRlcnJhdGVjIEJhc2UgNjQgCi0tIEhQIEtheWFrIAotLSBBY2VyIEZYLTNECi0tIFNZLTE4MTYgCi0tIEhpZ2hzY3JlZW4gU291bmQtQm9vc3RhciAzMiBXYXZlIDNECi0tIEhpZ2hzY3JlZW4gU291bmQtQm9vc3RhciAxNiAKLS0gQVZNIEFwZXggUHJvIGNhcmQgCi0tIChBenRlY2ggU0MtMTYgM0QpIAotLSAoTmV3Y29tIFNDLTE2IDNEKSAKLS0gKFRlcnJhdGVjIEVXUzY0UykgCi0KLUNhcmRzIGxpc3RlZCBpbiBicmFja2V0cyBhcmUgbm90IHN1cHBvcnRlZCByZWxpYWJsZS4gSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQgCi15b3Ugc2hvdWxkIGFkZCB0aGUgZXh0cmEgcGFyYW1ldGVyOgotICBvcHRpb25zPTEKLXdoZW4gbG9hZGluZyB0aGUgYWQxODE2IG1vZHVsZSB2aWEgbW9kcHJvYmUuIAotCi0KLVRyb3VibGVzaG9vdGluZzoKLS0tLS0tLS0tLS0tLS0tLS0KLQotRmlyc3Qgb2YgYWxsIHlvdSBzaG91bGQgY2hlY2ssIGlmIHRoZSBkcml2ZXIgaGFzIGJlZW4gbG9hZGVkCi1wcm9wZXJseS4KLQotSWYgbG9hZGluZyBvZiB0aGUgZHJpdmVyIHN1Y2NlZWRzLCBidXQgcGxheWJhY2svY2FwdHVyZSBmYWlscywgY2hlY2sKLWlmIHlvdSB1c2VkIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgaXJxLCBkbWEgYW5kIGRtYTIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCi1JZiBvbmUgb2YgdGhlbSBpcyB3cm9uZyB5b3UgdXN1YWxseSBnZXQgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgotCi1Ob3YgIDYgMTc6MDY6MTMgdGVrMDEga2VybmVsOiBTb3VuZDogRE1BIChvdXRwdXQpIHRpbWVkIG91dCAtIElSUS9EUlEgY29uZmlnIGVycm9yPwotCi1JZiBwbGF5YmFjay9jYXB0dXJlIGlzIHRvbyBmYXN0IG9yIHRvIHNsb3csIHlvdSBzaG91bGQgaGF2ZSBhIGxvb2sgYXQKLXRoZSBjbG9jayBjaGlwIG9mIHlvdXIgc291bmQgY2FyZC4gVGhlIEFEMTgxNiB3YXMgZGVzaWduZWQgZm9yIGEgMzNNSHoKLW9zY2lsbGF0b3IsIGhvd2V2ZXIgbW9zdCBzb3VuZCBjYXJkIG1hbnVmYWN0dXJlciB1c2Ugc2xpZ2h0bHkKLWRpZmZlcmVudCBvc2NpbGxhdG9ycyBhcyB0aGV5IGFyZSBjaGVhcGVyIHRoYW4gMzNNSHogb3NjaWxsYXRvcnMuIElmCi15b3UgaGF2ZSBzdWNoIGEgY2FyZCB5b3UgaGF2ZSB0byBhZGp1c3QgdGhlIGFkMTgxNl9jbG9ja2ZyZXEgcGFyYW1ldGVyCi1hYm92ZS4gRm9yIGV4YW1wbGU6IEZvciBhIGNhcmQgdXNpbmcgYSAzMi44NzVNSHogb3NjaWxsYXRvciB1c2UKLWFkMTgxNl9jbG9ja2ZyZXE9MzI4NzUgaW5zdGVhZCBvZiBhZDE4MTZfY2xvY2tmcmVxPTMzMDAwLgotCi0KLVVwZGF0ZXMsIGJ1Z2ZpeGVzIGFuZCBidWdyZXBvcnRzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXMgdGhlIGRyaXZlciBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIHVuZGVyIGRldmVsb3BtZW50LCB5b3Ugc2hvdWxkCi13YXRjaCBvdXQgZm9yIHVwZGF0ZXMuICBVcGRhdGVzIG9mIHRoZSBkcml2ZXIgYXJlIGF2YWlsYWJsZSBvbiB0aGUKLUludGVybmV0IGZyb20gb25lIG9mIG15IGhvbWUgcGFnZXM6Ci0gIGh0dHA6Ly93d3cuc3R1ZGVudC5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZS9+dGVrL3Byb2plY3RzL2xpbnV4Lmh0bWwKLW9yOgotICBodHRwOi8vd3d3LnR1LWRhcm1zdGFkdC5kZS9+dGVrMDEvcHJvamVjdHMvbGludXguaHRtbAotCi1CdWdyZXBvcnRzLCBidWdmaXhlcyBhbmQgcmVsYXRlZCBxdWVzdGlvbnMgc2hvdWxkIGJlIHNlbnQgdmlhIEUtTWFpbCB0bzoKLSAgdGVrQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZQotCi1UaG9yc3RlbiBLbmFiZSA8dGVrQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZT4KLUNocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KLQlMYXN0IG1vZGlmaWVkOiAyMDAwLzA5LzIwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9OTTI1NiBiL0RvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTAzMjE3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2CisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBOZW9NYWdpYyAyNTZBVi8yNTZaWCBzb3VuZCBkcml2ZXIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotWW91J3JlIGxvb2tpbmcgYXQgdmVyc2lvbiAxLjEgb2YgdGhlIGRyaXZlci4gIChXb29ob28hKSBJdCBoYXMgYmVlbgotc3VjY2Vzc2Z1bGx5IHRlc3RlZCBhZ2FpbnN0IHRoZSBmb2xsb3dpbmcgbGFwdG9wIG1vZGVsczoKLQotCVNvbnkgWjUwNVMvWjUwNVNYL1o1MDVEWC9aNTA1UlgKLQlTb255IEYxNTAsIEYxNjAsIEYxODAsIEYyNTAsIEYyNzAsIEYyODAsIFBDRy1GMjYKLQlEZWxsIExhdGl0dWRlIENQaSwgQ1B0ICh2YXJpb3VzIHN1Ym1vZGVscykKLQotVGhlcmUgYXJlIGEgZmV3IGNhdmVhdHMsIHdoaWNoIGlzIHdoeSB5b3Ugc2hvdWxkIHJlYWQgdGhlIGVudGlyZXR5IG9mCi10aGlzIGRvY3VtZW50IGZpcnN0LgotCi1UaGlzIGRyaXZlciB3YXMgZGV2ZWxvcGVkIHdpdGhvdXQgYW55IHN1cHBvcnQgb3IgYXNzaXN0YW5jZSBmcm9tCi1OZW9NYWdpYy4gIFRoZXJlIGlzIG5vIHdhcnJhbnR5LCBleHByZXNzZWQsIGltcGxpZWQsIG9yIG90aGVyd2lzZS4gIEl0Ci1pcyBmcmVlIHNvZnR3YXJlIGluIHRoZSBwdWJsaWMgZG9tYWluOyBmZWVsIGZyZWUgdG8gdXNlIGl0LCBzZWxsIGl0LAotZ2l2ZSBpdCB0byB5b3VyIGJlc3QgZnJpZW5kcywgZXZlbiBjbGFpbSB0aGF0IHlvdSB3cm90ZSBpdCAoYnV0IHdoeT8hKQotYnV0IGRvbid0IGdvIHdoaW5pbmcgdG8gbWUsIE5lb01hZ2ljLCBTb255LCBEZWxsLCBvciBhbnlvbmUgZWxzZQotd2hlbiBpdCBibG93cyB1cCB5b3VyIGNvbXB1dGVyLgotCi1WZXJzaW9uIDEuMSBjb250YWlucyBhIGNoYW5nZSB0byB0cnkgYW5kIGRldGVjdCBub24tQUM5NyB2ZXJzaW9ucyBvZgotdGhlIGhhcmR3YXJlLCBhbmQgbm90IGluc3RhbGwgaXRzZWxmIGFwcHJvcHJpYXRlbHkuICBJdCBzaG91bGQgYWxzbwotcmVpbml0aWFsaXplIHRoZSBoYXJkd2FyZSBvbiBhbiBBUE0gcmVzdW1lIGV2ZW50LCBhc3N1bWluZyB0aGF0IEFQTQotd2FzIGNvbmZpZ3VyZWQgaW50byB5b3VyIGtlcm5lbC4KLQotPT09PT09PT09PT09Ci1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1FbmFibGUgdGhlIHNvdW5kIGRyaXZlcnMsIHRoZSBPU1Mgc291bmQgZHJpdmVycywgYW5kIHRoZW4gdGhlIE5NMjU2Ci1kcml2ZXIuICBUaGUgTk0yNTYgZHJpdmVyICptdXN0KiBiZSBjb25maWd1cmVkIGFzIGEgbW9kdWxlIChpdCB3b24ndAotZ2l2ZSB5b3UgYW55IG90aGVyIGNob2ljZSkuCi0KLU5leHQsIGRvIHRoZSB1c3VhbCAibWFrZSBtb2R1bGVzIiBhbmQgIm1ha2UgbW9kdWxlc19pbnN0YWxsIi4KLUZpbmFsbHksIGluc21vZCB0aGUgc291bmRjb3JlLCBzb3VuZCBhbmQgbm0yNTYgbW9kdWxlcy4KLQotV2hlbiB0aGUgbm0yNTYgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQsIHlvdSBzaG91bGQgc2VlIGEgY291cGxlIG9mCi1jb25maXJtYXRpb24gbWVzc2FnZXMgaW4gdGhlIGtlcm5lbCBsb2dmaWxlIGluZGljYXRpbmcgdGhhdCBpdCBmb3VuZAotdGhlIGRldmljZSAodGhlIGRldmljZSBkb2VzICpub3QqIHVzZSBhbnkgSS9PIHBvcnRzIG9yIERNQSBjaGFubmVscykuCi1Ob3cgdHJ5IHBsYXlpbmcgYSB3YXYgZmlsZSwgZnV0eiB3aXRoIHRoZSBDRC1ST00gaWYgeW91IGhhdmUgb25lLCBldGMuCi0KLVRoZSBOTTI1NiBpcyBlbnRpcmVseSBhIFBDSS1iYXNlZCBkZXZpY2UsIGFuZCBhbGwgdGhlIG5lY2Vzc2FyeQotaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBjYXJkLiAgSXQgY2FuIG9ubHkgYmUKLWNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUgaW4gYSB2YWluIGF0dGVtcHQgdG8gcHJldmVudCBwZW9wbGUgZnJvbQotaHVydGluZyB0aGVtc2VsdmVzLiAgSXQgd29ya3MgY29ycmVjdGx5IGlmIGl0IHNoYXJlcyBhbiBJUlEgd2l0aAotYW5vdGhlciBkZXZpY2UgKGl0IG5vcm1hbGx5IHNoYXJlcyBJUlEgOSB3aXRoIHRoZSBidWlsdGluIGVlcHJvMTAwCi1ldGhlcm5ldCBvbiB0aGUgU29ueSBaNTA1IGxhcHRvcHMpLiAKLQotSXQgZG9lcyBub3QgcnVuIHRoZSBjYXJkIGluIGFueSBzb3J0IG9mIGNvbXBhdGliaWxpdHkgbW9kZS4gSXQgd2lsbAotbm90IHdvcmsgb24gbGFwdG9wcyB0aGF0IGhhdmUgdGhlIFNCMTYtY29tcGF0aWJsZSwgQUQxODQ4LWNvbXBhdGlibGUKLW9yIENTNDIzMi1jb21wYXRpYmxlIGNvZGVjL21peGVyOyB5b3Ugd2lsbCB3YW50IHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUKLWNvbXBhdGlibGUgT1NTIGRyaXZlciB3aXRoIHRoZXNlIGNoaXBzZXRzLiAgSSBjYW5ub3QgcHJvdmlkZSBhbnkKLWFzc2lzdGFuY2Ugd2l0aCBtYWNoaW5lcyB1c2luZyB0aGUgU0IxNiwgQUQxODQ4IG9yIENTNDIzMiBjb21wYXRpYmxlCi12ZXJzaW9ucy4gIChUaGUgZHJpdmVyIG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIG1peGVyIHZlcnNpb24sIGFuZAotd2lsbCByZWZ1c2UgdG8gbG9hZCBpZiBpdCBiZWxpZXZlcyB0aGUgaGFyZHdhcmUgaXMgbm90Ci1BQzk3LWNvbXBhdGlibGUuKQotCi1UaGUgc291bmQgc3VwcG9ydCBpcyB2ZXJ5IGJhc2ljLCBidXQgaXQgZG9lcyBpbmNsdWRlIHNpbXVsdGFuZW91cwotcGxheWJhY2sgYW5kIHJlY29yZCBjYXBhYmlsaXR5LiAgVGhlIG1peGVyIHN1cHBvcnQgaXMgYWxzbyBxdWl0ZQotc2ltcGxlLCBhbHRob3VnaCB0aGlzIGlzIGluIGtlZXBpbmcgd2l0aCB0aGUgcmF0aGVyIGxpbWl0ZWQKLWZ1bmN0aW9uYWxpdHkgb2YgdGhlIGNoaXBzZXQuCi0KLVRoZXJlIGlzIG5vIGhhcmR3YXJlIHN5bnRoZXNpemVyIGF2YWlsYWJsZSwgYXMgdGhlIExvc2Vkb3dzIE9QTC0zIGFuZAotTUlESSBzdXBwb3J0IGlzIGRvbmUgdmlhIGhhcmR3YXJlIGVtdWxhdGlvbi4KLQotT25seSB0aHJlZSByZWNvcmRpbmcgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBTb255OiB0aGUKLW1pY3JvcGhvbmUsIHRoZSBDRC1ST00gaW5wdXQsIGFuZCB0aGUgdm9sdW1lIGRldmljZSAod2hpY2ggY29ycmVzcG9uZHMKLXRvIHRoZSBzdGVyZW8gb3V0cHV0KS4gIChPdGhlciBkZXZpY2VzIG1heSBiZSBhdmFpbGFibGUgb24gb3RoZXIKLW1vZGVscyBvZiBsYXB0b3BzLikgIFRoZSBaNTA1IHNlcmllcyBkb2VzIG5vdCBoYXZlIGEgYnVpbHRpbiBDRC1ST00sCi1zbyBvZiBjb3Vyc2UgdGhlIENELVJPTSBpbnB1dCBkb2Vzbid0IHdvcmsuICBJdCBkb2VzIHdvcmsgb24gbGFwdG9wcwotd2l0aCBhIGJ1aWx0aW4gQ0QtUk9NIGRyaXZlLgotCi1UaGUgbWl4ZXIgZGV2aWNlIGRvZXMgbm90IGFwcGVhciB0byBoYXZlIGFueSB0b25lIGNvbnRyb2xzLCBhdCBsZWFzdAotb24gdGhlIFo1MDUgc2VyaWVzLiAgVGhlIG1peGVyIG1vZHVsZSBjaGVja3MgZm9yIHRvbmUgY29udHJvbHMgaW4gdGhlCi1BQzk3IG1peGVyLCBhbmQgd2lsbCBlbmFibGUgdGhlbSBpZiB0aGV5IGFyZSBhdmFpbGFibGUuCi0KLT09PT09PT09PT09PT09Ci1Lbm93biBwcm9ibGVtcwotPT09PT09PT09PT09PT0KLQotICAqIFRoZXJlIGFyZSBrbm93biBwcm9ibGVtcyB3aXRoIFBDTUNJQSBjYXJkcyBhbmQgdGhlIGVlcHJvMTAwIGV0aGVybmV0IAotICAgIGRyaXZlciBvbiB0aGUgWjUwNVMvWjUwNVNYL1o1MDVEWC4gIEtlZXAgcmVhZGluZy4KLQotICAqIFRoZXJlIGFyZSBhbHNvIHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIHVzaW5nIGEgdmlydHVhbCBYIGRpc3BsYXksIGFuZAotICAgIGFsc28gcHJvYmxlbXMgbG9hZGluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBYIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkLiAKLSAgICBLZWVwIHJlYWRpbmcuCi0KLSAgKiBUaGUgdm9sdW1lIGNvbnRyb2wgaXNuJ3QgYW55d2hlcmUgbmVhciBsaW5lYXIuICBTb3JyeS4gIFRoaXMgd2lsbCBiZQotICAgIGZpeGVkIGV2ZW50dWFsbHksIHdoZW4gSSBnZXQgc3VmZmljaWVudGx5IGFubm95ZWQgd2l0aCBpdC4gIChJIGRvdWJ0Ci0gICAgaXQgd2lsbCBldmVyIGJlIGZpeGVkIG5vdywgc2luY2UgSSd2ZSBuZXZlciBnb3R0ZW4gc3VmZmljaWVudGx5Ci0gICAgYW5ub3llZCB3aXRoIGl0IGFuZCBub2JvZHkgZWxzZSBzZWVtcyB0byBjYXJlLikKLQotICAqIFRoZXJlIGFyZSByZXBvcnRzIHRoYXQgdGhlIENELVJPTSB2b2x1bWUgaXMgdmVyeSBsb3cuICBTaW5jZSBJIGRvIG5vdAotICAgIGhhdmUgYSBDRC1ST00gZXF1aXBwZWQgbGFwdG9wLCBJIGNhbm5vdCB0ZXN0IHRoaXMgKGl0J3Mga2luZGEgaGFyZCB0bwotICAgIGRvIHJlbW90ZWx5KS4KLQotICAqIE9ubHkgOCBmaXhlZC1yYXRlIHNwZWVkcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBpcyBtYWlubHkgYSBjaGlwc2V0Ci0gICAgbGltaXRhdGlvbi4gIEl0IG1heSBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IG90aGVyIHNwZWVkcyBpbiB0aGUgZnV0dXJlLgotCi0gICogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgdGhlIHRlbGVwaG9uZSBtaXhlci9jb2RlYy4gIFRoZXJlIGlzIHN1cHBvcnQKLSAgICBmb3IgYSBwaG9uZWluL3Bob25lb3V0IGRldmljZSBpbiB0aGUgbWl4ZXIgZHJpdmVyOyAgd2hldGhlciBvciBub3QgCi0gICAgaXQgZG9lcyBhbnl0aGluZyBpcyBhbnlvbmUncyBndWVzcy4gIChSZXBvcnRzIG9uIHRoaXMgd291bGQgYmUKLSAgICBhcHByZWNpYXRlZC4gIFlvdSdsbCBoYXZlIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGdldCB0aGUgcGhvbmUgdG8KLSAgICBnbyBvZmYtaG9vayBiZWZvcmUgaXQnbGwgd29yaywgdGhvLikKLQotICAqIFRoaXMgZHJpdmVyIHdhcyBub3Qgd3JpdHRlbiB3aXRoIGFueSBjb29wZXJhdGlvbiBvciBzdXBwb3J0IGZyb20KLSAgICBOZW9NYWdpYy4gIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgYWJvdXQgdGhpcywgc2VlIHRoZWlyIHdlYnNpdGUKLSAgICBmb3IgdGhlaXIgb2ZmaWNpYWwgc3RhbmNlIG9uIHN1cHBvcnRpbmcgb3BlbiBzb3VyY2UgZHJpdmVycy4KLQotPT09PT09PT09PT09Ci1WaWRlbyBtZW1vcnkKLT09PT09PT09PT09PQotCi1UaGUgTmVvTWFnaWMgc291bmQgZW5naW5lIHVzZXMgYSBwb3J0aW9uIG9mIHRoZSBkaXNwbGF5IG1lbW9yeSB0byBob2xkCi10aGUgc291bmQgYnVmZmVyLiAgKENyYXp5LCBlaD8pICBUaGUgTmVvTWFnaWMgdmlkZW8gQklPUyBzZXRzIHVwIGEKLXNwZWNpYWwgcG9pbnRlciBhdCB0aGUgdG9wIG9mIHZpZGVvIFJBTSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgdG9wIG9mCi10aGUgYXVkaW8gYnVmZmVyIHNob3VsZCBiZSBwbGFjZWQuCi0KLUF0IHRoZSBwcmVzZW50IHRpbWUgWEZyZWU4NiBpcyBhcHBhcmVudGx5IG5vdCBhd2FyZSBvZiB0aGlzLiAgSXQgd2lsbAotdGh1cyB3cml0ZSBvdmVyIGVpdGhlciB0aGUgcG9pbnRlciBvciB0aGUgc291bmQgYnVmZmVyIHdpdGggYWJhbmRvbi4KLShBY2NlbGVyYXRlZC1YIHNlZW1zIHRvIGRvIGEgYmV0dGVyIGpvYiBoZXJlLikKLQotVGhpcyBpbXBsaWVzIGEgZmV3IHRoaW5nczoKLQotICAqIFNvbWV0aW1lcyB0aGUgTk0yNTYgZHJpdmVyIGhhcyB0byBndWVzcyBhdCB3aGVyZSB0aGUgYnVmZmVyIAotICAgIHNob3VsZCBiZSBwbGFjZWQsIGVzcGVjaWFsbHkgaWYgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYWZ0ZXIgdGhlCi0gICAgWCBzZXJ2ZXIgaXMgc3RhcnRlZC4gIEl0J3MgdXN1YWxseSBjb3JyZWN0LCBidXQgaXQgd2lsbCBjb25zaXN0ZW50bHkKLSAgICBmYWlsIG9uIHRoZSBTb255IEYyNTAuCi0KLSAgKiBWaXJ0dWFsIHNjcmVlbnMgZ3JlYXRlciB0aGFuIDEwMjR4NzY4eDE2IHVuZGVyIFhGcmVlODYgYXJlCi0gICAgcHJvYmxlbWF0aWMgb24gbGFwdG9wcyB3aXRoIG9ubHkgMi41TUIgb2Ygc2NyZWVuIFJBTS4gVGhpcwotICAgIGluY2x1ZGVzIGFsbCBvZiB0aGUgMjU2QVYtZXF1aXBwZWQgbGFwdG9wcy4gIChWaXJ0dWFsIGRpc3BsYXlzCi0gICAgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgMjU2WlgsIHdoaWNoIGhhcyBhdCBsZWFzdCA0TUIgb2YKLSAgICB2aWRlbyBSQU0uKQotCi1JZiB5b3Ugc3RhcnQgaGF2aW5nIHByb2JsZW1zIHdpdGggcmFuZG9tIG5vaXNlIGJlaW5nIG91dHB1dCBlaXRoZXIKLWNvbnN0YW50bHkgKHRoaXMgaXMgdGhlIHVzdWFsIHN5bXB0b20gb24gdGhlIEYyNTApLCBvciB3aGVuIHdpbmRvd3MKLWFyZSBtb3ZlZCBhcm91bmQgKHRoaXMgaXMgdGhlIHVzdWFsIHN5bXB0b20gd2hlbiB1c2luZyBhIHZpcnR1YWwKLXNjcmVlbiksIHRoZSBiZXN0IGZpeCBpcyB0bwotCi0gICogRG9uJ3QgdXNlIGEgdmlydHVhbCBmcmFtZSBidWZmZXIuCi0gICogTWFrZSBzdXJlIHlvdSBsb2FkIHRoZSBOTTI1NiBtb2R1bGUgYmVmb3JlIHRoZSBYIHNlcnZlciBpcwotICAgIHN0YXJ0ZWQuCi0KLU9uIHRoZSBGMjUwLCBpdCBpcyBwb3NzaWJsZSB0byBmb3JjZSB0aGUgZHJpdmVyIHRvIGxvYWQgcHJvcGVybHkgZXZlbgotYWZ0ZXIgdGhlIFhGcmVlODYgc2VydmVyIGlzIHN0YXJ0ZWQgYnkgZG9pbmc6Ci0KLQlpbnNtb2Qgbm0yNTYgYnVmZmVydG9wPTB4MjVhODAwCi0KLVRoaXMgZm9yY2VzIHRoZSBhdWRpbyBidWZmZXJzIHRvIHRoZSBjb3JyZWN0IG9mZnNldCBpbiBzY3JlZW4gUkFNLgotCi1PbmUgdXNlciBoYXMgcmVwb3J0ZWQgYSBzaW1pbGFyIHByb2JsZW0gb24gdGhlIFNvbnkgRjI3MCwgYWx0aG91Z2gKLW90aGVycyBhcHBhcmVudGx5IGFyZW4ndCBzZWVpbmcgYW55IHByb2JsZW1zLiAgSGlzIHN1Z2dlc3RlZCBjb21tYW5kCi1pcwotCi0JaW5zbW9kIG5tMjU2IGJ1ZmZlcnRvcD0weDI3MjgwMAotCi09PT09PT09PT09PT09PT09PQotT2ZmaWNpYWwgV1dXIHNpdGUKLT09PT09PT09PT09PT09PT09Ci0KLVRoZSBvZmZpY2lhbCBzaXRlIGZvciB0aGUgTk0yNTYgZHJpdmVyIGlzOgotCi0JaHR0cDovL3d3dy51Z2x4Lm9yZy9zb255Lmh0bWwKLQotWW91IHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgdGhlcmUsCi1hbmQgdGhlIGRyaXZlciB3aWxsIGJlIHN1cHBvcnRlZCBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4KLQotPT09PT09PT09PT09PT0KLVo1MDVSWCBhbmQgSURFCi09PT09PT09PT09PT09PQotCi1UaGVyZSBhcHBlYXJzIHRvIGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBJREUgY2hpcHNldCBvbiB0aGUgWjUwNVJYOyBvbmUKLW9mIHRoZSBzeW1wdG9tcyBpcyB0aGF0IHNvdW5kIHBsYXliYWNrIHBlcmlvZGljYWxseSBoYW5ncyAod2hlbiB0aGUKLWRpc2sgaXMgYWNjZXNzZWQpLiAgVGhlIHVzZXIgcmVwb3J0aW5nIHRoZSBwcm9ibGVtIGFsc28gcmVwb3J0ZWQgdGhhdAotZW5hYmxpbmcgYWxsIG9mIHRoZSBJREUgY2hpcHNldCB3b3JrYXJvdW5kcyBpbiB0aGUga2VybmVsIHNvbHZlZCB0aGUKLXByb2JsZW0sIHRobyBvYnZpb3VzbHkgb25seSBvbmUgb2YgdGhlbSBzaG91bGQgYmUgbmVlZGVkLS1pZiBzb21lb25lCi1jYW4gZ2l2ZSBtZSBtb3JlIGRldGFpbHMgSSB3b3VsZCBhcHByZWNpYXRlIGl0LgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVo1MDVTL1o1MDVTWCBvbi1ib2FyZCBFdGhlcm5ldAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUlmIHlvdSdyZSB1c2luZyB0aGUgb24tYm9hcmQgRXRoZXJuZXQgUHJvLzEwMCBldGhlcm5ldCBzdXBwb3J0IG9uIHRoZSBaNTA1Ci1zZXJpZXMsIEkgc3Ryb25nbHkgZW5jb3VyYWdlIHlvdSB0byBkb3dubG9hZCB0aGUgbGF0ZXN0IGVlcHJvMTAwIGRyaXZlciBmcm9tCi1Eb25hbGQgQmVja2VyJ3Mgc2l0ZToKLQotCWZ0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L3B1Yi9saW51eC9kcml2ZXJzL3Rlc3QvZWVwcm8xMDAuYwotCi1UaGVyZSB3YXMgYSByZXBvcnRlZCBwcm9ibGVtIG9uIHRoZSBaNTA1U1ggdGhhdCBpZiB0aGUgZXRoZXJuZXQKLWludGVyZmFjZSBpcyBkaXNhYmxlZCBhbmQgcmVlbmFibGVkIHdoaWxlIHRoZSBzb3VuZCBkcml2ZXIgaXMgbG9hZGVkLAotdGhlIG1hY2hpbmUgd291bGQgbG9jayB1cC4gIEkgaGF2ZSBpbmNsdWRlZCBhIHdvcmthcm91bmQgdGhhdCBpcwotd29ya2luZyBzYXRpc2ZhY3RvcmlseS4gIEhvd2V2ZXIsIHlvdSBtYXkgb2NjYXNpb25hbGx5IHNlZSBhIG1lc3NhZ2UKLWFib3V0ICJSZWxlYXNpbmcgaW50ZXJydXB0cywgb3ZlciAxMDAwIGJhZCBpbnRlcnJ1cHRzIiB3aGljaCBpbmRpY2F0ZXMKLXRoYXQgdGhlIHdvcmthcm91bmQgaXMgZG9pbmcgaXRzIGpvYi4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUENNQ0lBIGFuZCB0aGUgWjUwNVMvWjUwNVNYL1o1MDVEWAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBpcyBhbHNvIGEga25vd24gcHJvYmxlbSB3aXRoIHRoZSBTb255IFo1MDVTIGFuZCBaNTA1U1ggaGFuZ2luZwotaWYgYSBQQ01DSUEgY2FyZCBpcyBpbnNlcnRlZCB3aGlsZSB0aGUgZXRoZXJuZXQgZHJpdmVyIGlzIGxvYWRlZCwgb3IKLWluIHNvbWUgY2FzZXMgaWYgdGhlIGxhcHRvcCBpcyBzdXNwZW5kZWQuICBUaGlzIGlzIGNhdXNlZCBieSB0b25zIG9mCi1zcHVyaW91cyBJUlEgOXMsIHByb2JhYmx5IGdlbmVyYXRlZCBmcm9tIHRoZSBQQ01DSUEgb3IgQUNQSSBicmlkZ2VzLgotCi1UaGVyZSBpcyBjdXJyZW50bHkgbm8gZml4IGZvciB0aGUgcHJvYmxlbSB0aGF0IHdvcmtzIGluIGV2ZXJ5IGNhc2UuCi1UaGUgb25seSBrbm93biB3b3JrYXJvdW5kcyBhcmUgdG8gZGlzYWJsZSB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlCi1iZWZvcmUgaW5zZXJ0aW5nIG9yIHJlbW92aW5nIGEgUENNQ0lBIGNhcmQsIG9yIHdpdGggc29tZSBjYXJkcwotZGlzYWJsaW5nIHRoZSBQQ01DSUEgY2FyZCBiZWZvcmUgZWplY3RpbmcgaXQgd2lsbCBhbHNvIGhlbHAgdGhlCi1wcm9ibGVtIHdpdGggdGhlIGxhcHRvcCBoYW5naW5nIHdoZW4gdGhlIGNhcmQgaXMgZWplY3RlZC4KLQotT25lIHVzZXIgaGFzIHJlcG9ydGVkIHRoYXQgc2V0dGluZyB0aGUgdGNpYydzIGNzX2lycSB0byBzb21lIHZhbHVlCi1vdGhlciB0aGFuIDkgKGxpa2UgMTEpIGZpeGVkIHRoZSBwcm9ibGVtLiAgVGhpcyBkb2Vzbid0IHdvcmsgb24gbXkKLVo1MDVTLCBob3dldmVyLS1jaGFuZ2luZyB0aGUgdmFsdWUgY2F1c2VzIHRoZSBjYXJkbWdyIHRvIHN0b3Agc2VlaW5nCi1jYXJkIGluc2VydGlvbnMgYW5kIHJlbW92YWxzLCBjYXJkcyBkb24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5LCBhbmQKLUkgc3RpbGwgZ2V0IGhhbmdzIGlmIGEgY2FyZCBpcyBpbnNlcnRlZCB3aGVuIHRoZSBrZXJuZWwgaXMgYm9vdGVkLgotCi1Vc2luZyB0aGUgbGF0ZXN0IGV0aGVybmV0IGRyaXZlciBhbmQgcGNtY2lhIHBhY2thZ2UgYWxsb3dzIG1lIHRvCi1pbnNlcnQgYW4gQWRhcHRlYyAxNDgwQSBTbGltU2NzaSBjYXJkIHdpdGhvdXQgdGhlIGxhcHRvcCBoYW5naW5nLAotYWx0aG91Z2ggSSBzdGlsbCBoYXZlIHRvIHNodXQgZG93biB0aGUgY2FyZCBiZWZvcmUgZWplY3Rpbmcgb3IKLXBvd2VyaW5nIGRvd24gdGhlIGxhcHRvcC4gIEhvd2V2ZXIsIHNpbWlsYXIgZXhwZXJpbWVudHMgd2l0aCBhIERFLTY2MAotZXRoZXJuZXQgY2FyZCBzdGlsbCByZXN1bHQgaW4gaGFuZ3Mgd2hlbiB0aGUgY2FyZCBpcyBpbnNlcnRlZC4gIEkgYW0KLWJlZ2lubmluZyB0byB0aGluayB0aGF0IHRoZSBpbnRlcnJ1cHRzIGFyZSBDYXJkQnVzLXJlbGF0ZWQsIHNpbmNlIHRoZQotQWRhcHRlYyBjYXJkIGlzIGEgQ2FyZEJ1cyBjYXJkLCBhbmQgdGhlIERFLTY2MCBpcyBub3Q7IGhvd2V2ZXIsIEkKLWRvbid0IGhhdmUgYW55IG90aGVyIENhcmRCdXMgY2FyZHMgdG8gdGVzdCB3aXRoLgotCi09PT09PT0KLVRoYW5rcwotPT09PT09Ci0KLUZpcnN0LCBJIHdhbnQgdG8gdGhhbmsgZXZlcnlvbmUgKGV4Y2VwdCBOZW9NYWdpYyBvZiBjb3Vyc2UpIGZvciB0aGVpcgotZ2VuZXJvdXMgc3VwcG9ydCBhbmQgZW5jb3VyYWdlbWVudC4gIEknZCBsaWtlIHRvIGxpc3QgZXZlcnlvbmUncyBuYW1lCi1oZXJlIHRoYXQgcmVwbGllZCBkdXJpbmcgdGhlIGRldmVsb3BtZW50IHBoYXNlLCBidXQgdGhlIGxpc3QgaXMKLWFtYXppbmdseSBsb25nLgotCi1JIHdpbGwgYmUgcmF0aGVyIHVuZmFpciBhbmQgc2luZ2xlIG91dCBhIGZldyBwZW9wbGUsIGhvd2V2ZXI6Ci0KLQlKdXN0aW4gTWF1cmVyLCBmb3IgYmVpbmcgdGhlIGZpcnN0IHJhbmRvbSBuZXQucGVyc29uIHRvIHRyeSBpdCwKLQlhbmQgZm9yIGxldHRpbmcgbWUgbG9naW4gdG8gaGlzIFo1MDVTWCB0byBnZXQgaXQgd29ya2luZyB0aGVyZQotCi0JRWRpIFdlaXR6IGZvciB0cnlpbmcgb3V0IHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zLCBhbmQgZ2l2aW5nCi0JbWUgYSBsb3Qgb2YgdXNlZnVsIGZlZWRiYWNrCi0KLQlHcmVnIFJ1bXBsZSBmb3IgbGV0dGluZyBtZSBsb2dpbiByZW1vdGVseSB0byBnZXQgdGhlIGRyaXZlciAKLQlmdW5jdGlvbmFsIG9uIHRoZSAyNTZaWCwgZm9yIGhpcyBhc3Npc3RhbmNlIG9uIHRyYWNraW5nCi0JZG93biBhbGwgc29ydHMgb2YgcmFuZG9tIHN0dWZmLCBhbmQgZm9yIHRyeWluZyBvdXQgQWNjZWwtWAotCi0JWmFjaCBCcm93biwgZm9yIHRoZSBpbml0aWFsIEFDOTcgbWl4ZXIgaW50ZXJmYWNlIGRlc2lnbgotCi0JSmVmZiBHYXJ6aWssIGZvciB2YXJpb3VzIGhlbHBmdWwgc3VnZ2VzdGlvbnMgb24gdGhlIEFDOTcKLQlpbnRlcmZhY2UKLQotCSJNci4gQnVtcHkiIGZvciBmZWVkYmFjayBvbiB0aGUgWjUwNVJYCi0KLQlCaWxsIE5vdHRpbmdoYW0sIGZvciBnZW5lcm91cyBhc3Npc3RhbmNlIGluIGdldHRpbmcgdGhlIG1peGVyIElECi0JY29kZSB3b3JraW5nCi0KLT09PT09PT09PT09PT09PT09Ci1QcmV2aW91cyB2ZXJzaW9ucwotPT09PT09PT09PT09PT09PT0KLQotVmVyc2lvbnMgcHJpb3IgdG8gMC4zIChha2EgYG5vbmFtZScpIGhhZCBwcm9ibGVtcyB3aXRoIHdlaXJkIGFydGlmYWN0cwotaW4gdGhlIG91dHB1dCBhbmQgZmFpbGVkIHRvIHNldCB0aGUgcmVjb3JkaW5nIHJhdGUgcHJvcGVybHkuICBUaGVzZQotcHJvYmxlbXMgaGF2ZSBsb25nIHNpbmNlIGJlZW4gZml4ZWQuCi0KLVZlcnNpb25zIHByaW9yIHRvIDAuNSBoYWQgcHJvYmxlbXMgd2l0aCBjbGlja3MgaW4gdGhlIG91dHB1dCB3aGVuCi1hbnl0aGluZyBvdGhlciB0aGFuIDE2LWJpdCBzdGVyZW8gc291bmQgd2FzIGJlaW5nIHBsYXllZCwgYW5kIGFsc28gaGFkCi1wZXJpb2RpYyBjbGlja3Mgd2hlbiByZWNvcmRpbmcuCi0KLVZlcnNpb24gMC43IGZpcnN0IGluY29ycG9yYXRlZCBzdXBwb3J0IGZvciB0aGUgTk0yNTZaWCBjaGlwc2V0LCB3aGljaAotaXMgZm91bmQgb24gc29tZSBEZWxsIExhdGl0dWRlIGxhcHRvcHMgKHRoZSBDUHQsIGFuZCBhcHBhcmVudGx5Ci1zb21lIENQaSBtb2RlbHMgYXMgd2VsbCkuICBJdCBhbHNvIGluY2x1ZGVkIHRoZSBnZW5lcmljIEFDOTcKLW1peGVyIG1vZHVsZS4KLQotVmVyc2lvbiAwLjc1IHJlbmFtZWQgYWxsIHRoZSBmdW5jdGlvbnMgYW5kIGZpbGVzIHdpdGggc2xpZ2h0bHkgbW9yZQotZ2VuZXJpYyBuYW1lcy4KLQotTm90ZSB0aGF0IHByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZG9jdW1lbnQgY2xhaW1lZCB0aGF0IHJlY29yZGluZyB3YXMKLTgtYml0IG9ubHk7IGl0IGFjdHVhbGx5IGhhcyBiZWVuIHdvcmtpbmcgZm9yIDE2LWJpdHMgYWxsIGFsb25nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvT1BMMy1TQTIgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiNmQyYi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBMgorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi1Eb2N1bWVudGF0aW9uIGZvciB0aGUgT1BMMy1TQTIsIFNBMywgYW5kIFNBeCBkcml2ZXIgKG9wbDNzYTIubykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TY290dCBNdXJyYXksIHNjb3R0QHNwaXRlZnVsLm9yZwotSmFudWFyeSA3LCAyMDAxCi0KLU5PVEU6IEFsbCB0cmFkZS1tYXJrZWQgdGVybXMgbWVudGlvbmVkIGJlbG93IGFyZSBwcm9wZXJ0aWVzIG9mIHRoZWlyCi0gICAgICByZXNwZWN0aXZlIG93bmVycy4KLQotCi1TdXBwb3J0ZWQgRGV2aWNlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBkcml2ZXIgaXMgZm9yIFBuUCBzb3VuZGNhcmRzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgWWFtYWhhIGF1ZGlvCi1jb250cm9sbGVyIGNoaXBzZXRzOgotCi1ZTUY3MTEgYWthIE9QTDMtU0EyCi1ZTUY3MTUgYW5kIFlNRjcxOSBha2EgT1BMMy1TQTMKLQotVXAgdW50aWwgcmVjZW50bHkgKERlY2VtYmVyIDIwMDApLCBJJ2QgdGhvdWdodCB0aGUgNzE5IHRvIGJlIGEKLWRpZmZlcmVudCBjaGlwc2V0LCB0aGUgT1BMMy1TQXguICBBZnRlciBhbiBlbWFpbCBleGhhbmdlIHdpdGgKLVlhbWFoYSwgaG93ZXZlciwgaXQgdHVybnMgb3V0IHRoYXQgdGhlIDcxOSBpcyBqdXN0IGEgcmUtYmFkZ2VkCi03MTUsIGFuZCB0aGUgY2hpcHNldHMgYXJlIGlkZW50aWNhbC4gIFRoZSBjaGlwc2V0IGRldGVjdGlvbiBjb2RlCi1oYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhpcy4KLQotQW55d2F5cywgYWxsIG9mIHRoZXNlIGNoaXBzZXRzIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGRldmljZXM6Ci0KLU9QTDMgRk0gc3ludGhlc2l6ZXIKLVNvdW5kYmxhc3RlciBQcm8KLU1pY3Jvc29mdC9XaW5kb3dzIFNvdW5kIFN5c3RlbQotTVBVNDAxIE1JREkgaW50ZXJmYWNlCi0KLU5vdGUgdGhhdCB0aGlzIGRyaXZlciB1c2VzIHRoZSBNU1MgZGV2aWNlLCBhbmQgdG8gbXkga25vd2xlZGdlIHRoZXNlCi1jaGlwc2V0cyBlbmZvcmNlIGFuIGVpdGhlci9vciBzaXR1YXRpb24gd2l0aCB0aGUgU291bmRibGFzdGVyIFBybwotZGV2aWNlIGFuZCB0aGUgTVNTIGRldmljZS4gIFNpbmNlIHRoZSBNU1MgZGV2aWNlIGhhcyBiZXR0ZXIKLWNhcGFiaWxpdGllcywgSSBoYXZlIGltcGxlbWVudGVkIHRoZSBkcml2ZXIgdG8gdXNlIGl0LgotCi0KLU1peGVyIENoYW5uZWxzCi0tLS0tLS0tLS0tLS0tLQotCi1PbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlciAocHJlLURlY2VtYmVyIDIwMDApIGhhZCB0d28gbWl4ZXJzLAotYW4gT1BMMy1TQTIgb3IgU0EzIG1peGVyIGFuZCBhIE1TUyBtaXhlci4gIFRoZSBPUEwzLVNBWzIzXSBtaXhlcgotZGV2aWNlIGNvbnRhaW5lZCBhIHN1cGVyc2V0IG9mIG1peGVyIGNoYW5uZWxzIGNvbnNpc3Rpbmcgb2YgaXRzIG93bgotY2hhbm5lbHMgYW5kIGFsbCBvZiB0aGUgTVNTIG1peGVyIGNoYW5uZWxzLiAgVG8gc2ltcGxpZnkgdGhlIGRyaXZlcgotY29uc2lkZXJhYmx5LCBhbmQgdG8gcGFydGl0aW9uIGZ1bmN0aW9uYWxpdHkgYmV0dGVyLCB0aGUgT1BMMy1TQVsyM10KLW1peGVyIGRldmljZSBub3cgY29udGFpbnMgaGFzIGl0cyBvd24gc3BlY2lmaWMgbWl4ZXIgY2hhbm5lbHMuICBUaGV5Ci1hcmU6Ci0KLVZvbHVtZSAgICAgLSBIYXJkd2FyZSBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wKLUJhc3MgICAgICAgLSBTQTMgb25seSwgbm93IHN1cHBvcnRzIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzCi1UcmVibGUgICAgIC0gU0EzIG9ubHksIG5vdyBzdXBwb3J0cyBsZWZ0IGFuZCByaWdodCBjaGFubmVscwotTWljcm9waG9uZSAtIEhhcmR3YXJlIG1pY3JvcGhvbmUgaW5wdXQgdm9sdW1lIGNvbnRyb2wKLURpZ2l0YWwxICAgLSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgIldpZGUiIG1peGVyCi0KLUFsbCBvdGhlciBtaXhlciBjaGFubmVscyAoZS5nLiAiUENNIiwgIkNEIiwgZXRjLikgbm93IGhhdmUgdG8gYmUKLWNvbnRyb2xsZWQgdmlhIHRoZSAiTVMgU291bmQgU3lzdGVtIChDUzQyMzEpIiBtaXhlci4gIFRvIGZhY2lsaXRhdGUKLXRoaXMsIHRoZSBtaXhlciBkZXZpY2UgY3JlYXRpb24gb3JkZXIgaGFzIGJlZW4gc3dpdGNoZWQgc28gdGhhdAotdGhlIE1TUyBtaXhlciBpcyBjcmVhdGVkIGZpcnN0LiAgVGhpcyBhbGxvd3MgYWNjZXNzaW5nIHRoZSBtYWpvcml0eQotb2YgdGhlIHVzZWZ1bCBtaXhlciBjaGFubmVscyBldmVuIHZpYSBzaW5nbGUgbWl4ZXItYXdhcmUgdG9vbHMKLXN1Y2ggYXMgImF1bWl4Ii4KLQotCi1QbHVnICduIFBsYXkKLS0tLS0tLS0tLS0tLQotCi1JbiBwcmV2aW91cyBrZXJuZWxzICgyLjIueCksIHNvbWUgY29uZmlndXJhdGlvbiB3YXMgcmVxdWlyZWQgdG8KLWdldCB0aGUgZHJpdmVyIHRvIHRhbGsgdG8gdGhlIGNhcmQuICBCZWluZyB0aGUgbmV3IG1pbGxlbm5pdW0gYW5kCi1hbGwsIHRoZSAyLjQueCBrZXJuZWxzIG5vdyBzdXBwb3J0IGF1dG8tY29uZmlndXJhdGlvbiBpZiBJU0EgUG5QCi1zdXBwb3J0IGlzIGNvbmZpZ3VyZWQgaW4uICBUaGVvcmV0aWNhbGx5LCB0aGUgZHJpdmVyIGV2ZW4gc3VwcG9ydHMKLWhhdmluZyBtb3JlIHRoYW4gb25lIGNhcmQgaW4gdGhpcyBjYXNlLgotCi1XaXRoIHRoZSBhZGRpdGlvbiBvZiBQblAgc3VwcG9ydCB0byB0aGUgZHJpdmVyLCB0d28gbmV3IHBhcmFtZXRlcnMKLWhhdmUgYmVlbiBhZGRlZCB0byBjb250cm9sIGl0OgotCi1pc2FwbnAgICAtIHNldCB0byAwIHRvIGRpc2FibGUgSVNBIFBuUCBjYXJkIGRldGVjdGlvbgotCi1tdWx0aXBsZSAtIHNldCB0byAwIHRvIGRpc2FibGUgbXVsdGlwbGUgUG5QIGNhcmQgZGV0ZWN0aW9uCi0KLQotT3B0aW9uYWwgUGFyYW1ldGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWNlbnQgKERlY2VtYmVyIDIwMDApIGFkZGl0aW9ucyB0byB0aGUgZHJpdmVyIChiYXNlZCBvbiBhIHBhdGNoCi1wcm92aWRlZCBieSBQZXRlciBFbmdsbWFpZXIpIGFyZSB0d28gbmV3IHBhcmFtZXRlcnM6Ci0KLXltb2RlIC0gICAgU2V0IFlhbWFoYSAzRCBlbmhhbmNlbWVudCBtb2RlOgotICAgICAgICAgICAwID0gRGVza3RvcC9Ob3JtYWwgIDUtMTIgY20gc3BlYWtlcnMKLSAgICAgICAgICAgMSA9IE5vdGVib29rIFBDICgxKSAzIGNtIHNwZWFrZXJzCi0gICAgICAgICAgIDIgPSBOb3RlYm9vayBQQyAoMikgMS41IGNtIHNwZWFrZXJzCi0gICAgICAgICAgIDMgPSBIaS1GaSAgICAgICAgICAgMTYtMzggY20gc3BlYWtlcnMKLQotbG9vcGJhY2sgLSBTZXQgQS9EIGlucHV0IHNvdXJjZS4gVXNlZnVsIGZvciBlY2hvIGNhbmNlbGxhdGlvbjoKLSAgICAgICAgICAgMCA9IE1pYyBSaWdodCBjaGFubmVsIChkZWZhdWx0KQotICAgICAgICAgICAxID0gTW9ubyBvdXRwdXQgbG9vcGJhY2sKLQotVGhlIHltb2RlIHBhcmFtZXRlciBoYXMgYmVlbiB0ZXN0ZWQgYW5kIGRvZXMgd29yay4gIFRoZSBsb29wYmFjawotcGFyYW1ldGVyLCBob3dldmVyLCBpcyB1bnRlc3RlZC4gIEFueSBmZWVkYmFjayBvbiBpdHMgdXNlZnVsbmVzcwotd291bGQgYmUgYXBwcmVjaWF0ZWQuCi0KLQotTWFudWFsIENvbmZpZ3VyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIGZvciBzb21lIHJlYXNvbiB5b3UgZGVjaWRlIG5vdCB0byBjb21waWxlIElTQSBQblAgc3VwcG9ydCBpbnRvCi15b3VyIGtlcm5lbCwgb3IgZGlzYWJsZWQgdGhlIGRyaXZlcidzIHVzYWdlIG9mIGl0IGJ5IHNldHRpbmcgdGhlCi1pc2FwbnAgcGFyYW1ldGVyIGFzIGRpc2N1c3NlZCBhYm92ZSwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIGRvIHNvbWUKLW1hbnVhbCBjb25maWd1cmF0aW9uLiAgVGhlcmUgYXJlIHR3byB3YXlzIG9mIGRvaW5nIHRoaXMuICBUaGUgbW9zdAotY29tbW9uIGlzIHRvIHVzZSB0aGUgaXNhcG5wdG9vbHMgcGFja2FnZSB0byBpbml0aWFsaXplIHRoZSBjYXJkLCBhbmQKLXVzZSB0aGUga2VybmVsIG1vZHVsZSBmb3JtIG9mIHRoZSBzb3VuZCBzdWJzeXN0ZW0gYW5kIHNvdW5kIGRyaXZlcnMuCi1BbHRlcm5hdGl2ZWx5LCBzb21lIEJJT1MncyBhbGxvdyBtYW51YWwgY29uZmlndXJhdGlvbiBvZiBpbnN0YWxsZWQKLVBuUCBkZXZpY2VzIGluIGEgQklPUyBtZW51LCB3aGljaCBzaG91bGQgYWxsb3cgdXNpbmcgdGhlIG5vbi1tb2R1bGFyCi1zb3VuZCBkcml2ZXJzLCBpLmUuIGJ1aWx0IGludG8gdGhlIGtlcm5lbC4KLQotSSBwZXJzb25hbGx5IHVzZSBpc2FwbnAgYW5kIG1vZHVsZXMsIGFuZCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gYSBQblAKLUJJT1MgbWFjaGluZSB0byB0ZXN0LiAgSWYgeW91IGhhdmUgc3VjaCBhIGJlYXN0LCBjb25maWd1cmluZyB0aGUKLWRyaXZlciB0byBiZSBidWlsdCBpbnRvIHRoZSBrZXJuZWwgc2hvdWxkIGp1c3Qgd29yayAodGhhbmtzIHRvIHdvcmsKLWRvbmUgYnkgRGF2aWQgTHV5ZXIgPGx1eWVyQHVjcy51d2EuZWR1LmF1PikuICBZb3Ugd2lsbCBzdGlsbCBuZWVkCi10byBzcGVjaWZ5IHNldHRpbmdzLCB3aGljaCBjYW4gYmUgZG9uZSBieSBhZGRpbmc6Ci0KLW9wbDNzYTI9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4sPG1zc2lvPiw8bXB1aW8+Ci0KLXRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGU6Ci0KLW9wbDNzYTI9MHgzNzAsNSwwLDEsMHg1MzAsMHgzMzAKLQotSWYgeW91IGFyZSBpbnN0ZWFkIHVzaW5nIHRoZSBpc2FwbnAgdG9vbHMgKGFzIG1vc3QgcGVvcGxlIGhhdmUgYmVlbgotYmVmb3JlIExpbnV4IDIuNC54KSwgZm9sbG93IHRoZSBkaXJlY3Rpb25zIGluIHRoZWlyIGRvY3VtZW50YXRpb24gdG8KLXByb2R1Y2UgYSBjb25maWd1cmF0aW9uIGZpbGUuICBIZXJlIGlzIHRoZSByZWxldmFudCBleGNlcnB0IEkgdXNlZCB0bwotdXNlIGZvciBteSBTQTMgY2FyZCBmcm9tIG15IGlzYXBucC5jb25mOgotCi0oQ09ORklHVVJFIFlNSDA4MDAvLTEgKExEIDAKLQotIyBOT1RFOiBJTyAwIGlzIGZvciB0aGUgdW51c2VkIFNvdW5kQmxhc3RlciBwYXJ0IG9mIHRoZSBjaGlwc2V0LgotKElPIDAgKEJBU0UgMHgwMjIwKSkKLShJTyAxIChCQVNFIDB4MDUzMCkpCi0oSU8gMiAoQkFTRSAweDAzODgpKQotKElPIDMgKEJBU0UgMHgwMzMwKSkKLShJTyA0IChCQVNFIDB4MDM3MCkpCi0oSU5UIDAgKElSUSA1IChNT0RFICtFKSkpCi0oRE1BIDAgKENIQU5ORUwgMCkpCi0oRE1BIDEgKENIQU5ORUwgMSkpCi0KLUhlcmUsIG5vdGUgdGhhdDoKLQotUG9ydCAgQWNjZXB0YWJsZSBSYW5nZSAgUHVycG9zZQotLS0tLSAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLQotSU8gMCAgMHgwMjIwIC0gMHgwMjgwICAgU0IgYmFzZSBhZGRyZXNzLCB1bnVzZWQuCi1JTyAxICAweDA1MzAgLSAweDBGNDggICBNU1MgYmFzZSBhZGRyZXNzCi1JTyAyICAweDAzODggLSAweDAzRjggICBPUEwzIGJhc2UgYWRkcmVzcwotSU8gMyAgMHgwMzAwIC0gMHgwMzM0ICAgTVBVIGJhc2UgYWRkcmVzcwotSU8gNCAgMHgwMTAwIC0gMHgwRkZFICAgY2FyZCdzIG93biBiYXNlIGFkZHJlc3MgZm9yIGl0cyBjb250cm9sIEkvTyBwb3J0cwotCi1UaGUgSVJRIGFuZCBETUEgdmFsdWVzIGNhbiBiZSBhbnkgdGhhdCBhcmUgY29uc2lkZXJlZCBhY2NlcHRhYmxlIGZvciBhCi1NU1MuICBBc3N1bWluZyB5b3UndmUgZ290IGlzYXBucCBhbGwgaGFwcHksIHRoZW4geW91IHNob3VsZCBiZSBhYmxlIHRvCi1kbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nICh3aGljaCBtYXRjaGVzIHVwIHdpdGggdGhlIGlzYXBucAotY29uZmlndXJhdGlvbiBhYm92ZSk6Ci0KLW1vZHByb2JlIG1wdTQwMQotbW9kcHJvYmUgYWQxODQ4Ci1tb2Rwcm9iZSBvcGwzc2EyIGlvPTB4MzcwIG1zc19pbz0weDUzMCBtcHVfaW89MHgzMzAgaXJxPTUgZG1hPTAgZG1hMj0xCi1tb2Rwcm9iZSBvcGwzIGlvPTB4Mzg4Ci0KLVNlZSB0aGUgc2VjdGlvbiAiQXV0b21hdGljIE1vZHVsZSBMb2FkaW5nIiBiZWxvdyBmb3IgaG93IHRvIHNldCB1cAotL2V0Yy9tb2Rwcm9iZS5jb25mIHRvIGF1dG9tYXRlIHRoaXMuCi0KLUFuIGltcG9ydGFudCB0aGluZyB0byByZW1lbWJlciB0aGF0IHRoZSBvcGwzc2EyIG1vZHVsZSdzIGlvIGFyZ3VtZW50IGlzCi1mb3IgaXQncyBvd24gY29udHJvbCBwb3J0LCB3aGljaCBoYW5kbGVzIHRoZSBjYXJkJ3MgbWFzdGVyIG1peGVyIGZvcgotdm9sdW1lIChvbiBhbGwgY2FyZHMpLCBhbmQgYmFzcyBhbmQgdHJlYmxlIChvbiBTQTMgY2FyZHMpLgotCi0KLVRyb3VibGVzaG9vdGluZwotLS0tLS0tLS0tLS0tLS0tCi0KLUlmIGFsbCBnb2VzIHdlbGwgYW5kIHlvdSBzZWUgbm8gZXJyb3IgbWVzc2FnZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0bwotc3RhcnQgdXNpbmcgdGhlIHNvdW5kIGNhcGFiaWxpdGllcyBvZiB5b3VyIHN5c3RlbS4gIElmIHlvdSBnZXQgYW4KLWVycm9yIG1lc3NhZ2Ugd2hpbGUgdHJ5aW5nIHRvIGluc2VydCB0aGUgb3BsM3NhMiBtb2R1bGUsIHRoZW4gbWFrZQotc3VyZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlvdXMgYXJndW1lbnRzIG1hdGNoIHdoYXQgeW91IHNwZWNpZmllZAotaW4geW91ciBpc2FwbnAgY29uZmlndXJhdGlvbiBmaWxlLCBhbmQgdGhhdCB0aGVyZSBpcyBubyBjb25mbGljdCB3aXRoCi1hbm90aGVyIGRldmljZSBmb3IgYW4gSS9PIHBvcnQgb3IgaW50ZXJydXB0LiAgQ2hlY2tpbmcgdGhlIGNvbnRlbnRzIG9mCi0vcHJvYy9pb3BvcnRzIGFuZCAvcHJvYy9pbnRlcnJ1cHRzIGNhbiBiZSB1c2VmdWwgdG8gc2VlIGlmIHlvdSdyZQotYnV0dGluZyBoZWFkcyB3aXRoIGFub3RoZXIgZGV2aWNlLgotCi1JZiB5b3Ugc3RpbGwgY2Fubm90IGdldCB0aGUgbW9kdWxlIHRvIGxvYWQsIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mCi15b3VyIHN5c3RlbSBsb2cgZmlsZSwgdXN1YWxseSAvdmFyL2xvZy9tZXNzYWdlcy4gIElmIHlvdSBzZWUgdGhlCi1tZXNzYWdlICJvcGwzc2EyOiBVbmtub3duIFlhbWFoYSBhdWRpbyBjb250cm9sbGVyIHZlcnNpb24iLCB0aGVuIHlvdQotaGF2ZSBhIGRpZmZlcmVudCBjaGlwc2V0IHZlcnNpb24gdGhhbiBJJ3ZlIGVuY291bnRlcmVkIHNvIGZhci4gIExvb2sKLWZvciBhbGwgbWVzc2FnZXMgaW4gdGhlIGxvZyBmaWxlIHRoYXQgc3RhcnQgd2l0aCAib3BsM3NhMjogIiBhbmQgc2VlCi1pZiB0aGV5IHByb3ZpZGUgYW55IGNsdWVzLiAgSWYgeW91IGRvIG5vdCBzZWUgdGhlIGNoaXBzZXQgdmVyc2lvbgotbWVzc2FnZSwgYW5kIG5vbmUgb2YgdGhlIG90aGVyIG1lc3NhZ2VzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSBsb2cgYXJlCi1oZWxwZnVsLCBlbWFpbCBtZSBzb21lIGRldGFpbHMgYW5kIEknbGwgdHJ5IG15IGJlc3QgdG8gaGVscC4KLQotCi1BdXRvbWF0aWMgTW9kdWxlIExvYWRpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MYXN0bHksIGlmIHlvdSdyZSB1c2luZyBtb2R1bGVzIGFuZCB3YW50IHRvIHNldCB1cCBhdXRvbWF0aWMgbW9kdWxlCi1sb2FkaW5nIHdpdGgga21vZCwgdGhlIGtlcm5lbCBtb2R1bGUgbG9hZGVyLCBoZXJlIGlzIHRoZSBzZWN0aW9uIEkKLWN1cnJlbnRseSB1c2UgaW4gbXkgbW9kcHJvYmUuY29uZiBmaWxlOgotCi0jIFNvdW5kCi1hbGlhcyBzb3VuZC1zbG90LTAgb3BsM3NhMgotb3B0aW9ucyBvcGwzc2EyIGlvPTB4MzcwIG1zc19pbz0weDUzMCBtcHVfaW89MHgzMzAgaXJxPTcgZG1hPTAgZG1hMj0zCi1vcHRpb25zIG9wbDMgaW89MHgzODgKLQotVGhhdCdzIGFsbCBpdCBjdXJyZW50bHkgdGFrZXMgdG8gZ2V0IGFuIE9QTDMtU0EzIGNhcmQgd29ya2luZyBvbiBteQotc3lzdGVtLiAgT25jZSBhZ2FpbiwgaWYgeW91IGhhdmUgYW55IG90aGVyIHByb2JsZW1zLCBlbWFpbCBtZSBhdCB0aGUKLWFkZHJlc3MgbGlzdGVkIGFib3ZlLgotCi1TY290dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvVklBLWNoaXBzZXQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9WSUEtY2hpcHNldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NjUyMy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9WSUEtY2hpcHNldAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLVJ1bm5pbmcgc291bmQgY2FyZHMgb24gVklBIGNoaXBzZXRzCi0KLW8JVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggVklBIGNoaXBzZXRzIGFuZCBzb3VuZCBjYXJkcyB0aGF0IGFwcGVhciB0bwotCWxvY2sgdGhlIGhhcmR3YXJlIHNvbGlkbHkuIFRlc3QgcHJvZ3JhbXMgdW5kZXIgRE9TIGhhdmUgdmVyaWZpZWQgdGhlCi0JcHJvYmxlbSBleGlzdHMgb24gYXQgbGVhc3Qgc29tZSAoYnV0IGFwcGFyZW50bHkgbm90IGFsbCkgVklBIGJvYXJkcwotCi1vCVZJQSBoYXZlIHNvIGZhciBmYWlsZWQgdG8gYm90aGVyIHRvIGFuc3dlciBzdXBwb3J0IG1haWwgb24gdGhlIHN1YmplY3QKLQlzbyBpZiB5b3UgYXJlIGEgVklBIGVuZ2luZWVyIGZlZWxpbmcgYWdncmlldmVkIGFzIHlvdSByZWFkIHRoaXMgCi0JZG9jdW1lbnQgZ28gY2hhc2UgeW91ciBvd24gcGVvcGxlLiBJZiB0aGVyZSBpcyBhIHdvcmthcm91bmQgcGxlYXNlCi0JbGV0IHVzIGtub3cgc28gd2UgY2FuIGltcGxlbWVudCBpdC4KLQotCi1DZXJ0YWluIHBhdHRlcm5zIG9mIElTQSBETUEgYWNjZXNzIHVzZWQgZm9yIG1vc3QgUEMgc291bmQgY2FyZHMgY2F1c2UgdGhlCi1WSUEgY2hpcHNldHMgdG8gbG9jayB1cC4gRnJvbSB0aGUgY29sbGVjdGVkIHJlcG9ydHMgdGhpcyBhcHBlYXJzIHRvIGNvdmVyIGEKLXdpZGUgcmFuZ2Ugb2YgYm9hcmRzLiBTb21lIGFsc28gbG9jayB1cCB3aXRoIHNvdW5kIGNhcmRzIHVuZGVyIFdpbiogYXMgd2VsbC4KLQotTGludXggaW1wbGVtZW50cyBhIHdvcmthcm91bmQgcHJvdmlkaW5nIHlvdXIgY2hpcHNldCBpcyBQQ0kgYW5kIHlvdSBjb21waWxlZAotd2l0aCBQQ0kgUXVpcmtzIGVuYWJsZWQuIElmIHNvIHlvdSB3aWxsIHNlZSBhIG1lc3NhZ2UKLQkiQWN0aXZhdGluZyBJU0EgRE1BIGJ1ZyB3b3JrYXJvdW5kcyIKLQotZHVyaW5nIGJvb3RpbmcuIElmIHlvdSBoYXZlIGEgVklBIFBDSSBjaGlwc2V0IHRoYXQgaGFuZ3Mgd2hlbiB5b3UgdXNlIHRoZQotc291bmQgYW5kIGlzIG5vdCBnZW5lcmF0aW5nIHRoaXMgbWVzc2FnZSBldmVuIHdpdGggUENJIHF1aXJrcyBlbmFibGVkCi1wbGVhc2UgcmVwb3J0IHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgbGludXgta2VybmVsIGxpc3QgKHNlZSBSRVBPUlRJTkctQlVHUykuCi0KLUlmIHlvdSBhcmUgb25lIG9mIHRoZSB0aW55IG51bWJlciBvZiB1bmZvcnR1bmF0ZXMgd2l0aCBhIDQ4NiBJU0EvVkxCIFZJQQotY2hpcHNldCBib2FyZCB5b3UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIHRvIGJ1aWxkIGEgc3BlY2lhbCBrZXJuZWwgZm9yCi15b3VyIGJvYXJkCi0KLQllZGl0IGxpbnV4L2luY2x1ZGUvYXNtLWkzODYvZG1hLmgKLQotY2hhbmdlCi0KLSNkZWZpbmUgaXNhX2RtYV9icmlkZ2VfYnVnZ3kgCSgwKQotCi10bwotCi0jZGVmaW5lIGlzYV9kbWFfYnJpZGdlX2J1Z2d5IAkoMSkKLQotYW5kIHJlYnVpbGQgYSBrZXJuZWwgd2l0aG91dCBQQ0kgcXVpcmsgc3VwcG9ydC4KLQotCi1PdGhlciB0aGFuIHRoaXMgcGFydGljdWxhciBnbGl0Y2ggdGhlIFZJQSBbTV1WUCogY2hpcHNldHMgYXBwZWFyIHRvIHdvcmsKLXBlcmZlY3RseSB3aXRoIExpbnV4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvY3M0Nnh4IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvY3M0Nnh4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQ0MzI3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL2NzNDZ4eAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBDaXJydXMgTG9naWMvQ3J5c3RhbCBTb3VuZEZ1c2lvbiBjczQ2eHgvY3M0MjgwIGF1ZGlvIAotY29udHJvbGxlciBjaGlwcyAoMjAwMS8wNS8xMSkKLQotVGhlIGNzNDZ4eCBhdWRpbyBkcml2ZXIgc3VwcG9ydHMgdGhlIERTUCBsaW5lIG9mIENpcnJ1cyBjb250cm9sbGVycy4gCi1TcGVjaWZpY2FsbHksIHRoZSBjczQ2MTAsIGNzNDYxMiwgY3M0NjE0LCBjczQ2MjIsIGNzNDYyNCwgY3M0NjMwIGFuZCB0aGUgY3M0MjgwCi1wcm9kdWN0cy4gIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGdlbmVyaWMgYWM5N19jb2RlYyBkcml2ZXIgZm9yIEFDOTcgY29kZWMKLXN1cHBvcnQuICAKLQotCi1GZWF0dXJlczoKLQotRnVsbCBEdXBsZXggUGxheWJhY2svQ2FwdHVyZSBzdXBwb3J0ZWQgZnJvbSA4ay00OGsuCi0xNkJpdCBTaWduZWQgTEUgJiA4Qml0IFVuc2lnbmVkLCB3aXRoIE1vbm8gb3IgU3RlcmVvIHN1cHBvcnRlZC4KLQotQVBNL1BNIC0gMi4yLnggUE0gaXMgZW5hYmxlZCBhbmQgZnVuY3Rpb25hbC4gQVBNIGNhbiBhbHNvCi1iZSBlbmFibGVkIGZvciAyLjQueCBieSBtb2RpZnlpbmcgdGhlIENTNDZYWF9BQ1BJX1NVUFBPUlQgbWFjcm8KLWRlZmluaXRpb24uCi0KLURNQSBwbGF5YmFjayBidWZmZXIgc2l6ZSBpcyBjb25maWd1cmFibGUgZnJvbSAxNmsgKGRlZmF1bHRvcmRlcj0yKSB1cCB0byAyTWVnIAotKGRlZmF1bHRvcmRlcj0xMSkuICBETUEgY2FwdHVyZSBidWZmZXIgc2l6ZSBpcyBmaXhlZCBhdCBhIHNpbmdsZSA0ayBwYWdlIGFzCi10d28gMmsgZnJhZ21lbnRzLgotCi1NTUFQIHNlZW1zIHRvIHdvcmsgd2VsbCB3aXRoIFF1YWtlSUlJLCBhbmQgdGVzdCBYTU1TIHBsdWdpbi4KLQotTXl0aDIgd29ya3MsIGJ1dCB0aGUgcG9sbGluZyBsb2dpYyBpcyBub3QgZnVsbHkgY29ycmVjdCwgYnV0IGlzIGZ1bmN0aW9uYWwuCi0KLVRoZSAyLjQuNC1hYzYgZ2FtZXBvcnQgY29kZSBpbiB0aGUgY3M0NjF4IGpveXN0aWNrIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgCi13aXRoIGEgTWljcm9zb2Z0IFNpZGV3aW5kZXIgam95c3RpY2sgKGNzNDYxeC5vIGFuZCBzaWRld2luZGVyLm8pLiAgVGhpcyAKLWF1ZGlvIGRyaXZlciBtdXN0IGJlIGxvYWRlZCBwcmlvciB0byB0aGUgam95c3RpY2sgZHJpdmVyIHRvIGVuYWJsZSB0aGUKLURTUCB0YXNrIGltYWdlIHN1cHBvcnRpbmcgdGhlIGpveXN0aWNrIGRldmljZS4KLQotCi1MaW1pdGF0aW9uczoKLQotU1BESUYgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCi0KLVByaW1hcnkgY29kZWMgc3VwcG9ydCBvbmx5LiAgTm8gc2Vjb25kYXJ5IGNvZGVjIHN1cHBvcnQgaXMgaW1wbGVtZW50ZWQuCi0KLQotCi1OT1RFUzoKLQotSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIC0gdGhlIEVHUElPMiBwaW4gY29udHJvbHMgdGhlIGV4dGVybmFsIEFtcCwKLWFuZCBoYXMgYmVlbiB0ZXN0ZWQuCi1Nb2R1bGUgcGFyYW1ldGVyIGhlcmN1bGVzX2VncGlvX2Rpc2FibGUgc2V0IHRvIDEsIHdpbGwgZm9yY2UgYSAwIHRvIEVHUElPRFIKLXRvIGRpc2FibGUgdGhlIGV4dGVybmFsIGFtcGxpZmllci4KLQotVlRCIFNhbnRhIENydXogLSB0aGUgR1BJTzcvR1BJTzggb24gdGhlIFNlY29uZGFyeSBDb2RlYyBjb250cm9sCi10aGUgZXh0ZXJuYWwgYW1wbGlmaWVyIGZvciB0aGUgImJhY2siIHNwZWFrZXJzLCBzaW5jZSB3ZSBkbyBub3QKLXN1cHBvcnQgdGhlIHNlY29uZGFyeSBjb2RlYyB0aGVuIHRoaXMgZXh0ZXJuYWwgYW1wIGlzIG5vdAotdHVybmVkIG9uLiAgVGhlIHByaW1hcnkgY29kZWMgZXh0ZXJuYWwgYW1wbGlmaWVyIGlzIHN1cHBvcnRlZCBidXQKLW5vdGUgdGhhdCB0aGUgQUM5NyBFQVBEIGJpdCBpcyBpbnZlcnRlZCBsb2dpYyAoYW1wX3ZveWV0cmEoKSkuCi0KLURNQSBidWZmZXIgc2l6ZSAtIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCBtYW55IG9mIHRoZSBMaW51eCBhcHBsaWNhdGlvbnMKLWNvbmNlcm5pbmcgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUuICBTZXZlcmFsIGFwcGxpY2F0aW9ucyByZXF1ZXN0IGEgCi1jZXJ0YWluIGZyYWdtZW50IHNpemUgYW5kIG51bWJlciBhbmQgdGhlbiBkbyBub3QgdmVyaWZ5IHRoYXQgdGhlIGRyaXZlcgotaGFzIHRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLiAgCi1TTkRDVExfRFNQX1NFVEZSQUdNRU5UIGlvY3RsIGlzIHVzZWQgdG8gcmVxdWVzdCBhIGZyYWdtZW50IHNpemUgYW5kCi1udW1iZXIgb2YgZnJhZ21lbnRzLiAgU29tZSBhcHBsaWNhdGlvbnMgZXhpdCBpZiBhbiBlcnJvciBpcyByZXR1cm5lZAotb24gdGhpcyBwYXJ0aWN1bGFyIGlvY3RsLiBUaGVyZWZvcmUsIGluIGFsaWdubWVudCB3aXRoIHRoZSBvdGhlciBPU1MgYXVkaW8gCi1kcml2ZXJzLCBubyBlcnJvciBpcyByZXR1cm5lZCB3aGVuIGEgU0VURlJBR3MgSU9DVEwgaXMgcmVjZWl2ZWQsIGJ1dCB0aGUgCi12YWx1ZXMgcGFzc2VkIGZyb20gdGhlIGFwcCBhcmUgbm90IHVzZWQgaW4gYW55IGJ1ZmZlciBjYWxjdWxhdGlvbiAKLShvc3NmcmFnc2hpZnQvb3NzbWF4ZnJhZ3MgYXJlIG5vdCB1c2VkKS4KLVVzZSB0aGUgImRlZmF1bHRvcmRlcj1OIiBtb2R1bGUgcGFyYW1ldGVyIHRvIGNoYW5nZSB0aGUgYnVmZmVyIHNpemUgaWYKLXlvdSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBzcGVjaWZpYyBudW1iZXIgb2YgZnJhZ21lbnRzCi1vciBhIHNwZWNpZmljIGJ1ZmZlciBzaXplIChzZWUgYmVsb3cpLgotCi1EZWJ1ZyBJbnRlcmZhY2UKLS0tLS0tLS0tLS0tLS0tLQotVGhlcmUgaXMgYW4gaW9jdGwgZGVidWcgaW50ZXJmYWNlIHRvIGFsbG93IHJ1bnRpbWUgbW9kaWZpY2F0aW9uIG9mIHRoZSAKLWRlYnVnIHByaW50IGxldmVscy4gIFRoaXMgZGVidWcgaW50ZXJmYWNlIGNvZGUgY2FuIGJlIGRpc2FibGVkIGZyb20gdGhlIAotY29tcGlsYXRpb24gcHJvY2VzcyB3aXRoIGNvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBkZWZpbmU6Ci0jZGVmaW5lIENTREVCVUdfSU5URVJGQUNFIDEKLVRoZXJlIGlzIGFsc28gYSBkZWJ1ZyBwcmludCBtZXRob2RvbGd5IHRvIHNlbGVjdCBwcmludGYgc3RhdGVtZW50cyBmcm9tCi1kaWZmZXJlbnQgYXJlYXMgb2YgdGhlIGRyaXZlci4gIEEgZGVidWcgcHJpbnQgbGV2ZWwgaXMgYWxzbyB1c2VkIHRvIGFsbG93Ci1hZGRpdGlvbmFsIHByaW50ZnMgdG8gYmUgYWN0aXZlLiAgQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZQotZHJpdmVyIHRvIGRpc2FibGUgY29tcGlsYXRpb24gb2YgdGhlIENTX0RCR09VVCBwcmludCBzdGF0ZW1lbnRzOgotI2RlZmluZSBDU0RFQlVHIDEKLSAKLVBsZWFzZSBzZWUgdGhlIGRlZmluaXRpb25zIGZvciBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgZm9yIGFkZGl0aW9uYWwKLWluZm9ybWF0aW9uIG9uIHRoZSBkZWJ1ZyBsZXZlbHMgYW5kIHNlY3Rpb25zLgotCi1UaGVyZSBpcyBhbHNvIGEgY3NkYmcgZXhlY3V0YWJsZSB0byBhbGxvdyBydW50aW1lIG1hbmlwdWxhdGlvbiBvZiB0aGVzZSAKLXBhcmFtZXRlcnMuICBmb3IgYSBjb3B5IGVtYWlsOiB0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbQotCi0KLQotTU9EVUxFX1BBUk1TIGRlZmluaXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW1vZHVsZV9wYXJhbShkZWZhdWx0b3JkZXIsIHVsb25nLCAwKTsKLWRlZmF1bHRvcmRlcj1OCi13aGVyZSBOIGlzIGEgdmFsdWUgZnJvbSAxIHRvIDEyCi1UaGUgYnVmZmVyIG9yZGVyIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGRtYSBidWZmZXIgZm9yIHRoZSBkcml2ZXIuCi11bmRlciBMaW51eCwgYSBzbWFsbGVyIGJ1ZmZlciBhbGxvd3MgbW9yZSByZXNwb25zaXZlbmVzcyBmcm9tIG1hbnkgb2YgdGhlIAotYXBwbGljYXRpb25zIChlLmcuIGdhbWVzKS4gIEEgbGFyZ2VyIGJ1ZmZlciBhbGxvd3Mgc29tZSBvZiB0aGUgYXBwcyAoZXNvdW5kKSAKLXRvIG5vdCB1bmRlcnJ1biB0aGUgZG1hIGJ1ZmZlciBhcyBlYXNpbHkuICBBcyBkZWZhdWx0LCB1c2UgMzJrIChvcmRlcj0zKQotcmF0aGVyIHRoYW4gNjRrIGFzIHNvbWUgb2YgdGhlIGdhbWVzIHdvcmsgbW9yZSByZXNwb25zaXZlbHkuCi0oMl5OKSAqIFBBR0VfU0laRSA9IGFsbG9jYXRlZCBidWZmZXIgc2l6ZQotCi1tb2R1bGVfcGFyYW0oY3NfZGVidWdsZXZlbCwgdWxvbmcsIDA2NDQpOwotbW9kdWxlX3BhcmFtKGNzX2RlYnVnbWFzaywgdWxvbmcsIDA2NDQpOwotY3NfZGVidWdsZXZlbD1OCi1jc19kZWJ1Z21hc2s9MHhNTU1NTU1NTQotd2hlcmUgTiBpcyBhIHZhbHVlIGZyb20gMCAobm8gZGVidWcgcHJpbnRmcyksIHRvIDkgKG1heGltdW0pCi0weE1NTU1NTU1NIGlzIGEgZGVidWcgbWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBDU194eHggYml0cyAoc2VlIGRyaXZlciBzb3VyY2UpLgotCi1tb2R1bGVfcGFyYW0oaGVyY3VsZXNfZWdwaW9fZGlzYWJsZSwgdWxvbmcsIDApOwotaGVyY3VsZXNfZWdwaW9fZGlzYWJsZT1OCi13aGVyZSBOIGlzIGEgMCAoZW5hYmxlIGVncGlvKSwgb3IgYSAxIChkaXNhYmxlIGVncGlvIHN1cHBvcnQpCi0KLW1vZHVsZV9wYXJhbShpbml0ZGVsYXksIHVsb25nLCAwKTsKLWluaXRkZWxheT1OCi1UaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtaWxsZXNjb25kIGRlbGF5IGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24KLWNvZGUgcHJpb3IgdG8gcG93ZXJpbmcgdXAgdGhlIFBMTC4gIE9uIGxhcHRvcHMgdGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0bwotYXNzaXN0IHdpdGggZXJyb3JzIG9uIHJlc3VtZSwgbW9zdGx5IHdpdGggSUJNIGxhcHRvcHMuICBCYXNpY2FsbHksIGlmIHRoZSAKLXN5c3RlbSBpcyBib290ZWQgdW5kZXIgYmF0dGVyeSBwb3dlciB0aGVuIHRoZSBtZGVsYXkoKS91ZGVsYXkoKSBmdW5jdGlvbnMgZmFpbCB0byAKLXByb3Blcmx5IGRlbGF5IHRoZSByZXF1aXJlZCB0aW1lLiAgQWxzbywgaWYgdGhlIHN5c3RlbSBpcyBib290ZWQgdW5kZXIgQUMgcG93ZXIKLWFuZCB0aGVuIHRoZSBwb3dlciByZW1vdmVkLCB0aGUgbWRlbGF5KCkvdWRlbGF5KCkgZnVuY3Rpb25zIHdpbGwgbm90IGRlbGF5IHByb3Blcmx5LgotIAotbW9kdWxlX3BhcmFtKHBvd2VyZG93biwgdWxvbmcsIDApOwotcG93ZXJkb3duPU4KLXdoZXJlIE4gaXMgMCAoZGlzYWJsZSBhbnkgcG93ZXJkb3duIG9mIHRoZSBpbnRlcm5hbCBibG9ja3MpIG9yIDEgKGVuYWJsZSBwb3dlcmRvd24pCi0KLQotbW9kdWxlX3BhcmFtKGV4dGVybmFsX2FtcCwgYm9vbCwgMCk7Ci1leHRlcm5hbF9hbXA9MQotaWYgTiBpcyBzZXQgdG8gMSwgdGhlbiBmb3JjZSBlbmFibGluZyB0aGUgRUFQRCBzdXBwb3J0IGluIHRoZSBwcmltYXJ5IEFDOTcgY29kZWMuCi1vdmVycmlkZSB0aGUgZGV0ZWN0aW9uIGxvZ2ljIGFuZCBmb3JjZSB0aGUgZXh0ZXJuYWwgYW1wIGJpdCBpbiB0aGUgQUM5NyAweDI2IHJlZ2lzdGVyCi10byBiZSByZXNldCAoMCkuICBFQVBEIHNob3VsZCBiZSAwIGZvciBwb3dlcnVwLCBhbmQgMSBmb3IgcG93ZXJkb3duLiAgVGhlIFZUQiBTYW50YSBDcnV6Ci1jYXJkIGhhcyBpbnZlcnRlZCBsb2dpYywgc28gdGhlcmUgaXMgYSBzcGVjaWFsIGZ1bmN0aW9uIGZvciB0aGVzZSBjYXJkcy4KLQotbW9kdWxlX3BhcmFtKHRoaW5rcGFkLCBib29sLCAwKTsKLXRoaW5rcGFkPTEKLWlmIE4gaXMgc2V0IHRvIDEsIHRoZW4gZm9yY2UgZW5hYmxpbmcgdGhlIGNsa3J1biBmdW5jdGlvbmFsaXR5LgotQ3VycmVudGx5LCB3aGVuIHRoZSBwYXJ0IGlzIGJlaW5nIHVzZWQsIHRoZW4gY2xrcnVuIGlzIGRpc2FibGVkIGZvciB0aGUgZW50aXJlIHN5c3RlbSwKLWJ1dCByZS1lbmFibGVkIHdoZW4gdGhlIGRyaXZlciBpcyByZWxlYXNlZCBvciB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBvcGVuIGNvdW50LgotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscCBiL0RvY3VtZW50YXRpb24vc3BpL3NwaS1sbTcwbGxwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NGJkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscApAQCAtMCwwICsxLDY5IEBACitzcGlfbG03MGxscCA6ICBMTTcwLUxMUCBwYXJwb3J0LXRvLVNQSSBhZGFwdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBib2FyZC9jaGlwOgorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMTFAgZXZhbHVhdGlvbiBib2FyZAorICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03MC5odG1sCisKK0F1dGhvcjoKKyAgICAgICAgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorVGhpcyBkcml2ZXIgcHJvdmlkZXMgZ2x1ZSBjb2RlIGNvbm5lY3RpbmcgYSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAgTExQCit0ZW1wZXJhdHVyZSBzZW5zb3IgZXZhbHVhdGlvbiBib2FyZCB0byB0aGUga2VybmVsJ3MgU1BJIGNvcmUgc3Vic3lzdGVtLgorCitJbiBlZmZlY3QsIHRoaXMgZHJpdmVyIHR1cm5zIHRoZSBwYXJhbGxlbCBwb3J0IGludGVyZmFjZSBvbiB0aGUgZXZhbCBib2FyZAoraW50byBhIFNQSSBidXMgd2l0aCBhIHNpbmdsZSBkZXZpY2UsIHdoaWNoIHdpbGwgYmUgZHJpdmVuIGJ5IHRoZSBnZW5lcmljCitMTTcwIGRyaXZlciAoZHJpdmVycy9od21vbi9sbTcwLmMpLgorCitUaGUgaGFyZHdhcmUgaW50ZXJmYWNpbmcgb24gdGhlIExNNzAgTExQIGV2YWwgYm9hcmQgaXMgYXMgZm9sbG93czoKKworICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCisgICAgIFBvcnQgICAgICBEaXJlY3Rpb24gICBKUDIgSGVhZGVyCisgICAtLS0tLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLQorICAgICAgRDAgICAgIDIgICAgICAtICAgICAgICAgLQorICAgICAgRDEgICAgIDMgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDIgICAgIDQgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDMgICAgIDUgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDQgICAgIDYgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDUgICAgIDcgICAgIC0tPiAgICAgIG5DUyAgOAorICAgICAgRDYgICAgIDggICAgIC0tPiAgICAgIFNDTEsgMworICAgICAgRDcgICAgIDkgICAgIC0tPiAgICAgIFNJL08gNQorICAgICBHTkQgICAgMjUgICAgICAtICAgICAgIEdORCAgNworICAgIFNlbGVjdCAgMTMgICAgIDwtLSAgICAgIFNJL08gMQorICAgLS0tLS0tLS0tLS0gLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHNpbmNlIHRoZSBMTTcwIHVzZXMgYSAiMy13aXJlIiB2YXJpYW50IG9mIFNQSSwgdGhlIFNJL1NPIHBpbgoraXMgY29ubmVjdGVkIHRvIGJvdGggcGluIEQ3IChhcyBNYXN0ZXIgT3V0KSBhbmQgU2VsZWN0IChhcyBNYXN0ZXIgSW4pCit1c2luZyBhbiBhcnJhbmdtZW50IHRoYXQgbGV0cyBlaXRoZXIgdGhlIHBhcnBvcnQgb3IgdGhlIExNNzAgcHVsbCB0aGUKK3BpbiBsb3cuICBUaGlzIGNhbid0IGJlIHNoYXJlZCB3aXRoIHRydWUgU1BJIGRldmljZXMsIGJ1dCBvdGhlciAzLXdpcmUKK2RldmljZXMgbWlnaHQgc2hhcmUgdGhlIHNhbWUgU0kvU08gcGluLgorCitUaGUgYml0YmFuZ2VyIHJvdXRpbmUgaW4gdGhpcyBkcml2ZXIgKGxtNzBfdHhyeCkgaXMgY2FsbGVkIGJhY2sgZnJvbQordGhlIGJvdW5kICJod21vbi9sbTcwIiBwcm90b2NvbCBkcml2ZXIgdGhyb3VnaCBpdHMgc3lzZnMgaG9vaywgdXNpbmcgYQorc3BpX3dyaXRlX3RoZW5fcmVhZCgpIGNhbGwuICBJdCBwZXJmb3JtcyBNb2RlIDAgKFNQSS9NaWNyb3dpcmUpIGJpdGJhbmdpbmcuCitUaGUgbG03MCBkcml2ZXIgdGhlbiBpbnRlcHJldHMgdGhlIHJlc3VsdGluZyBkaWdpdGFsIHRlbXBlcmF0dXJlIHZhbHVlCithbmQgZXhwb3J0cyBpdCB0aHJvdWdoIHN5c2ZzLgorCitBICJnb3RjaGEiOiBOYXRpb25hbCBTZW1pY29uZHVjdG9yJ3MgTE03MCBMTFAgZXZhbCBib2FyZCBjaXJjdWl0IHNjaGVtYXRpYworc2hvd3MgdGhhdCB0aGUgU0kvTyBsaW5lIGZyb20gdGhlIExNNzAgY2hpcCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJhc2Ugb2YgYQordHJhbnNpc3RvciBRMSAoYW5kIGFsc28gYSBwdWxsdXAsIGFuZCBhIHplbmVyIGRpb2RlIHRvIEQ3KTsgd2hpbGUgdGhlCitjb2xsZWN0b3IgaXMgdGllZCB0byBWQ0MuCisKK0ludGVycHJldGluZyB0aGlzIGNpcmN1aXQsIHdoZW4gdGhlIExNNzAgU0kvTyBsaW5lIGlzIEhpZ2ggKG9yIHRyaXN0YXRlCithbmQgbm90IGdyb3VuZGVkIGJ5IHRoZSBob3N0IHZpYSBENyksIHRoZSB0cmFuc2lzdG9yIGNvbmR1Y3RzIGFuZCBzd2l0Y2hlcwordGhlIGNvbGxlY3RvciB0byB6ZXJvLCB3aGljaCBpcyByZWZsZWN0ZWQgb24gcGluIDEzIG9mIHRoZSBEQjI1IHBhcnBvcnQKK2Nvbm5lY3Rvci4gIFdoZW4gU0kvTyBpcyBMb3cgKGRyaXZlbiBieSB0aGUgTE03MCBvciB0aGUgaG9zdCkgb24gdGhlIG90aGVyCitoYW5kLCB0aGUgdHJhbnNpc3RvciBpcyBjdXQgb2ZmIGFuZCB0aGUgdm9sdGFnZSB0aWVkIHRvIGl0J3MgY29sbGVjdG9yIGlzCityZWZsZWN0ZWQgb24gcGluIDEzIGFzIGEgSGlnaCBsZXZlbC4KKworU286IHRoZSBnZXRtaXNvIGlubGluZSByb3V0aW5lIGluIHRoaXMgZHJpdmVyIHRha2VzIHRoaXMgZmFjdCBpbnRvIGFjY291bnQsCitpbnZlcnRpbmcgdGhlIHZhbHVlIHJlYWQgYXQgcGluIDEzLgorCisKK1RoYW5rcyB0bworLS0tLS0tLS0tCitvIERhdmlkIEJyb3duZWxsIGZvciBtZW50b3JpbmcgdGhlIFNQSS1zaWRlIGRyaXZlciBkZXZlbG9wbWVudC4KK28gRHIuQ3JhaWcgSG9sbGFiYXVnaCBmb3IgdGhlIChlYXJseSkgIm1hbnVhbCIgYml0YmFuZ2luZyBkcml2ZXIgdmVyc2lvbi4KK28gTmFkaXIgQmlsbGltb3JpYSBmb3IgaGVscCBpbnRlcnByZXRpbmcgdGhlIGNpcmN1aXQgc2NoZW1hdGljLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CmluZGV4IGE2NjFkNjguLjQ3MWU3NTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKQEAgLTEsNyArMSwxMiBAQAotVVBEQVRFIE1hcmNoIDIxIDIwMDUgQW1pdCBHdWQgPGd1ZEBldGgubmV0PgorU1BJTl9MT0NLX1VOTE9DS0VEIGFuZCBSV19MT0NLX1VOTE9DS0VEIGRlZmVhdCBsb2NrZGVwIHN0YXRlIHRyYWNraW5nIGFuZAorYXJlIGhlbmNlIGRlcHJlY2F0ZWQuCiAKLU1hY3JvcyBTUElOX0xPQ0tfVU5MT0NLRUQgYW5kIFJXX0xPQ0tfVU5MT0NLRUQgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUKLXJlbW92ZWQgc29vbi4gU28gZm9yIGFueSBuZXcgY29kZSBkeW5hbWljIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSB1c2VkOgorUGxlYXNlIHVzZSBERUZJTkVfU1BJTkxPQ0soKS9ERUZJTkVfUldMT0NLKCkgb3IKK19fU1BJTl9MT0NLX1VOTE9DS0VEKCkvX19SV19MT0NLX1VOTE9DS0VEKCkgYXMgYXBwcm9wcmlhdGUgZm9yIHN0YXRpYworaW5pdGlhbGl6YXRpb24uCisKK0R5bmFtaWMgaW5pdGlhbGl6YXRpb24sIHdoZW4gbmVjZXNzYXJ5LCBtYXkgYmUgcGVyZm9ybWVkIGFzCitkZW1vbnN0cmF0ZWQgYmVsb3cuCiAKICAgIHNwaW5sb2NrX3QgeHh4X2xvY2s7CiAgICByd2xvY2tfdCB4eHhfcndfbG9jazsKQEAgLTE1LDEyICsyMCw5IEBACiAKICAgIG1vZHVsZV9pbml0KHh4eF9pbml0KTsKIAotUmVhc29ucyBmb3IgZGVwcmVjYXRpb24KLSAgLSBpdCBodXJ0cyBhdXRvbWF0aWMgbG9jayB2YWxpZGF0b3JzCi0gIC0gaXQgYmVjb21lcyBpbnRydXNpdmUgZm9yIHRoZSByZWFsdGltZSBwcmVlbXB0aW9uIHBhdGNoZXMKLQotRm9sbG93aW5nIGRpc2N1c3Npb24gaXMgc3RpbGwgdmFsaWQsIGhvd2V2ZXIsIHdpdGggdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24KLW9mIHNwaW5sb2NrcyBpbnN0ZWFkIG9mIHN0YXRpYy4KK1RoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiBpcyBzdGlsbCB2YWxpZCwgaG93ZXZlciwgd2l0aCB0aGUgZHluYW1pYworaW5pdGlhbGl6YXRpb24gb2Ygc3BpbmxvY2tzIG9yIHdpdGggREVGSU5FX1NQSU5MT0NLLCBldGMuLCB1c2VkCitpbnN0ZWFkIG9mIFNQSU5fTE9DS19VTkxPQ0tFRC4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9jdGxfdW5udW1iZXJlZC50eHQKQEAgLTAsMCArMSwyMiBAQAorCitFeGNlcHQgZm9yIGEgZmV3IGV4dHJlbWVseSByYXJlIGV4Y2VwdGlvbnMgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgZG8gbm90IHVzZQordGhlIGJpbmFyeSBzeXNjdGwgaW50ZXJmYWNlLiAgSW5zdGVhZCBldmVyeW9uZSB1c2VzIC9wcm9jL3N5cy8uLi4gIHdpdGgKK3JlYWRhYmxlIGFzY2lpIG5hbWVzLgorCitSZWNlbnRseSB0aGUga2VybmVsIGhhcyBzdGFydGVkIHN1cHBvcnRpbmcgc2V0dGluZyB0aGUgYmluYXJ5IHN5c2N0bCB2YWx1ZSB0bworQ1RMX1VOTlVNQkVSRUQgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gYXNzaWduIGEgYmluYXJ5IHN5c2N0bCBwYXRoIHRvIGFsbG93CitzeXNjdGxzIHRvIHNob3cgdXAgaW4gL3Byb2Mvc3lzLgorCitBc3NpZ25pbmcgYmluYXJ5IHN5c2N0bCBudW1iZXJzIGlzIGFuIGVuZGxlc3Mgc291cmNlIG9mIGNvbmZsaWN0cyBpbiBzeXNjdGwuaCwKK2JyZWFraW5nIG9mIHRoZSB1c2VyIHNwYWNlIEFCSSAoYmVjYXVzZSBvZiB0aG9zZSBjb25mbGljdHMpLCBhbmQgbWFpbnRlbmFuY2UKK3Byb2JsZW1zLiAgQSBjb21wbGV0ZSBwYXNzIHRocm91Z2ggYWxsIG9mIHRoZSBzeXNjdGwgdXNlcnMgcmV2ZWFsZWQgbXVsdGlwbGUKK2luc3RhbmNlcyB3aGVyZSB0aGUgc3lzY3RsIGJpbmFyeSBpbnRlcmZhY2Ugd2FzIGJyb2tlbiBhbmQgaGFkIGdvbmUgdW5kZXRlY3RlZAorZm9yIHllYXJzLgorCitTbyBwbGVhc2UgZG8gbm90IGFkZCBuZXcgYmluYXJ5IHN5c2N0bCBudW1iZXJzLiAgVGhleSBhcmUgdW5uZWVkZWQgYW5kCitwcm9ibGVtYXRpYy4KKworSWYgeW91IHJlYWxseSBuZWVkIGEgbmV3IGJpbmFyeSBzeXNjdGwgbnVtYmVyIHBsZWFzZSBmaXJzdCBtZXJnZSB5b3VyIHN5c2N0bAoraW50byB0aGUga2VybmVsIGFuZCB0aGVuIGFzIGEgc2VwYXJhdGUgcGF0Y2ggYWxsb2NhdGUgYSBiaW5hcnkgc3lzY3RsIG51bWJlci4KKworKGViaWVkZXJtQHhtaXNzaW9uLmNvbSwgSnVuZSAyMDA3KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CmluZGV4IDhjZmNhMTcuLmEwY2NjNWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKQEAgLTMyLDEyICszMiwxNCBAQAogLSBtaW5fc2xhYl9yYXRpbwogLSBwYW5pY19vbl9vb20KIC0gbW1hcF9taW5fYWRkcmVzcworLSBudW1hX3pvbmVsaXN0X29yZGVyCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGRpcnR5X3JhdGlvLCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvLCBkaXJ0eV9leHBpcmVfY2VudGlzZWNzLAogZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcywgdmZzX2NhY2hlX3ByZXNzdXJlLCBsYXB0b3BfbW9kZSwKLWJsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dCwgZHJvcC1jYWNoZXM6CitibG9ja19kdW1wLCBzd2FwX3Rva2VuX3RpbWVvdXQsIGRyb3AtY2FjaGVzLAoraHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGU6CiAKIFNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CiAKQEAgLTIzMSwzICsyMzMsNDcgQEAKIHZhc3QgbWFqb3JpdHkgb2YgYXBwbGljYXRpb25zIHRvIHdvcmsgY29ycmVjdGx5IGFuZCBwcm92aWRlIGRlZmVuc2UgaW4gZGVwdGgKIGFnYWluc3QgZnV0dXJlIHBvdGVudGlhbCBrZXJuZWwgYnVncy4KIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbnVtYV96b25lbGlzdF9vcmRlcgorCitUaGlzIHN5c2N0bCBpcyBvbmx5IGZvciBOVU1BLgorJ3doZXJlIHRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20nIGlzIGNvbnRyb2xsZWQgYnkgem9uZWxpc3RzLgorKFRoaXMgZG9jdW1lbnRhdGlvbiBpZ25vcmVzIFpPTkVfSElHSE1FTS9aT05FX0RNQTMyIGZvciBzaW1wbGUgZXhwbGFuYXRpb24uCisgeW91IG1heSBiZSBhYmxlIHRvIHJlYWQgWk9ORV9ETUEgYXMgWk9ORV9ETUEzMi4uLikKKworSW4gbm9uLU5VTUEgY2FzZSwgYSB6b25lbGlzdCBmb3IgR0ZQX0tFUk5FTCBpcyBvcmRlcmVkIGFzIGZvbGxvd2luZy4KK1pPTkVfTk9STUFMIC0+IFpPTkVfRE1BCitUaGlzIG1lYW5zIHRoYXQgYSBtZW1vcnkgYWxsb2NhdGlvbiByZXF1ZXN0IGZvciBHRlBfS0VSTkVMIHdpbGwKK2dldCBtZW1vcnkgZnJvbSBaT05FX0RNQSBvbmx5IHdoZW4gWk9ORV9OT1JNQUwgaXMgbm90IGF2YWlsYWJsZS4KKworSW4gTlVNQSBjYXNlLCB5b3UgY2FuIHRoaW5rIG9mIGZvbGxvd2luZyAyIHR5cGVzIG9mIG9yZGVyLgorQXNzdW1lIDIgbm9kZSBOVU1BIGFuZCBiZWxvdyBpcyB6b25lbGlzdCBvZiBOb2RlKDApJ3MgR0ZQX0tFUk5FTAorCisoQSkgTm9kZSgwKSBaT05FX05PUk1BTCAtPiBOb2RlKDApIFpPTkVfRE1BIC0+IE5vZGUoMSkgWk9ORV9OT1JNQUwKKyhCKSBOb2RlKDApIFpPTkVfTk9STUFMIC0+IE5vZGUoMSkgWk9ORV9OT1JNQUwgLT4gTm9kZSgwKSBaT05FX0RNQS4KKworVHlwZShBKSBvZmZlcnMgdGhlIGJlc3QgbG9jYWxpdHkgZm9yIHByb2Nlc3NlcyBvbiBOb2RlKDApLCBidXQgWk9ORV9ETUEKK3dpbGwgYmUgdXNlZCBiZWZvcmUgWk9ORV9OT1JNQUwgZXhoYXVzdGlvbi4gVGhpcyBpbmNyZWFzZXMgcG9zc2liaWxpdHkgb2YKK291dC1vZi1tZW1vcnkoT09NKSBvZiBaT05FX0RNQSBiZWNhdXNlIFpPTkVfRE1BIGlzIHRlbmQgdG8gYmUgc21hbGwuCisKK1R5cGUoQikgY2Fubm90IG9mZmVyIHRoZSBiZXN0IGxvY2FsaXR5IGJ1dCBpcyBtb3JlIHJvYnVzdCBhZ2FpbnN0IE9PTSBvZgordGhlIERNQSB6b25lLgorCitUeXBlKEEpIGlzIGNhbGxlZCBhcyAiTm9kZSIgb3JkZXIuIFR5cGUgKEIpIGlzICJab25lIiBvcmRlci4KKworIk5vZGUgb3JkZXIiIG9yZGVycyB0aGUgem9uZWxpc3RzIGJ5IG5vZGUsIHRoZW4gYnkgem9uZSB3aXRoaW4gZWFjaCBub2RlLgorU3BlY2lmeSAiW05uXW9kZSIgZm9yIHpvbmUgb3JkZXIKKworIlpvbmUgT3JkZXIiIG9yZGVycyB0aGUgem9uZWxpc3RzIGJ5IHpvbmUgdHlwZSwgdGhlbiBieSBub2RlIHdpdGhpbiBlYWNoCit6b25lLiAgU3BlY2lmeSAiW1p6XW9uZSJmb3Igem9kZSBvcmRlci4KKworU3BlY2lmeSAiW0RkXWVmYXVsdCIgdG8gcmVxdWVzdCBhdXRvbWF0aWMgY29uZmlndXJhdGlvbi4gIEF1dG9jb25maWd1cmF0aW9uCit3aWxsIHNlbGVjdCAibm9kZSIgb3JkZXIgaW4gZm9sbG93aW5nIGNhc2UuCisoMSkgaWYgdGhlIERNQSB6b25lIGRvZXMgbm90IGV4aXN0IG9yCisoMikgaWYgdGhlIERNQSB6b25lIGNvbXByaXNlcyBncmVhdGVyIHRoYW4gNTAlIG9mIHRoZSBhdmFpbGFibGUgbWVtb3J5IG9yCisoMykgaWYgYW55IG5vZGUncyBETUEgem9uZSBjb21wcmlzZXMgZ3JlYXRlciB0aGFuIDYwJSBvZiBpdHMgbG9jYWwgbWVtb3J5IGFuZAorICAgIHRoZSBhbW91bnQgb2YgbG9jYWwgbWVtb3J5IGlzIGJpZyBlbm91Z2guCisKK090aGVyd2lzZSwgInpvbmUiIG9yZGVyIHdpbGwgYmUgc2VsZWN0ZWQuIERlZmF1bHQgb3JkZXIgaXMgcmVjb21tZW5kZWQgdW5sZXNzCit0aGlzIGlzIGNhdXNpbmcgcHJvYmxlbXMgZm9yIHlvdXIgc3lzdGVtL2FwcGxpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAppbmRleCA2ODcxMDRiLi41MWNjYzQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dApAQCAtNzcsOCArNzcsOSBAQAogY2FsbCwgdGhlbiBpdCBpcyByZXF1aXJlZCB0aGF0IHN5c3RlbSBhZG1pbmlzdHJhdG9yIG1vdW50IGEgZmlsZSBzeXN0ZW0gb2YKIHR5cGUgaHVnZXRsYmZzOgogCi0JbW91bnQgbm9uZSAvbW50L2h1Z2UgLXQgaHVnZXRsYmZzIDx1aWQ9dmFsdWU+IDxnaWQ9dmFsdWU+IDxtb2RlPXZhbHVlPgotCQkgPHNpemU9dmFsdWU+IDxucl9pbm9kZXM9dmFsdWU+CisgIG1vdW50IC10IGh1Z2V0bGJmcyBcCisJLW8gdWlkPTx2YWx1ZT4sZ2lkPTx2YWx1ZT4sbW9kZT08dmFsdWU+LHNpemU9PHZhbHVlPixucl9pbm9kZXM9PHZhbHVlPiBcCisJbm9uZSAvbW50L2h1Z2UKIAogVGhpcyBjb21tYW5kIG1vdW50cyBhIChwc2V1ZG8pIGZpbGVzeXN0ZW0gb2YgdHlwZSBodWdldGxiZnMgb24gdGhlIGRpcmVjdG9yeQogL21udC9odWdlLiAgQW55IGZpbGVzIGNyZWF0ZWQgb24gL21udC9odWdlIHVzZXMgaHVnZXBhZ2VzLiAgVGhlIHVpZCBhbmQgZ2lkCkBAIC04OCwxMSArODksMTAgQEAKIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIDA3NTUgaXMgcGlja2VkLiBUaGUgc2l6ZSBvcHRpb24gc2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBvZgogbWVtb3J5IChodWdlIHBhZ2VzKSBhbGxvd2VkIGZvciB0aGF0IGZpbGVzeXN0ZW0gKC9tbnQvaHVnZSkuIFRoZSBzaXplIGlzCiByb3VuZGVkIGRvd24gdG8gSFBBR0VfU0laRS4gIFRoZSBvcHRpb24gbnJfaW5vZGVzIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi1pbm9kZXMgdGhhdCAvbW50L2h1Z2UgY2FuIHVzZS4gIElmIHRoZSBzaXplIG9yIG5yX2lub2RlcyBvcHRpb25zIGFyZSBub3QKK2lub2RlcyB0aGF0IC9tbnQvaHVnZSBjYW4gdXNlLiAgSWYgdGhlIHNpemUgb3IgbnJfaW5vZGVzIG9wdGlvbiBpcyBub3QKIHByb3ZpZGVkIG9uIGNvbW1hbmQgbGluZSB0aGVuIG5vIGxpbWl0cyBhcmUgc2V0LiAgRm9yIHNpemUgYW5kIG5yX2lub2Rlcwogb3B0aW9ucywgeW91IGNhbiB1c2UgW0d8Z10vW018bV0vW0t8a10gdG8gcmVwcmVzZW50IGdpZ2EvbWVnYS9raWxvLiBGb3IKLWV4YW1wbGUsIHNpemU9MksgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgc2l6ZT0yMDQ4LiBBbiBleGFtcGxlIGlzIGdpdmVuIGF0Ci10aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQuCitleGFtcGxlLCBzaXplPTJLIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHNpemU9MjA0OC4KIAogcmVhZCBhbmQgd3JpdGUgc3lzdGVtIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGZpbGVzIHRoYXQgcmVzaWRlIG9uIGh1Z2V0bGIKIGZpbGUgc3lzdGVtcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0CmluZGV4IDE1MjMzMjAuLmQxN2YzMjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dApAQCAtNDEsNiArNDEsOCBAQAogCVAJCVBvaXNvbmluZyAob2JqZWN0IGFuZCBwYWRkaW5nKQogCVUJCVVzZXIgdHJhY2tpbmcgKGZyZWUgYW5kIGFsbG9jKQogCVQJCVRyYWNlIChwbGVhc2Ugb25seSB1c2Ugb24gc2luZ2xlIHNsYWJzKQorCS0JCVN3aXRjaCBhbGwgZGVidWdnaW5nIG9mZiAodXNlZnVsIGlmIHRoZSBrZXJuZWwgaXMKKwkJCWNvbmZpZ3VyZWQgd2l0aCBDT05GSUdfU0xVQl9ERUJVR19PTikKIAogRi5lLiBpbiBvcmRlciB0byBib290IGp1c3Qgd2l0aCBzYW5pdHkgY2hlY2tzIGFuZCByZWQgem9uaW5nIG9uZSB3b3VsZCBzcGVjaWZ5OgogCkBAIC0xMjUsMTMgKzEyNywyMCBAQAogCiBIZXJlIGlzIGEgc2FtcGxlIG9mIHNsdWIgZGVidWcgb3V0cHV0OgogCi0qKiogU0xVQiBrbWFsbG9jLTg6IFJlZHpvbmUgQWN0aXZlQDB4YzkwZjZkMjAgc2xhYiAweGM1MjhjNTMwIG9mZnNldD0zMzYwIGZsYWdzPTB4NDAwMDAwYzMgaW51c2U9NjEgZnJlZWxpc3Q9MHhjOTBmNmQ1OAotICBCeXRlcyBiNCAweGM5MGY2ZDEwOiAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgLi4uLi4uLi5aWlpaWlpaWgotICAgIE9iamVjdCAweGM5MGY2ZDIwOiAgMzEgMzAgMzEgMzkgMmUgMzAgMzAgMzUgICAgICAgICAgICAgICAgICAgICAgICAgMTAxOS4wMDUKLSAgIFJlZHpvbmUgMHhjOTBmNmQyODogIDAwIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLUZyZWVQb2ludGVyIDB4YzkwZjZkMmMgLT4gMHhjOTBmNmQ1OAotTGFzdCBhbGxvYzogZ2V0X21vZGFsaWFzKzB4NjEvMHhmNSBqaWZmaWVzX2Fnbz01MyBjcHU9MSBwaWQ9NTU0Ci1GaWxsZXIgMHhjOTBmNmQ1MDogIDVhIDVhIDVhIDVhIDVhIDVhIDVhIDVhICAgICAgICAgICAgICAgICAgICAgICAgIFpaWlpaWlpaCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQlVHIGttYWxsb2MtODogUmVkem9uZSBvdmVyd3JpdHRlbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5GTzogMHhjOTBmNmQyOC0weGM5MGY2ZDJiLiBGaXJzdCBieXRlIDB4MDAgaW5zdGVhZCBvZiAweGNjCitJTkZPOiBTbGFiIDB4YzUyOGM1MzAgZmxhZ3M9MHg0MDAwMDBjMyBpbnVzZT02MSBmcD0weGM5MGY2ZDU4CitJTkZPOiBPYmplY3QgMHhjOTBmNmQyMCBAb2Zmc2V0PTMzNjAgZnA9MHhjOTBmNmQ1OAorSU5GTzogQWxsb2NhdGVkIGluIGdldF9tb2RhbGlhcysweDYxLzB4ZjUgYWdlPTUzIGNwdT0xIHBpZD01NTQKKworQnl0ZXMgYjQgMHhjOTBmNmQxMDogIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDVhIDVhIDVhIDVhIDVhIDVhIDVhIDVhIC4uLi4uLi4uWlpaWlpaWloKKyAgT2JqZWN0IDB4YzkwZjZkMjA6ICAzMSAzMCAzMSAzOSAyZSAzMCAzMCAzNSAgICAgICAgICAgICAgICAgICAgICAgICAxMDE5LjAwNQorIFJlZHpvbmUgMHhjOTBmNmQyODogIDAwIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyBQYWRkaW5nIDB4YzkwZjZkNTA6ICA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgICAgICAgICAgICAgICAgICAgICAgICBaWlpaWlpaWgorCiAgIFs8YzAxMDUyM2Q+XSBkdW1wX3RyYWNlKzB4NjMvMHgxZWIKICAgWzxjMDEwNTNkZj5dIHNob3dfdHJhY2VfbG9nX2x2bCsweDFhLzB4MmYKICAgWzxjMDEwNjAxZD5dIHNob3dfdHJhY2UrMHgxMi8weDE0CkBAIC0xNTMsNzQgKzE2MiwxMDggQEAKICAgWzxjMDEwNDExMj5dIHN5c2VudGVyX3Bhc3RfZXNwKzB4NWYvMHg5OQogICBbPGI3ZjdiNDEwPl0gMHhiN2Y3YjQxMAogICA9PT09PT09PT09PT09PT09PT09PT09PQotQEBAIFNMVUIga21hbGxvYy04OiBSZXN0b3JpbmcgcmVkem9uZSAoMHhjYykgZnJvbSAweGM5MGY2ZDI4LTB4YzkwZjZkMmIKIAorRklYIGttYWxsb2MtODogUmVzdG9yaW5nIFJlZHpvbmUgMHhjOTBmNmQyOC0weGM5MGY2ZDJiPTB4Y2MKIAorSWYgU0xVQiBlbmNvdW50ZXJzIGEgY29ycnVwdGVkIG9iamVjdCAoZnVsbCBkZXRlY3Rpb24gcmVxdWlyZXMgdGhlIGtlcm5lbAordG8gYmUgYm9vdGVkIHdpdGggc2x1Yl9kZWJ1ZykgdGhlbiB0aGUgZm9sbG93aW5nIG91dHB1dCB3aWxsIGJlIGR1bXBlZAoraW50byB0aGUgc3lzbG9nOgogCi1JZiBTTFVCIGVuY291bnRlcnMgYSBjb3JydXB0ZWQgb2JqZWN0IHRoZW4gaXQgd2lsbCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcKLWFjdGlvbnM6Ci0KLTEuIElzb2xhdGlvbiBhbmQgcmVwb3J0IG9mIHRoZSBpc3N1ZQorMS4gRGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gZW5jb3VudGVyZWQKIAogVGhpcyB3aWxsIGJlIGEgbWVzc2FnZSBpbiB0aGUgc3lzdGVtIGxvZyBzdGFydGluZyB3aXRoCiAKLSoqKiBTTFVCIDxzbGFiIGNhY2hlIGFmZmVjdGVkPjogPFdoYXQgd2VudCB3cm9uZz5APG9iamVjdCBhZGRyZXNzPgotb2Zmc2V0PTxvZmZzZXQgb2Ygb2JqZWN0IGludG8gc2xhYj4gZmxhZ3M9PHNsYWJmbGFncz4KLWludXNlPTxvYmplY3RzIGluIHVzZSBpbiB0aGlzIHNsYWI+IGZyZWVsaXN0PTxmaXJzdCBmcmVlIG9iamVjdCBpbiBzbGFiPgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0JVRyA8c2xhYiBjYWNoZSBhZmZlY3RlZD46IDxXaGF0IHdlbnQgd3Jvbmc+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0yLiBSZXBvcnQgb24gaG93IHRoZSBwcm9ibGVtIHdhcyBkZWFsdCB3aXRoIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgY29udGludWVkCi1vcGVyYXRpb24gb2YgdGhlIHN5c3RlbS4KK0lORk86IDxjb3JydXB0aW9uIHN0YXJ0Pi08Y29ycnVwdGlvbl9lbmQ+IDxtb3JlIGluZm8+CitJTkZPOiBTbGFiIDxhZGRyZXNzPiA8c2xhYiBpbmZvcm1hdGlvbj4KK0lORk86IE9iamVjdCA8YWRkcmVzcz4gPG9iamVjdCBpbmZvcm1hdGlvbj4KK0lORk86IEFsbG9jYXRlZCBpbiA8a2VybmVsIGZ1bmN0aW9uPiBhZ2U9PGppZmZpZXMgc2luY2UgYWxsb2M+IGNwdT08YWxsb2NhdGVkIGJ5CisJY3B1PiBwaWQ9PHBpZCBvZiB0aGUgcHJvY2Vzcz4KK0lORk86IEZyZWVkIGluIDxrZXJuZWwgZnVuY3Rpb24+IGFnZT08amlmZmllcyBzaW5jZSBmcmVlPiBjcHU9PGZyZWVkIGJ5IGNwdT4KKwkgcGlkPTxwaWQgb2YgdGhlIHByb2Nlc3M+CiAKLVRoZXNlIGFyZSBtZXNzYWdlcyBpbiB0aGUgc3lzdGVtIGxvZyBiZWdpbm5pbmcgd2l0aAorKE9iamVjdCBhbGxvY2F0aW9uIC8gZnJlZSBpbmZvcm1hdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpZiBTTEFCX1NUT1JFX1VTRVIgaXMKK3NldCBmb3IgdGhlIHNsYWIuIHNsdWJfZGVidWcgc2V0cyB0aGF0IG9wdGlvbikKIAotQEBAIFNMVUIgPHNsYWIgY2FjaGUgYWZmZWN0ZWQ+OiA8Y29ycmVjdGl2ZSBhY3Rpb24gdGFrZW4+CisyLiBUaGUgb2JqZWN0IGNvbnRlbnRzIGlmIGFuIG9iamVjdCB3YXMgaW52b2x2ZWQuCiAKLQotSW4gdGhlIGFib3ZlIHNhbXBsZSBTTFVCIGZvdW5kIHRoYXQgdGhlIFJlZHpvbmUgb2YgYW4gYWN0aXZlIG9iamVjdCBoYXMKLWJlZW4gb3ZlcndyaXR0ZW4uIEhlcmUgYSBzdHJpbmcgb2YgOCBjaGFyYWN0ZXJzIHdhcyB3cml0dGVuIGludG8gYSBzbGFiIHRoYXQKLWhhcyB0aGUgbGVuZ3RoIG9mIDggY2hhcmFjdGVycy4gSG93ZXZlciwgYSA4IGNoYXJhY3RlciBzdHJpbmcgbmVlZHMgYQotdGVybWluYXRpbmcgMC4gVGhhdCB6ZXJvIGhhcyBvdmVyd3JpdHRlbiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgUmVkem9uZSBmaWVsZC4KLUFmdGVyIHJlcG9ydGluZyB0aGUgZGV0YWlscyBvZiB0aGUgaXNzdWUgZW5jb3VudGVyZWQgdGhlIEBAQCBTTFVCIG1lc3NhZ2UKLXRlbGwgdXMgdGhhdCBTTFVCIGhhcyByZXN0b3JlZCB0aGUgcmVkem9uZSB0byBpdHMgcHJvcGVyIHZhbHVlIGFuZCB0aGVuCi1zeXN0ZW0gb3BlcmF0aW9ucyBjb250aW51ZS4KLQotVmFyaW91cyB0eXBlcyBvZiBsaW5lcyBjYW4gZm9sbG93IHRoZSBAQEAgU0xVQiBsaW5lOgorVmFyaW91cyB0eXBlcyBvZiBsaW5lcyBjYW4gZm9sbG93IHRoZSBCVUcgU0xVQiBsaW5lOgogCiBCeXRlcyBiNCA8YWRkcmVzcz4gOiA8Ynl0ZXM+Ci0JU2hvdyBhIGZldyBieXRlcyBiZWZvcmUgdGhlIG9iamVjdCB3aGVyZSB0aGUgcHJvYmxlbSB3YXMgZGV0ZWN0ZWQuCisJU2hvd3MgYSBmZXcgYnl0ZXMgYmVmb3JlIHRoZSBvYmplY3Qgd2hlcmUgdGhlIHByb2JsZW0gd2FzIGRldGVjdGVkLgogCUNhbiBiZSB1c2VmdWwgaWYgdGhlIGNvcnJ1cHRpb24gZG9lcyBub3Qgc3RvcCB3aXRoIHRoZSBzdGFydCBvZiB0aGUKIAlvYmplY3QuCiAKIE9iamVjdCA8YWRkcmVzcz4gOiA8Ynl0ZXM+CiAJVGhlIGJ5dGVzIG9mIHRoZSBvYmplY3QuIElmIHRoZSBvYmplY3QgaXMgaW5hY3RpdmUgdGhlbiB0aGUgYnl0ZXMKLQl0eXBpY2FsbHkgY29udGFpbiBwb2lzb25pbmcgdmFsdWVzLiBBbnkgbm9uLXBvaXNvbiB2YWx1ZSBzaG93cyBhCisJdHlwaWNhbGx5IGNvbnRhaW4gcG9pc29uIHZhbHVlcy4gQW55IG5vbi1wb2lzb24gdmFsdWUgc2hvd3MgYQogCWNvcnJ1cHRpb24gYnkgYSB3cml0ZSBhZnRlciBmcmVlLgogCiBSZWR6b25lIDxhZGRyZXNzPiA6IDxieXRlcz4KLQlUaGUgcmVkem9uZSBmb2xsb3dpbmcgdGhlIG9iamVjdC4gVGhlIHJlZHpvbmUgaXMgdXNlZCB0byBkZXRlY3QKKwlUaGUgUmVkem9uZSBmb2xsb3dpbmcgdGhlIG9iamVjdC4gVGhlIFJlZHpvbmUgaXMgdXNlZCB0byBkZXRlY3QKIAl3cml0ZXMgYWZ0ZXIgdGhlIG9iamVjdC4gQWxsIGJ5dGVzIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgc2FtZQogCXZhbHVlLiBJZiB0aGVyZSBpcyBhbnkgZGV2aWF0aW9uIHRoZW4gaXQgaXMgZHVlIHRvIGEgd3JpdGUgYWZ0ZXIKIAl0aGUgb2JqZWN0IGJvdW5kYXJ5LgogCi1GcmVlcG9pbnRlcgotCVRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGZyZWUgb2JqZWN0IGluIHRoZSBzbGFiLiBNYXkgYmVjb21lCi0JY29ycnVwdGVkIGlmIG92ZXJ3cml0aW5nIGNvbnRpbnVlcyBhZnRlciB0aGUgcmVkIHpvbmUuCisJKFJlZHpvbmUgaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgU0xBQl9SRURfWk9ORSBpcyBzZXQuCisJc2x1Yl9kZWJ1ZyBzZXRzIHRoYXQgb3B0aW9uKQogCi1MYXN0IGFsbG9jOgotTGFzdCBmcmVlOgotCVNob3dzIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIG9iamVjdCB3YXMgYWxsb2NhdGVkL2ZyZWVkIGxhc3QuCi0JV2Ugbm90ZSB0aGUgcGlkLCB0aGUgdGltZSBhbmQgdGhlIENQVSB0aGF0IGRpZCBzby4gVGhpcyBpcyB1c3VhbGx5Ci0JdGhlIG1vc3QgdXNlZnVsIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhpbmdzIHdlbnQgd3JvbmcuCi0JSGVyZSBnZXRfbW9kYWxpYXMoKSBkaWQgYW4ga21hbGxvYyg4KSBpbnN0ZWFkIG9mIGEga21hbGxvYyg5KS4KLQotRmlsbGVyIDxhZGRyZXNzPiA6IDxieXRlcz4KK1BhZGRpbmcgPGFkZHJlc3M+IDogPGJ5dGVzPgogCVVudXNlZCBkYXRhIHRvIGZpbGwgdXAgdGhlIHNwYWNlIGluIG9yZGVyIHRvIGdldCB0aGUgbmV4dCBvYmplY3QKIAlwcm9wZXJseSBhbGlnbmVkLiBJbiB0aGUgZGVidWcgY2FzZSB3ZSBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUKLQlhdCBsZWFzdCA0IGJ5dGVzIG9mIGZpbGxlci4gVGhpcyBhbGxvdyBmb3IgdGhlIGRldGVjdGlvbiBvZiB3cml0ZXMKKwlhdCBsZWFzdCA0IGJ5dGVzIG9mIHBhZGRpbmcuIFRoaXMgYWxsb3dzIHRoZSBkZXRlY3Rpb24gb2Ygd3JpdGVzCiAJYmVmb3JlIHRoZSBvYmplY3QuCiAKLUZvbGxvd2luZyB0aGUgZmlsbGVyIHdpbGwgYmUgYSBzdGFja2R1bXAuIFRoYXQgc3RhY2tkdW1wIGRlc2NyaWJlcyB0aGUKLWxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQuIFRoZSBjYXVzZSBvZiB0aGUgY29ycnVwdGlvbiBpcyBtb3JlCi1saWtlbHkgdG8gYmUgZm91bmQgYnkgbG9va2luZyBhdCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgYWxsb2MgLyBmcmVlLgorMy4gQSBzdGFja2R1bXAKIAotQ2hyaXN0b3BoIExhbWV0ZXIsIDxjbGFtZXRlckBzZ2kuY29tPiwgTWF5IDIzLCAyMDA3CitUaGUgc3RhY2tkdW1wIGRlc2NyaWJlcyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gVGhlIGNhdXNlCitvZiB0aGUgY29ycnVwdGlvbiBpcyBtYXkgYmUgbW9yZSBsaWtlbHkgZm91bmQgYnkgbG9va2luZyBhdCB0aGUgZnVuY3Rpb24gdGhhdAorYWxsb2NhdGVkIG9yIGZyZWVkIHRoZSBvYmplY3QuCisKKzQuIFJlcG9ydCBvbiBob3cgdGhlIHByb2JsZW0gd2FzIGRlYWx0IHdpdGggaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBjb250aW51ZWQKK29wZXJhdGlvbiBvZiB0aGUgc3lzdGVtLgorCitUaGVzZSBhcmUgbWVzc2FnZXMgaW4gdGhlIHN5c3RlbSBsb2cgYmVnaW5uaW5nIHdpdGgKKworRklYIDxzbGFiIGNhY2hlIGFmZmVjdGVkPjogPGNvcnJlY3RpdmUgYWN0aW9uIHRha2VuPgorCitJbiB0aGUgYWJvdmUgc2FtcGxlIFNMVUIgZm91bmQgdGhhdCB0aGUgUmVkem9uZSBvZiBhbiBhY3RpdmUgb2JqZWN0IGhhcworYmVlbiBvdmVyd3JpdHRlbi4gSGVyZSBhIHN0cmluZyBvZiA4IGNoYXJhY3RlcnMgd2FzIHdyaXR0ZW4gaW50byBhIHNsYWIgdGhhdAoraGFzIHRoZSBsZW5ndGggb2YgOCBjaGFyYWN0ZXJzLiBIb3dldmVyLCBhIDggY2hhcmFjdGVyIHN0cmluZyBuZWVkcyBhCit0ZXJtaW5hdGluZyAwLiBUaGF0IHplcm8gaGFzIG92ZXJ3cml0dGVuIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBSZWR6b25lIGZpZWxkLgorQWZ0ZXIgcmVwb3J0aW5nIHRoZSBkZXRhaWxzIG9mIHRoZSBpc3N1ZSBlbmNvdW50ZXJlZCB0aGUgRklYIFNMVUIgbWVzc2FnZQordGVsbCB1cyB0aGF0IFNMVUIgaGFzIHJlc3RvcmVkIHRoZSBSZWR6b25lIHRvIGl0cyBwcm9wZXIgdmFsdWUgYW5kIHRoZW4KK3N5c3RlbSBvcGVyYXRpb25zIGNvbnRpbnVlLgorCitFbWVyZ2VuY3kgb3BlcmF0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNaW5pbWFsIGRlYnVnZ2luZyAoc2FuaXR5IGNoZWNrcyBhbG9uZSkgY2FuIGJlIGVuYWJsZWQgYnkgYm9vdGluZyB3aXRoCisKKwlzbHViX2RlYnVnPUYKKworVGhpcyB3aWxsIGJlIGdlbmVyYWxseSBiZSBlbm91Z2ggdG8gZW5hYmxlIHRoZSByZXNpbGllbmN5IGZlYXR1cmVzIG9mIHNsdWIKK3doaWNoIHdpbGwga2VlcCB0aGUgc3lzdGVtIHJ1bm5pbmcgZXZlbiBpZiBhIGJhZCBrZXJuZWwgY29tcG9uZW50IHdpbGwKK2tlZXAgY29ycnVwdGluZyBvYmplY3RzLiBUaGlzIG1heSBiZSBpbXBvcnRhbnQgZm9yIHByb2R1Y3Rpb24gc3lzdGVtcy4KK1BlcmZvcm1hbmNlIHdpbGwgYmUgaW1wYWN0ZWQgYnkgdGhlIHNhbml0eSBjaGVja3MgYW5kIHRoZXJlIHdpbGwgYmUgYQorY29udGludWFsIHN0cmVhbSBvZiBlcnJvciBtZXNzYWdlcyB0byB0aGUgc3lzbG9nIGJ1dCBubyBhZGRpdGlvbmFsIG1lbW9yeQord2lsbCBiZSB1c2VkICh1bmxpa2UgZnVsbCBkZWJ1Z2dpbmcpLgorCitObyBndWFyYW50ZWVzLiBUaGUga2VybmVsIGNvbXBvbmVudCBzdGlsbCBuZWVkcyB0byBiZSBmaXhlZC4gUGVyZm9ybWFuY2UKK21heSBiZSBvcHRpbWl6ZWQgZnVydGhlciBieSBsb2NhdGluZyB0aGUgc2xhYiB0aGF0IGV4cGVyaWVuY2VzIGNvcnJ1cHRpb24KK2FuZCBlbmFibGluZyBkZWJ1Z2dpbmcgb25seSBmb3IgdGhhdCBjYWNoZQorCitJLmUuCisKKwlzbHViX2RlYnVnPUYsZGVudHJ5CisKK0lmIHRoZSBjb3JydXB0aW9uIG9jY3VycyBieSB3cml0aW5nIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG9iamVjdCB0aGVuIGl0CittYXkgYmUgYWR2aXNhYmxlIHRvIGVuYWJsZSBhIFJlZHpvbmUgdG8gYXZvaWQgY29ycnVwdGluZyB0aGUgYmVnaW5uaW5nCitvZiBvdGhlciBvYmplY3RzLgorCisJc2x1Yl9kZWJ1Zz1GWixkZW50cnkKKworQ2hyaXN0b3BoIExhbWV0ZXIsIDxjbGFtZXRlckBzZ2kuY29tPiwgTWF5IDMwLCAyMDA3CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDM5MTQyNjkuLjVhYmVjMTQgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xOTQsMTMgKzE5NCw2IEBACiBMOglsaW51eC1hY2VuaWNAc3Vuc2l0ZS5kawogUzoJTWFpbnRhaW5lZAogCi1BQ0kgTUlYRVIgRFJJVkVSCi1QOglSb2JlcnQgU2llbWVyCi1NOglSb2JlcnQuU2llbWVyQGdteC5kZQotTDoJbGludXgtc291bmRAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vd3d3LnN0dWQudW5pLWthcmxzcnVoZS5kZS9+dWgxYi8KLVM6CU1haW50YWluZWQKLQogSVBTIFNDU0kgUkFJRCBEUklWRVIKIFA6CUFkYXB0ZWMgT0VNIFJhaWQgU29sdXRpb25zCiBNOglhYWNyYWlkQGFkYXB0ZWMuY29tCkBAIC0yNzIsMjEgKzI2NSw2IEBACiBXOglodHRwOi8vYWNwaS5zb3VyY2Vmb3JnZS5uZXQvCiBTOglTdXBwb3J0ZWQKIAotQUQxODE2IFNPVU5EIERSSVZFUgotUDoJVGhvcnN0ZW4gS25hYmUKLU06CVRob3JzdGVuIEtuYWJlIDxsaW51eEB0aG9yc3Rlbi1rbmFiZS5kZT4KLVc6CWh0dHA6Ly9saW51eC50aG9yc3Rlbi1rbmFiZS5kZQotUzoJTWFpbnRhaW5lZAotCi1BRDE4ODkgU09VTkQgRFJJVkVSCi1QOglLeWxlIE1jTWFydGluCi1NOglreWxlQHBhcmlzYy1saW51eC5vcmcKLVA6CVRoaWJhdXQgVmFyZW5lCi1NOglULUJvbmVAcGFyaXNjLWxpbnV4Lm9yZwotVzoJaHR0cDovL3dpa2kucGFyaXNjLWxpbnV4Lm9yZy9BRDE4ODkKLUw6CXBhcmlzYy1saW51eEBsaXN0cy5wYXJpc2MtbGludXgub3JnCi1TOglNYWludGFpbmVkCi0KIEFETTEwMjUgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKIFA6CUplYW4gRGVsdmFyZQogTToJa2hhbGlAbGludXgtZnIub3JnCkBAIC0xMjc2LDYgKzEyNTQsMTIgQEAKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorRE1BIEdFTkVSSUMgTUVNQ1BZIFNVQlNZU1RFTQorUDoJU2hhbm5vbiBOZWxzb24KK006CXNoYW5ub24ubmVsc29uQGludGVsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCiBET0NCT09LIEZPUiBET0NVTUVOVEFUSU9OCiBQOglSYW5keSBEdW5sYXAKIE06CXJkdW5sYXBAeGVub3RpbWUubmV0CkBAIC0xMzk4LDEzICsxMzgyLDYgQEAKIEw6CWdlbmVyYWxAbGlzdHMub3BlbmZhYnJpY3Mub3JnCiBTOglTdXBwb3J0ZWQKIAotRU1VMTBLMSBTT1VORCBEUklWRVIKLVA6CUphbWVzIENvdXJ0aWVyLUR1dHRvbgotTToJSmFtZXNAc3VwZXJidWcuZGVtb24uY28udWsKLUw6CWVtdTEwazEtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1XOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2VtdTEwazEvCi1TOglNYWludGFpbmVkCi0KIEVNVUxFWCBMUEZDIEZDIFNDU0kgRFJJVkVSCiBQOglKYW1lcyBTbWFydAogTToJamFtZXMuc21hcnRAZW11bGV4LmNvbQpAQCAtMTkwMCw2ICsxODc3LDEyIEBACiBNOgl0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWsKIFM6CU1haW50YWluZWQKIAorSU5URUwgSS9PQVQgRE1BIERSSVZFUgorUDoJU2hhbm5vbiBOZWxzb24KK006CXNoYW5ub24ubmVsc29uQGludGVsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIElOVEVMIElYUDRYWCBSQU5ET00gTlVNQkVSIEdFTkVSQVRPUiBTVVBQT1JUCiBQOglEZWVwYWsgU2F4ZW5hCiBNOglkc2F4ZW5hQHBsZXhpdHkubmV0CkBAIC0yMjk3LDYgKzIyODAsMTQgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK00zMlIgQVJDSElURUNUVVJFCitQOglIaXJva2F6dSBUYWthdGEKK006CXRha2F0YUBsaW51eC1tMzJyLm9yZworTDoJbGludXgtbTMyckBtbC5saW51eC1tMzJyLm9yZworTDoJbGludXgtbTMyci1qYUBtbC5saW51eC1tMzJyLm9yZyAoaW4gSmFwYW5lc2UpCitXOglodHRwOi8vd3d3LmxpbnV4LW0zMnIub3JnLworUzoJTWFpbnRhaW5lZAorCiBNNjhLIEFSQ0hJVEVDVFVSRQogUDoJR2VlcnQgVXl0dGVyaG9ldmVuCiBNOglnZWVydEBsaW51eC1tNjhrLm9yZwpAQCAtMjYyMiwxMiArMjYxMyw2IEBACiBXOglodHRwOi8vd3d3Lm5ldGxhYi5pcy50c3VrdWJhLmFjLmpwL355b2tvdGEvaXp1bWkvbmluamEvCiBTOglNYWludGFpbmVkCiAKLU5PTi1JREUvTk9OLVNDU0kgQ0RST00gRFJJVkVSUyBbR0VORVJBTF0gKGNvbWUgb24sIGNyZXcgLSBtYXJrIHlvdXIgcmVzcG9uc2liaWxpdHkpCi1QOglFYmVyaGFyZCBNb2Vua2ViZXJnCi1NOgllbW9lbmtlQGd3ZGcuZGUKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQogTlRGUyBGSUxFU1lTVEVNCiBQOglBbnRvbiBBbHRhcGFybWFrb3YKIE06CWFpYTIxQGNhbnRhYi5uZXQKQEAgLTI3MTAsMTIgKzI2OTUsNiBAQAogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAotT1BMMy1TQTIsIFNBMywgYW5kIFNBeCBEUklWRVIKLVA6CVp3YW5lIE13YWlrYW1ibwotTToJendhbmVAYXJtLmxpbnV4Lm9yZy51awotTDoJbGludXgtc291bmRAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIE9QUk9GSUxFCiBQOglQaGlsaXBwZSBFbGllCiBNOglwaGlsLmVsQHdhbmFkb28uZnIKQEAgLTMxMjAsMTIgKzMwOTksNiBAQAogVzoJaHR0cDovL3d3dy5taWh1LmRlL2xpbnV4L3NhYTcxNDYKIFM6CU1haW50YWluZWQKIAotU0JQQ0QgQ0RST00gRFJJVkVSCi1QOglFYmVyaGFyZCBNb2Vua2ViZXJnCi1NOgllbW9lbmtlQGd3ZGcuZGUKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQogU0MxMjAwIFdEVCBEUklWRVIKIFA6CVp3YW5lIE13YWlrYW1ibwogTToJendhbmVAYXJtLmxpbnV4Lm9yZy51awpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBkZTRmOGY3Li5kZGJmY2FjIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMzEzLDcgKzMxMyw4IEBACiBDUFBGTEFHUyAgICAgICAgOj0gLURfX0tFUk5FTF9fICQoTElOVVhJTkNMVURFKQogCiBDRkxBR1MgICAgICAgICAgOj0gLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIFwKLSAgICAgICAgICAgICAgICAgICAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbgorCQkgICAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiBcCisJCSAgIC1XZXJyb3ItaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24KIEFGTEFHUyAgICAgICAgICA6PSAtRF9fQVNTRU1CTFlfXwogCiAjIFJlYWQgS0VSTkVMUkVMRUFTRSBmcm9tIGluY2x1ZGUvY29uZmlnL2tlcm5lbC5yZWxlYXNlIChpZiBpdCBleGlzdHMpCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCmluZGV4IDBjZDA2MDUuLjgzYTc4MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCkBAIC0zMTUsOSArMzE1LDcgQEAKIAkvKiBXaGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXRtcCA9IGRhdGE7Ci0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMSk7Ci0JCXJldCA9IChjb3BpZWQgPT0gc2l6ZW9mKHRtcCkpID8gMCA6IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCmluZGV4IDgwY2ZiNzUuLmIyODczMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCkBAIC02NSw3ICs2NSw3IEBACiB9OwogCiAvKiBTZXQgdG8gYSBzZWNvbmRhcnkncyBjcHVpZCB3aGVuIGl0IGNvbWVzIG9ubGluZS4gICovCi1zdGF0aWMgaW50IHNtcF9zZWNvbmRhcnlfYWxpdmUgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IHNtcF9zZWNvbmRhcnlfYWxpdmUgX19kZXZpbml0ZGF0YSA9IDA7CiAKIC8qIFdoaWNoIGNwdXMgaWRzIGNhbWUgb25saW5lLiAgKi8KIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKQEAgLTE3Myw3ICsxNzMsNyBAQAogfQogCiAvKiBXYWl0IHVudGlsIGh3cnBiLT50eHJkeSBpcyBjbGVhciBmb3IgY3B1LiAgUmV0dXJuIC0xIG9uIHRpbWVvdXQuICAqLwotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQgX19kZXZpbml0CiB3YWl0X2Zvcl90eHJkeSAodW5zaWduZWQgbG9uZyBjcHVtYXNrKQogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKQEAgLTM1OCw3ICszNTgsNyBAQAogLyoKICAqIEJyaW5nIG9uZSBjcHUgb25saW5lLgogICovCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIHNtcF9ib290X29uZV9jcHUoaW50IGNwdWlkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3NybWNvbnMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NybWNvbnMuYwppbmRleCA5MzBjZWRjLi43ODNmNGU1IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zcm1jb25zLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3JtY29ucy5jCkBAIC0yODksNyArMjg5LDcgQEAKIAlyZXR1cm4gc3JtY29uc19kcml2ZXI7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50CiBzcm1fY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKaW5kZXggMGJjYjk2OC4uOTIyMTQzZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYwpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCWlvN19jbGVhcl9lcnJvcnMoaW83KTsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyB2b2lkIF9faW5pdAogbWFydmVsX2luaXRfcnRjKHZvaWQpCiB7CiAJaW5pdF9ydGNfaXJxKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKaW5kZXggNDc0OGUxNC4uMWRkNTBkMCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCit2b2lkIF9faW5pdAogY29tbW9uX2luaXRfcnRjKHZvaWQpCiB7CiAJdW5zaWduZWQgY2hhciB4OwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMKaW5kZXggZDZlNjY1ZC4uZWMwZjA1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90cmFwcy5jCkBAIC0xODQsNiArMTg0LDcgQEAKICNlbmRpZgogCXByaW50aygiJXMoJWQpOiAlcyAlbGRcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc3RyLCBlcnIpOwogCWRpa19zaG93X3JlZ3MocmVncywgcjlfMTUpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCWRpa19zaG93X3RyYWNlKCh1bnNpZ25lZCBsb25nICopKHJlZ3MrMSkpOwogCWRpa19zaG93X2NvZGUoKHVuc2lnbmVkIGludCAqKXJlZ3MtPnBjKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYyBiL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMKaW5kZXggYWIzNzYxYy4uODY5OGUwNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL2FscGhhL2xpYi9jaGVja3N1bS5jCkBAIC02OSw2ICs2OSw3IEBACiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CiAKIC8qCiAgKiBEbyBhIDY0LWJpdCBjaGVja3N1bSBvbiBhbiBhcmJpdHJhcnkgbWVtb3J5IGFyZWEuLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCmluZGV4IDZmMmY0NmMuLjc4YzlmMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKQEAgLTY1Nyw3ICs2NTcsNiBAQAogCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHJldDsKIAogCXN3aXRjaCAocmVxdWVzdCkgewpAQCAtNjY2LDEyICs2NjUsNyBAQAogCQkgKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgotCQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDApOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC02ODMsMTIgKzY3Nyw3IEBACiAJCSAqLwogCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDEpOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBQVFJBQ0VfUE9LRVVTUjoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggMjM3ZjQ5OS4uZjIxMTRiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTI0OSw2ICsyNDksNyBAQAogCWJ1c3Rfc3BpbmxvY2tzKDEpOwogCV9fZGllKHN0ciwgZXJyLCB0aHJlYWQsIHJlZ3MpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGluX2ludGVycnVwdCgpKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCmluZGV4IGUxOGE0MWUuLmRkZTA4OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCkBAIC04Myw2ICs4NCwxMyBAQAogCS5wdWxsdXBfcGluCT0gQVQ5MV9QSU5fUEEyNCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBjc2IzMzdfaTJjX2RldmljZXNbXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJydGMtZHMxMzA3IiwgMHg2OCksCisJICAudHlwZSA9ICJkczEzMDciLAorCX0sCit9OworCisKIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9jZl9kYXRhIF9faW5pdGRhdGEgY3NiMzM3X2NmX2RhdGEgPSB7CiAJLyoKIAkgKiBjb25uZWN0b3IgUDQgb24gdGhlIENTQiAzMzcgbWF0ZXMgdG8KQEAgLTE2MSw2ICsxNjksOCBAQAogCWF0OTFfYWRkX2RldmljZV91ZGMoJmNzYjMzN191ZGNfZGF0YSk7CiAJLyogSTJDICovCiAJYXQ5MV9hZGRfZGV2aWNlX2kyYygpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGNzYjMzN19pMmNfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUoY3NiMzM3X2kyY19kZXZpY2VzKSk7CiAJLyogQ29tcGFjdCBGbGFzaCAqLwogCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEIyMiwgMSk7CQkvKiBJT0lTMTYgKi8KIAlhdDkxX2FkZF9kZXZpY2VfY2YoJmNzYjMzN19jZl9kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCmluZGV4IDM5MGE5N2QuLjE4NzNiZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgpAQCAtMTk5LDYgKzIwMCwxMiBAQAogCS5yZXNvdXJjZQk9ICZuMjEwMF91YXJ0X3Jlc291cmNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIG4yMTAwX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicnRjLXJzNWMzNzIiLCAweDMyKSwKKwkJLnR5cGUgPSAicnM1YzM3MmIiLAorCX0sCit9OwogCiAvKgogICogUHVsbCBQQ0E5NTMyIEdQSU8gIzggbG93IHRvIHBvd2VyIG9mZiB0aGUgbWFjaGluZS4KQEAgLTI0OCw2ICsyNTUsOSBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaW9wM3h4X2RtYV8wX2NoYW5uZWwpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaW9wM3h4X2RtYV8xX2NoYW5uZWwpOwogCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbjIxMDBfaTJjX2RldmljZXMsCisJCUFSUkFZX1NJWkUobjIxMDBfaTJjX2RldmljZXMpKTsKKwogCXBtX3Bvd2VyX29mZiA9IG4yMTAwX3Bvd2VyX29mZjsKIAogCWluaXRfdGltZXIoJnBvd2VyX2J1dHRvbl9wb2xsX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvS2NvbmZpZyBiL2FyY2gvYXJtMjYvS2NvbmZpZwppbmRleCAyMDY4OGJjLi45MDQ0ZjMzIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L0tjb25maWcKKysrIGIvYXJjaC9hcm0yNi9LY29uZmlnCkBAIC0xNyw2ICsxNyw5IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgTk9fRE1BCisJZGVmX2Jvb2wgeQorCiBjb25maWcgQVJDSF9BQ09STgogICAgICAgICBib29sCiAgICAgICAgIGRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9kZWZjb25maWcgYi9hcmNoL2FybTI2L2RlZmNvbmZpZwppbmRleCBjNGE4OTcwLi4yYjdkNDRiIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2RlZmNvbmZpZworKysgYi9hcmNoL2FybTI2L2RlZmNvbmZpZwpAQCAtMjQ4LDcgKzI0OCw2IEBACiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfRkFUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VNU0RPU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hcm0yNi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNDE2OTI3OS4uMGZlZmI4NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCkBAIC01MzEsNyArNTMxLDYgQEAKIAogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKQEAgLTU0MCwxMiArNTM5LDcgQEAKIAkJICovCiAJCWNhc2UgUFRSQUNFX1BFRUtURVhUOgogCQljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC01NTcsMTIgKzU1MSw3IEBACiAJCSAqLwogCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDEpOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBQVFJBQ0VfUE9LRVVTUjoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jCmluZGV4IGQ1OTRmYjUuLjI5MTFlMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0yNi9rZXJuZWwvdHJhcHMuYwpAQCAtMTg1LDYgKzE4NSw3IEBACiAJcHJpbnRrKCJJbnRlcm5hbCBlcnJvcjogJXM6ICV4XG4iLCBzdHIsIGVycik7CiAJcHJpbnRrKCJDUFU6ICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXNob3dfcmVncyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHN0YWNrIGxpbWl0ID0gMHglcClcbiIsCiAJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZW5kX29mX3N0YWNrKHRzaykpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L21tL2luaXQuYyBiL2FyY2gvYXJtMjYvbW0vaW5pdC5jCmluZGV4IDU2MmZhYzEuLjM2ZTdlZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtMjYvbW0vaW5pdC5jCkBAIC0zMyw5ICszMyw2IEBACiAKICNpbmNsdWRlIDxhc20vbWFwLmg+CiAKLQotI2RlZmluZSBUQUJMRV9TSVpFCVBUUlNfUEVSX1BURSAqIHNpemVvZihwdGVfdCkpCi0KIHN0cnVjdCBtbXVfZ2F0aGVyIG1tdV9nYXRoZXJzW05SX0NQVVNdOwogCiBleHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2MzNmMyZC4uMzkwNjBjYiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE1Myw3ICsxNTMsNiBAQAogCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHJldDsKIAogCXByX2RlYnVnKCJhcmNoX3B0cmFjZSglbGQsICVkLCAlI2x4LCAlI2x4KVxuIiwKQEAgLTE2NiwxMSArMTY1LDcgQEAKIAkvKiBSZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIGNoaWxkIHByb2Nlc3MgKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoKIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJaWYgKHJldCA9PSBzaXplb2YodG1wKSkKLQkJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QRUVLVVNSOgpAQCAtMTgxLDExICsxNzYsNyBAQAogCS8qIFdyaXRlIHRoZSB3b3JkIGluIGRhdGEgYXQgbG9jYXRpb24gYWRkciAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKGRhdGEpKQotCQkJcmV0ID0gMDsKLQkJZWxzZQotCQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYwppbmRleCA4NmQxMDc1Li45YTczY2U3IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKQEAgLTU2LDYgKzU2LDcgQEAKIAlzaG93X3JlZ3NfbG9nX2x2bChyZWdzLCBLRVJOX0VNRVJHKTsKIAlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncy0+c3AsIHJlZ3MsIEtFUk5fRU1FUkcpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGluX2ludGVycnVwdCgpKQpAQCAtMTg0LDcgKzE4NSw3IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykgJiYgKGVjciA9PSBFQ1JfSUxMRUdBTF9PUENPREUpKSB7CiAJCWVudW0gYnVnX3RyYXBfdHlwZSB0eXBlOwogCi0JCXR5cGUgPSByZXBvcnRfYnVnKHJlZ3MtPnBjKTsKKwkJdHlwZSA9IHJlcG9ydF9idWcocmVncy0+cGMsIHJlZ3MpOwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBCVUdfVFJBUF9UWVBFX05PTkU6CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kZWZjb25maWcgYi9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnCmluZGV4IDJhMzQxMWVhLi43MTBjMjBiIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kZWZjb25maWcKQEAgLTQyOSw3ICs0MjksNiBAQAogIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTVNET1NfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBmZDIxMjlhLi5mNGY5ZGI2OSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jCkBAIC04MywxOSArODMsOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiBSZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcy4gKi8gCiAJCWNhc2UgUFRSQUNFX1BFRUtURVhUOgotCQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCQlpbnQgY29waWVkOwotCi0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQkJcmV0ID0gLUVJTzsKLQkJCQotCQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCQlicmVhazsKLQkJCQotCQkJcmV0ID0gcHV0X3VzZXIodG1wLGRhdGFwKTsKKwkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKLQkJfQogCiAJCS8qIFJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCQljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0xMTMsMTIgKzEwMyw3IEBACiAJCS8qIFdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQkKLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCQkJCi0JCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAgCiAgCQkvKiBXcml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyZXNzIGluIHRoZSBVU0VSIGFyZWEuICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCmluZGV4IDFhMDcxZjEuLmU4OTE0ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCkBAIC0yNjcsMTAgKzI2NywxMCBAQAogCiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3J5cHRvY29wX2ZvcHMgPSB7Ci0Jb3duZXI6IFRISVNfTU9EVUxFLAotCW9wZW46IGNyeXB0b2NvcF9vcGVuLAotCXJlbGVhc2U6IGNyeXB0b2NvcF9yZWxlYXNlLAotCWlvY3RsOiBjcnlwdG9jb3BfaW9jdGwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQljcnlwdG9jb3Bfb3BlbiwKKwkucmVsZWFzZSA9CWNyeXB0b2NvcF9yZWxlYXNlLAorCS5pb2N0bCA9CWNyeXB0b2NvcF9pb2N0bAogfTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCmluZGV4IDVkNmM1MjcuLmUxMmY2Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCkBAIC01NzQsMTAgKzU3NCwxMCBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMmNfZm9wcyA9IHsKLQlvd25lcjogICAgVEhJU19NT0RVTEUsCi0JaW9jdGw6ICAgIGkyY19pb2N0bCwKLQlvcGVuOiAgICAgaTJjX29wZW4sCi0JcmVsZWFzZTogIGkyY19yZWxlYXNlLAorCS5vd25lciA9ICAgIFRISVNfTU9EVUxFLAorCS5pb2N0bCA9ICAgIGkyY19pb2N0bCwKKwkub3BlbiA9ICAgICBpMmNfb3BlbiwKKwkucmVsZWFzZSA9ICBpMmNfcmVsZWFzZSwKIH07CiAKIGludCBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYwppbmRleCAyNGI5MTliLi5mYThkNTAwIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNmODU2My5jCkBAIC01MSwxMCArNTEsMTAgQEAKIGludCBwY2Y4NTYzX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwY2Y4NTYzX2ZvcHMgPSB7Ci0Jb3duZXI6IFRISVNfTU9EVUxFLAotCWlvY3RsOiBwY2Y4NTYzX2lvY3RsLAotCW9wZW46IHBjZjg1NjNfb3BlbiwKLQlyZWxlYXNlOiBwY2Y4NTYzX3JlbGVhc2UsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmlvY3RsID0JcGNmODU2M19pb2N0bCwKKwkub3BlbiA9CQlwY2Y4NTYzX29wZW4sCisJLnJlbGVhc2UgPQlwY2Y4NTYzX3JlbGVhc2UsCiB9OwogCiB1bnNpZ25lZCBjaGFyCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYwppbmRleCBkNGQ1N2I3Li4zOGVjZTBjIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE0NiwxMiArMTQ2LDcgQEAKIAkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcy4gKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6CiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gMDsKLQotCQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQkJYnJlYWs7Ci0KLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogIAkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMgYi9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUwppbmRleCA0M2RjMDhlLi4yNzU2NzNjIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUwpAQCAtMTQ5Miw2ICsxNDkyLDEwIEBACiAJLmxvbmcgc3lzX21vdmVfcGFnZXMKIAkubG9uZyBzeXNfZ2V0Y3B1CiAJLmxvbmcgc3lzX2Vwb2xsX3B3YWl0CisJLmxvbmcgc3lzX3V0aW1lbnNhdAkJLyogMzIwICovCisJLmxvbmcgc3lzX3NpZ25hbGZkCisJLmxvbmcgc3lzX3RpbWVyZmQKKwkubG9uZyBzeXNfZXZlbnRmZAogCiAKIHN5c2NhbGxfdGFibGVfc2l6ZSA9ICguIC0gc3lzX2NhbGxfdGFibGUpCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYyBiL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCmluZGV4IDFlN2ExMDEuLmU4OWNhZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCkBAIC02NDcsMTcgKzY0NywxMSBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfR0RCU1RVQl9DT05TT0xFCi0KLXN0YXRpYyBrZGV2X3QgZ2Ric3R1Yl9jb25zb2xlX2RldihzdHJ1Y3QgY29uc29sZSAqY29uKQotewotCXJldHVybiBNS0RFVigxLDMpOyAvKiAvZGV2L251bGwgKi8KLX0KKyNpZmRlZiBDT05GSUdfR0RCX0NPTlNPTEUKIAogc3RhdGljIHN0cnVjdCBjb25zb2xlIGdkYnN0dWJfY29uc29sZSA9IHsKIAkubmFtZQk9ICJnZGIiLAogCS53cml0ZQk9IGdkYnN0dWJfY29uc29sZV93cml0ZSwJLyogaW4gYnJlYWsuUyAqLwotCS5kZXZpY2UJPSBnZGJzdHViX2NvbnNvbGVfZGV2LAogCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiwKIAkuaW5kZXgJPSAtMSwKIH07CkBAIC0yMDIxLDcgKzIwMTUsNyBAQAogCXB0ciA9IG1lbTJoZXgoZ2Ric3R1Yl9iYW5uZXIsIHB0ciwgc2l6ZW9mKGdkYnN0dWJfYmFubmVyKSAtIDEsIDApOwogCWdkYnN0dWJfc2VuZF9wYWNrZXQob3V0cHV0X2J1ZmZlcik7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19HREJTVFVCX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX0dEQlNUVUJfSU1NRURJQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0dEQl9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKIAlyZWdpc3Rlcl9jb25zb2xlKCZnZGJzdHViX2NvbnNvbGUpOwogI2VuZGlmCiAKQEAgLTIwMzEsNyArMjAyNSw3IEBACiAvKgogICogcmVnaXN0ZXIgdGhlIGNvbnNvbGUgYXQgYSBtb3JlIGFwcHJvcHJpYXRlIHRpbWUKICAqLwotI2lmIGRlZmluZWQgKENPTkZJR19HREJTVFVCX0NPTlNPTEUpICYmICFkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKKyNpZiBkZWZpbmVkIChDT05GSUdfR0RCX0NPTlNPTEUpICYmICFkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKIHN0YXRpYyBpbnQgX19pbml0IGdkYnN0dWJfcG9zdGluaXQodm9pZCkKIHsKIAlwcmludGsoInJlZ2lzdGVyaW5nIGNvbnNvbGVcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jCmluZGV4IGNlODhmYjkuLjcwOWU5YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvcHRyYWNlLmMKQEAgLTExMiwyMCArMTEyLDEyIEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJaW50IGNvcGllZDsKLQorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgogCQlyZXQgPSAtRUlPOwogCQlpZiAoaXNfdXNlcl9hZGRyX3ZhbGlkKGNoaWxkLCBhZGRyLCBzaXplb2YodG1wKSkgPCAwKQogCQkJYnJlYWs7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCi0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMTc2LDkgKzE2OCw3IEBACiAJCXJldCA9IC1FSU87CiAJCWlmIChpc191c2VyX2FkZHJfdmFsaWQoY2hpbGQsIGFkZHIsIHNpemVvZih0bXApKSA8IDApCiAJCQlicmVhazsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSAhPSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gMDsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwppbmRleCBhYTNjNzk1Li5jMWMzMmU0IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwpAQCAtNjAsMTAgKzYwLDYgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF91Y2xpbnV4X21lbW9yeSh2b2lkKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0NPTlNPTEUKLWV4dGVybiBzdHJ1Y3QgY29uc3cgKmNvbnN3aXRjaHA7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19NQjkzMDkwX01CMDAKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgbWI5MzA5MF9iYW5uZXJbXSA9ICJGSi9SSCBGUi1WIExpbnV4IjsKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgbWI5MzA5MF92ZXJzaW9uW10gPSBVVFNfUkVMRUFTRTsKQEAgLTc5NSwxMyArNzkxLDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DSFJfREVWX0ZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0ZMQVNIKQotCS8qIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRmxhc2hyb20gZGV2aWNlIGhlcmUgc2luY2Ugd2UgbWlnaHQKLQkgKiBkbyB0aGluZ3Mgd2l0aCBmbGFzaCBlYXJseSBvbiBpbiB0aGUgYm9vdAotCSAqLwotCWZsYXNoX3Byb2JlKCk7Ci0jZW5kaWYKLQogCS8qIGRlYWwgd2l0aCB0aGUgY29tbWFuZCBsaW5lIC0gUmVkQm9vdCBtYXkgaGF2ZSBwYXNzZWQgb25lIHRvIHRoZSBrZXJuZWwgKi8KIAltZW1jcHkoY29tbWFuZF9saW5lLCBib290X2NvbW1hbmRfbGluZSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOwogCSpjbWRsaW5lX3AgPSAmY29tbWFuZF9saW5lWzBdOwpAQCAtODM3LDExICs4MjYsNiBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0JMS01FTQotCVJPT1RfREVWID0gTUtERVYoQkxLTUVNX01BSk9SLDApOwotI2VuZGlmCi0JLypyb21fbGVuZ3RoID0gKHVuc2lnbmVkIGxvbmcpJl9mbGFzaGVuZCAtICh1bnNpZ25lZCBsb25nKSZfcm9tdmVjOyovCi0KICNpZmRlZiBDT05GSUdfTU1VCiAJc2V0dXBfbGludXhfbWVtb3J5KCk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnIGIvYXJjaC9oODMwMC9LY29uZmlnCmluZGV4IDYxOGRiYWQuLmUzNWY3NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvS2NvbmZpZworKysgYi9hcmNoL2g4MzAwL0tjb25maWcKQEAgLTY4LDYgKzY4LDkgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBOT19ETUEKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBJU0EKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL01ha2VmaWxlIGIvYXJjaC9oODMwMC9NYWtlZmlsZQppbmRleCBiMmQ4OTZhLi41M2I1YzFlIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvTWFrZWZpbGUKQEAgLTYxLDEwICs2MSwxMSBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotdm1saW51eC5zcmVjIHZtbGludXguYmluOiB2bWxpbnV4Cit2bWxpbnV4LnNyZWMgdm1saW51eC5iaW4gekltYWdlOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkKGJvb3QpLyRACiAKIGRlZmluZSBhcmNoaGVscAotICBlY2hvICAndm1saW51eC5iaW4gIC0gQ3JlYXRlIHJhdyBiaW5hcnknCi0gIGVjaG8gICd2bWxpbnV4LnNyZWMgLSBDcmVhdGUgc3JlYyBiaW5hcnknCisgIEBlY2hvICAndm1saW51eC5iaW4gIC0gQ3JlYXRlIHJhdyBiaW5hcnknCisgIEBlY2hvICAndm1saW51eC5zcmVjIC0gQ3JlYXRlIHNyZWMgYmluYXJ5JworICBAZWNobyAgJ3pJbWFnZSAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlJwogZW5kZWYKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggNzFhYWM4Mi4uZDYxODllMCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTE1LDEwICsxNSwxMCBAQAogIyBpbiBvcmRlciB0byBzdXBwcmVzcyBlcnJvciBtZXNzYWdlLgogIwogQ09ORklHX01FTU9SWV9TVEFSVCAgICAgPz0gMHgwMDQwMDAwMAotQ09ORklHX0JPT1RfTElOS19PRkZTRVQgPz0gMHgwMDQwMDAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQgPz0gMHgwMDE0MDAwMAogSU1BR0VfT0ZGU0VUIDo9ICQoc2hlbGwgcHJpbnRmICIweCUwOHgiICQkWyQoQ09ORklHX01FTU9SWV9TVEFSVCkrJChDT05GSUdfQk9PVF9MSU5LX09GRlNFVCldKQogCi1MREZMQUdTX3ZtbGludXggOj0gLVQgJChvYmopL3ZtbGludXgubGRzCitMREZMQUdTX3ZtbGludXggOj0gLVR0ZXh0ICQoSU1BR0VfT0ZGU0VUKSAtZXN0YXJ0dXAgJChvYmopL3ZtbGludXgubGRzCiAKICQob2JqKS92bWxpbnV4OiAkKE9CSkVDVFMpICQob2JqKS9waWdneS5vIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbGQpCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggYjhlOTBkMS4uOTg1YTgxYSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvaGVhZC5TCisrKyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtNCw3ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDYgWW9zaGlub3JpIFNhdG8KICAqLwogCi0uaDgzMDBoCisJLmg4MzAwaAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogI2RlZmluZSBTUkFNX1NUQVJUIDB4ZmY0MDAwCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTJhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcwpAQCAtMCwwICsxLDMyIEBACitTRUNUSU9OUworeworICAgICAgICAudGV4dCA6CisgICAgICAgIHsKKyAgICAgICAgX19zdGV4dCA9IC4gOworCV9fdGV4dCA9IC47CisJICAgICAgICooLnRleHQuc3RhcnR1cCkKKwkgICAgICAgKigudGV4dCkKKyAgICAgICAgX19ldGV4dCA9IC4gOworICAgICAgICB9CisKKwkucm9kYXRhIDoKKwl7CisJCSooLnJvZGF0YSkKKwl9CisgICAgICAgIC5kYXRhIDoKKworICAgICAgICB7CisgICAgICAgIF9fc2RhdGEgPSAuIDsKKyAgICAgICAgX19fZGF0YV9zdGFydCA9IC4gOworICAgICAgICAgICAgICAgICooLmRhdGEuKikKKwl9CisgICAgICAgIC5ic3MgOgorICAgICAgICB7CisgICAgICAgIC4gPSBBTElHTigweDQpIDsKKyAgICAgICAgX19zYnNzID0gLiA7CisgICAgICAgICAgICAgICAgKiguYnNzKikKKyAgICAgICAgLiA9IEFMSUdOKDB4NCkgOworICAgICAgICBfX2Vic3MgPSAuIDsKKyAgICAgICAgX19lbmQgPSAuIDsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LnNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGY2OTYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IKQEAgLTAsMCArMSw5IEBACitTRUNUSU9OUworeworICAuZGF0YSA6IHsKKwlfaW5wdXRfbGVuID0gLjsKKwlMT05HKF9pbnB1dF9kYXRhX2VuZCAtIF9pbnB1dF9kYXRhKSBfaW5wdXRfZGF0YSA9IC47CisJKiguZGF0YSkKKwlfaW5wdXRfZGF0YV9lbmQgPSAuOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlIGIvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2NjMWE3Zi4uODc0ZjZhZSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKQEAgLTYsNiArNiw3IEBACiAKIG9iai15IDo9IHByb2Nlc3MubyB0cmFwcy5vIHB0cmFjZS5vIGlycS5vIFwKIAkgc3lzX2g4MzAwLm8gdGltZS5vIHNlbWFwaG9yZS5vIHNpZ25hbC5vIFwKLSAgICAgICAgIHNldHVwLm8gZ3Bpby5vIGluaXRfdGFzay5vIHN5c2NhbGxzLm8KKyAgICAgICAgIHNldHVwLm8gZ3Bpby5vIGluaXRfdGFzay5vIHN5c2NhbGxzLm8gXAorCSBlbnRyeS5vCiAKIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubyBoODMwMF9rc3ltcy5vIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZW50cnkuUyBiL2FyY2gvaDgzMDAva2VybmVsL2VudHJ5LlMKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZW50cnkuUwpyZW5hbWUgdG8gYXJjaC9oODMwMC9rZXJuZWwvZW50cnkuUwppbmRleCBmM2Q2YjhlLi5jYTc0MzE2IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9lbnRyeS5TCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL2VudHJ5LlMKQEAgLTEsMTEgKzEsMTAgQEAKIC8qIC0qLSBtb2RlOiBhc20gLSotCiAgKgotICogIGxpbnV4L2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2VudHJ5LlMKKyAqICBsaW51eC9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TCiAgKgogICogIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KKyAqICBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgogICoKLSAqCWZhaXJseSBoZWF2eSBjaGFuZ2VzIHRvIGZpeCBzeXNjYWxsIGFyZ3MgYW5kIHNpZ25hbCBwcm9jZXNzaW5nCi0gKglieSBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgogICovCiAKIC8qCkBAIC0yMywxMyArMjIsNjYgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IODMwMEgpCisjZGVmaW5lIFVTRVJSRVQgOAorSU5URVJSVVBUUyA9IDY0CisJLmg4MzAwaAorCS5tYWNybwlTSExMMiByZWcKKwlzaGxsLmwJXHJlZworCXNobGwubAlccmVnCisJLmVuZG0KKwkubWFjcm8JU0hMUjIgcmVnCisJc2hsci5sCVxyZWcKKwlzaGxyLmwJXHJlZworCS5lbmRtCisJLm1hY3JvCVNBVkVSRUdTCisJbW92LmwJZXIwLEAtc3AKKwltb3YubAllcjEsQC1zcAorCW1vdi5sCWVyMixALXNwCisJbW92LmwJZXIzLEAtc3AKKwkuZW5kbQorCS5tYWNybwlSRVNUT1JFUkVHUworCW1vdi5sCUBzcCssZXIzCisJbW92LmwJQHNwKyxlcjIKKwkuZW5kbQorCS5tYWNybwlTQVZFRVhSCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRUVYUgorCS5lbmRtCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSDhTKQorI2RlZmluZSBVU0VSUkVUIDEwCisjZGVmaW5lIFVTRVJFWFIgOAorSU5URVJSVVBUUyA9IDEyOAogCS5oODMwMHMKKwkubWFjcm8JU0hMTDIgcmVnCisJc2hsbC5sCSMyLFxyZWcKKwkuZW5kbQorCS5tYWNybwlTSExSMiByZWcKKwlzaGxyLmwJIzIsXHJlZworCS5lbmRtCisJLm1hY3JvCVNBVkVSRUdTCisJc3RtLmwJZXIwLWVyMyxALXNwCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRVJFR1MKKwlsZG0ubAlAc3ArLGVyMi1lcjMKKwkuZW5kbQorCS5tYWNybwlTQVZFRVhSCisJbW92LncJQChVU0VSRVhSOjE2LGVyMCkscjEKKwltb3YudwlyMSxAKExFWFItTEVSMzoxNixzcCkJCS8qIGNvcHkgRVhSICovCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRUVYUgorCW1vdi53CUAoTEVYUi1MRVIxOjE2LHNwKSxyMQkJLyogcmVzdG9yZSBFWFIgKi8KKwltb3YuYglyMWwscjFoCisJbW92LncJcjEsQChVU0VSRVhSOjE2LGVyMCkKKwkuZW5kbQorI2VuZGlmCisKIAogLyogQ1BVIGNvbnRleHQgc2F2ZS9yZXN0b3JlIG1hY3Jvcy4gKi8KLQkKKwogCS5tYWNybwlTQVZFX0FMTAogCW1vdi5sCWVyMCxALXNwCi0KIAlzdGMJY2NyLHIwbAkJCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwogCWJ0c3QJIzQscjBsCiAJYm5lCTVmCkBAIC0zOSw0MiArOTEsMzggQEAKIAltb3YubAlAc3AsZXIwCQkJCS8qIHJlc3RvcmUgc2F2ZWQgZXIwICovCiAJb3JjCSMweDEwLGNjcgkJCS8qIHN3aXRjaCBrZXJuZWwgc3RhY2sgKi8KIAltb3YubAlAU1lNQk9MX05BTUUoc3dfa3NwKSxzcAotCXN1Yi5sCSMoTFJFVC1MT1JJRyksc3AJCS8qIGFsbG9jYXRlIExPUklHIC0gTFJFVCAqLyAKLQlzdG0ubAllcjAtZXIzLEAtc3AKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKDEwOjE2LGVyMCksZXIxCQkvKiBjb3B5IHRoZSBSRVQgYWRkciAqLwotCW1vdi5sCWVyMSxAKExSRVQtTEVSMzoxNixzcCkKLQltb3YudwlAKDg6MTYsZXIwKSxyMQotCW1vdi53CXIxLEAoTEVYUi1MRVIzOjE2LHNwKQkJLyogY29weSBFWFIgKi8KKwlzdWIubAkjKExSRVQtTE9SSUcpLHNwCQkvKiBhbGxvY2F0ZSBMT1JJRyAtIExSRVQgKi8KKwlTQVZFUkVHUworCW1vdi5sICAgQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCisJbW92LmwgICBAKFVTRVJSRVQ6MTYsZXIwKSxlcjEgICAgICAgICAgIC8qIGNvcHkgdGhlIFJFVCBhZGRyICovCisJbW92LmwgICBlcjEsQChMUkVULUxFUjM6MTYsc3ApCisJU0FWRUVYUgogCi0JbW92LncJZTEscjEJCQkJLyogZTEgaGlnaGJ5dGUgPSBjY3IgKi8KLQlhbmQJIzB4ZWYscjFoCQkJLyogbWFzayBtb2RlPyBmbGFnICovCi0Jc3ViLncJcjAscjAKLQltb3YuYglyMWgscjBsCi0JbW92LncJcjAsQChMQ0NSLUxFUjM6MTYsc3ApCQkvKiBjb3B5IGNjciAqLwogCW1vdi5sCUAoTE9SSUctTEVSMzoxNixzcCksZXIwCiAJbW92LmwJZXIwLEAoTEVSMC1MRVIzOjE2LHNwKQkJLyogY29weSBFUjAgKi8KKwltb3YudwllMSxyMQkJCQkvKiBlMSBoaWdoYnl0ZSA9IGNjciAqLworCWFuZAkjMHhlZixyMWgJCQkvKiBtYXNrIG1vZGU/IGZsYWcgKi8KIAlicmEJNmYKIDU6CiAJLyoga2VybmVsIG1vZGUgKi8KIAltb3YubAlAc3AsZXIwCQkJCS8qIHJlc3RvcmUgc2F2ZWQgZXIwICovCiAJc3VicwkjMixzcAkJCQkvKiBzZXQgZHVtbXkgY2NyICovCi0Jc3RtLmwJZXIwLWVyMyxALXNwCisJU0FWRVJFR1MKIAltb3YudwlAKExSRVQtTEVSMzoxNixzcCkscjEJCS8qIGNvcHkgb2xkIGNjciAqLworNjoKIAltb3YuYglyMWgscjFsCiAJbW92LmIJIzAscjFoCi0JbW92LncJcjEsQChMQ0NSLUxFUjM6MTYsc3ApCi02OgkKKwltb3YudwlyMSxAKExDQ1ItTEVSMzoxNixzcCkJCS8qIHNldCBjY3IgKi8KIAltb3YubAllcjYsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM2ICovCiAJbW92LmwJZXI1LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNSAqLwogCW1vdi5sCWVyNCxALXNwCQkJLyogc3lzY2FsbCBhcmcgIzQgKi8KLQkuZW5kbQorCS5lbmRtCQkJCQkvKiByMSA9IGNjciAqLwogCiAJLm1hY3JvCVJFU1RPUkVfQUxMCiAJbW92LmwJQHNwKyxlcjQKIAltb3YubAlAc3ArLGVyNQogCW1vdi5sCUBzcCssZXI2Ci0JbGRtLmwJQHNwKyxlcjItZXIzCisJUkVTVE9SRVJFR1MKIAltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjAJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCiAJYnRzdAkjNCxyMGwKIAlibmUJN2YKQEAgLTgzLDE4ICsxMzEsMTYgQEAKIAltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKIAltb3YubAlAKExFUjAtTEVSMToxNixzcCksZXIxCQkvKiByZXN0b3JlIEVSMCAqLwogCW1vdi5sCWVyMSxAZXIwCi0JbW92LncJQChMRVhSLUxFUjE6MTYsc3ApLHIxCQkvKiByZXN0b3JlIEVYUiAqLwotCW1vdi5iCXIxbCxyMWgKLQltb3YudwlyMSxAKDg6MTYsZXIwKQorCVJFU1RPUkVFWFIKIAltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjEJCS8qIHJlc3RvcmUgdGhlIFJFVCBhZGRyICovCiAJbW92LmIJcjFsLHIxaAogCW1vdi5iCUAoTFJFVCsxLUxFUjE6MTYsc3ApLHIxbAogCW1vdi53CXIxLGUxCiAJbW92LncJQChMUkVUKzItTEVSMToxNixzcCkscjEKLQltb3YubAllcjEsQCgxMDoxNixlcjApCisJbW92LmwJZXIxLEAoVVNFUlJFVDoxNixlcjApCiAKIAltb3YubAlAc3ArLGVyMQotCWFkZC5sCSMoTFJFVC1MRVIxKSxzcAkJCS8qIHJlbW92ZSBMT1JJRyAtIExSRVQgKi8gCisJYWRkLmwJIyhMUkVULUxFUjEpLHNwCQkJLyogcmVtb3ZlIExPUklHIC0gTFJFVCAqLwogCW1vdi5sCXNwLEBTWU1CT0xfTkFNRShzd19rc3ApCiAJYW5kYwkjMHhlZixjY3IJCQkvKiBzd2l0Y2ggdG8gdXNlciBtb2RlICovCiAJbW92LmwJZXIwLHNwCkBAIC0xMDgsNyArMTU0LDcgQEAKIAlhZGRzCSM0LHNwCQkJCS8qIHJlbW92ZSB0aGUgc3cgY3JlYXRlZCBMVkVDICovCiAJcnRlCiAJLmVuZG0KLQkKKwogLmdsb2JsIFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQogLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKIC5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9mb3JrKQpAQCAtMTE2LDE2ICsxNjIsMjUgQEAKIC5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCiAuZ2xvYmwgU1lNQk9MX05BTUUoc3dfa3NwKSxTWU1CT0xfTkFNRShzd191c3ApCiAuZ2xvYmwgU1lNQk9MX05BTUUocmVzdW1lKQotLmdsb2JsIFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQogLmdsb2JsIFNZTUJPTF9OQU1FKGludGVycnVwdF9lbnRyeSkKLQkJCi1JTlRFUlJVUFRTID0gMTI4CisuZ2xvYmwgU1lNQk9MX05BTUUodHJhY2VfYnJlYWspCisKICNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCiAJLnNlY3Rpb24gLmludF9yZWRpcmVjdCwiYXgiCiBTWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0g4MzAwSCkKIAkucmVwdAk3CiAJLmxvbmcJMAogCS5lbmRyCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSDhTKQorCS5yZXB0CTUKKwkubG9uZwkwCisJLmVuZHIKKwlqbXAJQFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQorCS5sb25nCTAKKyNlbmRpZgorCiAJanNyCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCS8qIE5NSSAqLwogCWptcAlAU1lNQk9MX05BTUUoc3lzdGVtX2NhbGwpCS8qIFRSQVBBICMwIChTeXN0ZW0gY2FsbCkgKi8KIAkubG9uZwkwCkBAIC0xNDEsMjAgKzE5NiwyMCBAQAogU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQogCS5zcGFjZQk0CiAjZW5kaWYKLQkKKwogCS5zZWN0aW9uIC50ZXh0CiAJLmFsaWduCTIKIFNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9lbnRyeSkKIAlTQVZFX0FMTAotCW1vdi53CUAoTENDUixzcCkscjAKLQlidHN0CSM0LHIwbAorCW1vdi5sCXNwLGVyMAorCWFkZC5sCSNMVkVDLGVyMAorCWJ0c3QJIzQscjFsCiAJYm5lCTFmCisJLyogdXNlciBMVkVDICovCiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQCg0OjE2LGVyMCksZXIwCi0JYnJhCTJmCisJYWRkcwkjNCxlcjAKIDE6Ci0JbW92LmwJQChMVkVDOjE2LHNwKSxlcjAKLTI6CisJbW92LmwJQGVyMCxlcjAJCQkvKiBMVkVDIGFkZHJlc3MgKi8KICNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCiAJc3ViLmwJI1NZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSksZXIwCiAjZW5kaWYKQEAgLTE2Miw2OSArMjE3LDYyIEBACiAJbW92LmwJQFNZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSksZXIxCiAJc3ViLmwJZXIxLGVyMAogI2VuZGlmCi0Jc2hsci5sCSMyLGVyMAorCVNITFIyCWVyMAogCWRlYy5sCSMxLGVyMAogCW1vdi5sCXNwLGVyMQogCXN1YnMJIzQsZXIxCQkJCS8qIGFkanVzdCByZXRfcGMgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKHByb2Nlc3NfaW50KQotCW1vdi5sCUBTWU1CT0xfTkFNRShpcnFfc3RhdCkrQ1BVU1RBVF9TT0ZUSVJRX1BFTkRJTkcsZXIwCi0JYmVxCTFmCi0JanNyCUBTWU1CT0xfTkFNRShkb19zb2Z0aXJxKQotMToKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKKwlqc3IJQFNZTUJPTF9OQU1FKGRvX0lSUSkKKwlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKIAogU1lNQk9MX05BTUVfTEFCRUwoc3lzdGVtX2NhbGwpCiAJc3VicwkjNCxzcAkJCQkvKiBkdW1teSBMVkVDICovCiAJU0FWRV9BTEwKKwlhbmRjCSMweDdmLGNjcgogCW1vdi5sCWVyMCxlcjQKLQltb3YubAkjLUVOT1NZUyxlcjAKLQltb3YubAllcjAsQChMRVIwOjE2LHNwKQogCiAJLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KIAltb3YubAlzcCxlcjAKIAlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWNtcC5sCSNOUl9zeXNjYWxscyxlcjQKLQliY2MJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgotCXNobGwubAkjMixlcjQKLQltb3YubAkjU1lNQk9MX05BTUUoc3lzX2NhbGxfdGFibGUpLGVyMAotCWFkZC5sCWVyNCxlcjAKLQltb3YubAlAZXIwLGVyMAotCW1vdi5sCWVyMCxlcjQKLQliZXEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgkKIAltb3YubAlzcCxlcjIKIAlhbmQudwkjMHhlMDAwLHIyCi0JbW92LmIJQCgoVEFTS19GTEFHUyszLShUSUZfU1lTQ0FMTF9UUkFDRSA+PiAzKSk6MTYsZXIyKSxyMmwKKwltb3YuYglAKChUSV9GTEFHUyszLShUSUZfU1lTQ0FMTF9UUkFDRSA+PiAzKSk6MTYsZXIyKSxyMmwKIAlidHN0CSMoVElGX1NZU0NBTExfVFJBQ0UgJiA3KSxyMmwKLQltb3YubAlAKExFUjE6MTYsc3ApLGVyMAotCW1vdi5sCUAoTEVSMjoxNixzcCksZXIxCi0JbW92LmwJQChMRVIzOjE2LHNwKSxlcjIKLQlhbmRjCSMweDdmLGNjcgotCWpzcglAZXI0Ci0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TWVNDQUxMX1BSSU5UKQotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF9wcmludCkKLSNlbmRpZgotCWJyYQlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjgKKwliZXEJMWYKKwlqc3IJQFNZTUJPTF9OQU1FKGRvX3N5c2NhbGxfdHJhY2UpCiAxOgotCWpzcglTWU1CT0xfTkFNRShzeXNjYWxsX3RyYWNlKQorCWNtcC5sCSNOUl9zeXNjYWxscyxlcjQKKwliY2MJYmFkc3lzCisJU0hMTDIJZXI0CisJbW92LmwJI1NZTUJPTF9OQU1FKHN5c19jYWxsX3RhYmxlKSxlcjAKKwlhZGQubAllcjQsZXIwCisJbW92LmwJQGVyMCxlcjQKKwliZXEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgogCW1vdi5sCUAoTEVSMToxNixzcCksZXIwCiAJbW92LmwJQChMRVIyOjE2LHNwKSxlcjEKIAltb3YubAlAKExFUjM6MTYsc3ApLGVyMgogCWpzcglAZXI0CiAJbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4CisJbW92LmwJc3AsZXIyCisJYW5kLncJIzB4ZTAwMCxyMgorCW1vdi5iCUAoKFRJX0ZMQUdTKzMtKFRJRl9TWVNDQUxMX1RSQUNFID4+IDMpKToxNixlcjIpLHIybAorCWJ0c3QJIyhUSUZfU1lTQ0FMTF9UUkFDRSAmIDcpLHIybAorCWJlcQkyZgorCWpzcglAU1lNQk9MX05BTUUoZG9fc3lzY2FsbF90cmFjZSkKKzI6CisjaWYgZGVmaW5lZChDT05GSUdfU1lTQ0FMTF9QUklOVCkKKwlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfcHJpbnQpCisjZW5kaWYKKwlvcmMJIzB4ODAsY2NyCisJYnJhCXJlc3VtZV91c2Vyc3BhY2UKIAotU1lNQk9MX05BTUVfTEFCRUwocmV0X2Zyb21fZm9yaykKLQltb3YubAllcjIsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzY2hlZHVsZV90YWlsKQotCWJyYQlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjgKK2JhZHN5czoKKwltb3YubAkjLUVOT1NZUyxlcjAKKwltb3YubAllcjAsQChMRVIwOjE2LHNwKQorCWJyYQlyZXN1bWVfdXNlcnNwYWNlCiAKLVNZTUJPTF9OQU1FX0xBQkVMKHJlc2NoZWR1bGUpCi0JLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KLQltb3YubAlzcCxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCisjaWYgIWRlZmluZWQoQ09ORklHX1BSRUVNUFQpCisjZGVmaW5lIHJlc3VtZV9rZXJuZWwgcmVzdG9yZV9hbGwKKyNlbmRpZgogCiBTWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9leGNlcHRpb24pCiAjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKQEAgLTIzMiw1OCArMjgwLDY4IEBACiAjZW5kaWYKIFNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ludGVycnVwdCkKIAltb3YuYglAKExDQ1IrMToxNixzcCkscjBsCi0JYnRzdAkjNCxyMGwJCQkvKiBjaGVjayBpZiByZXR1cm5pbmcgdG8ga2VybmVsICovCi0JYm5lCWRvbmU6OAkJCS8qIGlmIHNvLCBza2lwIHJlc2NoZWQsIHNpZ25hbHMgKi8KKwlidHN0CSM0LHIwbAorCWJuZQlyZXN1bWVfa2VybmVsOjgJCS8qIHJldHVybiBmcm9tIGtlcm5lbCAqLworcmVzdW1lX3VzZXJzcGFjZToKIAlhbmRjCSMweDdmLGNjcgogCW1vdi5sCXNwLGVyNAotCWFuZC53CSMweGUwMDAscjQKKwlhbmQudwkjMHhlMDAwLHI0CQkvKiBlcjQgPC0gY3VycmVudCB0aHJlYWQgaW5mbyAqLwogCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKIAlhbmQubAkjX1RJRl9XT1JLX01BU0ssZXIxCi0JYmVxCWRvbmU6OAotMToKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCisJYmVxCXJlc3RvcmVfYWxsOjgKK3dvcmtfcGVuZGluZzoKIAlidHN0CSNUSUZfTkVFRF9SRVNDSEVELHIxbAotCWJuZQlTWU1CT0xfTkFNRShyZXNjaGVkdWxlKToxNgorCWJuZQl3b3JrX3Jlc2NoZWQ6OAorCS8qIHdvcmsgbm90aWZ5c2lnICovCiAJbW92LmwJc3AsZXIwCi0Jc3VicwkjNCxlcjAJCQkvKiBhZGp1c3QgcmV0cGMgKi8KLQltb3YubAllcjIsZXIxCi0JanNyCUBTWU1CT0xfTkFNRShkb19zaWduYWwpCi0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKLQlicmEJZG9uZTo4CQkJLyogdXNlcnNwYWNlIHRob3J1ICovCi0zOgotCWJ0c3QJIzQscjBsCi0JYmVxCWRvbmU6OAkJCS8qIHVzZXJzcGFjZSB0aG9ydSAqLwotNDoKLQltb3YubAlAKFRJX1BSRV9DT1VOVDoxNixlcjQpLGVyMQotCWJuZQlkb25lOjgKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQliZXEJZG9uZTo4Ci0JbW92LmIJcjBsLHIwbAotCWJwbAlkb25lOjgJCQkvKiBpbnRlcnJ1cHQgb2ZmIChleGNlcHRpb24gcGF0aD8pICovCi0JbW92LmwJI1BSRUVNUFRfQUNUSVZFLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0JYW5kYwkjMHg3ZixjY3IKKwlzdWJzCSM0LGVyMAkJCS8qIGVyMDogcHRfcmVncyAqLworCWpzcglAU1lNQk9MX05BTUUoZG9fbm90aWZ5X3Jlc3VtZSkKKwlicmEJcmVzdG9yZV9hbGw6OAord29ya19yZXNjaGVkOgorCW1vdi5sCXNwLGVyMAorCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCiAJanNyCUBTWU1CT0xfTkFNRShzY2hlZHVsZSkKLQlzdWIubAllcjEsZXIxCi0JbW92LmwJZXIxLEAoVElfUFJFX0NPVU5UOjE2LGVyNCkKLQlvcmMJIzB4ODAsY2NyCi0JYnJhCTRiOjgKLSNlbmRpZgotZG9uZToKKwlicmEJcmVzdW1lX3VzZXJzcGFjZTo4CityZXN0b3JlX2FsbDoKIAlSRVNUT1JFX0FMTAkJCS8qIERvZXMgUlRFICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQorcmVzdW1lX2tlcm5lbDoKKwltb3YubAlAKFRJX1BSRV9DT1VOVDoxNixlcjQpLGVyMAorCWJuZQlyZXN0b3JlX2FsbDo4CituZWVkX3Jlc2NoZWQ6CisJbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMAorCWJ0c3QJI1RJRl9ORUVEX1JFU0NIRUQscjBsCisJYmVxCXJlc3RvcmVfYWxsOjgKKwltb3YuYglAKExDQ1IrMToxNixzcCkscjBsCS8qIEludGVycnVwdCBFbmFibGVkPyAqLworCWJtaQlyZXN0b3JlX2FsbDo4CisJbW92LmwJI1BSRUVNUFRfQUNUSVZFLGVyMAorCW1vdi5sCWVyMCxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCisJYW5kYwkjMHg3ZixjY3IKKwltb3YubAlzcCxlcjAKKwlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQorCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCisJb3JjCSMweDgwLGNjcgorCWJyYQluZWVkX3Jlc2NoZWQ6OAorI2VuZGlmCisKK1NZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ZvcmspCisJbW92LmwJZXIyLGVyMAorCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGVfdGFpbCkKKwlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKKwogU1lNQk9MX05BTUVfTEFCRUwocmVzdW1lKQogCS8qCi0JICoJZXIwID0gcHJldgotCSAqCWVyMSA9IG5leHQKLQkgKglyZXR1cm4gbGFzdCBpbiBlcjIKKwkgKiBCZXdhcmUgLSB3aGVuIGVudGVyaW5nIHJlc3VtZSwgb2Zmc2V0IG9mIHRzcyBpcyBpbiBkMSwKKwkgKiBwcmV2ICh0aGUgY3VycmVudCB0YXNrKSBpcyBpbiBhMCwgbmV4dCAodGhlIG5ldyB0YXNrKQorCSAqIGlzIGluIGExIGFuZCBkMi5iIGlzIG5vbi16ZXJvIGlmIHRoZSBtbSBzdHJ1Y3R1cmUgaXMKKwkgKiBzaGFyZWQgYmV0d2VlbiB0aGUgdGFza3MsIHNvIGRvbid0IGNoYW5nZSB0aGVzZQorCSAqIHJlZ2lzdGVycyB1bnRpbCB0aGVpciBjb250ZW50cyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KIAkgKi8KIAogCS8qIHNhdmUgc3IgKi8KIAlzdWIudwlyMyxyMwogCXN0YwljY3IscjNsCi0Jc3RjCWV4cixyM2gKIAltb3YudwlyMyxAKFRIUkVBRF9DQ1IrMjoxNixlcjApCiAKIAkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KQEAgLTI5MSw0MSArMzQ5LDQ1IEBACiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIzCiAJbW92LmwJZXIzLEAoVEhSRUFEX1VTUDoxNixlcjApCiAJbW92LmwJc3AsQChUSFJFQURfS1NQOjE2LGVyMCkKLQkKKwogCS8qIFNraXAgYWRkcmVzcyBzcGFjZSBzd2l0Y2hpbmcgaWYgdGhleSBhcmUgdGhlIHNhbWUuICovCiAJLyogRklYTUU6IHdoYXQgZGlkIHdlIGhhY2sgb3V0IG9mIGhlcmUsIHRoaXMgZG9lcyBub3RoaW5nISAqLwogCiAJbW92LmwJQChUSFJFQURfVVNQOjE2LGVyMSksZXIwCiAJbW92LmwJZXIwLEBTWU1CT0xfTkFNRShzd191c3ApCiAJbW92LmwJQChUSFJFQURfS1NQOjE2LGVyMSksc3AKLQkJCQorCiAJLyogcmVzdG9yZSBzdGF0dXMgcmVnaXN0ZXIgKi8KIAltb3YudwlAKFRIUkVBRF9DQ1IrMjoxNixlcjEpLHIzCiAKIAlsZGMJcjNsLGNjcgotCWxkYwlyM2gsZXhyCi0KIAlydHMKIAogU1lNQk9MX05BTUVfTEFCRUwodHJhY2VfYnJlYWspCi0Jc3VicwkjNCxzcAkJCS8qIGR1bW15IExWRUMgKi8KKwlzdWJzCSM0LHNwCiAJU0FWRV9BTEwKIAlzdWIubAllcjEsZXIxCiAJZGVjLmwJIzEsZXIxCi0JbW92LmwJZXIxLEAoTE9SSUcsc3ApCQorCW1vdi5sCWVyMSxAKExPUklHLHNwKQogCW1vdi5sCXNwLGVyMAogCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCiAJbW92LmwJQGVyMCxlcjEKKwltb3YudwlAKC0yOjE2LGVyMSkscjIKKwljbXAudwkjMHg1NzMwLHIyCisJYmVxCTFmCiAJc3VicwkjMixlcjEKLQltb3YubAllcjEsQGVyMAkKKwltb3YubAllcjEsQGVyMAorMToKIAlhbmQudwkjMHhmZixlMQogCW1vdi5sCWVyMSxlcjAKIAlqc3IJQFNZTUJPTF9OQU1FKHRyYWNlX3RyYXApCi0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCQorCWptcAlAU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKQogCiAJLnNlY3Rpb24JLmJzcwogU1lNQk9MX05BTUVfTEFCRUwoc3dfa3NwKQotCS5zcGFjZQk0CQorCS5zcGFjZQk0CiBTWU1CT0xfTkFNRV9MQUJFTChzd191c3ApCi0JLnNwYWNlCTQJCisJLnNwYWNlCTQKKworCS5lbmQKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL2ludHMuYyBiL2FyY2gvaDgzMDAva2VybmVsL2ludHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZjQ3OS4uMDAwMDAwMAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvaDgzMDAva2VybmVsL2ludHMuYwotICoKLSAqIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KLSAqCi0gKiBCYXNlZCBvbiBsaW51eC9hcmNoLyQoQVJDSCkvcGxhdGZvcm0vJChQTEFURk9STSkvaW50cy5jCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAxOTk2IFJvbWFuIFppcHBlbAotICogQ29weXJpZ2h0IDE5OTkgRC4gSmVmZiBEaW9ubmUgPGplZmZAcnQtY29udHJvbC5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaGFzIG9ubHkgNCBlbGVtZW50cyBmb3Igc3BlZWQgcmVhc29ucwotICovCi10eXBlZGVmIHN0cnVjdCBpcnFfaGFuZGxlciB7Ci0JaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0JaW50ICAgICAgICAgZmxhZ3M7Ci0JaW50ICAgICAgICAgY291bnQ7Ci0Jdm9pZAkgICAgKmRldl9pZDsKLQljb25zdCBjaGFyICAqZGV2bmFtZTsKLX0gaXJxX2hhbmRsZXJfdDsKLQotc3RhdGljIGlycV9oYW5kbGVyX3QgKmlycV9saXN0W05SX0lSUVNdOwotc3RhdGljIGludCB1c2Vfa21hbGxvYzsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKmludGVycnVwdF9yZWRpcmVjdF90YWJsZTsKLWV4dGVybiBjb25zdCBpbnQgaDgzMDBfc2F2ZWRfdmVjdG9yc1tdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgaDgzMDBfdHJhcF90YWJsZVtdOwotaW50IGg4MzAwX2VuYWJsZV9pcnFfcGluKHVuc2lnbmVkIGludCBpcnEpOwotdm9pZCBoODMwMF9kaXNhYmxlX2lycV9waW4odW5zaWduZWQgaW50IGlycSk7Ci0KLSNkZWZpbmUgQ1BVX1ZFQ1RPUiAoKHVuc2lnbmVkIGxvbmcgKikweDAwMDAwMCkKLSNkZWZpbmUgQUREUl9NQVNLICgweGZmZmZmZikKLQotI2lmIGRlZmluZWQoQ09ORklHX1JBTUtFUk5FTCkKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCAqZ2V0X3ZlY3Rvcl9hZGRyZXNzKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyAqcm9tX3ZlY3RvciA9IENQVV9WRUNUT1I7Ci0JdW5zaWduZWQgbG9uZyBiYXNlLHRtcDsKLQlpbnQgdmVjX25vOwotCi0JYmFzZSA9IHJvbV92ZWN0b3JbRVhUX0lSUTBdICYgQUREUl9NQVNLOwotCQotCS8qIGNoZWNrIHJvbXZlY3RvciBmb3JtYXQgKi8KLQlmb3IgKHZlY19ubyA9IEVYVF9JUlExOyB2ZWNfbm8gPD0gRVhUX0lSUTArRVhUX0lSUVM7IHZlY19ubysrKSB7Ci0JCWlmICgoYmFzZSsodmVjX25vIC0gRVhUX0lSUTApKjQpICE9IChyb21fdmVjdG9yW3ZlY19ub10gJiBBRERSX01BU0spKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogcmFtdmVjdG9yIGJhc2UgYWRkcmVzcyAqLwotCWJhc2UgLT0gRVhUX0lSUTAqNDsKLQotCS8qIHdyaXRlcmJsZSBjaGVjayAqLwotCXRtcCA9IH4oKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopYmFzZSk7Ci0JKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWJhc2UpID0gdG1wOwotCWlmICgoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopYmFzZSkgIT0gdG1wKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKiliYXNlOwotfQotI2VuZGlmCi0KLXZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgKnJhbXZlYywqcmFtdmVjX3A7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqdHJhcF9lbnRyeTsKLQljb25zdCBpbnQgKnNhdmVkX3ZlY3RvcjsKLQotCXJhbXZlYyA9IGdldF92ZWN0b3JfYWRkcmVzcygpOwotCWlmIChyYW12ZWMgPT0gTlVMTCkKLQkJcGFuaWMoImludGVycnVwdCB2ZWN0b3Igc2VydXAgZmFpbGVkLiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAidmlydHVhbCB2ZWN0b3IgYXQgMHglMDhseFxuIiwodW5zaWduZWQgbG9uZylyYW12ZWMpOwotCi0JLyogY3JlYXRlIHJlZGlyZWN0IHRhYmxlICovCi0JcmFtdmVjX3AgPSByYW12ZWM7Ci0JdHJhcF9lbnRyeSA9IGg4MzAwX3RyYXBfdGFibGU7Ci0Jc2F2ZWRfdmVjdG9yID0gaDgzMDBfc2F2ZWRfdmVjdG9yczsKLQlmb3IgKCBpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpZiAoaSA9PSAqc2F2ZWRfdmVjdG9yKSB7Ci0JCQlyYW12ZWNfcCsrOwotCQkJc2F2ZWRfdmVjdG9yKys7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIGkgPCBOUl9UUkFQUyApIHsKLQkJCQlpZiAoKnRyYXBfZW50cnkpCi0JCQkJCSpyYW12ZWNfcCA9IFZFQ1RPUigqdHJhcF9lbnRyeSk7Ci0JCQkJcmFtdmVjX3ArKzsKLQkJCQl0cmFwX2VudHJ5Kys7Ci0JCQl9IGVsc2UKLQkJCQkqcmFtdmVjX3ArKyA9IFJFRElSRUNUKGludGVycnVwdF9lbnRyeSk7Ci0JCX0KLQl9Ci0JaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlID0gcmFtdmVjOwotI2lmZGVmIERVTVBfVkVDVE9SCi0JcmFtdmVjX3AgPSByYW12ZWM7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpZiAoKGkgJSA4KSA9PSAwKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuJXA6ICIscmFtdmVjX3ApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXAgIiwqcmFtdmVjX3ApOwotCQlyYW12ZWNfcCsrOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLWludCByZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCAKLQkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotCWlycV9oYW5kbGVyX3QgKmlycV9oYW5kbGU7Ci0JaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgSVJRICVkIGZyb20gJXNcbiIsIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChpcnFfbGlzdFtpcnFdIHx8IChoODMwMF9lbmFibGVfaXJxX3BpbihpcnEpID09IC1FQlVTWSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAodXNlX2ttYWxsb2MpCi0JCWlycV9oYW5kbGUgPSBrbWFsbG9jKHNpemVvZihpcnFfaGFuZGxlcl90KSwgR0ZQX0FUT01JQyk7Ci0JZWxzZSB7Ci0JCS8qIHVzZSBib290bWVtIGFsbG9jYXRlciAqLwotCQlpcnFfaGFuZGxlID0gKGlycV9oYW5kbGVyX3QgKilhbGxvY19ib290bWVtKHNpemVvZihpcnFfaGFuZGxlcl90KSk7Ci0JCWlycV9oYW5kbGUgPSAoaXJxX2hhbmRsZXJfdCAqKSgodW5zaWduZWQgbG9uZylpcnFfaGFuZGxlIHwgMHg4MDAwMDAwMCk7Ci0JfQotCi0JaWYgKGlycV9oYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpcnFfaGFuZGxlLT5oYW5kbGVyID0gaGFuZGxlcjsKLQlpcnFfaGFuZGxlLT5mbGFncyAgID0gZmxhZ3M7Ci0JaXJxX2hhbmRsZS0+Y291bnQgICA9IDA7Ci0JaXJxX2hhbmRsZS0+ZGV2X2lkICA9IGRldl9pZDsKLQlpcnFfaGFuZGxlLT5kZXZuYW1lID0gZGV2bmFtZTsKLQlpcnFfbGlzdFtpcnFdID0gaXJxX2hhbmRsZTsKLQotCWlmIChpcnFfaGFuZGxlLT5mbGFncyAmIElSUUZfU0FNUExFX1JBTkRPTSkKLQkJcmFuZF9pbml0aWFsaXplX2lycShpcnEpOwotCi0JZW5hYmxlX2lycShpcnEpOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHJlcXVlc3RfaXJxKTsKLQotdm9pZCBmcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA+PSBOUl9JUlFTKQotCQlyZXR1cm47Ci0KLQlpZiAoIWlycV9saXN0W2lycV0gfHwgaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICE9IGRldl9pZCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVtb3ZpbmcgcHJvYmFibHkgd3JvbmcgSVJRICVkIGZyb20gJXNcbiIsCi0JCSAgICAgICBpcnEsIGlycV9saXN0W2lycV0tPmRldm5hbWUpOwotCWRpc2FibGVfaXJxKGlycSk7Ci0JaDgzMDBfZGlzYWJsZV9pcnFfcGluKGlycSk7Ci0JaWYgKCgodW5zaWduZWQgbG9uZylpcnFfbGlzdFtpcnFdICYgMHg4MDAwMDAwMCkgPT0gMCkgewotCQlrZnJlZShpcnFfbGlzdFtpcnFdKTsKLQkJaXJxX2xpc3RbaXJxXSA9IE5VTEw7Ci0JfQotfQotCi1FWFBPUlRfU1lNQk9MKGZyZWVfaXJxKTsKLQotLyoKLSAqIERvIHdlIG5lZWQgdGhlc2UgcHJvYmUgZnVuY3Rpb25zIG9uIHRoZSBtNjhrPwotICovCi11bnNpZ25lZCBsb25nIHByb2JlX2lycV9vbiAodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb24pOwotCi1pbnQgcHJvYmVfaXJxX29mZiAodW5zaWduZWQgbG9uZyBpcnFzKQotewotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHByb2JlX2lycV9vZmYpOwotCi12b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoaXJxID49IEVYVF9JUlEwICYmIGlycSA8PSAoRVhUX0lSUTAgKyBFWFRfSVJRUykpCi0JCUlFUl9SRUdTIHw9IDEgPDwgKGlycSAtIEVYVF9JUlEwKTsKLX0KLQotdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmIChpcnEgPj0gRVhUX0lSUTAgJiYgaXJxIDw9IChFWFRfSVJRMCArIEVYVF9JUlFTKSkKLQkJSUVSX1JFR1MgJj0gfigxIDw8IChpcnEgLSBFWFRfSVJRMCkpOwotfQotCi1hc21saW5rYWdlIHZvaWQgcHJvY2Vzc19pbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlycV9lbnRlcigpOwotCWg4MzAwX2NsZWFyX2lzcihpcnEpOwotCWlmIChpcnEgPj0gTlJfVFJBUFMgJiYgaXJxIDwgTlJfSVJRUykgewotCQlpZiAoaXJxX2xpc3RbaXJxXSkgewotCQkJaXJxX2xpc3RbaXJxXS0+aGFuZGxlcihpcnEsIGlycV9saXN0W2lycV0tPmRldl9pZCwgZnApOwotCQkJaXJxX2xpc3RbaXJxXS0+Y291bnQrKzsKLQkJCWlmIChpcnFfbGlzdFtpcnFdLT5mbGFncyAmIElSUUZfU0FNUExFX1JBTkRPTSkKLQkJCQlhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaXJxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCUJVRygpOwotCX0KLQlpcnFfZXhpdCgpOwotfQotCi1pbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQlpbnQgaSA9ICoobG9mZl90ICopIHY7Ci0KLQlpZiAoKGkgPCBOUl9JUlFTKSAmJiAoaXJxX2xpc3RbaV0hPU5VTEwpKSB7Ci0JCXNlcV9wcmludGYocCwgIiUzZDogJTEwdSAiLGksaXJxX2xpc3RbaV0tPmNvdW50KTsKLQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIGlycV9saXN0W2ldLT5kZXZuYW1lKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpbml0X2lycV9wcm9jKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVuYWJsZV9rbWFsbG9jKHZvaWQpCi17Ci0JdXNlX2ttYWxsb2MgPSAxOwotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChlbmFibGVfa21hbGxvYyk7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCmluZGV4IDhmMjQxMWQuLmQzMmJiZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCkBAIC0xMTEsMTAgKzExMSw3IEBACiAgICAgICAvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gMDsKLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpAQCAtMjE5LDcgKzIxNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uodm9pZCkKK2FzbWxpbmthZ2Ugdm9pZCBkb19zeXNjYWxsX3RyYWNlKHZvaWQpCiB7CiAJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYwppbmRleCAwMjk1NTYwLi42MmVhMTJkIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYwpAQCAtNTQ3LDMgKzU0Nyw5IEBACiAJfQogCXJldHVybiAwOwogfQorCithc21saW5rYWdlIHZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTMyIHRocmVhZF9pbmZvX2ZsYWdzKQoreworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIChfVElGX1NJR1BFTkRJTkcgfCBfVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCWRvX3NpZ25hbChyZWdzLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKaW5kZXggYjI0ZWEwOC4uYzUwOTYzNiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKQEAgLTQsNCArNCw0IEBACiAjIFJldXNlIGFueSBmaWxlcyB3ZSBjYW4gZnJvbSB0aGUgSDgvMzAwSAogIwogCi1vYmoteSA6PSBlbnRyeS5vIGlycV9waW4ubyBwdHJhY2VfaDgzMDBoLm8KK29iai15IDo9IGlycV9waW4ubyBwdHJhY2VfaDgzMDBoLm8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2VudHJ5LlMgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODZhYzNiLi4wMDAwMDAwCi0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2VudHJ5LlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyogLSotIG1vZGU6IGFzbSAtKi0KLSAqCi0gKiAgbGludXgvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZW50cnkuUwotICoKLSAqICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+Ci0gKiAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KLSAqCi0gKi8KLQotLyoKLSAqICBlbnRyeS5TCi0gKiAgaW5jbHVkZSBleGNlcHRpb24vaW50ZXJydXB0IGdhdGV3YXkKLSAqICAgICAgICAgIHN5c3RlbSBjYWxsIGVudHJ5Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0KLQkuaDgzMDBoCi0KLS8qIENQVSBjb250ZXh0IHNhdmUvcmVzdG9yZSBtYWNyb3MuICovCi0JCi0JLm1hY3JvCVNBVkVfQUxMCi0JbW92LmwJZXIwLEAtc3AKLQotCXN0YwljY3IscjBsCQkJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCi0JYnRzdAkjNCxyMGwKLQlibmUJNWYKLQotCW1vdi5sCXNwLEBTWU1CT0xfTkFNRShzd191c3ApCQkvKiB1c2VyIG1vZGUgKi8KLQltb3YubAlAc3AsZXIwCi0Jb3JjCSMweDEwLGNjcgotCW1vdi5sCUBTWU1CT0xfTkFNRShzd19rc3ApLHNwCi0Jc3ViLmwJIyhMUkVULUxPUklHKSxzcAkJLyogYWxsb2NhdGUgTE9SSUcgLSBMUkVUICovIAotCW1vdi5sCWVyMCxALXNwCi0JbW92LmwJZXIxLEAtc3AKLQltb3YubCAgIEBTWU1CT0xfTkFNRShzd191c3ApLGVyMAotCW1vdi5sICAgQCg4OjE2LGVyMCksZXIxICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBSRVQgYWRkciAqLwotCW1vdi5sICAgZXIxLEAoTFJFVC1MRVIxOjE2LHNwKQotCi0JbW92LncJZTEscjEJCQkJLyogZTEgaGlnaGJ5dGUgPSBjY3IgKi8KLQlhbmQJIzB4ZWYscjFoCQkJLyogbWFzayBtb2RlPyBmbGFnICovCi0Jc3ViLncJcjAscjAKLQltb3YuYglyMWgscjBsCi0JbW92LncJcjAsQChMQ0NSLUxFUjE6MTYsc3ApCQkvKiBjb3B5IGNjciAqLwotCW1vdi5sCUAoTE9SSUctTEVSMToxNixzcCksZXIwCi0JbW92LmwJZXIwLEAoTEVSMC1MRVIxOjE2LHNwKQkJLyogY29weSBFUjAgKi8KLQlicmEJNmYKLTU6Ci0JbW92LmwJQHNwLGVyMAkJCQkvKiBrZXJuZWwgbW9kZSAqLwotCXN1YnMJIzIsc3AJCQkJLyogZHVtbXkgY2NyICovCi0JbW92LmwJZXIwLEAtc3AKLQltb3YubAllcjEsQC1zcAotCW1vdi53CUAoTFJFVC1MRVIxOjE2LHNwKSxyMQkJLyogY29weSBvbGQgY2NyICovCi0JbW92LmIJcjFoLHIxbAotCW1vdi5iCSMwLHIxaAotCW1vdi53CXIxLEAoTENDUi1MRVIxOjE2LHNwKQkJLyogc2V0IGNjciAqLwotNjoKLQltb3YubAllcjIsQC1zcAotCW1vdi5sCWVyMyxALXNwCi0JbW92LmwJZXI2LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNiAqLwotCW1vdi5sCWVyNSxALXNwCQkJLyogc3lzY2FsbCBhcmcgIzUgKi8KLQltb3YubAllcjQsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM0ICovCi0JLmVuZG0KLQotCS5tYWNybwlSRVNUT1JFX0FMTAotCW1vdi5sCUBzcCssZXI0Ci0JbW92LmwJQHNwKyxlcjUKLQltb3YubAlAc3ArLGVyNgotCW1vdi5sCUBzcCssZXIzCi0JbW92LmwJQHNwKyxlcjIKLQltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjAJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCi0JYnRzdAkjNCxyMGwKLQlibmUJN2YKLQotCW9yYwkjMHg4MCxjY3IKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKExFUjAtTEVSMToxNixzcCksZXIxCQkvKiByZXN0b3JlIEVSMCAqLwotCW1vdi5sCWVyMSxAZXIwCi0JbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIxCQkvKiByZXN0b3JlIHRoZSBSRVQgYWRkciAqLwotCW1vdi5iCXIxbCxyMWgKLQltb3YuYglAKExSRVQrMS1MRVIxOjE2LHNwKSxyMWwKLQltb3YudwlyMSxlMQotCW1vdi53CUAoTFJFVCsyLUxFUjE6MTYsc3ApLHIxCi0JbW92LmwJZXIxLEAoODoxNixlcjApCi0KLQltb3YubAlAc3ArLGVyMQotCWFkZC5sCSMoTFJFVC1MRVIxKSxzcAkJCS8qIHJlbW92ZSBMT1JJRyAtIExSRVQgKi8gCi0JbW92LmwJc3AsQFNZTUJPTF9OQU1FKHN3X2tzcCkKLQltb3YubAllcjAsc3AKLQlicmEJOGYKLTc6Ci0JbW92LmwJQHNwKyxlcjEKLQlhZGRzCSM0LHNwCi0JYWRkcwkjMixzcAotODoKLQltb3YubAlAc3ArLGVyMAotCWFkZHMJIzQsc3AJCQkJLyogcmVtb3ZlIHRoZSBzdyBjcmVhdGVkIExWRUMgKi8KLQlydGUKLQkuZW5kbQotCQotLmdsb2JsIFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQotLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKLS5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9mb3JrKQotLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKLS5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCi0uZ2xvYmwgU1lNQk9MX05BTUUoc3dfa3NwKSxTWU1CT0xfTkFNRShzd191c3ApCi0uZ2xvYmwgU1lNQk9MX05BTUUocmVzdW1lKQotLmdsb2JsIFNZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLS5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCi0uZ2xvYmwgU1lNQk9MX05BTUUoc3lzdGVtX2NhbGwpCi0uZ2xvYmwgU1lNQk9MX05BTUUodHJhY2VfYnJlYWspCi0KLSNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCi1JTlRFUlJVUFRTID0gNjQJCQotCS5zZWN0aW9uIC5pbnRfcmVkaXJlY3QsImF4IgotU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQotCS5yZXB0CTcKLQkubG9uZwkwCi0JLmVuZHIKLQlqc3IJQFNZTUJPTF9OQU1FKGludGVycnVwdF9lbnRyeSkJLyogTk1JICovCi0Jam1wCUBTWU1CT0xfTkFNRShzeXN0ZW1fY2FsbCkJLyogVFJBUEEgIzAgKFN5c3RlbSBjYWxsKSAqLwotCS5sb25nCTAKLQkubG9uZwkwCi0Jam1wCUBTWU1CT0xfTkFNRSh0cmFjZV9icmVhaykJLyogVFJBUEEgIzMgKGJyZWFrcG9pbnQpICovCi0JLnJlcHQJSU5URVJSVVBUUy0xMgotCWpzcglAU1lNQk9MX05BTUUoaW50ZXJydXB0X2VudHJ5KQotCS5lbmRyCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19SQU1LRVJORUwpCi0uZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQotCS5zZWN0aW9uIC5ic3MKLVNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLQkuc3BhY2UJNAotI2VuZGlmCi0KLQkuc2VjdGlvbiAudGV4dAotCS5hbGlnbgkyCi1TWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfZW50cnkpCi0JU0FWRV9BTEwKLQltb3YudwlAKExDQ1Isc3ApLHIwCi0JYnRzdAkjNCxyMGwKLQlibmUJMWYKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKDQ6MTYsZXIwKSxlcjAKLQlicmEJMmYKLTE6Ci0JbW92LmwJQChMVkVDLHNwKSxlcjAKLTI6Ci0jaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQotCXN1Yi5sCSNTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMAotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQotCW1vdi5sCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMQotCXN1Yi5sCWVyMSxlcjAKLSNlbmRpZgotCXNobHIubAllcjAKLQlzaGxyLmwJZXIwCi0JZGVjLmwJIzEsZXIwCi0JbW92LmwJc3AsZXIxCi0Jc3VicwkjNCxlcjEJCQkJLyogYWRqdXN0IHJldF9wYyAqLwotCWpzcglAU1lNQk9MX05BTUUoZG9fSVJRKQotCW1vdi5sCUBTWU1CT0xfTkFNRShpcnFfc3RhdCkrQ1BVU1RBVF9TT0ZUSVJRX1BFTkRJTkcsZXIwCi0JYmVxCTFmCi0JanNyCUBTWU1CT0xfTkFNRShkb19zb2Z0aXJxKQotMToKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKLQkKLVNZTUJPTF9OQU1FX0xBQkVMKHN5c3RlbV9jYWxsKQotCXN1YnMJIzQsc3AJCQkJLyogZHVtbXkgTFZFQyAqLwotCVNBVkVfQUxMCi0JbW92LncJQChMQ0NSOjE2LHNwKSxyMQotCWJzZXQJIzQscjFsCi0JbGRjCXIxbCxjY3IKLQltb3YubAllcjAsZXI0Ci0JbW92LmwJIy1FTk9TWVMsZXIwCi0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkKLQotCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCi0JbW92LmwJc3AsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQljbXAubAkjTlJfc3lzY2FsbHMsZXI0Ci0JYmNjCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYKLQlzaGxsLmwJZXI0Ci0Jc2hsbC5sCWVyNAotCW1vdi5sCSNTWU1CT0xfTkFNRShzeXNfY2FsbF90YWJsZSksZXIwCi0JYWRkLmwJZXI0LGVyMAotCW1vdi5sCUBlcjAsZXI0Ci0JYmVxCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYJCi0JbW92LmwJc3AsZXIyCi0JYW5kLncJIzB4ZTAwMCxyMgotCW1vdi5iCUAoKFRBU0tfRkxBR1MrMy0oVElGX1NZU0NBTExfVFJBQ0UgPj4gMykpOjE2LGVyMikscjJsCi0JYnRzdAkjKFRJRl9TWVNDQUxMX1RSQUNFICYgNykscjJsCi0JYm5lCTFmCi0JbW92LmwJQChMRVIxOjE2LHNwKSxlcjAKLQltb3YubAlAKExFUjI6MTYsc3ApLGVyMQotCW1vdi5sCUAoTEVSMzoxNixzcCksZXIyCi0JanNyCUBlcjQKLQltb3YubAllcjAsQChMRVIwOjE2LHNwKQkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlICovCi0jaWYgZGVmaW5lZChDT05GSUdfU1lTQ0FMTF9QUklOVCkKLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfcHJpbnQpCi0jZW5kaWYKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0xOgotCWpzcglTWU1CT0xfTkFNRShzeXNjYWxsX3RyYWNlKQotCW1vdi5sCUAoTEVSMToxNixzcCksZXIwCi0JbW92LmwJQChMRVIyOjE2LHNwKSxlcjEKLQltb3YubAlAKExFUjM6MTYsc3ApLGVyMgotCWpzcglAZXI0Ci0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0KLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ZvcmspCi0JbW92LmwJZXIyLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGVfdGFpbCkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0KLVNZTUJPTF9OQU1FX0xBQkVMKHJlc2NoZWR1bGUpCi0JLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KLQltb3YubAlzcCxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCi0KLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2V4Y2VwdGlvbikKLSNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotCW9yYwkjMHg4MCxjY3IKLSNlbmRpZgotU1lNQk9MX05BTUVfTEFCRUwocmV0X2Zyb21faW50ZXJydXB0KQotCW1vdi5iCUAoTENDUisxOjE2LHNwKSxyMGwKLQlidHN0CSM0LHIwbAkJCS8qIGNoZWNrIGlmIHJldHVybmluZyB0byBrZXJuZWwgKi8KLQlibmUJZG9uZTo4CQkJLyogaWYgc28sIHNraXAgcmVzY2hlZCwgc2lnbmFscyAqLwotCWFuZGMJIzB4N2YsY2NyCi0JbW92LmwJc3AsZXI0Ci0JYW5kLncJIzB4ZTAwMCxyNAotCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKLQlhbmQubAkjX1RJRl9XT1JLX01BU0ssZXIxCi0JYmVxCWRvbmU6OAotMToKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQlibmUJU1lNQk9MX05BTUUocmVzY2hlZHVsZSk6MTYKLQltb3YubAlzcCxlcjAKLQlzdWJzCSM0LGVyMAkJCS8qIGFkanVzdCByZXRwYyAqLwotCW1vdi5sCWVyMixlcjEKLQlqc3IJQFNZTUJPTF9OQU1FKGRvX3NpZ25hbCkKLSNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotCWJyYQlkb25lOjgJCQkvKiB1c2Vyc3BhY2UgdGhvcnUgKi8KLTM6Ci0JYnRzdAkjNCxyMGwKLQliZXEJZG9uZTo4CQkJLyogdXNlcnNwYWNlIHRob3J1ICovCi00OgotCW1vdi5sCUAoVElfUFJFX0NPVU5UOjE2LGVyNCksZXIxCi0JYm5lCWRvbmU6OAotCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKLQlidHN0CSNUSUZfTkVFRF9SRVNDSEVELHIxbAotCWJlcQlkb25lOjgKLQltb3YuYglyMGwscjBsCi0JYnBsCWRvbmU6OAkJCS8qIGludGVycnVwdCBvZmYgKGV4Y2VwdGlvbiBwYXRoPykgKi8KLQltb3YubAkjUFJFRU1QVF9BQ1RJVkUsZXIxCi0JbW92LmwJZXIxLEAoVElfUFJFX0NPVU5UOjE2LGVyNCkKLQlhbmRjCSMweDdmLGNjcgotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCi0Jc3ViLmwJZXIxLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0Jb3JjCSMweDgwLGNjcgotCWJyYQk0Yjo4Ci0jZW5kaWYKLWRvbmU6Ci0JUkVTVE9SRV9BTEwJCQkvKiBEb2VzIFJURSAqLwotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXN1bWUpCi0JLyoKLQkgKiBCZXdhcmUgLSB3aGVuIGVudGVyaW5nIHJlc3VtZSwgb2Zmc2V0IG9mIHRzcyBpcyBpbiBkMSwKLQkgKiBwcmV2ICh0aGUgY3VycmVudCB0YXNrKSBpcyBpbiBhMCwgbmV4dCAodGhlIG5ldyB0YXNrKQotCSAqIGlzIGluIGExIGFuZCBkMi5iIGlzIG5vbi16ZXJvIGlmIHRoZSBtbSBzdHJ1Y3R1cmUgaXMKLQkgKiBzaGFyZWQgYmV0d2VlbiB0aGUgdGFza3MsIHNvIGRvbid0IGNoYW5nZSB0aGVzZQotCSAqIHJlZ2lzdGVycyB1bnRpbCB0aGVpciBjb250ZW50cyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKi8KLQotCS8qIHNhdmUgc3IgKi8KLQlzdWIudwlyMyxyMwotCXN0YwljY3IscjNsCi0JbW92LncJcjMsQChUSFJFQURfQ0NSKzI6MTYsZXIwKQotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0Jb3JjCSMweDgwLGNjcgotCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMwotCW1vdi5sCWVyMyxAKFRIUkVBRF9VU1A6MTYsZXIwKQotCW1vdi5sCXNwLEAoVEhSRUFEX0tTUDoxNixlcjApCi0KLQkvKiBTa2lwIGFkZHJlc3Mgc3BhY2Ugc3dpdGNoaW5nIGlmIHRoZXkgYXJlIHRoZSBzYW1lLiAqLwotCS8qIEZJWE1FOiB3aGF0IGRpZCB3ZSBoYWNrIG91dCBvZiBoZXJlLCB0aGlzIGRvZXMgbm90aGluZyEgKi8KLQotCW1vdi5sCUAoVEhSRUFEX1VTUDoxNixlcjEpLGVyMAotCW1vdi5sCWVyMCxAU1lNQk9MX05BTUUoc3dfdXNwKQotCW1vdi5sCUAoVEhSRUFEX0tTUDoxNixlcjEpLHNwCi0JCQkKLQkvKiByZXN0b3JlIHN0YXR1cyByZWdpc3RlciAqLwotCW1vdi53CUAoVEhSRUFEX0NDUisyOjE2LGVyMSkscjMKLQotCWxkYwlyM2wsY2NyCi0JcnRzCi0JCi1TWU1CT0xfTkFNRV9MQUJFTCh0cmFjZV9icmVhaykKLQlzdWJzCSM0LHNwCi0JU0FWRV9BTEwKLQlzdWIubAllcjEsZXIxCi0JZGVjLmwJIzEsZXIxCi0JbW92LmwJZXIxLEAoTE9SSUcsc3ApCQotCW1vdi5sCXNwLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQGVyMCxlcjEKLQlzdWJzCSMyLGVyMQotCW1vdi5sCWVyMSxAZXIwCQotCWFuZC53CSMweGZmLGUxCi0JbW92LmwJZXIxLGVyMAotCWpzcglAU1lNQk9MX05BTUUodHJhY2VfdHJhcCkKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikJCi0KLQkuc2VjdGlvbgkuYnNzCi1TWU1CT0xfTkFNRV9MQUJFTChzd19rc3ApCi0JLnNwYWNlCTQJCi1TWU1CT0xfTkFNRV9MQUJFTChzd191c3ApCi0JLnNwYWNlCTQJCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCmluZGV4IDA4NDdiMTUuLmJmMTI0MTggMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogIyBSZXVzZSBhbnkgZmlsZXMgd2UgY2FuIGZyb20gdGhlIEg4UwogIwogCi1vYmoteSA6PSBlbnRyeS5vIGludHNfaDhzLm8gcHRyYWNlX2g4cy5vCitvYmoteSA6PSBpbnRzX2g4cy5vIHB0cmFjZV9oOHMubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCBiMWIyYjMwLi5jN2M5YzJhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtMTIxMiwyMSArMTIxMiwyNiBAQAogCiBzb3VyY2UgImZzL0tjb25maWciCiAKLW1lbnUgIkluc3RydW1lbnRhdGlvbiBTdXBwb3J0IgorbWVudWNvbmZpZyBJTlNUUlVNRU5UQVRJT04KKwlib29sICJJbnN0cnVtZW50YXRpb24gU3VwcG9ydCIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgeQorCitpZiBJTlNUUlVNRU5UQVRJT04KIAogc291cmNlICJhcmNoL2kzODYvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwogCSAgYSBwcm9iZXBvaW50IGFuZCBzcGVjaWZpZXMgdGhlIGNhbGxiYWNrLiAgS3Byb2JlcyBpcyB1c2VmdWwKIAkgIGZvciBrZXJuZWwgZGVidWdnaW5nLCBub24taW50cnVzaXZlIGluc3RydW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KIAkgIElmIGluIGRvdWJ0LCBzYXkgIk4iLgotZW5kbWVudQorCitlbmRpZiAjIElOU1RSVU1FTlRBVElPTgogCiBzb3VyY2UgImFyY2gvaTM4Ni9LY29uZmlnLmRlYnVnIgogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKaW5kZXggYmQyOGY5Zi4uMTgxY2MyOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtMTA4LDYgKzEwOCw3IEBACiAjIG11c3QgYmUgbGlua2VkIGFmdGVyIGtlcm5lbC8KIGRyaXZlcnMtJChDT05GSUdfT1BST0ZJTEUpCQkrPSBhcmNoL2kzODYvb3Byb2ZpbGUvCiBkcml2ZXJzLSQoQ09ORklHX1BNKQkJCSs9IGFyY2gvaTM4Ni9wb3dlci8KK2RyaXZlcnMtJChDT05GSUdfRkIpICAgICAgICAgICAgICAgICAgICArPSBhcmNoL2kzODYvdmlkZW8vCiAKIENGTEFHUyArPSAkKG1mbGFncy15KQogQUZMQUdTICs9ICQobWZsYWdzLXkpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYwppbmRleCA0MTEyYWZlLi40NzAwMWQ1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwbS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKQEAgLTIyMiw2ICsyMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgpAQCAtMjMxMSw3ICsyMzEyLDYgQEAKIAkJcmVtb3ZlX3Byb2NfZW50cnkoImFwbSIsIE5VTEwpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlrYXBtZF90YXNrLT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAl3YWtlX3VwX3Byb2Nlc3Moa2FwbWRfdGFzayk7CiAKIAlpZiAobnVtX29ubGluZV9jcHVzKCkgPiAxICYmICFzbXAgKSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCmluZGV4IGY3NGRmYzQuLjgyNzE0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCkBAIC0xNjgsNiArMTY4LDEyIEBACiAuc2VjdGlvbiAuaW5pdC50ZXh0LCJheCIsQHByb2diaXRzCiAjZW5kaWYKIAorCS8qIERvIGFuIGVhcmx5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBmaXhtYXAgYXJlYSAqLworCW1vdmwgJChzd2FwcGVyX3BnX2RpciAtIF9fUEFHRV9PRkZTRVQpLCAlZWR4CisJbW92bCAkKHN3YXBwZXJfcGdfcG1kIC0gX19QQUdFX09GRlNFVCksICVlYXgKKwlhZGRsICQweDAwNywgJWVheAkJCS8qIDB4MDA3ID0gUFJFU0VOVCtSVytVU0VSICovCisJbW92bCAlZWF4LCA0MDkyKCVlZHgpCisKICNpZmRlZiBDT05GSUdfU01QCiBFTlRSWShzdGFydHVwXzMyX3NtcCkKIAljbGQKQEAgLTUwNyw2ICs1MTMsOCBAQAogLnNlY3Rpb24gIi5ic3MucGFnZV9hbGlnbmVkIiwidyIKIEVOVFJZKHN3YXBwZXJfcGdfZGlyKQogCS5maWxsIDEwMjQsNCwwCitFTlRSWShzd2FwcGVyX3BnX3BtZCkKKwkuZmlsbCAxMDI0LDQsMAogRU5UUlkoZW1wdHlfemVyb19wYWdlKQogCS5maWxsIDQwOTYsMSwwCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggN2Y4YjdhZi4uMjFkYjhmNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTY2Nyw2ICs2NjcsNyBAQAogCQlzZXRfcGVuZGluZ19pcnEoaSwgY3B1bWFza19vZl9jcHUoMCkpOwogCX0KIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKCA7IDsgKSB7CiAJCXRpbWVfcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVfcmVtYWluaW5nKTsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKaW5kZXggZmJhMTIxZi4uMDNiN2Y1NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAlsYXN0X2lycV9zdW1zIFtOUl9DUFVTXSwKIAlhbGVydF9jb3VudGVyIFtOUl9DUFVTXTsKIAotdm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2cgKHZvaWQpCit2b2lkIHRvdWNoX25taV93YXRjaGRvZyh2b2lkKQogewogCWlmIChubWlfd2F0Y2hkb2cgPiAwKSB7CiAJCXVuc2lnbmVkIGNwdTsKQEAgLTMwNCw4ICszMDQsMTAgQEAKIAkJICogSnVzdCByZXNldCB0aGUgYWxlcnQgY291bnRlcnMsIChvdGhlciBDUFVzIG1pZ2h0IGJlCiAJCSAqIHNwaW5uaW5nIG9uIGxvY2tzIHdlIGhvbGQpOgogCQkgKi8KLQkJZm9yX2VhY2hfcHJlc2VudF9jcHUgKGNwdSkKLQkJCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQkJaWYgKGFsZXJ0X2NvdW50ZXJbY3B1XSkKKwkJCQlhbGVydF9jb3VudGVyW2NwdV0gPSAwOworCQl9CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMDZkZmE2NS4uNmM0OWFjYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTUzOCw4ICs1MzgsMzEgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIG5vaW5saW5lIHZvaWQgX19zd2l0Y2hfdG9feHRyYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfcCwKLQkJCQkgICAgc3RydWN0IHRzc19zdHJ1Y3QgKnRzcykKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAordm9pZCBoYXJkX2Rpc2FibGVfVFNDKHZvaWQpCit7CisJd3JpdGVfY3I0KHJlYWRfY3I0KCkgfCBYODZfQ1I0X1RTRCk7Cit9Cit2b2lkIGRpc2FibGVfVFNDKHZvaWQpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfdGhyZWFkX2ZsYWcoVElGX05PVFNDKSkKKwkJLyoKKwkJICogTXVzdCBmbGlwIHRoZSBDUFUgc3RhdGUgc3luY2hyb25vdXNseSB3aXRoCisJCSAqIFRJRl9OT1RTQyBpbiB0aGUgY3VycmVudCBydW5uaW5nIGNvbnRleHQuCisJCSAqLworCQloYXJkX2Rpc2FibGVfVFNDKCk7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KK3ZvaWQgaGFyZF9lbmFibGVfVFNDKHZvaWQpCit7CisJd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9UU0QpOworfQorI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCisKK3N0YXRpYyBub2lubGluZSB2b2lkCitfX3N3aXRjaF90b194dHJhKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfcCwKKwkJIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpCiB7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKm5leHQ7CiAKQEAgLTU1NSw2ICs1NzgsMTcgQEAKIAkJc2V0X2RlYnVncmVnKG5leHQtPmRlYnVncmVnWzddLCA3KTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAorCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhwcmV2X3AsIFRJRl9OT1RTQykgXgorCSAgICB0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9OT1RTQykpIHsKKwkJLyogcHJldiBhbmQgbmV4dCBhcmUgZGlmZmVyZW50ICovCisJCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9OT1RTQykpCisJCQloYXJkX2Rpc2FibGVfVFNDKCk7CisJCWVsc2UKKwkJCWhhcmRfZW5hYmxlX1RTQygpOworCX0KKyNlbmRpZgorCiAJaWYgKCF0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9JT19CSVRNQVApKSB7CiAJCS8qCiAJCSAqIERpc2FibGUgdGhlIGJpdG1hcCB2aWEgYW4gaW52YWxpZCBvZmZzZXQuIFdlIHN0aWxsIGNhY2hlCkBAIC01ODYsMzMgKzYyMCw2IEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgdGhlIGNvbnRleHQgc3dpdGNoIGZyb20gcHJldiB0byBuZXh0Ci0gKiBoYXMgdG8gdHdlYWsgdGhlIFRTQyBkaXNhYmxlIGJpdCBpbiB0aGUgY3I0LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV90c2Moc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsCi0JCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3ApCi17Ci0Jc3RydWN0IHRocmVhZF9pbmZvICpwcmV2LCAqbmV4dDsKLQotCS8qCi0JICogZ2NjIHNob3VsZCBlbGltaW5hdGUgdGhlIC0+dGhyZWFkX2luZm8gZGVyZWZlcmVuY2UgaWYKLQkgKiBoYXNfc2VjdXJlX2NvbXB1dGluZyByZXR1cm5zIDAgYXQgY29tcGlsZSB0aW1lIChTRUNDT01QPW4pLgotCSAqLwotCXByZXYgPSB0YXNrX3RocmVhZF9pbmZvKHByZXZfcCk7Ci0JbmV4dCA9IHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKTsKLQotCWlmIChoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSB8fCBoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgewotCQkvKiBzbG93IHBhdGggaGVyZSAqLwotCQlpZiAoaGFzX3NlY3VyZV9jb21wdXRpbmcocHJldikgJiYKLQkJICAgICFoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgewotCQkJd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9UU0QpOwotCQl9IGVsc2UgaWYgKCFoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSAmJgotCQkJICAgaGFzX3NlY3VyZV9jb21wdXRpbmcobmV4dCkpCi0JCQl3cml0ZV9jcjQocmVhZF9jcjQoKSB8IFg4Nl9DUjRfVFNEKTsKLQl9Ci19Ci0KLS8qCiAgKglzd2l0Y2hfdG8oeCx5bikgc2hvdWxkIHN3aXRjaCB0YXNrcyBmcm9tIHggdG8geS4KICAqCiAgKiBXZSBmc2F2ZS9md2FpdCBzbyB0aGF0IGFuIGV4Y2VwdGlvbiBnb2VzIG9mZiBhdCB0aGUgcmlnaHQgdGltZQpAQCAtNjg5LDExICs2OTYsOSBAQAogCS8qCiAJICogTm93IG1heWJlIGhhbmRsZSBkZWJ1ZyByZWdpc3RlcnMgYW5kL29yIElPIGJpdG1hcHMKIAkgKi8KLQlpZiAodW5saWtlbHkoKHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKS0+ZmxhZ3MgJiBfVElGX1dPUktfQ1RYU1cpCi0JICAgIHx8IHRlc3RfdHNrX3RocmVhZF9mbGFnKHByZXZfcCwgVElGX0lPX0JJVE1BUCkpKQotCQlfX3N3aXRjaF90b194dHJhKG5leHRfcCwgdHNzKTsKLQotCWRpc2FibGVfdHNjKHByZXZfcCwgbmV4dF9wKTsKKwlpZiAodW5saWtlbHkodGFza190aHJlYWRfaW5mbyhwcmV2X3ApLT5mbGFncyAmIF9USUZfV09SS19DVFhTV19QUkVWIHx8CisJCSAgICAgdGFza190aHJlYWRfaW5mbyhuZXh0X3ApLT5mbGFncyAmIF9USUZfV09SS19DVFhTV19ORVhUKSkKKwkJX19zd2l0Y2hfdG9feHRyYShwcmV2X3AsIG5leHRfcCwgdHNzKTsKIAogCS8qCiAJICogTGVhdmUgbGF6eSBtb2RlLCBmbHVzaGluZyBhbnkgaHlwZXJjYWxscyBtYWRlIGhlcmUuCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCAwYzBjZWVjLi4xYzA3NWY1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTM1OCwxNyArMzU4LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgZGF0YXApOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTM5NSwxMCArMzg3LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCmluZGV4IDkwZGEwNTcuLjE4YzFjMjggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTM5MCw3ICszOTAsNyBAQAogCQl1bnNpZ25lZCBsb25nIGVzcDsKIAkJdW5zaWduZWQgc2hvcnQgc3M7CiAKLQkJcmVwb3J0X2J1ZyhyZWdzLT5laXApOworCQlyZXBvcnRfYnVnKHJlZ3MtPmVpcCwgcmVncyk7CiAKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOwogI2lmZGVmIENPTkZJR19QUkVFTVBUCkBAIC00MzMsNiArNDMzLDcgQEAKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWRpZS5sb2NrX293bmVyID0gLTE7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGllLmxvY2ssIGZsYWdzKTsKIAogCWlmICghcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni92aWRlby9NYWtlZmlsZSBiL2FyY2gvaTM4Ni92aWRlby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzQ0N2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3ZpZGVvL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19GQikgICAgICAgICAgICAgICArPSBmYmRldi5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvdmlkZW8vZmJkZXYuYyBiL2FyY2gvaTM4Ni92aWRlby9mYmRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmIzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvdmlkZW8vZmJkZXYuYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogYXJjaC9pMzg2L3ZpZGVvL2ZiZGV2LmMgLSBpMzg2IEZyYW1lYnVmZmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFudG9uaW5vIERhcGxhcyA8YWRhcGxhc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK2ludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSBpbmZvLT5kZXZpY2U7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkZXZpY2UpCisJCXBjaV9kZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisKKwlpZiAocGNpX2RldikKKwkJcmVzID0gJnBjaV9kZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCisJaWYgKHJlcyAmJiByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fU0hBRE9XKQorCQlyZXR2YWwgPSAxOworCisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woZmJfaXNfcHJpbWFyeV9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L0tjb25maWcgYi9hcmNoL2lhNjQvS2NvbmZpZwppbmRleCBkYjlkZGZmLi42MTZjOTZlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvS2NvbmZpZworKysgYi9hcmNoL2lhNjQvS2NvbmZpZwpAQCAtNTgyLDggKzU4Miw4IEBACiBzb3VyY2UgImFyY2gvaWE2NC9vcHJvZmlsZS9LY29uZmlnIgogCiBjb25maWcgS1BST0JFUwotCWJvb2wgIktwcm9iZXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBLQUxMU1lNUyAmJiBFWFBFUklNRU5UQUwgJiYgTU9EVUxFUworCWJvb2wgIktwcm9iZXMiCisJZGVwZW5kcyBvbiBLQUxMU1lNUyAmJiBNT0RVTEVTCiAJaGVscAogCSAgS3Byb2JlcyBhbGxvd3MgeW91IHRvIHRyYXAgYXQgYWxtb3N0IGFueSBrZXJuZWwgYWRkcmVzcyBhbmQKIAkgIGV4ZWN1dGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIHJlZ2lzdGVyX2twcm9iZSgpIGVzdGFibGlzaGVzCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwppbmRleCBjMWRjYTIyLi5jZDRhZGY1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCisrKyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPiAgICAgICAgIC8qIGh3ZWlnaHQ2NCgpICovCisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogCiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CQkvKiBpYTY0X2dldF9pdGMoKSAqLwogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDMsNiArNDQsOCBAQAogCiAjaW5jbHVkZSA8YXNtL2FjcGktZXh0Lmg+CiAKK2V4dGVybiBpbnQgc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUgKHNpemVfdCBzaXplKTsKKwogI2RlZmluZSBQRlggIklPQzogIgogCiAvKgpAQCAtMjAyNiwxMSArMjAyOSwyNCBAQAogCWlmICghaWE2NF9wbGF0Zm9ybV9pcygiaHB6eDEiKSAmJiAhaWE2NF9wbGF0Zm9ybV9pcygiaHB6eDFfc3dpb3RsYiIpKQogCQlyZXR1cm4gMDsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgJiYgZGVmaW5lZChDT05GSUdfQ1JBU0hfRFVNUCkKKwkvKiBJZiB3ZSBhcmUgYm9vdGluZyBhIGtkdW1wIGtlcm5lbCwgdGhlIHNiYV9pb21tdSB3aWxsCisJICogY2F1c2UgZGV2aWNlcyB0aGF0IHdlcmUgbm90IHNodXRkb3duIHByb3Blcmx5IHRvIE1DQQorCSAqIGFzIHNvb24gYXMgdGhleSBhcmUgdHVybmVkIGJhY2sgb24uICBPdXIgb25seSBvcHRpb24gZm9yCisJICogYSBzdWNjZXNzZnVsIGtkdW1wIGtlcm5lbCBib290IGlzIHRvIHVzZSB0aGUgc3dpb3RsYi4KKwkgKi8KKwlpZiAoZWxmY29yZWhkcl9hZGRyIDwgRUxGQ09SRV9BRERSX01BWCkgeworCQlpZiAoc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUoNjQgKiAoMTw8MjApKSAhPSAwKQorCQkJcGFuaWMoIlVuYWJsZSB0byBpbml0aWFsaXplIHNvZnR3YXJlIEkvTyBUTEI6IgorCQkJCSAgIiBUcnkgbWFjaHZlYz1kaWcgYm9vdCBvcHRpb24iKTsKKwkJbWFjaHZlY19pbml0KCJkaWciKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKIAlhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfc2JhX2lvY19kcml2ZXIpOwogCWlmICghaW9jX2xpc3QpIHsKICNpZmRlZiBDT05GSUdfSUE2NF9HRU5FUklDCi0JCWV4dGVybiBpbnQgc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUgKHNpemVfdCBzaXplKTsKLQogCQkvKgogCQkgKiBJZiB3ZSBkaWRuJ3QgZmluZCBzb21ldGhpbmcgc2JhX2lvbW11IGNhbiBjbGFpbSwgd2UKIAkJICogbmVlZCB0byBzZXR1cCB0aGUgc3dpb3RsYiBhbmQgc3dpdGNoIHRvIHRoZSBkaWcgbWFjaHZlYy4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYyBiL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYwppbmRleCAzMDBhY2Q5Li4xMTg5ZDAzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL2Jvb3QvZnctZW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9ib290L2Z3LWVtdS5jCkBAIC0zMjksMTEgKzMyOSw2IEBACiAJc3RyY3B5KHNhbF9zeXN0YWItPnByb2R1Y3RfaWQsICJIUC1zaW11bGF0b3IiKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0lBNjRfU0RWCi0Jc3RyY3B5KHNhbF9zeXN0YWItPm9lbV9pZCwgIkludGVsIik7Ci0Jc3RyY3B5KHNhbF9zeXN0YWItPnByb2R1Y3RfaWQsICJTRFYiKTsKLSNlbmRpZgotCiAJLyogZmlsbCBpbiBhbiBlbnRyeSBwb2ludDogKi8KIAlzYWxfZWQtPnR5cGUgPSBTQUxfREVTQ19FTlRSWV9QT0lOVDsKIAlzYWxfZWQtPnBhbF9wcm9jID0gX19wYShwYWxfZGVzY1swXSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwppbmRleCAzMjRlYTc1Li5lZjI1MmRmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKQEAgLTM2LDEwICszNiw2IEBACiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpZmRlZiBDT05GSUdfS0RCCi0jIGluY2x1ZGUgPGxpbnV4L2tkYi5oPgotI2VuZGlmCi0KICN1bmRlZiBTSU1TRVJJQUxfREVCVUcJLyogZGVmaW5lIHRoaXMgdG8gZ2V0IHNvbWUgZGVidWcgaW5mb3JtYXRpb24gKi8KIAogI2RlZmluZSBLRVlCT0FSRF9JTlRSCTMJLyogbXVzdCBtYXRjaCB3aXRoIHNpbXVsYXRvciEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2JpbmZtdF9lbGYzMi5jIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKaW5kZXggYzA1YmRhNi4uNmY0ZDNkMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZwotZWxmMzJfbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlKQorZWxmMzJfbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlLCB1bnNpZ25lZCBsb25nIHVudXNlZCkKIHsKIAl1bnNpZ25lZCBsb25nIHBnb2ZmID0gKGVwcG50LT5wX3ZhZGRyKSAmIH5JQTMyX1BBR0VfTUFTSzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCmluZGV4IDk5YjY2NWUuLjA2ZWZkMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKQEAgLTMwNCw3ICszMDQsNyBAQAogCWRhdGE4IHN5c19uaV9zeXNjYWxsCS8qIGluaXRfbW9kdWxlICovCiAJZGF0YTggc3lzX25pX3N5c2NhbGwJLyogZGVsZXRlX21vZHVsZSAqLwogCWRhdGE4IHN5c19uaV9zeXNjYWxsCS8qIGdldF9rZXJuZWxfc3ltcyAqLyAgLyogMTMwICovCi0JZGF0YTggc3lzX3F1b3RhY3RsCisJZGF0YTggc3lzMzJfcXVvdGFjdGwKIAlkYXRhOCBzeXNfZ2V0cGdpZAogCWRhdGE4IHN5c19mY2hkaXIKIAlkYXRhOCBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfYmRmbHVzaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKaW5kZXggNzVlYzM0Ny4uNzNjYTg2ZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9rcmVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwppbmRleCA4NTg5ZTg0Li4zZjkyNmMyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwpAQCAtMjQ3LDYgKzI0Nyw5IEBACiAudGltZV9yZWRvOgogCS5wcmVkLnJlbC5tdXRleCBwOCxwOSxwMTAKIAlsZDQuYWNxIHIyOCA9IFtyMjldCS8vIHh0aW1lX2xvY2suc2VxdWVuY2UuIE11c3QgY29tZSBmaXJzdCBmb3IgbG9ja2luZyBwdXJwb3NlcworCTs7CisJYW5kIHIyOCA9IH4xLHIyOAkvLyBNYWtlIHNlcXVlbmNlIGV2ZW4gdG8gZm9yY2UgcmV0cnkgaWYgb2RkCisJOzsKIChwOCkJbW92IHIyID0gYXIuaXRjCQkvLyBDUFVfVElNRVIuIDM2IGNsb2NrcyBsYXRlbmN5ISEhCiAJYWRkIHIyMiA9IElBNjRfVElNRV9JTlRFUlBPTEFUT1JfTEFTVF9DT1VOVEVSX09GRlNFVCxyMjAKIChwOSkJbGQ4IHIyID0gW3IzMF0JCS8vIHJlYWRxKHRpLT5hZGRyZXNzKS4gQ291bGQgYWxzbyBoYXZlIGxhdGVuY3kgaXNzdWVzLi4KQEAgLTI4NCw3ICsyODcsNiBAQAogKHAxNSkJbGQ4IHIxNyA9IFtyMTldLC1JQTY0X1RJTUVTUEVDX1RWX05TRUNfT0ZGU0VUCiAocDcpCWNtcC5uZSBwNyxwMCA9IHIyNSxyMwkvLyBpZiBjbXB4Y2hnIG5vdCBzdWNjZXNzZnVsIHJlZG8KIAkvLyBzaW11bGF0ZSB0Yml0Lm56Lm9yIHA3LHAwID0gcjI4LDAKLQlhbmQgcjI4ID0gfjEscjI4CS8vIE1ha2Ugc2VxdWVuY2UgZXZlbiB0byBmb3JjZSByZXRyeSBpZiBvZGQKIAlnZXRmLnNpZyByMiA9IGY4CiAJbWYKIAlhZGQgcjggPSByOCxyMTgJCS8vIEFkZCB0aW1lIGludGVycG9sYXRvciBvZmZzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwppbmRleCAxODhmYjczLi40ZDk4NjRjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCkBAIC0zOTAsMTAgKzM5MCw2IEBACiAJaWYgKCFlZmlfc2V0dXBfcGNkcF9jb25zb2xlKGNtZGxpbmUpKQogCQllYXJseWNvbnMrKzsKICNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCi0JaWYgKCFlYXJseV9zZXJpYWxfY29uc29sZV9pbml0KGNtZGxpbmUpKQotCQllYXJseWNvbnMrKzsKLSNlbmRpZgogCiAJcmV0dXJuIChlYXJseWNvbnMpID8gMCA6IC0xOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDE1YWQ4NWQuLjNhZWFmMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWRpZS5sb2NrX293bmVyID0gLTE7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWUubG9jayk7CiAKIAlpZiAocGFuaWNfb25fb29wcykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYyBiL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYwppbmRleCA0NDExZDliLi45ZmM5NTUwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9pYTY0L2xpYi9jaGVja3N1bS5jCkBAIC02MCw2ICs2MCw3IEBACiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX2NzdW0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgbG9uZyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKaW5kZXggNmRhOTg1NC4uZGY4ZDViZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKQEAgLTc1MCw5ICs3NTAsMTAgQEAKIAkJCWdvdG8gZXJyb3I7CiAJCX0gZWxzZQogCQlpZiAoKHIgPSBzbl9od3BlcmZfZW51bV9vYmplY3RzKCZub2JqLCAmb2JqcykpID09IDApIHsKKwkJCWludCBjcHVvYmpfaW5kZXggPSAwOworCiAJCQltZW1zZXQocCwgMCwgYS5zeik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbm9iajsgaSsrKSB7Ci0JCQkJaW50IGNwdW9ial9pbmRleCA9IDA7CiAJCQkJaWYgKCFTTl9IV1BFUkZfSVNfTk9ERShvYmpzICsgaSkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCW5vZGUgPSBzbl9od3BlcmZfb2JqX3RvX2Nub2RlKG9ianMgKyBpKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9LY29uZmlnIGIvYXJjaC9tMzJyL0tjb25maWcKaW5kZXggYzNiYjhhNy4uOGNjZjNlNCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL0tjb25maWcKKysrIGIvYXJjaC9tMzJyL0tjb25maWcKQEAgLTMxLDYgKzMxLDkgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBOT19ETUEKKwlkZWZfYm9vbCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jCmluZGV4IDVmMDJiMzEuLjU3YTkyZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYwpAQCAtNTk1LDcgKzU5NSw2IEBACiBzdGF0aWMgaW50CiBkb19wdHJhY2UobG9uZyByZXF1ZXN0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CkBAIC02MDQsMTEgKzYwMyw3IEBACiAJICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwotCQllbHNlCi0JCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJLyoKQEAgLTYyNCwxNSArNjE5LDkgQEAKIAkgKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpOwotCQlpZiAocmV0ID09IHNpemVvZihkYXRhKSkgewotCQkJcmV0ID0gMDsKLQkJCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9QT0tFVEVYVCkgewotCQkJCWludmFsaWRhdGVfY2FjaGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldCA9IC1FSU87Ci0JCX0KKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOworCQlpZiAocmV0ID09IDAgJiYgcmVxdWVzdCA9PSBQVFJBQ0VfUE9LRVRFWFQpCisJCQlpbnZhbGlkYXRlX2NhY2hlKCk7CiAJCWJyZWFrOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL202OGsva2VybmVsL3B0cmFjZS5jCmluZGV4IGNkYmE5ZmQuLjJjZjA2OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTI4LDEwICsxMjgsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCWkgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlpZiAoaSAhPSBzaXplb2YodG1wKSkKLQkJCWdvdG8gb3V0X2VpbzsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCkBAIC0xNjAsOCArMTU3LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSAhPSBzaXplb2YoZGF0YSkpCi0JCQlnb3RvIG91dF9laW87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCBhMjdhNGZhLi40ZTI3NTJhIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCkBAIC0xMTcwLDYgKzExNzAsNyBAQAogCWNvbnNvbGVfdmVyYm9zZSgpOwogCXByaW50aygiJXM6ICUwOHhcbiIsc3RyLG5yKTsKIAlzaG93X3JlZ2lzdGVycyhmcCk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jIGIvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCmluZGV4IGNmNmJiNTEuLjYyMTZmMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKQEAgLTQyMiwzICs0MjIsNCBAQAogCSAgICApOwogICAgIHJldHVybihzdW0pOwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDk0MTk1NWQuLjg0NmY5NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJZnAgPSAoKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilwLT50aHJlYWQua3NwKS0+YTY7CiAJZG8gewogCQlpZiAoZnAgPCBzdGFja19wYWdlK3NpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pIHx8Ci0JCSAgICBmcCA+PSA4MTg0K3N0YWNrX3BhZ2UpCisJCSAgICBmcCA+PSBUSFJFQURfU0laRS04K3N0YWNrX3BhZ2UpCiAJCQlyZXR1cm4gMDsKIAkJcGMgPSAoKHVuc2lnbmVkIGxvbmcgKilmcClbMV07CiAJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKHBjKSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYwppbmRleCBmNTRiNmEzLi5lZjcwY2EwIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3B0cmFjZS5jCkBAIC0xMDYsMTcgKzEwNiw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCQkJaW50IGNvcGllZDsKLQotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwotCQl9CiAKIAkJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE1OSwxMCArMTUxLDcgQEAKIAkJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKaW5kZXggODEzM2IxMC4uODBmNGU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogIGxpbnV4L2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCiAgKgotICogIENvcHlyaWdodCAoQykgMTk5OS0yMDA0ICBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQotICogIENvcHlyaWdodCAoQykgMTk5OCwxOTk5ICBELiBKZWZmIERpb25uZSA8amVmZkBsaW5lby5jYT4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSAgRC4gSmVmZiBEaW9ubmUgPGplZmZAdUNsaW51eC5vcmc+CiAgKiAgQ29weWxlZnQgICgpKSAyMDAwICAgICAgIEphbWVzIEQuIFNjaGV0dGluZSB7amFtZXNAdGVsb3Mtc3lzdGVtcy5jb219CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk4ICAgICAgIEtlbm5ldGggQWxiYW5vd3NraSA8a2phaGRzQGtqYWhkcy5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICAgICAgIEhhbWlzaCBNYWNkb25hbGQKQEAgLTIwLDE3ICsyMCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00NiwzNCArNDIsMTkgQEAKIAogY2hhciBfX2luaXRkYXRhIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CiAKLS8qIHNldHVwIHNvbWUgZHVtbXkgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkIGR1bW15X3dhaXRidXQodm9pZCkKLXsKLX0KK3ZvaWQgKCptYWNoX3RyYXBfaW5pdCkodm9pZCk7CiAKLXZvaWQgKCptYWNoX3NjaGVkX2luaXQpIChpcnFfaGFuZGxlcl90IGhhbmRsZXIpOwotdm9pZCAoKm1hY2hfdGljaykoIHZvaWQgKTsKLS8qIG1hY2hpbmUgZGVwZW5kZW50IGtleWJvYXJkIGZ1bmN0aW9ucyAqLwotaW50ICgqbWFjaF9rZXliX2luaXQpICh2b2lkKTsKLWludCAoKm1hY2hfa2JkcmF0ZSkgKHN0cnVjdCBrYmRfcmVwZWF0ICopOwotdm9pZCAoKm1hY2hfa2JkX2xlZHMpICh1bnNpZ25lZCBpbnQpOwotLyogbWFjaGluZSBkZXBlbmRlbnQgaXJxIGZ1bmN0aW9ucyAqLwotdm9pZCAoKm1hY2hfaW5pdF9JUlEpICh2b2lkKTsKLWlycV9oYW5kbGVyX3QgbWFjaF9kZWZhdWx0X2hhbmRsZXI7Ci1pbnQgKCptYWNoX2dldF9pcnFfbGlzdCkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotdm9pZCAoKm1hY2hfcHJvY2Vzc19pbnQpIChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwotdm9pZCAoKm1hY2hfdHJhcF9pbml0KSAodm9pZCk7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCB0aW1lciBmdW5jdGlvbnMgKi8KLXVuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpICh2b2lkKTsKLXZvaWQgKCptYWNoX2dldHRvZCkgKGludCosIGludCosIGludCosIGludCosIGludCosIGludCopOwotaW50ICgqbWFjaF9od2NsaykgKGludCwgc3RydWN0IHJ0Y190aW1lKik7Ci1pbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSAodW5zaWduZWQgbG9uZyk7Ci12b2lkICgqbWFjaF9ta3NvdW5kKSggdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgdGlja3MgKTsKLXZvaWQgKCptYWNoX3Jlc2V0KSggdm9pZCApOwotdm9pZCAoKndhaXRidXQpKHZvaWQpID0gZHVtbXlfd2FpdGJ1dDsKLXZvaWQgKCptYWNoX2RlYnVnX2luaXQpKHZvaWQpOwotdm9pZCAoKm1hY2hfaGFsdCkoIHZvaWQgKTsKLXZvaWQgKCptYWNoX3Bvd2VyX29mZikoIHZvaWQgKTsKK3ZvaWQgKCptYWNoX3NjaGVkX2luaXQpKGlycV9oYW5kbGVyX3QgaGFuZGxlcik7Cit2b2lkICgqbWFjaF90aWNrKSh2b2lkKTsKK3ZvaWQgKCptYWNoX2dldHRvZCkoaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50Kik7CitpbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSh1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpKHZvaWQpOworCisvKiBtYWNoaW5lIGRlcGVuZGVudCByZWJvb3QgZnVuY3Rpb25zICovCit2b2lkICgqbWFjaF9yZXNldCkodm9pZCk7Cit2b2lkICgqbWFjaF9oYWx0KSh2b2lkKTsKK3ZvaWQgKCptYWNoX3Bvd2VyX29mZikodm9pZCk7CiAKIAogI2lmZGVmIENPTkZJR19NNjgwMDAKQEAgLTEzNCwxMyArMTE1LDYgQEAKIAkjZGVmaW5lCUNQVSAiVU5LTk9XTiIKICNlbmRpZgogCi0vKiAoZXMpICovCi0vKiBub3RlOiB3aHkgaXMgdGhpcyBkZWZpbmVkIGhlcmU/ICB0aGUgbXVzdCBiZSBhIGJldHRlciBwbGFjZSB0byBwdXQgdGhpcyAqLwotI2lmIGRlZmluZWQoIENPTkZJR19URUxPUykgfHwgZGVmaW5lZCggQ09ORklHX1VDRElNTSApIHx8IGRlZmluZWQoIENPTkZJR19VQ1NJTU0gKSB8fCBkZWZpbmVkKENPTkZJR19EUkFHRU4yKSB8fCAoZGVmaW5lZCggQ09ORklHX1BJTE9UICkgJiYgZGVmaW5lZCggQ09ORklHX002ODMyOCApKQotI2RlZmluZSBDQVRfUk9NQVJSQVkKLSNlbmRpZgotLyogKC9lcykgKi8KLQogZXh0ZXJuIGludCBfc3RleHQsIF9ldGV4dCwgX3NkYXRhLCBfZWRhdGEsIF9zYnNzLCBfZWJzcywgX2VuZDsKIGV4dGVybiBpbnQgX3JhbXN0YXJ0LCBfcmFtZW5kOwogCkBAIC0xNDgsMTUgKzEyMiw4IEBACiB7CiAJaW50IGJvb3RtYXBfc2l6ZTsKIAotI2lmIGRlZmluZWQoQ0FUX1JPTUFSUkFZKSAmJiBkZWZpbmVkKERFQlVHKQotCWV4dGVybiBpbnQgX19kYXRhX3JvbV9zdGFydDsKLQlleHRlcm4gaW50IF9fZGF0YV9zdGFydDsKLQlpbnQgKnJvbWFycmF5ID0gKGludCAqKSgoaW50KSAmX19kYXRhX3JvbV9zdGFydCArCi0JCQkgICAgICAoaW50KSZfZWRhdGEgLSAoaW50KSZfX2RhdGFfc3RhcnQpOwotI2VuZGlmCi0KIAltZW1vcnlfc3RhcnQgPSBQQUdFX0FMSUdOKF9yYW1zdGFydCk7Ci0JbWVtb3J5X2VuZCA9IF9yYW1lbmQ7IC8qIGJ5IG5vdyB0aGUgc3RhY2sgaXMgcGFydCBvZiB0aGUgaW5pdCB0YXNrICovCisJbWVtb3J5X2VuZCA9IF9yYW1lbmQ7CiAKIAlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9zdGV4dDsKIAlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CkBAIC0yMjAsMTEgKzE4Nyw3IEBACiAJCShpbnQpICZfc2JzcywgKGludCkgJl9lYnNzKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiS0VSTkVMIC0+IFJPTUZTPTB4JTA2eC0weCUwNnggTUVNPTB4JTA2eC0weCUwNnggIgogCQkiU1RBQ0s9MHglMDZ4LTB4JTA2eFxuIiwKLSNpZmRlZiBDQVRfUk9NQVJSQVkKLQkJKGludCkgcm9tYXJyYXksICgoaW50KSByb21hcnJheSkgKyByb21hcnJheVsyXSwKLSNlbHNlCiAJCShpbnQpICZfZWJzcywgKGludCkgbWVtb3J5X3N0YXJ0LAotI2VuZGlmCiAJCShpbnQpIG1lbW9yeV9zdGFydCwgKGludCkgbWVtb3J5X2VuZCwKIAkJKGludCkgbWVtb3J5X2VuZCwgKGludCkgX3JhbWVuZCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKaW5kZXggYmVkNWY0Ny4uZmRlMDRlMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKQEAgLTgzLDYgKzgzLDcgQEAKIAlwcmludGsoS0VSTl9FTUVSRyAiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlPSUwOGx4KVxuIiwKIAkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBQQUdFX1NJWkUrKHVuc2lnbmVkIGxvbmcpY3VycmVudCk7CiAJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyAqKWZwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9tbS9tZW1vcnkuYyBiL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCmluZGV4IDQxMWU0NTIuLjFhNjZiNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCisrKyBiL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCkBAIC0xNyw5MCArMTcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyoKLSAqIGNhY2hlX2NsZWFyKCkgc2VtYW50aWNzOiBDbGVhciBhbnkgY2FjaGUgZW50cmllcyBmb3IgdGhlIGFyZWEgaW4gcXVlc3Rpb24sCi0gKiB3aXRob3V0IHdyaXRpbmcgYmFjayBkaXJ0eSBlbnRyaWVzIGZpcnN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgZGF0YSB3aWxsCi0gKiBiZSBvdmVyd3JpdHRlbiBhbnl3YXksIGUuZy4gYnkgRE1BIHRvIG1lbW9yeS4gVGhlIHJhbmdlIGlzIGRlZmluZWQgYnkgYQotICogX3BoeXNpY2FsXyBhZGRyZXNzLgotICovCi0KLXZvaWQgY2FjaGVfY2xlYXIgKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCi17Ci19Ci0KLQotLyoKLSAqCURlZmluZSBjYWNoZSBpbnZhbGlkYXRlIGZ1bmN0aW9ucy4gVGhlIENvbGRGaXJlIDU0MDcgaXMgcmVhbGx5Ci0gKgl0aGUgb25seSBwcm9jZXNzb3IgdGhhdCBuZWVkcyB0byBkbyBzb21lIHdvcmsgaGVyZS4gQW55dGhpbmcKLSAqCXRoYXQgaGFzIHNlcGFyYXRlIGRhdGEgYW5kIGluc3RydWN0aW9uIGNhY2hlcyB3aWxsIGJlIGEgcHJvYmxlbS4KLSAqLwotI2lmZGVmIENPTkZJR19NNTQwNwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNhY2hlX2ludmFsaWRhdGVfbGluZXModW5zaWduZWQgbG9uZyBwYWRkciwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nCXNzZXQsIGVzZXQ7Ci0KLQlzc2V0ID0gKHBhZGRyICYgMHgwMDAwMGZmMCk7Ci0JZXNldCA9ICgocGFkZHIgKyBsZW4pICYgMHgwMDAwZmYwKSArIDB4MTA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJub3Bcblx0IgotCQkiY2xybAklJWQwXG5cdCIKLQkJIjE6XG5cdCIKLQkJIm1vdmVsCSUwLCUlYTBcblx0IgotCQkiYWRkbAklJWQwLCUlYTBcblx0IgotCQkiMjpcblx0IgotCQkiLndvcmQJMHhmNGU4XG5cdCIKLQkJImFkZGwJIzB4MTAsJSVhMFxuXHQiCi0JCSJjbXBsCSUxLCUlYTBcblx0IgotCQkiYmx0CTJiXG5cdCIKLQkJImFkZHFsCSMxLCUlZDBcblx0IgotCQkiY21waWwJIzQsJSVkMFxuXHQiCi0JCSJibmUJMWIiCi0JCTogOiAiYSIgKHNzZXQpLCAiYSIgKGVzZXQpIDogImQwIiwgImEwIiApOwotfQotCi0jZWxzZQotI2RlZmluZQljYWNoZV9pbnZhbGlkYXRlX2xpbmVzKGEsYikKLSNlbmRpZgotCi0KLS8qCi0gKiBjYWNoZV9wdXNoKCkgc2VtYW50aWNzOiBXcml0ZSBiYWNrIGFueSBkaXJ0eSBjYWNoZSBkYXRhIGluIHRoZSBnaXZlbiBhcmVhLAotICogYW5kIGludmFsaWRhdGUgdGhlIHJhbmdlIGluIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gSXQgbmVlZHMgbm90IChidXQgbWF5KQotICogaW52YWxpZGF0ZSB0aG9zZSBlbnRyaWVzIGFsc28gaW4gdGhlIGRhdGEgY2FjaGUuIFRoZSByYW5nZSBpcyBkZWZpbmVkIGJ5IGEKLSAqIF9waHlzaWNhbF8gYWRkcmVzcy4KLSAqLwotCi12b2lkIGNhY2hlX3B1c2ggKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCi17Ci0JY2FjaGVfaW52YWxpZGF0ZV9saW5lcyhwYWRkciwgbGVuKTsKLX0KLQotCi0vKgotICogY2FjaGVfcHVzaF92KCkgc2VtYW50aWNzOiBXcml0ZSBiYWNrIGFueSBkaXJ0eSBjYWNoZSBkYXRhIGluIHRoZSBnaXZlbgotICogYXJlYSwgYW5kIGludmFsaWRhdGUgdGhvc2UgZW50cmllcyBhdCBsZWFzdCBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuIFRoaXMKLSAqIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYWZ0ZXIgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGFzCi0gKiBjb2RlIGxhdGVyLiBUaGUgcmFuZ2UgaXMgZGVmaW5lZCBieSBhIF91c2VyX21vZGVfIF92aXJ0dWFsXyBhZGRyZXNzICAob3IsCi0gKiBtb3JlIGV4YWN0bHksIHRoZSBzcGFjZSBpcyBkZWZpbmVkIGJ5IHRoZSAlc2ZjLyVkZmMgcmVnaXN0ZXIuKQotICovCi0KLXZvaWQgY2FjaGVfcHVzaF92ICh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgbGVuKQotewotCWNhY2hlX2ludmFsaWRhdGVfbGluZXModmFkZHIsIGxlbik7Ci19Ci0KLS8qIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuIFRoZQotICogY29kZSBpcyBjb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSBtYXBfY2h1bmsoKS4KKyAqIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuCisgKiBUaGUgY29kZSBpcyBjb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSBtYXBfY2h1bmsoKS4KICAqLwogCiB1bnNpZ25lZCBsb25nIGtlcm5lbF9tYXAodW5zaWduZWQgbG9uZyBwYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggYjVhN2I0Ni4uODkzZTdiYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCkBAIC0xNzQsMTcgKzE3NCw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMzEzLDExICszMDUsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCSAgICA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCAzN2M1NjJjLi5jZTI3N2NiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC0zMjYsNiArMzI2LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAJcHJpbnRrKCIlc1sjJWRdOlxuIiwgc3RyLCArK2RpZV9jb3VudGVyKTsKIAlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zZXR1cC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKaW5kZXggYmRhYWMzNC4uODlmMjkyMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHVuc2lnbmVkIGludCBzYjFfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfdHlwZTsKK0VYUE9SVF9TWU1CT0woc29jX3R5cGUpOwogdW5zaWduZWQgaW50IHBlcmlwaF9yZXY7CiB1bnNpZ25lZCBpbnQgemJidXNfbWh6OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvc2V0dXAuYwppbmRleCBmNGE2MTY5Li4yZDVjNmQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHVuc2lnbmVkIGludCBzYjFfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfdHlwZTsKK0VYUE9SVF9TWU1CT0woc29jX3R5cGUpOwogdW5zaWduZWQgaW50IHBlcmlwaF9yZXY7CiB1bnNpZ25lZCBpbnQgemJidXNfbWh6OwogRVhQT1JUX1NZTUJPTCh6YmJ1c19taHopOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jCmluZGV4IDhhMGRiMzcuLjI2ZWM3NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTg3LDEwICs4Nyw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKIAljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQlpbnQgY29waWVkOwotCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJCWlmIChfX2lzX2NvbXBhdF90YXNrKGNoaWxkKSkgeworCQkJaW50IGNvcGllZDsKIAkJCXVuc2lnbmVkIGludCB0bXA7CiAKIAkJCWFkZHIgJj0gMHhmZmZmZmZmZkw7CkBAIC0xMDUsMTUgKzEwNCw3IEBACiAJCX0KIAkJZWxzZQogI2VuZGlmCi0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQkJcmV0ID0gLUVJTzsKLQkJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQkJZ290byBvdXRfdHNrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCQl9CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0X3RzazsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKaW5kZXggYzNlYzlmMS4uYmJmMDI5YSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKQEAgLTI2NCw2ICsyNjQsNyBAQAogCiAJc2hvd19yZWdzKHJlZ3MpOwogCWR1bXBfc3RhY2soKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTMwMiw3ICszMDMsNyBAQAogCWlmICh1bmxpa2VseShpaXIgPT0gUEFSSVNDX0JVR19CUkVBS19JTlNOICYmICF1c2VyX21vZGUocmVncykpKSB7CiAJCS8qIGNoZWNrIGlmIGEgQlVHKCkgb3IgV0FSTigpIHRyYXBwZWQgaGVyZS4gICovCiAJCWVudW0gYnVnX3RyYXBfdHlwZSB0dDsKLQkJdHQgPSByZXBvcnRfYnVnKHJlZ3MtPmlhb3FbMF0gJiB+Myk7CisJCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5pYW9xWzBdICYgfjMsIHJlZ3MpOwogCQlpZiAodHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5pYW9xWzBdICs9IDQ7CiAJCQlyZWdzLT5pYW9xWzFdICs9IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMKaW5kZXggMzIyMTY3Ny4uY2Y3ODBjYiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAJCS8qIEhhbmRsZSBzb21lIGZyZXF1ZW50IHNwZWNpYWwgY2FzZXMuLi4uICovCiAJCXsKLQkJCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOKzFdOworCQkJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCQkJY2hhciAqbW9kbmFtZTsKIAogCQkJa2FsbHN5bXNfbG9va3VwKGluZm8tPmlwLCBOVUxMLCBOVUxMLCAmbW9kbmFtZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNmJlZWUzMi4uZDg2MGI2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTQsMTcgKzQsNyBAQAogCiBtYWlubWVudSAiTGludXgvUG93ZXJQQyBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAotY29uZmlnIFBQQzY0Ci0JYm9vbCAiNjQtYml0IGtlcm5lbCIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoZXRoZXIgYSAzMi1iaXQgb3IgYSA2NC1iaXQga2VybmVsCi0JICB3aWxsIGJlIGJ1aWx0LgotCi1jb25maWcgUFBDX1BNX05FRURTX1JUQ19MSUIKLQlib29sCi0Jc2VsZWN0IFJUQ19MSUIKLQlkZWZhdWx0IHkgaWYgUE0KK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUiCiAKIGNvbmZpZyBQUEMzMgogCWJvb2wKQEAgLTY2LDYgKzU2LDkgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX05PX1ZJUlRfVE9fQlVTCisJZGVmX2Jvb2wgUFBDNjQKKwogY29uZmlnIFBQQwogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTEzMiwxMjMgKzEyNSw2IEBACiAJZGVwZW5kcyBvbiBQUEM2NCAmJiAoQlJPS0VOIHx8IChQUENfUE1BQzY0ICYmIEVYUEVSSU1FTlRBTCkpCiAJZGVmYXVsdCB5CiAKLW1lbnUgIlByb2Nlc3NvciBzdXBwb3J0IgotY2hvaWNlCi0JcHJvbXB0ICJQcm9jZXNzb3IgVHlwZSIKLQlkZXBlbmRzIG9uIFBQQzMyCi0JZGVmYXVsdCA2eHgKLQotY29uZmlnIENMQVNTSUMzMgotCWJvb2wgIjUyeHgvNnh4Lzd4eC83NHh4IgotCXNlbGVjdCBQUENfRlBVCi0Jc2VsZWN0IDZ4eAotCWhlbHAKLQkgIFRoZXJlIGFyZSBmb3VyIGZhbWlsaWVzIG9mIFBvd2VyUEMgY2hpcHMgc3VwcG9ydGVkLiAgVGhlIG1vcmUgY29tbW9uCi0JICB0eXBlcyAoNjAxLCA2MDMsIDYwNCwgNzQwLCA3NTAsIDc0MDApLCB0aGUgTW90b3JvbGEgZW1iZWRkZWQKLQkgIHZlcnNpb25zICg4MjEsIDgyMywgODUwLCA4NTUsIDg2MCwgNTJ4eCwgODJ4eCwgODN4eCksIHRoZSBBTUNDCi0JICBlbWJlZGRlZCB2ZXJzaW9ucyAoNDAzIGFuZCA0MDUpIGFuZCB0aGUgaGlnaCBlbmQgNjQgYml0IFBvd2VyCi0JICBwcm9jZXNzb3JzIChQT1dFUiAzLCBQT1dFUjQsIGFuZCBJQk0gUFBDOTcwIGFsc28ga25vd24gYXMgRzUpLgotCi0JICBUaGlzIG9wdGlvbiBpcyB0aGUgY2F0Y2gtYWxsIGZvciA2eHggdHlwZXMsIGluY2x1ZGluZyBzb21lIG9mIHRoZQotCSAgZW1iZWRkZWQgdmVyc2lvbnMuICBVbmxlc3MgdGhlcmUgaXMgc2VlIGFuIG9wdGlvbiBmb3IgdGhlIHNwZWNpZmljCi0JICBjaGlwIGZhbWlseSB5b3UgYXJlIHVzaW5nLCB5b3Ugd2FudCB0aGlzIG9wdGlvbi4KLQkgIAotCSAgWW91IGRvIG5vdCB3YW50IHRoaXMgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSA2NCBiaXQKLQkgIElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgotCSAgCi0JICBJZiB1bnN1cmUsIHNlbGVjdCB0aGlzIG9wdGlvbgotCSAgCi0JICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBydW5zIGluIDMyLWJpdCBtb2RlIGV2ZW4gb24gNjQtYml0IGNoaXBzLgotCi1jb25maWcgUFBDXzgyeHgKLQlib29sICJGcmVlc2NhbGUgODJ4eCIKLQlzZWxlY3QgNnh4Ci0Jc2VsZWN0IFBQQ19GUFUKLQotY29uZmlnIFBQQ184M3h4Ci0JYm9vbCAiRnJlZXNjYWxlIDgzeHgiCi0Jc2VsZWN0IDZ4eAotCXNlbGVjdCBGU0xfU09DCi0Jc2VsZWN0IDgzeHgKLQlzZWxlY3QgUFBDX0ZQVQotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBQUENfODV4eAotCWJvb2wgIkZyZWVzY2FsZSA4NXh4IgotCXNlbGVjdCBFNTAwCi0Jc2VsZWN0IEZTTF9TT0MKLQlzZWxlY3QgODV4eAotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBQUENfODZ4eAotCWJvb2wgIkZyZWVzY2FsZSA4Nnh4IgotCXNlbGVjdCA2eHgKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCBGU0xfUENJRQotCXNlbGVjdCBQUENfRlBVCi0Jc2VsZWN0IEFMVElWRUMKLQloZWxwCi0JICBUaGUgRnJlZXNjYWxlIEU2MDAgU29DcyBoYXZlIDc0eHggY29yZXMuCi0KLWNvbmZpZyBQUENfOHh4Ci0JYm9vbCAiRnJlZXNjYWxlIDh4eCIKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCA4eHgKLQotY29uZmlnIDQweAotCWJvb2wgIkFNQ0MgNDB4IgotCXNlbGVjdCBQUENfRENSX05BVElWRQotCi1jb25maWcgNDR4Ci0JYm9vbCAiQU1DQyA0NHgiCi0Jc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCi0Jc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKLQotY29uZmlnIEUyMDAKLQlib29sICJGcmVlc2NhbGUgZTIwMCIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBQT1dFUjRfT05MWQotCWJvb2wgIk9wdGltaXplIGZvciBQT1dFUjQiCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIENhdXNlIHRoZSBjb21waWxlciB0byBvcHRpbWl6ZSBmb3IgUE9XRVI0L1BPV0VSNS9QUEM5NzAgcHJvY2Vzc29ycy4KLQkgIFRoZSByZXN1bHRpbmcgYmluYXJ5IHdpbGwgbm90IHdvcmsgb24gUE9XRVIzIG9yIFJTNjQgcHJvY2Vzc29ycwotCSAgd2hlbiBjb21waWxlZCB3aXRoIGJpbnV0aWxzIDIuMTUgb3IgbGF0ZXIuCi0KLWNvbmZpZyBQT1dFUjMKLQlib29sCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgeSBpZiAhUE9XRVI0X09OTFkKLQotY29uZmlnIFBPV0VSNAotCWRlcGVuZHMgb24gUFBDNjQKLQlkZWZfYm9vbCB5Ci0KLWNvbmZpZyA2eHgKLQlib29sCi0KLSMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYwotY29uZmlnIDh4eAotCWJvb2wKLQotIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCi1jb25maWcgODN4eAotCWJvb2wKLQotIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCi1jb25maWcgODV4eAotCWJvb2wKLQotY29uZmlnIEU1MDAKLQlib29sCi0KLWNvbmZpZyBQUENfRlBVCi0JYm9vbAotCWRlZmF1bHQgeSBpZiBQUEM2NAotCiBjb25maWcgUFBDX0RDUl9OQVRJVkUKIAlib29sCiAJZGVmYXVsdCBuCkBAIC0yNjcsMTM0ICsxNDMsNiBAQAogCWRlcGVuZHMgb24gUFBDNjQgIyBub3Qgc3VwcG9ydGVkIG9uIDMyIGJpdHMgeWV0CiAJZGVmYXVsdCBuCiAKLWNvbmZpZyA0eHgKLQlib29sCi0JZGVwZW5kcyBvbiA0MHggfHwgNDR4Ci0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBCT09LRQotCWJvb2wKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMCB8fCA0NHgKLQlkZWZhdWx0IHkKLQotY29uZmlnIEZTTF9CT09LRQotCWJvb2wKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAotCWRlZmF1bHQgeQotCi1jb25maWcgUFRFXzY0QklUCi0JYm9vbAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlkZWZhdWx0IHkgaWYgNDR4Ci0JZGVmYXVsdCB5IGlmIEU1MDAgJiYgUEhZU182NEJJVAotCi1jb25maWcgUEhZU182NEJJVAotCWJvb2wgJ0xhcmdlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydCcgaWYgRTUwMAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUCi0JZGVmYXVsdCB5IGlmIDQ0eAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIGxhcmdlciB0aGFuIDMyLWJpdCBwaHlzaWNhbAotCSAgYWRkcmVzc2VzLiAgVGhpcyBmZWF0dXJlcyBpcyBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBlNTAwIGNvcmVzLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KLQotY29uZmlnIEFMVElWRUMKLQlib29sICJBbHRpVmVjIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDTEFTU0lDMzIgfHwgUE9XRVI0Ci0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIEFsdGl2ZWMgZXh0ZW5zaW9ucyB0byB0aGUKLQkgIFBvd2VyUEMgcHJvY2Vzc29yLiBUaGUga2VybmVsIGN1cnJlbnRseSBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZwotCSAgYWx0aXZlYyByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZSAnYWx0aXZlYyBlbmFibGUnIGJpdCBzbyB1c2VyCi0JICBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgYWx0aXZlYyBpbnN0cnVjdGlvbnMuCi0KLQkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsbHkgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwotCSAgYWx0aXZlYyAoRzQsIG90aGVyd2lzZSBrbm93biBhcyA3NHh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlCi0JICBhbnkgYWZmZWN0IG9uIGEgbm9uLWFsdGl2ZWMgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZQotCSAga2VybmVsKS4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBTUEUKLQlib29sICJTUEUgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIHRoZSBTaWduYWwgUHJvY2Vzc2luZwotCSAgRXh0ZW5zaW9ucyAoU1BFKSB0byB0aGUgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5Ci0JICBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZyBTUEUgcmVnaXN0ZXJzLCBhbmQgdHVybmluZyBvbiB0aGUKLQkgICdzcGUgZW5hYmxlJyBiaXQgc28gdXNlciBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgU1BFIGluc3RydWN0aW9ucy4KLQotCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwotCSAgU1BFIChlNTAwLCBvdGhlcndpc2Uga25vd24gYXMgODV4eCBzZXJpZXMpLCBidXQgZG9lcyBub3QgaGF2ZSBhbnkKLQkgIGVmZmVjdCBvbiBhIG5vbi1zcGUgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZSBrZXJuZWwpLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KLQotY29uZmlnIFBQQ19TVERfTU1VCi0JYm9vbAotCWRlcGVuZHMgb24gNnh4IHx8IFBPV0VSMyB8fCBQT1dFUjQgfHwgUFBDNjQKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBQQ19TVERfTU1VXzMyCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gUFBDX1NURF9NTVUgJiYgUFBDMzIKLQotY29uZmlnIFBQQ19NTV9TTElDRVMKLQlib29sCi0JZGVmYXVsdCB5IGlmIEhVR0VUTEJfUEFHRQotCWRlZmF1bHQgbgotCi1jb25maWcgVklSVF9DUFVfQUNDT1VOVElORwotCWJvb2wgIkRldGVybWluaXN0aWMgdGFzayBhbmQgQ1BVIHRpbWUgYWNjb3VudGluZyIKLQlkZXBlbmRzIG9uIFBQQzY0Ci0JZGVmYXVsdCB5Ci0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBtb3JlIGFjY3VyYXRlIHRhc2sgYW5kIENQVSB0aW1lCi0JICBhY2NvdW50aW5nLiAgVGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgYSBDUFUgY291bnRlciBvbiBlYWNoCi0JICBrZXJuZWwgZW50cnkgYW5kIGV4aXQgYW5kIG9uIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUga2VybmVsCi0JICBiZXR3ZWVuIHN5c3RlbSwgc29mdGlycSBhbmQgaGFyZGlycSBzdGF0ZSwgc28gdGhlcmUgaXMgYQotCSAgc21hbGwgcGVyZm9ybWFuY2UgaW1wYWN0LiAgVGhpcyBhbHNvIGVuYWJsZXMgYWNjb3VudGluZyBvZgotCSAgc3RvbGVuIHRpbWUgb24gbG9naWNhbGx5LXBhcnRpdGlvbmVkIHN5c3RlbXMgcnVubmluZyBvbgotCSAgSUJNIFBPV0VSNS1iYXNlZCBtYWNoaW5lcy4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBTTVAKLQlkZXBlbmRzIG9uIFBQQ19TVERfTU1VCi0JYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQotCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIHNheSBOLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUKLQkgIHRoYW4gb25lIENQVSwgc2F5IFkuICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBjdXJyZW50bHkKLQkgIHN1cHBvcnQgU01QIG1hY2hpbmVzIHdpdGggNjAzLzYwM2UvNjAzZXYgb3IgUFBDNzUwICgiRzMiKSBwcm9jZXNzb3JzCi0JICBzaW5jZSB0aGV5IGhhdmUgaW5hZGVxdWF0ZSBoYXJkd2FyZSBzdXBwb3J0IGZvciBtdWx0aXByb2Nlc3NvcgotCSAgb3BlcmF0aW9uLgotCi0JICBJZiB5b3Ugc2F5IE4gaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUgYW5kIG11bHRpcHJvY2Vzc29yCi0JICBtYWNoaW5lcywgYnV0IHdpbGwgdXNlIG9ubHkgb25lIENQVSBvZiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuIElmCi0JICB5b3Ugc2F5IFkgaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmVzLgotCSAgT24gYSBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gZmFzdGVyIGlmIHlvdSBzYXkKLQkgIE4gaGVyZS4KLQotCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KLQotY29uZmlnIE5SX0NQVVMKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMTI4KSIKLQlyYW5nZSAyIDEyOAotCWRlcGVuZHMgb24gU01QCi0JZGVmYXVsdCAiMzIiIGlmIFBQQzY0Ci0JZGVmYXVsdCAiNCIKLQotY29uZmlnIE5PVF9DT0hFUkVOVF9DQUNIRQotCWJvb2wKLQlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMAotCWRlZmF1bHQgeQotCi1jb25maWcgQ09ORklHX0NIRUNLX0NBQ0hFX0NPSEVSRU5DWQotCWJvb2wKLWVuZG1lbnUKLQogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIgpAQCAtNjc0LDEwICs0MjIsNiBAQAogY29uZmlnIEZTTF9TT0MKIAlib29sCiAKLWNvbmZpZyBGU0xfUENJRQotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ184Nnh4Ci0KICMgWWVzIE1DQSBSUy82MDAwcyBleGlzdCBidXQgTGludXgtUFBDIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGFueQogY29uZmlnIE1DQQogCWJvb2wKQEAgLTY4NSwxMCArNDI5LDEwIEBACiBjb25maWcgUENJCiAJYm9vbCAiUENJIHN1cHBvcnQiIGlmIDQweCB8fCBDUE0yIHx8IFBQQ184M3h4IHx8IFBQQ184NXh4IHx8IFBQQ184Nnh4IFwKIAkJfHwgUFBDX01QQzUyeHggfHwgKEVNQkVEREVEICYmIChQUENfUFNFUklFUyB8fCBQUENfSVNFUklFUykpIFwKLQkJfHwgTVBDNzQ0OEhQQzIgfHwgUFBDX1BTMyB8fCBQUENfSE9MTFkKLQlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFBUFVTICYmICFQUENfODN4eCBcCisJCXx8IFBQQ19QUzMKKwlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFQUENfODN4eCBcCiAJCSYmICFQUENfODV4eCAmJiAhUFBDXzg2eHgKLQlkZWZhdWx0IFBDSV9QRVJNRURJQSBpZiAhNHh4ICYmICFDUE0yICYmICE4eHggJiYgQVBVUworCWRlZmF1bHQgUENJX1BFUk1FRElBIGlmICE0eHggJiYgIUNQTTIgJiYgITh4eAogCWRlZmF1bHQgUENJX1FTUEFOIGlmICE0eHggJiYgIUNQTTIgJiYgOHh4CiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJaGVscApAQCAtODk2LDggKzY0MCw4IEBACiBzb3VyY2UgImFyY2gvcG93ZXJwYy9vcHJvZmlsZS9LY29uZmlnIgogCiBjb25maWcgS1BST0JFUwotCWJvb2wgIktwcm9iZXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiAhQk9PS0UgJiYgITR4eCAmJiBLQUxMU1lNUyAmJiBFWFBFUklNRU5UQUwgJiYgTU9EVUxFUworCWJvb2wgIktwcm9iZXMiCisJZGVwZW5kcyBvbiAhQk9PS0UgJiYgITR4eCAmJiBLQUxMU1lNUyAmJiBNT0RVTEVTCiAJaGVscAogCSAgS3Byb2JlcyBhbGxvd3MgeW91IHRvIHRyYXAgYXQgYWxtb3N0IGFueSBrZXJuZWwgYWRkcmVzcyBhbmQKIAkgIGV4ZWN1dGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIHJlZ2lzdGVyX2twcm9iZSgpIGVzdGFibGlzaGVzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggZmJhZmQ5Ni4uMTg3YTM5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIENQUEZMQUdTX3ZtbGludXgubGRzCTo9IC1VcG93ZXJwYwogCi1CT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB6SW1hZ2UuZHRzIHpJbWFnZS5kdHNfaW5pdHJkIHVJbWFnZQorQk9PVF9UQVJHRVRTID0gekltYWdlIHpJbWFnZS5pbml0cmQgdUltYWdlCiAKIFBIT05ZICs9ICQoQk9PVF9UQVJHRVRTKQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguYyBiL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCmluZGV4IGQ1MTM3N2QuLjlmNjRlODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCkBAIC0zOCwzICszOCw0OCBAQAogCiAJZHRfZml4dXBfbWVtb3J5KDAsIG1lbXNpemUpOwogfQorCisjZGVmaW5lIFNQUk5fREJDUjAJCTB4MTM0CisjZGVmaW5lICAgREJDUjBfUlNUX1NZU1RFTQkweDMwMDAwMDAwCisKK3ZvaWQgaWJtNDR4X2RiY3JfcmVzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWFzbSB2b2xhdGlsZSAoCisJCSJtZnNwcgklMCwlMVxuIgorCQkib3JpcwklMCwlMCwlMkBoXG4iCisJCSJtdHNwcgklMSwlMCIKKwkJOiAiPSZyIih0bXApIDogImkiKFNQUk5fREJDUjApLCAiaSIoREJDUjBfUlNUX1NZU1RFTSkKKwkJKTsKKworfQorCisvKiBSZWFkIDR4eCBFQkMgYnVzIGJyaWRnZSByZWdpc3RlcnMgdG8gZ2V0IG1hcHBpbmdzIG9mIHRoZSBwZXJpcGhlcmFsCisgKiBiYW5rcyBpbnRvIHRoZSBPUEIgYWRkcmVzcyBzcGFjZSAqLwordm9pZCBpYm00eHhfZml4dXBfZWJjX3Jhbmdlcyhjb25zdCBjaGFyICplYmMpCit7CisJdm9pZCAqZGV2cDsKKwl1MzIgYnhjcjsKKwl1MzIgcmFuZ2VzW0VCQ19OVU1fQkFOS1MqNF07CisJdTMyICpwID0gcmFuZ2VzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVCQ19OVU1fQkFOS1M7IGkrKykgeworCQltdGRjcihEQ1JOX0VCQzBfQ0ZHQUREUiwgRUJDX0JYQ1IoaSkpOworCQlieGNyID0gbWZkY3IoRENSTl9FQkMwX0NGR0RBVEEpOworCisJCWlmICgoYnhjciAmIEVCQ19CWENSX0JVKSAhPSBFQkNfQlhDUl9CVV9PRkYpIHsKKwkJCSpwKysgPSBpOworCQkJKnArKyA9IDA7CisJCQkqcCsrID0gYnhjciAmIEVCQ19CWENSX0JBUzsKKwkJCSpwKysgPSBFQkNfQlhDUl9CQU5LX1NJWkUoYnhjcik7CisJCX0KKwl9CisKKwlkZXZwID0gZmluZGRldmljZShlYmMpOworCWlmICghIGRldnApCisJCWZhdGFsKCJDb3VsZG4ndCBsb2NhdGUgRUJDIG5vZGUgJXNcblxyIiwgZWJjKTsKKworCXNldHByb3AoZGV2cCwgInJhbmdlcyIsIHJhbmdlcywgKHAgLSByYW5nZXMpICogc2l6ZW9mKHUzMikpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvNDR4LmggYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguaAppbmRleCA3YjEyOWFkLi41Nzc5ODJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguaApAQCAtMTEsNiArMTEsOSBAQAogI2RlZmluZSBfUFBDX0JPT1RfNDRYX0hfCiAKIHZvaWQgaWJtNDR4X2ZpeHVwX21lbXNpemUodm9pZCk7Cit2b2lkIGlibTR4eF9maXh1cF9lYmNfcmFuZ2VzKGNvbnN0IGNoYXIgKmViYyk7CisKK3ZvaWQgaWJtNDR4X2RiY3JfcmVzZXQodm9pZCk7CiB2b2lkIGVib255X2luaXQodm9pZCAqbWFjMCwgdm9pZCAqbWFjMSk7CiAKICNlbmRpZiAvKiBfUFBDX0JPT1RfNDRYX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGZmMjcwMTkuLjYxYTZmMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC00MywxMCArNDMsMTEgQEAKIAogc3JjLXdsaWIgOj0gc3RyaW5nLlMgY3J0MC5TIHN0ZGlvLmMgbWFpbi5jIGZsYXRkZXZ0cmVlLmMgZmxhdGRldnRyZWVfbWlzYy5jIFwKIAkJbnMxNjU1MC5jIHNlcmlhbC5jIHNpbXBsZV9hbGxvYy5jIGRpdjY0LlMgdXRpbC5TIFwKLQkJZ3VuemlwX3V0aWwuYyBlbGZfdXRpbC5jICQoemxpYikgZGV2dHJlZS5jIFwKLQkJNDR4LmMgZWJvbnkuYyBtdjY0eDYwLmMgbXBzYy5jIG12NjR4NjBfaTJjLmMKKwkJZ3VuemlwX3V0aWwuYyBlbGZfdXRpbC5jICQoemxpYikgZGV2dHJlZS5jIG9mbGliLmMgb2Zjb25zb2xlLmMgXAorCQk0NHguYyBlYm9ueS5jIG12NjR4NjAuYyBtcHNjLmMgbXY2NHg2MF9pMmMuYyBjdWJvb3QuYwogc3JjLXBsYXQgOj0gb2YuYyBjdWJvb3QtODN4eC5jIGN1Ym9vdC04NXh4LmMgaG9sbHkuYyBcCi0JCWN1Ym9vdC1lYm9ueS5jIHRyZWVib290LWVib255LmMgcHJwbWMyODAwLmMKKwkJY3Vib290LWVib255LmMgdHJlZWJvb3QtZWJvbnkuYyBwcnBtYzI4MDAuYyBcCisJCXBzMy1oZWFkLlMgcHMzLWh2Y2FsbC5TIHBzMy5jCiBzcmMtYm9vdCA6PSAkKHNyYy13bGliKSAkKHNyYy1wbGF0KSBlbXB0eS5jCiAKIHNyYy1ib290IDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3JjLWJvb3QpKQpAQCAtNzUsMTEgKzc2LDExIEBACiAkKG9iaikvZW1wdHkuYzoKIAlAdG91Y2ggJEAKIAotJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkczogJChvYmopLyU6ICQoc3JjdHJlZSkvJChzcmMpLyUuUworJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHM6ICQob2JqKS8lOiAkKHNyY3RyZWUpLyQoc3JjKS8lLlMKIAlAY3AgJDwgJEAKIAogY2xlYW4tZmlsZXMgOj0gJCh6bGliKSAkKHpsaWJoZWFkZXIpICQoemxpYmxpbnV4aGVhZGVyKSBcCi0JCWVtcHR5LmMgekltYWdlLmNvZmYubGRzIHpJbWFnZS5sZHMKKwkJZW1wdHkuYyB6SW1hZ2UgekltYWdlLmNvZmYubGRzIHpJbWFnZS5wczMubGRzIHpJbWFnZS5sZHMKIAogcXVpZXRfY21kX2Jvb3RjYyA9IEJPT1RDQyAgJEAKICAgICAgIGNtZF9ib290Y2MgPSAkKENST1NTMzJDQykgLVdwLC1NRCwkKGRlcGZpbGUpICQoQk9PVENGTEFHUykgLWMgLW8gJEAgJDwKQEAgLTEwMiw3ICsxMDMsNyBAQAogCiB0YXJnZXRzCQkrPSAkKHBhdHN1YnN0ICQob2JqKS8lLCUsJChvYmotYm9vdCkgd3JhcHBlci5hKQogZXh0cmEteQkJOj0gJChvYmopL3dyYXBwZXIuYSAkKG9iai1wbGF0KSAkKG9iaikvZW1wdHkubyBcCi0JCSAgICQob2JqKS96SW1hZ2UubGRzICQob2JqKS96SW1hZ2UuY29mZi5sZHMKKwkJICAgJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHMKIAogd3JhcHBlcgkJOj0kKHNyY3RyZWUpLyQoc3JjKS93cmFwcGVyCiB3cmFwcGVyYml0cwk6PSAkKGV4dHJhLXkpICQoYWRkcHJlZml4ICQob2JqKS8sYWRkbm90ZSBoYWNrLWNvZmYgbWt0cmVlKSBcCkBAIC0xMzIsNyArMTMzLDcgQEAKIGltYWdlLSQoQ09ORklHX1BQQ19DSFJQKQkJKz0gekltYWdlLmNocnAKIGltYWdlLSQoQ09ORklHX1BQQ19FRklLQSkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfUE1BQykJCSs9IHpJbWFnZS5wbWFjCi1pbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHktZWxmCitpbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHkKIGltYWdlLSQoQ09ORklHX1BQQ19QUlBNQzI4MDApCQkrPSB6SW1hZ2UucHJwbWMyODAwCiBpbWFnZS0kKENPTkZJR19QUENfSVNFUklFUykJCSs9IHpJbWFnZS5pc2VyaWVzCiBpbWFnZS0kKENPTkZJR19ERUZBVUxUX1VJTUFHRSkJCSs9IHVJbWFnZQpAQCAtMTU3LDU1ICsxNTgsNDMgQEAKIAogJChhZGRwcmVmaXggJChvYmopLywgJChpbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negogCi1kdHMtICA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHMlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKLWR0cy15IDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0cyUsICQoaW1hZ2UteSkpCi1kdHMteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHMteSkpCi10YXJnZXRzCSs9ICQoaW1hZ2UteSkgJChkdHMteSkKLQotZHRzX2luaXRyZC0gIDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0c19pbml0cmQlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKLWR0c19pbml0cmQteSA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHNfaW5pdHJkJSwgJChpbWFnZS15KSkKLWR0c19pbml0cmQteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHNfaW5pdHJkLXkpKQotdGFyZ2V0cwkrPSAkKGltYWdlLXkpICQoZHRzX2luaXRyZC15KQotCi0kKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negorIyBJZiBDT05GSUdfV0FOVF9ERVZJQ0VfVFJFRSBpcyBzZXQgYW5kIENPTkZJR19ERVZJQ0VfVFJFRSBpc24ndCBhbgorIyBlbXB0eSBzdHJpbmcsIGRlZmluZSAnZHRzJyB0byBiZSBwYXRoIHRvIHRoZSBkdHMKKyMgQ09ORklHX0RFVklDRV9UUkVFIHdpbGwgaGF2ZSAiIiBhcm91bmQgaXQsIG1ha2Ugc3VyZSB0byBzdHJpcCB0aGVtCitpZmVxICgkKENPTkZJR19XQU5UX0RFVklDRV9UUkVFKSx5KQoraWZuZXEgKCQoQ09ORklHX0RFVklDRV9UUkVFKSwiIikKK2R0cyA9ICQoaWYgJChzaGVsbCBlY2hvICQoQ09ORklHX0RFVklDRV9UUkVFKSB8IGdyZXAgJ14vJyksXAorCSwkKHNyY3RyZWUpLyQoc3JjKS9kdHMvKSQoQ09ORklHX0RFVklDRV9UUkVFOiIlIj0lKQorZW5kaWYKK2VuZGlmCiAKICMgRG9uJ3QgcHV0IHRoZSByYW1kaXNrIG9uIHRoZSBwYXR0ZXJuIHJ1bGU7IHdoZW4gaXRzIG1pc3NpbmcgbWFrZSB3aWxsIHRyeQogIyB0aGUgcGF0dGVybiBydWxlIHdpdGggbGVzcyBkZXBlbmRlbmNpZXMgdGhhdCBhbHNvIG1hdGNoZXMgKGV2ZW4gd2l0aCB0aGUKICMgaGFyZCBkZXBlbmRlbmN5IGxpc3RlZCkuCi0kKG9iaikvekltYWdlLmR0c19pbml0cmQuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKGR0cykgJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKKyQob2JqKS96SW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykgJChkdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwkKGR0cyksLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQogCi0kKG9iaikvekltYWdlLmR0cy4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQorJChvYmopL3pJbWFnZS4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosJChkdHMpKQogCi0kKG9iaikvekltYWdlLmluaXRyZC4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQotCi0kKG9iaikvekltYWdlLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqKQorIyBUaGlzIGNhbm5vdCBiZSBpbiB0aGUgcm9vdCBvZiAkKHNyYykgYXMgdGhlIHpJbWFnZSBydWxlIGFsd2F5cyBhZGRzIGEgJChvYmopCisjIHByZWZpeAorJChvYmopL3ZtbGludXguc3RyaXA6IHZtbGludXgKKwkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCiAkKG9iaikvekltYWdlLmlzZXJpZXM6IHZtbGludXgKIAkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCi0kKG9iaikvekltYWdlLnBzMzogdm1saW51eAotCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vICRACiskKG9iaikvekltYWdlLnBzMzogdm1saW51eCAgJCh3cmFwcGVyKSAkKHdyYXBwZXJiaXRzKSAkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cworCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vIHZtbGludXguc3RyaXAKKwkkKGNhbGwgY21kLHdyYXAscHMzLCQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzLCwpCiAKLSQob2JqKS96SW1hZ2UuaW5pdHJkLnBzMzogdm1saW51eAotCUBlY2hvICIgIFdBUk5JTkcgekltYWdlLmluaXRyZC5wczMgbm90IHN1cHBvcnRlZCAoeWV0KSIKLQotJChvYmopL3pJbWFnZS5ob2xseS1lbGY6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLGhvbGx5LCQob2JqKS9kdHMvaG9sbHkuZHRzLCwpCi0KLSQob2JqKS96SW1hZ2UuaW5pdHJkLmhvbGx5LWVsZjogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKG9iaikvcmFtZGlzay5pbWFnZS5negotCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsaG9sbHksJChvYmopL2R0cy9ob2xseS5kdHMsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQorJChvYmopL3pJbWFnZS5pbml0cmQucHMzOiB2bWxpbnV4ICAkKHdyYXBwZXIpICQod3JhcHBlcmJpdHMpICQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzICQob2JqKS9yYW1kaXNrLmltYWdlLmd6CisJJChjYWxsIGNtZCx3cmFwLHBzMywkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cywsJChvYmopL3JhbWRpc2suaW1hZ2UuZ3opCiAKICQob2JqKS91SW1hZ2U6IHZtbGludXggJCh3cmFwcGVyYml0cykKIAkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLHVib290KQogCi0jIENPTkZJR19ERVZJQ0VfVFJFRSB3aWxsIGhhdmUgIiIgYXJvdW5kIGl0LCBtYWtlIHN1cmUgdG8gc3RyaXAgdGhlbQotZHRzID0gJChpZiAkKHNoZWxsIGVjaG8gJChDT05GSUdfREVWSUNFX1RSRUUpIHwgZ3JlcCAnXi8nKSxcCi0JLCQoc3JjdHJlZSkvJChzcmMpL2R0cy8pJChDT05GSUdfREVWSUNFX1RSRUU6IiUiPSUpCi0KICQob2JqKS9jdUltYWdlLiU6IHZtbGludXggJChkdHMpICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCxjdWJvb3QtJCosJChkdHMpKQogCkBAIC0yMTUsMjIgKzIwNCwyMiBAQAogJChvYmopL3RyZWVJbWFnZS4lOiB2bWxpbnV4ICQoZHRzKSAkKHdyYXBwZXJiaXRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdHJlZWJvb3QtJCosJChkdHMpKQogCisjIElmIHRoZXJlIGlzbid0IGEgcGxhdGZvcm0gc2VsZWN0ZWQgdGhlbiBqdXN0IHN0cmlwIHRoZSB2bWxpbnV4LgoraWZlcSAoLCQoaW1hZ2UteSkpCitpbWFnZS15IDo9IHZtbGludXguc3RyaXAKK2VuZGlmCisKICQob2JqKS96SW1hZ2U6CQkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCUBybSAtZiAkQDsgbG4gJDwgJEAKICQob2JqKS96SW1hZ2UuaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGluaXRyZC15KSkKIAlAcm0gLWYgJEA7IGxuICQ8ICRACi0kKG9iaikvekltYWdlLmR0czoJJChhZGRwcmVmaXggJChvYmopLywgJChkdHMteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAotJChvYmopL3pJbWFnZS5kdHNfaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAotCiAKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkPAogCiAjIGFueXRoaW5nIG5vdCBpbiAkKHRhcmdldHMpCi1jbGVhbi1maWxlcyArPSAkKGltYWdlLSkgJChpbml0cmQtKSB6SW1hZ2UgekltYWdlLmluaXRyZCBjdUltYWdlLiogXAotCXRyZWVJbWFnZS4qIHpJbWFnZS5kdHMgekltYWdlLmR0c19pbml0cmQKK2NsZWFuLWZpbGVzICs9ICQoaW1hZ2UtKSAkKGluaXRyZC0pIHpJbWFnZSB6SW1hZ2UuaW5pdHJkIGN1SW1hZ2UuKiB0cmVlSW1hZ2UuKiBcCisJb3RoZXJvcy5ibGQKIAogIyBjbGVhbiB1cCBmaWxlcyBjYWNoZWQgYnkgd3JhcHBlcgogY2xlYW4ta2VybmVsIDo9IHZtbGludXguc3RyaXAgdm1saW51eC5iaW4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODN4eC5jCmluZGV4IDlhZjU1NGUuLjI5NjAyNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTgzeHguYwpAQCAtMTIsMTIgKzEyLDEyIEBACiAKICNpbmNsdWRlICJvcHMuaCIKICNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgImN1Ym9vdC5oIgogCiAjZGVmaW5lIFRBUkdFVF84M3h4CiAjaW5jbHVkZSAicHBjYm9vdC5oIgogCiBzdGF0aWMgYmRfdCBiZDsKLWV4dGVybiBjaGFyIF9lbmRbXTsKIGV4dGVybiBjaGFyIF9kdGJfc3RhcnRbXSwgX2R0Yl9lbmRbXTsKIAogc3RhdGljIHZvaWQgcGxhdGZvcm1fZml4dXBzKHZvaWQpCkBAIC01MiwxNiArNTIsNyBAQAogdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKIHsKLQl1bnNpZ25lZCBsb25nIGVuZF9vZl9yYW0gPSBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemU7Ci0JdW5zaWduZWQgbG9uZyBhdmFpbF9yYW0gPSBlbmRfb2ZfcmFtIC0gKHVuc2lnbmVkIGxvbmcpX2VuZDsKLQotCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOwotCWxvYWRlcl9pbmZvLmluaXRyZF9hZGRyID0gcjQ7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IC0gcjQgOiAwOwotCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwotCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKLQotCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSAtIDEwMjQqMTAyNCwgMzIsIDY0KTsKKwlDVUJPT1RfSU5JVCgpOwogCWZ0X2luaXQoX2R0Yl9zdGFydCwgX2R0Yl9lbmQgLSBfZHRiX3N0YXJ0LCAzMik7CiAJc2VyaWFsX2NvbnNvbGVfaW5pdCgpOwogCXBsYXRmb3JtX29wcy5maXh1cHMgPSBwbGF0Zm9ybV9maXh1cHM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTg1eHguYwppbmRleCBlMjU2MDMxLi4xMGYwZjY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04NXh4LmMKQEAgLTEyLDEyICsxMiwxMiBAQAogCiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfODV4eAogI2luY2x1ZGUgInBwY2Jvb3QuaCIKIAogc3RhdGljIGJkX3QgYmQ7Ci1leHRlcm4gY2hhciBfZW5kW107CiBleHRlcm4gY2hhciBfZHRiX3N0YXJ0W10sIF9kdGJfZW5kW107CiAKIHN0YXRpYyB2b2lkIHBsYXRmb3JtX2ZpeHVwcyh2b2lkKQpAQCAtNTMsMTYgKzUzLDcgQEAKIHZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCiB7Ci0JdW5zaWduZWQgbG9uZyBlbmRfb2ZfcmFtID0gYmQuYmlfbWVtc3RhcnQgKyBiZC5iaV9tZW1zaXplOwotCXVuc2lnbmVkIGxvbmcgYXZhaWxfcmFtID0gZW5kX29mX3JhbSAtICh1bnNpZ25lZCBsb25nKV9lbmQ7Ci0KLQltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsKLQlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IHI0OwotCWxvYWRlcl9pbmZvLmluaXRyZF9zaXplID0gcjQgPyByNSAtIHI0IDogMDsKLQlsb2FkZXJfaW5mby5jbWRsaW5lID0gKGNoYXIgKilyNjsKLQlsb2FkZXJfaW5mby5jbWRsaW5lX2xlbiA9IHI3IC0gcjY7Ci0KLQlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBhdmFpbF9yYW0gLSAxMDI0KjEwMjQsIDMyLCA2NCk7CisJQ1VCT09UX0lOSVQoKTsKIAlmdF9pbml0KF9kdGJfc3RhcnQsIF9kdGJfZW5kIC0gX2R0Yl9zdGFydCwgMzIpOwogCXNlcmlhbF9jb25zb2xlX2luaXQoKTsKIAlwbGF0Zm9ybV9vcHMuZml4dXBzID0gcGxhdGZvcm1fZml4dXBzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWVib255LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYwppbmRleCA0NDY0YzVmLi5jNWYzN2NlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYwpAQCAtMTUsMjggKzE1LDE2IEBACiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKICNpbmNsdWRlICI0NHguaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfNDR4CiAjaW5jbHVkZSAicHBjYm9vdC5oIgogCiBzdGF0aWMgYmRfdCBiZDsKLWV4dGVybiBjaGFyIF9lbmRbXTsKLQotQlNTX1NUQUNLKDQwOTYpOwogCiB2b2lkIHBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQogewotCXVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSA9IGJkLmJpX21lbXN0YXJ0ICsgYmQuYmlfbWVtc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOwotCi0JbWVtY3B5KCZiZCwgKGJkX3QgKilyMywgc2l6ZW9mKGJkKSk7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKLQlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgOiAwOwotCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwotCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKLQotCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSwgMzIsIDY0KTsKLQorCUNVQk9PVF9JTklUKCk7CiAJZWJvbnlfaW5pdCgmYmQuYmlfZW5ldGFkZHIsICZiZC5iaV9lbmV0MWFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc5NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvbXBhdGliaWxpdHkgZm9yIG9sZCAobm90IGRldmljZSB0cmVlIGF3YXJlKSBVLUJvb3QgdmVyc2lvbnMKKyAqCisgKiBBdXRob3I6IFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPgorICogQ29uc29saWRhdGVkIHVzaW5nIG1hY3JvcyBieSBEYXZpZCBHaWJzb24gPGRhdmlkQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIm9wcy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisKKyNpbmNsdWRlICJwcGNib290LmgiCisKK2V4dGVybiBjaGFyIF9lbmRbXTsKK2V4dGVybiBjaGFyIF9kdGJfc3RhcnRbXSwgX2R0Yl9lbmRbXTsKKwordm9pZCBjdWJvb3RfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJIHVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOworCisJbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKKwlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgLSByNCA6IDA7CisJbG9hZGVyX2luZm8uY21kbGluZSA9IChjaGFyICopcjY7CisJbG9hZGVyX2luZm8uY21kbGluZV9sZW4gPSByNyAtIHI2OworCisJc2ltcGxlX2FsbG9jX2luaXQoX2VuZCwgYXZhaWxfcmFtIC0gMTAyNCoxMDI0LCAzMiwgNjQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmggYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJhYTdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfUFBDX0JPT1RfQ1VCT09UX0hfCisjZGVmaW5lIF9QUENfQk9PVF9DVUJPT1RfSF8KKwordm9pZCBjdWJvb3RfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJIHVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSk7CisKKyNkZWZpbmUgQ1VCT09UX0lOSVQoKSBcCisJZG8geyBcCisJCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOyBcCisJCWN1Ym9vdF9pbml0KHI0LCByNSwgcjYsIHI3LCBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemUpOyBcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9QUENfQk9PVF9DVUJPT1RfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2Rjci5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKaW5kZXggODc3YmM5Ny4uMTRiNDRhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKQEAgLTI2LDYgKzI2LDQzIEBACiAjZGVmaW5lCQkJU0RSQU1fQ09ORklHX0JBTktfU0laRShyZWcpCVwKIAkoMHgwMDQwMDAwMCA8PCAoKHJlZyAmIFNEUkFNX0NPTkZJR19TSVpFX01BU0spID4+IDE3KSkKIAorLyogNDQwR1AgRXh0ZXJuYWwgQnVzIENvbnRyb2xsZXIgKEVCQykgKi8KKyNkZWZpbmUgRENSTl9FQkMwX0NGR0FERFIJCQkJMHgwMTIKKyNkZWZpbmUgRENSTl9FQkMwX0NGR0RBVEEJCQkJMHgwMTMKKyNkZWZpbmUgICBFQkNfTlVNX0JBTktTCQkJCQkgIDgKKyNkZWZpbmUgICBFQkNfQjBDUgkJCQkJICAweDAwCisjZGVmaW5lICAgRUJDX0IxQ1IJCQkJCSAgMHgwMQorI2RlZmluZSAgIEVCQ19CMkNSCQkJCQkgIDB4MDIKKyNkZWZpbmUgICBFQkNfQjNDUgkJCQkJICAweDAzCisjZGVmaW5lICAgRUJDX0I0Q1IJCQkJCSAgMHgwNAorI2RlZmluZSAgIEVCQ19CNUNSCQkJCQkgIDB4MDUKKyNkZWZpbmUgICBFQkNfQjZDUgkJCQkJICAweDA2CisjZGVmaW5lICAgRUJDX0I3Q1IJCQkJCSAgMHgwNworI2RlZmluZSAgIEVCQ19CWENSKG4pCQkJCQkgIChuKQorI2RlZmluZQkgICAgRUJDX0JYQ1JfQkFTCQkJCSAgICAweGZmZjAwMDAwCisjZGVmaW5lCSAgICBFQkNfQlhDUl9CUwkJCQkgIAkgICAgMHgwMDBlMDAwMAorI2RlZmluZQkgICAgRUJDX0JYQ1JfQkFOS19TSVpFKHJlZykgXAorCSgweDEwMDAwMCA8PCAoKChyZWcpICYgRUJDX0JYQ1JfQlMpID4+IDE3KSkKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JVCQkJCSAgCSAgICAweDAwMDE4MDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX09GRgkJCSAgCSAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUJICAgICAgRUJDX0JYQ1JfQlVfUk8JCQkgIAkgICAgICAweDAwMDA4MDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX1dPCQkJICAJICAgICAgMHgwMDAxMDAwMAorI2RlZmluZQkgICAgICBFQkNfQlhDUl9CVV9SVwkJCSAgCSAgICAgIDB4MDAwMTgwMDAKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JXCQkJCSAgCSAgICAweDAwMDA2MDAwCisjZGVmaW5lICAgRUJDX0IwQVAJCQkJCSAgMHgxMAorI2RlZmluZSAgIEVCQ19CMUFQCQkJCQkgIDB4MTEKKyNkZWZpbmUgICBFQkNfQjJBUAkJCQkJICAweDEyCisjZGVmaW5lICAgRUJDX0IzQVAJCQkJCSAgMHgxMworI2RlZmluZSAgIEVCQ19CNEFQCQkJCQkgIDB4MTQKKyNkZWZpbmUgICBFQkNfQjVBUAkJCQkJICAweDE1CisjZGVmaW5lICAgRUJDX0I2QVAJCQkJCSAgMHgxNgorI2RlZmluZSAgIEVCQ19CN0FQCQkJCQkgIDB4MTcKKyNkZWZpbmUgICBFQkNfQlhBUChuKQkJCQkJICAoMHgxMCsobikpCisjZGVmaW5lICAgRUJDX0JFQVIJCQkJCSAgMHgyMAorI2RlZmluZSAgIEVCQ19CRVNSCQkJCQkgIDB4MjEKKyNkZWZpbmUgICBFQkNfQ0ZHCQkJCQkgIDB4MjMKKyNkZWZpbmUgICBFQkNfQ0lECQkJCQkgIDB4MjQKKwogLyogNDQwR1AgQ2xvY2ssIFBNLCBjaGlwIGNvbnRyb2wgKi8KICNkZWZpbmUgRENSTl9DUEMwX1NSCQkJCQkweDBiMAogI2RlZmluZSBEQ1JOX0NQQzBfRVIJCQkJCTB4MGIxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2Vib255LmR0cwppbmRleCAwZWMwMmY0Li5jNWY5OTYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9lYm9ueS5kdHMKQEAgLTMxLDggKzMxLDggQEAKIAkJCXJlZyA9IDwwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRmlsbGVkIGluIGJ5IHpJbWFnZQogCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OyAvLyBGaWxsZWQgaW4gYnkgekltYWdlCi0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CiAJCQlpLWNhY2hlLXNpemUgPSA8ODAwMD47IC8qIDMyIGtCICovCiAJCQlkLWNhY2hlLXNpemUgPSA8ODAwMD47IC8qIDMyIGtCICovCiAJCQlkY3ItY29udHJvbGxlcjsKQEAgLTEzNSwxMSArMTM1LDkgQEAKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZpbGxlZCBpbiBieSB6SW1hZ2UKLQkJCQlyYW5nZXMgPSA8MCAwMDAwMDAwMCBmZmYwMDAwMCAxMDAwMDAKLQkJCQkJICAxIDAwMDAwMDAwIDQ4MDAwMDAwIDEwMDAwMAotCQkJCQkgIDIgMDAwMDAwMDAgZmY4MDAwMDAgNDAwMDAwCi0JCQkJCSAgMyAwMDAwMDAwMCA0ODIwMDAwMCAxMDAwMDAKLQkJCQkJICA3IDAwMDAwMDAwIDQ4MzAwMDAwIDEwMDAwMD47CisJCQkJLy8gcmFuZ2VzIHByb3BlcnR5IGlzIHN1cHBsaWVkIGJ5IHpJbWFnZQorCQkJCS8vIGJhc2VkIG9uIGZpcm13YXJlJ3MgY29uZmlndXJhdGlvbiBvZiB0aGUKKwkJCQkvLyBFQkMgYnJpZGdlCiAJCQkJaW50ZXJydXB0cyA9IDw1IDQ+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvbGx5LmR0cwppbmRleCAyNTQ0OTliLi44MGE0ZmFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob2xseS5kdHMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogICAJdHNpMTA5QGMwMDAwMDAwIHsKIAkJZGV2aWNlX3R5cGUgPSAidHNpLWJyaWRnZSI7Ci0JCWNvbXBhdGlibGUgPSAidHNpLWJyaWRnZSI7CisJCWNvbXBhdGlibGUgPSAidHNpMTA5LWJyaWRnZSIsICJ0c2kxMDgtYnJpZGdlIjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyYW5nZXMgPSA8MDAwMDAwMDAgYzAwMDAwMDAgMDAwMTAwMDA+OwpAQCAtNTQsNTIgKzU0LDU1IEBACiAKIAkJaTJjQDcwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKLQkJCWNvbXBhdGlibGUgID0gInRzaS1pMmMiOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWNvbXBhdGlibGUgID0gInRzaTEwOS1pMmMiLCAidHNpMTA4LWkyYyI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8ZSAyPjsKIAkJCXJlZyA9IDw3MDAwIDQwMD47CiAJCX07CiAKLQkJbWRpb0A2MDAwIHsKKwkJTURJTzogbWRpb0A2MDAwIHsKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDktbWRpbyIsICJ0c2kxMDgtbWRpbyI7CisJCQlyZWcgPSA8NjAwMCA1MD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OwogCi0JCQlQSFkxOiBldGhlcm5ldC1waHlANjAwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQljb21wYXRpYmxlID0gImJjbTU0eHgiOwotCQkJCXJlZyA9IDw2MDAwIDUwPjsKLQkJCQlwaHktaWQgPSA8MT47CisJCQlQSFkxOiBldGhlcm5ldC1waHlAMSB7CisJCQkJY29tcGF0aWJsZSA9ICJiY201NDYxYSI7CisJCQkJcmVnID0gPDE+OworCQkJCXR4Yy1yeGMtZGVsYXktZGlzYWJsZTsKIAkJCX07CiAKLQkJCVBIWTI6IGV0aGVybmV0LXBoeUA2NDAwIHsKLQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwotCQkJCWNvbXBhdGlibGUgPSAiYmNtNTR4eCI7Ci0JCQkJcmVnID0gPDYwMDAgNTA+OwotCQkJCXBoeS1pZCA9IDwyPjsKKwkJCVBIWTI6IGV0aGVybmV0LXBoeUAyIHsKKwkJCQljb21wYXRpYmxlID0gImJjbTU0NjFhIjsKKwkJCQlyZWcgPSA8Mj47CisJCQkJdHhjLXJ4Yy1kZWxheS1kaXNhYmxlOwogCQkJfTsKIAkJfTsKIAogCQlldGhlcm5ldEA2MjAwIHsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDktZXRoZXJuZXQiLCAidHNpMTA4LWV0aGVybmV0IjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQlyZWcgPSA8NjAwMCAyMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OworCQkJbWRpby1oYW5kbGUgPSA8Jk1ESU8+OwogCQkJcGh5LWhhbmRsZSA9IDwmUEhZMT47CiAJCX07CiAKIAkJZXRoZXJuZXRANjYwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA5LWV0aGVybmV0IiwgInRzaTEwOC1ldGhlcm5ldCI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcmVnID0gPDY0MDAgMjAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJaW50ZXJydXB0cyA9IDwxMSAyPjsKKwkJCW1kaW8taGFuZGxlID0gPCZNRElPPjsKIAkJCXBoeS1oYW5kbGUgPSA8JlBIWTI+OwogCQl9OwogCkBAIC0xMTAsNyArMTEzLDcgQEAKIAkJCXZpcnR1YWwtcmVnID0gPGMwMDA3ODA4PjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzRjlDNjAwMD47CiAJCQljdXJyZW50LXNwZWVkID0gPDFjMjAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8YyAyPjsKIAkJfTsKIApAQCAtMTIxLDcgKzEyNCw3IEBACiAJCQl2aXJ0dWFsLXJlZyA9IDxjMDAwN2MwOD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8M0Y5QzYwMDA+OwogCQkJY3VycmVudC1zcGVlZCA9IDwxYzIwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPGQgMj47CiAJCX07CiAKQEAgLTEzNiw3ICsxMzksNyBAQAogCiAJCXBjaUAxMDAwIHsKIAkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQljb21wYXRpYmxlID0gInRzaTEwOSI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOS1wY2kiLCAidHNpMTA4LXBjaSI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKQEAgLTE1MCw3ICsxNTMsNyBAQAogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgNDAwMDAwMDAgNDAwMDAwMDAgMCAxMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCA3ZTAwMDAwMCAwIDAwMDEwMDAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw3ZjI4MTU0PjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8MTcgMj47CiAJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CiAJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCkBAIC0xODYsMTMgKzE4OSwxMiBAQAogIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKICAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKICAJCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJfTsKIAkJfTsKIAl9OwogCiAJY2hvc2VuIHsKIAkJbGludXgsc3Rkb3V0LXBhdGggPSAiL3RzaTEwOUBjMDAwMDAwMC9zZXJpYWxANzgwOCI7Ci0JCWJvb3RhcmdzID0gImNvbnNvbGU9dHR5UzAsMTE1MjAwIjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzCmluZGV4IDc2NWMzMDYuLjBlM2QzMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cwpAQCAtNDUsNyArNDUsNyBAQAogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCWRldmljZV90eXBlID0gInRzaS1icmlkZ2UiOworCQlkZXZpY2VfdHlwZSA9ICJ0c2kxMDgtYnJpZGdlIjsKIAkJcmFuZ2VzID0gPDAwMDAwMDAwIGMwMDAwMDAwIDAwMDEwMDAwPjsKIAkJcmVnID0gPGMwMDAwMDAwIDAwMDEwMDAwPjsKIAkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKQEAgLTU1LDI3ICs1NSwyNiBAQAogCQkJaW50ZXJydXB0cyA9IDxFIDA+OwogCQkJcmVnID0gPDcwMDAgNDAwPjsKIAkJCWRldmljZV90eXBlID0gImkyYyI7Ci0JCQljb21wYXRpYmxlICA9ICJ0c2ktaTJjIjsKKwkJCWNvbXBhdGlibGUgID0gInRzaTEwOC1pMmMiOwogCQl9OwogCi0JCW1kaW9ANjAwMCB7CisJCU1ESU86IG1kaW9ANjAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJtZGlvIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LW1kaW8iOworCQkJcmVnID0gPDYwMDAgNTA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAotCQkJcGh5ODogZXRoZXJuZXQtcGh5QDYwMDAgeworCQkJcGh5ODogZXRoZXJuZXQtcGh5QDggewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCWludGVycnVwdHMgPSA8MiAxPjsKLQkJCQlyZWcgPSA8NjAwMCA1MD47Ci0JCQkJcGh5LWlkID0gPDg+OwotCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJcmVnID0gPDg+OwogCQkJfTsKIAotCQkJcGh5OTogZXRoZXJuZXQtcGh5QDY0MDAgeworCQkJcGh5OTogZXRoZXJuZXQtcGh5QDkgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCWludGVycnVwdHMgPSA8MiAxPjsKLQkJCQlyZWcgPSA8NjAwMCA1MD47Ci0JCQkJcGh5LWlkID0gPDk+OwotCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJcmVnID0gPDk+OwogCQkJfTsKIAogCQl9OwpAQCAtODMsMTIgKzgyLDEyIEBACiAJCWV0aGVybmV0QDYyMDAgewogCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gIlRTSS1FVEgiOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDgtZXRoZXJuZXQiOwogCQkJcmVnID0gPDYwMDAgMjAwPjsKIAkJCWFkZHJlc3MgPSBbIDAwIDA2IEQyIDAwIDAwIDAxIF07CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQltZGlvLWhhbmRsZSA9IDwmTURJTz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHk4PjsKIAkJfTsKIApAQCAtOTYsMTIgKzk1LDEyIEBACiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJUU0ktRVRIIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LWV0aGVybmV0IjsKIAkJCXJlZyA9IDw2NDAwIDIwMD47CiAJCQlhZGRyZXNzID0gWyAwMCAwNiBEMiAwMCAwMCAwMiBdOwogCQkJaW50ZXJydXB0cyA9IDwxMSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJbWRpby1oYW5kbGUgPSA8Jk1ESU8+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5OT47CiAJCX07CiAKQEAgLTEzNSw3ICsxMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAJYmlnLWVuZGlhbjsKIAkJfTsKIAkJcGNpQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJ0c2kxMHgiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDgtcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8Mj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMKaW5kZXggNDIzZWVkYy4uMTkzNGI4MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MjcyYWRzLmR0cwpAQCAtMTQsMTIgKzE0LDEwIEBACiAgICAgICAgY29tcGF0aWJsZSA9ICJNUEM4MjYwQURTIjsKICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAjc2l6ZS1jZWxscyA9IDwxPjsKLSAgICAgICBsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKICAgICAgICBjcHVzIHsKICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47Ci0gICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDIwMD47CiAKICAgICAgICAgICAgICAgIFBvd2VyUEMsODI3MkAwIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3R5cGUgPSAiY3B1IjsKQEAgLTMyLDEyICszMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICBidXMtZnJlcXVlbmN5ID0gPDA+OwogICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1mcmVxdWVuY3kgPSA8MD47CiAgICAgICAgICAgICAgICAgICAgICAgIDMyLWJpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyMDE+OwogICAgICAgICAgICAgICAgfTsKICAgICAgICB9OwogCi0gICAgICAgaW50ZXJydXB0LWNvbnRyb2xsZXJAZjgyMDAwMDAgewotICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDxmODIwMDAwMD47CisJCXBjaV9waWM6IGludGVycnVwdC1jb250cm9sbGVyQGY4MjAwMDAwIHsKICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDA+OwogICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwyPjsKICAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyOwpAQCAtNDcsMTUgKzQzLDEzIEBACiAgICAgICAgfTsKICAgICAgICBtZW1vcnkgewogICAgICAgICAgICAgICAgZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLSAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MzAwPjsKICAgICAgICAgICAgICAgIHJlZyA9IDwwMDAwMDAwMCA0MDAwMDAwIGY0NTAwMDAwIDAwMDAwMDIwPjsKICAgICAgICB9OwogCiAgICAgICAgY2hvc2VuIHsKICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hvc2VuIjsKICAgICAgICAgICAgICAgIGxpbnV4LHBsYXRmb3JtID0gPDA+OwotICAgICAgICAgICAgICAgaW50ZXJydXB0LWNvbnRyb2xsZXIgPSA8MTBjMDA+OwotICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDw0MDA+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlciA9IDwmQ3BtX3BpYz47CiAgICAgICAgfTsKIAogICAgICAgIHNvYzgyNzJAZjAwMDAwMDAgewpAQCAtNzAsMjAgKzY0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gIm1kaW8iOwogICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gImZzX2VuZXQiOwogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MCAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyNDUyMD47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJuZXQtcGh5QDAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MjQ1MjAwMD47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47CisJCQlwaHkwOmV0aGVybmV0LXBoeUAwIHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDE3IDQ+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiYW5nID0gWyAxMiAxMiAxMyAwMiAwMiAwMSBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0LXBoeUAxIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDI0NTIwMDE+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJcGh5MTpldGhlcm5ldC1waHlAMSB7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxNyA0PjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiYW5nID0gWyAxMiAxMiAxMyAwMiAwMiAwMSBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwzPjsKQEAgLTEwMSw4ICs5Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMTMwMCAyMCA4NDAwIDEwMCAxMTM4MCAzMD47CiAgICAgICAgICAgICAgICAgICAgICAgIG1hYy1hZGRyZXNzID0gWyAwMCAxMSAyRiA5OSA0MyA1NCBdOwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDIwIDI+OwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgcGh5LWhhbmRsZSA9IDwyNDUyMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5MD47CiAgICAgICAgICAgICAgICAgICAgICAgIHJ4LWNsb2NrID0gPDEzPjsKICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8MTI+OwogICAgICAgICAgICAgICAgfTsKQEAgLTExNSwxNCArMTA2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMTMyMCAyMCA4NTAwIDEwMCAxMTNiMCAzMD47CiAgICAgICAgICAgICAgICAgICAgICAgIG1hYy1hZGRyZXNzID0gWyAwMCAxMSAyRiA5OSA0NCA1NCBdOwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDIxIDI+OwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgcGh5LWhhbmRsZSA9IDwyNDUyMDAxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5MT47CiAgICAgICAgICAgICAgICAgICAgICAgIHJ4LWNsb2NrID0gPDE3PjsKICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8MTg+OwogICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgY3BtQGYwMDAwMDAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDxmMDAwMDAwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTE0Miw3ICsxMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMWEwMCAyMCA4MDAwIDEwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC1zcGVlZCA9IDwxYzIwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyOCAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1zZXR1cCA9IDwwIDAwZmZmZmZmPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eC1jbG9jayA9IDwxPjsKQEAgLTE1NiwxNSArMTQ2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDExYTYwIDIwIDgzMDAgMTAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LXNwZWVkID0gPDFjMjAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDJiIDI+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLXNldHVwID0gPDFiIGZmZmZmZjAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eC1jbG9jayA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyQDEwYzAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwxMGMwMD47CisJCQljcG1fcGljOmludGVycnVwdC1jb250cm9sbGVyQDEwYzAwIHsKICAgICAgICAgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAgICAgICAgICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyOwpAQCAtMTc0LDcgKzE2Myw2IEBACiAJCSAgICAgICBjb21wYXRpYmxlID0gIkNQTTIiOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHBjaUAwNTAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwwNTAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8Mj47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDM+OwpAQCAtMjAyLDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgMiBmODIwMDAwMCA0MyA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgMyBmODIwMDAwMCA0MCA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgNCBmODIwMDAwMCA0MSA4PjsKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxNCA4PjsKICAgICAgICAgICAgICAgICAgICAgICAgYnVzLXJhbmdlID0gPDAgMD47CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgNDAwMDAwMDAKQEAgLTIxNiw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInRhbGl0b3MiOwogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MzAwMDAgMTAwMDA+OwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPGIgMj47Ci0gICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgIG51bS1jaGFubmVscyA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC1maWZvLWxlbiA9IDwxOD47CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMtdW5pdHMtbWFzayA9IDwwMDAwMDA3ZT47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cwppbmRleCAxMTJkZDUxLi40ZmMwYzRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKQEAgLTI3Miw3ICsyNzIsMTMgQEAKIAkJCXJlZyA9IDwyMjAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZxZWljID47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgMDAgMjMgMjMgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDE5PjsKIAkJCXR4LWNsb2NrID0gPDFhPjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkzID47CkBAIC0yODcsNyArMjkzLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMz47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwxNz47CiAJCQl0eC1jbG9jayA9IDwxOD47CiAJCQlwaHktaGFuZGxlID0gPCAmcGh5NCA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKaW5kZXggYmU0YzM1Ny4uNDQ3YzAzZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCkBAIC0yMzEsNyArMjMxLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwNCA5ZiBlZiAwMyAwMiBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MjA+OwogCQkJdHgtY2xvY2sgPSA8MTM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MDA+OwpAQCAtMjQ2LDcgKzI1MiwxMyBAQAogCQkJcmVnID0gPDIyMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgZWYgMDMgMDEgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDE5PjsKIAkJCXR4LWNsb2NrID0gPDFhPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA0PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKaW5kZXggZGIwZDAwMy4uYWU5YmNhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKQEAgLTEzMSw2ICsxMzEsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIwIDggMjEgOCAyMiA4PjsKQEAgLTE0NSw2ICsxNTAsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIzIDggMjQgOCAyNSA4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCmluZGV4IGRmNzczZmEuLjMxMGU4NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cwpAQCAtMTM2LDYgKzEzNiwxMSBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjAgOCAyMSA4IDIyIDg+OwpAQCAtMTUwLDYgKzE1NSwxMSBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjMgOCAyNCA4IDI1IDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKaW5kZXggMzhjODU5NC4uMWU5MTRmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCkBAIC0zMDEsNyArMzAxLDEzIEBACiAJCQlyZWcgPSA8MjAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIDAwIDIzIDIzIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwwPjsKIAkJCXR4LWNsb2NrID0gPDE5PjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkwID47CkBAIC0zMTcsNyArMzIzLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwwPjsKIAkJCXR4LWNsb2NrID0gPDE0PjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkxID47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKaW5kZXggZDkxZTgxYy4uMzY0YTk2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogCQkJY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8NDAwMDA+OwkvLyBMMiwgMjU2SwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDAgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQl9OwogCiAJCWkyY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDMwMDAgMTAwPjsKLQkJCWludGVycnVwdHMgPSA8MWIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJiIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlkZnNycjsKIAkJfTsKQEAgLTgxLDE5ICs4MSwxOSBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDE+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzcgMT47CisJCQkJaW50ZXJydXB0cyA9IDw3IDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwNiw5ICsxMDYsMTQgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMjAsOSArMTI1LDE0IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlhZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAxIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CiAJCX07CkBAIC0xMzQsOSArMTQ0LDE0IEBACiAJCQltb2RlbCA9ICJGRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAyIF07Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDIgXTsKLQkJCWludGVycnVwdHMgPSA8MTkgMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyOSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CiAJCX07CkBAIC0xNDYsNyArMTYxLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTU1LDcgKzE3MCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIAkJcGNpQDgwMDAgewpAQCAtMTYzLDc4ICsxNzgsNzggQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDAyICovCi0JCQkJMTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMTAwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJMTAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJMTAwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQkxMDAwIDAgMCAyICZtcGljIDIgMQorCQkJCTEwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMTAwMCAwIDAgNCAmbXBpYyA0IDEKIAogCQkJCS8qIElEU0VMIDB4MDMgKi8KLQkJCQkxODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkxODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxODAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkxODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkxODAwIDAgMCAxICZtcGljIDQgMQorCQkJCTE4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkxODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgwNCAqLwotCQkJCTIwMDAgMCAwIDEgJm1waWMgMzMgMQotCQkJCTIwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCTIwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTIwMDAgMCAwIDQgJm1waWMgMzIgMQorCQkJCTIwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMjAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkyMDAwIDAgMCAzICZtcGljIDEgMQorCQkJCTIwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBJRFNFTCAweDA1ICovCi0JCQkJMjgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJMjgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMjgwMCAwIDAgMyAmbXBpYyAzNCAxCi0JCQkJMjgwMCAwIDAgNCAmbXBpYyAzMSAxCisJCQkJMjgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkyODAwIDAgMCAyICZtcGljIDMgMQorCQkJCTI4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJMjgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MGMgKi8KLQkJCQk2MDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQk2MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQk2MDAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQk2MDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQk2MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCTYwMDAgMCAwIDIgJm1waWMgMiAxCisJCQkJNjAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQk2MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJLyogSURTRUwgMHgwZCAqLwotCQkJCTY4MDAgMCAwIDEgJm1waWMgMzQgMQotCQkJCTY4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTY4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTY4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTY4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJNjgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQk2ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTY4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDBlICovCi0JCQkJNzAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJNzAwMCAwIDAgMiAmbXBpYyAzNCAxCi0JCQkJNzAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJNzAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJNzAwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQk3MDAwIDAgMCAyICZtcGljIDQgMQorCQkJCTcwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJNzAwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIElEU0VMIDB4MGYgKi8KLQkJCQk3ODAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQk3ODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQk3ODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQk3ODAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQk3ODAwIDAgMCAxICZtcGljIDIgMQorCQkJCTc4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJNzgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQk3ODAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxMiAqLwotCQkJCTkwMDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTkwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTkwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCTkwMDAgMCAwIDQgJm1waWMgMzQgMQorCQkJCTkwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJOTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQk5MDAwIDAgMCAzICZtcGljIDMgMQorCQkJCTkwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkvKiBJRFNFTCAweDEzICovCi0JCQkJOTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJOTgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJOTgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJOTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJOTgwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQk5ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTk4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJOTgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTQgKi8KLQkJCQlhMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQlhMDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQlhMDAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQlhMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQlhMDAwIDAgMCAxICZtcGljIDMgMQorCQkJCWEwMDAgMCAwIDIgJm1waWMgNCAxCisJCQkJYTAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQlhMDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJLyogSURTRUwgMHgxNSAqLwotCQkJCWE4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCWE4MDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCWE4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCWE4MDAgMCAwIDQgJm1waWMgMzEgMT47CisJCQkJYTgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQlhODAwIDAgMCAyICZtcGljIDMgMQorCQkJCWE4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJYTgwMCAwIDAgNCAmbXBpYyAxIDE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDA4IDI+OworCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAwMTAwMDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cwppbmRleCA0ZjJjM2FmLi4wNzAyMDZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCkBAIC01Miw3ICs1Miw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTQxLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODEsMTMgKzgxLDEzIEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMDAsOCArMTAwLDggQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMTMsOCArMTEzLDggQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47IAkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xNDIsNDkgKzE0Miw0OSBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTAgKi8KLQkJCQkwODAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDgwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA4MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwODAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDgwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDgwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDgwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDgwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDExICovCi0JCQkJMDg4MDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDg4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4ODAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMiAoU2xvdCAxKSAqLwotCQkJCTA5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwOTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwOTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTMgKFNsb3QgMikgKi8KLQkJCQkwOTgwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMDk4MDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTA5ODAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkwOTgwMCAwIDAgNCAmbXBpYyAzMCAxCisJCQkJMDk4MDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMDk4MDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMDk4MDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMDk4MDAgMCAwIDQgJm1waWMgMCAxCiAKIAkJCQkvKiBJRFNFTCAweDE0IChTbG90IDMpICovCi0JCQkJMGEwMDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTBhMDAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkwYTAwMCAwIDAgMyAmbXBpYyAzMCAxCi0JCQkJMGEwMDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTBhMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTBhMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTBhMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTBhMDAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxNSAoU2xvdCA0KSAqLwotCQkJCTBhODAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkwYTgwMCAwIDAgMiAmbXBpYyAzMCAxCi0JCQkJMGE4MDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTBhODAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkwYTgwMCAwIDAgMiAmbXBpYyAwIDEKKwkJCQkwYTgwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkwYTgwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIEJ1cyAxIChUdW5kcmEgQnJpZGdlKSAqLwogCQkJCS8qIElEU0VMIDB4MTIgKElTQSBicmlkZ2UpICovCi0JCQkJMTkwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTE5MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxOTAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMTkwMDAgMCAwIDQgJm1waWMgMzMgMT47CisJCQkJMTkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMTkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMTkwMDAgMCAwIDQgJm1waWMgMyAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CkBAIC0yMTYsMTIgKzIxNiwxMiBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTUgKi8KLQkJCQlhODAwIDAgMCAxICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAzICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCA0ICZtcGljIDNiIDE+OworCQkJCWE4MDAgMCAwIDEgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMiAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCAzICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDQgJm1waWMgYiAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOSAyPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTMwMDAwMDAgMCAwMDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCmluZGV4IDMwMzM1OTkuLjgyODU5MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCkBAIC01Miw3ICs1Miw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTQ0LW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODEsMTMgKzgxLDEzIEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8M2EgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDNhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKQEAgLTExNCw3ICsxMTQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxmIDIgMTAgMiAxMSAyPjsKKwkJCWludGVycnVwdHMgPSA8MWYgMiAyMCAyIDIxIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCmluZGV4IGFkOTYzODEuLjlkMGI4NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDgwMDAwPjsJLy8gTDIsIDUxMksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwyNSArODEsMjUgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTEyLDggKzExMiw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKQEAgLTEyNSw4ICsxMjUsOCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEzOSw4ICsxMzksOCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMiBdOwotCQkJaW50ZXJydXB0cyA9IDxmIDIgMTAgMiAxMSAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZiAyIDIwIDIgMjEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQl9OwpAQCAtMTUyLDggKzE1Miw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI3MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAzIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDE1IDIgMTYgMiAxNyAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyNSAyIDI2IDIgMjcgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTM+OwogCQl9OwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ1MDAgMTAwPjsgCS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTE3Myw1OCArMTczLDY0IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIAorCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIHJlZworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1ndXRzIjsKKwkJCXJlZyA9IDxlMDAwMCAxMDAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCX07CisKIAkJcGNpMTogcGNpQDgwMDAgewogCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDFmODAwIDAgMCA3PjsKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDEwICovCi0JCQkJMDgwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDgwMDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4MDAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMSAqLwotCQkJCTA4ODAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwODgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDg4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwODgwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwODgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwODgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwODgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTIgKFNsb3QgMSkgKi8KLQkJCQkwOTAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDkwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA5MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDkwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCi0JCQkJMDk4MDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTA5ODAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkwOTgwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMDk4MDAgMCAwIDQgJm1waWMgMzAgMQorCQkJCTA5ODAwIDAgMCAxICZtcGljIDEgMQorCQkJCTA5ODAwIDAgMCAyICZtcGljIDIgMQorCQkJCTA5ODAwIDAgMCAzICZtcGljIDMgMQorCQkJCTA5ODAwIDAgMCA0ICZtcGljIDAgMQogCiAJCQkJLyogSURTRUwgMHgxNCAoU2xvdCAzKSAqLwotCQkJCTBhMDAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMGEwMDAgMCAwIDMgJm1waWMgMzAgMQotCQkJCTBhMDAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkwYTAwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkwYTAwMCAwIDAgMyAmbXBpYyAwIDEKKwkJCQkwYTAwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MTUgKFNsb3QgNCkgKi8KLQkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJMGE4MDAgMCAwIDIgJm1waWMgMzAgMQotCQkJCTBhODAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkwYTgwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJMGE4MDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMGE4MDAgMCAwIDIgJm1waWMgMCAxCisJCQkJMGE4MDAgMCAwIDMgJm1waWMgMSAxCisJCQkJMGE4MDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KIAkJCQkvKiBJRFNFTCAweDEyIChJU0EgYnJpZGdlKSAqLwotCQkJCTE5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkxOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMTkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMzIDE+OworCQkJCTE5MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTE5MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTE5MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDggMj47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDAxMDAwMDA+OwpAQCAtMjU2LDEyICsyNjIsMTIgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCi0JCQkJYTgwMCAwIDAgMSAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMiAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMyAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyAzYiAxPjsKKwkJCQlhODAwIDAgMCAxICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDIgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIGIgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDkgMj47CisJCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCBhMDAwMDAwMCBhMDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUzMDAwMDAwIDAgMDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCmluZGV4IDk1MWVkOTIuLjE3ZTQ1ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NTUtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwxMyArODEsMTMgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMCw4ICsxMDAsOCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDBkIDIgMGUgMiAxMiAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTEzLDggKzExMyw4IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CiAJCX07CkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTQyLDQ5ICsxNDIsNDkgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDEwICovCi0JCQkJMDgwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDgwMDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4MDAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMSAqLwotCQkJCTA4ODAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwODgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDg4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwODgwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwODgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwODgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwODgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTIgKFNsb3QgMSkgKi8KLQkJCQkwOTAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDkwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA5MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDkwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCi0JCQkJMDk4MDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTA5ODAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkwOTgwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMDk4MDAgMCAwIDQgJm1waWMgMzAgMQorCQkJCTA5ODAwIDAgMCAxICZtcGljIDEgMQorCQkJCTA5ODAwIDAgMCAyICZtcGljIDIgMQorCQkJCTA5ODAwIDAgMCAzICZtcGljIDMgMQorCQkJCTA5ODAwIDAgMCA0ICZtcGljIDAgMQogCiAJCQkJLyogSURTRUwgMHgxNCAoU2xvdCAzKSAqLwotCQkJCTBhMDAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMGEwMDAgMCAwIDMgJm1waWMgMzAgMQotCQkJCTBhMDAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkwYTAwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkwYTAwMCAwIDAgMyAmbXBpYyAwIDEKKwkJCQkwYTAwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MTUgKFNsb3QgNCkgKi8KLQkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJMGE4MDAgMCAwIDIgJm1waWMgMzAgMQotCQkJCTBhODAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkwYTgwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJMGE4MDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMGE4MDAgMCAwIDIgJm1waWMgMCAxCisJCQkJMGE4MDAgMCAwIDMgJm1waWMgMSAxCisJCQkJMGE4MDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KIAkJCQkvKiBJRFNFTCAweDEyIChJU0EgYnJpZGdlKSAqLwotCQkJCTE5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkxOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMTkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMzIDE+OworCQkJCTE5MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTE5MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTE5MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDggMj47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDAxMDAwMDA+OwpAQCAtMjE2LDEyICsyMTYsMTIgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCi0JCQkJYTgwMCAwIDAgMSAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMiAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMyAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyAzYiAxPjsKKwkJCQlhODAwIDAgMCAxICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDIgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIGIgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDkgMj47CisJCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCBhMDAwMDAwMCBhMDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUzMDAwMDAwIDAgMDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzCmluZGV4IDgwNjgyMTUuLjIxY2NhYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSw3ICs2MSw3IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJbWRpb0AyNDUyMCB7CkBAIC03MiwyNSArNzIsMjUgQEAKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMT47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDE+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNyAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDcgMT47CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzcgMT47CisJCQkJaW50ZXJydXB0cyA9IDw3IDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMSw4ICsxMDEsMTQgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAwIEZEIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTE0LDggKzEyMCwxNCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDEgRkQgXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEzMiw3OSArMTQ0LDc5IEBACiAJCQlpbnRlcnJ1cHQtbWFwID0gPAogCiAJCQkJCS8qIElEU0VMIDB4MiAqLwotCQkJCQkgMTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJCSAxMDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkJIDEwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCQkgMTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJCSAxMDAwIDAgMCAxICZtcGljIDEgMQorCQkJCQkgMTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkJIDEwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJCSAxMDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJCS8qIElEU0VMIDB4MyAqLwotCQkJCQkgMTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJCSAxODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkJIDE4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCQkgMTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJCSAxODAwIDAgMCAxICZtcGljIDQgMQorCQkJCQkgMTgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkJIDE4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJCSAxODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJCS8qIElEU0VMIDB4NCAqLwotCQkJCQkgMjAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJCSAyMDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQkJIDIwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCQkgMjAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJCSAyMDAwIDAgMCAxICZtcGljIDMgMQorCQkJCQkgMjAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkJIDIwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJCSAyMDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJCS8qIElEU0VMIDB4NSAgKi8KLQkJCQkJIDI4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCQkgMjgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJCSAyODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkJIDI4MDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCQkgMjgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkJIDI4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJCSAyODAwIDAgMCAzICZtcGljIDQgMQorCQkJCQkgMjgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCQkvKiBJRFNFTCAxMiAqLwotCQkJCQkgNjAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJCSA2MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkJIDYwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCQkgNjAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJCSA2MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCQkgNjAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkJIDYwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJCSA2MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJCS8qIElEU0VMIDEzICovCi0JCQkJCSA2ODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkJIDY4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCQkgNjgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJCSA2ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkJIDY4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJCSA2ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCQkgNjgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkJIDY4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkJLyogSURTRUwgMTQqLwotCQkJCQkgNzAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJCSA3MDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQkJIDcwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCQkgNzAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJCSA3MDAwIDAgMCAxICZtcGljIDMgMQorCQkJCQkgNzAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkJIDcwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJCSA3MDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJCS8qIElEU0VMIDE1ICovCi0JCQkJCSA3ODAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkJIDc4MDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCQkgNzgwMCAwIDAgMyAmbXBpYyAzNCAxCi0JCQkJCSA3ODAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkJIDc4MDAgMCAwIDEgJm1waWMgMiAxCisJCQkJCSA3ODAwIDAgMCAyICZtcGljIDMgMQorCQkJCQkgNzgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQkJIDc4MDAgMCAwIDQgJm1waWMgMSAxCiAKIAkJCQkJLyogSURTRUwgMTggKi8KLQkJCQkJIDkwMDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCQkgOTAwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJCSA5MDAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkJIDkwMDAgMCAwIDQgJm1waWMgMzQgMQorCQkJCQkgOTAwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQkJIDkwMDAgMCAwIDIgJm1waWMgMiAxCisJCQkJCSA5MDAwIDAgMCAzICZtcGljIDMgMQorCQkJCQkgOTAwMCAwIDAgNCAmbXBpYyA0IDEKIAogCQkJCQkvKiBJRFNFTCAxOSAqLwotCQkJCQkgOTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJCSA5ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkJIDk4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCQkgOTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJCSA5ODAwIDAgMCAxICZtcGljIDQgMQorCQkJCQkgOTgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkJIDk4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJCSA5ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJCS8qIElEU0VMIDIwICovCi0JCQkJCSBhMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkJIGEwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCQkgYTAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJCSBhMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkJIGEwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJCSBhMDAwIDAgMCAyICZtcGljIDQgMQorCQkJCQkgYTAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkJIGEwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkJLyogSURTRUwgMjEgKi8KLQkJCQkJIGE4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCQkgYTgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJCSBhODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkJIGE4MDAgMCAwIDQgJm1waWMgMzEgMT47CisJCQkJCSBhODAwIDAgMCAxICZtcGljIDIgMQorCQkJCQkgYTgwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkJIGE4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJCSBhODAwIDAgMCA0ICZtcGljIDEgMT47CiAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDw4IDA+OworCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAxMDAwMDAwPjsKQEAgLTIzNCw3ICsyNDYsNyBAQAogCQkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwogCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJaW50ZXJydXB0cyA9IDwxZSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDJlIDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCXJlZyA9IDw5MGMwMCA4MD47CiAJCQkJYnVpbHQtaW47CkBAIC0yNzUsNyArMjg3LDEzIEBACiAJCQkJbW9kZWwgPSAiRkNDIjsKIAkJCQlkZXZpY2UtaWQgPSA8Mj47CiAJCQkJcmVnID0gPDkxMzIwIDIwIDg4NTAwIDEwMCA5MTNhMCAzMD47Ci0JCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAyIEZEIF07CisJCQkJLyoKKwkJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJCSAqLworCQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJCWNsb2NrLXNldHVwID0gPGZmMDBmZmZmIDI1MDAwMD47CiAJCQkJcngtY2xvY2sgPSA8MTU+OwogCQkJCXR4LWNsb2NrID0gPDE2PjsKQEAgLTI5MCw3ICszMDgsMTMgQEAKIAkJCQltb2RlbCA9ICJGQ0MiOwogCQkJCWRldmljZS1pZCA9IDwzPjsKIAkJCQlyZWcgPSA8OTEzNDAgMjAgODg2MDAgMTAwIDkxM2QwIDMwPjsKLQkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDMgRkQgXTsKKwkJCQkvKgorCQkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkJICovCisJCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQkJY2xvY2stc2V0dXAgPSA8ZmZmZjAwZmYgMzcwMD47CiAJCQkJcngtY2xvY2sgPSA8MTc+OwogCQkJCXR4LWNsb2NrID0gPDE4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cwppbmRleCBhMTIzZWM5Li42YmIxOGYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCkBAIC02MSw3ICs2MSw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTY4LW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNzAsMTQgKzcwLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw4MDAwMD47CS8vIEwyLCA1MTJLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODYsNyArODYsNyBAQAogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzEwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtOTksMjUgKzk5LDI1IEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzEgMT47CisJCQkJaW50ZXJydXB0cyA9IDwxIDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEzMCw4ICsxMzAsMTQgQEAKIAkJCW1vZGVsID0gImVUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisgCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQl9OwpAQCAtMTQzLDggKzE0OSwxNCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKyAJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CiAJCX07CkBAIC0xNTQsNyArMTY2LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTYzLDcgKzE3NSw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTE3Miw3ICsxODQsNyBAQAogCQkJbW9kZWwgPSAiU0VDMiI7CiAJCQljb21wYXRpYmxlID0gInRhbGl0b3MiOwogCQkJcmVnID0gPDMwMDAwIGYwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxZCAyPjsKKwkJCWludGVycnVwdHMgPSA8MmQgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCW51bS1jaGFubmVscyA9IDw0PjsKIAkJCWNoYW5uZWwtZmlmby1sZW4gPSA8MTg+OwpAQCAtMzAwLDcgKzMxMiwxMyBAQAogCQkJcmVnID0gPDIwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgMDAgMjMgMjMgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDA+OwogCQkJdHgtY2xvY2sgPSA8MTk+OwogCQkJcGh5LWhhbmRsZSA9IDwmcWVfcGh5MD47CkBAIC0zMTYsNyArMzM0LDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAxMSAyMiAzMyA0NCA1NSBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MD47CiAJCQl0eC1jbG9jayA9IDwxND47CiAJCQlwaHktaGFuZGxlID0gPCZxZV9waHkxPjsKQEAgLTMzNSwyNSArMzU5LDI1IEBACiAJCQkgKiBnaWFuZmFyJ3MgTURJTyBidXMgKi8KIAkJCXFlX3BoeTA6IGV0aGVybmV0LXBoeUAwMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcWVfcGh5MTogZXRoZXJuZXQtcGh5QDAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlxZV9waHkyOiBldGhlcm5ldC1waHlAMDIgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzEgMT47CisJCQkJaW50ZXJydXB0cyA9IDwxIDE+OwogCQkJCXJlZyA9IDwyPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXFlX3BoeTM6IGV0aGVybmV0LXBoeUAwMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMiAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMzY3LDcgKzM5MSw3IEBACiAJCQlyZWcgPSA8ODAgODA+OwogCQkJYnVpbHQtaW47CiAJCQliaWctZW5kaWFuOwotCQkJaW50ZXJydXB0cyA9IDwxZSAyIDFlIDI+OyAvL2hpZ2g6MzAgbG93OjMwCisJCQlpbnRlcnJ1cHRzID0gPDJlIDIgMmUgMj47IC8vaGlnaDozMCBsb3c6MzAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCmluZGV4IDI2MGIyNjQuLmRiNTZhMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCkBAIC01Niw4ICs1NiwxMiBAQAogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJcmFuZ2VzID0gPDAgZjgwMDAwMDAgMDAxMDAwMDA+OwotCQlyZWcgPSA8ZjgwMDAwMDAgMDAxMDAwMDA+OwkvLyBDQ1NSQkFSIDFNCisJCXJhbmdlcyA9IDwwMDAwMTAwMCBmODAwMTAwMCAwMDBmZjAwMAorCQkJICA4MDAwMDAwMCA4MDAwMDAwMCAyMDAwMDAwMAorCQkJICBlMjAwMDAwMCBlMjAwMDAwMCAwMDEwMDAwMAorCQkJICBhMDAwMDAwMCBhMDAwMDAwMCAyMDAwMDAwMAorCQkJICBlMzAwMDAwMCBlMzAwMDAwMCAwMDEwMDAwMD47CisJCXJlZyA9IDxmODAwMDAwMCAwMDAwMTAwMD47CS8vIENDU1JCQVIKIAkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKIAogCQlpMmNAMzAwMCB7CkBAIC04NiwyNSArOTAsMjUgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw0YSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NGEgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDRhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw0YSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTE3LDcgKzEyMSwxMyBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CkBAIC0xMzAsNyArMTQwLDEzIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKQEAgLTE0Myw3ICsxNTksMTMgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCAwMiBGRCBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwxRiAyIDIwIDIgMjEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwpAQCAtMTU2LDcgKzE3OCwxMyBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI3MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDAzIEZEIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDI1IDIgMjYgMiAyNyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CkBAIC0xODYsNyArMjE0LDcgQEAKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCQlyZWcgPSA8ODAwMCAxMDAwPjsKLQkJCWJ1cy1yYW5nZSA9IDwwIGZlPjsKKwkJCWJ1cy1yYW5nZSA9IDwwIGZmPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MWZjYTA1NT47CkBAIC0yODUsMTcgKzMxMyw4NCBAQAogCQkJCWY4MDAgMCAwIDMgJmk4MjU5IDAgMAogCQkJCWY4MDAgMCAwIDQgJmk4MjU5IDAgMAogCQkJCT47Ci0JCQlpODI1OTogaTgyNTlANGQwIHsKLQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOwotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJYnVpbHQtaW47Ci0JCQkJY29tcGF0aWJsZSA9ICJjaHJwLGlpYyI7Ci0gICAgICAgICAgICAgICAgCSAgICAgICAgYmlnLWVuZGlhbjsKLQkJCQlpbnRlcnJ1cHRzID0gPDQ5IDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdWxpMTU3NUAwIHsKKwkJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMAorCQkJCQkgIDAyMDAwMDAwIDAgODAwMDAwMDAKKwkJCQkJICAwIDIwMDAwMDAwCisJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJICAwIDAwMTAwMDAwPjsKKworCQkJCXBjaV9icmlkZ2VAMCB7CisJCQkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwCisJCQkJCQkgIDAyMDAwMDAwIDAgODAwMDAwMDAKKwkJCQkJCSAgMCAyMDAwMDAwMAorCQkJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwCisJCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJCSAgMCAwMDEwMDAwMD47CisKKwkJCQkJaXNhQDFlIHsKKwkJCQkJCWRldmljZV90eXBlID0gImlzYSI7CisJCQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJCQkJCXJlZyA9IDxmMDAwIDAgMCAwIDA+OworCQkJCQkJcmFuZ2VzID0gPDEgMCAwMTAwMDAwMCAwIDAKKwkJCQkJCQkgIDAwMDAxMDAwPjsKKwkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jmk4MjU5PjsKKworCQkJCQkJaTgyNTk6IGludGVycnVwdC1jb250cm9sbGVyQDIwIHsKKwkJCQkJCQlyZWcgPSA8MSAyMCAyCisJCQkJCQkJICAgICAgIDEgYTAgMgorCQkJCQkJCSAgICAgICAxIDRkMCAyPjsKKwkJCQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOworCQkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQkJCQkJYnVpbHQtaW47CisJCQkJCQkJY29tcGF0aWJsZSA9ICJjaHJwLGlpYyI7CisJCQkJCQkJaW50ZXJydXB0cyA9IDw5IDI+OworCQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQorCQkJCQkJCQk8Jm1waWM+OworCQkJCQkJfTsKKworCQkJCQkJaTgwNDJANjAgeworCQkJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJCXJlZyA9IDwxIDYwIDEgMSA2NCAxPjsKKwkJCQkJCQlpbnRlcnJ1cHRzID0gPDEgMyBjIDM+OworCQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQorCQkJCQkJCQk8Jmk4MjU5PjsKKworCQkJCQkJCWtleWJvYXJkQDAgeworCQkJCQkJCQlyZWcgPSA8MD47CisJCQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLDMwMyI7CisJCQkJCQkJfTsKKworCQkJCQkJCW1vdXNlQDEgeworCQkJCQkJCQlyZWcgPSA8MT47CisJCQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGYwMyI7CisJCQkJCQkJfTsKKwkJCQkJCX07CisKKwkJCQkJCXJ0Y0A3MCB7CisJCQkJCQkJY29tcGF0aWJsZSA9CisJCQkJCQkJCSJwbnBQTlAsYjAwIjsKKwkJCQkJCQlyZWcgPSA8MSA3MCAyPjsKKwkJCQkJCX07CisKKwkJCQkJCWdwaW9ANDAwIHsKKwkJCQkJCQlyZWcgPSA8MSA0MDAgODA+OworCQkJCQkJfTsKKwkJCQkJfTsKKwkJCQl9OwogCQkJfTsKIAogCQl9OwpAQCAtMzE2LDEwICs0MTEsMTAgQEAKIAkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKIAkJCWludGVycnVwdC1tYXAgPSA8CiAJCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0NCAxCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyA0NSAxCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyA0NiAxCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyA0NyAxCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQkwMDAwIDAgMCAyICZtcGljIDUgMQorCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEKIAkJCQk+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY2YWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCmluZGV4IGMwZDA2ZmQuLmU1ZTc3MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCkBAIC0xNSwxMiArMTUsMTAgQEAKIAljb21wYXRpYmxlID0gIm1wYzh4eCI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47Ci0JbGludXgscGhhbmRsZSA9IDwxMDA+OwogCiAJY3B1cyB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJbGludXgscGhhbmRsZSA9IDwyMDA+OwogCiAJCVBvd2VyUEMsODY2QDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKQEAgLTM0LDE0ICszMiwxMiBAQAogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJMzItYml0OwogCQkJaW50ZXJydXB0cyA9IDxmIDI+OwkvLyBkZWNyZW1lbnRlciBpbnRlcnJ1cHQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJbGludXgscGhhbmRsZSA9IDwyMDE+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CiAJCX07CiAJfTsKIAogCW1lbW9yeSB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCWxpbnV4LHBoYW5kbGUgPSA8MzAwPjsKIAkJcmVnID0gPDAwMDAwMDAwIDgwMDAwMD47CiAJfTsKIApAQCAtNTcsMTEgKzUzLDkgQEAKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwogCQkJY29tcGF0aWJsZSA9ICJmc19lbmV0IjsKIAkJCXJlZyA9IDxlODAgOD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPGU4MD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJZXRoZXJuZXQtcGh5QGYgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwMGY+OworCQkJcGh5OiBldGhlcm5ldC1waHlAZiB7CiAJCQkJcmVnID0gPGY+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtNzUsMTIgKzY5LDExIEBACiAJCQlyZWcgPSA8ZTAwIDE4OD47CiAJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDEgRkQgXTsKIAkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJcGh5LWhhbmRsZSA9IDxlODAwZj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeT47CiAJCX07CiAKLQkJcGljQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OworCQltcGM4eHhfcGljOiBwaWNAZmYwMDAwMDAgewogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC05MSw3ICs4NCw2IEBACiAJCX07CiAKIAkJY3BtQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xMDIsMTUgKzk0LDE0IEBACiAJCQljb21tYW5kLXByb2MgPSA8OWMwPjsKIAkJCWJyZy1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgMj47CS8vIGNwbSBlcnJvciBpbnRlcnJ1cHQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCi0JCQlwaWNAOTMwIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPDkzMD47CisJCQljcG1fcGljOiBwaWNAOTMwIHsKIAkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQkJCWludGVycnVwdHMgPSA8NSAyIDAgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CiAJCQkJcmVnID0gPDkzMCAyMD47CiAJCQkJYnVpbHQtaW47CiAJCQkJZGV2aWNlX3R5cGUgPSAiY3BtLXBpYyI7CkBAIC0xMjgsNyArMTE5LDcgQEAKIAkJCQl0eC1jbG9jayA9IDwxPjsKIAkJCQljdXJyZW50LXNwZWVkID0gPDA+OwogCQkJCWludGVycnVwdHMgPSA8NCAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAJCQl9OwogCiAJCQlzbWNAYTkwIHsKQEAgLTE0Miw3ICsxMzMsNyBAQAogCQkJCXR4LWNsb2NrID0gPDI+OwogCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47CiAJCQkJaW50ZXJydXB0cyA9IDwzIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAKIAkJCXNjY0BhMDAgewpAQCAtMTUzLDcgKzE0NCw3IEBACiAJCQkJcmVnID0gPGEwMCAxOCAzYzAwIDgwPjsKIAkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDMgRkQgXTsKIAkJCQlpbnRlcnJ1cHRzID0gPDFlIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAJCX07CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4ODVhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKaW5kZXggMTEwYmY2MS4uZGM3YWI5YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKQEAgLTE1LDEyICsxNSwxMCBAQAogCWNvbXBhdGlibGUgPSAibXBjOHh4IjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKLQlsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKIAljcHVzIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwotCQlsaW51eCxwaGFuZGxlID0gPDIwMD47CiAKIAkJUG93ZXJQQyw4ODVAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwpAQCAtMzQsMTQgKzMyLDEyIEBACiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQkzMi1iaXQ7CiAJCQlpbnRlcnJ1cHRzID0gPGYgMj47CS8vIGRlY3JlbWVudGVyIGludGVycnVwdAotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPDIwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKIAkJfTsKIAl9OwogCiAJbWVtb3J5IHsKIAkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJbGludXgscGhhbmRsZSA9IDwzMDA+OwogCQlyZWcgPSA8MDAwMDAwMDAgODAwMDAwPjsKIAl9OwogCkBAIC01NywyMSArNTMsMTcgQEAKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwogCQkJY29tcGF0aWJsZSA9ICJmc19lbmV0IjsKIAkJCXJlZyA9IDxlODAgOD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPGU4MD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJZXRoZXJuZXQtcGh5QDAgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwMDA+OworCQkJUGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKLQkJCWV0aGVybmV0LXBoeUAxIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPGU4MDAxPjsKKwkJCVBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07Ci0JCQlldGhlcm5ldC1waHlAMiB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDxlODAwMj47CisJCQlQaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtODUsOCArNzcsOCBAQAogCQkJcmVnID0gPGUwMCAxODg+OwogCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAxIEZEIF07CiAJCQlpbnRlcnJ1cHRzID0gPDMgMT47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPGZmMDAwMDAwPjsKLQkJCXBoeS1oYW5kbGUgPSA8ZTgwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CisJCQlwaHktaGFuZGxlID0gPCZQaHkxPjsKIAkJfTsKIAogCQlmZWNAMWUwMCB7CkBAIC05NywxMiArODksMTEgQEAKIAkJCXJlZyA9IDwxZTAwIDE4OD47CiAJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDIgRkQgXTsKIAkJCWludGVycnVwdHMgPSA8NyAxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJcGh5LWhhbmRsZSA9IDxlODAwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTI+OwogCQl9OwogCi0JCXBpY0BmZjAwMDAwMCB7Ci0JCQlsaW51eCxwaGFuZGxlID0gPGZmMDAwMDAwPjsKKwkJTXBjOHh4X3BpYzogcGljQGZmMDAwMDAwIHsKIAkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwpAQCAtMTEyLDggKzEwMywxOCBAQAogCQkJY29tcGF0aWJsZSA9ICJDUE0iOwogCQl9OwogCisJCXBjbWNpYUAwMDgwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscHEtcGNtY2lhIjsKKwkJCWRldmljZV90eXBlID0gInBjbWNpYSI7CisJCQlyZWcgPSA8ODAgODA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CisJCQlpbnRlcnJ1cHRzID0gPGQgMT47CisJCX07CisKIAkJY3BtQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xMjQsMTUgKzEyNSwxNCBAQAogCQkJY29tbWFuZC1wcm9jID0gPDljMD47CiAJCQlicmctZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwwIDI+OwkvLyBjcG0gZXJyb3IgaW50ZXJydXB0Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAotCQkJcGljQDkzMCB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDw5MzA+OworCQkJQ3BtX3BpYzogcGljQDkzMCB7CiAJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDUgMiAwIDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OwogCQkJCXJlZyA9IDw5MzAgMjA+OwogCQkJCWJ1aWx0LWluOwogCQkJCWRldmljZV90eXBlID0gImNwbS1waWMiOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJCQkJdHgtY2xvY2sgPSA8MT47CiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDQgMz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCQkJfTsKIAogCQkJc21jQGE5MCB7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJCQl0eC1jbG9jayA9IDwyPjsKIAkJCQljdXJyZW50LXNwZWVkID0gPDA+OwogCQkJCWludGVycnVwdHMgPSA8MyAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAJCQl9OwogCiAJCQlzY2NAYTQwIHsKQEAgLTE3NSw4ICsxNzUsOCBAQAogCQkJCXJlZyA9IDxhNDAgMTggM2UwMCA4MD47CiAJCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAzIEZEIF07CiAJCQkJaW50ZXJydXB0cyA9IDwxYyAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47Ci0JCQkJcGh5LWhhbmRsZSA9IDxlODAwMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CisJCQkJcGh5LWhhbmRsZSA9IDwmUGh5Mj47CiAJCQl9OwogCQl9OwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHJwbWMyODAwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCmluZGV4IDU2ODk2NWEuLjY5OWQwZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCkBAIC0zMDksNyArMzA5LDcgQEAKIAl9OwogCiAJY2hvc2VuIHsKLQkJYm9vdGFyZ3MgPSAiaXA9b24gY29uc29sZT10dHlNTTAiOworCQlib290YXJncyA9ICJpcD1vbiI7CiAJCWxpbnV4LHN0ZG91dC1wYXRoID0gIi9tdjY0eDYwQGYxMDAwMDAwL21wc2NAODAwMCI7CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHMzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wczMuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OWRlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHMzLmR0cwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIFBTMyBHYW1lIENvbnNvbGUgZGV2aWNlIHRyZWUuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvIHsKKwltb2RlbCA9ICJTb255UFMzIjsKKwljb21wYXRpYmxlID0gInNvbnkscHMzIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKworCWNob3NlbiB7CisJfTsKKworCS8qCisJICogV2UnbGwgZ2V0IHRoZSBzaXplIG9mIHRoZSBib290bWVtIGJsb2NrIGZyb20gbHYxIGFmdGVyIHN0YXJ0dXAsCisJICogc28gd2UnbGwgcHV0IGEgbnVsbCBlbnRyeSBoZXJlLgorCSAqLworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDAgMCAwIDA+OworCX07CisKKwkvKgorCSAqIFRoZSBib290IGNwdSBpcyBhbHdheXMgemVybyBmb3IgUFMzLgorCSAqCisJICogZHRjIGV4cGVjdHMgYSBjbG9jay1mcmVxdWVuY3kgYW5kIHRpbWViYXNlLWZyZXF1ZW5jeSBlbnRyaWVzLCBzbworCSAqIHdlJ2xsIHB1dCBhIG51bGwgZW50cmllcyBoZXJlLiAgVGhlc2Ugd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlcgorCSAqIHN0YXJ0dXAgd2l0aCBkYXRhIGZyb20gbHYxLgorCSAqCisJICogU2VlbXMgdGhlIG9ubHkgd2F5IGN1cnJlbnRseSB0byBpbmRpY2F0ZSBhIHByb2Nlc3NvciBoYXMgbXVsdGlwbGUKKwkgKiB0aHJlYWRzIGlzIHdpdGggYW4gaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MgZW50cnkuICBXZSdsbCBwdXQgb25lCisJICogaGVyZSBzbyB3ZSBjYW4gYnJpbmcgdXAgYm90aCBvZiBvdXJzLiAgU2VlIHNtcF9zZXR1cF9jcHVfbWFwcygpLgorCSAqLworCisJY3B1cyB7CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKworCQljcHVAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MgPSA8MCAxPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWktY2FjaGUtc2l6ZSA9IDw4MDAwPjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDw4MDAwPjsKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDgwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDgwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2Vib255LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9lYm9ueS5jCmluZGV4IGIxMjUxZWUuLjc1ZGFlZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2Vib255LmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZWJvbnkuYwpAQCAtMTAwLDI4ICsxMDAsMTMgQEAKIAlpYm00NDBncF9maXh1cF9jbG9ja3Moc3lzY2xrLCA2ICogMTg0MzIwMCk7CiAJaWJtNDR4X2ZpeHVwX21lbXNpemUoKTsKIAlkdF9maXh1cF9tYWNfYWRkcmVzc2VzKGVib255X21hYzAsIGVib255X21hYzEpOwotfQotCi0jZGVmaW5lIFNQUk5fREJDUjAJCTB4MTM0Ci0jZGVmaW5lICAgREJDUjBfUlNUX1NZU1RFTQkweDMwMDAwMDAwCi0KLXN0YXRpYyB2b2lkIGVib255X2V4aXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWFzbSB2b2xhdGlsZSAoCi0JCSJtZnNwcgklMCwlMVxuIgotCQkib3JpcwklMCwlMCwlMkBoXG4iCi0JCSJtdHNwcgklMSwlMCIKLQkJOiAiPSZyIih0bXApIDogImkiKFNQUk5fREJDUjApLCAiaSIoREJDUjBfUlNUX1NZU1RFTSkKLQkJKTsKLQorCWlibTR4eF9maXh1cF9lYmNfcmFuZ2VzKCIvcGxiL29wYi9lYmMiKTsKIH0KIAogdm9pZCBlYm9ueV9pbml0KHZvaWQgKm1hYzAsIHZvaWQgKm1hYzEpCiB7CiAJcGxhdGZvcm1fb3BzLmZpeHVwcyA9IGVib255X2ZpeHVwczsKLQlwbGF0Zm9ybV9vcHMuZXhpdCA9IGVib255X2V4aXQ7CisJcGxhdGZvcm1fb3BzLmV4aXQgPSBpYm00NHhfZGJjcl9yZXNldDsKIAllYm9ueV9tYWMwID0gbWFjMDsKIAllYm9ueV9tYWMxID0gbWFjMTsKIAlmdF9pbml0KF9kdGJfc3RhcnQsIF9kdGJfZW5kIC0gX2R0Yl9zdGFydCwgMzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCmluZGV4IDU2YjU2YTguLjQxNmRjMzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L21haW4uYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKQEAgLTM2LDggKzM2LDYgQEAKIAl1bnNpZ25lZCBsb25nIHNpemU7CiB9OwogCi10eXBlZGVmIHZvaWQgKCprZXJuZWxfZW50cnlfdCkodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKLQogI3VuZGVmIERFQlVHCiAKIHN0YXRpYyBzdHJ1Y3QgYWRkcl9yYW5nZSBwcmVwX2tlcm5lbCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mLmMKaW5kZXggZDE2ZWUzZS4uMzg1ZTA4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jCkBAIC0xNSw4ICsxNSw3IEBACiAjaW5jbHVkZSAicGFnZS5oIgogI2luY2x1ZGUgIm9wcy5oIgogCi10eXBlZGVmIHZvaWQgKmloYW5kbGU7Ci10eXBlZGVmIHZvaWQgKnBoYW5kbGU7CisjaW5jbHVkZSAib2YuaCIKIAogZXh0ZXJuIGNoYXIgX2VuZFtdOwogCkBAIC0yNSwxNTQgKzI0LDEwIEBACiAjZGVmaW5lIFJBTV9FTkQJCSg1MTI8PDIwKQkvKiBGaXhtZTogdXNlIE9GICovCiAjZGVmaW5lCU9ORV9NQgkJMHgxMDAwMDAKIAotaW50ICgqcHJvbSkgKHZvaWQgKik7CiAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xhaW1fYmFzZTsKIAotc3RhdGljIGludCBjYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKQotewotCWludCBpOwotCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljb25zdCBjaGFyICpzZXJ2aWNlOwotCQlpbnQgbmFyZ3M7Ci0JCWludCBucmV0OwotCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07Ci0JfSBhcmdzOwotCXZhX2xpc3QgbGlzdDsKLQotCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7Ci0JYXJncy5uYXJncyA9IG5hcmdzOwotCWFyZ3MubnJldCA9IG5yZXQ7Ci0KLQl2YV9zdGFydChsaXN0LCBucmV0KTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7Ci0JdmFfZW5kKGxpc3QpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKLQkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKLQotCWlmIChwcm9tKCZhcmdzKSA8IDApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAobnJldCA+IDApPyBhcmdzLmFyZ3NbbmFyZ3NdOiAwOwotfQotCi1zdGF0aWMgaW50IGNhbGxfcHJvbV9yZXQoY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwKLQkJICB1bnNpZ25lZCBpbnQgKnJldHMsIC4uLikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY29uc3QgY2hhciAqc2VydmljZTsKLQkJaW50IG5hcmdzOwotCQlpbnQgbnJldDsKLQkJdW5zaWduZWQgaW50IGFyZ3NbMTJdOwotCX0gYXJnczsKLQl2YV9saXN0IGxpc3Q7Ci0KLQlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCWFyZ3MubmFyZ3MgPSBuYXJnczsKLQlhcmdzLm5yZXQgPSBucmV0OwotCi0JdmFfc3RhcnQobGlzdCwgcmV0cyk7Ci0JZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCi0JCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOwotCXZhX2VuZChsaXN0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCi0JCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7Ci0KLQlpZiAocHJvbSgmYXJncykgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAocmV0cyAhPSAodm9pZCAqKSAwKQotCQlmb3IgKGkgPSAxOyBpIDwgbnJldDsgKytpKQotCQkJcmV0c1tpLTFdID0gYXJncy5hcmdzW25hcmdzK2ldOwotCi0JcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Ci19Ci0KLS8qCi0gKiBPbGRlciBPRidzIHJlcXVpcmUgdGhhdCB3aGVuIGNsYWltaW5nIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgYWRkcmVzc2VzLAotICogd2UgY2xhaW0gdGhlIHBoeXNpY2FsIHNwYWNlIGluIHRoZSAvbWVtb3J5IG5vZGUgYW5kIHRoZSB2aXJ0dWFsCi0gKiBzcGFjZSBpbiB0aGUgY2hvc2VuIG1tdSBub2RlLCBhbmQgdGhlbiBkbyBhIG1hcCBvcGVyYXRpb24gdG8KLSAqIG1hcCB2aXJ0dWFsIHRvIHBoeXNpY2FsLgotICovCi1zdGF0aWMgaW50IG5lZWRfbWFwID0gLTE7Ci1zdGF0aWMgaWhhbmRsZSBjaG9zZW5fbW11Owotc3RhdGljIHBoYW5kbGUgbWVtb3J5OwotCi0vKiByZXR1cm5zIHRydWUgaWYgczIgaXMgYSBwcmVmaXggb2YgczEgKi8KLXN0YXRpYyBpbnQgc3RyaW5nX21hdGNoKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKLXsKLQlmb3IgKDsgKnMyOyArK3MyKQotCQlpZiAoKnMxKysgIT0gKnMyKQotCQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfb2ZfdmVyc2lvbih2b2lkKQotewotCXBoYW5kbGUgb3Byb20sIGNob3NlbjsKLQljaGFyIHZlcnNpb25bNjRdOwotCi0Jb3Byb20gPSBmaW5kZGV2aWNlKCIvb3BlbnByb20iKTsKLQlpZiAob3Byb20gPT0gKHBoYW5kbGUpIC0xKQotCQlyZXR1cm4gMDsKLQlpZiAoZ2V0cHJvcChvcHJvbSwgIm1vZGVsIiwgdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSA8PSAwKQotCQlyZXR1cm4gMDsKLQl2ZXJzaW9uW3NpemVvZih2ZXJzaW9uKS0xXSA9IDA7Ci0JcHJpbnRmKCJPRiB2ZXJzaW9uID0gJyVzJ1xyXG4iLCB2ZXJzaW9uKTsKLQlpZiAoIXN0cmluZ19tYXRjaCh2ZXJzaW9uLCAiT3BlbiBGaXJtd2FyZSwgMS4iKQotCSAgICAmJiAhc3RyaW5nX21hdGNoKHZlcnNpb24sICJGaXJtV29ya3MsMy4iKSkKLQkJcmV0dXJuIDA7Ci0JY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbiIpOwotCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7Ci0JCWNob3NlbiA9IGZpbmRkZXZpY2UoIi9jaG9zZW5AMCIpOwotCQlpZiAoY2hvc2VuID09IChwaGFuZGxlKSAtMSkgewotCQkJcHJpbnRmKCJubyBjaG9zZW5cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKGdldHByb3AoY2hvc2VuLCAibW11IiwgJmNob3Nlbl9tbXUsIHNpemVvZihjaG9zZW5fbW11KSkgPD0gMCkgewotCQlwcmludGYoIm5vIG1tdVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQltZW1vcnkgPSAoaWhhbmRsZSkgY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnkiKTsKLQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgewotCQltZW1vcnkgPSAoaWhhbmRsZSkgY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnlAMCIpOwotCQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgewotCQkJcHJpbnRmKCJubyBtZW1vcnkgbm9kZVxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlwcmludGYoIm9sZCBPRiBkZXRlY3RlZFxyXG4iKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgKmNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHJlc3VsdDsKLQotCWlmIChuZWVkX21hcCA8IDApCi0JCW5lZWRfbWFwID0gY2hlY2tfb2ZfdmVyc2lvbigpOwotCWlmIChhbGlnbiB8fCAhbmVlZF9tYXApCi0JCXJldHVybiAodm9pZCAqKSBjYWxsX3Byb20oImNsYWltIiwgMywgMSwgdmlydCwgc2l6ZSwgYWxpZ24pOwotCi0JcmV0ID0gY2FsbF9wcm9tX3JldCgiY2FsbC1tZXRob2QiLCA1LCAyLCAmcmVzdWx0LCAiY2xhaW0iLCBtZW1vcnksCi0JCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOwotCWlmIChyZXQgIT0gMCB8fCByZXN1bHQgPT0gLTEpCi0JCXJldHVybiAodm9pZCAqKSAtMTsKLQlyZXQgPSBjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIGNob3Nlbl9tbXUsCi0JCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOwotCS8qIDB4MTIgPT0gY29oZXJlbnQgKyByZWFkL3dyaXRlICovCi0JcmV0ID0gY2FsbF9wcm9tKCJjYWxsLW1ldGhvZCIsIDYsIDEsICJtYXAiLCBjaG9zZW5fbW11LAotCQkJMHgxMiwgc2l6ZSwgdmlydCwgdmlydCk7Ci0JcmV0dXJuICh2b2lkICopIHZpcnQ7Ci19Ci0KIHN0YXRpYyB2b2lkICpvZl90cnlfY2xhaW0odW5zaWduZWQgbG9uZyBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CkBAIC0xODQsNyArMzksNyBAQAogI2lmZGVmIERFQlVHCiAJCXByaW50ZigiICAgIHRyeWluZzogMHglMDhseFxuXHIiLCBjbGFpbV9iYXNlKTsKICNlbmRpZgotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpY2xhaW0oY2xhaW1fYmFzZSwgc2l6ZSwgMCk7CisJCWFkZHIgPSAodW5zaWduZWQgbG9uZylvZl9jbGFpbShjbGFpbV9iYXNlLCBzaXplLCAwKTsKIAkJaWYgKCh2b2lkICopYWRkciAhPSAodm9pZCAqKS0xKQogCQkJYnJlYWs7CiAJfQpAQCAtMjA4LDY0ICs2Myw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCAqb2Zfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKLQotCWlmICghcCkKLQkJZmF0YWwoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Iga2VybmVsIGltYWdlIVxuXHIiKTsKLQotCXJldHVybiBwOwotfQotCi1zdGF0aWMgdm9pZCBvZl9leGl0KHZvaWQpCi17Ci0JY2FsbF9wcm9tKCJleGl0IiwgMCwgMCk7Ci19Ci0KLS8qCi0gKiBPRiBkZXZpY2UgdHJlZSByb3V0aW5lcwotICovCi1zdGF0aWMgdm9pZCAqb2ZfZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiAocGhhbmRsZSkgY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCi0JCWNvbnN0IGludCBidWZsZW4pCi17Ci0JcmV0dXJuIGNhbGxfcHJvbSgiZ2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKLX0KLQotc3RhdGljIGludCBvZl9zZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJY29uc3QgaW50IGJ1ZmxlbikKLXsKLQlyZXR1cm4gY2FsbF9wcm9tKCJzZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOwotfQotCi0vKgotICogT0YgY29uc29sZSByb3V0aW5lcwotICovCi1zdGF0aWMgdm9pZCAqb2Zfc3Rkb3V0X2hhbmRsZTsKLQotc3RhdGljIGludCBvZl9jb25zb2xlX29wZW4odm9pZCkKLXsKLQl2b2lkICpkZXZwOwotCi0JaWYgKCgoZGV2cCA9IGZpbmRkZXZpY2UoIi9jaG9zZW4iKSkgIT0gTlVMTCkKLQkJCSYmIChnZXRwcm9wKGRldnAsICJzdGRvdXQiLCAmb2Zfc3Rkb3V0X2hhbmRsZSwKLQkJCQlzaXplb2Yob2Zfc3Rkb3V0X2hhbmRsZSkpCi0JCQkJPT0gc2l6ZW9mKG9mX3N0ZG91dF9oYW5kbGUpKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIG9mX2NvbnNvbGVfd3JpdGUoY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWNhbGxfcHJvbSgid3JpdGUiLCAzLCAxLCBvZl9zdGRvdXRfaGFuZGxlLCBidWYsIGxlbik7Ci19Ci0KIHZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyLCB2b2lkICpwcm9tcHRyKQogewogCXBsYXRmb3JtX29wcy5pbWFnZV9oZHIgPSBvZl9pbWFnZV9oZHI7CkBAIC0yNzcsMTAgKzc0LDkgQEAKIAlkdF9vcHMuZ2V0cHJvcCA9IG9mX2dldHByb3A7CiAJZHRfb3BzLnNldHByb3AgPSBvZl9zZXRwcm9wOwogCi0JY29uc29sZV9vcHMub3BlbiA9IG9mX2NvbnNvbGVfb3BlbjsKLQljb25zb2xlX29wcy53cml0ZSA9IG9mX2NvbnNvbGVfd3JpdGU7CisJb2ZfY29uc29sZV9pbml0KCk7CiAKLQlwcm9tID0gKGludCAoKikodm9pZCAqKSlwcm9tcHRyOworCW9mX2luaXQocHJvbXB0cik7CiAJbG9hZGVyX2luZm8ucHJvbXB0ciA9IHByb21wdHI7CiAJaWYgKGExICYmIGEyICYmIGEyICE9IDB4ZGVhZGJlZWYpIHsKIAkJbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSBhMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L29mLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzY4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX1BQQ19CT09UX09GX0hfCisjZGVmaW5lIF9QUENfQk9PVF9PRl9IXworCit0eXBlZGVmIHZvaWQgKnBoYW5kbGU7Cit0eXBlZGVmIHZvaWQgKmloYW5kbGU7CisKK3ZvaWQgb2ZfaW5pdCh2b2lkICpwcm9tcHRyKTsKK2ludCBvZl9jYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKTsKK3ZvaWQgKm9mX2NsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKTsKK3ZvaWQgKm9mX3ZtbGludXhfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKTsKK3ZvaWQgb2ZfZXhpdCh2b2lkKTsKK3ZvaWQgKm9mX2ZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pOworaW50IG9mX3NldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmLAorCSAgICAgICBjb25zdCBpbnQgYnVmbGVuKTsKKworLyogQ29uc29sZSBmdW5jdGlvbnMgKi8KK3ZvaWQgb2ZfY29uc29sZV9pbml0KHZvaWQpOworCisjZW5kaWYgLyogX1BQQ19CT09UX09GX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vZmNvbnNvbGUuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGUwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZmNvbnNvbGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogT0YgY29uc29sZSByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMTk5Ny4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbGYuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInBhZ2UuaCIKKyNpbmNsdWRlICJvcHMuaCIKKworI2luY2x1ZGUgIm9mLmgiCisKK3N0YXRpYyB2b2lkICpvZl9zdGRvdXRfaGFuZGxlOworCitzdGF0aWMgaW50IG9mX2NvbnNvbGVfb3Blbih2b2lkKQoreworCXZvaWQgKmRldnA7CisKKwlpZiAoKChkZXZwID0gb2ZfZmluZGRldmljZSgiL2Nob3NlbiIpKSAhPSBOVUxMKQorCSAgICAmJiAob2ZfZ2V0cHJvcChkZXZwLCAic3Rkb3V0IiwgJm9mX3N0ZG91dF9oYW5kbGUsCisJCQkgICBzaXplb2Yob2Zfc3Rkb3V0X2hhbmRsZSkpCisJCT09IHNpemVvZihvZl9zdGRvdXRfaGFuZGxlKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBvZl9jb25zb2xlX3dyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlvZl9jYWxsX3Byb20oIndyaXRlIiwgMywgMSwgb2Zfc3Rkb3V0X2hhbmRsZSwgYnVmLCBsZW4pOworfQorCit2b2lkIG9mX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCWNvbnNvbGVfb3BzLm9wZW4gPSBvZl9jb25zb2xlX29wZW47CisJY29uc29sZV9vcHMud3JpdGUgPSBvZl9jb25zb2xlX3dyaXRlOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2ZsaWIuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViOGZkNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mbGliLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDE5OTcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJwYWdlLmgiCisjaW5jbHVkZSAib3BzLmgiCisKKyNpbmNsdWRlICJvZi5oIgorCitzdGF0aWMgaW50ICgqcHJvbSkgKHZvaWQgKik7CisKK3ZvaWQgb2ZfaW5pdCh2b2lkICpwcm9tcHRyKQoreworCXByb20gPSAoaW50ICgqKSh2b2lkICopKXByb21wdHI7Cit9CisKK2ludCBvZl9jYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKQoreworCWludCBpOworCXN0cnVjdCBwcm9tX2FyZ3MgeworCQljb25zdCBjaGFyICpzZXJ2aWNlOworCQlpbnQgbmFyZ3M7CisJCWludCBucmV0OworCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07CisJfSBhcmdzOworCXZhX2xpc3QgbGlzdDsKKworCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7CisJYXJncy5uYXJncyA9IG5hcmdzOworCWFyZ3MubnJldCA9IG5yZXQ7CisKKwl2YV9zdGFydChsaXN0LCBucmV0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7CisJdmFfZW5kKGxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKKwkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKKworCWlmIChwcm9tKCZhcmdzKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAobnJldCA+IDApPyBhcmdzLmFyZ3NbbmFyZ3NdOiAwOworfQorCitzdGF0aWMgaW50IG9mX2NhbGxfcHJvbV9yZXQoY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnJldHMsIC4uLikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcHJvbV9hcmdzIHsKKwkJY29uc3QgY2hhciAqc2VydmljZTsKKwkJaW50IG5hcmdzOworCQlpbnQgbnJldDsKKwkJdW5zaWduZWQgaW50IGFyZ3NbMTJdOworCX0gYXJnczsKKwl2YV9saXN0IGxpc3Q7CisKKwlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOworCWFyZ3MubmFyZ3MgPSBuYXJnczsKKwlhcmdzLm5yZXQgPSBucmV0OworCisJdmFfc3RhcnQobGlzdCwgcmV0cyk7CisJZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOworCXZhX2VuZChsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCisJCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7CisKKwlpZiAocHJvbSgmYXJncykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocmV0cyAhPSAodm9pZCAqKSAwKQorCQlmb3IgKGkgPSAxOyBpIDwgbnJldDsgKytpKQorCQkJcmV0c1tpLTFdID0gYXJncy5hcmdzW25hcmdzK2ldOworCisJcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Cit9CisKKy8qIHJldHVybnMgdHJ1ZSBpZiBzMiBpcyBhIHByZWZpeCBvZiBzMSAqLworc3RhdGljIGludCBzdHJpbmdfbWF0Y2goY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCWZvciAoOyAqczI7ICsrczIpCisJCWlmICgqczErKyAhPSAqczIpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE9sZGVyIE9GJ3MgcmVxdWlyZSB0aGF0IHdoZW4gY2xhaW1pbmcgYSBzcGVjaWZpYyByYW5nZSBvZiBhZGRyZXNzZXMsCisgKiB3ZSBjbGFpbSB0aGUgcGh5c2ljYWwgc3BhY2UgaW4gdGhlIC9tZW1vcnkgbm9kZSBhbmQgdGhlIHZpcnR1YWwKKyAqIHNwYWNlIGluIHRoZSBjaG9zZW4gbW11IG5vZGUsIGFuZCB0aGVuIGRvIGEgbWFwIG9wZXJhdGlvbiB0bworICogbWFwIHZpcnR1YWwgdG8gcGh5c2ljYWwuCisgKi8KK3N0YXRpYyBpbnQgbmVlZF9tYXAgPSAtMTsKK3N0YXRpYyBpaGFuZGxlIGNob3Nlbl9tbXU7CitzdGF0aWMgcGhhbmRsZSBtZW1vcnk7CisKK3N0YXRpYyBpbnQgY2hlY2tfb2ZfdmVyc2lvbih2b2lkKQoreworCXBoYW5kbGUgb3Byb20sIGNob3NlbjsKKwljaGFyIHZlcnNpb25bNjRdOworCisJb3Byb20gPSBvZl9maW5kZGV2aWNlKCIvb3BlbnByb20iKTsKKwlpZiAob3Byb20gPT0gKHBoYW5kbGUpIC0xKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZfZ2V0cHJvcChvcHJvbSwgIm1vZGVsIiwgdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSA8PSAwKQorCQlyZXR1cm4gMDsKKwl2ZXJzaW9uW3NpemVvZih2ZXJzaW9uKS0xXSA9IDA7CisJcHJpbnRmKCJPRiB2ZXJzaW9uID0gJyVzJ1xyXG4iLCB2ZXJzaW9uKTsKKwlpZiAoIXN0cmluZ19tYXRjaCh2ZXJzaW9uLCAiT3BlbiBGaXJtd2FyZSwgMS4iKQorCSAgICAmJiAhc3RyaW5nX21hdGNoKHZlcnNpb24sICJGaXJtV29ya3MsMy4iKSkKKwkJcmV0dXJuIDA7CisJY2hvc2VuID0gb2ZfZmluZGRldmljZSgiL2Nob3NlbiIpOworCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7CisJCWNob3NlbiA9IG9mX2ZpbmRkZXZpY2UoIi9jaG9zZW5AMCIpOworCQlpZiAoY2hvc2VuID09IChwaGFuZGxlKSAtMSkgeworCQkJcHJpbnRmKCJubyBjaG9zZW5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKG9mX2dldHByb3AoY2hvc2VuLCAibW11IiwgJmNob3Nlbl9tbXUsIHNpemVvZihjaG9zZW5fbW11KSkgPD0gMCkgeworCQlwcmludGYoIm5vIG1tdVxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1vcnkgPSAoaWhhbmRsZSkgb2ZfY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnkiKTsKKwlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgeworCQltZW1vcnkgPSAoaWhhbmRsZSkgb2ZfY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnlAMCIpOworCQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgeworCQkJcHJpbnRmKCJubyBtZW1vcnkgbm9kZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlwcmludGYoIm9sZCBPRiBkZXRlY3RlZFxyXG4iKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCAqb2ZfY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCisJaWYgKG5lZWRfbWFwIDwgMCkKKwkJbmVlZF9tYXAgPSBjaGVja19vZl92ZXJzaW9uKCk7CisJaWYgKGFsaWduIHx8ICFuZWVkX21hcCkKKwkJcmV0dXJuICh2b2lkICopIG9mX2NhbGxfcHJvbSgiY2xhaW0iLCAzLCAxLCB2aXJ0LCBzaXplLCBhbGlnbik7CisKKwlyZXQgPSBvZl9jYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIG1lbW9yeSwKKwkJCSAgICAgICBhbGlnbiwgc2l6ZSwgdmlydCk7CisJaWYgKHJldCAhPSAwIHx8IHJlc3VsdCA9PSAtMSkKKwkJcmV0dXJuICh2b2lkICopIC0xOworCXJldCA9IG9mX2NhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNSwgMiwgJnJlc3VsdCwgImNsYWltIiwgY2hvc2VuX21tdSwKKwkJCSAgICAgICBhbGlnbiwgc2l6ZSwgdmlydCk7CisJLyogMHgxMiA9PSBjb2hlcmVudCArIHJlYWQvd3JpdGUgKi8KKwlyZXQgPSBvZl9jYWxsX3Byb20oImNhbGwtbWV0aG9kIiwgNiwgMSwgIm1hcCIsIGNob3Nlbl9tbXUsCisJCQkgICAweDEyLCBzaXplLCB2aXJ0LCB2aXJ0KTsKKwlyZXR1cm4gKHZvaWQgKikgdmlydDsKK30KKwordm9pZCAqb2Zfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKKworCWlmICghcCkKKwkJZmF0YWwoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Iga2VybmVsIGltYWdlIVxuXHIiKTsKKworCXJldHVybiBwOworfQorCit2b2lkIG9mX2V4aXQodm9pZCkKK3sKKwlvZl9jYWxsX3Byb20oImV4aXQiLCAwLCAwKTsKK30KKworLyoKKyAqIE9GIGRldmljZSB0cmVlIHJvdXRpbmVzCisgKi8KK3ZvaWQgKm9mX2ZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKHBoYW5kbGUpIG9mX2NhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIG5hbWUpOworfQorCitpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pCit7CisJcmV0dXJuIG9mX2NhbGxfcHJvbSgiZ2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKK30KKworaW50IG9mX3NldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmLAorCSAgICAgICBjb25zdCBpbnQgYnVmbGVuKQoreworCXJldHVybiBvZl9jYWxsX3Byb20oInNldHByb3AiLCA0LCAxLCBwaGFuZGxlLCBuYW1lLCBidWYsIGJ1Zmxlbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaCBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCmluZGV4IDk1OTEyNGYuLjg2MDc3MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCkBAIC0xOSw2ICsxOSw4IEBACiAjZGVmaW5lCU1BWF9QQVRIX0xFTgkJMjU2CiAjZGVmaW5lCU1BWF9QUk9QX0xFTgkJMjU2IC8qIFdoYXQgc2hvdWxkIHRoaXMgYmU/ICovCiAKK3R5cGVkZWYgdm9pZCAoKmtlcm5lbF9lbnRyeV90KSh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB2b2lkICpyNSk7CisKIC8qIFBsYXRmb3JtIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KIHN0cnVjdCBwbGF0Zm9ybV9vcHMgewogCXZvaWQJKCpmaXh1cHMpKHZvaWQpOwpAQCAtNTEsNyArNTMsNyBAQAogLyogQ29uc29sZSBvcGVyYXRpb25zICovCiBzdHJ1Y3QgY29uc29sZV9vcHMgewogCWludAkoKm9wZW4pKHZvaWQpOwotCXZvaWQJKCp3cml0ZSkoY2hhciAqYnVmLCBpbnQgbGVuKTsKKwl2b2lkCSgqd3JpdGUpKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAJdm9pZAkoKmVkaXRfY21kbGluZSkoY2hhciAqYnVmLCBpbnQgbGVuKTsKIAl2b2lkCSgqY2xvc2UpKHZvaWQpOwogCXZvaWQJKmRhdGE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaGVhZC5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWhlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZkNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWhlYWQuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICogIFBTMyBib290d3JhcHBlciBlbnRyeS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJwcGNfYXNtLmgiCisKKwkudGV4dAorCisvKgorICogX19zeXN0ZW1fcmVzZXRfb3ZlcmxheSAtIFRoZSBQUzMgZmlyc3Qgc3RhZ2UgZW50cnkuCisgKgorICogVGhlIGJvb3R3cmFwZXIgYnVpbGQgc2NyaXB0IGNvcGllcyB0aGUgMHgxMDAgYnl0ZXMgYXQgc3ltYm9sCisgKiBfX3N5c3RlbV9yZXNldF9vdmVybGF5IHRvIG9mZnNldCAweDEwMCBvZiB0aGUgcm9tIGltYWdlLgorICoKKyAqIFRoZSBQUzMgaGFzIGEgc2luZ2xlIHByb2Nlc3NvciB3aXRoIHR3byB0aHJlYWRzLgorICovCisKKwkuZ2xvYmwgX19zeXN0ZW1fcmVzZXRfb3ZlcmxheQorX19zeXN0ZW1fcmVzZXRfb3ZlcmxheToKKworCS8qIFN3aXRjaCB0byAzMi1iaXQgbW9kZS4gKi8KKworCW1mbXNyCXI5CisJY2xybGRpCXI5LHI5LDEKKwltdG1zcmQJcjkKKwlub3AKKworCS8qIEdldCB0aHJlYWQgbnVtYmVyIGluIHIzIGFuZCBicmFuY2guICovCisKKwltZnNwcglyMywgMHg4OAorCWNudGx6dy4JcjMsIHIzCisJbGkJcjQsIDAKKwlsaQlyNSwgMAorCWJlcQkxZgorCisJLyogU2Vjb25kYXJ5IGdvZXMgdG8gX19zZWNvbmRhcnlfaG9sZCBpbiBrZXJuZWwuICovCisKKwlsaQlyNCwgMHg2MAorCW10Y3RyCXI0CisJYmN0cgorCisJLyogUHJpbWFyeSBkZWxheXMgdGhlbiBnb2VzIHRvIF96aW1hZ2Vfc3RhcnQgaW4gd3JhcHBlci4gKi8KKzE6CisJb3IJMzEsIDMxLCAzMSAvKiBkYjE2Y3ljICovCisJb3IJMzEsIDMxLCAzMSAvKiBkYjE2Y3ljICovCisKKwlsaXMJcjQsIF96aW1hZ2Vfc3RhcnRAaGEKKwlhZGRpCXI0LCByNCwgX3ppbWFnZV9zdGFydEBsCisJbXRjdHIJcjQKKwliY3RyCisKKy8qCisgKiBfX3N5c3RlbV9yZXNldF9rZXJuZWwgLSBQbGFjZSBob2xkZXIgZm9yIHRoZSBrZXJuZWwgcmVzZXQgdmVjdG9yLgorICoKKyAqIFRoZSBib290d3JhcHBlciBidWlsZCBzY3JpcHQgY29waWVzIDB4MTAwIGJ5dGVzIGZyb20gb2Zmc2V0IDB4MTAwCisgKiBvZiB0aGUgcm9tIGltYWdlIHRvIHRoZSBzeW1ib2wgX19zeXN0ZW1fcmVzZXRfa2VybmVsLiAgQXQgcnVudGltZQorICogdGhlIGJvb3R3cmFwcGVyIHByb2dyYW0gY29waWVzIHRoZSAweDEwMCBieXRlcyBhdCBfX3N5c3RlbV9yZXNldF9rZXJuZWwKKyAqIHRvIHJhbSBhZGRyZXNzIDB4MTAwLiAgVGhpcyBzeW1ib2wgbXVzdCBvY2N1cHkgMHgxMDAgYnl0ZXMuCisgKi8KKworCS5nbG9ibCBfX3N5c3RlbV9yZXNldF9rZXJuZWwKK19fc3lzdGVtX3Jlc2V0X2tlcm5lbDoKKworCS4gPSBfX3N5c3RlbV9yZXNldF9rZXJuZWwgKyAweDEwMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWh2Y2FsbC5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWh2Y2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjdkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaHZjYWxsLlMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiAgUFMzIGJvb3R3cmFwcGVyIGh2Y2FsbHMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAicHBjX2FzbS5oIgorCisvKgorICogVGhlIFBTMyBoeXBlcnZpc29yIHVzZXMgYSA2NCBiaXQgIkMiIGxhbmd1YWdlIGNhbGxpbmcgY29udmVudGlvbi4KKyAqIFRoZSByb3V0aW5lcyBoZXJlIG1hcnNoYWwgYXJndW1lbnRzIGJldHdlZW4gdGhlIDMyIGJpdCB3cmFwcGVyCisgKiBwcm9ncmFtIGFuZCB0aGUgNjQgYml0IGh2Y2FsbHMuCisgKgorICogIHdyYXBwZXIgICAgICAgICAgIGx2MQorICogIDMyLWJpdCAoaCxsKSAgICAgIDY0LWJpdAorICoKKyAqICAxOiByMyxyNCAgICAgICAgICA8LT4gcjMKKyAqICAyOiByNSxyNiAgICAgICAgICA8LT4gcjQKKyAqICAzOiByNyxyOCAgICAgICAgICA8LT4gcjUKKyAqICA0OiByOSxyMTAgICAgICAgICA8LT4gcjYKKyAqICA1OiA4KHIxKSwxMihyMSkgICA8LT4gcjcKKyAqICA2OiAxNihyMSksMjAocjEpICA8LT4gcjgKKyAqICA3OiAyNChyMSksMjgocjEpICA8LT4gcjkKKyAqICA4OiAzMihyMSksMzYocjEpICA8LT4gcjEwCisgKgorICovCisKKy5tYWNybyBHTE9CQUwgbmFtZQorCS5zZWN0aW9uICIudGV4dCIKKwkuYmFsaWduIDQKKwkuZ2xvYmwgXG5hbWUKK1xuYW1lOgorLmVuZG0KKworLm1hY3JvIE5PX1NVUFBPUlQgbmFtZQorCUdMT0JBTCBcbmFtZQorCWIgcHMzX25vX3N1cHBvcnQKKy5lbmRtCisKKy5tYWNybyBIVkNBTEwgbnVtCisJbGkgcjExLCBcbnVtCisJLmxvbmcgMHg0NDAwMDAyMgorCWV4dHN3IHIzLCByMworLmVuZG0KKworLm1hY3JvIFNBVkVfTFIgb2Zmc2V0PTQKKwltZmxyIHIwCisJc3R3IHIwLCBcb2Zmc2V0KHIxKQorLmVuZG0KKworLm1hY3JvIExPQURfTFIgb2Zmc2V0PTQKKwlsd3ogcjAsIFxvZmZzZXQocjEpCisJbXRsciByMAorLmVuZG0KKworLm1hY3JvIExPQURfNjRfUkVHIHRhcmdldCxoaWdoLGxvdworCXNsZGkgcjExLCBcaGlnaCwgMzIKKwlvciBcdGFyZ2V0LCByMTEsIFxsb3cKKy5lbmRtCisKKy5tYWNybyBMT0FEXzY0X1NUQUNLIHRhcmdldCxvZmZzZXQKKwlsZCBcdGFyZ2V0LCBcb2Zmc2V0KHIxKQorLmVuZG0KKworLm1hY3JvIExPQURfUjMKKwlMT0FEXzY0X1JFRyByMyxyMyxyNAorLmVuZG0KKworLm1hY3JvIExPQURfUjQKKwlMT0FEXzY0X1JFRyByNCxyNSxyNgorLmVuZG0KKworLm1hY3JvIExPQURfUjUKKwlMT0FEXzY0X1JFRyByNSxyNyxyOAorLmVuZG0KKworLm1hY3JvIExPQURfUjYKKwlMT0FEXzY0X1JFRyByNixyOSxyMTAKKy5lbmRtCisKKy5tYWNybyBMT0FEX1I3CisJTE9BRF82NF9TVEFDSyByNyw4CisuZW5kbQorCisubWFjcm8gTE9BRF9SOAorCUxPQURfNjRfU1RBQ0sgcjgsMTYKKy5lbmRtCisKKy5tYWNybyBMT0FEX1I5CisJTE9BRF82NF9TVEFDSyByOSwyNAorLmVuZG0KKworLm1hY3JvIExPQURfUjEwCisJTE9BRF82NF9TVEFDSyByMTAsMzIKKy5lbmRtCisKKy5tYWNybyBMT0FEX1JFR1NfMAorCXN0d3UgMSwtMTYoMSkKKwlzdHcgMywgOCgxKQorLmVuZG0KKworLm1hY3JvIExPQURfUkVHU181CisJTE9BRF9SMworCUxPQURfUjQKKwlMT0FEX1I1CisJTE9BRF9SNgorCUxPQURfUjcKKy5lbmRtCisKKy5tYWNybyBMT0FEX1JFR1NfNgorCUxPQURfUkVHU181CisJTE9BRF9SOAorLmVuZG0KKworLm1hY3JvIExPQURfUkVHU184CisJTE9BRF9SRUdTXzYKKwlMT0FEX1I5CisJTE9BRF9SMTAKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzBfMQorCWx3eiByMTEsIDgocjEpCisJc3RkIHI0LCAwKHIxMSkKKwltciByNCwgcjMKKwlsaSByMywgMAorCWFkZGkgcjEscjEsMTYKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzVfMgorCWx3eiByMTEsIDE2KHIxKQorCXN0ZCByNCwgMChyMTEpCisJbHd6IHIxMSwgMjQocjEpCisJc3RkIHI1LCAwKHIxMSkKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzZfMQorCWx3eiByMTEsIDI0KHIxKQorCXN0ZCByNCwgMChyMTEpCisuZW5kbQorCitHTE9CQUwgbHYxX2dldF9sb2dpY2FsX3BwZV9pZAorCVNBVkVfTFIKKwlMT0FEX1JFR1NfMAorCUhWQ0FMTCA2OQorCVNUT1JFX1JFR1NfMF8xCisJTE9BRF9MUgorCWJscgorCitHTE9CQUwgbHYxX2dldF9sb2dpY2FsX3BhcnRpdGlvbl9pZAorCVNBVkVfTFIKKwlMT0FEX1JFR1NfMAorCUhWQ0FMTCA3NAorCVNUT1JFX1JFR1NfMF8xCisJTE9BRF9MUgorCWJscgorCitHTE9CQUwgbHYxX2dldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUKKwlTQVZFX0xSCisJTE9BRF9SRUdTXzUKKwlIVkNBTEwgOTEKKwlTVE9SRV9SRUdTXzVfMgorCUxPQURfTFIKKwlibHIKKworR0xPQkFMIGx2MV9wYW5pYworCVNBVkVfTFIKKwlMT0FEX1JFR1NfOAorCUhWQ0FMTCAyNTUKKwlMT0FEX0xSCisJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wczMuYyBiL2FyY2gvcG93ZXJwYy9ib290L3BzMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2Q1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqICBQUzMgYm9vdHdyYXBwZXIgc3VwcG9ydC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImVsZi5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAicGFnZS5oIgorI2luY2x1ZGUgIm9wcy5oIgorCitleHRlcm4gczY0IGx2MV9wYW5pYyh1NjQgaW5fMSk7CitleHRlcm4gczY0IGx2MV9nZXRfbG9naWNhbF9wYXJ0aXRpb25faWQodTY0ICpvdXRfMSk7CitleHRlcm4gczY0IGx2MV9nZXRfbG9naWNhbF9wcGVfaWQodTY0ICpvdXRfMSk7CitleHRlcm4gczY0IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlKHU2NCBpbl8xLCB1NjQgaW5fMiwgdTY0IGluXzMsCisJdTY0IGluXzQsIHU2NCBpbl81LCB1NjQgKm91dF8xLCB1NjQgKm91dF8yKTsKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ZihmbXQpCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIERCRygKKwljb25zdCBjaGFyICpmbXQsIC4uLikge3JldHVybiAwO30KKyNlbmRpZgorCitCU1NfU1RBQ0soNDA5Nik7CisKKy8qIEEgYnVmZmVyIHRoYXQgbWF5IGJlIGVkaXRlZCBieSB0b29scyBvcGVyYXRpbmcgb24gYSB6SW1hZ2UgYmluYXJ5IHNvIGFzIHRvCisgKiBlZGl0IHRoZSBjb21tYW5kIGxpbmUgcGFzc2VkIHRvIHZtbGludXggKGJ5IHNldHRpbmcgL2Nob3Nlbi9ib290YXJncykuCisgKiBUaGUgYnVmZmVyIGlzIHB1dCBpbiBpdCdzIG93biBzZWN0aW9uIHNvIHRoYXQgdG9vbHMgbWF5IGxvY2F0ZSBpdCBlYXNpZXIuCisgKi8KK3N0YXRpYyBjaGFyIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdCisJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIl9fYnVpbHRpbl9jbWRsaW5lIikpKTsKKworc3RhdGljIHZvaWQgcHJlcF9jbWRsaW5lKHZvaWQgKmNob3NlbikKK3sKKwlpZiAoY21kbGluZVswXSA9PSAnXDAnKQorCQlnZXRwcm9wKGNob3NlbiwgImJvb3RhcmdzIiwgY21kbGluZSwgQ09NTUFORF9MSU5FX1NJWkUtMSk7CisJZWxzZQorCQlzZXRwcm9wX3N0cihjaG9zZW4sICJib290YXJncyIsIGNtZGxpbmUpOworCisJcHJpbnRmKCJjbWRsaW5lOiAnJXMnXG4iLCBjbWRsaW5lKTsKK30KKworc3RhdGljIHZvaWQgcHMzX2NvbnNvbGVfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworfQorCitzdGF0aWMgdm9pZCBwczNfZXhpdCh2b2lkKQoreworCXByaW50ZigicHMzX2V4aXRcbiIpOworCisJLyogbHYxX3BhbmljIHdpbGwgc2h1dGRvd24gdGhlIGxwYXIuICovCisKKwlsdjFfcGFuaWMoMCk7IC8qIHplcm8gPSBkbyBub3QgcmVib290ICovCisJd2hpbGUgKDEpOworfQorCitzdGF0aWMgaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfcm1fc2l6ZSh1NjQgKnJtX3NpemUpCit7CisJczY0IHJlc3VsdDsKKwl1NjQgbHBhcl9pZDsKKwl1NjQgcHBlX2lkOworCXU2NCB2MjsKKworCXJlc3VsdCA9IGx2MV9nZXRfbG9naWNhbF9wYXJ0aXRpb25faWQoJmxwYXJfaWQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC0xOworCisJcmVzdWx0ID0gbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcHBlX2lkKTsKKworCWlmIChyZXN1bHQpCisJCXJldHVybiAtMTsKKworCS8qCisJICogbjE6IDAwMDAwMDAwNjI2OTAwMDAgOiAuLi4uYmkuLgorCSAqIG4yOiA3MDc1MDAwMDAwMDAwMDAwIDogcHUuLi4uLi4KKwkgKiBuMzogMDAwMDAwMDAwMDAwMDAwMSA6IC4uLi4uLi4uCisJICogbjQ6IDcyNmQ1ZjczNjk3YTY1MDAgOiBybV9zaXplLgorCSovCisKKwlyZXN1bHQgPSBsdjFfZ2V0X3JlcG9zaXRvcnlfbm9kZV92YWx1ZShscGFyX2lkLCAweDAwMDAwMDAwNjI2OTAwMDBVTEwsCisJCTB4NzA3NTAwMDAwMDAwMDAwMFVMTCwgcHBlX2lkLCAweDcyNmQ1ZjczNjk3YTY1MDBVTEwsIHJtX3NpemUsCisJCSZ2Mik7CisKKwlwcmludGYoIiVzOiVkOiBwcGVfaWQgICVsdSBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKHVuc2lnbmVkIGxvbmcpcHBlX2lkKTsKKwlwcmludGYoIiVzOiVkOiBscGFyX2lkICVsdSBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKHVuc2lnbmVkIGxvbmcpbHBhcl9pZCk7CisJcHJpbnRmKCIlczolZDogcm1fc2l6ZSAlbGx4aCBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKnJtX3NpemUpOworCisJcmV0dXJuIHJlc3VsdCA/IC0xIDogMDsKK30KKwordm9pZCBwczNfY29weV92ZWN0b3JzKHZvaWQpCit7CisJZXh0ZXJuIGNoYXIgX19zeXN0ZW1fcmVzZXRfa2VybmVsW107CisKKwltZW1jcHkoKHZvaWQgKikweDEwMCwgX19zeXN0ZW1fcmVzZXRfa2VybmVsLCAweDEwMCk7CisJZmx1c2hfY2FjaGUoKHZvaWQgKikweDEwMCwgMHgxMDApOworfQorCit2b2lkIHBsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlleHRlcm4gY2hhciBfZW5kW107CisJZXh0ZXJuIGNoYXIgX2R0Yl9zdGFydFtdOworCWV4dGVybiBjaGFyIF9pbml0cmRfc3RhcnRbXTsKKwlleHRlcm4gY2hhciBfaW5pdHJkX2VuZFtdOworCWNvbnN0IHUzMiBoZWFwc2l6ZSA9IDB4MTAwMDAwMCAtICh1MzIpX2VuZDsgLyogMTZNaUIgKi8KKwl2b2lkICpjaG9zZW47CisJdW5zaWduZWQgbG9uZyBmdF9hZGRyOworCXU2NCBybV9zaXplOworCisJY29uc29sZV9vcHMud3JpdGUgPSBwczNfY29uc29sZV93cml0ZTsKKwlwbGF0Zm9ybV9vcHMuZXhpdCA9IHBzM19leGl0OworCisJcHJpbnRmKCJcbi0tIFBTMyBib290d3JhcHBlciAtLVxuIik7CisKKwlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBoZWFwc2l6ZSwgMzIsIDY0KTsKKwlmdF9pbml0KF9kdGJfc3RhcnQsIDAsIDQpOworCisJY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbiIpOworCisJcHMzX3JlcG9zaXRvcnlfcmVhZF9ybV9zaXplKCZybV9zaXplKTsKKwlkdF9maXh1cF9tZW1vcnkoMCwgcm1fc2l6ZSk7CisKKwlpZiAoX2luaXRyZF9lbmQgPiBfaW5pdHJkX3N0YXJ0KSB7CisJCXNldHByb3BfdmFsKGNob3NlbiwgImxpbnV4LGluaXRyZC1zdGFydCIsICh1MzIpKF9pbml0cmRfc3RhcnQpKTsKKwkJc2V0cHJvcF92YWwoY2hvc2VuLCAibGludXgsaW5pdHJkLWVuZCIsICh1MzIpKF9pbml0cmRfZW5kKSk7CisJfQorCisJcHJlcF9jbWRsaW5lKGNob3Nlbik7CisKKwlmdF9hZGRyID0gZHRfb3BzLmZpbmFsaXplKCk7CisKKwlwczNfY29weV92ZWN0b3JzKCk7CisKKwlwcmludGYoIiBmbGF0IHRyZWUgYXQgMHglbHhcblxyIiwgZnRfYWRkcik7CisKKwkoKGtlcm5lbF9lbnRyeV90KTApKGZ0X2FkZHIsIDAsIE5VTEwpOworCisJcHMzX2V4aXQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3NlcmlhbC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKaW5kZXggN2ZkMzIzMy4uZWFhMGQzYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAlyZXR1cm4gc2NkcC0+b3BlbigpOwogfQogCi1zdGF0aWMgdm9pZCBzZXJpYWxfd3JpdGUoY2hhciAqYnVmLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgc2VyaWFsX3dyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAlzdHJ1Y3Qgc2VyaWFsX2NvbnNvbGVfZGF0YSAqc2NkcCA9IGNvbnNvbGVfb3BzLmRhdGE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCmluZGV4IDBhOWZlZWIuLjViNTc4MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYwpAQCAtMTkwLDcgKzE5MCwxMSBAQAogCiAJCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KIAkJcXVhbGlmaWVyID0gLTE7Ci0JCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJyB8fCAqZm10ID09J1onKSB7CisJCWlmICgqZm10ID09ICdsJyAmJiAqKGZtdCArIDEpID09ICdsJykgeworCQkJcXVhbGlmaWVyID0gJ3EnOworCQkJZm10ICs9IDI7CisJCX0gZWxzZSBpZiAoKmZtdCA9PSAnaCcgfHwgKmZtdCA9PSAnbCcgfHwgKmZtdCA9PSAnTCcKKwkJCXx8ICpmbXQgPT0gJ1onKSB7CiAJCQlxdWFsaWZpZXIgPSAqZm10OwogCQkJKytmbXQ7CiAJCX0KQEAgLTI4MSw2ICsyODUsMTAgQEAKIAkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKIAkJCWlmIChmbGFncyAmIFNJR04pCiAJCQkJbnVtID0gKHNpZ25lZCBsb25nKSBudW07CisJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdxJykgeworCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgbG9uZyBsb25nKSBudW07CiAJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgewogCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7CiAJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaCBiL2FyY2gvcG93ZXJwYy9ib290L3R5cGVzLmgKaW5kZXggNzlkMjZlNy4uMzEzOTNkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC90eXBlcy5oCkBAIC03LDYgKzcsMTAgQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXUxNjsKIHR5cGVkZWYgdW5zaWduZWQgaW50CQl1MzI7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwl1NjQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyCQlzODsKK3R5cGVkZWYgc2hvcnQJCQlzMTY7Cit0eXBlZGVmIGludAkJCXMzMjsKK3R5cGVkZWYgbG9uZyBsb25nCQlzNjQ7CiAKICNkZWZpbmUgbWluKHgseSkgKHsgXAogCXR5cGVvZih4KSBfeCA9ICh4KTsJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlciBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKaW5kZXggZGE3N2FkYy4uNjVmNjg1NCAxMDA3NTUKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCkBAIC0xNDQsNiArMTQ0LDE1IEBACiBjdWJvb3QqKQogICAgIGd6aXA9CiAgICAgOzsKK3BzMykKKyAgICBwbGF0Zm9ybW89IiRvYmplY3QvcHMzLWhlYWQubyAkb2JqZWN0L3BzMy1odmNhbGwubyAkb2JqZWN0L3BzMy5vIgorICAgIGxkcz0kb2JqZWN0L3pJbWFnZS5wczMubGRzCisgICAgZ3ppcD0KKyAgICBleHQ9YmluCisgICAgb2JqZmxhZ3M9Ii1PIGJpbmFyeSAtLXNldC1zZWN0aW9uLWZsYWdzPS5ic3M9Y29udGVudHMsYWxsb2MsbG9hZCxkYXRhIgorICAgIGtzZWN0aW9uPS5rZXJuZWw6dm1saW51eC5iaW4KKyAgICBpc2VjdGlvbj0ua2VybmVsOmluaXRyZAorICAgIDs7CiBlc2FjCiAKIHZtej0iJHRtcGRpci9gYmFzZW5hbWUgXCIka2VybmVsXCJgLiRleHQiCkBAIC0yMzksNCArMjQ4LDUwIEBACiAgICAgZmkKICAgICBleGl0IDAKICAgICA7OworcHMzKQorICAgICMgVGhlIHBzMydzIGxvYWRlciBzdXBwb3J0cyBsb2FkaW5nIGd6aXBwZWQgYmluYXJ5IGltYWdlcyBmcm9tIGZsYXNoCisgICAgIyByb20gdG8gYWRkciB6ZXJvLiBUaGUgbG9hZGVyIGVudGVycyB0aGUgaW1hZ2UgYXQgYWRkciAweDEwMC4gIEEKKyAgICAjIGJvb3R3cmFwcGVyIG92ZXJsYXkgaXMgdXNlIHRvIGFycmFuZ2UgZm9yIHRoZSBrZXJuZWwgdG8gYmUgbG9hZGVkCisgICAgIyB0byBhZGRyIHplcm8gYW5kIHRvIGhhdmUgYSBzdWl0YWJsZSBib290d3JhcHBlciBlbnRyeSBhdCAweDEwMC4KKyAgICAjIFRvIGNvbnN0cnVjdCB0aGUgcm9tIGltYWdlLCAweDEwMCBieXRlcyBmcm9tIG9mZnNldCAweDEwMCBpbiB0aGUKKyAgICAjIGtlcm5lbCBpcyBjb3BpZWQgdG8gdGhlIGJvb3R3cmFwcGVyIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9rZXJuZWwuCisgICAgIyBUaGUgMHgxMDAgYnl0ZXMgYXQgdGhlIGJvb3R3cmFwcGVyIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9vdmVybGF5IGlzCisgICAgIyB0aGVuIGNvcGllZCB0byBvZmZzZXQgMHgxMDAuICBBdCBydW50aW1lIHRoZSBib290d3JhcHBlciBwcm9ncmFtCisgICAgIyBjb3BpZXMgdGhlIDB4MTAwIGJ5dGVzIGF0IF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCB0byBhZGRyIDB4MTAwLgorCisgICAgc3lzdGVtX3Jlc2V0X292ZXJsYXk9MHhgJHtDUk9TU31ubSAiJG9maWxlIiBcCisgICAgICAgIHwgZ3JlcCAnIF9fc3lzdGVtX3Jlc2V0X292ZXJsYXkkJyAgICAgICBcCisgICAgICAgIHwgY3V0IC1kJyAnIC1mMWAKKyAgICBzeXN0ZW1fcmVzZXRfb3ZlcmxheT1gcHJpbnRmICIlZCIgJHN5c3RlbV9yZXNldF9vdmVybGF5YAorICAgIHN5c3RlbV9yZXNldF9rZXJuZWw9MHhgJHtDUk9TU31ubSAiJG9maWxlIiBcCisgICAgICAgIHwgZ3JlcCAnIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCQnICAgICAgIFwKKyAgICAgICAgfCBjdXQgLWQnICcgLWYxYAorICAgIHN5c3RlbV9yZXNldF9rZXJuZWw9YHByaW50ZiAiJWQiICRzeXN0ZW1fcmVzZXRfa2VybmVsYAorICAgIG92ZXJsYXlfZGVzdD0iMjU2IgorICAgIG92ZXJsYXlfc2l6ZT0iMjU2IgorCisgICAgcm0gLWYgIiRvYmplY3Qvb3RoZXJvcy5ibGQiCisKKyAgICAke0NST1NTfW9iamNvcHkgLU8gYmluYXJ5ICIkb2ZpbGUiICIkb2ZpbGUuYmluIgorCisgICAgbXNnPSQoZGQgaWY9IiRvZmlsZS5iaW4iIG9mPSIkb2ZpbGUuYmluIiBjb252PW5vdHJ1bmMgXAorICAgICAgICBza2lwPSRvdmVybGF5X2Rlc3Qgc2Vlaz0kc3lzdGVtX3Jlc2V0X2tlcm5lbCAgICAgIFwKKyAgICAgICAgY291bnQ9JG92ZXJsYXlfc2l6ZSBicz0xIDI+JjEpCisKKyAgICBpZiBbICQ/IC1uZSAiMCIgXTsgdGhlbgorICAgICAgIGVjaG8gJG1zZworICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBtc2c9JChkZCBpZj0iJG9maWxlLmJpbiIgb2Y9IiRvZmlsZS5iaW4iIGNvbnY9bm90cnVuYyBcCisgICAgICAgIHNraXA9JHN5c3RlbV9yZXNldF9vdmVybGF5IHNlZWs9JG92ZXJsYXlfZGVzdCAgICAgXAorICAgICAgICBjb3VudD0kb3ZlcmxheV9zaXplIGJzPTEgMj4mMSkKKworICAgIGlmIFsgJD8gLW5lICIwIiBdOyB0aGVuCisgICAgICAgZWNobyAkbXNnCisgICAgICAgZXhpdCAyCisgICAgZmkKKworICAgIGd6aXAgLS1mb3JjZSAtOSAtLXN0ZG91dCAiJG9maWxlLmJpbiIgPiAiJG9iamVjdC9vdGhlcm9zLmJsZCIKKyAgICA7OwogZXNhYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLnBzMy5sZHMuUyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5wczMubGRzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhNDY5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5wczMubGRzLlMKQEAgLTAsMCArMSw1MCBAQAorT1VUUFVUX0FSQ0gocG93ZXJwYzpjb21tb24pCitFTlRSWShfemltYWdlX3N0YXJ0KQorRVhURVJOKF96aW1hZ2Vfc3RhcnQpCitTRUNUSU9OUworeworICBfdm1saW51eF9zdGFydCA9ICAuOworICAua2VybmVsOnZtbGludXguYmluIDogeyAqKC5rZXJuZWw6dm1saW51eC5iaW4pIH0KKyAgX3ZtbGludXhfZW5kID0gIC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfZHRiX3N0YXJ0ID0gLjsKKyAgLmtlcm5lbDpkdGIgOiB7ICooLmtlcm5lbDpkdGIpIH0KKyAgX2R0Yl9lbmQgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2luaXRyZF9zdGFydCA9ICAuOworICAua2VybmVsOmluaXRyZCA6IHsgKigua2VybmVsOmluaXRyZCkgfQorICBfaW5pdHJkX2VuZCA9ICAuOworCisgIF9zdGFydCA9IC47CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgfQorICBfZXRleHQgPSAuOworICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSopCisgICAgKiguZGF0YSopCisgICAgKiguc2RhdGEqKQorICAgIF9fZ290Ml9zdGFydCA9IC47CisgICAgKiguZ290MikKKyAgICBfX2dvdDJfZW5kID0gLjsKKyAgfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2VkYXRhICA9ICAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykKKyAgICooLmJzcykKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9lbmQgPSAuIDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2hvbGx5X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2hvbGx5X2RlZmNvbmZpZwppbmRleCAzMjc4MTg0Li4wNGI5NGY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9ob2xseV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvaG9sbHlfZGVmY29uZmlnCkBAIC0xOTAsMTAgKzE5MCwxMiBAQAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMTE1MjAwIgogIyBDT05GSUdfUE0gaXMgbm90IHNldAogIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5UX0RFVklDRV9UUkVFIGlzIG5vdCBzZXQKK0NPTkZJR19XQU5UX0RFVklDRV9UUkVFPXkKK0NPTkZJR19ERVZJQ0VfVFJFRT0iaG9sbHkuZHRzIgogQ09ORklHX0lTQV9ETUFfQVBJPXkKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKaW5kZXggOTU2ZDFkZi4uZDBiNDNkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCkBAIC0xNTYsNyArMTU2LDExIEBACiBDT05GSUdfUFMzX1VTRV9MUEFSX0FERFI9eQogQ09ORklHX1BTM19WVUFSVD15CiBDT05GSUdfUFMzX1BTM0FWPXkKLUNPTkZJR19QUzNfU1lTX01BTkFHRVI9eQorQ09ORklHX1BTM19TWVNfTUFOQUdFUj1tCitDT05GSUdfUFMzX1NUT1JBR0U9eQorQ09ORklHX1BTM19ESVNLPXkKK0NPTkZJR19QUzNfUk9NPXkKK0NPTkZJR19QUzNfRkxBU0g9eQogQ09ORklHX1BQQ19DRUxMPXkKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfSUJNX0NFTExfQkxBREUgaXMgbm90IHNldApAQCAtMzM1LDcgKzMzOSw3IEBACiBDT05GSUdfQlRfTDJDQVA9bQogQ09ORklHX0JUX1NDTz1tCiBDT05GSUdfQlRfUkZDT01NPW0KLSMgQ09ORklHX0JUX1JGQ09NTV9UVFkgaXMgbm90IHNldAorQ09ORklHX0JUX1JGQ09NTV9UVFk9eQogIyBDT05GSUdfQlRfQk5FUCBpcyBub3Qgc2V0CiBDT05GSUdfQlRfSElEUD1tCiAKQEAgLTM0NCw3ICszNDgsOSBAQAogIwogQ09ORklHX0JUX0hDSVVTQj1tCiBDT05GSUdfQlRfSENJVVNCX1NDTz15Ci0jIENPTkZJR19CVF9IQ0lVQVJUIGlzIG5vdCBzZXQKK0NPTkZJR19CVF9IQ0lVQVJUPW0KK0NPTkZJR19CVF9IQ0lVQVJUX0g0PXkKK0NPTkZJR19CVF9IQ0lVQVJUX0JDU1A9eQogIyBDT05GSUdfQlRfSENJQkNNMjAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CVF9IQ0lCUEExMFggaXMgbm90IHNldAogIyBDT05GSUdfQlRfSENJQkZVU0IgaXMgbm90IHNldApAQCAtNDM1LDcgKzQ0MSw3IEBACiAjCiAjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwogIwotIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldApAQCAtNDc5LDYgKzQ4NSw3IEBACiBDT05GSUdfTUlJPW0KIENPTkZJR19ORVRERVZfMTAwMD15CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKK0NPTkZJR19HRUxJQ19ORVQ9eQogCiAjCiAjIFdpcmVsZXNzIExBTgpAQCAtNTQ2LDcgKzU1MywyNyBAQAogIwogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0pPWVNUSUNLPXkKKyMgQ09ORklHX0pPWVNUSUNLX0FOQUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19BM0QgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfQURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0NPQlJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0dGMksgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfR1JJUCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19HUklQX01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0dVSUxMRU1PVCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19JTlRFUkFDVCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19TSURFV0lOREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1RNREMgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfSUZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfTUFHRUxMQU4gaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfU1BBQ0VPUkIgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfU1BBQ0VCQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1NUSU5HRVIgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfVFdJREpPWSBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19KT1lEVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1hQQUQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldApAQCAtNTYzLDcgKzU5MCw3IEBACiBDT05GSUdfVlQ9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA4Niw3ICsxMTEzLDcgQEAKICMKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMTE2LDE2ICsxMTQzLDcgQEAKICMgQ09ORklHX0RFQlVHR0VSIGlzIG5vdCBzZXQKIENPTkZJR19JUlFTVEFDS1M9eQogIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX0VBUkxZX0RFQlVHPXkKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBU19QQU5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBU19DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19NQVBMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfSVNFUklFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUEFTX1JFQUxNT0RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19CRUFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR180NHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCAzZTc3OWYwLi40MmM0MmVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDggQEAKIAogb2JqLXkJCQkJOj0gc2VtYXBob3JlLm8gY3B1dGFibGUubyBwdHJhY2UubyBzeXNjYWxscy5vIFwKIAkJCQkgICBpcnEubyBhbGlnbi5vIHNpZ25hbF8zMi5vIHBtYy5vIHZkc28ubyBcCi0JCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubworCQkJCSAgIGluaXRfdGFzay5vIHByb2Nlc3MubyBzeXN0YmwubyBpZGxlLm8gXAorCQkJCSAgIHNpZ25hbC5vCiBvYmoteQkJCQkrPSB2ZHNvMzIvCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBzZXR1cF82NC5vIGJpbmZtdF9lbGYzMi5vIHN5c19wcGMzMi5vIFwKIAkJCQkgICBzaWduYWxfNjQubyBwdHJhY2UzMi5vIFwKQEAgLTY1LDkgKzY2LDkgQEAKIG1vZHVsZS0kKENPTkZJR19QUEM2NCkJCSs9IG1vZHVsZV82NC5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9ICQobW9kdWxlLXkpCiAKLXBjaTY0LSQoQ09ORklHX1BQQzY0KQkJKz0gcGNpXzY0Lm8gcGNpX2RuLm8KK3BjaTY0LSQoQ09ORklHX1BQQzY0KQkJKz0gcGNpXzY0Lm8gcGNpX2RuLm8gaXNhLWJyaWRnZS5vCiBwY2kzMi0kKENPTkZJR19QUEMzMikJCTo9IHBjaV8zMi5vCi1vYmotJChDT05GSUdfUENJKQkJKz0gJChwY2k2NC15KSAkKHBjaTMyLXkpCitvYmotJChDT05GSUdfUENJKQkJKz0gJChwY2k2NC15KSAkKHBjaTMyLXkpIHBjaS1jb21tb24ubwogb2JqLSQoQ09ORklHX1BDSV9NU0kpCQkrPSBtc2kubwoga2V4ZWMtJChDT05GSUdfUFBDNjQpCQk6PSBtYWNoaW5lX2tleGVjXzY0Lm8KIGtleGVjLSQoQ09ORklHX1BQQzMyKQkJOj0gbWFjaGluZV9rZXhlY18zMi5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggYjJiNWQ2Ni4uYjFmODAwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtMjk0LDYgKzI5NCwyMSBAQAogCQkub3Byb2ZpbGVfbW1jcmFfc2lwcgk9IE1NQ1JBX1NJUFIsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI1IiwKIAl9LAorCXsJLyogUG93ZXI1KysgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDNiMDMwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjUrIChncykiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSNSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI1X1BMVVMsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDYsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjUrKyIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5vcHJvZmlsZV9tbWNyYV9zaWh2CT0gTU1DUkFfU0lIViwKKwkJLm9wcm9maWxlX21tY3JhX3NpcHIJPSBNTUNSQV9TSVBSLAorCQkucGxhdGZvcm0JCT0gInBvd2VyNSsiLAorCX0sCiAJewkvKiBQb3dlcjUgR1MgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCiAJCS5wdnJfdmFsdWUJCT0gMHgwMDNiMDAwMCwKQEAgLTExNzgsOCArMTE5Myw4IEBACiAJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwU1AgUmV2LiBBICovCi0JCS5wdnJfbWFzawkJPSAweGZmMDAwZmZmLAotCQkucHZyX3ZhbHVlCQk9IDB4NTMwMDA4OTEsCisJCS5wdnJfbWFzawkJPSAweGZmZjAwZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4NTMyMDA4OTEsCiAJCS5jcHVfbmFtZQkJPSAiNDQwU1AgUmV2LiBBIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLApAQCAtMTE4OCw5ICsxMjAzLDE5IEBACiAJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwU1BlIFJldi4gQSAqLwotCQkucHZyX21hc2sJCT0gMHhmZjAwMGZmZiwKLQkJLnB2cl92YWx1ZQkJPSAweDUzMDAwODkwLAotCQkuY3B1X25hbWUJCT0gIjQ0MFNQZSBSZXYuIEEiLAorCQkucHZyX21hc2sgICAgICAgICAgICAgICA9IDB4ZmZmMDBmZmYsCisJCS5wdnJfdmFsdWUgICAgICAgICAgICAgID0gMHg1MzQwMDg5MCwKKwkJLmNwdV9uYW1lICAgICAgICAgICAgICAgPSAiNDQwU1BlIFJldi4gQSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMgICAgICA9IENPTU1PTl9VU0VSX0JPT0tFLAorCQkuaWNhY2hlX2JzaXplICAgICAgICAgICA9IDMyLAorCQkuZGNhY2hlX2JzaXplICAgICAgICAgICA9IDMyLAorCQkucGxhdGZvcm0gICAgICAgICAgICAgICA9ICJwcGM0NDAiLAorCX0sCisJeyAvKiA0NDBTUGUgUmV2LiBCICovCisJCS5wdnJfbWFzawkJPSAweGZmZjAwZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4NTM0MDA4OTEsCisJCS5jcHVfbmFtZQkJPSAiNDQwU1BlIFJldi4gQiIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggYzg5NzIwMy4uN2Q3M2ExMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKQEAgLTksNyArOSw2IEBACiAgKiAgcmV3cml0dGVuIGJ5IFBhdWwgTWFja2VycmFzLgogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgogICogIE1QQzh4eCBtb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMTk5NyBEYW4gTWFsZWsgKGRtYWxla0BqbGMubmV0KS4KLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG93LWxldmVsIHN1cHBvcnQgYW5kIHNldHVwIGZvciB0aGUKICAqICBQb3dlclBDIHBsYXRmb3JtLCBpbmNsdWRpbmcgdHJhcCBhbmQgaW50ZXJydXB0IGRpc3BhdGNoLgpAQCAtMzIsMTAgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCi0jaWZkZWYgQ09ORklHX0FQVVMKLSNpbmNsdWRlIDxhc20vYW1pZ2FwcGMuaD4KLSNlbmRpZgotCiAvKiA2MDEgb25seSBoYXZlIElCQVQ7IGNyMC5lcSBpcyBzZXQgb24gNjAxIHdoZW4gdXNpbmcgdGhpcyBtYWNybyAqLwogI2RlZmluZSBMT0FEX0JBVChuLCByZWcsIFJBLCBSQikJXAogCS8qIHNlZSB0aGUgY29tbWVudCBmb3IgY2xlYXJfYmF0cygpIC0tIENvcnQgKi8gXApAQCAtOTIsMTEgKzg3LDYgQEAKICAqICByNDogdmlydHVhbCBhZGRyZXNzIG9mIGJvb3RfaW5mb3NfdAogICogIHI1OiAwCiAgKgotICogQVBVUwotICogICByMzogJ0FQVVMnCi0gKiAgIHI0OiBwaHlzaWNhbCBhZGRyZXNzIG9mIG1lbW9yeSBiYXNlCi0gKiAgIExpbnV4L202OGsgc3R5bGUgQm9vdEluZm8gc3RydWN0dXJlIGF0ICZfZW5kLgotICoKICAqIFBSRVAKICAqIFRoaXMgaXMganVtcGVkIHRvIG9uIHByZXAgc3lzdGVtcyByaWdodCBhZnRlciB0aGUga2VybmVsIGlzIHJlbG9jYXRlZAogICogdG8gaXRzIHByb3BlciBwbGFjZSBpbiBtZW1vcnkgYnkgdGhlIGJvb3QgbG9hZGVyLiAgVGhlIGV4cGVjdGVkIGxheW91dApAQCAtMTUwLDE0ICsxNDAsNiBAQAogICovCiAJYmwJZWFybHlfaW5pdAogCi0jaWZkZWYgQ09ORklHX0FQVVMKLS8qIE9uIEFQVVMgdGhlIF9fdmEvX19wYSBjb25zdGFudHMgbmVlZCB0byBiZSBzZXQgdG8gdGhlIGNvcnJlY3QKLSAqIHZhbHVlcyBiZWZvcmUgY29udGludWluZy4KLSAqLwotCW1yCXI0LHIzMAotCWJsCWZpeF9tZW1fY29uc3RhbnRzCi0jZW5kaWYgLyogQ09ORklHX0FQVVMgKi8KLQogLyogU3dpdGNoIE1NVSBvZmYsIGNsZWFyIEJBVHMgYW5kIGZsdXNoIFRMQi4gQXQgdGhpcyBwb2ludCwgcjMgY29udGFpbnMKICAqIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdlIGFyZSBydW5uaW5nIGF0LCByZXR1cm5lZCBieSBlYXJseV9pbml0KCkKICAqLwpAQCAtMTY3LDcgKzE0OSw3IEBACiAJYmwJZmx1c2hfdGxicwogCiAJYmwJaW5pdGlhbF9iYXRzCi0jaWYgIWRlZmluZWQoQ09ORklHX0FQVVMpICYmIGRlZmluZWQoQ09ORklHX0JPT1RYX1RFWFQpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkKIAlibAlzZXR1cF9kaXNwX2JhdAogI2VuZGlmCiAKQEAgLTE4Myw3ICsxNjUsNiBAQAogI2VuZGlmIC8qIENPTkZJR182eHggKi8KIAogCi0jaWZuZGVmIENPTkZJR19BUFVTCiAvKgogICogV2UgbmVlZCB0byBydW4gd2l0aCBfc3RhcnQgYXQgcGh5c2ljYWwgYWRkcmVzcyAwLgogICogT24gQ0hSUCwgd2UgYXJlIGxvYWRlZCBhdCAweDEwMDAwIHNpbmNlIE9GIG9uIENIUlAgdXNlcwpAQCAtMTk2LDcgKzE3Nyw2IEBACiAJYWRkaXMJcjQscjMsS0VSTkVMQkFTRUBoCS8qIGN1cnJlbnQgYWRkcmVzcyBvZiBfc3RhcnQgKi8KIAljbXB3aQkwLHI0LDAJCQkvKiBhcmUgd2UgYWxyZWFkeSBydW5uaW5nIGF0IDA/ICovCiAJYm5lCXJlbG9jYXRlX2tlcm5lbAotI2VuZGlmIC8qIENPTkZJR19BUFVTICovCiAvKgogICogd2Ugbm93IGhhdmUgdGhlIDFzdCAxNk0gb2YgcmFtIG1hcHBlZCB3aXRoIHRoZSBiYXRzLgogICogcHJlcCBuZWVkcyB0aGUgbW11IHRvIGJlIHR1cm5lZCBvbiBoZXJlLCBidXQgcG1hYyBhbHJlYWR5IGhhcyBpdCBvbi4KQEAgLTg4MSw4NSArODYxLDYgQEAKIAlhZGRpCXI2LHI2LDQKIAlibHIKIAotI2lmZGVmIENPTkZJR19BUFVTCi0vKgotICogT24gQVBVUyB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgaXMgbm90IGtub3duIGF0IGNvbXBpbGUKLSAqIHRpbWUsIHdoaWNoIG1lYW5zIHRoZSBfX3BhL19fdmEgY29uc3RhbnRzIHVzZWQgYXJlIGluY29ycmVjdC4gSW4gdGhlCi0gKiBfX2luaXQgc2VjdGlvbiBpcyByZWNvcmRlZCB0aGUgdmlydHVhbCBhZGRyZXNzZXMgb2YgaW5zdHJ1Y3Rpb25zIHVzaW5nCi0gKiB0aGVzZSBjb25zdGFudHMsIHNvIGFsbCB0aGF0IGhhcyB0byBiZSBkb25lIGlzIGZpeCB0aGVzZSBiZWZvcmUKLSAqIGNvbnRpbnVpbmcgdGhlIGtlcm5lbCBib290LgotICoKLSAqIHI0ID0gVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGtlcm5lbCBiYXNlLgotICovCi1maXhfbWVtX2NvbnN0YW50czoKLQltcglyMTAscjQKLQlhZGRpcwlyMTAscjEwLC1LRVJORUxCQVNFQGggICAgLyogdmlydF90b19waHlzIGNvbnN0YW50ICovCi0JbmVnCXIxMSxyMTAJICAgICAgICAgICAgICAgICAvKiBwaHlzX3RvX3ZpcnQgY29uc3RhbnQgKi8KLQotCWxpcwlyMTIsX192dG9wX3RhYmxlX2JlZ2luQGgKLQlvcmkJcjEyLHIxMixfX3Z0b3BfdGFibGVfYmVnaW5AbAotCWFkZAlyMTIscjEyLHIxMAkgICAgICAgICAvKiB0YWJsZSBiZWdpbiBwaHlzIGFkZHJlc3MgKi8KLQlsaXMJcjEzLF9fdnRvcF90YWJsZV9lbmRAaAotCW9yaQlyMTMscjEzLF9fdnRvcF90YWJsZV9lbmRAbAotCWFkZAlyMTMscjEzLHIxMAkgICAgICAgICAvKiB0YWJsZSBlbmQgcGh5cyBhZGRyZXNzICovCi0Jc3ViaQlyMTIscjEyLDQKLQlzdWJpCXIxMyxyMTMsNAotMToJbHd6dQlyMTQsNChyMTIpICAgICAgICAgICAgICAgLyogdmlydCBhZGRyZXNzIG9mIGluc3RydWN0aW9uICovCi0JYWRkICAgICByMTQscjE0LHIxMCAgICAgICAgICAgICAgLyogcGh5cyBhZGRyZXNzIG9mIGluc3RydWN0aW9uICovCi0JbHd6ICAgICByMTUsMChyMTQpICAgICAgICAgICAgICAgLyogaW5zdHJ1Y3Rpb24sIG5vdyBpbnNlcnQgdG9wICovCi0Jcmx3aW1pICByMTUscjEwLDE2LDE2LDMxICAgICAgICAgLyogaGFsZiBvZiB2cCBjb25zdCBpbiBsb3cgaGFsZiAqLwotCXN0dwlyMTUsMChyMTQpICAgICAgICAgICAgICAgLyogb2YgaW5zdHJ1Y3Rpb24gYW5kIHJlc3RvcmUuICovCi0JZGNic3QJcjAscjE0CQkJIC8qIHdyaXRlIGl0IHRvIG1lbW9yeSAqLwotCXN5bmMKLQlpY2JpCXIwLHIxNAkJCSAvKiBmbHVzaCB0aGUgaWNhY2hlIGxpbmUgKi8KLQljbXB3CXIxMixyMTMKLQlibmUgICAgIDFiCi0Jc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMKLQotLyoKLSAqIE1hcCB0aGUgbWVtb3J5IHdoZXJlIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgd2lsbAotICogYmUgY29waWVkIHRvIHdoZW4gaGFzaCBjb25zdGFudHMgaGF2ZSBiZWVuIHBhdGNoZWQuCi0gKi8KLSNpZmRlZiBDT05GSUdfQVBVU19GQVNUX0VYQ0VQVAotCWxpcwlyOCwweGZmZjAKLSNlbHNlCi0JbGlzCXI4LDAKLSNlbmRpZgotCW9yaQlyOCxyOCwweDIJCS8qIDEyOEtCLCBzdXBlcnZpc29yICovCi0JbXRzcHIJU1BSTl9EQkFUM1UscjgKLQltdHNwcglTUFJOX0RCQVQzTCxyOAotCi0JbGlzCXIxMixfX3B0b3ZfdGFibGVfYmVnaW5AaAotCW9yaQlyMTIscjEyLF9fcHRvdl90YWJsZV9iZWdpbkBsCi0JYWRkCXIxMixyMTIscjEwCSAgICAgICAgIC8qIHRhYmxlIGJlZ2luIHBoeXMgYWRkcmVzcyAqLwotCWxpcwlyMTMsX19wdG92X3RhYmxlX2VuZEBoCi0Jb3JpCXIxMyxyMTMsX19wdG92X3RhYmxlX2VuZEBsCi0JYWRkCXIxMyxyMTMscjEwCSAgICAgICAgIC8qIHRhYmxlIGVuZCBwaHlzIGFkZHJlc3MgKi8KLQlzdWJpCXIxMixyMTIsNAotCXN1YmkJcjEzLHIxMyw0Ci0xOglsd3p1CXIxNCw0KHIxMikgICAgICAgICAgICAgICAvKiB2aXJ0IGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gKi8KLQlhZGQgICAgIHIxNCxyMTQscjEwICAgICAgICAgICAgICAvKiBwaHlzIGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gKi8KLQlsd3ogICAgIHIxNSwwKHIxNCkgICAgICAgICAgICAgICAvKiBpbnN0cnVjdGlvbiwgbm93IGluc2VydCB0b3AgKi8KLQlybHdpbWkgIHIxNSxyMTEsMTYsMTYsMzEgICAgICAgICAvKiBoYWxmIG9mIHB2IGNvbnN0IGluIGxvdyBoYWxmKi8KLQlzdHcJcjE1LDAocjE0KSAgICAgICAgICAgICAgIC8qIG9mIGluc3RydWN0aW9uIGFuZCByZXN0b3JlLiAqLwotCWRjYnN0CXIwLHIxNAkJCSAvKiB3cml0ZSBpdCB0byBtZW1vcnkgKi8KLQlzeW5jCi0JaWNiaQlyMCxyMTQJCQkgLyogZmx1c2ggdGhlIGljYWNoZSBsaW5lICovCi0JY21wdwlyMTIscjEzCi0JYm5lICAgICAxYgotCi0Jc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMJCQkJLyogTm8gc3BlY3VsYXRpdmUgbG9hZGluZyB1bnRpbCBub3cgKi8KLQlibHIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGxlYXNlIG5vdGUgdGhhdCBvbiBBUFVTIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgYXJlIGxvY2F0ZWQgYXQgdGhlCi0gKiAgcGh5c2ljYWwgYWRkcmVzcyAweGZmZjAwMDAuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycwotICogIGNhbm5vdCB1c2UgcmVsYXRpdmUgYnJhbmNoZXMgdG8gYWNjZXNzIHRoZSBjb2RlIGJlbG93LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2VuZGlmIC8qIENPTkZJR19BUFVTICovCi0KICNpZmRlZiBDT05GSUdfU01QCiAjaWZkZWYgQ09ORklHX0dFTUlOSQogCS5nbG9ibAlfX3NlY29uZGFyeV9zdGFydF9nZW1pbmkKQEAgLTExMzUsMTkgKzEwMzYsNiBAQAogCWJsCV9fc2F2ZV9jcHVfc2V0dXAKIAlibAlNTVVfaW5pdAogCi0jaWZkZWYgQ09ORklHX0FQVVMKLQkvKiBDb3B5IGV4Y2VwdGlvbiBjb2RlIHRvIGV4Y2VwdGlvbiB2ZWN0b3IgYmFzZSBvbiBBUFVTLiAqLwotCWxpcwlyNCxLRVJORUxCQVNFQGgKLSNpZmRlZiBDT05GSUdfQVBVU19GQVNUX0VYQ0VQVAotCWxpcwlyMywweGZmZjAJCS8qIENvcHkgdG8gMHhmZmYwMDAwMCAqLwotI2Vsc2UKLQlsaXMJcjMsMAkJCS8qIENvcHkgdG8gMHgwMDAwMDAwMCAqLwotI2VuZGlmCi0JbGkJcjUsMHg0MDAwCQkvKiAjIGJ5dGVzIG9mIG1lbW9yeSB0byBjb3B5ICovCi0JbGkJcjYsMAotCWJsCWNvcHlfYW5kX2ZsdXNoCQkvKiBjb3B5IHRoZSBmaXJzdCAweDQwMDAgYnl0ZXMgKi8KLSNlbmRpZiAgLyogQ09ORklHX0FQVVMgKi8KLQogLyoKICAqIEdvIGJhY2sgdG8gcnVubmluZyB1bm1hcHBlZCBzbyB3ZSBjYW4gbG9hZCB1cCBuZXcgdmFsdWVzCiAgKiBmb3IgU0RSMSAoaGFzaCB0YWJsZSBwb2ludGVyKSBhbmQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzCkBAIC0xMzI0LDExICsxMjEyLDcgQEAKICNlbHNlCiAJb3JpCXI4LHI4LDIJCQkvKiBSL1cgYWNjZXNzICovCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwotI2lmZGVmIENPTkZJR19BUFVTCi0Jb3JpCXIxMSxyMTEsQkxfOE08PDJ8MHgyCS8qIHNldCB1cCA4TUIgQkFUIHJlZ2lzdGVycyBmb3IgNjA0ICovCi0jZWxzZQogCW9yaQlyMTEscjExLEJMXzI1Nk08PDJ8MHgyCS8qIHNldCB1cCBCQVQgcmVnaXN0ZXJzIGZvciA2MDQgKi8KLSNlbmRpZiAvKiBDT05GSUdfQVBVUyAqLwogCiAJbXRzcHIJU1BSTl9EQkFUMEwscjgJCS8qIE4uQi4gNnh4IChub3QgNjAxKSBoYXZlIHZhbGlkICovCiAJbXRzcHIJU1BSTl9EQkFUMFUscjExCQkvKiBiaXQgaW4gdXBwZXIgQkFUIHJlZ2lzdGVyICovCkBAIC0xMzM4LDcgKzEyMjIsNyBAQAogCWJscgogCiAKLSNpZiAhZGVmaW5lZChDT05GSUdfQVBVUykgJiYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkKKyNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAogc2V0dXBfZGlzcF9iYXQ6CiAJLyoKIAkgKiBzZXR1cCB0aGUgZGlzcGxheSBiYXQgcHJlcGFyZWQgZm9yIHVzIGluIHByb20uYwpAQCAtMTM2Miw3ICsxMjQ2LDcgQEAKIDE6CW10c3ByCVNQUk5fSUJBVDNMLHI4CiAJbXRzcHIJU1BSTl9JQkFUM1UscjExCiAJYmxyCi0jZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX0FQVVMpICYmIGRlZmluZWQoQ09ORklHX0JPT1RYX1RFWFQpICovCisjZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KIAogI2lmZGVmIENPTkZJR184MjYwCiAvKiBKdW1wIGludG8gdGhlIHN5c3RlbSByZXNldCBmb3IgdGhlIHJvbS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggMTExMWZjZS4uOGNkZDQ4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTEwMyw4ICsxMDMsOCBAQAogCiAJLiA9IDB4NjAKIC8qCi0gKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCBvbiBwU2VyaWVzIHRvIGhvbGQgc2Vjb25kYXJ5IHByb2Nlc3NvcnMKLSAqIGluIGEgc3BpbiBsb29wIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGZyZWVkIGZyb20gT3BlbkZpcm13YXJlLCBidXQKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB1c2VkIHRvIGhvbGQgc2Vjb25kYXJ5IHByb2Nlc3NvcnMKKyAqIGluIGEgc3BpbiBsb29wIGFmdGVyIHRoZXkgaGF2ZSBlbnRlcmVkIHRoZSBrZXJuZWwsIGJ1dAogICogYmVmb3JlIHRoZSBidWxrIG9mIHRoZSBrZXJuZWwgaGFzIGJlZW4gcmVsb2NhdGVkLiAgVGhpcyBjb2RlCiAgKiBpcyByZWxvY2F0ZWQgdG8gcGh5c2ljYWwgYWRkcmVzcyAweDYwIGJlZm9yZSBwcm9tX2luaXQgaXMgcnVuLgogICogQWxsIG9mIGl0IG11c3QgZml0IGJlbG93IHRoZSBmaXJzdCBleGNlcHRpb24gdmVjdG9yIGF0IDB4MTAwLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCmluZGV4IDM0YWUxMTQuLmUzMWFjYTkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCkBAIC0zNSw3ICszNSw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC02Niw3ICs2Niw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC05Nyw3ICs5Nyw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC0xNTUsMjEgKzE1NSwyMSBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwogCXdoaWxlKG4gJiYgKCFJT19DSEVDS19BTElHTih2c3JjLCA0KSB8fCAhSU9fQ0hFQ0tfQUxJR04oZGVzdCwgNCkpKSB7CiAJCSooKHU4ICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1OCAqKXZzcmMpOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJCWVpZWlvKCk7CiAJCXZzcmMrKzsKIAkJZGVzdCsrOwogCQluLS07CiAJfQogCXdoaWxlKG4gPiA0KSB7CiAJCSooKHUzMiAqKWRlc3QpID0gKigodm9sYXRpbGUgdTMyICopdnNyYyk7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKKwkJZWllaW8oKTsKIAkJdnNyYyArPSA0OwogCQlkZXN0ICs9IDQ7CiAJCW4gLT0gNDsKIAl9CiAJd2hpbGUobikgewogCQkqKCh1OCAqKWRlc3QpID0gKigodm9sYXRpbGUgdTggKil2c3JjKTsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOworCQllaWVpbygpOwogCQl2c3JjKys7CiAJCWRlc3QrKzsKIAkJbi0tOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggYzJiODRjNi4uMmZjODc4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC03LDcgKzcsNiBAQAogICogICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEgQ29ydCBEb3VnYW4KICAqICBBZGFwdGVkIGZvciBQb3dlciBNYWNpbnRvc2ggYnkgUGF1bCBNYWNrZXJyYXMKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0zMzcsNyArMzM2LDggQEAKIAogdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKIHsKLQlwcGNfbWQuaW5pdF9JUlEoKTsKKwlpZiAocHBjX21kLmluaXRfSVJRKQorCQlwcGNfbWQuaW5pdF9JUlEoKTsKICNpZmRlZiBDT05GSUdfUFBDNjQKIAlpcnFfY3R4X2luaXQoKTsKICNlbmRpZgpAQCAtNTk3LDYgKzU5Nyw0OSBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAorc3RhdGljIGludCBpcnFfc2V0dXBfdmlycShzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgIGlycV9od19udW1iZXJfdCBod2lycSkKK3sKKwkvKiBDbGVhciBJUlFfTk9SRVFVRVNUIGZsYWcgKi8KKwlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyAmPSB+SVJRX05PUkVRVUVTVDsKKworCS8qIG1hcCBpdCAqLworCXNtcF93bWIoKTsKKwlpcnFfbWFwW3ZpcnFdLmh3aXJxID0gaHdpcnE7CisJc21wX21iKCk7CisKKwlpZiAoaG9zdC0+b3BzLT5tYXAoaG9zdCwgdmlycSwgaHdpcnEpKSB7CisJCXByX2RlYnVnKCJpcnE6IC0+IG1hcHBpbmcgZmFpbGVkLCBmcmVlaW5nXG4iKTsKKwkJaXJxX2ZyZWVfdmlydCh2aXJxLCAxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9kaXJlY3RfbWFwcGluZyhzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlpZiAoaG9zdCA9PSBOVUxMKQorCQlob3N0ID0gaXJxX2RlZmF1bHRfaG9zdDsKKworCUJVR19PTihob3N0ID09IE5VTEwpOworCVdBUk5fT04oaG9zdC0+cmV2bWFwX3R5cGUgIT0gSVJRX0hPU1RfTUFQX05PTUFQKTsKKworCXZpcnEgPSBpcnFfYWxsb2NfdmlydChob3N0LCAxLCAwKTsKKwlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJcHJfZGVidWcoImlycTogY3JlYXRlX2RpcmVjdCB2aXJxIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5PX0lSUTsKKwl9CisKKwlwcl9kZWJ1ZygiaXJxOiBjcmVhdGVfZGlyZWN0IG9idGFpbmVkIHZpcnEgJWRcbiIsIHZpcnEpOworCisJaWYgKGlycV9zZXR1cF92aXJxKGhvc3QsIHZpcnEsIHZpcnEpKQorCQlyZXR1cm4gTk9fSVJROworCisJcmV0dXJuIHZpcnE7Cit9CiAKIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0LAogCQkJCWlycV9od19udW1iZXJfdCBod2lycSkKQEAgLTY0NSwxOCArNjg4LDkgQEAKIAl9CiAJcHJfZGVidWcoImlycTogLT4gb2J0YWluZWQgdmlycSAlZFxuIiwgdmlycSk7CiAKLQkvKiBDbGVhciBJUlFfTk9SRVFVRVNUIGZsYWcgKi8KLQlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyAmPSB+SVJRX05PUkVRVUVTVDsKLQotCS8qIG1hcCBpdCAqLwotCXNtcF93bWIoKTsKLQlpcnFfbWFwW3ZpcnFdLmh3aXJxID0gaHdpcnE7Ci0Jc21wX21iKCk7Ci0JaWYgKGhvc3QtPm9wcy0+bWFwKGhvc3QsIHZpcnEsIGh3aXJxKSkgewotCQlwcl9kZWJ1ZygiaXJxOiAtPiBtYXBwaW5nIGZhaWxlZCwgZnJlZWluZ1xuIik7Ci0JCWlycV9mcmVlX3ZpcnQodmlycSwgMSk7CisJaWYgKGlycV9zZXR1cF92aXJxKGhvc3QsIHZpcnEsIGh3aXJxKSkKIAkJcmV0dXJuIE5PX0lSUTsKLQl9CisKIAlyZXR1cm4gdmlycTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycV9jcmVhdGVfbWFwcGluZyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lzYS1icmlkZ2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjQ5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lzYS1icmlkZ2UuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIFJvdXRpbmVzIGZvciB0cmFja2luZyBhIGxlZ2FjeSBJU0EgYnJpZGdlCisgKgorICogQ29weXJpZ2ggMjAwNyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqCisgKiBTb21lIGJpdHMgYW5kIHBpZWNlcyBtb3ZlZCBvdmVyIGZyb20gcGNpXzY0LmMKKyAqCisgKiBDb3B5cmlnaCAyMDAzIEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTSBDb3JwLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisKK3Vuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2U7CS8qIE5VTEwgaWYgbm8gSVNBIGJ1cyAqLworRVhQT1JUX1NZTUJPTChpc2FfaW9fYmFzZSk7CisKKy8qIENhY2hlZCBJU0EgYnJpZGdlIGRldi4gKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlzYV9icmlkZ2VfZGV2bm9kZTsKK3N0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlX3BjaWRldjsKK0VYUE9SVF9TWU1CT0xfR1BMKGlzYV9icmlkZ2VfcGNpZGV2KTsKKworI2RlZmluZSBJU0FfU1BBQ0VfTUFTSyAweDEKKyNkZWZpbmUgSVNBX1NQQUNFX0lPIDB4MQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX3Byb2Nlc3NfSVNBX09GX3JhbmdlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmlzYV9ub2RlLAorCQkJCQkJdW5zaWduZWQgbG9uZyBwaGJfaW9fYmFzZV9waHlzKQoreworCS8qIFdlIHNob3VsZCBnZXQgc29tZSBzYW5lciBwYXJzaW5nIGhlcmUgYW5kIHJlbW92ZSB0aGVzZSBzdHJ1Y3RzICovCisJc3RydWN0IHBjaV9hZGRyZXNzIHsKKwkJdTMyIGFfaGk7CisJCXUzMiBhX21pZDsKKwkJdTMyIGFfbG87CisJfTsKKworCXN0cnVjdCBpc2FfYWRkcmVzcyB7CisJCXUzMiBhX2hpOworCQl1MzIgYV9sbzsKKwl9OworCisJc3RydWN0IGlzYV9yYW5nZSB7CisJCXN0cnVjdCBpc2FfYWRkcmVzcyBpc2FfYWRkcjsKKwkJc3RydWN0IHBjaV9hZGRyZXNzIHBjaV9hZGRyOworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl9OworCisJY29uc3Qgc3RydWN0IGlzYV9yYW5nZSAqcmFuZ2U7CisJdW5zaWduZWQgbG9uZyBwY2lfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaXNhX2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IHJsZW4gPSAwOworCisJcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoaXNhX25vZGUsICJyYW5nZXMiLCAmcmxlbik7CisJaWYgKHJhbmdlID09IE5VTEwgfHwgKHJsZW4gPCBzaXplb2Yoc3RydWN0IGlzYV9yYW5nZSkpKQorCQlnb3RvIGludmFsX3JhbmdlOworCisJLyogRnJvbSAiSVNBIEJpbmRpbmcgdG8gMTI3NSIKKwkgKiBUaGUgcmFuZ2VzIHByb3BlcnR5IGlzIGxhaWQgb3V0IGFzIGFuIGFycmF5IG9mIGVsZW1lbnRzLAorCSAqIGVhY2ggb2Ygd2hpY2ggY29tcHJpc2VzOgorCSAqICAgY2VsbHMgMCAtIDE6CWFuIElTQSBhZGRyZXNzCisJICogICBjZWxscyAyIC0gNDoJYSBQQ0kgYWRkcmVzcworCSAqCQkJKHNpemUgZGVwZW5kaW5nIG9uIGRldi0+bl9hZGRyX2NlbGxzKQorCSAqICAgY2VsbCA1OgkJdGhlIHNpemUgb2YgdGhlIHJhbmdlCisJICovCisJaWYgKChyYW5nZS0+aXNhX2FkZHIuYV9oaSAmJiBJU0FfU1BBQ0VfTUFTSykgIT0gSVNBX1NQQUNFX0lPKSB7CisJCXJhbmdlKys7CisJCXJsZW4gLT0gc2l6ZW9mKHN0cnVjdCBpc2FfcmFuZ2UpOworCQlpZiAocmxlbiA8IHNpemVvZihzdHJ1Y3QgaXNhX3JhbmdlKSkKKwkJCWdvdG8gaW52YWxfcmFuZ2U7CisJfQorCWlmICgocmFuZ2UtPmlzYV9hZGRyLmFfaGkgJiYgSVNBX1NQQUNFX01BU0spICE9IElTQV9TUEFDRV9JTykKKwkJZ290byBpbnZhbF9yYW5nZTsKKworCWlzYV9hZGRyID0gcmFuZ2UtPmlzYV9hZGRyLmFfbG87CisJcGNpX2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmFuZ2UtPnBjaV9hZGRyLmFfbWlkIDw8IDMyIHwKKwkJcmFuZ2UtPnBjaV9hZGRyLmFfbG87CisKKwkvKiBBc3N1bWUgdGhlc2UgYXJlIGJvdGggemVyby4gTm90ZTogV2UgY291bGQgZml4IHRoYXQgYW5kCisJICogZG8gYSBwcm9wZXIgcGFyc2luZyBpbnN0ZWFkIC4uLiBvaCB3ZWxsLCB0aGF0IHdpbGwgZG8gZm9yCisJICogbm93IGFzIG5vYm9keSB1c2VzIGZhbmN5IG1hcHBpbmdzIGZvciBJU0EgYnJpZGdlcworCSAqLworCWlmICgocGNpX2FkZHIgIT0gMCkgfHwgKGlzYV9hZGRyICE9IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBpc2EgdG8gcGNpIG1hcHBpbmc6ICVzXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsaWduIHNpemUgYW5kIG1ha2Ugc3VyZSBpdCdzIGNyb3BwZWQgdG8gNjRLICovCisJc2l6ZSA9IFBBR0VfQUxJR04ocmFuZ2UtPnNpemUpOworCWlmIChzaXplID4gMHgxMDAwMCkKKwkJc2l6ZSA9IDB4MTAwMDA7CisKKwlwcmludGsoS0VSTl9FUlIgIm5vIElTQSBJTyByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2UsIgorCSAgICAgICAibWFwcGluZyA2NGtcbiIpOworCisJX19pb3JlbWFwX2F0KHBoYl9pb19iYXNlX3BoeXMsICh2b2lkICopSVNBX0lPX0JBU0UsCisJCSAgICAgc2l6ZSwgX1BBR0VfTk9fQ0FDSEV8X1BBR0VfR1VBUkRFRCk7CisJcmV0dXJuOworCitpbnZhbF9yYW5nZToKKwlwcmludGsoS0VSTl9FUlIgIm5vIElTQSBJTyByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2UsIgorCSAgICAgICAibWFwcGluZyA2NGtcbiIpOworCV9faW9yZW1hcF9hdChwaGJfaW9fYmFzZV9waHlzLCAodm9pZCAqKUlTQV9JT19CQVNFLAorCQkgICAgIDB4MTAwMDAsIF9QQUdFX05PX0NBQ0hFfF9QQUdFX0dVQVJERUQpOworfQorCisKKy8qKgorICogaXNhX2JyaWRnZV9maW5kX2Vhcmx5IC0gRmluZCBhbmQgbWFwIHRoZSBJU0EgSU8gc3BhY2UgZWFybHkgYmVmb3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBtYWluIFBDSSBkaXNjb3ZlcnkuIFRoaXMgaXMgb3B0aW9uYWxseSBjYWxsZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcmNoIGNvZGUgd2hlbiBhZGRpbmcgUENJIFBIQnMgdG8gZ2V0IGVhcmx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgdG8gSVNBIElPIHBvcnRzCisgKi8KK3ZvaWQgX19pbml0IGlzYV9icmlkZ2VfZmluZF9lYXJseShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnBhcmVudCA9IE5VTEwsICp0bXA7CisKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gSVNBIGJyaWRnZSwgYmFpbCBvZmYgKi8KKwlpZiAoaXNhX2JyaWRnZV9kZXZub2RlICE9IE5VTEwpCisJCXJldHVybjsKKworCS8qIEZvciBlYWNoICJpc2EiIG5vZGUgaW4gdGhlIHN5c3RlbS4gTm90ZSA6IHdlIGRvIGEgc2VhcmNoIGJ5CisJICogdHlwZSBhbmQgbm90IGJ5IG5hbWUuIEl0IG1pZ2h0IGJlIGJldHRlciB0byBkbyBieSBuYW1lIGJ1dCB0aGF0J3MKKwkgKiB3aGF0IHRoZSBjb2RlIHVzZWQgdG8gZG8gYW5kIEkgZG9uJ3Qgd2FudCB0byBicmVhayB0b28gbXVjaCBhdAorCSAqIG9uY2UuIFdlIGNhbiBsb29rIGludG8gY2hhbmdpbmcgdGhhdCBzZXBhcmF0ZWx5CisJICovCisJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5wLCAiaXNhIikgeworCQkvKiBMb29rIGZvciBvdXIgaG9zZSBiZWluZyBhIHBhcmVudCAqLworCQlmb3IgKHBhcmVudCA9IG9mX2dldF9wYXJlbnQobnApOyBwYXJlbnQ7KSB7CisJCQlpZiAocGFyZW50ID09IGhvc2UtPmFyY2hfZGF0YSkgeworCQkJCW9mX25vZGVfcHV0KHBhcmVudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0bXAgPSBwYXJlbnQ7CisJCQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KHBhcmVudCk7CisJCQlvZl9ub2RlX3B1dCh0bXApOworCQl9CisJCWlmIChwYXJlbnQgIT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKwlpZiAobnAgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlzYV9icmlkZ2VfZGV2bm9kZSA9IG5wOworCisJLyogTm93IHBhcnNlIHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSBhbmQgc2V0dXAgdGhlIElTQSBtYXBwaW5nICovCisJcGNpX3Byb2Nlc3NfSVNBX09GX3JhbmdlcyhucCwgaG9zZS0+aW9fYmFzZV9waHlzKTsKKworCS8qIFNldCB0aGUgZ2xvYmFsIElTQSBpbyBiYXNlIHRvIGluZGljYXRlIHdlIGhhdmUgYW4gSVNBIGJyaWRnZSAqLworCWlzYV9pb19iYXNlID0gSVNBX0lPX0JBU0U7CisKKwlwcl9kZWJ1ZygiSVNBIGJyaWRnZSAoZWFybHkpIGlzICVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKK30KKworLyoqCisgKiBpc2FfYnJpZGdlX2ZpbmRfbGF0ZSAtIEZpbmQgYW5kIG1hcCB0aGUgSVNBIElPIHNwYWNlIHVwb24gZGlzY292ZXJ5IG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGEgbmV3IElTQSBicmlkZ2UKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGlzYV9icmlkZ2VfZmluZF9sYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldm5vZGUpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7CisKKwkvKiBTdG9yZSBJU0EgZGV2aWNlIG5vZGUgYW5kIFBDSSBkZXZpY2UgKi8KKwlpc2FfYnJpZGdlX2Rldm5vZGUgPSBvZl9ub2RlX2dldChkZXZub2RlKTsKKwlpc2FfYnJpZGdlX3BjaWRldiA9IHBkZXY7CisKKwkvKiBOb3cgcGFyc2UgdGhlICJyYW5nZXMiIHByb3BlcnR5IGFuZCBzZXR1cCB0aGUgSVNBIG1hcHBpbmcgKi8KKwlwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKGRldm5vZGUsIGhvc2UtPmlvX2Jhc2VfcGh5cyk7CisKKwkvKiBTZXQgdGhlIGdsb2JhbCBJU0EgaW8gYmFzZSB0byBpbmRpY2F0ZSB3ZSBoYXZlIGFuIElTQSBicmlkZ2UgKi8KKwlpc2FfaW9fYmFzZSA9IElTQV9JT19CQVNFOworCisJcHJfZGVidWcoIklTQSBicmlkZ2UgKGxhdGUpIGlzICVzIG9uICVzXG4iLAorCQkgZGV2bm9kZS0+ZnVsbF9uYW1lLCBwY2lfbmFtZShwZGV2KSk7Cit9CisKKy8qKgorICogaXNhX2JyaWRnZV9yZW1vdmUgLSBSZW1vdmUvdW5tYXAgYW4gSVNBIGJyaWRnZQorICovCitzdGF0aWMgdm9pZCBpc2FfYnJpZGdlX3JlbW92ZSh2b2lkKQoreworCXByX2RlYnVnKCJJU0EgYnJpZGdlIHJlbW92ZWQgIVxuIik7CisKKwkvKiBDbGVhciB0aGUgZ2xvYmFsIElTQSBpbyBiYXNlIHRvIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBubyBtb3JlCisJICogSVNBIGJyaWRnZS4gTm90ZSB0aGF0IGRyaXZlcnMgZG9uJ3QgcXVpdGUgaGFuZGxlIHRoYXQsIHRob3VnaAorCSAqIHdlIHNob3VsZCBwcm9iYWJseSBkbyBzb21ldGhpbmcgYWJvdXQgaXQuIEJ1dCBkbyB3ZSBldmVyIHJlYWxseQorCSAqIGhhdmUgSVNBIGJyaWRnZXMgYmVpbmcgcmVtb3ZlZCBvbiBtYWNoaW5lcyB1c2luZyBsZWdhY3kgZGV2aWNlcyA/CisJICovCisJaXNhX2lvX2Jhc2UgPSBJU0FfSU9fQkFTRTsKKworCS8qIENsZWFyIHJlZmVyZW5jZXMgdG8gdGhlIGJyaWRnZSAqLworCW9mX25vZGVfcHV0KGlzYV9icmlkZ2VfZGV2bm9kZSk7CisJaXNhX2JyaWRnZV9kZXZub2RlID0gTlVMTDsKKwlpc2FfYnJpZGdlX3BjaWRldiA9IE5VTEw7CisKKwkvKiBVbm1hcCB0aGUgSVNBIGFyZWEgKi8KKwlfX2lvdW5tYXBfYXQoKHZvaWQgKilJU0FfSU9fQkFTRSwgMHgxMDAwMCk7Cit9CisKKy8qKgorICogaXNhX2JyaWRnZV9ub3RpZnkgLSBHZXQgbm90aWZpZWQgb2YgUENJIGRldmljZXMgYWRkaXRpb24vcmVtb3ZhbAorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2FfYnJpZGdlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2bm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKworCXN3aXRjaChhY3Rpb24pIHsKKwljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbiBlYXJseSBJU0EgZGV2aWNlLCB3aXRob3V0IFBDSSBkZXYgKi8KKwkJaWYgKGlzYV9icmlkZ2VfZGV2bm9kZSAmJiBpc2FfYnJpZGdlX2Rldm5vZGUgPT0gZGV2bm9kZSAmJgorCQkgICAgIWlzYV9icmlkZ2VfcGNpZGV2KSB7CisJCQlwcl9kZWJ1ZygiSVNBIGJyaWRnZSBQQ0kgYXR0YWNoZWQ6ICVzXG4iLAorCQkJCSBwY2lfbmFtZShwZGV2KSk7CisJCQlpc2FfYnJpZGdlX3BjaWRldiA9IHBkZXY7CisJCX0KKworCQkvKiBDaGVjayBpZiB3ZSBoYXZlIG5vIElTQSBkZXZpY2UsIGFuZCB0aGlzIGhhcHBlbnMgdG8gYmUgb25lLAorCQkgKiByZWdpc3RlciBpdCBhcyBzdWNoIGlmIGl0IGhhcyBhbiBPRiBkZXZpY2UKKwkJICovCisJCWlmICghaXNhX2JyaWRnZV9kZXZub2RlICYmIGRldm5vZGUgJiYgZGV2bm9kZS0+dHlwZSAmJgorCQkgICAgIXN0cmNtcChkZXZub2RlLT50eXBlLCAiaXNhIikpCisJCQlpc2FfYnJpZGdlX2ZpbmRfbGF0ZShwZGV2LCBkZXZub2RlKTsKKworCQlyZXR1cm4gMDsKKwljYXNlIEJVU19OT1RJRllfREVMX0RFVklDRToKKwkJLyogQ2hlY2sgaWYgdGhpcyBvdXIgZXhpc3RpbmcgSVNBIGRldmljZSAqLworCQlpZiAocGRldiA9PSBpc2FfYnJpZGdlX3BjaWRldiB8fAorCQkgICAgKGRldm5vZGUgJiYgZGV2bm9kZSA9PSBpc2FfYnJpZGdlX2Rldm5vZGUpKQorCQkJaXNhX2JyaWRnZV9yZW1vdmUoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlzYV9icmlkZ2Vfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpc2FfYnJpZGdlX25vdGlmeQorfTsKKworLyoqCisgKiBpc2FfYnJpZGdlX2luaXQgLSByZWdpc3RlciB0byBiZSBub3RpZmllZCBvZiBJU0EgYnJpZGdlIGFkZGl0aW9uL3JlbW92YWwKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlzYV9icmlkZ2VfaW5pdCh2b2lkKQoreworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlyZXR1cm4gMDsKKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBjaV9idXNfdHlwZSwgJmlzYV9icmlkZ2Vfbm90aWZpZXIpOworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChpc2FfYnJpZGdlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCA5OGRlY2Y4Li5lNzA4YWI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtMzkyLDcgKzM5Miw3IEBACiAJbXRzcHIgICBTUFJOX0wxQ1NSMCxyMwogCWlzeW5jCiAJYmxyCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCiAJbWZzcHIJcjMsU1BSTl9MMUNTUjEKIAlvcmkJcjMscjMsTDFDU1IxX0lDRkl8TDFDU1IxX0lDTEZSCiAJbXRzcHIJU1BSTl9MMUNTUjEscjMKQEAgLTQxOSw3ICs0MTksNyBAQAogX0dMT0JBTChfX2ZsdXNoX2ljYWNoZV9yYW5nZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCWxpCXI1LEwxX0NBQ0hFX0JZVEVTLTEKIAlhbmRjCXIzLHIzLHI1CiAJc3ViZglyNCxyMyxyNApAQCAtNTE0LDggKzUxNCw4IEBACiAgKi8KIF9HTE9CQUwoX19mbHVzaF9kY2FjaGVfaWNhY2hlKQogQkVHSU5fRlRSX1NFQ1RJT04KLQlibHIJCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorCWJscgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCXJsd2lubQlyMyxyMywwLDAsMTkJCQkvKiBHZXQgcGFnZSBiYXNlIGFkZHJlc3MgKi8KIAlsaQlyNCw0MDk2L0wxX0NBQ0hFX0JZVEVTCS8qIE51bWJlciBvZiBsaW5lcyBpbiBhIHBhZ2UgKi8KIAltdGN0cglyNApAQCAtNTQzLDcgKzU0Myw3IEBACiBfR0xPQkFMKF9fZmx1c2hfZGNhY2hlX2ljYWNoZV9waHlzKQogQkVHSU5fRlRSX1NFQ1RJT04KIAlibHIJCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCW1mbXNyCXIxMAogCXJsd2lubQlyMCxyMTAsMCwyOCwyNgkJCS8qIGNsZWFyIERSICovCiAJbXRtc3IJcjAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKaW5kZXggNTE5ODYxZC4uYmJiM2JhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKQEAgLTY0Niw2ICs2NDYsMTkgQEAKIAkvKiB0dXJuIG9mZiBtbXUgKi8KIAlibAlyZWFsX21vZGUKIAorCS8qIGNvcHkgIDB4MTAwIGJ5dGVzIHN0YXJ0aW5nIGF0IHN0YXJ0IHRvIDAgKi8KKwlsaQlyMywwCisJbXIJcjQscjMwCQkvKiBzdGFydCwgYWthIHBoeXMgbWVtIG9mZnNldCAqLworCWxpCXI1LDB4MTAwCisJbGkJcjYsMAorCWJsCS5jb3B5X2FuZF9mbHVzaAkvKiAoZGVzdCwgc3JjLCBjb3B5IGxpbWl0LCBzdGFydCBvZmZzZXQpICovCisxOgkvKiBhc3N1bWUgbm9ybWFsIGJsciByZXR1cm4gKi8KKworCS8qIHJlbGVhc2Ugb3RoZXIgY3B1cyB0byB0aGUgbmV3IGtlcm5lbCBzZWNvbmRhcnkgc3RhcnQgYXQgMHg2MCAqLworCW1mbHIJcjUKKwlsaQlyNiwxCisJc3R3CXI2LGtleGVjX2ZsYWctMWIoNSkKKwogCS8qIGNsZWFyIG91dCBoYXJkd2FyZSBoYXNoIHBhZ2UgdGFibGUgYW5kIHRsYiAqLwogCWxkCXI1LDAocjI3KQkJLyogZGVyZWYgZnVuY3Rpb24gZGVzY3JpcHRvciAqLwogCW10Y3RyCXI1CkBAIC02NzYsMTkgKzY4OSw2IEBACiAgKiAgICBhcmUgdGhlIGJvb3QgY3B1ID8/Pz8/CiAgKiAgICBvdGhlciBkZXZpY2UgdHJlZSBkaWZmZXJlbmNlcyAocHJvcCBzaXplcywgdmEgdnMgcGEsIGV0YykuLi4KICAqLwotCi0JLyogY29weSAgMHgxMDAgYnl0ZXMgc3RhcnRpbmcgYXQgc3RhcnQgdG8gMCAqLwotCWxpCXIzLDAKLQltcglyNCxyMzAKLQlsaQlyNSwweDEwMAotCWxpCXI2LDAKLQlibAkuY29weV9hbmRfZmx1c2gJLyogKGRlc3QsIHNyYywgY29weSBsaW1pdCwgc3RhcnQgb2Zmc2V0KSAqLwotMToJLyogYXNzdW1lIG5vcm1hbCBibHIgcmV0dXJuICovCi0KLQkvKiByZWxlYXNlIG90aGVyIGNwdXMgdG8gdGhlIG5ldyBrZXJuZWwgc2Vjb25kYXJ5IHN0YXJ0IGF0IDB4NjAgKi8KLQltZmxyCXI1Ci0JbGkJcjYsMQotCXN0dwlyNixrZXhlY19mbGFnLTFiKDUpCiAJbXIJcjMscjI1CSMgbXkgcGh5cyBjcHUKIAltcglyNCxyMzAJIyBzdGFydCwgYWthIHBoeXMgbWVtIG9mZnNldAogCW10bHIJNApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCmluZGV4IGQ0NTRmNjEuLjk1MzZlZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKQEAgLTQyNywxNCArNDI3LDYgQEAKIAkvKiBQcm9jZXNzICJyYW5nZXMiIHByb3BlcnR5ICovCiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIGRldi0+bm9kZSwgMCk7CiAKLQkvKiBTZXR1cCBJTyBzcGFjZS4gV2UgdXNlIHRoZSBub24tZHluYW1pYyB2ZXJzaW9uIG9mIHRoYXQgY29kZSBoZXJlLAotCSAqIHdoaWNoIGRvZXNuJ3QgcXVpdGUgc3VwcG9ydCB1bnBsdWdnaW5nLiBOZXh0IGtlcm5lbCByZWxlYXNlIHdpbGwKLQkgKiBoYXZlIGEgYmV0dGVyIGZpeCBmb3IgdGhpcy4KLQkgKiBOb3RlIGFsc28gdGhhdCB3ZSBkb24ndCBkbyBJU0EsIHRoaXMgd2lsbCBhbHNvIGJlIGZpeGVkIHdpdGggYQotCSAqIG1vcmUgbWFzc2l2ZSByZXdvcmsuCi0JICovCi0JcGNpX3NldHVwX3BoYl9pbyhwaGIsIHBjaV9pb19iYXNlID09IDApOwotCiAJLyogSW5pdCBwY2lfZG4gZGF0YSBzdHJ1Y3R1cmVzICovCiAJcGNpX2RldnNfcGhiX2luaXRfZHluYW1pYyhwaGIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjVlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIENvbnRhaW5zIGNvbW1vbiBwY2kgcm91dGluZXMgZm9yIEFMTCBwcGMgcGxhdGZvcm0KKyAqIChiYXNlZCBvbiBwY2lfMzIuYyBhbmQgcGNpXzY0LmMpCisgKgorICogUG9ydCBmb3IgUFBDNjQgRGF2aWQgRW5nZWJyZXRzZW4sIElCTSBDb3JwLgorICogQ29udGFpbnMgY29tbW9uIHBjaSByb3V0aW5lcyBmb3IgcHBjNjQgcGxhdGZvcm0sIHBTZXJpZXMgYW5kIGlTZXJpZXMgYnJhbmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KKyAqICAgUmV3b3JrLCBiYXNlZCBvbiBhbHBoYSBQQ0kgY29kZS4KKyAqCisgKiBDb21tb24gcG1hYy9wcmVwL2NocnAgcGNpIHJvdXRpbmVzLiAtLSBDb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ayhmbXQpCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKQorI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zZV9zcGlubG9jayk7CisKKy8qIFhYWCBraWxsIHRoYXQgc29tZSBkYXkgLi4uICovCitpbnQgZ2xvYmFsX3BoYl9udW1iZXI7CQkvKiBHbG9iYWwgcGhiIGNvdW50ZXIgKi8KKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaG9zZV9saXN0OworCisvKgorICogcGNpX2NvbnRyb2xsZXIocGhiKSBpbml0aWFsaXplZCBjb21tb24gdmFyaWFibGVzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX3NldHVwX3BjaV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwltZW1zZXQoaG9zZSwgMCwgc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlcikpOworCisJc3Bpbl9sb2NrKCZob3NlX3NwaW5sb2NrKTsKKwlob3NlLT5nbG9iYWxfbnVtYmVyID0gZ2xvYmFsX3BoYl9udW1iZXIrKzsKKwlsaXN0X2FkZF90YWlsKCZob3NlLT5saXN0X25vZGUsICZob3NlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZob3NlX3NwaW5sb2NrKTsKK30KKworc3RydWN0IHBjaV9jb250cm9sbGVyICogcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOworCisJaWYgKG1lbV9pbml0X2RvbmUpCisJCXBoYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlciksIEdGUF9LRVJORUwpOworCWVsc2UKKwkJcGhiID0gYWxsb2NfYm9vdG1lbShzaXplb2YgKHN0cnVjdCBwY2lfY29udHJvbGxlcikpOworCWlmIChwaGIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcGNpX3NldHVwX3BjaV9jb250cm9sbGVyKHBoYik7CisJcGhiLT5hcmNoX2RhdGEgPSBkZXY7CisJcGhiLT5pc19keW5hbWljID0gbWVtX2luaXRfZG9uZTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwlpZiAoZGV2KSB7CisJCWludCBuaWQgPSBvZl9ub2RlX3RvX25pZChkZXYpOworCisJCWlmIChuaWQgPCAwIHx8ICFub2RlX29ubGluZShuaWQpKQorCQkJbmlkID0gLTE7CisKKwkJUEhCX1NFVF9OT0RFKHBoYiwgbmlkKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcGhiOworfQorCit2b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQoreworCXNwaW5fbG9jaygmaG9zZV9zcGlubG9jayk7CisJbGlzdF9kZWwoJnBoYi0+bGlzdF9ub2RlKTsKKwlzcGluX3VubG9jaygmaG9zZV9zcGlubG9jayk7CisKKwlpZiAocGhiLT5pc19keW5hbWljKQorCQlrZnJlZShwaGIpOworfQorCisvKgorICogUmV0dXJuIHRoZSBkb21haW4gbnVtYmVyIGZvciB0aGlzIGJ1cy4KKyAqLworaW50IHBjaV9kb21haW5fbnIoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCisJCXJldHVybiBob3NlLT5nbG9iYWxfbnVtYmVyOworCX0KK30KKworRVhQT1JUX1NZTUJPTChwY2lfZG9tYWluX25yKTsKKworI2lmZGVmIENPTkZJR19QUENfT0YKKworLyogVGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGJlIHVzZWQgZWFybHkgZHVyaW5nIGJvb3QsIHdoZW4gdGhlCisgKiBQQ0kgYnVzIG51bWJlcnMgaGF2ZSBub3QgeWV0IGJlZW4gYXNzaWduZWQsIGFuZCB5b3UgbmVlZCB0bworICogaXNzdWUgUENJIGNvbmZpZyBjeWNsZXMgdG8gYW4gT0YgZGV2aWNlLgorICogSXQgY291bGQgYWxzbyBiZSB1c2VkIHRvICJmaXgiIFJUQVMgY29uZmlnIGN5Y2xlcyBpZiB5b3Ugd2FudAorICogdG8gc2V0IHBjaV9hc3NpZ25fYWxsX2J1c2VzIHRvIDEgYW5kIHN0aWxsIHVzZSBSVEFTIGZvciBQQ0kKKyAqIGNvbmZpZyBjeWNsZXMuCisgKi8KK3N0cnVjdCBwY2lfY29udHJvbGxlciogcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSkKK3sKKwlpZiAoIWhhdmVfb2YpCisJCXJldHVybiBOVUxMOworCXdoaWxlKG5vZGUpIHsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpCisJCQlpZiAoaG9zZS0+YXJjaF9kYXRhID09IG5vZGUpCisJCQkJcmV0dXJuIGhvc2U7CisJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3NpemVfdCBwY2lfc2hvd19kZXZzcGVjKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJcGRldiA9IHRvX3BjaV9kZXYgKGRldik7CisJbnAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisJaWYgKG5wID09IE5VTEwgfHwgbnAtPmZ1bGxfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyIsIG5wLT5mdWxsX25hbWUpOworfQorc3RhdGljIERFVklDRV9BVFRSKGRldnNwZWMsIFNfSVJVR08sIHBjaV9zaG93X2RldnNwZWMsIE5VTEwpOworI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KKworLyogQWRkIHN5c2ZzIHByb3BlcnRpZXMgKi8KK3ZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyNpZmRlZiBDT05GSUdfUFBDX09GCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCit9CisKK2NoYXIgX19pbml0ICpwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gc3RyOworfQorCisvKgorICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KKyAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZQorICogb3BlbmZpcm13YXJlIGFuZCBzZXRzIGl0IGluIHRoZSBwY2lfZGV2IGFuZCBwY2lfY29uZmlnIGxpbmUuCisgKi8KK2ludCBwY2lfcmVhZF9pcnFfbGluZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlEQkcoIlRyeSB0byBtYXAgaXJxIGZvciAlcy4uLlxuIiwgcGNpX25hbWUocGNpX2RldikpOworCisjaWZkZWYgREVCVUcKKwltZW1zZXQoJm9pcnEsIDB4ZmYsIHNpemVvZihvaXJxKSk7CisjZW5kaWYKKwkvKiBUcnkgdG8gZ2V0IGEgbWFwcGluZyBmcm9tIHRoZSBkZXZpY2UtdHJlZSAqLworCWlmIChvZl9pcnFfbWFwX3BjaShwY2lfZGV2LCAmb2lycSkpIHsKKwkJdTggbGluZSwgcGluOworCisJCS8qIElmIHRoYXQgZmFpbHMsIGxldHMgZmFsbGJhY2sgdG8gd2hhdCBpcyBpbiB0aGUgY29uZmlnCisJCSAqIHNwYWNlIGFuZCBtYXAgdGhhdCB0aHJvdWdoIHRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuIFdlCisJCSAqIGFsc28gc2V0IHRoZSB0eXBlIHRvIGxldmVsIGxvdyBzaW5jZSB0aGF0J3Mgd2hhdCBQQ0kKKwkJICogaW50ZXJydXB0cyBhcmUuIElmIHlvdXIgcGxhdGZvcm0gZG9lcyBkaWZmZXJlbnRseSwgdGhlbgorCQkgKiBlaXRoZXIgcHJvdmlkZSBhIHByb3BlciBpbnRlcnJ1cHQgdHJlZSBvciBkb24ndCB1c2UgdGhpcworCQkgKiBmdW5jdGlvbi4KKwkJICovCisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbikpCisJCQlyZXR1cm4gLTE7CisJCWlmIChwaW4gPT0gMCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgJmxpbmUpIHx8CisJCSAgICBsaW5lID09IDB4ZmYpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlEQkcoIiAtPiBubyBtYXAgISBVc2luZyBpcnEgbGluZSAlZCBmcm9tIFBDSSBjb25maWdcbiIsIGxpbmUpOworCisJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgbGluZSk7CisJCWlmICh2aXJxICE9IE5PX0lSUSkKKwkJCXNldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCX0gZWxzZSB7CisJCURCRygiIC0+IGdvdCBvbmUsIHNwZWMgJWQgY2VsbHMgKDB4JTA4eCAweCUwOHguLi4pIG9uICVzXG4iLAorCQkgICAgb2lycS5zaXplLCBvaXJxLnNwZWNpZmllclswXSwgb2lycS5zcGVjaWZpZXJbMV0sCisJCSAgICBvaXJxLmNvbnRyb2xsZXItPmZ1bGxfbmFtZSk7CisKKwkJdmlycSA9IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsIG9pcnEuc3BlY2lmaWVyLAorCQkJCQkgICAgIG9pcnEuc2l6ZSk7CisJfQorCWlmKHZpcnEgPT0gTk9fSVJRKSB7CisJCURCRygiIC0+IGZhaWxlZCB0byBtYXAgIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlEQkcoIiAtPiBtYXBwZWQgdG8gbGludXggaXJxICVkXG4iLCB2aXJxKTsKKworCXBjaV9kZXYtPmlycSA9IHZpcnE7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOworCisvKgorICogUGxhdGZvcm0gc3VwcG9ydCBmb3IgL3Byb2MvYnVzL3BjaS9YL1kgbW1hcCgpcywKKyAqIG1vZGVsbGVkIG9uIHRoZSBzcGFyYzY0IGltcGxlbWVudGF0aW9uIGJ5IERhdmUgTWlsbGVyLgorICogIC0tIHBhdWx1cy4KKyAqLworCisvKgorICogQWRqdXN0IHZtX3Bnb2ZmIG9mIFZNQSBzdWNoIHRoYXQgaXQgaXMgdGhlIHBoeXNpY2FsIHBhZ2Ugb2Zmc2V0CisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSAzMi1iaXQgcGNpIGJ1cyBvZmZzZXQgZm9yIERFViByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCisgKgorICogQmFzaWNhbGx5LCB0aGUgdXNlciBmaW5kcyB0aGUgYmFzZSBhZGRyZXNzIGZvciBoaXMgZGV2aWNlIHdoaWNoIGhlIHdpc2hlcworICogdG8gbW1hcC4gIFRoZXkgcmVhZCB0aGUgMzItYml0IHZhbHVlIGZyb20gdGhlIGNvbmZpZyBzcGFjZSBiYXNlIHJlZ2lzdGVyLAorICogYWRkIHdoYXRldmVyIFBBR0VfU0laRSBtdWx0aXBsZSBvZmZzZXQgdGhleSB3aXNoLCBhbmQgZmVlZCB0aGlzIGludG8gdGhlCisgKiBvZmZzZXQgcGFyYW1ldGVyIG9mIG1tYXAgb24gL3Byb2MvYnVzL3BjaS9YWFggZm9yIHRoYXQgZGV2aWNlLgorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKl9fcGNpX21tYXBfbWFrZV9vZmZzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgIHJlc291cmNlX3NpemVfdCAqb2Zmc2V0LAorCQkJCQkgICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7CisJdW5zaWduZWQgbG9uZyBpb19vZmZzZXQgPSAwOworCWludCBpLCByZXNfYml0OworCisJaWYgKGhvc2UgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisKKwkvKiBJZiBtZW1vcnksIGFkZCBvbiB0aGUgUENJIGJyaWRnZSBhZGRyZXNzIG9mZnNldCAqLworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX21lbSkgeworI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gcGNpX3Jlc291cmNlX3RvX3VzZXIoKSBmb3Igd2h5IHRoaXMgaXMgZGlzYWJsZWQgKi8KKwkJKm9mZnNldCArPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKyNlbmRpZgorCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07CisJfSBlbHNlIHsKKwkJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisJCSpvZmZzZXQgKz0gaW9fb2Zmc2V0OworCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9JTzsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCByZXF1ZXN0ZWQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZQorCSAqIHJlc291cmNlcyBvZiB0aGUgZGV2aWNlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKwkJaW50IGZsYWdzID0gcnAtPmZsYWdzOworCisJCS8qIHRyZWF0IFJPTSBhcyBtZW1vcnkgKHNob3VsZCBiZSBhbHJlYWR5KSAqLworCQlpZiAoaSA9PSBQQ0lfUk9NX1JFU09VUkNFKQorCQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU07CisKKwkJLyogQWN0aXZlIGFuZCBzYW1lIHR5cGU/ICovCisJCWlmICgoZmxhZ3MgJiByZXNfYml0KSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCisJCWlmICgqb2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwgKm9mZnNldCA+IHJwLT5lbmQpCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCBpdCEgY29uc3RydWN0IHRoZSBmaW5hbCBwaHlzaWNhbCBhZGRyZXNzICovCisJCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQorCQkJKm9mZnNldCArPSBob3NlLT5pb19iYXNlX3BoeXMgLSBpb19vZmZzZXQ7CisJCXJldHVybiBycDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNldCB2bV9wYWdlX3Byb3Qgb2YgVk1BLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUsIGZvciBhIHBjaQorICogZGV2aWNlIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBwZ3Byb3RfdCBfX3BjaV9tbWFwX3NldF9wZ3Byb3Qoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpycCwKKwkJCQkgICAgICBwZ3Byb3RfdCBwcm90ZWN0aW9uLAorCQkJCSAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKKwkJCQkgICAgICBpbnQgd3JpdGVfY29tYmluZSkKK3sKKwl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOworCisJLyogV3JpdGUgY29tYmluZSBpcyBhbHdheXMgMCBvbiBub24tbWVtb3J5IHNwYWNlIG1hcHBpbmdzLiBPbgorCSAqIG1lbW9yeSBzcGFjZSwgaWYgdGhlIHVzZXIgZGlkbid0IHBhc3MgMSwgd2UgY2hlY2sgZm9yIGEKKwkgKiAicHJlZmV0Y2hhYmxlIiByZXNvdXJjZS4gVGhpcyBpcyBhIGJpdCBoYWNraXNoLCBidXQgd2UgdXNlCisJICogdGhpcyB0byB3b3JrYXJvdW5kIHRoZSBpbmFiaWxpdHkgb2YgL3N5c2ZzIHRvIHByb3ZpZGUgYSB3cml0ZQorCSAqIGNvbWJpbmUgYml0CisJICovCisJaWYgKG1tYXBfc3RhdGUgIT0gcGNpX21tYXBfbWVtKQorCQl3cml0ZV9jb21iaW5lID0gMDsKKwllbHNlIGlmICh3cml0ZV9jb21iaW5lID09IDApIHsKKwkJaWYgKHJwLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQl3cml0ZV9jb21iaW5lID0gMTsKKwl9CisKKwkvKiBYWFggd291bGQgYmUgbmljZSB0byBoYXZlIGEgd2F5IHRvIGFzayBmb3Igd3JpdGUtdGhyb3VnaCAqLworCXByb3QgfD0gX1BBR0VfTk9fQ0FDSEU7CisJaWYgKHdyaXRlX2NvbWJpbmUpCisJCXByb3QgJj0gfl9QQUdFX0dVQVJERUQ7CisJZWxzZQorCQlwcm90IHw9IF9QQUdFX0dVQVJERUQ7CisKKwlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Cit9CisKKy8qCisgKiBUaGlzIG9uZSBpcyB1c2VkIGJ5IC9kZXYvbWVtIGFuZCBmYmRldiB3aG8gaGF2ZSBubyBjbHVlIGFib3V0IHRoZQorICogUENJIGRldmljZSwgaXQgdHJpZXMgdG8gZmluZCB0aGUgUENJIGRldmljZSBmaXJzdCBhbmQgY2FsbHMgdGhlCisgKiBhYm92ZSByb3V0aW5lCisgKi8KK3BncHJvdF90IHBjaV9waHlzX21lbV9hY2Nlc3NfcHJvdChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgcGdwcm90X3QgcHJvdGVjdGlvbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpmb3VuZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBwcm90ID0gcGdwcm90X3ZhbChwcm90ZWN0aW9uKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBmbiA8PCBQQUdFX1NISUZUOworCWludCBpOworCisJaWYgKHBhZ2VfaXNfcmFtKHBmbikpCisJCXJldHVybiBfX3BncHJvdChwcm90KTsKKworCXByb3QgfD0gX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJnBkZXYtPnJlc291cmNlW2ldOworCQkJaW50IGZsYWdzID0gcnAtPmZsYWdzOworCisJCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KKwkJCWlmICgoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCS8qIEluIHRoZSByYW5nZSBvZiB0aGlzIHJlc291cmNlPyAqLworCQkJaWYgKG9mZnNldCA8IChycC0+c3RhcnQgJiBQQUdFX01BU0spIHx8CisJCQkgICAgb2Zmc2V0ID4gcnAtPmVuZCkKKwkJCQljb250aW51ZTsKKwkJCWZvdW5kID0gcnA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKSB7CisJCWlmIChmb3VuZC0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQorCQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJfQorCisJREJHKCJub24tUENJIG1hcCBmb3IgJWx4LCBwcm90OiAlbHhcbiIsIG9mZnNldCwgcHJvdCk7CisKKwlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZW1hcCBvZiB0aGUgcGFnZXMgZm9yIGEgUENJIGRldmljZSBtYXBwaW5nLCBhcworICogYXBwcm9wcmlhdGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgVGhlIHJlZ2lvbiBpbiB0aGUgcHJvY2VzcyB0byBtYXAKKyAqIGlzIGRlc2NyaWJlZCBieSB2bV9zdGFydCBhbmQgdm1fZW5kIG1lbWJlcnMgb2YgVk1BLCB0aGUgYmFzZSBwaHlzaWNhbAorICogYWRkcmVzcyBpcyBmb3VuZCBpbiB2bV9wZ29mZi4KKyAqIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBpcyBwcm92aWRlZCBzbyB0aGF0IGFyY2hpdGVjdHVyZXMgbWF5IG1ha2UgbWFwcGluZworICogZGVjaXNpb25zIG9uIGEgcGVyLWRldmljZSBvciBwZXItYnVzIGJhc2lzLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIHplcm8gb24gc3VjY2Vzcy4KKyAqLworaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsIGludCB3cml0ZV9jb21iaW5lKQoreworCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJc3RydWN0IHJlc291cmNlICpycDsKKwlpbnQgcmV0OworCisJcnAgPSBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KGRldiwgJm9mZnNldCwgbW1hcF9zdGF0ZSk7CisJaWYgKHJwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOworCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wY2lfbW1hcF9zZXRfcGdwcm90KGRldiwgcnAsCisJCQkJCQkgIHZtYS0+dm1fcGFnZV9wcm90LAorCQkJCQkJICBtbWFwX3N0YXRlLCB3cml0ZV9jb21iaW5lKTsKKworCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCisJCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHBjaV9yZXNvdXJjZV90b191c2VyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsCisJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywKKwkJCSAgcmVzb3VyY2Vfc2l6ZV90ICpzdGFydCwgcmVzb3VyY2Vfc2l6ZV90ICplbmQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gMDsKKworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOworCisJLyogV2UgcGFzcyBhIGZ1bGx5IGZpeGVkIHVwIGFkZHJlc3MgdG8gdXNlcmxhbmQgZm9yIE1NSU8gaW5zdGVhZCBvZgorCSAqIGEgQkFSIHZhbHVlIGJlY2F1c2UgWCBpcyBsYW1lIGFuZCBleHBlY3RzIHRvIGJlIGFibGUgdG8gdXNlIHRoYXQKKwkgKiB0byBwYXNzIHRvIC9kZXYvbWVtICEKKwkgKgorCSAqIFRoYXQgbWVhbnMgdGhhdCB3ZSdsbCBoYXZlIHBvdGVudGlhbGx5IDY0IGJpdHMgdmFsdWVzIHdoZXJlIHNvbWUKKwkgKiB1c2VybGFuZCBhcHBzIG9ubHkgZXhwZWN0IDMyIChsaWtlIFggaXRzZWxmIHNpbmNlIGl0IHRoaW5rcyBvbmx5CisJICogU3BhcmMgaGFzIDY0IGJpdHMgTU1JTykgYnV0IGlmIHdlIGRvbid0IGRvIHRoYXQsIHdlIGJyZWFrIGl0IG9uCisJICogMzIgYml0cyBDSFJQcyA6LSgKKwkgKgorCSAqIEhvcGVmdWxseSwgdGhlIHN5c2ZzIGluc3RlcmZhY2UgaXMgaW1tdW5lIHRvIHRoYXQgZ3Vuay4gT25jZSBYCisJICogaGFzIGJlZW4gZml4ZWQgKGFuZCB0aGUgZml4IHNwcmVhZCBlbm91Z2gpLCB3ZSBjYW4gcmUtZW5hYmxlIHRoZQorCSAqIDIgbGluZXMgYmVsb3cgYW5kIHBhc3MgZG93biBhIEJBUiB2YWx1ZSB0byB1c2VybGFuZC4gSW4gdGhhdCBjYXNlCisJICogd2UnbGwgYWxzbyBoYXZlIHRvIHJlLWVuYWJsZSB0aGUgbWF0Y2hpbmcgY29kZSBpbgorCSAqIF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoKS4KKwkgKgorCSAqIEJlbkguCisJICovCisjaWYgMAorCWVsc2UgaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworI2VuZGlmCisKKwkqc3RhcnQgPSByc3JjLT5zdGFydCAtIG9mZnNldDsKKwkqZW5kID0gcnNyYy0+ZW5kIC0gb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKaW5kZXggODY5ODIxMS4uMGFkZjA3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCkBAIC01NSw4ICs1NSw3IEBACiAgKi8KIGludCBwY2lfYXNzaWduX2FsbF9idXNlczsKIAotc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlX2hlYWQ7Ci1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqKiBob3NlX3RhaWwgPSAmaG9zZV9oZWFkOworTElTVF9IRUFEKGhvc2VfbGlzdCk7CiAKIHN0YXRpYyBpbnQgcGNpX2J1c19jb3VudDsKIApAQCAtNTczLDU4ICs1NzIsNiBAQAogCX0KIH0KIAotCi1pbnQKLXBjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQl1MTYgY21kLCBvbGRfY21kOwotCWludCBpZHg7Ci0Jc3RydWN0IHJlc291cmNlICpyOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0Jb2xkX2NtZCA9IGNtZDsKLQlmb3IgKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKLQkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLwotCQlpZiAoIShtYXNrICYgKDE8PGlkeCkpKQotCQkJY29udGludWU7Ci0JCi0JCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwotCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBwY2lfbmFtZShkZXYpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCQljbWQgfD0gUENJX0NPTU1BTkRfSU87Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKLQl9Ci0JaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCi0JCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JaWYgKGNtZCAhPSBvbGRfY21kKSB7Ci0JCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBuZXh0X2NvbnRyb2xsZXJfaW5kZXg7Ci0KLXN0cnVjdCBwY2lfY29udHJvbGxlciAqIF9faW5pdAotcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCi0JaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilhbGxvY19ib290bWVtKHNpemVvZigqaG9zZSkpOwotCW1lbXNldChob3NlLCAwLCBzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0KLQkqaG9zZV90YWlsID0gaG9zZTsKLQlob3NlX3RhaWwgPSAmaG9zZS0+bmV4dDsKLQotCWhvc2UtPmluZGV4ID0gbmV4dF9jb250cm9sbGVyX2luZGV4Kys7Ci0KLQlyZXR1cm4gaG9zZTsKLX0KLQogI2lmZGVmIENPTkZJR19QUENfT0YKIC8qCiAgKiBGdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgb24gT3BlbkZpcm13YXJlIG1hY2hpbmVzLgpAQCAtNjcwLDcgKzYxNyw3IEBACiBwY2liaW9zX21ha2VfT0ZfYnVzX21hcCh2b2lkKQogewogCWludCBpOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAJc3RydWN0IHByb3BlcnR5ICptYXBfcHJvcDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCkBAIC02ODcsNyArNjM0LDcgQEAKIAkJcGNpX3RvX09GX2J1c19tYXBbaV0gPSAweGZmOwogCiAJLyogRm9yIGVhY2ggaG9zZSwgd2UgYmVnaW4gc2VhcmNoaW5nIGJyaWRnZXMgKi8KLQlmb3IoaG9zZT1ob3NlX2hlYWQ7IGhvc2U7IGhvc2U9aG9zZS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGU7CQogCQlub2RlID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKWhvc2UtPmFyY2hfZGF0YTsKIAkJaWYgKCFub2RlKQpAQCAtNzY1LDcgKzcxMiw3IEBACiAKIAkvKiBBcmUgd2UgYSByb290IGJ1cyA/ICovCiAJaWYgKGJ1cy0+c2VsZiA9PSBOVUxMIHx8IGJ1cy0+cGFyZW50ID09IE5VTEwpIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cy0+bnVtYmVyKTsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CiAJCWlmIChob3NlID09IE5VTEwpCiAJCQlyZXR1cm4gTlVMTDsKIAkJcmV0dXJuIG9mX25vZGVfZ2V0KGhvc2UtPmFyY2hfZGF0YSk7CkBAIC04MTgsMjcgKzc2NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSk7CiAKLS8qIFRoaXMgcm91dGluZSBpcyBtZWFudCB0byBiZSB1c2VkIGVhcmx5IGR1cmluZyBib290LCB3aGVuIHRoZQotICogUENJIGJ1cyBudW1iZXJzIGhhdmUgbm90IHlldCBiZWVuIGFzc2lnbmVkLCBhbmQgeW91IG5lZWQgdG8KLSAqIGlzc3VlIFBDSSBjb25maWcgY3ljbGVzIHRvIGFuIE9GIGRldmljZS4KLSAqIEl0IGNvdWxkIGFsc28gYmUgdXNlZCB0byAiZml4IiBSVEFTIGNvbmZpZyBjeWNsZXMgaWYgeW91IHdhbnQKLSAqIHRvIHNldCBwY2lfYXNzaWduX2FsbF9idXNlcyB0byAxIGFuZCBzdGlsbCB1c2UgUlRBUyBmb3IgUENJCi0gKiBjb25maWcgY3ljbGVzLgotICovCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpCi17Ci0JaWYgKCFoYXZlX29mKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZShub2RlKSB7Ci0JCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKLQkJZm9yIChob3NlPWhvc2VfaGVhZDtob3NlO2hvc2U9aG9zZS0+bmV4dCkKLQkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKLQkJCQlyZXR1cm4gaG9zZTsKLQkJbm9kZT1ub2RlLT5wYXJlbnQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgaW50CiBmaW5kX09GX3BjaV9kZXZpY2VfZmlsdGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgdm9pZCogZGF0YSkKIHsKQEAgLTEwMjcsMzQgKzk1MywxMiBAQAogCX0KIH0KIAotc3RhdGljIHNzaXplX3QgcGNpX3Nob3dfZGV2c3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCXBkZXYgPSB0b19wY2lfZGV2IChkZXYpOwotCW5wID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOwotCWlmIChucCA9PSBOVUxMIHx8IG5wLT5mdWxsX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXMiLCBucC0+ZnVsbF9uYW1lKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihkZXZzcGVjLCBTX0lSVUdPLCBwY2lfc2hvd19kZXZzcGVjLCBOVUxMKTsKLQogI2Vsc2UgLyogQ09ORklHX1BQQ19PRiAqLwogdm9pZCBwY2liaW9zX21ha2VfT0ZfYnVzX21hcCh2b2lkKQogewogfQogI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KIAotLyogQWRkIHN5c2ZzIHByb3BlcnRpZXMgKi8KLWludCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotI2lmZGVmIENPTkZJR19QUENfT0YKLQlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCi19Ci0KLQogI2lmZGVmIENPTkZJR19QUENfUE1BQwogLyoKICAqIFRoaXMgc2V0IG9mIHJvdXRpbmVzIGNoZWNrcyBmb3IgUENJPC0+UENJIGJyaWRnZXMgdGhhdCBoYXZlIGNsb3NlZApAQCAtMTI2OSwxNCArMTE3MywxNCBAQAogc3RhdGljIGludCBfX2luaXQKIHBjaWJpb3NfaW5pdCh2b2lkKQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKLQlpbnQgbmV4dF9idXNubzsKKwlpbnQgbmV4dF9idXNubyA9IDA7CiAKIAlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlXG4iKTsKIAogCS8qIFNjYW4gYWxsIG9mIHRoZSByZWNvcmRlZCBQQ0kgY29udHJvbGxlcnMuICAqLwotCWZvciAobmV4dF9idXNubyA9IDAsIGhvc2UgPSBob3NlX2hlYWQ7IGhvc2U7IGhvc2UgPSBob3NlLT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7CiAJCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcykKIAkJCWhvc2UtPmZpcnN0X2J1c25vID0gbmV4dF9idXNubzsKIAkJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CkBAIC0xMzE5LDEyICsxMjIzLDYgQEAKIAogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKLXVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZml4dXAoc3RydWN0IHBjaV9kZXYgKiBkZXYsIHN0cnVjdCByZXNvdXJjZSAqIHJlcywKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBzdGFydDsKLX0KLQogdm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopIGJ1cy0+c3lzZGF0YTsKQEAgLTEzNDIsNyArMTI0MCw3IEBACiAJCWlmICghcmVzLT5mbGFncykgewogCQkJaWYgKGlvX29mZnNldCkKIAkJCQlwcmludGsoS0VSTl9FUlIgIkkvTyByZXNvdXJjZSBub3Qgc2V0IGZvciBob3N0IgotCQkJCSAgICAgICAiIGJyaWRnZSAlZFxuIiwgaG9zZS0+aW5kZXgpOworCQkJCSAgICAgICAiIGJyaWRnZSAlZFxuIiwgaG9zZS0+Z2xvYmFsX251bWJlcik7CiAJCQlyZXMtPnN0YXJ0ID0gMDsKIAkJCXJlcy0+ZW5kID0gSU9fU1BBQ0VfTElNSVQ7CiAJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKQEAgLTEzNTYsNyArMTI1NCw3IEBACiAJCQkJaWYgKGkgPiAwKQogCQkJCQljb250aW51ZTsKIAkJCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSByZXNvdXJjZSBub3Qgc2V0IGZvciAiCi0JCQkJICAgICAgICJob3N0IGJyaWRnZSAlZFxuIiwgaG9zZS0+aW5kZXgpOworCQkJCSAgICAgICAiaG9zdCBicmlkZ2UgJWRcbiIsIGhvc2UtPmdsb2JhbF9udW1iZXIpOwogCQkJCXJlcy0+c3RhcnQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKIAkJCQlyZXMtPmVuZCA9IH4wVTsKIAkJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CkBAIC0xMzcwLDcgKzEyNjgsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CiAJCQlpZiAoKHJlcyA9IGJ1cy0+cmVzb3VyY2VbaV0pID09IE5VTEwpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoIXJlcy0+ZmxhZ3MpCisJCQlpZiAoIXJlcy0+ZmxhZ3MgfHwgYnVzLT5zZWxmLT50cmFuc3BhcmVudCkKIAkJCQljb250aW51ZTsKIAkJCWlmIChpb19vZmZzZXQgJiYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSkgewogCQkJCXJlcy0+c3RhcnQgKz0gaW9fb2Zmc2V0OwpAQCAtMTM5NSwxMSArMTI5Myw2IEBACiAJfQogfQogCi1jaGFyIF9faW5pdCAqcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCi17Ci0JcmV0dXJuIHN0cjsKLX0KLQogLyogdGhlIG5leHQgb25lIGlzIHN0b2xlbiBmcm9tIHRoZSBhbHBoYSBwb3J0Li4uICovCiB2b2lkIF9faW5pdAogcGNpYmlvc191cGRhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpcnEpCkBAIC0xNDA4LDY0ICsxMzAxLDYgQEAKIAkvKiBYWFggRklYTUUgLSB1cGRhdGUgT0YgZGV2aWNlIHRyZWUgbm9kZSBpbnRlcnJ1cHQgcHJvcGVydHkgKi8KIH0KIAotI2lmZGVmIENPTkZJR19QUENfTUVSR0UKLS8qIFhYWCBUaGlzIGlzIGEgY29weSBvZiB0aGUgcHBjNjQgdmVyc2lvbi4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2Ugc3RhcnQKLSAqIG1lcmdpbmcgdGhlIDIgUENJIGxheWVycwotICovCi0vKgotICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KLSAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZQotICogb3BlbmZpcm13YXJlIGFuZCBzZXRzIGl0IGluIHRoZSBwY2lfZGV2IGFuZCBwY2lfY29uZmlnIGxpbmUuCi0gKi8KLWludCBwY2lfcmVhZF9pcnFfbGluZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7Ci0JdW5zaWduZWQgaW50IHZpcnE7Ci0KLQlEQkcoIlRyeSB0byBtYXAgaXJxIGZvciAlcy4uLlxuIiwgcGNpX25hbWUocGNpX2RldikpOwotCi0JLyogVHJ5IHRvIGdldCBhIG1hcHBpbmcgZnJvbSB0aGUgZGV2aWNlLXRyZWUgKi8KLQlpZiAob2ZfaXJxX21hcF9wY2kocGNpX2RldiwgJm9pcnEpKSB7Ci0JCXU4IGxpbmUsIHBpbjsKLQotCQkvKiBJZiB0aGF0IGZhaWxzLCBsZXRzIGZhbGxiYWNrIHRvIHdoYXQgaXMgaW4gdGhlIGNvbmZpZwotCQkgKiBzcGFjZSBhbmQgbWFwIHRoYXQgdGhyb3VnaCB0aGUgZGVmYXVsdCBjb250cm9sbGVyLiBXZQotCQkgKiBhbHNvIHNldCB0aGUgdHlwZSB0byBsZXZlbCBsb3cgc2luY2UgdGhhdCdzIHdoYXQgUENJCi0JCSAqIGludGVycnVwdHMgYXJlLiBJZiB5b3VyIHBsYXRmb3JtIGRvZXMgZGlmZmVyZW50bHksIHRoZW4KLQkJICogZWl0aGVyIHByb3ZpZGUgYSBwcm9wZXIgaW50ZXJydXB0IHRyZWUgb3IgZG9uJ3QgdXNlIHRoaXMKLQkJICogZnVuY3Rpb24uCi0JCSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocGluID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZsaW5lKSB8fAotCQkgICAgbGluZSA9PSAweGZmKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJREJHKCIgLT4gbm8gbWFwICEgVXNpbmcgaXJxIGxpbmUgJWQgZnJvbSBQQ0kgY29uZmlnXG4iLCBsaW5lKTsKLQotCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGxpbmUpOwotCQlpZiAodmlycSAhPSBOT19JUlEpCi0JCQlzZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQl9IGVsc2UgewotCQlEQkcoIiAtPiBnb3Qgb25lLCBzcGVjICVkIGNlbGxzICgweCUwOHguLi4pIG9uICVzXG4iLAotCQkgICAgb2lycS5zaXplLCBvaXJxLnNwZWNpZmllclswXSwgb2lycS5jb250cm9sbGVyLT5mdWxsX25hbWUpOwotCi0JCXZpcnEgPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLCBvaXJxLnNwZWNpZmllciwKLQkJCQkJICAgICBvaXJxLnNpemUpOwotCX0KLQlpZih2aXJxID09IE5PX0lSUSkgewotCQlEQkcoIiAtPiBmYWlsZWQgdG8gbWFwICFcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBjaV9kZXYtPmlycSA9IHZpcnE7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOwotI2VuZGlmIC8qIENPTkZJR19QUENfTUVSR0UgKi8KLQogaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIHsKIAl1MTYgY21kLCBvbGRfY21kOwpAQCAtMTQ5NywyODEgKzEzMzIsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHBjaV9jb250cm9sbGVyKgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlcioKIHBjaV9idXNfdG9faG9zZShpbnQgYnVzKQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IGhvc2VfaGVhZDsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAKLQlmb3IgKDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQogCQlpZiAoYnVzID49IGhvc2UtPmZpcnN0X2J1c25vICYmIGJ1cyA8PSBob3NlLT5sYXN0X2J1c25vKQogCQkJcmV0dXJuIGhvc2U7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgX19pb21lbSAqCi1wY2lfYnVzX2lvX2Jhc2UodW5zaWduZWQgaW50IGJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7Ci0KLQlob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cyk7Ci0JaWYgKCFob3NlKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gaG9zZS0+aW9fYmFzZV92aXJ0OwotfQotCi11bnNpZ25lZCBsb25nCi1wY2lfYnVzX2lvX2Jhc2VfcGh5cyh1bnNpZ25lZCBpbnQgYnVzKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiAwOwotCXJldHVybiBob3NlLT5pb19iYXNlX3BoeXM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXBjaV9idXNfbWVtX2Jhc2VfcGh5cyh1bnNpZ25lZCBpbnQgYnVzKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiAwOwotCXJldHVybiBob3NlLT5wY2lfbWVtX29mZnNldDsKLX0KLQotdW5zaWduZWQgbG9uZwotcGNpX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCi17Ci0JLyogSGFjayBhbGVydCBhZ2FpbiAhIFNlZSBjb21tZW50cyBpbiBjaHJwX3BjaS5jCi0JICovCi0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0KLQkJKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKXBkZXYtPnN5c2RhdGE7Ci0JaWYgKGhvc2UgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlyZXR1cm4gcmVzLT5zdGFydCAtIGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwotCS8qIFdlIG1heSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoIElPcyBoZXJlLi4uICovCi0JcmV0dXJuIHJlcy0+c3RhcnQ7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX19wY2lfbW1hcF9tYWtlX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LAotCQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90ICpvZmZzZXQsCi0JCQkJCSAgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGRldi0+YnVzLT5udW1iZXIpOwotCXVuc2lnbmVkIGxvbmcgaW9fb2Zmc2V0ID0gMDsKLQlpbnQgaSwgcmVzX2JpdDsKLQotCWlmIChob3NlID09IDApCi0JCXJldHVybiBOVUxMOwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCi0JLyogSWYgbWVtb3J5LCBhZGQgb24gdGhlIFBDSSBicmlkZ2UgYWRkcmVzcyBvZmZzZXQgKi8KLQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9tZW0pIHsKLSNpZiAwIC8qIFNlZSBjb21tZW50IGluIHBjaV9yZXNvdXJjZV90b191c2VyKCkgZm9yIHdoeSB0aGlzIGlzIGRpc2FibGVkICovCi0JCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0jZW5kaWYKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwotCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9IGhvc2UtPmlvX2Jhc2VfdmlydCAtICh2b2lkIF9faW9tZW0gKilfSU9fQkFTRTsKLQkJKm9mZnNldCArPSBpb19vZmZzZXQ7Ci0JCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOwotCX0KLQotCS8qCi0JICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHJlcXVlc3RlZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlCi0JICogcmVzb3VyY2VzIG9mIHRoZSBkZXZpY2UuCi0JICovCi0JZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpycCA9ICZkZXYtPnJlc291cmNlW2ldOwotCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJLyogdHJlYXQgUk9NIGFzIG1lbW9yeSAoc2hvdWxkIGJlIGFscmVhZHkpICovCi0JCWlmIChpID09IFBDSV9ST01fUkVTT1VSQ0UpCi0JCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKLQotCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KLQkJaWYgKChmbGFncyAmIHJlc19iaXQpID09IDApCi0JCQljb250aW51ZTsKLQotCQkvKiBJbiB0aGUgcmFuZ2Ugb2YgdGhpcyByZXNvdXJjZT8gKi8KLQkJaWYgKCpvZmZzZXQgPCAocnAtPnN0YXJ0ICYgUEFHRV9NQVNLKSB8fCAqb2Zmc2V0ID4gcnAtPmVuZCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZvdW5kIGl0ISBjb25zdHJ1Y3QgdGhlIGZpbmFsIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pCi0JCQkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKLQkJcmV0dXJuIHJwOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogU2V0IHZtX3BhZ2VfcHJvdCBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpCi0gKiBkZXZpY2UgbWFwcGluZy4KLSAqLwotc3RhdGljIHBncHJvdF90IF9fcGNpX21tYXBfc2V0X3BncHJvdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAotCQkJCSAgICAgIHBncHJvdF90IHByb3RlY3Rpb24sCi0JCQkJICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAotCQkJCSAgICAgIGludCB3cml0ZV9jb21iaW5lKQotewotCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7Ci0KLQkvKiBXcml0ZSBjb21iaW5lIGlzIGFsd2F5cyAwIG9uIG5vbi1tZW1vcnkgc3BhY2UgbWFwcGluZ3MuIE9uCi0JICogbWVtb3J5IHNwYWNlLCBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyAxLCB3ZSBjaGVjayBmb3IgYQotCSAqICJwcmVmZXRjaGFibGUiIHJlc291cmNlLiBUaGlzIGlzIGEgYml0IGhhY2tpc2gsIGJ1dCB3ZSB1c2UKLQkgKiB0aGlzIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSBvZiAvc3lzZnMgdG8gcHJvdmlkZSBhIHdyaXRlCi0JICogY29tYmluZSBiaXQKLQkgKi8KLQlpZiAobW1hcF9zdGF0ZSAhPSBwY2lfbW1hcF9tZW0pCi0JCXdyaXRlX2NvbWJpbmUgPSAwOwotCWVsc2UgaWYgKHdyaXRlX2NvbWJpbmUgPT0gMCkgewotCQlpZiAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXdyaXRlX2NvbWJpbmUgPSAxOwotCX0KLQotCS8qIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYSB3YXkgdG8gYXNrIGZvciB3cml0ZS10aHJvdWdoICovCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRTsKLQlpZiAod3JpdGVfY29tYmluZSkKLQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKLQllbHNlCi0JCXByb3QgfD0gX1BBR0VfR1VBUkRFRDsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotLyoKLSAqIFRoaXMgb25lIGlzIHVzZWQgYnkgL2Rldi9tZW0gYW5kIGZiZGV2IHdobyBoYXZlIG5vIGNsdWUgYWJvdXQgdGhlCi0gKiBQQ0kgZGV2aWNlLCBpdCB0cmllcyB0byBmaW5kIHRoZSBQQ0kgZGV2aWNlIGZpcnN0IGFuZCBjYWxscyB0aGUKLSAqIGFib3ZlIHJvdXRpbmUKLSAqLwotcGdwcm90X3QgcGNpX3BoeXNfbWVtX2FjY2Vzc19wcm90KHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgdW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICBwZ3Byb3RfdCBwcm90ZWN0aW9uKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmZvdW5kID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IGk7Ci0KLQlpZiAocGFnZV9pc19yYW0ocGZuKSkKLQkJcmV0dXJuIF9fcGdwcm90KHByb3QpOwotCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0JCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQkJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCi0JCQlpZiAob2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwKLQkJCSAgICBvZmZzZXQgPiBycC0+ZW5kKQotCQkJCWNvbnRpbnVlOwotCQkJZm91bmQgPSBycDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZm91bmQpIHsKLQkJaWYgKGZvdW5kLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCi0JCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQl9Ci0KLQlEQkcoIm5vbi1QQ0kgbWFwIGZvciAlbHgsIHByb3Q6ICVseFxuIiwgb2Zmc2V0LCBwcm90KTsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotCi0vKgotICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCi0gKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAotICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCi0gKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgotICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCi0gKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCi0gKgotICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1pbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKLQkJCWludCB3cml0ZV9jb21iaW5lKQotewotCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0Jc3RydWN0IHJlc291cmNlICpycDsKLQlpbnQgcmV0OwotCi0JcnAgPSBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KGRldiwgJm9mZnNldCwgbW1hcF9zdGF0ZSk7Ci0JaWYgKHJwID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwotCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wY2lfbW1hcF9zZXRfcGdwcm90KGRldiwgcnAsCi0JCQkJCQkgIHZtYS0+dm1fcGFnZV9wcm90LAotCQkJCQkJICBtbWFwX3N0YXRlLCB3cml0ZV9jb21iaW5lKTsKLQotCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCi0JCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBPYnNvbGV0ZSBmdW5jdGlvbnMuIFNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlIHN5bWJpb3MgZHJpdmVyCi0gKiBpcyBmaXhlZAotICovCi11bnNpZ25lZCBsb25nCi1waHlzX3RvX2J1cyh1bnNpZ25lZCBsb25nIHBhKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlpbnQgaTsKLQotCWZvciAoaG9zZSA9IGhvc2VfaGVhZDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpIHsKLQkJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgewotCQkJaWYgKHBhID49IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQKLQkJCSAgICAmJiBwYSA8PSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmVuZCkgewotCQkJCS8qCi0JCQkJICogWFhYIHRoZSBob3NlLT5wY2lfbWVtX29mZnNldCByZWFsbHkKLQkJCQkgKiBvbmx5IGFwcGxpZXMgdG8gbWVtX3Jlc291cmNlc1swXS4KLQkJCQkgKiBXZSBuZWVkIGEgd2F5IHRvIHN0b3JlIGFuIG9mZnNldCBmb3IKLQkJCQkgKiB0aGUgb3RoZXJzLiAgLS0gcGF1bHVzCi0JCQkJICovCi0JCQkJaWYgKGkgPT0gMCkKLQkJCQkJcGEgLT0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0JCQkJcmV0dXJuIHBhOwotCQkJfQotCQl9Ci0JfQotCS8qIGhtbW0sIGRpZG4ndCBmaW5kIGl0ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXBjaV9waHlzX3RvX2J1cyh1bnNpZ25lZCBsb25nIHBhLCBpbnQgYnVzbnIpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gcGNpX2J1c190b19ob3NlKGJ1c25yKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiBwYTsKLQlyZXR1cm4gcGEgLSBob3NlLT5wY2lfbWVtX29mZnNldDsKLX0KLQotdW5zaWduZWQgbG9uZwotcGNpX2J1c190b19waHlzKHVuc2lnbmVkIGludCBiYSwgaW50IGJ1c25yKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXNucik7Ci0JaWYgKCFob3NlKQotCQlyZXR1cm4gYmE7Ci0JcmV0dXJuIGJhICsgaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci19Ci0KIC8qIFByb3ZpZGUgaW5mb3JtYXRpb24gb24gbG9jYXRpb25zIG9mIHZhcmlvdXMgSS9PIHJlZ2lvbnMgaW4gcGh5c2ljYWwKICAqIG1lbW9yeS4gIERvIHRoaXMgb24gYSBwZXItY2FyZCBiYXNpcyBzbyB0aGF0IHdlIGNob29zZSB0aGUgcmlnaHQKICAqIHJvb3QgYnJpZGdlLgpAQCAtMTgxNCw2MiArMTM4NSwxMSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKLQkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLAotCQkJICByZXNvdXJjZV9zaXplX3QgKnN0YXJ0LCByZXNvdXJjZV9zaXplX3QgKmVuZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoZGV2LT5idXMtPm51bWJlcik7Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IDA7Ci0KLQlpZiAoaG9zZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKLQotCS8qIFdlIHBhc3MgYSBmdWxseSBmaXhlZCB1cCBhZGRyZXNzIHRvIHVzZXJsYW5kIGZvciBNTUlPIGluc3RlYWQgb2YKLQkgKiBhIEJBUiB2YWx1ZSBiZWNhdXNlIFggaXMgbGFtZSBhbmQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHVzZSB0aGF0Ci0JICogdG8gcGFzcyB0byAvZGV2L21lbSAhCi0JICoKLQkgKiBUaGF0IG1lYW5zIHRoYXQgd2UnbGwgaGF2ZSBwb3RlbnRpYWxseSA2NCBiaXRzIHZhbHVlcyB3aGVyZSBzb21lCi0JICogdXNlcmxhbmQgYXBwcyBvbmx5IGV4cGVjdCAzMiAobGlrZSBYIGl0c2VsZiBzaW5jZSBpdCB0aGlua3Mgb25seQotCSAqIFNwYXJjIGhhcyA2NCBiaXRzIE1NSU8pIGJ1dCBpZiB3ZSBkb24ndCBkbyB0aGF0LCB3ZSBicmVhayBpdCBvbgotCSAqIDMyIGJpdHMgQ0hSUHMgOi0oCi0JICoKLQkgKiBIb3BlZnVsbHksIHRoZSBzeXNmcyBpbnN0ZXJmYWNlIGlzIGltbXVuZSB0byB0aGF0IGd1bmsuIE9uY2UgWAotCSAqIGhhcyBiZWVuIGZpeGVkIChhbmQgdGhlIGZpeCBzcHJlYWQgZW5vdWdoKSwgd2UgY2FuIHJlLWVuYWJsZSB0aGUKLQkgKiAyIGxpbmVzIGJlbG93IGFuZCBwYXNzIGRvd24gYSBCQVIgdmFsdWUgdG8gdXNlcmxhbmQuIEluIHRoYXQgY2FzZQotCSAqIHdlJ2xsIGFsc28gaGF2ZSB0byByZS1lbmFibGUgdGhlIG1hdGNoaW5nIGNvZGUgaW4KLQkgKiBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KCkuCi0JICoKLQkgKiBCZW5ILgotCSAqLwotI2lmIDAKLQllbHNlIGlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLSNlbmRpZgotCi0JKnN0YXJ0ID0gcnNyYy0+c3RhcnQgLSBvZmZzZXQ7Ci0JKmVuZCA9IHJzcmMtPmVuZCAtIG9mZnNldDsKLX0KLQotdm9pZCBfX2luaXQgcGNpX2luaXRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsIHJlc291cmNlX3NpemVfdCBzdGFydCwKLQkJCSAgICAgIHJlc291cmNlX3NpemVfdCBlbmQsIGludCBmbGFncywgY2hhciAqbmFtZSkKLXsKLQlyZXMtPnN0YXJ0ID0gc3RhcnQ7Ci0JcmVzLT5lbmQgPSBlbmQ7Ci0JcmVzLT5mbGFncyA9IGZsYWdzOwotCXJlcy0+bmFtZSA9IG5hbWU7Ci0JcmVzLT5wYXJlbnQgPSBOVUxMOwotCXJlcy0+c2libGluZyA9IE5VTEw7Ci0JcmVzLT5jaGlsZCA9IE5VTEw7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCiB7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gaG9zZV9oZWFkOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKIAotCWZvciAoOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewogCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IGhvc2UtPmlvX3Jlc291cmNlLmVuZCAtCiAJCQlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArIDE7CiAJCWlmIChhZGRyZXNzID49IGhvc2UtPmlvX2Jhc2VfcGh5cyAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggZTMwMDlhNC4uYTk3ZTIzYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDEsMzUgKzQyLDIzIEBACiAKIHVuc2lnbmVkIGxvbmcgcGNpX3Byb2JlX29ubHkgPSAxOwogaW50IHBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMDsKLXN0YXRpYyBpbnQgcGNpX2luaXRpYWxfc2Nhbl9kb25lOwogCiBzdGF0aWMgdm9pZCBmaXh1cF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgc3RydWN0IHBjaV9kZXYgKmRldik7CiBzdGF0aWMgdm9pZCBkb19idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci1zdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpOwogCiAvKiBwY2lfaW9fYmFzZSAtLSB0aGUgYmFzZSBhZGRyZXNzIGZyb20gd2hpY2ggaW8gYmFycyBhcmUgb2Zmc2V0cy4KICAqIFRoaXMgaXMgdGhlIGxvd2VzdCBJL08gYmFzZSBhZGRyZXNzIChzbyBiYXIgdmFsdWVzIGFyZSBhbHdheXMgcG9zaXRpdmUpLAogICogYW5kIGl0ICptdXN0KiBiZSB0aGUgc3RhcnQgb2YgSVNBIHNwYWNlIGlmIGFuIElTQSBidXMgZXhpc3RzIGJlY2F1c2UKLSAqIElTQSBkcml2ZXJzIHVzZSBoYXJkIGNvZGVkIG9mZnNldHMuICBJZiBubyBJU0EgYnVzIGV4aXN0cyBhIGR1bW15Ci0gKiBwYWdlIGlzIG1hcHBlZCBhbmQgaXNhX2lvX2xpbWl0IHByZXZlbnRzIGFjY2VzcyB0byBpdC4KKyAqIElTQSBkcml2ZXJzIHVzZSBoYXJkIGNvZGVkIG9mZnNldHMuICBJZiBubyBJU0EgYnVzIGV4aXN0cyBub3RoaW5nCisgKiBpcyBtYXBwZWQgb24gdGhlIGZpcnN0IDY0SyBvZiBJTyBzcGFjZQogICovCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlOwkvKiBOVUxMIGlmIG5vIElTQSBidXMgKi8KLUVYUE9SVF9TWU1CT0woaXNhX2lvX2Jhc2UpOwotdW5zaWduZWQgbG9uZyBwY2lfaW9fYmFzZTsKK3Vuc2lnbmVkIGxvbmcgcGNpX2lvX2Jhc2UgPSBJU0FfSU9fQkFTRTsKIEVYUE9SVF9TWU1CT0wocGNpX2lvX2Jhc2UpOwogCi12b2lkIGlTZXJpZXNfcGNpYmlvc19pbml0KHZvaWQpOwotCiBMSVNUX0hFQUQoaG9zZV9saXN0KTsKIAogc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKnBjaV9kbWFfb3BzOwogCi1pbnQgZ2xvYmFsX3BoYl9udW1iZXI7CQkvKiBHbG9iYWwgcGhiIGNvdW50ZXIgKi8KLQotLyogQ2FjaGVkIElTQSBicmlkZ2UgZGV2LiAqLwotc3RydWN0IHBjaV9kZXYgKnBwYzY0X2lzYWJyaWRnZV9kZXYgPSBOVUxMOwotRVhQT1JUX1NZTUJPTF9HUEwocHBjNjRfaXNhYnJpZGdlX2Rldik7Ci0KIHZvaWQgc2V0X3BjaV9kbWFfb3BzKHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMpCiB7CiAJcGNpX2RtYV9vcHMgPSBkbWFfb3BzOwpAQCAtMTAwLDcgKzg5LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCSAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7CisJICAgICAgICBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKIAogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCiAJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwpAQCAtMTE5LDcgKzEwOCw3IEBACiAJCXJldHVybjsKIAogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkgICAgICAgIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOworCSAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CiAKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQogCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKQEAgLTE1Niw3ICsxNDUsNyBAQAogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtCi0JCQkJCXBjaV9pb19iYXNlOworCQkJCQlfSU9fQkFTRTsKIAkJLyogTWFrZSBzdXJlIHdlIHN0YXJ0IGF0IG91ciBtaW4gb24gYWxsIGhvc2VzICovCiAJCWlmIChzdGFydCAtIG9mZnNldCA8IFBDSUJJT1NfTUlOX0lPKQogCQkJc3RhcnQgPSBQQ0lCSU9TX01JTl9JTyArIG9mZnNldDsKQEAgLTE4MCw1NSArMTY5LDYgQEAKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiB9CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zZV9zcGlubG9jayk7Ci0KLS8qCi0gKiBwY2lfY29udHJvbGxlcihwaGIpIGluaXRpYWxpemVkIGNvbW1vbiB2YXJpYWJsZXMuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQotewotCW1lbXNldChob3NlLCAwLCBzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0KLQlzcGluX2xvY2soJmhvc2Vfc3BpbmxvY2spOwotCWhvc2UtPmdsb2JhbF9udW1iZXIgPSBnbG9iYWxfcGhiX251bWJlcisrOwotCWxpc3RfYWRkX3RhaWwoJmhvc2UtPmxpc3Rfbm9kZSwgJmhvc2VfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmhvc2Vfc3BpbmxvY2spOwotfQotCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7Ci0KLQlpZiAobWVtX2luaXRfZG9uZSkKLQkJcGhiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7Ci0JZWxzZQotCQlwaGIgPSBhbGxvY19ib290bWVtKHNpemVvZiAoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0JaWYgKHBoYiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIocGhiKTsKLQlwaGItPmFyY2hfZGF0YSA9IGRldjsKLQlwaGItPmlzX2R5bmFtaWMgPSBtZW1faW5pdF9kb25lOwotCWlmIChkZXYpIHsKLQkJaW50IG5pZCA9IG9mX25vZGVfdG9fbmlkKGRldik7Ci0KLQkJaWYgKG5pZCA8IDAgfHwgIW5vZGVfb25saW5lKG5pZCkpCi0JCQluaWQgPSAtMTsKLQotCQlQSEJfU0VUX05PREUocGhiLCBuaWQpOwotCX0KLQlyZXR1cm4gcGhiOwotfQotCi12b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQotewotCXNwaW5fbG9jaygmaG9zZV9zcGlubG9jayk7Ci0JbGlzdF9kZWwoJnBoYi0+bGlzdF9ub2RlKTsKLQlzcGluX3VubG9jaygmaG9zZV9zcGlubG9jayk7Ci0KLQlpZiAocGhiLT5pc19keW5hbWljKQotCQlrZnJlZShwaGIpOwotfQotCiB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2NsYWltX29uZV9idXMoc3RydWN0IHBjaV9idXMgKmIpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKQEAgLTI5MSw3ICsyMzEsNiBAQAogCXJldHVybiBmbGFnczsKIH0KIAotI2RlZmluZSBHRVRfNjRCSVQocHJvcCwgaSkJKCgoKHU2NCkgKHByb3ApWyhpKV0pIDw8IDMyKSB8IChwcm9wKVsoaSkrMV0pCiAKIHN0YXRpYyB2b2lkIHBjaV9wYXJzZV9vZl9hZGRycyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0zMTAsOCArMjQ5LDggQEAKIAkJZmxhZ3MgPSBwY2lfcGFyc2Vfb2ZfZmxhZ3MoYWRkcnNbMF0pOwogCQlpZiAoIWZsYWdzKQogCQkJY29udGludWU7Ci0JCWJhc2UgPSBHRVRfNjRCSVQoYWRkcnMsIDEpOwotCQlzaXplID0gR0VUXzY0QklUKGFkZHJzLCAzKTsKKwkJYmFzZSA9IG9mX3JlYWRfbnVtYmVyKCZhZGRyc1sxXSwgMik7CisJCXNpemUgPSBvZl9yZWFkX251bWJlcigmYWRkcnNbM10sIDIpOwogCQlpZiAoIXNpemUpCiAJCQljb250aW51ZTsKIAkJaSA9IGFkZHJzWzBdICYgMHhmZjsKQEAgLTQ3OSw3ICs0MTgsNyBAQAogCWkgPSAxOwogCWZvciAoOyBsZW4gPj0gMzI7IGxlbiAtPSAzMiwgcmFuZ2VzICs9IDgpIHsKIAkJZmxhZ3MgPSBwY2lfcGFyc2Vfb2ZfZmxhZ3MocmFuZ2VzWzBdKTsKLQkJc2l6ZSA9IEdFVF82NEJJVChyYW5nZXMsIDYpOworCQlzaXplID0gb2ZfcmVhZF9udW1iZXIoJnJhbmdlc1s2XSwgMik7CiAJCWlmIChmbGFncyA9PSAwIHx8IHNpemUgPT0gMCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CkBAIC00OTgsNyArNDM3LDcgQEAKIAkJCXJlcyA9IGJ1cy0+cmVzb3VyY2VbaV07CiAJCQkrK2k7CiAJCX0KLQkJcmVzLT5zdGFydCA9IEdFVF82NEJJVChyYW5nZXMsIDEpOworCQlyZXMtPnN0YXJ0ID0gb2ZfcmVhZF9udW1iZXIoJnJhbmdlc1sxXSwgMik7CiAJCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIHNpemUgLSAxOwogCQlyZXMtPmZsYWdzID0gZmxhZ3M7CiAJCWZpeHVwX3Jlc291cmNlKHJlcywgZGV2KTsKQEAgLTUzNywxMCArNDc2LDE2IEBACiAJYnVzLT5zZWNvbmRhcnkgPSBob3NlLT5maXJzdF9idXNubzsKIAlob3NlLT5idXMgPSBidXM7CiAKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCisJCXBjaWJpb3NfbWFwX2lvX3NwYWNlKGJ1cyk7CisKIAlidXMtPnJlc291cmNlWzBdID0gcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwotCWlmIChyZXMtPmZsYWdzICYmIHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgcmVzKSkKKwlpZiAocmVzLT5mbGFncyAmJiByZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsIHJlcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBQQ0kgSU8gcmVnaW9uICIKIAkJICAgICAgICJvbiBQQ0kgZG9tYWluICUwNHhcbiIsIGhvc2UtPmdsb2JhbF9udW1iZXIpOworCQlEQkcoInJlcy0+c3RhcnQgPSAweCUwMTZseCwgcmVzLT5lbmQgPSAweCUwMTZseFxuIiwKKwkJICAgIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CiAJCXJlcyA9ICZob3NlLT5tZW1fcmVzb3VyY2VzW2ldOwpAQCAtNTk4LDE3ICs1NDMsNiBAQAogCWlmIChwcGNfbWQucGNpYmlvc19maXh1cCkKIAkJcHBjX21kLnBjaWJpb3NfZml4dXAoKTsKIAotCS8qIENhY2hlIHRoZSBsb2NhdGlvbiBvZiB0aGUgSVNBIGJyaWRnZSAoaWYgd2UgaGF2ZSBvbmUpICovCi0JcHBjNjRfaXNhYnJpZGdlX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0JSSURHRV9JU0EgPDwgOCwgTlVMTCk7Ci0JaWYgKHBwYzY0X2lzYWJyaWRnZV9kZXYgIT0gTlVMTCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIklTQSBicmlkZ2UgYXQgJXNcbiIsIHBjaV9uYW1lKHBwYzY0X2lzYWJyaWRnZV9kZXYpKTsKLQotCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKLQkJLyogbWFwIGluIFBDSSBJL08gc3BhY2UgKi8KLQkJcGhic19yZW1hcF9pbygpOwotCi0JcGNpX2luaXRpYWxfc2Nhbl9kb25lID0gMTsKLQogCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIGRvbmVcbiIpOwogCiAJcmV0dXJuIDA7CkBAIC02MTYsMTEgKzU1MCw2IEBACiAKIHN1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOwogCi1jaGFyIF9faW5pdCAqcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCi17Ci0JcmV0dXJuIHN0cjsKLX0KLQogaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIHsKIAl1MTYgY21kLCBvbGRjbWQ7CkBAIC02NTEsMjIgKzU4MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBSZXR1cm4gdGhlIGRvbWFpbiBudW1iZXIgZm9yIHRoaXMgYnVzLgotICovCi1pbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlyZXR1cm4gMDsKLQllbHNlIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7Ci0KLQkJcmV0dXJuIGhvc2UtPmdsb2JhbF9udW1iZXI7Ci0JfQotfQotCi1FWFBPUlRfU1lNQk9MKHBjaV9kb21haW5fbnIpOwotCiAvKiBEZWNpZGUgd2hldGhlciB0byBkaXNwbGF5IHRoZSBkb21haW4gbnVtYmVyIGluIC9wcm9jICovCiBpbnQgcGNpX3Byb2NfZG9tYWluKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CkBAIC02NzgsMjgxICs1OTEsNiBAQAogCX0KIH0KIAotLyoKLSAqIFBsYXRmb3JtIHN1cHBvcnQgZm9yIC9wcm9jL2J1cy9wY2kvWC9ZIG1tYXAoKXMsCi0gKiBtb2RlbGxlZCBvbiB0aGUgc3BhcmM2NCBpbXBsZW1lbnRhdGlvbiBieSBEYXZlIE1pbGxlci4KLSAqICAtLSBwYXVsdXMuCi0gKi8KLQotLyoKLSAqIEFkanVzdCB2bV9wZ29mZiBvZiBWTUEgc3VjaCB0aGF0IGl0IGlzIHRoZSBwaHlzaWNhbCBwYWdlIG9mZnNldAotICogY29ycmVzcG9uZGluZyB0byB0aGUgMzItYml0IHBjaSBidXMgb2Zmc2V0IGZvciBERVYgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLgotICoKLSAqIEJhc2ljYWxseSwgdGhlIHVzZXIgZmluZHMgdGhlIGJhc2UgYWRkcmVzcyBmb3IgaGlzIGRldmljZSB3aGljaCBoZSB3aXNoZXMKLSAqIHRvIG1tYXAuICBUaGV5IHJlYWQgdGhlIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZSBjb25maWcgc3BhY2UgYmFzZSByZWdpc3RlciwKLSAqIGFkZCB3aGF0ZXZlciBQQUdFX1NJWkUgbXVsdGlwbGUgb2Zmc2V0IHRoZXkgd2lzaCwgYW5kIGZlZWQgdGhpcyBpbnRvIHRoZQotICogb2Zmc2V0IHBhcmFtZXRlciBvZiBtbWFwIG9uIC9wcm9jL2J1cy9wY2kvWFhYIGZvciB0aGF0IGRldmljZS4KLSAqCi0gKiBSZXR1cm5zIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlICpfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0JCQkJCSAgICAgICByZXNvdXJjZV9zaXplX3QgKm9mZnNldCwKLQkJCQkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOwotCXVuc2lnbmVkIGxvbmcgaW9fb2Zmc2V0ID0gMDsKLQlpbnQgaSwgcmVzX2JpdDsKLQotCWlmIChob3NlID09IDApCi0JCXJldHVybiBOVUxMOwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCi0JLyogSWYgbWVtb3J5LCBhZGQgb24gdGhlIFBDSSBicmlkZ2UgYWRkcmVzcyBvZmZzZXQgKi8KLQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9tZW0pIHsKLSNpZiAwIC8qIFNlZSBjb21tZW50IGluIHBjaV9yZXNvdXJjZV90b191c2VyKCkgZm9yIHdoeSB0aGlzIGlzIGRpc2FibGVkICovCi0JCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0jZW5kaWYKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwotCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCQkqb2Zmc2V0ICs9IGlvX29mZnNldDsKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfSU87Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgcmVxdWVzdGVkIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUKLQkgKiByZXNvdXJjZXMgb2YgdGhlIGRldmljZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJmRldi0+cmVzb3VyY2VbaV07Ci0JCWludCBmbGFncyA9IHJwLT5mbGFnczsKLQotCQkvKiB0cmVhdCBST00gYXMgbWVtb3J5IChzaG91bGQgYmUgYWxyZWFkeSkgKi8KLQkJaWYgKGkgPT0gUENJX1JPTV9SRVNPVVJDRSkKLQkJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOwotCi0JCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQlpZiAoKGZsYWdzICYgcmVzX2JpdCkgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEluIHRoZSByYW5nZSBvZiB0aGlzIHJlc291cmNlPyAqLwotCQlpZiAoKm9mZnNldCA8IChycC0+c3RhcnQgJiBQQUdFX01BU0spIHx8ICpvZmZzZXQgPiBycC0+ZW5kKQotCQkJY29udGludWU7Ci0KLQkJLyogZm91bmQgaXQhIGNvbnN0cnVjdCB0aGUgZmluYWwgcGh5c2ljYWwgYWRkcmVzcyAqLwotCQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykKLQkJICAgICAgIAkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKLQkJcmV0dXJuIHJwOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogU2V0IHZtX3BhZ2VfcHJvdCBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpCi0gKiBkZXZpY2UgbWFwcGluZy4KLSAqLwotc3RhdGljIHBncHJvdF90IF9fcGNpX21tYXBfc2V0X3BncHJvdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAotCQkJCSAgICAgIHBncHJvdF90IHByb3RlY3Rpb24sCi0JCQkJICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAotCQkJCSAgICAgIGludCB3cml0ZV9jb21iaW5lKQotewotCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7Ci0KLQkvKiBXcml0ZSBjb21iaW5lIGlzIGFsd2F5cyAwIG9uIG5vbi1tZW1vcnkgc3BhY2UgbWFwcGluZ3MuIE9uCi0JICogbWVtb3J5IHNwYWNlLCBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyAxLCB3ZSBjaGVjayBmb3IgYQotCSAqICJwcmVmZXRjaGFibGUiIHJlc291cmNlLiBUaGlzIGlzIGEgYml0IGhhY2tpc2gsIGJ1dCB3ZSB1c2UKLQkgKiB0aGlzIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSBvZiAvc3lzZnMgdG8gcHJvdmlkZSBhIHdyaXRlCi0JICogY29tYmluZSBiaXQKLQkgKi8KLQlpZiAobW1hcF9zdGF0ZSAhPSBwY2lfbW1hcF9tZW0pCi0JCXdyaXRlX2NvbWJpbmUgPSAwOwotCWVsc2UgaWYgKHdyaXRlX2NvbWJpbmUgPT0gMCkgewotCQlpZiAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXdyaXRlX2NvbWJpbmUgPSAxOwotCX0KLQotCS8qIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYSB3YXkgdG8gYXNrIGZvciB3cml0ZS10aHJvdWdoICovCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRTsKLQlpZiAod3JpdGVfY29tYmluZSkKLQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKLQllbHNlCi0JCXByb3QgfD0gX1BBR0VfR1VBUkRFRDsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotLyoKLSAqIFRoaXMgb25lIGlzIHVzZWQgYnkgL2Rldi9tZW0gYW5kIGZiZGV2IHdobyBoYXZlIG5vIGNsdWUgYWJvdXQgdGhlCi0gKiBQQ0kgZGV2aWNlLCBpdCB0cmllcyB0byBmaW5kIHRoZSBQQ0kgZGV2aWNlIGZpcnN0IGFuZCBjYWxscyB0aGUKLSAqIGFib3ZlIHJvdXRpbmUKLSAqLwotcGdwcm90X3QgcGNpX3BoeXNfbWVtX2FjY2Vzc19wcm90KHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgdW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICBwZ3Byb3RfdCBwcm90ZWN0aW9uKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmZvdW5kID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IGk7Ci0KLQlpZiAocGFnZV9pc19yYW0ocGZuKSkKLQkJcmV0dXJuIF9fcGdwcm90KHByb3QpOwotCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0JCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQkJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCi0JCQlpZiAob2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwKLQkJCSAgICBvZmZzZXQgPiBycC0+ZW5kKQotCQkJCWNvbnRpbnVlOwotCQkJZm91bmQgPSBycDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZm91bmQpIHsKLQkJaWYgKGZvdW5kLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCi0JCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQl9Ci0KLQlEQkcoIm5vbi1QQ0kgbWFwIGZvciAlbHgsIHByb3Q6ICVseFxuIiwgb2Zmc2V0LCBwcm90KTsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotCi0vKgotICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCi0gKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAotICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCi0gKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgotICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCi0gKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCi0gKgotICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1pbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpCi17Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJwOwotCWludCByZXQ7Ci0KLQlycCA9IF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoZGV2LCAmb2Zmc2V0LCBtbWFwX3N0YXRlKTsKLQlpZiAocnAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2bWEtPnZtX3Bnb2ZmID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7Ci0Jdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKLQkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCi0JCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwotCi0JcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKLQkJCSAgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHBjaV9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlwZGV2ID0gdG9fcGNpX2RldiAoZGV2KTsKLQlucCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKLQlpZiAobnAgPT0gTlVMTCB8fCBucC0+ZnVsbF9uYW1lID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgbnAtPmZ1bGxfbmFtZSk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGV2c3BlYywgU19JUlVHTywgcGNpX3Nob3dfZGV2c3BlYywgTlVMTCk7Ci0KLWludCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWMpOwotfQotCi0jZGVmaW5lIElTQV9TUEFDRV9NQVNLIDB4MQotI2RlZmluZSBJU0FfU1BBQ0VfSU8gMHgxCi0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhX25vZGUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBwaGJfaW9fYmFzZV9waHlzLAotCQkJCSAgICAgIHZvaWQgX19pb21lbSAqIHBoYl9pb19iYXNlX3ZpcnQpCi17Ci0JLyogUmVtb3ZlIHRoZXNlIGFzYXAgKi8KLQotCXN0cnVjdCBwY2lfYWRkcmVzcyB7Ci0JCXUzMiBhX2hpOwotCQl1MzIgYV9taWQ7Ci0JCXUzMiBhX2xvOwotCX07Ci0KLQlzdHJ1Y3QgaXNhX2FkZHJlc3MgewotCQl1MzIgYV9oaTsKLQkJdTMyIGFfbG87Ci0JfTsKLQotCXN0cnVjdCBpc2FfcmFuZ2UgewotCQlzdHJ1Y3QgaXNhX2FkZHJlc3MgaXNhX2FkZHI7Ci0JCXN0cnVjdCBwY2lfYWRkcmVzcyBwY2lfYWRkcjsKLQkJdW5zaWduZWQgaW50IHNpemU7Ci0JfTsKLQotCWNvbnN0IHN0cnVjdCBpc2FfcmFuZ2UgKnJhbmdlOwotCXVuc2lnbmVkIGxvbmcgcGNpX2FkZHI7Ci0JdW5zaWduZWQgaW50IGlzYV9hZGRyOwotCXVuc2lnbmVkIGludCBzaXplOwotCWludCBybGVuID0gMDsKLQotCXJhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KGlzYV9ub2RlLCAicmFuZ2VzIiwgJnJsZW4pOwotCWlmIChyYW5nZSA9PSBOVUxMIHx8IChybGVuIDwgc2l6ZW9mKHN0cnVjdCBpc2FfcmFuZ2UpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm5vIElTQSByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2Ugc2l6ZSwiCi0JCSAgICAgICAibWFwcGluZyA2NGtcbiIpOwotCQlfX2lvcmVtYXBfZXhwbGljaXQocGhiX2lvX2Jhc2VfcGh5cywKLQkJCQkgICAodW5zaWduZWQgbG9uZylwaGJfaW9fYmFzZV92aXJ0LAotCQkJCSAgIDB4MTAwMDAsIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JCXJldHVybjsJCi0JfQotCQotCS8qIEZyb20gIklTQSBCaW5kaW5nIHRvIDEyNzUiCi0JICogVGhlIHJhbmdlcyBwcm9wZXJ0eSBpcyBsYWlkIG91dCBhcyBhbiBhcnJheSBvZiBlbGVtZW50cywKLQkgKiBlYWNoIG9mIHdoaWNoIGNvbXByaXNlczoKLQkgKiAgIGNlbGxzIDAgLSAxOglhbiBJU0EgYWRkcmVzcwotCSAqICAgY2VsbHMgMiAtIDQ6CWEgUENJIGFkZHJlc3MgCi0JICoJCQkoc2l6ZSBkZXBlbmRpbmcgb24gZGV2LT5uX2FkZHJfY2VsbHMpCi0JICogICBjZWxsIDU6CQl0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UKLQkgKi8KLQlpZiAoKHJhbmdlLT5pc2FfYWRkci5hX2hpICYmIElTQV9TUEFDRV9NQVNLKSA9PSBJU0FfU1BBQ0VfSU8pIHsKLQkJaXNhX2FkZHIgPSByYW5nZS0+aXNhX2FkZHIuYV9sbzsKLQkJcGNpX2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmFuZ2UtPnBjaV9hZGRyLmFfbWlkIDw8IDMyIHwgCi0JCQlyYW5nZS0+cGNpX2FkZHIuYV9sbzsKLQotCQkvKiBBc3N1bWUgdGhlc2UgYXJlIGJvdGggemVybyAqLwotCQlpZiAoKHBjaV9hZGRyICE9IDApIHx8IChpc2FfYWRkciAhPSAwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ1bmV4cGVjdGVkIGlzYSB0byBwY2kgbWFwcGluZzogJXNcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXNpemUgPSBQQUdFX0FMSUdOKHJhbmdlLT5zaXplKTsKLQotCQlfX2lvcmVtYXBfZXhwbGljaXQocGhiX2lvX2Jhc2VfcGh5cywgCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcpIHBoYl9pb19iYXNlX3ZpcnQsIAotCQkJCSAgIHNpemUsIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JfQotfQotCiB2b2lkIF9fZGV2aW5pdCBwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgcHJpbSkKIHsKQEAgLTEwNDcsMTU1ICs2ODUsMTIyIEBACiAJfQogfQogCi12b2lkIF9fZGV2aW5pdCBwY2lfc2V0dXBfcGhiX2lvKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IHByaW1hcnkpCisjaWZkZWYgQ09ORklHX0hPVFBMVUcKKworaW50IHBjaWJpb3NfdW5tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSBob3NlLT5wY2lfaW9fc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGlvX3ZpcnRfb2Zmc2V0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhX2RuOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAotCWlmIChzaXplID09IDApCi0JCXJldHVybjsKKwlXQVJOX09OKGJ1cyA9PSBOVUxMKTsKIAotCWhvc2UtPmlvX2Jhc2VfdmlydCA9IHJlc2VydmVfcGhiX2lvc3BhY2Uoc2l6ZSk7Ci0JREJHKCJwaGIlZCBpb19iYXNlX3BoeXMgMHglbHggaW9fYmFzZV92aXJ0IDB4JWx4XG4iLAotCQlob3NlLT5nbG9iYWxfbnVtYmVyLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCSh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQpOwotCi0JaWYgKHByaW1hcnkpIHsKLQkJcGNpX2lvX2Jhc2UgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQ7Ci0JCWlzYV9kbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJpc2EiKTsKLQkJaWYgKGlzYV9kbikgewotCQkJaXNhX2lvX2Jhc2UgPSBwY2lfaW9fYmFzZTsKLQkJCXBjaV9wcm9jZXNzX0lTQV9PRl9yYW5nZXMoaXNhX2RuLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCQkJCQlob3NlLT5pb19iYXNlX3ZpcnQpOwotCQkJb2Zfbm9kZV9wdXQoaXNhX2RuKTsKLQkJfQotCX0KLQotCWlvX3ZpcnRfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7Ci0JcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwotCXJlcy0+c3RhcnQgKz0gaW9fdmlydF9vZmZzZXQ7Ci0JcmVzLT5lbmQgKz0gaW9fdmlydF9vZmZzZXQ7Ci0KLQkvKiBJZiB0aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgaW5pdGlhbCBQQ0kgc2NhbiwgdGhlbiB3ZSBuZWVkIHRvCi0JICogcHJvY2VlZCB0byBJTyBtYXBwaW5ncyBub3cKKwkvKiBJZiB0aGlzIGlzIG5vdCBhIFBIQiwgd2Ugb25seSBmbHVzaCB0aGUgaGFzaCB0YWJsZSBvdmVyCisJICogdGhlIGFyZWEgbWFwcGVkIGJ5IHRoaXMgYnJpZGdlLiBXZSBkb24ndCBwbGF5IHdpdGggdGhlIFBURQorCSAqIG1hcHBpbmdzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgdG8gZGVhbCB3aXRoIHN1Yi1wYWdlIGFsaWduZW1udHMKKwkgKiBzbyBmbHVzaGluZyB0aGUgaGFzaCB0YWJsZSBpcyB0aGUgb25seSBzYW5lIHdheSB0byBtYWtlIHN1cmUKKwkgKiB0aGF0IG5vIGhhc2ggZW50cmllcyBhcmUgY292ZXJpbmcgdGhhdCByZW1vdmVkIGJyaWRnZSBhcmVhCisJICogd2hpbGUgc3RpbGwgYWxsb3dpbmcgb3RoZXIgYnVzc2VzIG92ZXJsYXBwaW5nIHRob3NlIHBhZ2VzCiAJICovCi0JaWYgKHBjaV9pbml0aWFsX3NjYW5fZG9uZSkKLQkJX19pb3JlbWFwX2V4cGxpY2l0KGhvc2UtPmlvX2Jhc2VfcGh5cywKLQkJCQkgICAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQsCi0JCQkJICAgaG9zZS0+cGNpX2lvX3NpemUsCi0JCQkJICAgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKLX0KKwlpZiAoYnVzLT5zZWxmKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gYnVzLT5yZXNvdXJjZVswXTsKIAotdm9pZCBfX2RldmluaXQgcGNpX3NldHVwX3BoYl9pb19keW5hbWljKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkJaW50IHByaW1hcnkpCisJCURCRygiSU8gdW5tYXBwaW5nIGZvciBQQ0ktUENJIGJyaWRnZSAlc1xuIiwKKwkJICAgIHBjaV9uYW1lKGJ1cy0+c2VsZikpOworCisJCV9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZSgmaW5pdF9tbSwgcmVzLT5zdGFydCArIF9JT19CQVNFLAorCQkJCQkgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEdldCB0aGUgaG9zdCBicmlkZ2UgKi8KKwlob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIElPcyBhbGxvY2F0ZWQgKi8KKwlpZiAoaG9zZS0+aW9fYmFzZV9hbGxvYyA9PSAwKQorCQlyZXR1cm4gMDsKKworCURCRygiSU8gdW5tYXBwaW5nIGZvciBQSEIgJXNcbiIsCisJICAgICgoc3RydWN0IGRldmljZV9ub2RlICopaG9zZS0+YXJjaF9kYXRhKS0+ZnVsbF9uYW1lKTsKKwlEQkcoIiAgYWxsb2M9MHglcFxuIiwgaG9zZS0+aW9fYmFzZV9hbGxvYyk7CisKKwkvKiBUaGlzIGlzIGEgUEhCLCB3ZSBmdWxseSB1bm1hcCB0aGUgSU8gYXJlYSAqLworCXZ1bm1hcChob3NlLT5pb19iYXNlX2FsbG9jKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc191bm1hcF9pb19zcGFjZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVRyAqLworCitpbnQgX19kZXZpbml0IHBjaWJpb3NfbWFwX2lvX3NwYWNlKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0JdW5zaWduZWQgbG9uZyBzaXplID0gaG9zZS0+cGNpX2lvX3NpemU7CisJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfcGFnZTsKKwl1bnNpZ25lZCBsb25nIHNpemVfcGFnZTsKIAl1bnNpZ25lZCBsb25nIGlvX3ZpcnRfb2Zmc2V0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAotCWlmIChzaXplID09IDApCi0JCXJldHVybjsKKwlXQVJOX09OKGJ1cyA9PSBOVUxMKTsKIAotCWhvc2UtPmlvX2Jhc2VfdmlydCA9IF9faW9yZW1hcChob3NlLT5pb19iYXNlX3BoeXMsIHNpemUsCi0JCQkJCV9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JREJHKCJwaGIlZCBpb19iYXNlX3BoeXMgMHglbHggaW9fYmFzZV92aXJ0IDB4JWx4XG4iLAotCQlob3NlLT5nbG9iYWxfbnVtYmVyLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCSh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQpOwotCi0JaWYgKHByaW1hcnkpCi0JCXBjaV9pb19iYXNlID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0OwotCi0JaW9fdmlydF9vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQlyZXMgPSAmaG9zZS0+aW9fcmVzb3VyY2U7Ci0JcmVzLT5zdGFydCArPSBpb192aXJ0X29mZnNldDsKLQlyZXMtPmVuZCArPSBpb192aXJ0X29mZnNldDsKLX0KLQotCi1zdGF0aWMgaW50IGdldF9idXNfaW9fcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgbG9uZyAqc3RhcnRfcGh5cywKLQkJCQl1bnNpZ25lZCBsb25nICpzdGFydF92aXJ0LCB1bnNpZ25lZCBsb25nICpzaXplKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCi0JaWYgKGJ1cy0+c2VsZikKLQkJcmVzID0gYnVzLT5yZXNvdXJjZVswXTsKLQllbHNlCi0JCS8qIFJvb3QgQnVzICovCi0JCXJlcyA9ICZob3NlLT5pb19yZXNvdXJjZTsKLQotCWlmIChyZXMtPmVuZCA9PSAwICYmIHJlcy0+c3RhcnQgPT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQkqc3RhcnRfdmlydCA9IHBjaV9pb19iYXNlICsgcmVzLT5zdGFydDsKLQkqc3RhcnRfcGh5cyA9ICpzdGFydF92aXJ0ICsgaG9zZS0+aW9fYmFzZV9waHlzCi0JCS0gKHVuc2lnbmVkIGxvbmcpIGhvc2UtPmlvX2Jhc2VfdmlydDsKLQotCWlmIChyZXMtPmVuZCA+IHJlcy0+c3RhcnQpCi0JCSpzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKLQllbHNlIHsKLQkJcHJpbnRrKCIlcygpOiB1bmV4cGVjdGVkIHJlZ2lvbiAweCVseC0+MHglbHhcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKLQkJcmV0dXJuIDE7CisJLyogSWYgdGhpcyBub3QgYSBQSEIsIG5vdGhpbmcgdG8gZG8sIHBhZ2UgdGFibGVzIHN0aWxsIGV4aXN0IGFuZAorCSAqIHRodXMgSFBURXMgd2lsbCBiZSBmYXVsdGVkIGluIHdoZW4gbmVlZGVkCisJICovCisJaWYgKGJ1cy0+c2VsZikgeworCQlEQkcoIklPIG1hcHBpbmcgZm9yIFBDSS1QQ0kgYnJpZGdlICVzXG4iLAorCQkgICAgcGNpX25hbWUoYnVzLT5zZWxmKSk7CisJCURCRygiICB2aXJ0PTB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJCSAgICBidXMtPnJlc291cmNlWzBdLT5zdGFydCArIF9JT19CQVNFLAorCQkgICAgYnVzLT5yZXNvdXJjZVswXS0+ZW5kICsgX0lPX0JBU0UpOworCQlyZXR1cm4gMDsKIAl9CiAKKwkvKiBHZXQgdGhlIGhvc3QgYnJpZGdlICovCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCXBoeXNfcGFnZSA9IF9BTElHTl9ET1dOKGhvc2UtPmlvX2Jhc2VfcGh5cywgUEFHRV9TSVpFKTsKKwlzaXplX3BhZ2UgPSBfQUxJR05fVVAoaG9zZS0+cGNpX2lvX3NpemUsIFBBR0VfU0laRSk7CisKKwkvKiBNYWtlIHN1cmUgSU8gYXJlYSBhZGRyZXNzIGlzIGNsZWFyICovCisJaG9zZS0+aW9fYmFzZV9hbGxvYyA9IE5VTEw7CisKKwkvKiBJZiB0aGVyZSdzIG5vIElPIHRvIG1hcCBvbiB0aGF0IGJ1cywgZ2V0IGF3YXkgdG9vICovCisJaWYgKGhvc2UtPnBjaV9pb19zaXplID09IDAgfHwgaG9zZS0+aW9fYmFzZV9waHlzID09IDApCisJCXJldHVybiAwOworCisJLyogTGV0J3MgYWxsb2NhdGUgc29tZSBJTyBzcGFjZSBmb3IgdGhhdCBndXkuIFdlIGRvbid0IHBhc3MKKwkgKiBWTV9JT1JFTUFQIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCBhbGlnbm1lbnQgdHJpY2tzIHRoYXQKKwkgKiB0aGUgY29yZSBkb2VzIGluIHRoYXQgY2FzZS4gTWF5YmUgd2Ugc2hvdWxkIGR1ZSB0byBzdHVwaWQgY2FyZAorCSAqIHdpdGggaW5jb21wbGV0ZSBhZGRyZXNzIGRlY29kaW5nIGJ1dCBJJ2QgcmF0aGVyIG5vdCBkZWFsIHdpdGgKKwkgKiB0aG9zZSBvdXRzaWRlIG9mIHRoZSByZXNlcnZlZCA2NEsgbGVnYWN5IHJlZ2lvbi4KKwkgKi8KKwlhcmVhID0gX19nZXRfdm1fYXJlYShzaXplX3BhZ2UsIDAsIFBIQl9JT19CQVNFLCBQSEJfSU9fRU5EKTsKKwlpZiAoYXJlYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlob3NlLT5pb19iYXNlX2FsbG9jID0gYXJlYS0+YWRkcjsKKwlob3NlLT5pb19iYXNlX3ZpcnQgPSAodm9pZCBfX2lvbWVtICopKGFyZWEtPmFkZHIgKworCQkJCQkgICAgICBob3NlLT5pb19iYXNlX3BoeXMgLSBwaHlzX3BhZ2UpOworCisJREJHKCJJTyBtYXBwaW5nIGZvciBQSEIgJXNcbiIsCisJICAgICgoc3RydWN0IGRldmljZV9ub2RlICopaG9zZS0+YXJjaF9kYXRhKS0+ZnVsbF9uYW1lKTsKKwlEQkcoIiAgcGh5cz0weCUwMTZseCwgdmlydD0weCVwIChhbGxvYz0weCVwKVxuIiwKKwkgICAgaG9zZS0+aW9fYmFzZV9waHlzLCBob3NlLT5pb19iYXNlX3ZpcnQsIGhvc2UtPmlvX2Jhc2VfYWxsb2MpOworCURCRygiICBzaXplPTB4JTAxNmx4IChhbGxvYz0weCUwMTZseClcbiIsCisJICAgIGhvc2UtPnBjaV9pb19zaXplLCBzaXplX3BhZ2UpOworCisJLyogRXN0YWJsaXNoIHRoZSBtYXBwaW5nICovCisJaWYgKF9faW9yZW1hcF9hdChwaHlzX3BhZ2UsIGFyZWEtPmFkZHIsIHNpemVfcGFnZSwKKwkJCSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRml4dXAgaG9zZSBJTyByZXNvdXJjZSAqLworCWlvX3ZpcnRfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisJaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKz0gaW9fdmlydF9vZmZzZXQ7CisJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IGlvX3ZpcnRfb2Zmc2V0OworCisJREJHKCIgIGhvc2UtPmlvX3Jlc291cmNlPTB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJICAgIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOworCiAJcmV0dXJuIDA7CiB9Ci0KLWludCB1bm1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BoeXM7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF92aXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCWlmICghYnVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSBleHBlY3RlZCBidXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlpZiAoZ2V0X2J1c19pb19yYW5nZShidXMsICZzdGFydF9waHlzLCAmc3RhcnRfdmlydCwgJnNpemUpKQotCQlyZXR1cm4gMTsKLQlpZiAoX19pb3VubWFwX2V4cGxpY2l0KCh2b2lkIF9faW9tZW0gKikgc3RhcnRfdmlydCwgc2l6ZSkpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHVubWFwX2J1c19yYW5nZSk7Ci0KLWludCByZW1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BoeXM7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF92aXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCWlmICghYnVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSBleHBlY3RlZCBidXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQkKLQlpZiAoZ2V0X2J1c19pb19yYW5nZShidXMsICZzdGFydF9waHlzLCAmc3RhcnRfdmlydCwgJnNpemUpKQotCQlyZXR1cm4gMTsKLQlpZiAoc3RhcnRfcGh5cyA9PSAwKQotCQlyZXR1cm4gMTsKLQlwcmludGsoS0VSTl9ERUJVRyAibWFwcGluZyBJTyAlbHggLT4gJWx4LCBzaXplOiAlbHhcbiIsIHN0YXJ0X3BoeXMsIHN0YXJ0X3ZpcnQsIHNpemUpOwotCWlmIChfX2lvcmVtYXBfZXhwbGljaXQoc3RhcnRfcGh5cywgc3RhcnRfdmlydCwgc2l6ZSwKLQkJCSAgICAgICBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChyZW1hcF9idXNfcmFuZ2UpOwotCi1zdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQotCQlyZW1hcF9idXNfcmFuZ2UoaG9zZS0+YnVzKTsKLX0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaWJpb3NfbWFwX2lvX3NwYWNlKTsKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGZpeHVwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewpAQCAtMTIwMyw4ICs4MDgsNyBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7Ci0JCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwogCQlyZXMtPnN0YXJ0ICs9IG9mZnNldDsKIAkJcmVzLT5lbmQgKz0gb2Zmc2V0OwogCX0gZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CkBAIC0xMjE5LDkgKzgyMywyMCBAQAogCS8qIFVwZGF0ZSBkZXZpY2UgcmVzb3VyY2VzLiAgKi8KIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKQotCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncykKLQkJCWZpeHVwX3Jlc291cmNlKCZkZXYtPnJlc291cmNlW2ldLCBkZXYpOworCURCRygiJXM6IEZpeHVwIHJlc291cmNlczpcbiIsIHBjaV9uYW1lKGRldikpOworCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07CisJCWlmICghcmVzLT5mbGFncykKKwkJCWNvbnRpbnVlOworCisJCURCRygiICAweCUwMnggPCAlMDhseDoweCUwMTZseC4uLjB4JTAxNmx4XG4iLAorCQkgICAgaSwgcmVzLT5mbGFncywgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCisJCWZpeHVwX3Jlc291cmNlKHJlcywgZGV2KTsKKworCQlEQkcoIiAgICAgICA+ICUwOGx4OjB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJCSAgICByZXMtPmZsYWdzLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJfQogfQogRVhQT1JUX1NZTUJPTChwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMpOwogCkBAIC0xMjkxLDExOSArOTA2LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpYmlvc19maXh1cF9idXMpOwogCi0vKgotICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KLSAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZSAKLSAqIG9wZW5maXJtd2FyZSBhbmQgc2V0cyBpdCBpbiB0aGUgcGNpX2RldiBhbmQgcGNpX2NvbmZpZyBsaW5lLgotICovCi1pbnQgcGNpX3JlYWRfaXJxX2xpbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IG9mX2lycSBvaXJxOwotCXVuc2lnbmVkIGludCB2aXJxOwotCi0JREJHKCJUcnkgdG8gbWFwIGlycSBmb3IgJXMuLi5cbiIsIHBjaV9uYW1lKHBjaV9kZXYpKTsKLQotI2lmZGVmIERFQlVHCi0JbWVtc2V0KCZvaXJxLCAweGZmLCBzaXplb2Yob2lycSkpOwotI2VuZGlmCi0JLyogVHJ5IHRvIGdldCBhIG1hcHBpbmcgZnJvbSB0aGUgZGV2aWNlLXRyZWUgKi8KLQlpZiAob2ZfaXJxX21hcF9wY2kocGNpX2RldiwgJm9pcnEpKSB7Ci0JCXU4IGxpbmUsIHBpbjsKLQotCQkvKiBJZiB0aGF0IGZhaWxzLCBsZXRzIGZhbGxiYWNrIHRvIHdoYXQgaXMgaW4gdGhlIGNvbmZpZwotCQkgKiBzcGFjZSBhbmQgbWFwIHRoYXQgdGhyb3VnaCB0aGUgZGVmYXVsdCBjb250cm9sbGVyLiBXZQotCQkgKiBhbHNvIHNldCB0aGUgdHlwZSB0byBsZXZlbCBsb3cgc2luY2UgdGhhdCdzIHdoYXQgUENJCi0JCSAqIGludGVycnVwdHMgYXJlLiBJZiB5b3VyIHBsYXRmb3JtIGRvZXMgZGlmZmVyZW50bHksIHRoZW4KLQkJICogZWl0aGVyIHByb3ZpZGUgYSBwcm9wZXIgaW50ZXJydXB0IHRyZWUgb3IgZG9uJ3QgdXNlIHRoaXMKLQkJICogZnVuY3Rpb24uCi0JCSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocGluID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZsaW5lKSB8fAotCQkgICAgbGluZSA9PSAweGZmKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJREJHKCIgLT4gbm8gbWFwICEgVXNpbmcgaXJxIGxpbmUgJWQgZnJvbSBQQ0kgY29uZmlnXG4iLCBsaW5lKTsKLQotCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGxpbmUpOwotCQlpZiAodmlycSAhPSBOT19JUlEpCi0JCQlzZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQl9IGVsc2UgewotCQlEQkcoIiAtPiBnb3Qgb25lLCBzcGVjICVkIGNlbGxzICgweCUwOHggMHglMDh4Li4uKSBvbiAlc1xuIiwKLQkJICAgIG9pcnEuc2l6ZSwgb2lycS5zcGVjaWZpZXJbMF0sIG9pcnEuc3BlY2lmaWVyWzFdLAotCQkgICAgb2lycS5jb250cm9sbGVyLT5mdWxsX25hbWUpOwotCi0JCXZpcnEgPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLCBvaXJxLnNwZWNpZmllciwKLQkJCQkJICAgICBvaXJxLnNpemUpOwotCX0KLQlpZih2aXJxID09IE5PX0lSUSkgewotCQlEQkcoIiAtPiBmYWlsZWQgdG8gbWFwICFcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JREJHKCIgLT4gbWFwcGVkIHRvIGxpbnV4IGlycSAlZFxuIiwgdmlycSk7Ci0KLQlwY2lfZGV2LT5pcnEgPSB2aXJxOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHBjaV9yZWFkX2lycV9saW5lKTsKLQotdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAotCQkJICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsCi0JCQkgIHJlc291cmNlX3NpemVfdCAqc3RhcnQsIHJlc291cmNlX3NpemVfdCAqZW5kKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IDA7Ci0KLQlpZiAoaG9zZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQotCS8qIFdlIHBhc3MgYSBmdWxseSBmaXhlZCB1cCBhZGRyZXNzIHRvIHVzZXJsYW5kIGZvciBNTUlPIGluc3RlYWQgb2YKLQkgKiBhIEJBUiB2YWx1ZSBiZWNhdXNlIFggaXMgbGFtZSBhbmQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHVzZSB0aGF0Ci0JICogdG8gcGFzcyB0byAvZGV2L21lbSAhCi0JICoKLQkgKiBUaGF0IG1lYW5zIHRoYXQgd2UnbGwgaGF2ZSBwb3RlbnRpYWxseSA2NCBiaXRzIHZhbHVlcyB3aGVyZSBzb21lCi0JICogdXNlcmxhbmQgYXBwcyBvbmx5IGV4cGVjdCAzMiAobGlrZSBYIGl0c2VsZiBzaW5jZSBpdCB0aGlua3Mgb25seQotCSAqIFNwYXJjIGhhcyA2NCBiaXRzIE1NSU8pIGJ1dCBpZiB3ZSBkb24ndCBkbyB0aGF0LCB3ZSBicmVhayBpdCBvbgotCSAqIDMyIGJpdHMgQ0hSUHMgOi0oCi0JICoKLQkgKiBIb3BlZnVsbHksIHRoZSBzeXNmcyBpbnN0ZXJmYWNlIGlzIGltbXVuZSB0byB0aGF0IGd1bmsuIE9uY2UgWAotCSAqIGhhcyBiZWVuIGZpeGVkIChhbmQgdGhlIGZpeCBzcHJlYWQgZW5vdWdoKSwgd2UgY2FuIHJlLWVuYWJsZSB0aGUKLQkgKiAyIGxpbmVzIGJlbG93IGFuZCBwYXNzIGRvd24gYSBCQVIgdmFsdWUgdG8gdXNlcmxhbmQuIEluIHRoYXQgY2FzZQotCSAqIHdlJ2xsIGFsc28gaGF2ZSB0byByZS1lbmFibGUgdGhlIG1hdGNoaW5nIGNvZGUgaW4KLQkgKiBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KCkuCi0JICoKLQkgKiBCZW5ILgotCSAqLwotI2lmIDAKLQllbHNlIGlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLSNlbmRpZgotCi0JKnN0YXJ0ID0gcnNyYy0+c3RhcnQgLSBvZmZzZXQ7Ci0JKmVuZCA9IHJzcmMtPmVuZCAtIG9mZnNldDsKLX0KLQotc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKQotewotCWlmICghaGF2ZV9vZikKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUobm9kZSkgewotCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkKLQkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKLQkJCQlyZXR1cm4gaG9zZTsKLQkJbm9kZSA9IG5vZGUtPnBhcmVudDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwpAQCAtMTQxMiw3ICs5MTQsNyBAQAogCQlpZiAoYWRkcmVzcyA+PSBob3NlLT5pb19iYXNlX3BoeXMgJiYKIAkJICAgIGFkZHJlc3MgPCAoaG9zZS0+aW9fYmFzZV9waHlzICsgaG9zZS0+cGNpX2lvX3NpemUpKSB7CiAJCQl1bnNpZ25lZCBsb25nIGJhc2UgPQotCQkJCSh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOworCQkJCSh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwogCQkJcmV0dXJuIGJhc2UgKyAoYWRkcmVzcyAtIGhvc2UtPmlvX2Jhc2VfcGh5cyk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBjOTZmYTliLi5hMjBmMTk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTY3LDcgKzY3LDYgQEAKIEVYUE9SVF9TWU1CT0woRE1BX01PREVfUkVBRCk7CiBFWFBPUlRfU1lNQk9MKERNQV9NT0RFX1dSSVRFKTsKIAotRVhQT1JUX1NZTUJPTChkb19zaWduYWwpOwogRVhQT1JUX1NZTUJPTCh0cmFuc2Zlcl90b19oYW5kbGVyKTsKIEVYUE9SVF9TWU1CT0woZG9fSVJRKTsKIEVYUE9SVF9TWU1CT0wobWFjaGluZV9jaGVja19leGNlcHRpb24pOwpAQCAtMTA2LDEwICsxMDUsNiBAQAogRVhQT1JUX1NZTUJPTChwY2lfZHJhbV9vZmZzZXQpOwogRVhQT1JUX1NZTUJPTChwY2lfYWxsb2NfY29uc2lzdGVudCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9mcmVlX2NvbnNpc3RlbnQpOwotRVhQT1JUX1NZTUJPTChwY2lfYnVzX2lvX2Jhc2UpOwotRVhQT1JUX1NZTUJPTChwY2lfYnVzX2lvX2Jhc2VfcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfbWVtX2Jhc2VfcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfdG9faG9zZSk7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiBFWFBPUlRfU1lNQk9MKHN0YXJ0X3RocmVhZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDZlMmYwMzUuLjg0ZjAwMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMTksMjIgKzIxOSwyNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2lmZGVmIENPTkZJR19QUENfTUVSR0UJCS8qIFhYWCBmb3Igbm93ICovCiBpbnQgc2V0X2RhYnIodW5zaWduZWQgbG9uZyBkYWJyKQogeworI2lmZGVmIENPTkZJR19QUENfTUVSR0UJCS8qIFhYWCBmb3Igbm93ICovCiAJaWYgKHBwY19tZC5zZXRfZGFicikKIAkJcmV0dXJuIHBwY19tZC5zZXRfZGFicihkYWJyKTsKKyNlbmRpZgogCisJLyogWFhYIHNob3VsZCB3ZSBoYXZlIGEgQ1BVX0ZUUl9IQVNfREFCUiA/ICovCisjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpIHx8IGRlZmluZWQoQ09ORklHXzZ4eCkKIAltdHNwcihTUFJOX0RBQlIsIGRhYnIpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUEM2NAogREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV91c2FnZSwgY3B1X3VzYWdlX2FycmF5KTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBjdXJyZW50X2RhYnIpOwogI2VuZGlmCiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBjdXJyZW50X2RhYnIpOworCiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldykKIHsKQEAgLTI5OSwxMiArMzAzLDEwIEBACiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLSNpZmRlZiBDT05GSUdfUFBDNjQJLyogZm9yIG5vdyAqLwogCWlmICh1bmxpa2VseShfX2dldF9jcHVfdmFyKGN1cnJlbnRfZGFicikgIT0gbmV3LT50aHJlYWQuZGFicikpIHsKIAkJc2V0X2RhYnIobmV3LT50aHJlYWQuZGFicik7CiAJCV9fZ2V0X2NwdV92YXIoY3VycmVudF9kYWJyKSA9IG5ldy0+dGhyZWFkLmRhYnI7CiAJfQotI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiAJbmV3X3RocmVhZCA9ICZuZXctPnRocmVhZDsKIAlvbGRfdGhyZWFkID0gJmN1cnJlbnQtPnRocmVhZDsKQEAgLTQ3MywxMiArNDc1LDEwIEBACiAKIAlkaXNjYXJkX2xhenlfY3B1X3N0YXRlKCk7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQJLyogZm9yIG5vdyAqLwogCWlmIChjdXJyZW50LT50aHJlYWQuZGFicikgewogCQljdXJyZW50LT50aHJlYWQuZGFiciA9IDA7CiAJCXNldF9kYWJyKDApOwogCX0KLSNlbmRpZgogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IGFmNDJkZGEuLjM3ZmY5OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8YXNtL3BTZXJpZXNfcmVjb25maWcuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ayhLRVJOX0VSUiBmbXQpCkBAIC0xMDA1LDcgKzEwMDYsNyBAQAogCiB2b2lkIF9faW5pdCBlYXJseV9pbml0X2RldnRyZWUodm9pZCAqcGFyYW1zKQogewotCURCRygiIC0+IGVhcmx5X2luaXRfZGV2dHJlZSgpXG4iKTsKKwlEQkcoIiAtPiBlYXJseV9pbml0X2RldnRyZWUoJXApXG4iLCBwYXJhbXMpOwogCiAJLyogU2V0dXAgZmxhdCBkZXZpY2UtdHJlZSBwb2ludGVyICovCiAJaW5pdGlhbF9ib290X3BhcmFtcyA9IHBhcmFtczsKQEAgLTEwNTUsOCArMTA1Niw2IEBACiAJREJHKCIgPC0gZWFybHlfaW5pdF9kZXZ0cmVlKClcbiIpOwogfQogCi0jdW5kZWYgcHJpbnRrCi0KIGludCBvZl9uX2FkZHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlKiBucCkKIHsKIAljb25zdCBpbnQgKmlwOwpAQCAtMTM3NSw4ICsxMzc0LDE3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0ga3JlZl90b19kZXZpY2Vfbm9kZShrcmVmKTsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBub2RlLT5wcm9wZXJ0aWVzOwogCi0JaWYgKCFPRl9JU19EWU5BTUlDKG5vZGUpKQorCS8qIFdlIHNob3VsZCBuZXZlciBiZSByZWxlYXNpbmcgbm9kZXMgdGhhdCBoYXZlbid0IGJlZW4gZGV0YWNoZWQuICovCisJaWYgKCFvZl9ub2RlX2NoZWNrX2ZsYWcobm9kZSwgT0ZfREVUQUNIRUQpKSB7CisJCXByaW50aygiV0FSTklORzogQmFkIG9mX25vZGVfcHV0KCkgb24gJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCWR1bXBfc3RhY2soKTsKKwkJa3JlZl9pbml0KCZub2RlLT5rcmVmKTsKIAkJcmV0dXJuOworCX0KKworCWlmICghb2Zfbm9kZV9jaGVja19mbGFnKG5vZGUsIE9GX0RZTkFNSUMpKQorCQlyZXR1cm47CisKIAl3aGlsZSAocHJvcCkgewogCQlzdHJ1Y3QgcHJvcGVydHkgKm5leHQgPSBwcm9wLT5uZXh0OwogCQlrZnJlZShwcm9wLT5uYW1lKTsKQEAgLTE0MzIsNiArMTQ0MCw4IEBACiAJd3JpdGVfbG9jaygmZGV2dHJlZV9sb2NrKTsKIAogCXBhcmVudCA9IG5wLT5wYXJlbnQ7CisJaWYgKCFwYXJlbnQpCisJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmIChhbGxub2RlcyA9PSBucCkKIAkJYWxsbm9kZXMgPSBucC0+YWxsbmV4dDsKQEAgLTE0NTUsNiArMTQ2NSw5IEBACiAJCXByZXZzaWItPnNpYmxpbmcgPSBucC0+c2libGluZzsKIAl9CiAKKwlvZl9ub2RlX3NldF9mbGFnKG5wLCBPRl9ERVRBQ0hFRCk7CisKK291dF91bmxvY2s6CiAJd3JpdGVfdW5sb2NrKCZkZXZ0cmVlX2xvY2spOwogfQogCkBAIC0xNzE2LDIyICsxNzI5LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2dldF9jcHVfbm9kZSk7CiAKLSNpZmRlZiBERUJVRworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiBkZWZpbmVkKERFQlVHKQogc3RhdGljIHN0cnVjdCBkZWJ1Z2ZzX2Jsb2Jfd3JhcHBlciBmbGF0X2R0X2Jsb2I7CiAKIHN0YXRpYyBpbnQgX19pbml0IGV4cG9ydF9mbGF0X2RldmljZV90cmVlKHZvaWQpCiB7CiAJc3RydWN0IGRlbnRyeSAqZDsKIAotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInBvd2VycGMiLCBOVUxMKTsKLQlpZiAoIWQpCi0JCXJldHVybiAxOwotCiAJZmxhdF9kdF9ibG9iLmRhdGEgPSBpbml0aWFsX2Jvb3RfcGFyYW1zOwogCWZsYXRfZHRfYmxvYi5zaXplID0gaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplOwogCiAJZCA9IGRlYnVnZnNfY3JlYXRlX2Jsb2IoImZsYXQtZGV2aWNlLXRyZWUiLCBTX0lGUkVHIHwgU19JUlVTUiwKLQkJCQlkLCAmZmxhdF9kdF9ibG9iKTsKKwkJCQlwb3dlcnBjX2RlYnVnZnNfcm9vdCwgJmZsYXRfZHRfYmxvYik7CiAJaWYgKCFkKQogCQlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggZDYwNDdjNC4uYTFkNTgyZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC02MzUsNiArNjM1LDcgQEAKIC8qIGlibSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkgcHJvcGVydHkgc3VwcG9ydGVkICovCiAjZGVmaW5lIE9WNV9EUkNPTkZfTUVNT1JZCTB4MjAKICNkZWZpbmUgT1Y1X0xBUkdFX1BBR0VTCQkweDEwCS8qIGxhcmdlIHBhZ2VzIHN1cHBvcnRlZCAqLworI2RlZmluZSBPVjVfRE9OQVRFX0RFRElDQVRFX0NQVSAweDAyCS8qIGRvbmF0ZSBkZWRpY2F0ZWQgQ1BVIHN1cHBvcnQgKi8KIC8qIFBDSWUvTVNJIHN1cHBvcnQuICBXaXRob3V0IE1TSSBmdWxsIFBDSWUgaXMgbm90IHN1cHBvcnRlZCAqLwogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAjZGVmaW5lIE9WNV9NU0kJCQkweDAxCS8qIFBDSWUvTVNJIHN1cHBvcnQgKi8KQEAgLTY4NSw3ICs2ODYsOCBAQAogCS8qIG9wdGlvbiB2ZWN0b3IgNTogUEFQUi9PRiBvcHRpb25zICovCiAJMyAtIDIsCQkJCS8qIGxlbmd0aCAqLwogCTAsCQkJCS8qIGRvbid0IGlnbm9yZSwgZG9uJ3QgaGFsdCAqLwotCU9WNV9MUEFSIHwgT1Y1X1NQTFBBUiB8IE9WNV9MQVJHRV9QQUdFUyB8IE9WNV9EUkNPTkZfTUVNT1JZIHwgT1Y1X01TSSwKKwlPVjVfTFBBUiB8IE9WNV9TUExQQVIgfCBPVjVfTEFSR0VfUEFHRVMgfCBPVjVfRFJDT05GX01FTU9SWSB8CisJT1Y1X0RPTkFURV9ERURJQ0FURV9DUFUgfCBPVjVfTVNJLAogfTsKIAogLyogT2xkIG1ldGhvZCAtIEVMRiBoZWFkZXIgd2l0aCBQVF9OT1RFIHNlY3Rpb25zICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS1jb21tb24uaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk3YWU3Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiAgICBDb3B5cmlnaHQgKGMpIDIwMDIgU3RlcGhlbiBSb3Rod2VsbCwgSUJNIENvcHJvcmF0aW9uCi0gKiAgICBFeHRyYWN0ZWQgZnJvbSBwdHJhY2UuYyBhbmQgcHRyYWNlMzIuYwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIFJFQURNRS5sZWdhbCBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKLSAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX1BQQzY0X1BUUkFDRV9DT01NT05fSAotI2RlZmluZSBfUFBDNjRfUFRSQUNFX0NPTU1PTl9ICi0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLS8qCi0gKiBTZXQgb2YgbXNyIGJpdHMgdGhhdCBnZGIgY2FuIGNoYW5nZSBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzLgotICovCi0jZGVmaW5lIE1TUl9ERUJVR0NIQU5HRQkoTVNSX0ZFMCB8IE1TUl9TRSB8IE1TUl9CRSB8IE1TUl9GRTEpCi0KLS8qCi0gKiBHZXQgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHTk8gaW4gdGFzayBUQVNLLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubykKLXsKLQl1bnNpZ25lZCBsb25nIHRtcCA9IDA7Ci0KLQkvKgotCSAqIFB1dCB0aGUgY29ycmVjdCBGUCBiaXRzIGluLCB0aGV5IG1pZ2h0IGJlIHdyb25nIGFzIGEgcmVzdWx0Ci0JICogb2Ygb3VyIGxhenkgRlAgcmVzdG9yZS4KLQkgKi8KLQlpZiAocmVnbm8gPT0gUFRfTVNSKSB7Ci0JCXRtcCA9ICgodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5yZWdzKVtQVF9NU1JdOwotCQl0bXAgfD0gdGFzay0+dGhyZWFkLmZwZXhjX21vZGU7Ci0JfSBlbHNlIGlmIChyZWdubyA8IChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkgewotCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dOwotCX0KLQotCXJldHVybiB0bXA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBjb250ZW50cyBvZiByZWdpc3RlciBSRUdOTyBpbiB0YXNrIFRBU0suCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB1dF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8sCi0JCQkgIHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlpZiAocmVnbm8gPCBQVF9TT0ZURSkgewotCQlpZiAocmVnbm8gPT0gUFRfTVNSKQotCQkJZGF0YSA9IChkYXRhICYgTVNSX0RFQlVHQ0hBTkdFKQotCQkJCXwgKHRhc2stPnRocmVhZC5yZWdzLT5tc3IgJiB+TVNSX0RFQlVHQ0hBTkdFKTsKLQkJKCh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnJlZ3MpW3JlZ25vXSA9IGRhdGE7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKLQlpZiAocmVncyAhPSBOVUxMKQotCQlyZWdzLT5tc3IgfD0gTVNSX1NFOwotCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7Ci0JaWYgKHJlZ3MgIT0gTlVMTCkKLQkJcmVncy0+bXNyICY9IH5NU1JfU0U7Ci0JY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKLX0KLQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0vKgotICogR2V0L3NldCBhbGwgdGhlIGFsdGl2ZWMgcmVnaXN0ZXJzIHZyMC4udnIzMSwgdnNjciwgdnJzYXZlLCBpbiBvbmUgZ28uCi0gKiBUaGUgdHJhbnNmZXIgdG90YWxzIDM0IHF1YWR3b3JkLiAgUXVhZHdvcmRzIDAtMzEgY29udGFpbiB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHJlZ2lzdGVycy4gIFF1YWR3b3JkIDMyIGNvbnRhaW5zIHRoZSB2c2NyIGFzIHRoZQotICogbGFzdCB3b3JkIChvZmZzZXQgMTIpIHdpdGhpbiB0aGF0IHF1YWR3b3JkLiAgUXVhZHdvcmQgMzMgY29udGFpbnMgdGhlCi0gKiB2cnNhdmUgYXMgdGhlIGZpcnN0IHdvcmQgKG9mZnNldCAwKSB3aXRoaW4gdGhlIHF1YWR3b3JkLgotICoKLSAqIFRoaXMgZGVmaW5pdGlvbiBvZiB0aGUgVk1YIHN0YXRlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBQUEMzMgotICogcHRyYWNlIGludGVyZmFjZS4gIFRoaXMgYWxsb3dzIHNpZ25hbCBoYW5kbGluZyBhbmQgcHRyYWNlIHRvIHVzZSB0aGUKLSAqIHNhbWUgc3RydWN0dXJlcy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGJpLWFyY2gKLSAqIChjb21iaW5lZCAoMzItIGFuZCA2NC1iaXQpIGdkYi4KLSAqLwotCi0vKgotICogR2V0IGNvbnRlbnRzIG9mIEFsdGlWZWMgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldF92cnJlZ3ModW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEsCi0JCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ3NpemU7Ci0KLQkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCXJlZ3NpemUgPSAzMiAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgdGFzay0+dGhyZWFkLnZyLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZTQ1IgKi8KLQlyZWdzaXplID0gMSAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnRhc2stPnRocmVhZC52c2NyLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChwdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogV3JpdGUgY29udGVudHMgb2YgQWx0aVZlYyByZWdpc3RlciBzdGF0ZSBpbnRvIHRhc2sgVEFTSy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgc2V0X3ZycmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgX191c2VyICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKLQotCS8qIGNvcHkgQWx0aVZlYyByZWdpc3RlcnMgVlJbMF0gLi4gVlJbMzFdICovCi0JcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKHRhc2stPnRocmVhZC52ciwgZGF0YSwgcmVnc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCi0JLyogY29weSBWU0NSICovCi0JcmVnc2l6ZSA9IDEgKiBzaXplb2YodmVjdG9yMTI4KTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRhc2stPnRocmVhZC52c2NyLCBkYXRhLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChnZXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9zZXRfZGVidWdyZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgREFCUiBhbmQgbm8gSUFCUlMgYXQgdGhlIG1vbWVudCAqLwotCWlmIChhZGRyID4gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBUaGUgYm90dG9tIDMgYml0cyBhcmUgZmxhZ3MgKi8KLQlpZiAoKGRhdGEgJiB+MHg3VUwpID49IFRBU0tfU0laRSkKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBFbnN1cmUgdHJhbnNsYXRpb24gaXMgb24gKi8KLQlpZiAoZGF0YSAmJiAhKGRhdGEgJiBEQUJSX1RSQU5TTEFUSU9OKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQl0YXNrLT50aHJlYWQuZGFiciA9IGRhdGE7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBfUFBDNjRfUFRSQUNFX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwppbmRleCBiZjc2NTYyLi44YTE3N2JkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTM1LDExICszNSwxMSBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0jaW5jbHVkZSAicHRyYWNlLWNvbW1vbi5oIgotI2VuZGlmCisvKgorICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgorICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICovCiAKLSNpZmRlZiBDT05GSUdfUFBDMzIKIC8qCiAgKiBTZXQgb2YgbXNyIGJpdHMgdGhhdCBnZGIgY2FuIGNoYW5nZSBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzLgogICovCkBAIC00OCw2NSArNDgsMTE3IEBACiAjZWxzZQogI2RlZmluZSBNU1JfREVCVUdDSEFOR0UJKE1TUl9TRSB8IE1TUl9CRSkKICNlbmRpZgotI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogCiAvKgotICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgotICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICogTWF4IHJlZ2lzdGVyIHdyaXRlYWJsZSB2aWEgcHV0X3JlZwogICovCi0KICNpZmRlZiBDT05GSUdfUFBDMzIKKyNkZWZpbmUgUFRfTUFYX1BVVF9SRUcJUFRfTVEKKyNlbHNlCisjZGVmaW5lIFBUX01BWF9QVVRfUkVHCVBUX0NDUgorI2VuZGlmCisKIC8qCiAgKiBHZXQgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHTk8gaW4gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubykKK3Vuc2lnbmVkIGxvbmcgcHRyYWNlX2dldF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8pCiB7Ci0JaWYgKHJlZ25vIDwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKQotCSAgICAmJiB0YXNrLT50aHJlYWQucmVncyAhPSBOVUxMKQorCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKKworCWlmICh0YXNrLT50aHJlYWQucmVncyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChyZWdubyA9PSBQVF9NU1IpIHsKKwkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnJlZ3MpW1BUX01TUl07CisJCXJldHVybiB0bXAgfCB0YXNrLT50aHJlYWQuZnBleGNfbW9kZTsKKwl9CisKKwlpZiAocmVnbm8gPCAoc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCiAJCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dOwotCXJldHVybiAoMCk7CisKKwlyZXR1cm4gLUVJTzsKIH0KIAogLyoKICAqIFdyaXRlIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIFJFR05PIGluIHRhc2sgVEFTSy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHV0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubywKLQkJCSAgdW5zaWduZWQgbG9uZyBkYXRhKQoraW50IHB0cmFjZV9wdXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vLCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaWYgKHJlZ25vIDw9IFBUX01RICYmIHRhc2stPnRocmVhZC5yZWdzICE9IE5VTEwpIHsKKwlpZiAodGFzay0+dGhyZWFkLnJlZ3MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAocmVnbm8gPD0gUFRfTUFYX1BVVF9SRUcgfHwgcmVnbm8gPT0gUFRfVFJBUCkgewogCQlpZiAocmVnbm8gPT0gUFRfTVNSKQogCQkJZGF0YSA9IChkYXRhICYgTVNSX0RFQlVHQ0hBTkdFKQogCQkJCXwgKHRhc2stPnRocmVhZC5yZWdzLT5tc3IgJiB+TVNSX0RFQlVHQ0hBTkdFKTsKKwkJLyogV2UgcHJldmVudCBtdWNraW5nIGFyb3VuZCB3aXRoIHRoZSByZXNlcnZlZCBhcmVhIG9mIHRyYXAKKwkJICogd2hpY2ggYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsCisJCSAqLworCQlpZiAocmVnbm8gPT0gUFRfVFJBUCkKKwkJCWRhdGEgJj0gMHhmZmYwOwogCQkoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dID0gZGF0YTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAtRUlPOwogfQogCisKK3N0YXRpYyBpbnQgZ2V0X2ZwcmVncyh2b2lkIF9fdXNlciAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgICAgICBpbnQgaGFzX2Zwc2NyKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IGhhc19mcHNjciA/IDMzIDogMzI7CisKKwlpZiAoY29weV90b191c2VyKGRhdGEsIHRhc2stPnRocmVhZC5mcHIsIGNvdW50ICogc2l6ZW9mKGRvdWJsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfZnByZWdzKHZvaWQgX191c2VyICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICAgIGludCBoYXNfZnBzY3IpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gaGFzX2Zwc2NyID8gMzMgOiAzMjsKKworCWlmIChjb3B5X2Zyb21fdXNlcih0YXNrLT50aHJlYWQuZnByLCBkYXRhLCBjb3VudCAqIHNpemVvZihkb3VibGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKwogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAvKgorICogR2V0L3NldCBhbGwgdGhlIGFsdGl2ZWMgcmVnaXN0ZXJzIHZyMC4udnIzMSwgdnNjciwgdnJzYXZlLCBpbiBvbmUgZ28uCisgKiBUaGUgdHJhbnNmZXIgdG90YWxzIDM0IHF1YWR3b3JkLiAgUXVhZHdvcmRzIDAtMzEgY29udGFpbiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHJlZ2lzdGVycy4gIFF1YWR3b3JkIDMyIGNvbnRhaW5zIHRoZSB2c2NyIGFzIHRoZQorICogbGFzdCB3b3JkIChvZmZzZXQgMTIpIHdpdGhpbiB0aGF0IHF1YWR3b3JkLiAgUXVhZHdvcmQgMzMgY29udGFpbnMgdGhlCisgKiB2cnNhdmUgYXMgdGhlIGZpcnN0IHdvcmQgKG9mZnNldCAwKSB3aXRoaW4gdGhlIHF1YWR3b3JkLgorICoKKyAqIFRoaXMgZGVmaW5pdGlvbiBvZiB0aGUgVk1YIHN0YXRlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBQUEMzMgorICogcHRyYWNlIGludGVyZmFjZS4gIFRoaXMgYWxsb3dzIHNpZ25hbCBoYW5kbGluZyBhbmQgcHRyYWNlIHRvIHVzZSB0aGUKKyAqIHNhbWUgc3RydWN0dXJlcy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGJpLWFyY2gKKyAqIChjb21iaW5lZCAoMzItIGFuZCA2NC1iaXQpIGdkYi4KKyAqLworCisvKgogICogR2V0IGNvbnRlbnRzIG9mIEFsdGlWZWMgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldF92cnJlZ3ModW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyBpbnQgZ2V0X3ZycmVncyh1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCWludCBpLCBqOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhLCAxMzMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwl1bnNpZ25lZCBsb25nIHJlZ3NpemU7CiAKIAkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrLCBkYXRhKyspCi0JCQlpZiAoX19wdXRfdXNlcih0YXNrLT50aHJlYWQudnJbaV0udVtqXSwgZGF0YSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCB0YXNrLT50aHJlYWQudnIsIHJlZ3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkYXRhICs9IChyZWdzaXplIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAogCS8qIGNvcHkgVlNDUiAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGRhdGErKykKLQkJaWYgKF9fcHV0X3VzZXIodGFzay0+dGhyZWFkLnZzY3IudVtpXSwgZGF0YSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwlyZWdzaXplID0gMSAqIHNpemVvZih2ZWN0b3IxMjgpOworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnRhc2stPnRocmVhZC52c2NyLCByZWdzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKLSAgICAgICAgLyogY29weSBWUlNBVkUgKi8KLQlpZiAoX19wdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCBkYXRhKSkKKwkvKiBjb3B5IFZSU0FWRSAqLworCWlmIChwdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiAwOwpAQCAtMTE1LDMxICsxNjcsMjkgQEAKIC8qCiAgKiBXcml0ZSBjb250ZW50cyBvZiBBbHRpVmVjIHJlZ2lzdGVyIHN0YXRlIGludG8gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBzZXRfdnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEpCitzdGF0aWMgaW50IHNldF92cnJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSkKIHsKLQlpbnQgaSwgajsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhLCAxMzMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwl1bnNpZ25lZCBsb25nIHJlZ3NpemU7CiAKIAkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrLCBkYXRhKyspCi0JCQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnJbaV0udVtqXSwgZGF0YSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKHRhc2stPnRocmVhZC52ciwgZGF0YSwgcmVnc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCiAJLyogY29weSBWU0NSICovCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgZGF0YSsrKQotCQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnNjci51W2ldLCBkYXRhKSkKLQkJCXJldHVybiAtRUZBVUxUOworCXJlZ3NpemUgPSAxICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0YXNrLT50aHJlYWQudnNjciwgZGF0YSwgcmVnc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCiAJLyogY29weSBWUlNBVkUgKi8KLQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCBkYXRhKSkKKwlpZiAoZ2V0X3VzZXIodGFzay0+dGhyZWFkLnZyc2F2ZSwgKHUzMiBfX3VzZXIgKilkYXRhKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKICNpZmRlZiBDT05GSUdfU1BFCiAKQEAgLTE1Niw3ICsyMDYsNyBAQAogLyoKICAqIEdldCBjb250ZW50cyBvZiBTUEUgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfZXZycmVncyh1bnNpZ25lZCBsb25nICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCitzdGF0aWMgaW50IGdldF9ldnJyZWdzKHVuc2lnbmVkIGxvbmcgKmRhdGEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlpbnQgaTsKIApAQCAtMTgyLDcgKzIzMiw3IEBACiAvKgogICogV3JpdGUgY29udGVudHMgb2YgU1BFIHJlZ2lzdGVyIHN0YXRlIGludG8gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBzZXRfZXZycmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmRhdGEpCitzdGF0aWMgaW50IHNldF9ldnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZGF0YSkKIHsKIAlpbnQgaTsKIApAQCAtMjA1LDggKzI1NSw4IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1NQRSAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCisKK3N0YXRpYyB2b2lkIHNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKIApAQCAtMjIxLDggKzI3MSw3IEBACiAJc2V0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFU1RFUCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorc3RhdGljIHZvaWQgY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7CiAKQEAgLTIzNiw3ICsyODUsMjUgQEAKIAl9CiAJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KKworc3RhdGljIGludCBwdHJhY2Vfc2V0X2RlYnVncmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvKiBXZSBvbmx5IHN1cHBvcnQgb25lIERBQlIgYW5kIG5vIElBQlJTIGF0IHRoZSBtb21lbnQgKi8KKwlpZiAoYWRkciA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlIGJvdHRvbSAzIGJpdHMgYXJlIGZsYWdzICovCisJaWYgKChkYXRhICYgfjB4N1VMKSA+PSBUQVNLX1NJWkUpCisJCXJldHVybiAtRUlPOworCisJLyogRW5zdXJlIHRyYW5zbGF0aW9uIGlzIG9uICovCisJaWYgKGRhdGEgJiYgIShkYXRhICYgREFCUl9UUkFOU0xBVElPTikpCisJCXJldHVybiAtRUlPOworCisJdGFzay0+dGhyZWFkLmRhYnIgPSBkYXRhOworCXJldHVybiAwOworfQogCiAvKgogICogQ2FsbGVkIGJ5IGtlcm5lbC9wdHJhY2UuYyB3aGVuIGRldGFjaGluZy4uCkBAIC0yNDksNiArMzE2LDYyIEBACiAJY2xlYXJfc2luZ2xlX3N0ZXAoY2hpbGQpOwogfQogCisvKgorICogSGVyZSBhcmUgdGhlIG9sZCAibGVnYWN5IiBwb3dlcnBjIHNwZWNpZmljIGdldHJlZ3Mvc2V0cmVncyBwdHJhY2UgY2FsbHMsCisgKiB3ZSBtYXJrIHRoZW0gYXMgb2Jzb2xldGUgbm93LCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uCisgKi8KK3N0YXRpYyBsb25nIGFyY2hfcHRyYWNlX29sZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwKKwkJCSAgICBsb25nIGRhdGEpCit7CisJaW50IHJldCA9IC1FUEVSTTsKKworCXN3aXRjaChyZXF1ZXN0KSB7CisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBwdXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBnZXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCisJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CisJCXJldCA9IGdldF9mcHJlZ3MoKHZvaWQgX191c2VyICopYWRkciwgY2hpbGQsIDApOworCQlicmVhazsKKwl9CisKKwljYXNlIFBQQ19QVFJBQ0VfU0VURlBSRUdTOiB7IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKKwkJcmV0ID0gc2V0X2ZwcmVncygodm9pZCBfX3VzZXIgKilhZGRyLCBjaGlsZCwgMCk7CisJCWJyZWFrOworCX0KKworCX0KKwlyZXR1cm4gcmV0OworfQorCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7CiAJaW50IHJldCA9IC1FUEVSTTsKQEAgLTI1NiwxNyArMzc5LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0yODQsMTEgKzM5OSw5IEBACiAjZW5kaWYKIAkJCWJyZWFrOwogCi0jaWZkZWYgQ09ORklHX1BQQzMyCiAJCUNIRUNLX0ZVTExfUkVHUyhjaGlsZC0+dGhyZWFkLnJlZ3MpOwotI2VuZGlmCiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIChpbnQpIGluZGV4KTsKKwkJCXRtcCA9IHB0cmFjZV9nZXRfcmVnKGNoaWxkLCAoaW50KSBpbmRleCk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpW2luZGV4IC0gUFRfRlBSMF07CkBAIC0zMDAsMTEgKzQxMyw3IEBACiAJLyogSWYgSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCQkJPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KQEAgLTMyMywxMyArNDMyLDkgQEAKICNlbmRpZgogCQkJYnJlYWs7CiAKLSNpZmRlZiBDT05GSUdfUFBDMzIKIAkJQ0hFQ0tfRlVMTF9SRUdTKGNoaWxkLT50aHJlYWQucmVncyk7Ci0jZW5kaWYKLQkJaWYgKGluZGV4ID09IFBUX09SSUdfUjMpCi0JCQlicmVhazsKIAkJaWYgKGluZGV4IDwgUFRfRlBSMCkgewotCQkJcmV0ID0gcHV0X3JlZyhjaGlsZCwgaW5kZXgsIGRhdGEpOworCQkJcmV0ID0gcHRyYWNlX3B1dF9yZWcoY2hpbGQsIGluZGV4LCBkYXRhKTsKIAkJfSBlbHNlIHsKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CiAJCQkoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcilbaW5kZXggLSBQVF9GUFIwXSA9IGRhdGE7CkBAIC0zODQsNyArNDg5LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0jaWZkZWYgQ09ORklHX1BQQzY0CiAJY2FzZSBQVFJBQ0VfR0VUX0RFQlVHUkVHOiB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgREFCUiBhbmQgbm8gSUFCUlMgYXQgdGhlIG1vbWVudCAqLwpAQCAtMzk4LDczICs1MDIsNjEgQEAKIAljYXNlIFBUUkFDRV9TRVRfREVCVUdSRUc6CiAJCXJldCA9IHB0cmFjZV9zZXRfZGVidWdyZWcoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLSNlbmRpZgogCiAJY2FzZSBQVFJBQ0VfREVUQUNIOgogCQlyZXQgPSBwdHJhY2VfZGV0YWNoKGNoaWxkLCBkYXRhKTsKIAkJYnJlYWs7CiAKLQljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogeyAvKiBHZXQgR1BScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKLQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFkZHI7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwljYXNlIFBUUkFDRV9HRVRSRUdTNjQ6CisjZW5kaWYKKwljYXNlIFBUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBhbGwgcHRfcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KKwkJaW50IHVpOworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopZGF0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IDA7CisJCWZvciAodWkgPSAwOyB1aSA8IFBUX1JFR1NfQ09VTlQ7IHVpICsrKSB7CisJCQlyZXQgfD0gX19wdXRfdXNlcihwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgdWkpLAorCQkJCQkgICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGxvbmcpOwogCQl9CiAJCWJyZWFrOwogCX0KIAotCWNhc2UgUFBDX1BUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwljYXNlIFBUUkFDRV9TRVRSRUdTNjQ6CisjZW5kaWYKKwljYXNlIFBUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlpbnQgdWk7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWRhdGEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0ID0gX19nZXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKIAkJCWlmIChyZXQpCiAJCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOworCQkJcHRyYWNlX3B1dF9yZWcoY2hpbGQsIHVpLCB0bXApOworCQkJZGF0YSArPSBzaXplb2YobG9uZyk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQorCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZSAoRlBSMC4uLjMxICsgRlBTQ1IpICovCiAJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQorCQlyZXQgPSBnZXRfZnByZWdzKCh2b2lkIF9fdXNlciAqKWRhdGEsIGNoaWxkLCAxKTsKIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQUENfUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBTZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZSAoRlBSMC4uLjMxICsgRlBTQ1IpICovCiAJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IGdldF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQorCQlyZXQgPSBzZXRfZnByZWdzKCh2b2lkIF9fdXNlciAqKWRhdGEsIGNoaWxkLCAxKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00OTksMTEgKzU5MSwxOCBAQAogCQlicmVhazsKICNlbmRpZgogCisJLyogT2xkIHJldmVyc2UgYXJncyBwdHJhY2UgY2FsbHNzICovCisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCWNhc2UgUFBDX1BUUkFDRV9HRVRGUFJFR1M6IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VURlBSRUdTOiAvKiBHZXQgRlBScyAwIC0gMzEuICovCisJCXJldCA9IGFyY2hfcHRyYWNlX29sZChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAl9Ci0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMKaW5kZXggOWI5YTIzMC4uOWU2YmFlYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYwpAQCAtMzMsMTMgKzMzLDU1IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlICJwdHJhY2UtY29tbW9uLmgiCi0KIC8qCiAgKiBkb2VzIG5vdCB5ZXQgY2F0Y2ggc2lnbmFscyBzZW50IHdoZW4gdGhlIGNoaWxkIGRpZXMuCiAgKiBpbiBleGl0LmMgb3IgaW4gc2lnbmFsLmMuCiAgKi8KIAorLyoKKyAqIEhlcmUgYXJlIHRoZSBvbGQgImxlZ2FjeSIgcG93ZXJwYyBzcGVjaWZpYyBnZXRyZWdzL3NldHJlZ3MgcHRyYWNlIGNhbGxzLAorICogd2UgbWFyayB0aGVtIGFzIG9ic29sZXRlIG5vdywgdGhleSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbgorICovCitzdGF0aWMgbG9uZyBjb21wYXRfcHRyYWNlX29sZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsCisJCQkgICAgICBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlpbnQgcmV0ID0gLUVQRVJNOworCisJc3dpdGNoKHJlcXVlc3QpIHsKKwljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogeyAvKiBHZXQgR1BScyAwIC0gMzEuICovCisJCWludCBpOworCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKKwkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBwdXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGludCBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopYWRkcjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlyZWcrKzsKKwkJCXRtcCsrOworCQl9CisJCWJyZWFrOworCX0KKworCX0KKwlyZXR1cm4gcmV0OworfQorCiBsb25nIGNvbXBhdF9zeXNfcHRyYWNlKGludCByZXF1ZXN0LCBpbnQgcGlkLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhdGEpCiB7CkBAIC0xMjMsNyArMTY1LDcgQEAKIAkJCWJyZWFrOwogCiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIGluZGV4KTsKKwkJCXRtcCA9IHB0cmFjZV9nZXRfcmVnKGNoaWxkLCBpbmRleCk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJLyoKQEAgLTE2Miw3ICsyMDQsOSBAQAogCQllbHNlCiAJCQlwYXJ0ID0gMDsgIC8qIHdhbnQgdGhlIDFzdCBoYWxmIG9mIHRoZSByZWdpc3RlciAobGVmdC1tb3N0KS4gKi8KIAotCQkvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgLSBjaGVjayB0byBzZWUgaWYgYWRkcmVzcyBpcyBvbiB0aGUgd3JvbmcgYm91bmRhcnkgb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHVzZXIgYXJlYSAqLworCQkvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgLSBjaGVjayB0byBzZWUgaWYgYWRkcmVzcyBpcyBvbiB0aGUgd3JvbmcgYm91bmRhcnkKKwkJICogb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHVzZXIgYXJlYQorCQkgKi8KIAkJaWYgKChhZGRyICYgMykgfHwgbnVtUmVnID4gUFRfRlBTQ1IpCiAJCQlicmVhazsKIApAQCAtMTcwLDcgKzIxNCw3IEBACiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJdG1wID0gKCh1bnNpZ25lZCBsb25nIGludCAqKWNoaWxkLT50aHJlYWQuZnByKVtudW1SZWcgLSBQVF9GUFIwXTsKIAkJfSBlbHNlIHsgLyogcmVnaXN0ZXIgd2l0aGluIFBUX1JFR1Mgc3RydWN0ICovCi0JCQl0bXAgPSBnZXRfcmVnKGNoaWxkLCBudW1SZWcpOworCQkJdG1wID0gcHRyYWNlX2dldF9yZWcoY2hpbGQsIG51bVJlZyk7CiAJCX0gCiAJCXJlZzMyYml0cyA9ICgodTMyKikmdG1wKVtwYXJ0XTsKIAkJcmV0ID0gcHV0X3VzZXIocmVnMzJiaXRzLCAodTMyIF9fdXNlciAqKWRhdGEpOwpAQCAtMjI2LDEwICsyNzAsOCBAQAogCQlpZiAoKGFkZHIgJiAzKSB8fCAoaW5kZXggPiBQVF9GUFNDUjMyKSkKIAkJCWJyZWFrOwogCi0JCWlmIChpbmRleCA9PSBQVF9PUklHX1IzKQotCQkJYnJlYWs7CiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXJldCA9IHB1dF9yZWcoY2hpbGQsIGluZGV4LCBkYXRhKTsKKwkJCXJldCA9IHB0cmFjZV9wdXRfcmVnKGNoaWxkLCBpbmRleCwgZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJLyoKQEAgLTI1OCw3MCArMzAwLDI1IEBACiAJCS8qIERldGVybWluZSB3aGljaCByZWdpc3RlciB0aGUgdXNlciB3YW50cyAqLwogCQlpbmRleCA9ICh1NjQpYWRkciA+PiAyOwogCQludW1SZWcgPSBpbmRleCAvIDI7CisKIAkJLyoKIAkJICogVmFsaWRhdGUgdGhlIGlucHV0IC0gY2hlY2sgdG8gc2VlIGlmIGFkZHJlc3MgaXMgb24gdGhlCiAJCSAqIHdyb25nIGJvdW5kYXJ5IG9yIGJleW9uZCB0aGUgZW5kIG9mIHRoZSB1c2VyIGFyZWEKIAkJICovCiAJCWlmICgoYWRkciAmIDMpIHx8IChudW1SZWcgPiBQVF9GUFNDUikpCiAJCQlicmVhazsKLQkJLyogSW5zdXJlIGl0IGlzIGEgcmVnaXN0ZXIgd2UgbGV0IHRoZW0gY2hhbmdlICovCi0JCWlmICgobnVtUmVnID09IFBUX09SSUdfUjMpCi0JCQkJfHwgKChudW1SZWcgPiBQVF9DQ1IpICYmIChudW1SZWcgPCBQVF9GUFIwKSkpCi0JCQlicmVhazsKLQkJaWYgKG51bVJlZyA+PSBQVF9GUFIwKSB7CisJCWlmIChudW1SZWcgPCBQVF9GUFIwKSB7CisJCQl1bnNpZ25lZCBsb25nIGZyZWcgPSBwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgbnVtUmVnKTsKKwkJCWlmIChpbmRleCAlIDIpCisJCQkJZnJlZyA9IChmcmVnICYgfjB4ZmZmZmZmZmZ1bCkgfCAoZGF0YSAmIDB4ZmZmZmZmZmZ1bCk7CisJCQllbHNlCisJCQkJZnJlZyA9IChmcmVnICYgMHhmZmZmZmZmZnVsKSB8IChkYXRhIDw8IDMyKTsKKwkJCXJldCA9IHB0cmFjZV9wdXRfcmVnKGNoaWxkLCBudW1SZWcsIGZyZWcpOworCQl9IGVsc2UgewogCQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKKwkJCSgodW5zaWduZWQgaW50ICopY2hpbGQtPnRocmVhZC5yZWdzKVtpbmRleF0gPSBkYXRhOworCQkJcmV0ID0gMDsKIAkJfQotCQlpZiAobnVtUmVnID09IFBUX01TUikKLQkJCWRhdGEgPSAoZGF0YSAmIE1TUl9ERUJVR0NIQU5HRSkKLQkJCQl8IChjaGlsZC0+dGhyZWFkLnJlZ3MtPm1zciAmIH5NU1JfREVCVUdDSEFOR0UpOwotCQkoKHUzMiopY2hpbGQtPnRocmVhZC5yZWdzKVtpbmRleF0gPSBkYXRhOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TWVNDQUxMOiAvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbCAqLwotCWNhc2UgUFRSQUNFX0NPTlQ6IHsgLyogcmVzdGFydCBhZnRlciBzaWduYWwuICovCi0JCXJldCA9IC1FSU87Ci0JCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQotCQkJYnJlYWs7Ci0JCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9TWVNDQUxMKQotCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQllbHNlCi0JCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0JCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCi0JCWNsZWFyX3NpbmdsZV9zdGVwKGNoaWxkKTsKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBtYWtlIHRoZSBjaGlsZCBleGl0LiAgQmVzdCBJIGNhbiBkbyBpcyBzZW5kIGl0IGEgc2lna2lsbC4KLQkgKiBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvCi0JICogZXhpdC4KLQkgKi8KLQljYXNlIFBUUkFDRV9LSUxMOiB7Ci0JCXJldCA9IDA7Ci0JCWlmIChjaGlsZC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkJLyogYWxyZWFkeSBkZWFkICovCi0JCQlicmVhazsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7Ci0JCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCi0JCWNsZWFyX3NpbmdsZV9zdGVwKGNoaWxkKTsKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU0lOR0xFU1RFUDogeyAgLyogc2V0IHRoZSB0cmFwIGZsYWcuICovCi0JCXJldCA9IC1FSU87Ci0JCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQotCQkJYnJlYWs7Ci0JCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQlzZXRfc2luZ2xlX3N0ZXAoY2hpbGQpOwotCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKLQkJLyogZ2l2ZSBpdCBhIGNoYW5jZSB0byBydW4uICovCi0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCXJldCA9IDA7CiAJCWJyZWFrOwogCX0KIApAQCAtMzM0LDk1ICszMzEsNjcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQVFJBQ0VfU0VUX0RFQlVHUkVHOgotCQlyZXQgPSBwdHJhY2Vfc2V0X2RlYnVncmVnKGNoaWxkLCBhZGRyLCBkYXRhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBUUkFDRV9ERVRBQ0g6Ci0JCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgUFBDX1BUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgR1BScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKLQkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOwotCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCQlyZXQgPSBnZXRfdXNlcigqcmVnLCB0bXApOwotCQkJaWYgKHJldCkKLQkJCQlicmVhazsKLQkJCXJlZysrOwotCQkJdG1wKys7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7Ci0KLQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gcHV0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUFBDX1BUUkFDRV9TRVRGUFJFR1M6IHsgLyogR2V0IEZQUnMgMCAtIDMxLiAqLwotCQlpbnQgaTsKLQkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQuZnByKVswXTsKLQkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOwotCi0JCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IGdldF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQotCQlicmVhazsKLQl9Ci0KIAljYXNlIFBUUkFDRV9HRVRFVkVOVE1TRzoKIAkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnB0cmFjZV9tZXNzYWdlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBkYXRhKTsKIAkJYnJlYWs7CiAKLSNpZmRlZiBDT05GSUdfQUxUSVZFQworCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IGFsbCBwdF9yZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlpbnQgdWk7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgIFBUX1JFR1NfQ09VTlQgKiBzaXplb2YoaW50KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0IHw9IF9fcHV0X3VzZXIocHRyYWNlX2dldF9yZWcoY2hpbGQsIHVpKSwKKwkJCQkJICAodW5zaWduZWQgaW50IF9fdXNlciAqKSBkYXRhKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGludCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgYWxsIGdwIHJlZ3MgaW4gdGhlIGNoaWxkLiAqLworCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJaW50IHVpOworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgIFBUX1JFR1NfQ09VTlQgKiBzaXplb2YoaW50KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0ID0gX19nZXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXB0cmFjZV9wdXRfcmVnKGNoaWxkLCB1aSwgdG1wKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGludCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOgorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzoKIAljYXNlIFBUUkFDRV9HRVRWUlJFR1M6Ci0JCS8qIEdldCB0aGUgY2hpbGQgYWx0aXZlYyByZWdpc3RlciBzdGF0ZS4gKi8KLQkJZmx1c2hfYWx0aXZlY190b190aHJlYWQoY2hpbGQpOwotCQlyZXQgPSBnZXRfdnJyZWdzKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEsIGNoaWxkKTsKKwljYXNlIFBUUkFDRV9TRVRWUlJFR1M6CisJY2FzZSBQVFJBQ0VfR0VUUkVHUzY0OgorCWNhc2UgUFRSQUNFX1NFVFJFR1M2NDoKKwljYXNlIFBQQ19QVFJBQ0VfR0VURlBSRUdTOgorCWNhc2UgUFBDX1BUUkFDRV9TRVRGUFJFR1M6CisJY2FzZSBQVFJBQ0VfS0lMTDoKKwljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOgorCWNhc2UgUFRSQUNFX0RFVEFDSDoKKwljYXNlIFBUUkFDRV9TRVRfREVCVUdSRUc6CisJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoKKwljYXNlIFBUUkFDRV9DT05UOgorCQlyZXQgPSBhcmNoX3B0cmFjZShjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCi0JY2FzZSBQVFJBQ0VfU0VUVlJSRUdTOgotCQkvKiBTZXQgdGhlIGNoaWxkIGFsdGl2ZWMgcmVnaXN0ZXIgc3RhdGUuICovCi0JCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKGNoaWxkKTsKLQkJcmV0ID0gc2V0X3ZycmVncyhjaGlsZCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7CisJLyogT2xkIHJldmVyc2UgYXJncyBwdHJhY2UgY2FsbHNzICovCisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlyZXQgPSBjb21wYXRfcHRyYWNlX29sZChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotI2VuZGlmCiAKIAlkZWZhdWx0OgogCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKaW5kZXggZjIyODY4Mi4uYTVkZTYyMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYwpAQCAtMjc4LDEwICsyNzgsOCBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAotCWluZGV4ID0gMDsKIAlmb3IgKG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBOVUxMKTsKIAkgICAgIG5vZGUgIT0gTlVMTDsKIAkgICAgIG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBub2RlKSkgewpAQCAtMjk1LDggKzI5Myw3IEBACiAJCQljb250aW51ZTsKIAkJcnRhc19zZXR1cF9waGIocGhiKTsKIAkJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIG5vZGUsIDApOwotCQlwY2lfc2V0dXBfcGhiX2lvKHBoYiwgaW5kZXggPT0gMCk7Ci0JCWluZGV4Kys7CisJCWlzYV9icmlkZ2VfZmluZF9lYXJseShwaGIpOwogCX0KIAogCW9mX25vZGVfcHV0KHJvb3QpOwpAQCAtMzM1LDcgKzMzMiw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCXJjID0gdW5tYXBfYnVzX3JhbmdlKGIpOworCXJjID0gcGNpYmlvc191bm1hcF9pb19zcGFjZShiKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVubWFwIElPIG9uIGJ1cyAlc1xuIiwKIAkJCV9fRlVOQ1RJT05fXywgYi0+bmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwppbmRleCBlZDA3YTE5Li40OTI0YzQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTQ4Niw2ICs0ODcsMTQgQEAKIAogCXN3aXRjaChiYXNlX3BvcnQpIHsKIAljYXNlIEk4MDQyX0RBVEFfUkVHOgorCQlpZiAoIShucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJwbnBQTlAsMzAzIikpKQorCQkJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicG5wUE5QLGYwMyIpOworCQlpZiAobnApIHsKKwkJCXBhcmVudCA9IG9mX2dldF9wYXJlbnQobnApOworCQkJb2Zfbm9kZV9wdXQobnApOworCQkJbnAgPSBwYXJlbnQ7CisJCQlicmVhazsKKwkJfQogCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICI4MDQyIik7CiAJCWJyZWFrOwogCWNhc2UgRkRDX0JBU0U6IC8qIEZEQzEgKi8KQEAgLTU3MSwzICs1ODAsMTUgQEAKIAogbGF0ZV9pbml0Y2FsbChjaGVja19jYWNoZV9jb2hlcmVuY3kpOwogI2VuZGlmIC8qIENPTkZJR19DSEVDS19DQUNIRV9DT0hFUkVOQ1kgKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RydWN0IGRlbnRyeSAqcG93ZXJwY19kZWJ1Z2ZzX3Jvb3Q7CisKK3N0YXRpYyBpbnQgcG93ZXJwY19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlwb3dlcnBjX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicG93ZXJwYyIsIE5VTEwpOworCisJcmV0dXJuIHBvd2VycGNfZGVidWdmc19yb290ID09IE5VTEw7Cit9CithcmNoX2luaXRjYWxsKHBvd2VycGNfZGVidWdmc19pbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDM1ZjhmNDQuLjdlYzZiYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKQEAgLTI2MiwxMyArMjYyLDExIEBACiAJICogU3lzdGVtcyB3aXRoIE9GIGNhbiBsb29rIGluIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBjcHUgbm9kZShzKQogCSAqIGZvciBhIHBvc3NpYmx5IG1vcmUgYWNjdXJhdGUgdmFsdWUuCiAJICovCi0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKSkgewotCQlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKLQkJaWNhY2hlX2JzaXplID0gY3VyX2NwdV9zcGVjLT5pY2FjaGVfYnNpemU7Ci0JCXVjYWNoZV9ic2l6ZSA9IDA7Ci0JfSBlbHNlCi0JCXVjYWNoZV9ic2l6ZSA9IGRjYWNoZV9ic2l6ZSA9IGljYWNoZV9ic2l6ZQotCQkJPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKKwlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKKwlpY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmljYWNoZV9ic2l6ZTsKKwl1Y2FjaGVfYnNpemUgPSAwOworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKSkKKwkJdWNhY2hlX2JzaXplID0gaWNhY2hlX2JzaXplID0gZGNhY2hlX2JzaXplOwogCiAJLyogcmVib290IG9uIHBhbmljICovCiAJcGFuaWNfdGltZW91dCA9IDE4MDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCA2MDE4MTc4Li5iYzQzYmJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC0zNTAsMTMgKzM1MCwxMSBAQAogewogCURCRygiIC0+IHNldHVwX3N5c3RlbSgpXG4iKTsKIAotCS8qIEFwcGx5IHRoZSBDUFVzLXNwZWNpZmljIGFuZCBmaXJtd2FyZSBzcGVjaWZpYyBmaXh1cHMgdG8ga2VybmVsCi0JICogdGV4dCAobm9wIG91dCBzZWN0aW9ucyBub3QgcmVsZXZhbnQgdG8gdGhpcyBDUFUgb3IgdGhpcyBmaXJtd2FyZSkKKwkvKiBBcHBseSBDUFVzLXNwZWNpZmljIGZpeHVwcyB0byBrZXJuZWwgdGV4dCAobm9wIG91dCBzZWN0aW9ucworCSAqIG5vdCByZWxldmFudCB0byB0aGlzIENQVSkKIAkgKi8KIAlkb19mZWF0dXJlX2ZpeHVwcyhjdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcywKIAkJCSAgJl9fc3RhcnRfX19mdHJfZml4dXAsICZfX3N0b3BfX19mdHJfZml4dXApOwotCWRvX2ZlYXR1cmVfZml4dXBzKHBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMsCi0JCQkgICZfX3N0YXJ0X19fZndfZnRyX2ZpeHVwLCAmX19zdG9wX19fZndfZnRyX2ZpeHVwKTsKIAogCS8qCiAJICogVW5mbGF0dGVuIHRoZSBkZXZpY2UtdHJlZSBwYXNzZWQgYnkgcHJvbV9pbml0IG9yIGtleGVjCkBAIC0zOTQsNiArMzkyLDEyIEBACiAJaWYgKHBwY19tZC5pbml0X2Vhcmx5KQogCQlwcGNfbWQuaW5pdF9lYXJseSgpOwogCisJLyogQXBwbHkgZmlybXdhcmUgc3BlY2lmaWMgZml4dXBzIHRvIGtlcm5lbCB0ZXh0IChub3Agb3V0CisJICogc2VjdGlvbnMgbm90IHJlbGV2YW50IHRvIHRoaXMgZmlybXdhcmUpCisJICovCisJZG9fZmVhdHVyZV9maXh1cHMocG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcywKKwkJCSAgJl9fc3RhcnRfX19md19mdHJfZml4dXAsICZfX3N0b3BfX19md19mdHJfZml4dXApOworCiAgCS8qCiAJICogV2UgY2FuIGRpc2NvdmVyIHNlcmlhbCBwb3J0cyBub3cgc2luY2UgdGhlIGFib3ZlIGRpZCBzZXR1cCB0aGUKIAkgKiBoYXNoIHRhYmxlIG1hbmFnZW1lbnQgZm9yIHVzLCB0aHVzIGlvcmVtYXAgd29ya3MuIFdlIGRvIHRoYXQgZWFybHkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzRkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29tbW9uIHNpZ25hbCBoYW5kbGluZyBjb2RlIGZvciBib3RoIDMyIGFuZCA2NCBiaXRzCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDA3IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3Byb3JhdGlvbgorICogICAgRXh0cmFjdGVkIGZyb20gc2lnbmFsXzMyLmMgYW5kIHNpZ25hbF82NC5jCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgUkVBRE1FLmxlZ2FsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaW5jbHVkZSAic2lnbmFsLmgiCisKKy8qCisgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNpZ25hbCBmcmFtZQorICovCit2b2lkIF9fdXNlciAqIGdldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgIHNpemVfdCBmcmFtZV9zaXplKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIG9sZHNwLCBuZXdzcDsKKworICAgICAgICAvKiBEZWZhdWx0IHRvIHVzaW5nIG5vcm1hbCBzdGFjayAqLworICAgICAgICBvbGRzcCA9IHJlZ3MtPmdwclsxXTsKKworCS8qIENoZWNrIGZvciBhbHQgc3RhY2sgKi8KKwlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICYmCisJICAgIGN1cnJlbnQtPnNhc19zc19zaXplICYmICFvbl9zaWdfc3RhY2sob2xkc3ApKQorCQlvbGRzcCA9IChjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZSk7CisKKwkvKiBHZXQgYWxpZ25lZCBmcmFtZSAqLworCW5ld3NwID0gKG9sZHNwIC0gZnJhbWVfc2l6ZSkgJiB+MHhGVUw7CisKKwkvKiBDaGVjayBhY2Nlc3MgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKW5ld3NwLCBvbGRzcCAtIG5ld3NwKSkKKwkJcmV0dXJuIE5VTEw7CisKKyAgICAgICAgcmV0dXJuICh2b2lkIF9fdXNlciAqKW5ld3NwOworfQorCisKKy8qCisgKiBSZXN0b3JlIHRoZSB1c2VyIHByb2Nlc3MncyBzaWduYWwgbWFzaworICovCit2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqc2V0KQoreworCXNpZ2RlbHNldG1hc2soc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9ICpzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjaGVja19zeXNjYWxsX3Jlc3RhcnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkJICBpbnQgaGFzX2hhbmRsZXIpCit7CisJdW5zaWduZWQgbG9uZyByZXQgPSByZWdzLT5ncHJbM107CisJaW50IHJlc3RhcnQgPSAxOworCisJLyogc3lzY2FsbCA/ICovCisJaWYgKFRSQVAocmVncykgIT0gMHgwQzAwKQorCQlyZXR1cm47CisKKwkvKiBlcnJvciBzaWduYWxsZWQgPyAqLworCWlmICghKHJlZ3MtPmNjciAmIDB4MTAwMDAwMDApKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCWNhc2UgRVJFU1RBUlROT0hBTkQ6CisJCS8qIEVSRVNUQVJUTk9IQU5EIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIG9ubHkgYmUKKwkJICogcmVzdGFydGVkIGlmIHRoZXJlIHdhcyBubyBoYW5kbGVyIGZvciB0aGUgc2lnbmFsLCBhbmQgc2luY2UKKwkJICogd2Ugb25seSBnZXQgaGVyZSBpZiB0aGVyZSBpcyBhIGhhbmRsZXIsIHdlIGRvbnQgcmVzdGFydC4KKwkJICovCisJCXJlc3RhcnQgPSAhaGFzX2hhbmRsZXI7CisJCWJyZWFrOworCWNhc2UgRVJFU1RBUlRTWVM6CisJCS8qIEVSRVNUQVJUU1lTIG1lYW5zIHRvIHJlc3RhcnQgdGhlIHN5c2NhbGwgaWYgdGhlcmUgaXMgbm8KKwkJICogaGFuZGxlciBvciB0aGUgaGFuZGxlciB3YXMgcmVnaXN0ZXJlZCB3aXRoIFNBX1JFU1RBUlQKKwkJICovCisJCXJlc3RhcnQgPSAhaGFzX2hhbmRsZXIgfHwgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpICE9IDA7CisJCWJyZWFrOworCWNhc2UgRVJFU1RBUlROT0lOVFI6CisJCS8qIEVSRVNUQVJUTk9JTlRSIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIGJlCisJCSAqIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgc2lnbmFsIGhhbmRsZXIgcmV0dXJucy4KKwkJICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3RhcnQpIHsKKwkJaWYgKHJldCA9PSBFUkVTVEFSVF9SRVNUQVJUQkxPQ0spCisJCQlyZWdzLT5ncHJbMF0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKKwkJZWxzZQorCQkJcmVncy0+Z3ByWzNdID0gcmVncy0+b3JpZ19ncHIzOworCQlyZWdzLT5uaXAgLT0gNDsKKwkJcmVncy0+cmVzdWx0ID0gMDsKKwl9IGVsc2UgeworCQlyZWdzLT5yZXN1bHQgPSAtRUlOVFI7CisJCXJlZ3MtPmdwclszXSA9IEVJTlRSOworCQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKKwl9Cit9CisKK2ludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2lnaW5mb190IGluZm87CisJaW50IHNpZ25yOworCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKKwlpbnQgcmV0OworCWludCBpczMyID0gaXNfMzJiaXRfdGFzaygpOworCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UgaWYgKCFvbGRzZXQpCisJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOworCisJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisKKwkvKiBJcyB0aGVyZSBhbnkgc3lzY2FsbCByZXN0YXJ0IGJ1c2luZXNzIGhlcmUgPyAqLworCWNoZWNrX3N5c2NhbGxfcmVzdGFydChyZWdzLCAma2EsIHNpZ25yID4gMCk7CisKKwlpZiAoc2lnbnIgPD0gMCkgeworCQkvKiBObyBzaWduYWwgdG8gZGVsaXZlciAtLSBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCQl9CisJCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG5vIHNpZ25hbHMgZGVsaXZlcmVkICovCisJfQorCisgICAgICAgIC8qCisJICogUmVlbmFibGUgdGhlIERBQlIgYmVmb3JlIGRlbGl2ZXJpbmcgdGhlIHNpZ25hbCB0bworCSAqIHVzZXIgc3BhY2UuIFRoZSBEQUJSIHdpbGwgaGF2ZSBiZWVuIGNsZWFyZWQgaWYgaXQKKwkgKiB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBrZXJuZWwuCisJICovCisJaWYgKGN1cnJlbnQtPnRocmVhZC5kYWJyKQorCQlzZXRfZGFicihjdXJyZW50LT50aHJlYWQuZGFicik7CisKKwlpZiAoaXMzMikgeworICAgICAgICAJaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKKwkJCXJldCA9IGhhbmRsZV9ydF9zaWduYWwzMihzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LAorCQkJCQlyZWdzKTsKKwkJZWxzZQorCQkJcmV0ID0gaGFuZGxlX3NpZ25hbDMyKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsCisJCQkJCXJlZ3MpOworCX0gZWxzZSB7CisJCXJldCA9IGhhbmRsZV9ydF9zaWduYWw2NChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLAorCQkJICAma2Euc2Euc2FfbWFzayk7CisJCWlmICghKGthLnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCisJCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ25yKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCQkvKgorCQkgKiBBIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KKwkJICogaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcuCisJCSAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2xvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLAorCQl1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQl1bnNpZ25lZCBsb25nIHI4LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5ncHJbMV0pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZmIzZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAwNyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29wcm9yYXRpb24KKyAqICAgIEV4dHJhY3RlZCBmcm9tIHNpZ25hbF8zMi5jIGFuZCBzaWduYWxfNjQuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIFJFQURNRS5sZWdhbCBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1BPV0VSUENfQVJDSF9TSUdOQUxfSAorI2RlZmluZSBfUE9XRVJQQ19BUkNIX1NJR05BTF9ICisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKK2V4dGVybiB2b2lkIF9fdXNlciAqIGdldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgIHNpemVfdCBmcmFtZV9zaXplKTsKK2V4dGVybiB2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqc2V0KTsKKworZXh0ZXJuIGludCBoYW5kbGVfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsCisJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK2V4dGVybiBpbnQgaGFuZGxlX3J0X3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJICAgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LAorCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKworc3RhdGljIGlubGluZSBpbnQgaXNfMzJiaXRfdGFzayh2b2lkKQoreworCXJldHVybiB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCk7Cit9CisKK2V4dGVybiBpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCSAgICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKnNldCwKKwkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzXzMyYml0X3Rhc2sodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCQkgICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKnNldCwKKwkJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAtRUZBVUxUOworfQorCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BQQzY0KSAqLworCisjZW5kaWYgIC8qIF9QT1dFUlBDX0FSQ0hfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCmluZGV4IGRkMWRjYTUuLjU5MDA1N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwpAQCAtNTEsMTIgKzUxLDExIEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNlbmRpZgogCisjaW5jbHVkZSAic2lnbmFsLmgiCisKICN1bmRlZiBERUJVR19TSUcKIAotI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKLQogI2lmZGVmIENPTkZJR19QUEM2NAotI2RlZmluZSBkb19zaWduYWwJZG9fc2lnbmFsMzIKICNkZWZpbmUgc3lzX3NpZ3N1c3BlbmQJY29tcGF0X3N5c19zaWdzdXNwZW5kCiAjZGVmaW5lIHN5c19ydF9zaWdzdXNwZW5kCWNvbXBhdF9zeXNfcnRfc2lnc3VzcGVuZAogI2RlZmluZSBzeXNfcnRfc2lncmV0dXJuCWNvbXBhdF9zeXNfcnRfc2lncmV0dXJuCkBAIC0yMzEsOCArMjMwLDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi1pbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQogLyoKICAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCiAgKi8KQEAgLTI1MSwxNCArMjQ4LDYgQEAKICAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAotI2lmZGVmIENPTkZJR19QUEMzMgotbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MsIGludCByNSwKLQkJaW50IHI2LCBpbnQgcjcsIGludCByOCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+Z3ByWzFdKTsKLX0KLSNlbmRpZgotCiBsb25nIHN5c19zaWdhY3Rpb24oaW50IHNpZywgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICphY3QsCiAJCXN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKIHsKQEAgLTI5MywxNCArMjgyLDE3IEBACiAvKgogICogV2hlbiB3ZSBoYXZlIHNpZ25hbHMgdG8gZGVsaXZlciwgd2Ugc2V0IHVwIG9uIHRoZQogICogdXNlciBzdGFjaywgZ29pbmcgZG93biBmcm9tIHRoZSBvcmlnaW5hbCBzdGFjayBwb2ludGVyOgotICoJYSBzaWdyZWdzIHN0cnVjdAorICoJYW4gQUJJIGdhcCBvZiA1NiB3b3JkcworICoJYW4gbWNvbnRleHQgc3RydWN0CiAgKglhIHNpZ2NvbnRleHQgc3RydWN0CiAgKglhIGdhcCBvZiBfX1NJR05BTF9GUkFNRVNJWkUgYnl0ZXMKICAqCi0gKiBFYWNoIG9mIHRoZXNlIHRoaW5ncyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMgaW4gc2l6ZS4KKyAqIEVhY2ggb2YgdGhlc2UgdGhpbmdzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBieXRlcyBpbiBzaXplLiBUaGUgZm9sbG93aW5nCisgKiBzdHJ1Y3R1cmUgcmVwcmVzZW50IGFsbCBvZiB0aGlzIGV4Y2VwdCB0aGUgX19TSUdOQUxfRlJBTUVTSVpFIGdhcAogICoKICAqLwotc3RydWN0IHNpZ3JlZ3Mgeworc3RydWN0IHNpZ2ZyYW1lIHsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzY3R4OwkJLyogdGhlIHNpZ2NvbnRleHQgKi8KIAlzdHJ1Y3QgbWNvbnRleHQJbWN0eDsJCS8qIGFsbCB0aGUgcmVnaXN0ZXIgdmFsdWVzICovCiAJLyoKIAkgKiBQcm9ncmFtcyB1c2luZyB0aGUgcnM2MDAwL3hjb2ZmIGFiaSBjYW4gc2F2ZSB1cCB0byAxOSBncApAQCAtNzAzLDQ0ICs2OTUsMjIgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAotCi0vKgotICogUmVzdG9yZSB0aGUgdXNlciBwcm9jZXNzJ3Mgc2lnbmFsIG1hc2sKLSAqLwotI2lmZGVmIENPTkZJR19QUEM2NAotZXh0ZXJuIHZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICpzZXQpOwotI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCi1zdGF0aWMgdm9pZCByZXN0b3JlX3NpZ21hc2soc2lnc2V0X3QgKnNldCkKLXsKLQlzaWdkZWxzZXRtYXNrKHNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSAqc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLX0KLSNlbmRpZgotCiAvKgogICogU2V0IHVwIGEgc2lnbmFsIGZyYW1lIGZvciBhICJyZWFsLXRpbWUiIHNpZ25hbCBoYW5kbGVyCiAgKiAob25lIHdoaWNoIGdldHMgc2lnaW5mbykuCiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX3J0X3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKK2ludCBoYW5kbGVfcnRfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCiAJCXNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbmV3c3ApCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKnJ0X3NmOwogCXN0cnVjdCBtY29udGV4dCBfX3VzZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgb3JpZ3NwID0gbmV3c3A7CisJdW5zaWduZWQgbG9uZyBuZXdzcCA9IDA7CiAKIAkvKiBTZXQgdXAgU2lnbmFsIEZyYW1lICovCiAJLyogUHV0IGEgUmVhbCBUaW1lIENvbnRleHQgb250byBzdGFjayAqLwotCW5ld3NwIC09IHNpemVvZigqcnRfc2YpOwotCXJ0X3NmID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKiluZXdzcDsKLQotCS8qIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGZvciB0aGUgY2FsbGVyIG9mIHRoZSBoYW5kbGVyICovCi0JbmV3c3AgLT0gX19TSUdOQUxfRlJBTUVTSVpFICsgMTY7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKW5ld3NwLCBvcmlnc3AgLSBuZXdzcCkpCisJcnRfc2YgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqcnRfc2YpKTsKKwlpZiAodW5saWtlbHkocnRfc2YgPT0gTlVMTCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAkvKiBQdXQgdGhlIHNpZ2luZm8gJiBmaWxsIGluIG1vc3Qgb2YgdGhlIHVjb250ZXh0ICovCkBAIC03NzAsOCArNzQwLDEyIEBACiAKIAljdXJyZW50LT50aHJlYWQuZnBzY3IudmFsID0gMDsJLyogdHVybiBvZmYgYWxsIGZwIGV4Y2VwdGlvbnMgKi8KIAorCS8qIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGZvciB0aGUgY2FsbGVyIG9mIHRoZSBoYW5kbGVyICovCisJbmV3c3AgPSAoKHVuc2lnbmVkIGxvbmcpcnRfc2YpIC0gKF9fU0lHTkFMX0ZSQU1FU0laRSArIDE2KTsKIAlpZiAocHV0X3VzZXIocmVncy0+Z3ByWzFdLCAodTMyIF9fdXNlciAqKW5ld3NwKSkKIAkJZ290byBiYWRmcmFtZTsKKworCS8qIEZpbGwgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPmdwclsxXSA9IG5ld3NwOwogCXJlZ3MtPmdwclszXSA9IHNpZzsKIAlyZWdzLT5ncHJbNF0gPSAodW5zaWduZWQgbG9uZykgJnJ0X3NmLT5pbmZvOwpAQCAtMTAxNSwyNyArOTg5LDE4IEBACiAvKgogICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgogICovCi1zdGF0aWMgaW50IGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JCXNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgbmV3c3ApCitpbnQgaGFuZGxlX3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjOwotCXN0cnVjdCBzaWdyZWdzIF9fdXNlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBvcmlnc3AgPSBuZXdzcDsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKKwl1bnNpZ25lZCBsb25nIG5ld3NwID0gMDsKIAogCS8qIFNldCB1cCBTaWduYWwgRnJhbWUgKi8KLQluZXdzcCAtPSBzaXplb2Yoc3RydWN0IHNpZ3JlZ3MpOwotCWZyYW1lID0gKHN0cnVjdCBzaWdyZWdzIF9fdXNlciAqKSBuZXdzcDsKLQotCS8qIFB1dCBhIHNpZ2NvbnRleHQgb24gdGhlIHN0YWNrICovCi0JbmV3c3AgLT0gc2l6ZW9mKCpzYyk7Ci0Jc2MgPSAoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICopIG5ld3NwOwotCi0JLyogY3JlYXRlIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSBjYWxsZXIgb2YgdGhlIGhhbmRsZXIgKi8KLQluZXdzcCAtPSBfX1NJR05BTF9GUkFNRVNJWkU7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKSBuZXdzcCwgb3JpZ3NwIC0gbmV3c3ApKQorCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CisJaWYgKHVubGlrZWx5KGZyYW1lID09IE5VTEwpKQogCQlnb3RvIGJhZGZyYW1lOworCXNjID0gKHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqKSAmZnJhbWUtPnNjdHg7CiAKICNpZiBfTlNJRyAhPSA2NAogI2Vycm9yICJQbGVhc2UgYWRqdXN0IGhhbmRsZV9zaWduYWwoKSIKQEAgLTEwNDcsNyArMTAxMiw3IEBACiAjZWxzZQogCSAgICB8fCBfX3B1dF91c2VyKG9sZHNldC0+c2lnWzFdLCAmc2MtPl91bnVzZWRbM10pCiAjZW5kaWYKLQkgICAgfHwgX19wdXRfdXNlcih0b191c2VyX3B0cihmcmFtZSksICZzYy0+cmVncykKKwkgICAgfHwgX19wdXRfdXNlcih0b191c2VyX3B0cigmZnJhbWUtPm1jdHgpLCAmc2MtPnJlZ3MpCiAJICAgIHx8IF9fcHV0X3VzZXIoc2lnLCAmc2MtPnNpZ25hbCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKQEAgLTEwNjMsOCArMTAyOCwxMSBAQAogCiAJY3VycmVudC0+dGhyZWFkLmZwc2NyLnZhbCA9IDA7CS8qIHR1cm4gb2ZmIGFsbCBmcCBleGNlcHRpb25zICovCiAKKwkvKiBjcmVhdGUgYSBzdGFjayBmcmFtZSBmb3IgdGhlIGNhbGxlciBvZiB0aGUgaGFuZGxlciAqLworCW5ld3NwID0gKCh1bnNpZ25lZCBsb25nKWZyYW1lKSAtIF9fU0lHTkFMX0ZSQU1FU0laRTsKIAlpZiAocHV0X3VzZXIocmVncy0+Z3ByWzFdLCAodTMyIF9fdXNlciAqKW5ld3NwKSkKIAkJZ290byBiYWRmcmFtZTsKKwogCXJlZ3MtPmdwclsxXSA9IG5ld3NwOwogCXJlZ3MtPmdwclszXSA9IHNpZzsKIAlyZWdzLT5ncHJbNF0gPSAodW5zaWduZWQgbG9uZykgc2M7CkBAIC0xMTI2LDEwNiArMTA5NCwzIEBACiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwogfQotCi0vKgotICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0Ci0gKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKLSAqIG1pc3Rha2UuCi0gKi8KLWludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnaW5mb190IGluZm87Ci0Jc3RydWN0IGtfc2lnYWN0aW9uIGthOwotCXVuc2lnbmVkIGludCBuZXdzcDsKLQlpbnQgc2lnbnIsIHJldDsKLQotI2lmZGVmIENPTkZJR19QUEMzMgotCWlmICh0cnlfdG9fZnJlZXplKCkpIHsKLQkJc2lnbnIgPSAwOwotCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJZ290byBub19zaWduYWw7Ci0JfQotI2VuZGlmCi0KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7Ci0JZWxzZSBpZiAoIW9sZHNldCkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7Ci0KLQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKLSNpZmRlZiBDT05GSUdfUFBDMzIKLW5vX3NpZ25hbDoKLSNlbmRpZgotCWlmIChUUkFQKHJlZ3MpID09IDB4MEMwMAkJLyogU3lzdGVtIENhbGwhICovCi0JICAgICYmIHJlZ3MtPmNjciAmIDB4MTAwMDAwMDAJCS8qIGVycm9yIHNpZ25hbGxlZCAqLwotCSAgICAmJiAoKHJldCA9IHJlZ3MtPmdwclszXSkgPT0gRVJFU1RBUlRTWVMKLQkJfHwgcmV0ID09IEVSRVNUQVJUTk9IQU5EIHx8IHJldCA9PSBFUkVTVEFSVE5PSU5UUgotCQl8fCByZXQgPT0gRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSkgewotCi0JCWlmIChzaWduciA+IDAKLQkJICAgICYmIChyZXQgPT0gRVJFU1RBUlROT0hBTkQgfHwgcmV0ID09IEVSRVNUQVJUX1JFU1RBUlRCTE9DSwotCQkJfHwgKHJldCA9PSBFUkVTVEFSVFNZUwotCQkJICAgICYmICEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkpKSB7Ci0JCQkvKiBtYWtlIHRoZSBzeXN0ZW0gY2FsbCByZXR1cm4gYW4gRUlOVFIgZXJyb3IgKi8KLQkJCXJlZ3MtPnJlc3VsdCA9IC1FSU5UUjsKLQkJCXJlZ3MtPmdwclszXSA9IEVJTlRSOwotCQkJLyogbm90ZSB0aGF0IHRoZSBjcjAuU08gYml0IGlzIGFscmVhZHkgc2V0ICovCi0JCX0gZWxzZSB7Ci0JCQlyZWdzLT5uaXAgLT0gNDsJLyogQmFjayB1cCAmIHJldHJ5IHN5c3RlbSBjYWxsICovCi0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQkJcmVncy0+dHJhcCA9IDA7Ci0JCQlpZiAocmV0ID09IEVSRVNUQVJUX1JFU1RBUlRCTE9DSykKLQkJCQlyZWdzLT5ncHJbMF0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKLQkJCWVsc2UKLQkJCQlyZWdzLT5ncHJbM10gPSByZWdzLT5vcmlnX2dwcjM7Ci0JCX0KLQl9Ci0KLQlpZiAoc2lnbnIgPT0gMCkgewotCQkvKiBObyBzaWduYWwgdG8gZGVsaXZlciAtLSBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLwotCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgewotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0JCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOwotCQl9Ci0JCXJldHVybiAwOwkJLyogbm8gc2lnbmFscyBkZWxpdmVyZWQgKi8KLQl9Ci0KLQlpZiAoKGthLnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgJiYgY3VycmVudC0+c2FzX3NzX3NpemUKLQkgICAgJiYgIW9uX3NpZ19zdGFjayhyZWdzLT5ncHJbMV0pKQotCQluZXdzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwotCWVsc2UKLQkJbmV3c3AgPSByZWdzLT5ncHJbMV07Ci0JbmV3c3AgJj0gfjB4ZlVMOwotCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JLyoKLQkgKiBSZWVuYWJsZSB0aGUgREFCUiBiZWZvcmUgZGVsaXZlcmluZyB0aGUgc2lnbmFsIHRvCi0JICogdXNlciBzcGFjZS4gVGhlIERBQlIgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBpZiBpdAotCSAqIHRyaWdnZXJlZCBpbnNpZGUgdGhlIGtlcm5lbC4KLQkgKi8KLQlpZiAoY3VycmVudC0+dGhyZWFkLmRhYnIpCi0JCXNldF9kYWJyKGN1cnJlbnQtPnRocmVhZC5kYWJyKTsKLSNlbmRpZgotCi0JLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKLQkJcmV0ID0gaGFuZGxlX3J0X3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzLCBuZXdzcCk7Ci0JZWxzZQotCQlyZXQgPSBoYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MsIG5ld3NwKTsKLQotCWlmIChyZXQpIHsKLQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsCi0JCQkgICZrYS5zYS5zYV9tYXNrKTsKLQkJaWYgKCEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKLQkJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCwgc2lnbnIpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQkvKiBBIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KLQkJICAgaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KLQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCi0JCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKaW5kZXggYjI3ZTI2OC4uZGU4OTVlNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCkBAIC0zNCw5ICszNCw5IEBACiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAotI2RlZmluZSBERUJVR19TSUcgMAorI2luY2x1ZGUgInNpZ25hbC5oIgogCi0jZGVmaW5lIF9CTE9DS0FCTEUgKH4oc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpKQorI2RlZmluZSBERUJVR19TSUcgMAogCiAjZGVmaW5lIEdQX1JFR1NfU0laRQltaW4oc2l6ZW9mKGVsZl9ncmVnc2V0X3QpLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKQogI2RlZmluZSBGUF9SRUdTX1NJWkUJc2l6ZW9mKGVsZl9mcHJlZ3NldF90KQpAQCAtNjQsMTQgKzY0LDYgQEAKIAljaGFyIGFiaWdhcFsyODhdOwogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CiAKLWxvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLCB1bnNpZ25lZCBsb25nIHI1LAotCQkgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsIHVuc2lnbmVkIGxvbmcgcjgsCi0JCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+Z3ByWzFdKTsKLX0KLQotCiAvKgogICogU2V0IHVwIHRoZSBzaWdjb250ZXh0IGZvciB0aGUgc2lnbmFsIGZyYW1lLgogICovCkBAIC0yMDgsMjUgKzIwMCw2IEBACiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNpZ25hbCBmcmFtZQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX191c2VyICogZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCSAgc2l6ZV90IGZyYW1lX3NpemUpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3A7Ci0KLSAgICAgICAgLyogRGVmYXVsdCB0byB1c2luZyBub3JtYWwgc3RhY2sgKi8KLSAgICAgICAgbmV3c3AgPSByZWdzLT5ncHJbMV07Ci0KLQlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICYmIGN1cnJlbnQtPnNhc19zc19zaXplKSB7Ci0JCWlmICghIG9uX3NpZ19zdGFjayhyZWdzLT5ncHJbMV0pKQotCQkJbmV3c3AgPSAoY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemUpOwotCX0KLQotICAgICAgICByZXR1cm4gKHZvaWQgX191c2VyICopKChuZXdzcCAtIGZyYW1lX3NpemUpICYgLTE2dWwpOwotfQotCi0vKgogICogU2V0dXAgdGhlIHRyYW1wb2xpbmUgY29kZSBvbiB0aGUgc3RhY2sKICAqLwogc3RhdGljIGxvbmcgc2V0dXBfdHJhbXBvbGluZSh1bnNpZ25lZCBpbnQgc3lzY2FsbCwgdW5zaWduZWQgaW50IF9fdXNlciAqdHJhbXApCkBAIC0yNTMsMTkgKzIyNiw2IEBACiB9CiAKIC8qCi0gKiBSZXN0b3JlIHRoZSB1c2VyIHByb2Nlc3MncyBzaWduYWwgbWFzayAoYWxzbyB1c2VkIGJ5IHNpZ25hbDMyLmMpCi0gKi8KLXZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICpzZXQpCi17Ci0Jc2lnZGVsc2V0bWFzayhzZXQsIH5fQkxPQ0tBQkxFKTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gKnNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci19Ci0KLQotLyoKICAqIEhhbmRsZSB7Z2V0LHNldCxzd2FwfV9jb250ZXh0IG9wZXJhdGlvbnMKICAqLwogaW50IHN5c19zd2FwY29udGV4dChzdHJ1Y3QgdWNvbnRleHQgX191c2VyICpvbGRfY3R4LApAQCAtMzU5LDcgKzMxOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUoaW50IHNpZ25yLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCitpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCQlzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBIYW5kbGVyIGlzICpyZWFsbHkqIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciBmb3IKQEAgLTM3Myw4ICszMzMsNyBAQAogCWxvbmcgZXJyID0gMDsKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJaWYgKHVubGlrZWx5KGZyYW1lID09IE5VTEwpKQogCQlnb3RvIGJhZGZyYW1lOwogCiAJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKQEAgLTQxMSw3ICszNzAsNyBAQAogCWZ1bmN0X2Rlc2NfcHRyID0gKGZ1bmNfZGVzY3JfdCBfX3VzZXIgKikga2EtPnNhLnNhX2hhbmRsZXI7CiAKIAkvKiBBbGxvY2F0ZSBhIGR1bW15IGNhbGxlciBmcmFtZSBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyLiAqLwotCW5ld3NwID0gKHVuc2lnbmVkIGxvbmcpZnJhbWUgLSBfX1NJR05BTF9GUkFNRVNJWkU7CisJbmV3c3AgPSAoKHVuc2lnbmVkIGxvbmcpZnJhbWUpIC0gX19TSUdOQUxfRlJBTUVTSVpFOwogCWVyciB8PSBwdXRfdXNlcihyZWdzLT5ncHJbMV0sICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKW5ld3NwKTsKIAogCS8qIFNldCB1cCAicmVncyIgc28gd2UgInJldHVybiIgdG8gdGhlIHNpZ25hbCBoYW5kbGVyLiAqLwpAQCAtNDQyLDEzNCArNDAxLDMgQEAKIAlmb3JjZV9zaWdzZWd2KHNpZ25yLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKIH0KLQotCi0vKgotICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgotICovCi1zdGF0aWMgaW50IGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JCQkgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgcmV0OwotCi0JLyogU2V0IHVwIFNpZ25hbCBGcmFtZSAqLwotCXJldCA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7Ci0KLQlpZiAocmV0KSB7Ci0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2EtPnNhLnNhX21hc2spOwotCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKLQkJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCxzaWcpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzeXNjYWxsX3Jlc3RhcnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EpCi17Ci0Jc3dpdGNoICgoaW50KXJlZ3MtPnJlc3VsdCkgewotCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKLQljYXNlIC1FUkVTVEFSVE5PSEFORDoKLQkJLyogRVJFU1RBUlROT0hBTkQgbWVhbnMgdGhhdCB0aGUgc3lzY2FsbCBzaG91bGQgb25seSBiZQotCQkgKiByZXN0YXJ0ZWQgaWYgdGhlcmUgd2FzIG5vIGhhbmRsZXIgZm9yIHRoZSBzaWduYWwsIGFuZCBzaW5jZQotCQkgKiB3ZSBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIGlzIGEgaGFuZGxlciwgd2UgZG9udCByZXN0YXJ0LgotCQkgKi8KLQkJcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCQlyZWdzLT5ncHJbM10gPSBFSU5UUjsKLQkJcmVncy0+Y2NyIHw9IDB4MTAwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgLUVSRVNUQVJUU1lTOgotCQkvKiBFUkVTVEFSVFNZUyBtZWFucyB0byByZXN0YXJ0IHRoZSBzeXNjYWxsIGlmIHRoZXJlIGlzIG5vCi0JCSAqIGhhbmRsZXIgb3IgdGhlIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQgd2l0aCBTQV9SRVNUQVJUCi0JCSAqLwotCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkgewotCQkJcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCQkJcmVncy0+Z3ByWzNdID0gRUlOVFI7Ci0JCQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGZhbGx0aHJvdWdoICovCi0JY2FzZSAtRVJFU1RBUlROT0lOVFI6Ci0JCS8qIEVSRVNUQVJUTk9JTlRSIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIGJlCi0JCSAqIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgc2lnbmFsIGhhbmRsZXIgcmV0dXJucy4KLQkJICovCi0JCXJlZ3MtPmdwclszXSA9IHJlZ3MtPm9yaWdfZ3ByMzsKLQkJcmVncy0+bmlwIC09IDQ7Ci0JCXJlZ3MtPnJlc3VsdCA9IDA7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIE5vdGUgdGhhdCAnaW5pdCcgaXMgYSBzcGVjaWFsIHByb2Nlc3M6IGl0IGRvZXNuJ3QgZ2V0IHNpZ25hbHMgaXQgZG9lc24ndAotICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5Ci0gKiBtaXN0YWtlLgotICovCi1pbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXNpZ2luZm9fdCBpbmZvOwotCWludCBzaWducjsKLQlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7Ci0KLQkvKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyAzMiBiaXQgLSBpbnZva2UgdGhlCi0JICogMzIgYml0IHNpZ25hbCBoYW5kbGluZyBjb2RlCi0JICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkKLQkJcmV0dXJuIGRvX3NpZ25hbDMyKG9sZHNldCwgcmVncyk7Ci0KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7Ci0JZWxzZSBpZiAoIW9sZHNldCkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7Ci0KLQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKLQlpZiAoc2lnbnIgPiAwKSB7Ci0JCWludCByZXQ7Ci0KLQkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JCWlmIChUUkFQKHJlZ3MpID09IDB4MEMwMCkKLQkJCXN5c2NhbGxfcmVzdGFydChyZWdzLCAma2EpOwotCi0JCS8qCi0JCSAqIFJlZW5hYmxlIHRoZSBEQUJSIGJlZm9yZSBkZWxpdmVyaW5nIHRoZSBzaWduYWwgdG8KLQkJICogdXNlciBzcGFjZS4gVGhlIERBQlIgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBpZiBpdAotCQkgKiB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBrZXJuZWwuCi0JCSAqLwotCQlpZiAoY3VycmVudC0+dGhyZWFkLmRhYnIpCi0JCQlzZXRfZGFicihjdXJyZW50LT50aHJlYWQuZGFicik7Ci0KLQkJcmV0ID0gaGFuZGxlX3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKLQotCQkvKiBJZiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCwgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KLQkJICAgaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KLQkJaWYgKHJldCAmJiB0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoVFJBUChyZWdzKSA9PSAweDBDMDApIHsJLyogU3lzdGVtIENhbGwhICovCi0JCWlmICgoaW50KXJlZ3MtPnJlc3VsdCA9PSAtRVJFU1RBUlROT0hBTkQgfHwKLQkJICAgIChpbnQpcmVncy0+cmVzdWx0ID09IC1FUkVTVEFSVFNZUyB8fAotCQkgICAgKGludClyZWdzLT5yZXN1bHQgPT0gLUVSRVNUQVJUTk9JTlRSKSB7Ci0JCQlyZWdzLT5ncHJbM10gPSByZWdzLT5vcmlnX2dwcjM7Ci0JCQlyZWdzLT5uaXAgLT0gNDsgLyogQmFjayB1cCAmIHJldHJ5IHN5c3RlbSBjYWxsICovCi0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQl9IGVsc2UgaWYgKChpbnQpcmVncy0+cmVzdWx0ID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKLQkJCXJlZ3MtPmdwclswXSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOwotCQkJcmVncy0+bmlwIC09IDQ7Ci0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQl9Ci0JfQotCS8qIE5vIHNpZ25hbCB0byBkZWxpdmVyIC0tIHB1dCB0aGUgc2F2ZWQgc2lnbWFzayBiYWNrICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0JCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGRvX3NpZ25hbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggNjg5OTFjMi4uNTVkMjllZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtNDQyLDEyICs0NDIsMTQgQEAKIAlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJm5vZGUtPnN5c2Rldi5rb2JqLCAmZGV2LT5rb2JqLAogCQkJa29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZSk7CiAKIHZvaWQgc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgaW50IG5pZCkKIHsKIAlzdHJ1Y3Qgbm9kZSAqbm9kZSA9ICZub2RlX2RldmljZXNbbmlkXTsKIAlzeXNmc19yZW1vdmVfbGluaygmbm9kZS0+c3lzZGV2LmtvYmosIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfZGV2aWNlX2Zyb21fbm9kZSk7CiAKICNlbHNlCiBzdGF0aWMgdm9pZCByZWdpc3Rlcl9ub2Rlcyh2b2lkKQpAQCAtNDU3LDkgKzQ1OSw2IEBACiAKICNlbmRpZgogCi1FWFBPUlRfU1lNQk9MX0dQTChzeXNmc19hZGRfZGV2aWNlX3RvX25vZGUpOwotRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUpOwotCiAvKiBPbmx5IHZhbGlkIGlmIENQVSBpcyBwcmVzZW50LiAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19waHlzaWNhbF9pZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IDJjODU2NGQuLmU1ZGYxNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC03Nyw5ICs3Nyw4IEBACiAvKiBrZWVwIHRyYWNrIG9mIHdoZW4gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHJ0YyAqLwogdGltZV90IGxhc3RfcnRjX3VwZGF0ZTsKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLXVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90aXRhbiA9IDA7Ci11bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGIgPSAwOyAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpcnN0X3NldHRpbWVvZmRheSA9IDE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGlTZXJpZXNfcmVjYWxfdGl0YW47CitzdGF0aWMgc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBpU2VyaWVzX3JlY2FsX3RiOwogI2VuZGlmCiAKIC8qIFRoZSBkZWNyZW1lbnRlciBjb3VudHMgZG93biBieSAxMjggZXZlcnkgMTI4bnMgb24gYSA2MDEuICovCkBAIC0xMTMsOCArMTEyLDkgQEAKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfbG9jayk7CiAKLXU2NCB0Yl90b19uc19zY2FsZTsKLXVuc2lnbmVkIHRiX3RvX25zX3NoaWZ0Oworc3RhdGljIHU2NCB0Yl90b19uc19zY2FsZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHVuc2lnbmVkIHRiX3RvX25zX3NoaWZ0IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib290X3RiIF9fcmVhZF9tb3N0bHk7CiAKIHN0cnVjdCBnZXR0aW1lb2ZkYXlfc3RydWN0IGRvX2d0b2Q7CiAKQEAgLTIxNCw3ICsyMTQsNiBAQAogIAlydW5fcG9zaXhfY3B1X3RpbWVycyhjdXJyZW50KTsKIH0KIAotI2lmZGVmIENPTkZJR19QUENfU1BMUEFSCiAvKgogICogU3R1ZmYgZm9yIGFjY291bnRpbmcgc3RvbGVuIHRpbWUuCiAgKi8KQEAgLTIyMiwxOSArMjIxLDI4IEBACiAJaW50CWluaXRpYWxpemVkOwkJCS8qIHRocmVhZCBpcyBydW5uaW5nICovCiAJdTY0CXRiOwkJCS8qIGxhc3QgVEIgdmFsdWUgcmVhZCAqLwogCXU2NAlwdXJyOwkJCS8qIGxhc3QgUFVSUiB2YWx1ZSByZWFkICovCi0Jc3BpbmxvY2tfdCBsb2NrOwogfTsKIAorLyoKKyAqIEVhY2ggZW50cnkgaW4gdGhlIGNwdV9wdXJyX2RhdGEgYXJyYXkgaXMgbWFuaXB1bGF0ZWQgb25seSBieSBpdHMKKyAqICJvd25lciIgY3B1IC0tIHVzdWFsbHkgaW4gdGhlIHRpbWVyIGludGVycnVwdCBidXQgYWxzbyBvY2Nhc2lvbmFsbHkKKyAqIGluIHByb2Nlc3MgY29udGV4dCBmb3IgY3B1IG9ubGluZS4gIEFzIGxvbmcgYXMgY3B1cyBkbyBub3QgdG91Y2gKKyAqIGVhY2ggb3RoZXJzJyBjcHVfcHVycl9kYXRhLCBkaXNhYmxpbmcgbG9jYWwgaW50ZXJydXB0cyBpcworICogc3VmZmljaWVudCB0byBzZXJpYWxpemUgYWNjZXNzZXMuCisgKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X3B1cnJfZGF0YSwgY3B1X3B1cnJfZGF0YSk7CiAKIHN0YXRpYyB2b2lkIHNuYXBzaG90X3RiX2FuZF9wdXJyKHZvaWQgKmRhdGEpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgY3B1X3B1cnJfZGF0YSAqcCA9ICZfX2dldF9jcHVfdmFyKGNwdV9wdXJyX2RhdGEpOwogCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXAtPnRiID0gbWZ0YigpOwogCXAtPnB1cnIgPSBtZnNwcihTUFJOX1BVUlIpOwogCXdtYigpOwogCXAtPmluaXRpYWxpemVkID0gMTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qCkBAIC0yNDIsMTUgKzI1MCwxNCBAQAogICovCiB2b2lkIHNuYXBzaG90X3RpbWViYXNlcyh2b2lkKQogewotCWludCBjcHU7Ci0KIAlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BVUlIpKQogCQlyZXR1cm47Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJc3Bpbl9sb2NrX2luaXQoJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgY3B1KS5sb2NrKTsKIAlvbl9lYWNoX2NwdShzbmFwc2hvdF90Yl9hbmRfcHVyciwgTlVMTCwgMCwgMSk7CiB9CiAKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KIHZvaWQgY2FsY3VsYXRlX3N0ZWFsX3RpbWUodm9pZCkKIHsKIAl1NjQgdGIsIHB1cnI7CkBAIC0yNjIsNyArMjY5LDYgQEAKIAlwbWUgPSAmcGVyX2NwdShjcHVfcHVycl9kYXRhLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWlmICghcG1lLT5pbml0aWFsaXplZCkKIAkJcmV0dXJuOwkJLyogdGhpcyBjYW4gaGFwcGVuIGluIGVhcmx5IGJvb3QgKi8KLQlzcGluX2xvY2soJnBtZS0+bG9jayk7CiAJdGIgPSBtZnRiKCk7CiAJcHVyciA9IG1mc3ByKFNQUk5fUFVSUik7CiAJc3RvbGVuID0gKHRiIC0gcG1lLT50YikgLSAocHVyciAtIHBtZS0+cHVycik7CkBAIC0yNzAsOSArMjc2LDkgQEAKIAkJYWNjb3VudF9zdGVhbF90aW1lKGN1cnJlbnQsIHN0b2xlbik7CiAJcG1lLT50YiA9IHRiOwogCXBtZS0+cHVyciA9IHB1cnI7Ci0Jc3Bpbl91bmxvY2soJnBtZS0+bG9jayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFBDX1NQTFBBUgogLyoKICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3B1IGlzIGFkZGVkIHRvIHRoZSBvbmxpbmUgbWFwIHdoZW4KICAqIGEgY3B1IGlzIGJlaW5nIGJyb3VnaHQgdXAgYXQgcnVudGltZS4KQEAgLTI4NCwxMiArMjkwLDEyIEBACiAKIAlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BVUlIpKQogCQlyZXR1cm47CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXBtZSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBtZS0+bG9jaywgZmxhZ3MpOwogCXBtZS0+dGIgPSBtZnRiKCk7CiAJcG1lLT5wdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKIAlwbWUtPmluaXRpYWxpemVkID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWUtPmxvY2ssIGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1NQTFBBUiAqLwpAQCAtNTUwLDEwICs1NTYsMTUgQEAKICAqIHJldHVybmVkIGJ5IHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBmb3IgdGhlIHRpbWViYXNlIGZyZXF1ZW5jeS4gIAogICovCiAKLXN0YXRpYyB2b2lkIGlTZXJpZXNfdGJfcmVjYWwodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGlTZXJpZXNfdGJfcmVjYWwodm9pZCkKIHsKIAlzdHJ1Y3QgZGl2X3Jlc3VsdCBkaXZyZXM7CiAJdW5zaWduZWQgbG9uZyB0aXRhbiwgdGI7CisKKwkvKiBNYWtlIHN1cmUgd2Ugb25seSBydW4gb24gaVNlcmllcyAqLworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAl0YiA9IGdldF90YigpOwogCXRpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOwogCWlmICggaVNlcmllc19yZWNhbF90aXRhbiApIHsKQEAgLTU5NCw4ICs2MDUsMTggQEAKIAl9CiAJaVNlcmllc19yZWNhbF90aXRhbiA9IHRpdGFuOwogCWlTZXJpZXNfcmVjYWxfdGIgPSB0YjsKKworCXJldHVybiAwOwogfQotI2VuZGlmCitsYXRlX2luaXRjYWxsKGlTZXJpZXNfdGJfcmVjYWwpOworCisvKiBDYWxsZWQgZnJvbSBwbGF0Zm9ybSBlYXJseSBpbml0ICovCit2b2lkIF9faW5pdCBpU2VyaWVzX3RpbWVfaW5pdF9lYXJseSh2b2lkKQoreworCWlTZXJpZXNfcmVjYWxfdGIgPSBnZXRfdGIoKTsKKwlpU2VyaWVzX3JlY2FsX3RpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOworfQorI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwogCiAvKgogICogRm9yIGlTZXJpZXMgc2hhcmVkIHByb2Nlc3NvcnMsIHdlIGhhdmUgdG8gbGV0IHRoZSBoeXBlcnZpc29yCkBAIC03MzUsNyArNzU2LDcgQEAKIHsKIAlpZiAoX19VU0VfUlRDKCkpCiAJCXJldHVybiBnZXRfcnRjKCk7Ci0JcmV0dXJuIG11bGhkdShnZXRfdGIoKSwgdGJfdG9fbnNfc2NhbGUpIDw8IHRiX3RvX25zX3NoaWZ0OworCXJldHVybiBtdWxoZHUoZ2V0X3RiKCkgLSBib290X3RiLCB0Yl90b19uc19zY2FsZSkgPDwgdGJfdG9fbnNfc2hpZnQ7CiB9CiAKIGludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKQEAgLTc1OSwxMiArNzgwLDYgQEAKIAkgKiB0byB0aGUgUlRDIGFnYWluLCBvciB3cml0ZSB0byB0aGUgUlRDIGJ1dCB0aGVuIHRoZXkgZG9uJ3QgY2FsbAogCSAqIHNldHRpbWVvZmRheSB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLgogCSAqLwotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpICYmIGZpcnN0X3NldHRpbWVvZmRheSkgewotCQlpU2VyaWVzX3RiX3JlY2FsKCk7Ci0JCWZpcnN0X3NldHRpbWVvZmRheSA9IDA7Ci0JfQotI2VuZGlmCiAKIAkvKiBNYWtlIHVzZXJzcGFjZSBnZXR0aW1lb2ZkYXkgc3BpbiB1bnRpbCB3ZSdyZSBkb25lLiAqLwogCSsrdmRzb19kYXRhLT50Yl91cGRhdGVfY291bnQ7CkBAIC05NjAsNiArOTc1LDggQEAKIAl9CiAJdGJfdG9fbnNfc2NhbGUgPSBzY2FsZTsKIAl0Yl90b19uc19zaGlmdCA9IHNoaWZ0OworCS8qIFNhdmUgdGhlIGN1cnJlbnQgdGltZWJhc2UgdG8gcHJldHR5IHVwIENPTkZJR19QUklOVEtfVElNRSAqLworCWJvb3RfdGIgPSBnZXRfdGIoKTsKIAogCXRtID0gZ2V0X2Jvb3RfdGltZSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggYmY2NDQ1YS4uMmJiMWNiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwpAQCAtMTQ5LDYgKzE0OSw3IEBACiAKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlkaWUubG9ja19vd25lciA9IC0xOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpZS5sb2NrLCBmbGFncyk7CiAKIAlpZiAoa2V4ZWNfc2hvdWxkX2NyYXNoKGN1cnJlbnQpIHx8CkBAIC03NzcsNyArNzc4LDcgQEAKIAkJCXJldHVybjsKIAogCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfUFIpICYmICAvKiBub3QgdXNlci1tb2RlICovCi0JCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCkgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CisJCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCwgcmVncykgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5uaXAgKz0gNDsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwppbmRleCA0MjQ1NTc5Li5jZWYwMWU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJLyoKIAkgKiBGaWxsIHVwIHRoZSAic3lzdGVtY2ZnIiBzdHVmZiBmb3IgYmFja3dhcmQgY29tcGF0aWJsaXR5CiAJICovCi0Jc3RyY3B5KHZkc29fZGF0YS0+ZXllX2NhdGNoZXIsICJTWVNURU1DRkc6UFBDNjQiKTsKKwlzdHJjcHkoKGNoYXIgKil2ZHNvX2RhdGEtPmV5ZV9jYXRjaGVyLCAiU1lTVEVNQ0ZHOlBQQzY0Iik7CiAJdmRzb19kYXRhLT52ZXJzaW9uLm1ham9yID0gU1lTVEVNQ0ZHX01BSk9SOwogCXZkc29fZGF0YS0+dmVyc2lvbi5taW5vciA9IFNZU1RFTUNGR19NSU5PUjsKIAl2ZHNvX2RhdGEtPnByb2Nlc3NvciA9IG1mc3ByKFNQUk5fUFZSKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAyMWMzOWZmLi5hZTRhY2Q4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBQUk9WSURFMzIoeCkJUFJPVklERSh4KQogI2VuZGlmCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogRU5UUlkoX3N0ZXh0KQogCkBAIC0yMTEsNiArMjEyLDExIEBACiAJCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCiAJfQogCisJLiA9IEFMSUdOKEwxX0NBQ0hFX0JZVEVTKTsKKwkuZGF0YS5yZWFkX21vc3RseSA6IHsKKwkJKiguZGF0YS5yZWFkX21vc3RseSkKKwl9CisKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfX2RhdGFfbm9zYXZlIDogewogCQlfX25vc2F2ZV9iZWdpbiA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jIGIvYXJjaC9wb3dlcnBjL21tLzQ0eF9tbXUuYwppbmRleCBjYTRkY2IwLi5jM2RmNTA0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS80NHhfbW11LmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tLzR4eF9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS80eHhfbW11LmMKaW5kZXggODM4ZTA5ZC4uN2ZmMjYwOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tLzR4eF9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vNHh4X21tdS5jCkBAIC05LDcgKzksNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKaW5kZXggNGY4MzljNi4uN2U0ZDI3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQpAQCAtMTEsOCArMTEsNyBAQAogaGFzaC0kKENPTkZJR19QUENfTkFUSVZFKQk6PSBoYXNoX25hdGl2ZV82NC5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBpbml0XzY0Lm8gcGd0YWJsZV82NC5vIG1tdV9jb250ZXh0XzY0Lm8gXAogCQkJCSAgIGhhc2hfdXRpbHNfNjQubyBoYXNoX2xvd182NC5vIHRsYl82NC5vIFwKLQkJCQkgICBzbGJfbG93Lm8gc2xiLm8gc3RhYi5vIG1tYXAubyBpbWFsbG9jLm8gXAotCQkJCSAgICQoaGFzaC15KQorCQkJCSAgIHNsYl9sb3cubyBzbGIubyBzdGFiLm8gbW1hcC5vICQoaGFzaC15KQogb2JqLSQoQ09ORklHX1BQQ19TVERfTU1VXzMyKQkrPSBwcGNfbW11XzMyLm8gaGFzaF9sb3dfMzIubyB0bGJfMzIubwogb2JqLSQoQ09ORklHXzQweCkJCSs9IDR4eF9tbXUubwogb2JqLSQoQ09ORklHXzQ0eCkJCSs9IDQ0eF9tbXUubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwppbmRleCAxMTViMjVmLi4wZWNlNTEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwpAQCAtMzgwLDcgKzM4MCw3IEBACiAJfQogCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgY3VycmVudC0+Y29tbSk7CiAJaWYgKHVzZXJfbW9kZShyZWdzKSkKLQkJZG9fZXhpdChTSUdLSUxMKTsKKwkJZG9fZ3JvdXBfZXhpdChTSUdLSUxMKTsKIAlyZXR1cm4gU0lHS0lMTDsKIAogZG9fc2lnYnVzOgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKaW5kZXggMTIzZGEwMy4uYWZhYjI0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKICAqICAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCAgTGludXMgVG9ydmFsZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKaW5kZXggNGEyMGQ4OS4uNmJhOWI0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQlzcGluX3VubG9jaygmbmF0aXZlX3RsYmllX2xvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX2xvY2tfaHB0ZShocHRlX3QgKmhwdGVwKQorc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9sb2NrX2hwdGUoc3RydWN0IGhhc2hfcHRlICpocHRlcCkKIHsKIAl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT52OwogCkBAIC0xMTYsNyArMTE2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZV90ICpocHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfdW5sb2NrX2hwdGUoc3RydWN0IGhhc2hfcHRlICpocHRlcCkKIHsKIAl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT52OwogCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgcmZsYWdzLAogCQkJdW5zaWduZWQgbG9uZyB2ZmxhZ3MsIGludCBwc2l6ZSkKIHsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgaHB0ZV9ncm91cDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgaHB0ZV9ncm91cDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOwogCWludCBpOwogCkBAIC0xNjMsNyArMTYzLDcgQEAKIAogCWhwdGVwLT5yID0gaHB0ZV9yOwogCS8qIEd1YXJhbnRlZSB0aGUgc2Vjb25kIGR3b3JkIGlzIHZpc2libGUgYmVmb3JlIHRoZSB2YWxpZCBiaXQgKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJZWllaW8oKTsKIAkvKgogCSAqIE5vdyBzZXQgdGhlIGZpcnN0IGR3b3JkIGluY2x1ZGluZyB0aGUgdmFsaWQgYml0CiAJICogTk9URTogdGhpcyBhbHNvIHVubG9ja3MgdGhlIGhwdGUKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9yZW1vdmUodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwKQogewotCWhwdGVfdCAqaHB0ZXA7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcDsKIAlpbnQgaTsKIAlpbnQgc2xvdF9vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBocHRlX3Y7CkBAIC0yMTcsNyArMjE3LDcgQEAKIHN0YXRpYyBsb25nIG5hdGl2ZV9ocHRlX3VwZGF0ZXBwKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyBuZXdwcCwKIAkJCQkgdW5zaWduZWQgbG9uZyB2YSwgaW50IHBzaXplLCBpbnQgbG9jYWwpCiB7Ci0JaHB0ZV90ICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7CiAJdW5zaWduZWQgbG9uZyBocHRlX3YsIHdhbnRfdjsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjMzLDE1ICsyMzMsMTQgQEAKIAkvKiBFdmVuIGlmIHdlIG1pc3MsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgVExCICovCiAJaWYgKCFIUFRFX1ZfQ09NUEFSRShocHRlX3YsIHdhbnRfdikgfHwgIShocHRlX3YgJiBIUFRFX1ZfVkFMSUQpKSB7CiAJCURCR19MT1coIiAtPiBtaXNzXG4iKTsKLQkJbmF0aXZlX3VubG9ja19ocHRlKGhwdGVwKTsKIAkJcmV0ID0gLTE7CiAJfSBlbHNlIHsKIAkJREJHX0xPVygiIC0+IGhpdFxuIik7CiAJCS8qIFVwZGF0ZSB0aGUgSFBURSAqLwogCQlocHRlcC0+ciA9IChocHRlcC0+ciAmIH4oSFBURV9SX1BQIHwgSFBURV9SX04pKSB8CiAJCQkobmV3cHAgJiAoSFBURV9SX1BQIHwgSFBURV9SX04gfCBIUFRFX1JfQykpOwotCQluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCX0KKwluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCiAJLyogRW5zdXJlIGl0IGlzIG91dCBvZiB0aGUgdGxiIHRvby4gKi8KIAl0bGJpZSh2YSwgcHNpemUsIGxvY2FsKTsKQEAgLTI1MSw3ICsyNTAsNyBAQAogCiBzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9maW5kKHVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSkKIHsKLQlocHRlX3QgKmhwdGVwOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXA7CiAJdW5zaWduZWQgbG9uZyBoYXNoOwogCXVuc2lnbmVkIGxvbmcgaSwgajsKIAlsb25nIHNsb3Q7CkBAIC0yOTQsNyArMjkzLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHZzaWQsIHZhOwogCWxvbmcgc2xvdDsKLQlocHRlX3QgKmhwdGVwOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXA7CiAKIAl2c2lkID0gZ2V0X2tlcm5lbF92c2lkKGVhKTsKIAl2YSA9ICh2c2lkIDw8IDI4KSB8IChlYSAmIDB4MGZmZmZmZmYpOwpAQCAtMzE1LDcgKzMxNCw3IEBACiBzdGF0aWMgdm9pZCBuYXRpdmVfaHB0ZV9pbnZhbGlkYXRlKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyB2YSwKIAkJCQkgICBpbnQgcHNpemUsIGludCBsb2NhbCkKIHsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIHdhbnRfdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzQ1LDcgKzM0NCw3IEBACiAjZGVmaW5lIExQX0JJVFMJCTgKICNkZWZpbmUgTFBfTUFTSyhpKQkoKDB4RkYgPj4gKGkpKSA8PCBMUF9TSElGVCkKIAotc3RhdGljIHZvaWQgaHB0ZV9kZWNvZGUoaHB0ZV90ICpocHRlLCB1bnNpZ25lZCBsb25nIHNsb3QsCitzdGF0aWMgdm9pZCBocHRlX2RlY29kZShzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHVuc2lnbmVkIGxvbmcgc2xvdCwKIAkJCWludCAqcHNpemUsIHVuc2lnbmVkIGxvbmcgKnZhKQogewogCXVuc2lnbmVkIGxvbmcgaHB0ZV9yID0gaHB0ZS0+cjsKQEAgLTQxNSw3ICs0MTQsNyBAQAogc3RhdGljIHZvaWQgbmF0aXZlX2hwdGVfY2xlYXIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNsb3QsIHNsb3RzLCBmbGFnczsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXAgPSBodGFiX2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBocHRlX3YsIHZhOwogCXVuc2lnbmVkIGxvbmcgcHRlZ19jb3VudDsKIAlpbnQgcHNpemU7CkBAIC00NjIsNyArNDYxLDcgQEAKIHN0YXRpYyB2b2lkIG5hdGl2ZV9mbHVzaF9oYXNoX3JhbmdlKHVuc2lnbmVkIGxvbmcgbnVtYmVyLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyB2YSwgaGFzaCwgaW5kZXgsIGhpZHgsIHNoaWZ0LCBzbG90OwotCWhwdGVfdCAqaHB0ZXA7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIHdhbnRfdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKaW5kZXggNGYyZjQ1My4uMmNlOTQ5MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfU0RSMTsKIHN0cnVjdCBtbXVfcHNpemVfZGVmIG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFX0NPVU5UXTsKIAotaHB0ZV90ICpodGFiX2FkZHJlc3M7CitzdHJ1Y3QgaGFzaF9wdGUgKmh0YWJfYWRkcmVzczsKIHVuc2lnbmVkIGxvbmcgaHRhYl9zaXplX2J5dGVzOwogdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKIGludCBtbXVfbGluZWFyX3BzaXplID0gTU1VX1BBR0VfNEs7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jIGIvYXJjaC9wb3dlcnBjL21tL2ltYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzMTgxNS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qCi0gKiBjIDIwMDEgUFBDIDY0IFRlYW0sIElCTSBDb3JwCi0gKiAKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLQotI2luY2x1ZGUgIm1tdV9kZWNsLmgiCi0KLXN0YXRpYyBERUZJTkVfTVVURVgoaW1saXN0X211dGV4KTsKLXN0cnVjdCB2bV9zdHJ1Y3QgKiBpbWxpc3QgPSBOVUxMOwotCi1zdGF0aWMgaW50IGdldF9mcmVlX2ltX2FkZHIodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nICppbV9hZGRyKQotewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcDsKLQotCWFkZHIgPSBpb3JlbWFwX2JvdDsKLQlmb3IgKHAgPSAmaW1saXN0OyAodG1wID0gKnApIDsgcCA9ICZ0bXAtPm5leHQpIHsKLQkJaWYgKHNpemUgKyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHRtcC0+YWRkcikKLQkJCWJyZWFrOwotCQlpZiAoKHVuc2lnbmVkIGxvbmcpdG1wLT5hZGRyID49IGlvcmVtYXBfYm90KQotCQkJYWRkciA9IHRtcC0+c2l6ZSArICh1bnNpZ25lZCBsb25nKSB0bXAtPmFkZHI7Ci0JCWlmIChhZGRyID49IElNQUxMT0NfRU5ELXNpemUpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JKmltX2FkZHIgPSBhZGRyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IHZfYWRkciBhbmQgc2l6ZSBpcyBhIHN1YnNldAotICogb2YgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgcGFyZW50Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGltX3JlZ2lvbl9pc19zdWJzZXQodW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCXN0cnVjdCB2bV9zdHJ1Y3QgKnBhcmVudCkKLXsKLQlyZXR1cm4gKGludCkgKHZfYWRkciA+PSAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyICYmCi0JICAgICAgICAgICAgICB2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyICsgcGFyZW50LT5zaXplICYmCi0JICAgIAkgICAgICBzaXplIDwgcGFyZW50LT5zaXplKTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgdl9hZGRyIGFuZCBzaXplIGlzIGEgc3VwZXJzZXQKLSAqIG9mIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IGNoaWxkCi0gKi8KLXN0YXRpYyBpbnQgaW1fcmVnaW9uX2lzX3N1cGVyc2V0KHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCXN0cnVjdCB2bV9zdHJ1Y3QgKmNoaWxkKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgcGFyZW50OwotCi0JcGFyZW50LmFkZHIgPSAodm9pZCAqKSB2X2FkZHI7Ci0JcGFyZW50LnNpemUgPSBzaXplOwotCi0JcmV0dXJuIGltX3JlZ2lvbl9pc19zdWJzZXQoKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT5hZGRyLCBjaGlsZC0+c2l6ZSwKLQkJCSZwYXJlbnQpOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciB0aGUgcmVnaW9uIGRlc2NyaWJlZCBieSB2X2FkZHIgYW5kIHNpemUgb3ZlcmxhcHMKLSAqIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IHZtLiAgT3ZlcmxhcHBpbmcgcmVnaW9ucyBtZWV0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAxKSBUaGUgcmVnaW9ucyBzaGFyZSBzb21lIHBhcnQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UKLSAqIDIpIFRoZSByZWdpb25zIGFyZW4ndCBpZGVudGljYWwKLSAqIDMpIE5laXRoZXIgcmVnaW9uIGlzIGEgc3Vic2V0IG9mIHRoZSBvdGhlcgotICovCi1zdGF0aWMgaW50IGltX3JlZ2lvbl9vdmVybGFwcyh1bnNpZ25lZCBsb25nIHZfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkgICAgIHN0cnVjdCB2bV9zdHJ1Y3QgKnZtKQotewotCWlmIChpbV9yZWdpb25faXNfc3VwZXJzZXQodl9hZGRyLCBzaXplLCB2bSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuICh2X2FkZHIgKyBzaXplID4gKHVuc2lnbmVkIGxvbmcpIHZtLT5hZGRyICsgdm0tPnNpemUgJiYKLQkJdl9hZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHZtLT5hZGRyICsgdm0tPnNpemUpIHx8Ci0JICAgICAgICh2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgdm0tPmFkZHIgJiYKLQkJdl9hZGRyICsgc2l6ZSA+ICh1bnNpZ25lZCBsb25nKSB2bS0+YWRkcik7Ci19Ci0KLS8qIERldGVybWluZSBpbWFsbG9jIHN0YXR1cyBvZiByZWdpb24gZGVzY3JpYmVkIGJ5IHZfYWRkciBhbmQgc2l6ZS4KLSAqIENhbiByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiBJTV9SRUdJT05fVU5VU0VEICAgLSAgRW50aXJlIHJlZ2lvbiBpcyB1bmFsbG9jYXRlZCBpbiBpbWFsbG9jIHNwYWNlLgotICogSU1fUkVHSU9OX1NVQlNFVCAtICAgIFJlZ2lvbiBpcyBhIHN1YnNldCBvZiBhIHJlZ2lvbiB0aGF0IGlzIGFscmVhZHkKLSAqIAkJCSBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqIAkJICAgICAgICAgdm0gd2lsbCBiZSBhc3NpZ25lZCB0byBhIHB0ciB0byB0aGUgcGFyZW50IHJlZ2lvbi4KLSAqIElNX1JFR0lPTl9FWElTVFMgLSAgICBFeGFjdCByZWdpb24gYWxyZWFkeSBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICB2bSB3aWxsIGJlIGFzc2lnbmVkIHRvIGEgcHRyIHRvIHRoZSBleGlzdGluZyBpbWxpc3QKLSAqICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuCi0gKiBJTV9SRUdJT05fT1ZFUkxBUFMgLSAgUmVnaW9uIG92ZXJsYXBzIGFuIGFsbG9jYXRlZCByZWdpb24gaW4gaW1hbGxvYyBzcGFjZS4KLSAqIElNX1JFR0lPTl9TVVBFUlNFVCAtICBSZWdpb24gaXMgYSBzdXBlcnNldCBvZiBhIHJlZ2lvbiB0aGF0IGlzIGFscmVhZHkKLSAqICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqLwotc3RhdGljIGludCBpbV9yZWdpb25fc3RhdHVzKHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCSAgICBzdHJ1Y3Qgdm1fc3RydWN0ICoqdm0pCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdG1wOwotCi0JZm9yICh0bXAgPSBpbWxpc3Q7IHRtcDsgdG1wID0gdG1wLT5uZXh0KQotCQlpZiAodl9hZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHRtcC0+YWRkciArIHRtcC0+c2l6ZSkKLQkJCWJyZWFrOwotCi0JKnZtID0gTlVMTDsKLQlpZiAodG1wKSB7Ci0JCWlmIChpbV9yZWdpb25fb3ZlcmxhcHModl9hZGRyLCBzaXplLCB0bXApKQotCQkJcmV0dXJuIElNX1JFR0lPTl9PVkVSTEFQOwotCi0JCSp2bSA9IHRtcDsKLQkJaWYgKGltX3JlZ2lvbl9pc19zdWJzZXQodl9hZGRyLCBzaXplLCB0bXApKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gc3VwZXJzZXQgKi8KLQkJCXJldHVybiBJTV9SRUdJT05fU1VCU0VUOwotCQl9Ci0JCWlmIChpbV9yZWdpb25faXNfc3VwZXJzZXQodl9hZGRyLCBzaXplLCB0bXApKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gZmlyc3Qgc3Vic2V0ICovCi0JCQlyZXR1cm4gSU1fUkVHSU9OX1NVUEVSU0VUOwotCQl9Ci0JCWVsc2UgaWYgKHZfYWRkciA9PSAodW5zaWduZWQgbG9uZykgdG1wLT5hZGRyICYmCi0JCSAJIHNpemUgPT0gdG1wLT5zaXplKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gZXhhY3QgcmVnaW9uICovCi0JCQlyZXR1cm4gSU1fUkVHSU9OX0VYSVNUUzsKLQkJfQotCX0KLQotCXJldHVybiBJTV9SRUdJT05fVU5VU0VEOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqIHNwbGl0X2ltX3JlZ2lvbih1bnNpZ25lZCBsb25nIHZfYWRkciwgCi0JCXVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHZtX3N0cnVjdCAqcGFyZW50KQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKnZtMSA9IE5VTEw7Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdm0yID0gTlVMTDsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICpuZXdfdm0gPSBOVUxMOwotCQotCXZtMSA9IGttYWxsb2Moc2l6ZW9mKCp2bTEpLCBHRlBfS0VSTkVMKTsKLQlpZiAodm0xCT09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmICh2X2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpIHBhcmVudC0+YWRkcikgewotCSAgICAgICAgLyogVXNlIGV4aXN0aW5nIHBhcmVudCB2bV9zdHJ1Y3QgdG8gcmVwcmVzZW50IGNoaWxkLCBhbGxvY2F0ZQotCQkgKiBuZXcgb25lIGZvciB0aGUgcmVtYWluZGVyIG9mIHBhcmVudCByYW5nZQotCQkgKi8KLQkJdm0xLT5zaXplID0gcGFyZW50LT5zaXplIC0gc2l6ZTsKLQkJdm0xLT5hZGRyID0gKHZvaWQgKikgKHZfYWRkciArIHNpemUpOwotCQl2bTEtPm5leHQgPSBwYXJlbnQtPm5leHQ7Ci0KLQkJcGFyZW50LT5zaXplID0gc2l6ZTsKLQkJcGFyZW50LT5uZXh0ID0gdm0xOwotCQluZXdfdm0gPSBwYXJlbnQ7Ci0JfSBlbHNlIGlmICh2X2FkZHIgKyBzaXplID09ICh1bnNpZ25lZCBsb25nKSBwYXJlbnQtPmFkZHIgKyAKLQkJCXBhcmVudC0+c2l6ZSkgewotCQkvKiBBbGxvY2F0ZSBuZXcgdm1fc3RydWN0IHRvIHJlcHJlc2VudCBjaGlsZCwgdXNlIGV4aXN0aW5nCi0JCSAqIHBhcmVudCBvbmUgZm9yIHJlbWFpbmRlciBvZiBwYXJlbnQgcmFuZ2UKLQkJICovCi0JCXZtMS0+c2l6ZSA9IHNpemU7Ci0JCXZtMS0+YWRkciA9ICh2b2lkICopIHZfYWRkcjsKLQkJdm0xLT5uZXh0ID0gcGFyZW50LT5uZXh0OwotCQluZXdfdm0gPSB2bTE7Ci0KLQkJcGFyZW50LT5zaXplIC09IHNpemU7Ci0JCXBhcmVudC0+bmV4dCA9IHZtMTsKLQl9IGVsc2UgewotCSAgICAgICAgLyogQWxsb2NhdGUgdHdvIG5ldyB2bV9zdHJ1Y3RzIGZvciB0aGUgbmV3IGNoaWxkIGFuZCAKLQkJICogdXBwZXJtb3N0IHJlbWFpbmRlciwgYW5kIHVzZSBleGlzdGluZyBwYXJlbnQgb25lIGZvciB0aGUKLQkJICogbG93ZXIgcmVtYWluZGVyIG9mIHBhcmVudCByYW5nZQotCQkgKi8KLQkJdm0yID0ga21hbGxvYyhzaXplb2YoKnZtMiksIEdGUF9LRVJORUwpOwotCQlpZiAodm0yID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJa2ZyZWUodm0xKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJdm0xLT5zaXplID0gc2l6ZTsKLQkJdm0xLT5hZGRyID0gKHZvaWQgKikgdl9hZGRyOwotCQl2bTEtPm5leHQgPSB2bTI7Ci0JCW5ld192bSA9IHZtMTsKLQotCQl2bTItPnNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIHBhcmVudC0+YWRkciArIHBhcmVudC0+c2l6ZSkgLSAKLQkJCQkodl9hZGRyICsgc2l6ZSk7Ci0JCXZtMi0+YWRkciA9ICh2b2lkICopIHZfYWRkciArIHNpemU7Ci0JCXZtMi0+bmV4dCA9IHBhcmVudC0+bmV4dDsKLQotCQlwYXJlbnQtPnNpemUgPSB2X2FkZHIgLSAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyOwotCQlwYXJlbnQtPm5leHQgPSB2bTE7Ci0JfQotCi0JcmV0dXJuIG5ld192bTsKLX0KLQotc3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKiBfX2FkZF9uZXdfaW1fYXJlYSh1bnNpZ25lZCBsb25nIHJlcV9hZGRyLCAKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcCwgKmFyZWE7Ci0JCQotCWZvciAocCA9ICZpbWxpc3Q7ICh0bXAgPSAqcCkgOyBwID0gJnRtcC0+bmV4dCkgewotCQlpZiAocmVxX2FkZHIgKyBzaXplIDw9ICh1bnNpZ25lZCBsb25nKXRtcC0+YWRkcikKLQkJCWJyZWFrOwotCX0KLQkKLQlhcmVhID0ga21hbGxvYyhzaXplb2YoKmFyZWEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCWFyZWEtPmZsYWdzID0gMDsKLQlhcmVhLT5hZGRyID0gKHZvaWQgKilyZXFfYWRkcjsKLQlhcmVhLT5zaXplID0gc2l6ZTsKLQlhcmVhLT5uZXh0ID0gKnA7Ci0JKnAgPSBhcmVhOwotCi0JcmV0dXJuIGFyZWE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fc3RydWN0ICogX19pbV9nZXRfYXJlYSh1bnNpZ25lZCBsb25nIHJlcV9hZGRyLCAKLQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCQlpbnQgY3JpdGVyaWEpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdG1wOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBpbV9yZWdpb25fc3RhdHVzKHJlcV9hZGRyLCBzaXplLCAmdG1wKTsKLQlpZiAoKGNyaXRlcmlhICYgc3RhdHVzKSA9PSAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgSU1fUkVHSU9OX1VOVVNFRDoKLQkJdG1wID0gX19hZGRfbmV3X2ltX2FyZWEocmVxX2FkZHIsIHNpemUpOwotCQlicmVhazsKLQljYXNlIElNX1JFR0lPTl9TVUJTRVQ6Ci0JCXRtcCA9IHNwbGl0X2ltX3JlZ2lvbihyZXFfYWRkciwgc2l6ZSwgdG1wKTsKLQkJYnJlYWs7Ci0JY2FzZSBJTV9SRUdJT05fRVhJU1RTOgotCQkvKiBSZXR1cm4gcmVxdWVzdGVkIHJlZ2lvbiAqLwotCQlicmVhazsKLQljYXNlIElNX1JFR0lPTl9TVVBFUlNFVDoKLQkJLyogUmV0dXJuIGZpcnN0IGV4aXN0aW5nIHN1YnNldCBvZiByZXF1ZXN0ZWQgcmVnaW9uICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSB1bmV4cGVjdGVkIGltYWxsb2MgcmVnaW9uIHN0YXR1c1xuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOwotCQl0bXAgPSBOVUxMOwotCX0KLQotCXJldHVybiB0bXA7Ci19Ci0KLXN0cnVjdCB2bV9zdHJ1Y3QgKiBpbV9nZXRfZnJlZV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQkKLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWlmIChnZXRfZnJlZV9pbV9hZGRyKHNpemUsICZhZGRyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgY2Fubm90IG9idGFpbiBhZGRyIGZvciBzaXplIDB4JWx4XG4iLAotCQkJCV9fRlVOQ1RJT05fXywgc2l6ZSk7Ci0JCWFyZWEgPSBOVUxMOwotCQlnb3RvIG5leHRfaW1fZG9uZTsKLQl9Ci0KLQlhcmVhID0gX19pbV9nZXRfYXJlYShhZGRyLCBzaXplLCBJTV9SRUdJT05fVU5VU0VEKTsKLQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAKLQkJICAgICAgICIlcygpIGNhbm5vdCBvYnRhaW4gYXJlYSBmb3IgYWRkciAweCVseCBzaXplIDB4JWx4XG4iLAotCQkJX19GVU5DVElPTl9fLCBhZGRyLCBzaXplKTsKLQl9Ci1uZXh0X2ltX2RvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCXJldHVybiBhcmVhOwotfQotCi1zdHJ1Y3Qgdm1fc3RydWN0ICogaW1fZ2V0X2FyZWEodW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJaW50IGNyaXRlcmlhKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWFyZWEgPSBfX2ltX2dldF9hcmVhKHZfYWRkciwgc2l6ZSwgY3JpdGVyaWEpOwotCW11dGV4X3VubG9jaygmaW1saXN0X211dGV4KTsKLQlyZXR1cm4gYXJlYTsKLX0KLQotdm9pZCBpbV9mcmVlKHZvaWQgKiBhZGRyKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKipwLCAqdG1wOwotICAKLQlpZiAoIWFkZHIpCi0JCXJldHVybjsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpIGFkZHIgJiB+UEFHRV9NQVNLKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVHJ5aW5nIHRvICVzIGJhZCBhZGRyZXNzICglcClcbiIsIF9fRlVOQ1RJT05fXywJCQlhZGRyKTsKLQkJcmV0dXJuOwotCX0KLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWZvciAocCA9ICZpbWxpc3QgOyAodG1wID0gKnApIDsgcCA9ICZ0bXAtPm5leHQpIHsKLQkJaWYgKHRtcC0+YWRkciA9PSBhZGRyKSB7Ci0JCQkqcCA9IHRtcC0+bmV4dDsKLQkJCXVubWFwX3ZtX2FyZWEodG1wKTsKLQkJCWtmcmVlKHRtcCk7Ci0JCQltdXRleF91bmxvY2soJmltbGlzdF9tdXRleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCXByaW50ayhLRVJOX0VSUiAiVHJ5aW5nIHRvICVzIG5vbmV4aXN0ZW50IGFyZWEgKCVwKVxuIiwgX19GVU5DVElPTl9fLAotCQkJYWRkcik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwppbmRleCA1ZmNlNmNjLi5lMWY1ZGVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKQEAgLTUsNyArNSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKiAgUFBDNDR4LzM2LWJpdCBjaGFuZ2VzIGJ5IE1hdHQgUG9ydGVyIChtcG9ydGVyQG12aXN0YS5jb20pCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCmluZGV4IDczMTJhMjYuLjFkNmVkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYwpAQCAtNSw3ICs1LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IDAyNjZhOTQuLmYwZTdlZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTUsNyArNSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKiAgUFBDNDR4LzM2LWJpdCBjaGFuZ2VzIGJ5IE1hdHQgUG9ydGVyIChtcG9ydGVyQG12aXN0YS5jb20pCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKQEAgLTEyOSw4ICsxMjgsNiBAQAogCXpvbmUgPSBwZ2RhdGEtPm5vZGVfem9uZXM7CiAKIAlyZXR1cm4gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKaW5kZXggNzkyMDg2Yi4uY2MzMmJhNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKQEAgLTExLDcgKzExLDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmggYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAppbmRleCAyNTU4YzM0Li5jOTRhNjRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAorKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaApAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtNDAsOCArMzksOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9yZW1hcF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGludCBydGFzX2RhdGEsIHJ0YXNfc2l6ZTsKIAotc3RydWN0IF9QVEU7Ci1leHRlcm4gc3RydWN0IF9QVEUgKkhhc2gsICpIYXNoX2VuZDsKK3N0cnVjdCBoYXNoX3B0ZTsKK2V4dGVybiBzdHJ1Y3QgaGFzaF9wdGUgKkhhc2gsICpIYXNoX2VuZDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIEhhc2hfc2l6ZSwgSGFzaF9tYXNrOwogCiBleHRlcm4gdW5zaWduZWQgaW50IG51bV90bGJjYW1fZW50cmllczsKQEAgLTkwLDE2ICs4OSw0IEBACiAJZWxzZQogCQlfdGxiaWUodmEpOwogfQotI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCi0vKiBpbWFsbG9jIHJlZ2lvbiB0eXBlcyAqLwotI2RlZmluZSBJTV9SRUdJT05fVU5VU0VECTB4MQotI2RlZmluZSBJTV9SRUdJT05fU1VCU0VUCTB4MgotI2RlZmluZSBJTV9SRUdJT05fRVhJU1RTCTB4NAotI2RlZmluZSBJTV9SRUdJT05fT1ZFUkxBUAkweDgKLSNkZWZpbmUgSU1fUkVHSU9OX1NVUEVSU0VUCTB4MTAKLQotZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKiBpbV9nZXRfZnJlZV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqIGltX2dldF9hcmVhKHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICAgICAgaW50IHJlZ2lvbl90eXBlKTsKLWV4dGVybiB2b2lkIGltX2ZyZWUodm9pZCAqYWRkcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCmluZGV4IGY2YWUxYTUuLjY0NDg4NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwpAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMzcsNyArMzYsNiBAQAogdW5zaWduZWQgbG9uZyBpb3JlbWFwX2Jhc2U7CiB1bnNpZ25lZCBsb25nIGlvcmVtYXBfYm90OwogRVhQT1JUX1NZTUJPTChpb3JlbWFwX2JvdCk7CS8qIGFrYSBWTUFMTE9DX0VORCAqLwotaW50IGlvX2JhdF9pbmRleDsKIAogI2lmIGRlZmluZWQoQ09ORklHXzZ4eCkgfHwgZGVmaW5lZChDT05GSUdfUE9XRVIzKQogI2RlZmluZSBIQVZFX0JBVFMJMQpAQCAtMzAwLDUxICsyOTgsNiBAQAogCX0KIH0KIAotLyogaXMgeCBhIHBvd2VyIG9mIDQ/ICovCi0jZGVmaW5lIGlzX3Bvd2VyX29mXzQoeCkJaXNfcG93ZXJfb2ZfMih4KSAmJiAoZmZzKHgpICYgMSkKLQotLyoKLSAqIFNldCB1cCBhIG1hcHBpbmcgZm9yIGEgYmxvY2sgb2YgSS9PLgotICogdmlydCwgcGh5cywgc2l6ZSBtdXN0IGFsbCBiZSBwYWdlLWFsaWduZWQuCi0gKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgaW9yZW1hcCBpcyBjYWxsZWQuCi0gKi8KLXZvaWQgX19pbml0IGlvX2Jsb2NrX21hcHBpbmcodW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKQotewotCWludCBpOwotCi0JaWYgKHZpcnQgPiBLRVJORUxCQVNFICYmIHZpcnQgPCBpb3JlbWFwX2JvdCkKLQkJaW9yZW1hcF9ib3QgPSBpb3JlbWFwX2Jhc2UgPSB2aXJ0OwotCi0jaWZkZWYgSEFWRV9CQVRTCi0JLyoKLQkgKiBVc2UgYSBCQVQgZm9yIHRoaXMgaWYgcG9zc2libGUuLi4KLQkgKi8KLQlpZiAoaW9fYmF0X2luZGV4IDwgMiAmJiBpc19wb3dlcl9vZl8yKHNpemUpCi0JICAgICYmICh2aXJ0ICYgKHNpemUgLSAxKSkgPT0gMCAmJiAocGh5cyAmIChzaXplIC0gMSkpID09IDApIHsKLQkJc2V0YmF0KGlvX2JhdF9pbmRleCwgdmlydCwgcGh5cywgc2l6ZSwgZmxhZ3MpOwotCQkrK2lvX2JhdF9pbmRleDsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvKiBIQVZFX0JBVFMgKi8KLQotI2lmZGVmIEhBVkVfVExCQ0FNCi0JLyoKLQkgKiBVc2UgYSBDQU0gZm9yIHRoaXMgaWYgcG9zc2libGUuLi4KLQkgKi8KLQlpZiAodGxiY2FtX2luZGV4IDwgbnVtX3RsYmNhbV9lbnRyaWVzICYmIGlzX3Bvd2VyX29mXzQoc2l6ZSkKLQkgICAgJiYgKHZpcnQgJiAoc2l6ZSAtIDEpKSA9PSAwICYmIChwaHlzICYgKHNpemUgLSAxKSkgPT0gMCkgewotCQlzZXR0bGJjYW0odGxiY2FtX2luZGV4LCB2aXJ0LCBwaHlzLCBzaXplLCBmbGFncywgMCk7Ci0JCSsrdGxiY2FtX2luZGV4OwotCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8qIEhBVkVfVExCQ0FNICovCi0KLQkvKiBObyBCQVRzIGF2YWlsYWJsZSwgcHV0IGl0IGluIHRoZSBwYWdlIHRhYmxlcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBQQUdFX1NJWkUpCi0JCW1hcF9wYWdlKHZpcnQgKyBpLCBwaHlzICsgaSwgZmxhZ3MpOwotfQotCiAvKiBTY2FuIHRoZSByZWFsIExpbnV4IHBhZ2UgdGFibGVzIGFuZCByZXR1cm4gYSBQVEUgcG9pbnRlciBmb3IKICAqIGEgdmlydHVhbCBhZGRyZXNzIGluIGEgY29udGV4dC4KICAqIFJldHVybnMgdHJ1ZSAoMSkgaWYgUFRFIHdhcyBmb3VuZCwgemVybyBvdGhlcndpc2UuICBUaGUgcG9pbnRlciB0bwpAQCAtMzc5LDgyICszMzIsNiBAQAogICAgICAgICByZXR1cm4ocmV0dmFsKTsKIH0KIAotLyogRmluZCBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGlzIHZpcnR1YWwgYWRkcmVzcy4gIE5vcm1hbGx5IHVzZWQgYnkKLSAqIEkvTyBmdW5jdGlvbnMsIGJ1dCBhbnlvbmUgY2FuIGNhbGwgaXQuCi0gKi8KLXVuc2lnbmVkIGxvbmcgaW9wYSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyBwYTsKLQotCS8qIEkgZG9uJ3Qga25vdyB3aHkgdGhpcyB3b24ndCB3b3JrIG9uIFBNYWNzIG9yIENIUlAuICBJdAotCSAqIGFwcGVhcnMgdGhlcmUgaXMgc29tZSBidWcsIG9yIHRoZXJlIGlzIHNvbWUgaW1wbGljaXQKLQkgKiBtYXBwaW5nIGRvbmUgbm90IHByb3Blcmx5IHJlcHJlc2VudGVkIGJ5IEJBVHMgb3IgaW4gcGFnZQotCSAqIHRhYmxlcy4uLi4uLi5JIGFtIGFjdGl2ZWx5IHdvcmtpbmcgb24gcmVzb2x2aW5nIHRoaXMsIGJ1dAotCSAqIGNhbid0IGhvbGQgdXAgb3RoZXIgc3R1ZmYuICAtLSBEYW4KLQkgKi8KLQlwdGVfdCAqcHRlOwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCi0JLyogQ2hlY2sgdGhlIEJBVHMgKi8KLQlwYSA9IHZfbWFwcGVkX2J5X2JhdHMoYWRkcik7Ci0JaWYgKHBhKQotCQlyZXR1cm4gcGE7Ci0KLQkvKiBBbGxvdyBtYXBwaW5nIG9mIHVzZXIgYWRkcmVzc2VzICh3aXRoaW4gdGhlIHRocmVhZCkKLQkgKiBmb3IgRE1BIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlpZiAoYWRkciA8IFRBU0tfU0laRSkKLQkJbW0gPSBjdXJyZW50LT5tbTsKLQllbHNlCi0JCW1tID0gJmluaXRfbW07Ci0KLQlwYSA9IDA7Ci0JaWYgKGdldF9wdGVwdHIobW0sIGFkZHIsICZwdGUsIE5VTEwpKSB7Ci0JCXBhID0gKHB0ZV92YWwoKnB0ZSkgJiBQQUdFX01BU0spIHwgKGFkZHIgJiB+UEFHRV9NQVNLKTsKLQkJcHRlX3VubWFwKHB0ZSk7Ci0JfQotCi0JcmV0dXJuKHBhKTsKLX0KLQotLyogVGhpcyBpcyB3aWxsIGZpbmQgdGhlIHZpcnR1YWwgYWRkcmVzcyBmb3IgYSBwaHlzaWNhbCBvbmUuLi4uCi0gKiBTd2lwZWQgZnJvbSBBUFVTLCBjb3VsZCBiZSBkYW5nZXJvdXMgOi0pLgotICogVGhpcyBpcyBvbmx5IGEgcGxhY2Vob2xkZXIgdW50aWwgSSByZWFsbHkgZmluZCBhIHdheSB0byBtYWtlIHRoaXMKLSAqIHdvcmsuICAtLSBEYW4KLSAqLwotdW5zaWduZWQgbG9uZwotbW1fcHRvdiAodW5zaWduZWQgbG9uZyBwYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLSNpZiAwCi0JaWYgKHBhZGRyIDwgMTYqMTAyNCoxMDI0KQotCQlyZXQgPSBaVFdPX1ZBRERSKHBhZGRyKTsKLQllbHNlIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGttYXBfY2h1bmtfY291bnQ7KXsKLQkJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IGttYXBfY2h1bmtzW2krK107Ci0JCQl1bnNpZ25lZCBsb25nIHNpemUgPSBrbWFwX2NodW5rc1tpKytdOwotCQkJdW5zaWduZWQgbG9uZyB2aXJ0ID0ga21hcF9jaHVua3NbaSsrXTsKLQkJCWlmIChwYWRkciA+PSBwaHlzCi0JCQkgICAgJiYgcGFkZHIgPCAocGh5cyArIHNpemUpKXsKLQkJCQlyZXQgPSB2aXJ0ICsgcGFkZHIgLSBwaHlzOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCQotCQlyZXQgPSAodW5zaWduZWQgbG9uZykgX192YShwYWRkcik7Ci0JfQotZXhpdDoKLSNpZmRlZiBERUJVR1BWCi0JcHJpbnRrICgiUFRPViglbHgpPSVseFxuIiwgcGFkZHIsIHJldCk7Ci0jZW5kaWYKLSNlbHNlCi0JcmV0ID0gKHVuc2lnbmVkIGxvbmcpcGFkZHIgKyBLRVJORUxCQVNFOwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KLQogI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKIAogc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IHBhZ2UgKnBhZ2UsIHBncHJvdF90IHByb3QpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwppbmRleCBhZDZlMTM1Li4zZGZkMTBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKQEAgLTcsNyArNyw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAc2FtYmEub3JnKQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMzQsNDEgKzMzLDI3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRyLmg+Ci0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9sbWIuaD4KLSNpbmNsdWRlIDxhc20vcnRhcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgotI2luY2x1ZGUgPGFzbS9lZWguaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL21tem9uZS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KLSNpbmNsdWRlIDxhc20vdmRzby5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogCiAjaW5jbHVkZSAibW11X2RlY2wuaCIKIAotdW5zaWduZWQgbG9uZyBpb3JlbWFwX2JvdCA9IElNQUxMT0NfQkFTRTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBoYnNfaW9fYm90ID0gUEhCU19JT19CQVNFOwordW5zaWduZWQgbG9uZyBpb3JlbWFwX2JvdCA9IElPUkVNQVBfQkFTRTsKIAogLyoKICAqIG1hcF9pb19wYWdlIGN1cnJlbnRseSBvbmx5IGNhbGxlZCBieSBfX2lvcmVtYXAKQEAgLTEwMiw4ICs4Nyw4IEBACiAJCSAqIGVudHJ5IGluIHRoZSBoYXJkd2FyZSBwYWdlIHRhYmxlLgogCQkgKgogCQkgKi8KLQkJaWYgKGh0YWJfYm9sdF9tYXBwaW5nKGVhLCBlYSArIFBBR0VfU0laRSwgcGEsIGZsYWdzLAotCQkJCSAgICAgIG1tdV9pb19wc2l6ZSkpIHsKKwkJaWYgKGh0YWJfYm9sdF9tYXBwaW5nKGVhLCAodW5zaWduZWQgbG9uZyllYSArIFBBR0VfU0laRSwKKwkJCQkgICAgICBwYSwgZmxhZ3MsIG1tdV9pb19wc2l6ZSkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGRvIGJvbHRlZCBtYXBwaW5nIElPICIKIAkJCSAgICAgICAibWVtb3J5IGF0ICUwMTZseCAhXG4iLCBwYSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTExMyw4ICs5OCwxMSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXBfY29tKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgcGEsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBzaXplLAorLyoqCisgKiBfX2lvcmVtYXBfYXQgLSBMb3cgbGV2ZWwgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBwYWdlIHRhYmxlcworICogICAgICAgICAgICAgICAgZm9yIGFuIElPIG1hcHBpbmcKKyAqLwordm9pZCBfX2lvbWVtICogX19pb3JlbWFwX2F0KHBoeXNfYWRkcl90IHBhLCB2b2lkICplYSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBpOwpAQCAtMTIyLDE3ICsxMTAsMzUgQEAKIAlpZiAoKGZsYWdzICYgX1BBR0VfUFJFU0VOVCkgPT0gMCkKIAkJZmxhZ3MgfD0gcGdwcm90X3ZhbChQQUdFX0tFUk5FTCk7CiAKKwlXQVJOX09OKHBhICYgflBBR0VfTUFTSyk7CisJV0FSTl9PTigoKHVuc2lnbmVkIGxvbmcpZWEpICYgflBBR0VfTUFTSyk7CisJV0FSTl9PTihzaXplICYgflBBR0VfTUFTSyk7CisKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBQQUdFX1NJWkUpCi0JCWlmIChtYXBfaW9fcGFnZShlYStpLCBwYStpLCBmbGFncykpCisJCWlmIChtYXBfaW9fcGFnZSgodW5zaWduZWQgbG9uZyllYStpLCBwYStpLCBmbGFncykpCiAJCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiAodm9pZCBfX2lvbWVtICopIChlYSArIChhZGRyICYgflBBR0VfTUFTSykpOworCXJldHVybiAodm9pZCBfX2lvbWVtICopZWE7Cit9CisKKy8qKgorICogX19pb3VubWFwX2Zyb20gLSBMb3cgbGV2ZWwgZnVuY3Rpb24gdG8gdGVhciBkb3duIHRoZSBwYWdlIHRhYmxlcworICogICAgICAgICAgICAgICAgICBmb3IgYW4gSU8gbWFwcGluZy4gVGhpcyBpcyB1c2VkIGZvciBtYXBwaW5ncyB0aGF0CisgKiAgICAgICAgICAgICAgICAgIGFyZSBtYW5pcHVsYXRlZCBtYW51YWxseSwgbGlrZSBwYXJ0aWFsIHVubWFwcGluZyBvZgorICogICAgICAgICAgICAgICAgICBQQ0kgSU9zIG9yIElTQSBzcGFjZS4KKyAqLwordm9pZCBfX2lvdW5tYXBfYXQodm9pZCAqZWEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlXQVJOX09OKCgodW5zaWduZWQgbG9uZyllYSkgJiB+UEFHRV9NQVNLKTsKKwlXQVJOX09OKHNpemUgJiB+UEFHRV9NQVNLKTsKKworCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZyllYSwgc2l6ZSk7CiB9CiAKIHZvaWQgX19pb21lbSAqIF9faW9yZW1hcChwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQl1bnNpZ25lZCBsb25nIHBhLCBlYTsKKwlwaHlzX2FkZHJfdCBwYWxpZ25lZDsKIAl2b2lkIF9faW9tZW0gKnJldDsKIAogCS8qCkBAIC0xNDQsMjcgKzE1MCwzMCBAQAogCSAqIElNQUxMT0NfRU5ECiAJICogCiAJICovCi0JcGEgPSBhZGRyICYgUEFHRV9NQVNLOwotCXNpemUgPSBQQUdFX0FMSUdOKGFkZHIgKyBzaXplKSAtIHBhOworCXBhbGlnbmVkID0gYWRkciAmIFBBR0VfTUFTSzsKKwlzaXplID0gUEFHRV9BTElHTihhZGRyICsgc2l6ZSkgLSBwYWxpZ25lZDsKIAotCWlmICgoc2l6ZSA9PSAwKSB8fCAocGEgPT0gMCkpCisJaWYgKChzaXplID09IDApIHx8IChwYWxpZ25lZCA9PSAwKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAobWVtX2luaXRfZG9uZSkgewogCQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCQlhcmVhID0gaW1fZ2V0X2ZyZWVfYXJlYShzaXplKTsKKworCQlhcmVhID0gX19nZXRfdm1fYXJlYShzaXplLCBWTV9JT1JFTUFQLAorCQkJCSAgICAgaW9yZW1hcF9ib3QsIElPUkVNQVBfRU5EKTsKIAkJaWYgKGFyZWEgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwotCQllYSA9ICh1bnNpZ25lZCBsb25nKShhcmVhLT5hZGRyKTsKLQkJcmV0ID0gX19pb3JlbWFwX2NvbShhZGRyLCBwYSwgZWEsIHNpemUsIGZsYWdzKTsKKwkJcmV0ID0gX19pb3JlbWFwX2F0KHBhbGlnbmVkLCBhcmVhLT5hZGRyLCBzaXplLCBmbGFncyk7CiAJCWlmICghcmV0KQotCQkJaW1fZnJlZShhcmVhLT5hZGRyKTsKKwkJCXZ1bm1hcChhcmVhLT5hZGRyKTsKIAl9IGVsc2UgewotCQllYSA9IGlvcmVtYXBfYm90OwotCQlyZXQgPSBfX2lvcmVtYXBfY29tKGFkZHIsIHBhLCBlYSwgc2l6ZSwgZmxhZ3MpOworCQlyZXQgPSBfX2lvcmVtYXBfYXQocGFsaWduZWQsICh2b2lkICopaW9yZW1hcF9ib3QsIHNpemUsIGZsYWdzKTsKIAkJaWYgKHJldCkKIAkJCWlvcmVtYXBfYm90ICs9IHNpemU7CiAJfQorCisJaWYgKHJldCkKKwkJcmV0ICs9IGFkZHIgJiB+UEFHRV9NQVNLOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE4Nyw2MiArMTk2LDkgQEAKIH0KIAogCi0jZGVmaW5lIElTX1BBR0VfQUxJR05FRChfdmFsKSAoKF92YWwpID09ICgoX3ZhbCkgJiBQQUdFX01BU0spKQotCi1pbnQgX19pb3JlbWFwX2V4cGxpY2l0KHBoeXNfYWRkcl90IHBhLCB1bnNpZ25lZCBsb25nIGVhLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0Jdm9pZCBfX2lvbWVtICpyZXQ7Ci0JCi0JLyogRm9yIG5vdywgcmVxdWlyZSBwYWdlLWFsaWduZWQgdmFsdWVzIGZvciBwYSwgZWEsIGFuZCBzaXplICovCi0JaWYgKCFJU19QQUdFX0FMSUdORUQocGEpIHx8ICFJU19QQUdFX0FMSUdORUQoZWEpIHx8Ci0JICAgICFJU19QQUdFX0FMSUdORUQoc2l6ZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCSJ1bmFsaWduZWQgdmFsdWUgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlpZiAoIW1lbV9pbml0X2RvbmUpIHsKLQkJLyogVHdvIHRoaW5ncyB0byBjb25zaWRlciBpbiB0aGlzIGNhc2U6Ci0JCSAqIDEpIE5vIHJlY29yZHMgd2lsbCBiZSBrZXB0IChpbWFsbG9jLCBldGMpIHRoYXQgdGhlIHJlZ2lvbgotCQkgKiAgICBoYXMgYmVlbiByZW1hcHBlZAotCQkgKiAyKSBJdCB3b24ndCBiZSBlYXN5IHRvIGlvdW5tYXAoKSB0aGUgcmVnaW9uIGxhdGVyIChiZWNhdXNlCi0JCSAqICAgIG9mIDEpCi0JCSAqLwotCQk7Ci0JfSBlbHNlIHsKLQkJYXJlYSA9IGltX2dldF9hcmVhKGVhLCBzaXplLAotCQkJSU1fUkVHSU9OX1VOVVNFRHxJTV9SRUdJT05fU1VCU0VUfElNX1JFR0lPTl9FWElTVFMpOwotCQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCQkvKiBFeHBlY3RlZCB3aGVuIFBIQi1kbHBhciBpcyBpbiBwbGF5ICovCi0JCQlyZXR1cm4gMTsKLQkJfQotCQlpZiAoZWEgIT0gKHVuc2lnbmVkIGxvbmcpIGFyZWEtPmFkZHIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBhZGRyIHJldHVybiBmcm9tICIKLQkJCSAgICAgICAiaW1fZ2V0X2FyZWFcbiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JCi0JcmV0ID0gX19pb3JlbWFwX2NvbShwYSwgcGEsIGVhLCBzaXplLCBmbGFncyk7Ci0JaWYgKHJldCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW9yZW1hcF9leHBsaWNpdCgpIGFsbG9jYXRpb24gZmFpbHVyZSAhXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChyZXQgIT0gKHZvaWQgKikgZWEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJfX2lvcmVtYXBfY29tKCkgcmV0dXJuZWQgdW5leHBlY3RlZCBhZGRyXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qICAKICAqIFVubWFwIGFuIElPIHJlZ2lvbiBhbmQgcmVtb3ZlIGl0IGZyb20gaW1hbGxvYydkIGxpc3QuCiAgKiBBY2Nlc3MgdG8gSU8gbWVtb3J5IHNob3VsZCBiZSBzZXJpYWxpemVkIGJ5IGRyaXZlci4KLSAqIFRoaXMgY29kZSBpcyBtb2RlbGVkIGFmdGVyIHZtYWxsb2MgY29kZSAtIHVubWFwX3ZtX2FyZWEoKQotICoKLSAqIFhYWAl3aGF0IGFib3V0IGNhbGxzIGJlZm9yZSBtZW1faW5pdF9kb25lIChpZSBweXRob25fY291bnRlcm1lYXN1cmVzKCkpCiAgKi8KIHZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqdG9rZW4pCiB7CkBAIC0yNTEsOSArMjA3LDE0IEBACiAJaWYgKCFtZW1faW5pdF9kb25lKQogCQlyZXR1cm47CiAJCi0JYWRkciA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSB0b2tlbiAmIFBBR0VfTUFTSyk7Ci0KLQlpbV9mcmVlKGFkZHIpOworCWFkZHIgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcgX19mb3JjZSkKKwkJCSBQQ0lfRklYX0FERFIodG9rZW4pICYgUEFHRV9NQVNLKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpYWRkciA8IGlvcmVtYXBfYm90KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkF0dGVtcHQgdG8gaW91bm1hcCBlYXJseSBib2x0ZWQgbWFwcGluZyIKKwkJICAgICAgICIgYXQgMHglcFxuIiwgYWRkcik7CisJCXJldHVybjsKKwl9CisJdnVubWFwKGFkZHIpOwogfQogCiB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0b2tlbikKQEAgLTI2NCw3NyArMjI1LDggQEAKIAkJX19pb3VubWFwKHRva2VuKTsKIH0KIAotc3RhdGljIGludCBpb3VubWFwX3N1YnNldF9yZWdpb25zKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQkvKiBDaGVjayB3aGV0aGVyIHN1YnNldHMgb2YgdGhpcyByZWdpb24gZXhpc3QgKi8KLQlhcmVhID0gaW1fZ2V0X2FyZWEoYWRkciwgc2l6ZSwgSU1fUkVHSU9OX1NVUEVSU0VUKTsKLQlpZiAoYXJlYSA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCXdoaWxlIChhcmVhKSB7Ci0JCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBhcmVhLT5hZGRyKTsKLQkJYXJlYSA9IGltX2dldF9hcmVhKGFkZHIsIHNpemUsCi0JCQkJSU1fUkVHSU9OX1NVUEVSU0VUKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW91bm1hcF9leHBsaWNpdCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JaW50IHJjOwotCQotCWFkZHIgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSBzdGFydCAmIFBBR0VfTUFTSzsKLQotCS8qIFZlcmlmeSB0aGF0IHRoZSByZWdpb24gZWl0aGVyIGV4aXN0cyBvciBpcyBhIHN1YnNldCBvZiBhbiBleGlzdGluZwotCSAqIHJlZ2lvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgc3BsaXQgdGhlIHBhcmVudCByZWdpb24gdG8gY3JlYXRlIAotCSAqIHRoZSBleGFjdCByZWdpb24gCi0JICovCi0JYXJlYSA9IGltX2dldF9hcmVhKGFkZHIsIHNpemUsIAotCQkJICAgIElNX1JFR0lPTl9FWElTVFMgfCBJTV9SRUdJT05fU1VCU0VUKTsKLQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCS8qIERldGVybWluZSB3aGV0aGVyIHN1YnNldCByZWdpb25zIGV4aXN0LiAgSWYgc28sIHVubWFwICovCi0JCXJjID0gaW91bm1hcF9zdWJzZXRfcmVnaW9ucyhhZGRyLCBzaXplKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXMoKSBjYW5ub3QgdW5tYXAgbm9uZXhpc3RlbnQgcmFuZ2UgMHglbHhcbiIsCi0gCQkJCV9fRlVOQ1RJT05fXywgYWRkcik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBhcmVhLT5hZGRyKTsKLQl9Ci0JLyoKLQkgKiBGSVhNRSEgVGhpcyBjYW4ndCBiZSByaWdodDoKLQlpb3VubWFwKGFyZWEtPmFkZHIpOwotCSAqIE1heWJlIGl0IHNob3VsZCBiZSAiaW91bm1hcChhcmVhKTsiCi0JICovCi0JcmV0dXJuIDA7Ci19Ci0KIEVYUE9SVF9TWU1CT0woaW9yZW1hcCk7CiBFWFBPUlRfU1lNQk9MKGlvcmVtYXBfZmxhZ3MpOwogRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwogRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKIEVYUE9SVF9TWU1CT0woX19pb3VubWFwKTsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhwaGJfaW9fbG9jayk7Ci0KLXZvaWQgX19pb21lbSAqIHJlc2VydmVfcGhiX2lvc3BhY2UodW5zaWduZWQgbG9uZyBzaXplKQotewotCXZvaWQgX19pb21lbSAqdmlydF9hZGRyOwotCQkKLQlpZiAocGhic19pb19ib3QgPj0gSU1BTExPQ19CQVNFKSAKLQkJcGFuaWMoInJlc2VydmVfcGhiX2lvc3BhY2UoKTogcGhiIGlvIHNwYWNlIG92ZXJmbG93XG4iKTsKLQkJCQotCXNwaW5fbG9jaygmcGhiX2lvX2xvY2spOwotCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgcGhic19pb19ib3Q7Ci0JcGhic19pb19ib3QgKz0gc2l6ZTsKLQlzcGluX3VubG9jaygmcGhiX2lvX2xvY2spOwotCi0JcmV0dXJuIHZpcnRfYWRkcjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcHBjX21tdV8zMi5jCmluZGV4IGVjMTQyMWEuLjVjNDVkNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BwY19tbXVfMzIuYwpAQCAtMTEsNyArMTEsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCkBAIC0zNSwxMiArMzQsMTIgQEAKIAogI2luY2x1ZGUgIm1tdV9kZWNsLmgiCiAKLVBURSAqSGFzaCwgKkhhc2hfZW5kOworc3RydWN0IGhhc2hfcHRlICpIYXNoLCAqSGFzaF9lbmQ7CiB1bnNpZ25lZCBsb25nIEhhc2hfc2l6ZSwgSGFzaF9tYXNrOwogdW5zaWduZWQgbG9uZyBfU0RSMTsKIAogdW5pb24gdWJhdCB7CQkJLyogQkFUIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSBsb2FkZWQgKi8KLQlCQVQJYmF0OworCXN0cnVjdCBwcGNfYmF0IGJhdDsKIAl1MzIJd29yZFsyXTsKIH0gQkFUU1s4XVsyXTsJCQkvKiA4IHBhaXJzIG9mIElCQVQsIERCQVQgKi8KIApAQCAtMjQ1LDcgKzI0NCw3IEBACiAJY2FjaGVhYmxlX21lbXplcm8oSGFzaCwgSGFzaF9zaXplKTsKIAlfU0RSMSA9IF9fcGEoSGFzaCkgfCBTRFIxX0xPV19CSVRTOwogCi0JSGFzaF9lbmQgPSAoUFRFICopICgodW5zaWduZWQgbG9uZylIYXNoICsgSGFzaF9zaXplKTsKKwlIYXNoX2VuZCA9IChzdHJ1Y3QgaGFzaF9wdGUgKikgKCh1bnNpZ25lZCBsb25nKUhhc2ggKyBIYXNoX3NpemUpOwogCiAJcHJpbnRrKCJUb3RhbCBtZW1vcnkgPSAlbGRNQjsgdXNpbmcgJWxka0IgZm9yIGhhc2ggdGFibGUgKGF0ICVwKVxuIiwKIAkgICAgICAgdG90YWxfbWVtb3J5ID4+IDIwLCBIYXNoX3NpemUgPj4gMTAsIEhhc2gpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYyBiL2FyY2gvcG93ZXJwYy9tbS9zdGFiLmMKaW5kZXggMTMyYzZiYy4uMjg0OTJiYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jCkBAIC01NSw3ICs1NSw3IEBACiAJCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IDg7IGVudHJ5KyssIHN0ZSsrKSB7CiAJCQlpZiAoIShzdGUtPmVzaWRfZGF0YSAmIFNURV9FU0lEX1YpKSB7CiAJCQkJc3RlLT52c2lkX2RhdGEgPSB2c2lkX2RhdGE7Ci0JCQkJYXNtIHZvbGF0aWxlKCJlaWVpbyI6OjoibWVtb3J5Iik7CisJCQkJZWllaW8oKTsKIAkJCQlzdGUtPmVzaWRfZGF0YSA9IGVzaWRfZGF0YTsKIAkJCQlyZXR1cm4gKGdsb2JhbF9lbnRyeSB8IGVudHJ5KTsKIAkJCX0KQEAgLTEwMSw3ICsxMDEsNyBAQAogCWFzbSB2b2xhdGlsZSgic3luYyIgOiA6IDogIm1lbW9yeSIpOyAgICAvKiBPcmRlciB1cGRhdGUgKi8KIAogCWNhc3RvdXRfc3RlLT52c2lkX2RhdGEgPSB2c2lkX2RhdGE7Ci0JYXNtIHZvbGF0aWxlKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOyAgIC8qIE9yZGVyIHVwZGF0ZSAqLworCWVpZWlvKCk7CQkJCS8qIE9yZGVyIHVwZGF0ZSAqLwogCWNhc3RvdXRfc3RlLT5lc2lkX2RhdGEgPSBlc2lkX2RhdGE7CiAKIAlhc20gdm9sYXRpbGUoInNsYmllICAlMCIgOiA6ICJyIiAob2xkX2VzaWQgPDwgU0lEX1NISUZUKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMKaW5kZXggNmE2OTQxNy4uMDZjN2U3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYwpAQCAtMTEsNyArMTEsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMKaW5kZXggMmJmYzRkNy4uY2JkMzRmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYwpAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMjM5LDMgKzIzOCw1OSBAQAogCXB0ZV9mcmVlX3N1Ym1pdCgqYmF0Y2hwKTsKIAkqYmF0Y2hwID0gTlVMTDsKIH0KKworLyoqCisgKiBfX2ZsdXNoX2hhc2hfdGFibGVfcmFuZ2UgLSBGbHVzaCBhbGwgSFBURXMgZm9yIGEgZ2l2ZW4gYWRkcmVzcyByYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgaGFzaCB0YWJsZSAoYW5kIHRoZSBUTEIpLiBCdXQga2VlcHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW51eCBQVEVzIGludGFjdC4KKyAqCisgKiBAbW0JCTogbW1fc3RydWN0IG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZSAoZ2VuZXJhbGx5IGluaXRfbW0pCisgKiBAc3RhcnQJOiBzdGFydGluZyBhZGRyZXNzCisgKiBAZW5kICAgICAgICAgOiBlbmRpbmcgYWRkcmVzcyAobm90IGluY2x1ZGVkIGluIHRoZSBmbHVzaCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3RseSB0byBiZSB1c2VkIGJ5IHNvbWUgSU8gaG90cGx1ZyBjb2RlIGluIG9yZGVyCisgKiB0byByZW1vdmUgYWxsIGhhc2ggZW50cmllcyBmcm9tIGEgZ2l2ZW4gYWRkcmVzcyByYW5nZSB1c2VkIHRvIG1hcCBJTworICogc3BhY2Ugb24gYSByZW1vdmVkIFBDSS1QQ0kgYmlkZ2Ugd2l0aG91dCB0ZWFyaW5nIGRvd24gdGhlIGZ1bGwgbWFwcGluZworICogc2luY2UgNjRLIHBhZ2VzIG1heSBvdmVybGFwIHdpdGggb3RoZXIgYnJpZGdlcyB3aGVuIHVzaW5nIDY0SyBwYWdlcworICogd2l0aCA0SyBIVyBwYWdlcyBvbiBJTyBzcGFjZS4KKyAqCisgKiBCZWNhdXNlIG9mIHRoYXQgdXNhZ2UgcGF0dGVybiwgaXQncyBvbmx5IGF2YWlsYWJsZSB3aXRoIENPTkZJR19IT1RQTFVHCisgKiBhbmQgaXMgaW1wbGVtZW50ZWQgZm9yIHNtYWxsIHNpemUgcmF0aGVyIHRoYW4gc3BlZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfSE9UUExVRworCit2b2lkIF9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdGFydCA9IF9BTElHTl9ET1dOKHN0YXJ0LCBQQUdFX1NJWkUpOworCWVuZCA9IF9BTElHTl9VUChlbmQsIFBBR0VfU0laRSk7CisKKwlCVUdfT04oIW1tLT5wZ2QpOworCisJLyogTm90ZTogTm9ybWFsbHksIHdlIHNob3VsZCBvbmx5IGV2ZXIgdXNlIGEgYmF0Y2ggd2l0aGluIGEKKwkgKiBQVEUgbG9ja2VkIHNlY3Rpb24uIFRoaXMgdmlvbGF0ZXMgdGhlIHJ1bGUsIGJ1dCB3aWxsIHdvcmsKKwkgKiBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseSBtb2RpZnkgdGhlIFBURXMsIHdlIGp1c3QgZmx1c2ggdGhlCisJICogaGFzaCB3aGlsZSBsZWF2aW5nIHRoZSBQVEVzIGludGFjdCAoaW5jbHVkaW5nIHRoZWlyIHJlZmVyZW5jZQorCSAqIHRvIGJlaW5nIGhhc2hlZCkuIFRoaXMgaXMgbm90IHRoZSBtb3N0IHBlcmZvcm1hbmNlIG9yaWVudGVkCisJICogd2F5IHRvIGRvIHRoaW5ncyBidXQgaXMgZmluZSBmb3Igb3VyIG5lZWRzIGhlcmUuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOworCWZvciAoOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gUEFHRV9TSVpFKSB7CisJCXB0ZV90ICpwdGVwID0gZmluZF9saW51eF9wdGUobW0tPnBnZCwgc3RhcnQpOworCQl1bnNpZ25lZCBsb25nIHB0ZTsKKworCQlpZiAocHRlcCA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXB0ZSA9IHB0ZV92YWwoKnB0ZXApOworCQlpZiAoIShwdGUgJiBfUEFHRV9IQVNIUFRFKSkKKwkJCWNvbnRpbnVlOworCQlocHRlX25lZWRfZmx1c2gobW0sIHN0YXJ0LCBwdGVwLCBwdGUsIDApOworCX0KKwlhcmNoX2xlYXZlX2xhenlfbW11X21vZGUoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVRyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCmluZGV4IGZlNTk3YTEuLmE3YzIwNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKQEAgLTEsNSArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQorICogQWRkZWQgbW1jcmFbc2xvdF0gc3VwcG9ydDoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFdpbGwgU2NobWlkdCA8d2lsbHNjaG1AdXMuaWJtLmNvbT4sIElCTQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0xODEsMTEgKzE4MywxNyBAQAogICogT24gR1EgYW5kIG5ld2VyIHRoZSBNTUNSQSBzdG9yZXMgdGhlIEhWIGFuZCBQUiBiaXRzIGF0IHRoZSB0aW1lCiAgKiB0aGUgU0lBUiB3YXMgc2FtcGxlZC4gV2UgdXNlIHRoYXQgdG8gd29yayBvdXQgaWYgdGhlIFNJQVIgd2FzIHNhbXBsZWQgaW4KICAqIHRoZSBoeXBlcnZpc29yLCBvdXIgZXhjZXB0aW9uIHZlY3RvcnMgb3IgUlRBUy4KKyAqIElmIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBpcyBzZXQsIHdlIGNhbiB1c2UgdGhlIE1NQ1JBW3Nsb3RdIGJpdHMKKyAqIHRvIG1vcmUgYWNjdXJhdGVseSBpZGVudGlmeSB0aGUgYWRkcmVzcyBvZiB0aGUgc2FtcGxlZCBpbnN0cnVjdGlvbi4gVGhlCisgKiBtbWNyYVtzbG90XSBiaXRzIHJlcHJlc2VudCB0aGUgc2xvdCBudW1iZXIgb2YgYSBzYW1wbGVkIGluc3RydWN0aW9uCisgKiB3aXRoaW4gYW4gaW5zdHJ1Y3Rpb24gZ3JvdXAuICBUaGUgc2xvdCB3aWxsIGNvbnRhaW4gYSB2YWx1ZSBiZXR3ZWVuIDEKKyAqIGFuZCA1IGlmIE1NQ1JBX1NBTVBMRV9FTkFCTEUgaXMgc2V0LCBvdGhlcndpc2UgMC4KICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgcGMgPSBtZnNwcihTUFJOX1NJQVIpOwogCXVuc2lnbmVkIGxvbmcgbW1jcmE7CisJdW5zaWduZWQgbG9uZyBzbG90OwogCiAJLyogQ2FudCBkbyBtdWNoIGFib3V0IGl0ICovCiAJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX21tY3JhX3NpaHYpCkBAIC0xOTMsNiArMjAxLDEyIEBACiAKIAltbWNyYSA9IG1mc3ByKFNQUk5fTU1DUkEpOwogCisJaWYgKG1tY3JhICYgTU1DUkFfU0FNUExFX0VOQUJMRSkgeworCQlzbG90ID0gKChtbWNyYSAmIE1NQ1JBX1NMT1QpID4+IE1NQ1JBX1NMT1RfU0hJRlQpOworCQlpZiAoc2xvdCA+IDEpCisJCQlwYyArPSA0ICogKHNsb3QgLSAxKTsKKwl9CisKIAkvKiBXZXJlIHdlIGluIHRoZSBoeXBlcnZpc29yPyAqLwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpICYmCiAJICAgIChtbWNyYSAmIGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfbW1jcmFfc2lodikpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2EuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCmluZGV4IGY1OTFhOWYuLjRiZTZlN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCkBAIC01NCw3ICs1NCw3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IChvZmZzZXQgJiAweGZmKSB8ICgoZGV2Zm4gJiAweGZmKSA8PCA4KQogCSAgICB8ICgoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+Zmlyc3RfYnVzbm8pICYgMHhmZikgPDwgMTYpCi0JICAgIHwgKGhvc2UtPmluZGV4IDw8IDI0KTsKKwkgICAgfCAoaG9zZS0+Z2xvYmFsX251bWJlciA8PCAyNCk7CiAJaW50IHJldCA9IC0xOwogCWludCBydmFsOwogCkBAIC02OSw3ICs2OSw3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IChvZmZzZXQgJiAweGZmKSB8ICgoZGV2Zm4gJiAweGZmKSA8PCA4KQogCSAgICB8ICgoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+Zmlyc3RfYnVzbm8pICYgMHhmZikgPDwgMTYpCi0JICAgIHwgKGhvc2UtPmluZGV4IDw8IDI0KTsKKwkgICAgfCAoaG9zZS0+Z2xvYmFsX251bWJlciA8PCAyNCk7CiAJaW50IHJ2YWw7CiAKIAlydmFsID0gcnRhc19jYWxsKHJ0YXNfdG9rZW4oIndyaXRlLXBjaS1jb25maWciKSwgMywgMSwgTlVMTCwKQEAgLTgzLDcgKzgzLDcgQEAKIH07CiAKIAotdm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBlZmlrYV9wY2lzZXR1cCh2b2lkKQogewogCWNvbnN0IGludCAqYnVzX3JhbmdlOwogCWludCBsZW47CkBAIC0xMjgsNyArMTI4LDcgQEAKIAlwcmludGsoIiBjb250cm9sbGVkIGJ5ICVzXG4iLCBwY2ljdHJsLT5mdWxsX25hbWUpOwogCXByaW50aygiXG4iKTsKIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG9mX25vZGVfZ2V0KHBjaWN0cmwpKTsKIAlpZiAoIWhvc2UpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBFRklLQV9QTEFURk9STV9OQU1FCiAJCSAgICAgICAiOiBDYW4ndCBhbGxvY2F0ZSBQQ0kgY29udHJvbGxlciBzdHJ1Y3R1cmUgZm9yICVzXG4iLApAQCAtMTM2LDcgKzEzNiw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlob3NlLT5hcmNoX2RhdGEgPSBvZl9ub2RlX2dldChwY2ljdHJsKTsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZVswXTsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlWzFdOwogCWhvc2UtPm9wcyA9ICZydGFzX3BjaV9vcHM7CkBAIC0xNDUsNyArMTQ0LDcgQEAKIH0KIAogI2Vsc2UKLXZvaWQgX19pbml0IGVmaWthX3BjaXNldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCkKIHt9CiAjZW5kaWYKIApAQCAtMjUyLDYgKzI1MSw4IEBACiAJLnByb2dyZXNzCQk9IHJ0YXNfcHJvZ3Jlc3MsCiAJLmdldF9ib290X3RpbWUJCT0gcnRhc19nZXRfYm9vdF90aW1lLAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorI2lmZGVmIENPTkZJR19QQ0kKIAkucGh5c19tZW1fYWNjZXNzX3Byb3QJPSBwY2lfcGh5c19tZW1fYWNjZXNzX3Byb3QsCisjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKaW5kZXggMWNmYzAwZC4uNWM0NmU4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiB9CiAKLXZvaWQgbGl0ZTUyMDBfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3N0YXRpYyB2b2lkIGxpdGU1MjAwX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiAJc3RydWN0IGRldmljZV9ub2RlKiBucCA9IG9mX2ZpbmRfYWxsX25vZGVzKE5VTEwpOwogCWNvbnN0IGNoYXIgKm1vZGVsID0gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKaW5kZXggMzRkMzRhMi4uNGM2YzgyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKQEAgLTExMiwxOCArMTEyLDE4IEBACiAJdTMyIHZhbHVlOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIsCiAJCSgxIDw8IDMxKSB8Ci0JCSgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikgfAorCQkoYnVzLT5udW1iZXIgPDwgMTYpIHwKIAkJKGRldmZuIDw8IDgpIHwKIAkJKG9mZnNldCAmIDB4ZmMpKTsKIAltYigpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX01QQzUyMDBfQlVHRklYKQotCWlmIChidXMtPm51bWJlciAhPSBob3NlLT5idXNfb2Zmc2V0KSB7CisJaWYgKGJ1cy0+bnVtYmVyKSB7CiAJCS8qIHdvcmthcm91bmQgZm9yIHRoZSBidWcgNDM1IG9mIHRoZSBNUEM1MjAwIChMMjVSKTsKIAkJICogRG9uJ3QgZG8gMzIgYml0cyBjb25maWcgYWNjZXNzIGR1cmluZyB0eXBlLTEgY3ljbGVzICovCiAJCXN3aXRjaCAobGVuKSB7CkBAIC0xNjksMTggKzE2OSwxOCBAQAogCXUzMiB2YWx1ZSwgbWFzazsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2Zm4pKQogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAogCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyLAogCQkoMSA8PCAzMSkgfAotCQkoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpIHwKKwkJKGJ1cy0+bnVtYmVyIDw8IDE2KSB8CiAJCShkZXZmbiA8PCA4KSB8CiAJCShvZmZzZXQgJiAweGZjKSk7CiAJbWIoKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NUEM1MjAwX0JVR0ZJWCkKLQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+YnVzX29mZnNldCkgeworCWlmIChidXMtPm51bWJlcikgewogCQkvKiB3b3JrYXJvdW5kIGZvciB0aGUgYnVnIDQzNSBvZiB0aGUgTVBDNTIwMCAoTDI1Uik7CiAJCSAqIERvbid0IGRvIDMyIGJpdHMgY29uZmlnIGFjY2VzcyBkdXJpbmcgdHlwZS0xIGN5Y2xlcyAqLwogCQlzd2l0Y2ggKGxlbikgewpAQCAtMzg1LDE3ICszODUsMTMgQEAKIAkgKiB0cmVlIGFyZSBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSA1Mnh4IFBDSSBjb250cm9sbGVyLiAgUmF0aGVyCiAJICogdGhhbiBwYXJzZSB0aGUgdHJlZSBoZXJlLCBsZXQgcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcygpCiAJICogZG8gaXQgZm9yIHVzIGFuZCBleHRyYWN0IHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIGZhY3QgKi8KLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihub2RlKTsKIAlpZiAoIWhvc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaG9zZS0+YXJjaF9kYXRhID0gbm9kZTsKLQlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOwotCiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAwOwogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwogCi0JaG9zZS0+YnVzX29mZnNldCA9IDA7CiAJaG9zZS0+b3BzID0gJm1wYzUyeHhfcGNpX29wczsKIAogCXBjaV9yZWdzID0gaW9yZW1hcChyc3JjLnN0YXJ0LCByc3JjLmVuZCAtIHJzcmMuc3RhcnQgKyAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wbS5jCmluZGV4IGZkNDAwNDQuLmVlMmU3NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcG0uYwpAQCAtOSw4ICs5LDggQEAKIAogCiAvKiB0aGVzZSBhcmUgZGVmaW5lZCBpbiBtcGM1Mnh4X3NsZWVwLlMsIGFuZCBvbmx5IHVzZWQgaGVyZSAqLwotZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kZWVwX3NsZWVwKHZvaWQgKnNyYW0sIHZvaWQgKnNkcmFtX3JlZ3MsCi0JCXN0cnVjdCBtcGM1Mnh4X2NkbSAqLCBzdHJ1Y3QgbXBjNTJ4eF9pbnRyICopOworZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kZWVwX3NsZWVwKHZvaWQgX19pb21lbSAqc3JhbSwgdm9pZCBfX2lvbWVtICpzZHJhbV9yZWdzLAorCQlzdHJ1Y3QgbXBjNTJ4eF9jZG0gX19pb21lbSAqLCBzdHJ1Y3QgbXBjNTJ4eF9pbnRyIF9faW9tZW0qKTsKIGV4dGVybiB2b2lkIG1wYzUyeHhfZHNfc3JhbSh2b2lkKTsKIGV4dGVybiBjb25zdCBsb25nIG1wYzUyeHhfZHNfc3JhbV9zaXplOwogZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kc19jYWNoZWQodm9pZCk7CkBAIC0yMSw3ICsyMSw3IEBACiBzdGF0aWMgc3RydWN0IG1wYzUyeHhfY2RtIF9faW9tZW0gKmNkbTsKIHN0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9pbnRyIF9faW9tZW0gKmludHI7CiBzdGF0aWMgc3RydWN0IG1wYzUyeHhfZ3Bpb193a3VwIF9faW9tZW0gKmdwaW93Owotc3RhdGljIHZvaWQgKnNyYW07CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzcmFtOwogc3RhdGljIGludCBzcmFtX3NpemU7CiAKIHN0cnVjdCBtcGM1Mnh4X3N1c3BlbmQgbXBjNTJ4eF9zdXNwZW5kOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJdTMyIGNsa19lbmFibGVzOwogCXUzMiBtc3IsIGhpZDA7CiAJdTMyIGludHJfbWFpbl9tYXNrOwotCXZvaWQgX19pb21lbSAqIGlycV8weDUwMCA9ICh2b2lkICopQ09ORklHX0tFUk5FTF9TVEFSVCArIDB4NTAwOworCXZvaWQgX19pb21lbSAqIGlycV8weDUwMCA9ICh2b2lkIF9faW9tZW0gKilDT05GSUdfS0VSTkVMX1NUQVJUICsgMHg1MDA7CiAJdW5zaWduZWQgbG9uZyBpcnFfMHg1MDBfc3RvcCA9ICh1bnNpZ25lZCBsb25nKWlycV8weDUwMCArIG1wYzUyeHhfZHNfY2FjaGVkX3NpemU7CiAJY2hhciBzYXZlZF8weDUwMFttcGM1Mnh4X2RzX2NhY2hlZF9zaXplXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwppbmRleCBkZTdmY2U5Li44OWZkZTQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKIGNob2ljZQotCXByb21wdCAiTWFjaGluZSBUeXBlIgorCXByb21wdCAiODJ4eCBCb2FyZCBUeXBlIgogCWRlcGVuZHMgb24gUFBDXzgyeHgKIAlkZWZhdWx0IE1QQzgyeHhfQURTCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4Mnh4X2Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKaW5kZXggNDdjYjA5Zi4uZGEyMDgzMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mc19lbmV0X3BkLmg+CiAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgotI2luY2x1ZGUgPC4uL3N5c2Rldi9jcG0yX3BpYy5oPgorI2luY2x1ZGUgPHN5c2Rldi9jcG0yX3BpYy5oPgogCiAjaW5jbHVkZSAicHEyYWRzLmgiCiAKQEAgLTUwNyw3ICs1MDcsOCBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBtODJ4eF9wY2lfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIGludCBtODJ4eF9wY2lfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtNTE1LDcgKzUxNiw3IEBACiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CiAKLXZvaWQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4Mnh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTU0MiwxOSArNTQzLDEzIEBACiAKIAlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CiAKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihucCk7CiAKIAlpZiAoIWhvc2UpCiAJCXJldHVybjsKIAotCWhvc2UtPmFyY2hfZGF0YSA9IG5wOwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7Ci0KIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7Ci0JaG9zZS0+YnVzX29mZnNldCA9IDA7Ci0KLQlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOwogCiAJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsCiAJCQkgICByLnN0YXJ0ICsgb2Zmc2V0b2YocGNpX2NwbTJfdCwgcGNpX2NmZ19hZGRyKSwKQEAgLTU4NCw3ICs1NzksNyBAQAogI2lmZGVmIENPTkZJR19QQ0kKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbTgyeHhfcGNpX2V4Y2x1ZGVfZGV2aWNlOwogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzgyeHhfYWRkX2JyaWRnZShucCk7CiAKIAlvZl9ub2RlX3B1dChucCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKaW5kZXggMTljYWZkZi4uZWMzMDVmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjaG9pY2UKLQlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlwcm9tcHQgIjgzeHggQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIFBQQ184M3h4CiAJZGVmYXVsdCBNUEM4MzR4X01EUwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKaW5kZXggMzFhOTFiNS4uNWE5OGY4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBQb3dlclBDIDgzeHggbGludXgga2VybmVsLgogIwotb2JqLXkJCQkJOj0gbWlzYy5vCitvYmoteQkJCQk6PSBtaXNjLm8gdXNiLm8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubwogb2JqLSQoQ09ORklHX01QQzgzMTNfUkRCKQkrPSBtcGM4MzEzX3JkYi5vCiBvYmotJChDT05GSUdfTVBDODMyeF9SREIpCSs9IG1wYzgzMnhfcmRiLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzEzX3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKaW5kZXggOTY5NzBhYy4uM2VkZmUxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKQEAgLTI4LDExICsyOCw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC00OSwxMCArNDQsMTEgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKKwltcGM4MzF4X3VzYl9jZmcoKTsKIH0KIAogdm9pZCBfX2luaXQgbXBjODMxM19yZGJfaW5pdF9JUlEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKaW5kZXggOTQ4NDNlZC4uYjM5Y2I1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKQEAgLTQ5LDExICs0OSw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiBzdGF0aWMgdTggKmJjc3JfcmVncyA9IE5VTEw7CiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODAsNyArNzUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwppbmRleCAzZGI2OGI3Li5iMmIyOGE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwpAQCAtMzIsMTEgKzMyLDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKQEAgLTUzLDcgKzQ4LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKaW5kZXggNDBhMDE5NC4uNDdiYTU0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKQEAgLTM4LDExICszOCw2IEBACiAKICNpbmNsdWRlICJtcGM4M3h4LmgiCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci0jZW5kaWYKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtNTksMTAgKzU0LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCisKKwltcGM4MzR4X3VzYl9jZmcoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNHhfaXR4X2luaXRfSVJRKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCmluZGV4IDEwMzk0YjIuLjRjOWZmOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCkBAIC0zOCw2MSArMzgsMTcgQEAKIAogI2luY2x1ZGUgIm1wYzgzeHguaCIKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAjZGVmaW5lIEJDU1I1X0lOVF9VU0IJCTB4MDIKLS8qIE5vdGU6IFRoaXMgaXMgb25seSBmb3IgUEIsIG5vdCBmb3IgUEIrUElCCi0gKiBPbiBQQiBvbmx5IHBvcnQwIGlzIGNvbm5lY3RlZCB1c2luZyBVTFBJICovCi1zdGF0aWMgaW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKQorc3RhdGljIGludCBtcGM4MzR4ZW1kc191c2JfY2ZnKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBzY2NyLCBzaWNybDsKLQl2b2lkIF9faW9tZW0gKmltbWFwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJdm9pZCBfX2lvbWVtICpiY3NyX3JlZ3MgPSBOVUxMOwogCXU4IGJjc3I1OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwotCWludCBwb3J0MF9pc19kciA9IDA7CiAKLQlpZiAoKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1kciIpKSAhPSBOVUxMKQotCQlwb3J0MF9pc19kciA9IDE7Ci0JaWYgKChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJ1c2IiLCAiZnNsLXVzYjItbXBoIikpICE9IE5VTEwpewotCQlpZiAocG9ydDBfaXNfZHIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkiVGhlcmUgaXMgb25seSBvbmUgVVNCIHBvcnQgb24gUEIgYm9hcmQhIFxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSBpZiAoIXBvcnQwX2lzX2RyKQotCQkJLyogTm8gdXNiIHBvcnQgZW5hYmxlZCAqLwotCQkJcmV0dXJuIC0xOwotCX0KLQotCWltbWFwID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSwgMHgxMDAwKTsKLQlpZiAoIWltbWFwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDb25maWd1cmUgY2xvY2sgKi8KLQlzY2NyID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTKTsKLQlpZiAocG9ydDBfaXNfZHIpCi0JCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9EUkNNXzExOyAgLyogMTozICovCi0JZWxzZQotCQlzY2NyIHw9IE1QQzgzWFhfU0NDUl9VU0JfTVBIQ01fMTE7IC8qIDE6MyAqLwotCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMsIHNjY3IpOwotCi0JLyogQ29uZmlndXJlIFBpbiAqLwotCXNpY3JsID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUyk7Ci0JLyogc2V0IHBvcnQwIG9ubHkgKi8KLQlpZiAocG9ydDBfaXNfZHIpCi0JCXNpY3JsIHw9IE1QQzgzWFhfU0lDUkxfVVNCMDsKLQllbHNlCi0JCXNpY3JsICY9IH4oTVBDODNYWF9TSUNSTF9VU0IwKTsKLQlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUywgc2ljcmwpOwotCi0JaW91bm1hcChpbW1hcCk7Ci0KKwltcGM4MzR4X3VzYl9jZmcoKTsKIAkvKiBNYXAgQkNTUiBhcmVhICovCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYmNzciIpOwotCWlmIChucCAhPSAwKSB7CisJaWYgKG5wKSB7CiAJCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CkBAIC0xMjksMTIgKzg1LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiAKLQltcGM4MzR4X3VzYl9jZmcoKTsKKwltcGM4MzR4ZW1kc191c2JfY2ZnKCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzR4X21kc19pbml0X0lSUSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwppbmRleCBiY2VlZmY4Li4wZTYxNWZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwpAQCAtNTUsMTEgKzU1LDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIHN0YXRpYyB1OCAqYmNzcl9yZWdzID0gTlVMTDsKIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04Niw3ICs4MSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaAppbmRleCA5Y2QwM2I1Li41ODllZTU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKQEAgLTMsOSArMywxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAKIC8qIFN5c3RlbSBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9PRkZTICAgICAgICAgIDB4QTA4CisjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTUFTSyAgICAgIDB4MDBmMDAwMDAKICNkZWZpbmUgTVBDODNYWF9TQ0NSX1VTQl9NUEhDTV8xMSAgMHgwMGMwMDAwMAogI2RlZmluZSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzAxICAweDAwNDAwMDAwCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTVBIQ01fMTAgIDB4MDA4MDAwMDAKQEAgLTE1LDIxICsxNyw0MyBAQAogCiAvKiBzeXN0ZW0gaS9vIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgbG93ICovCiAjZGVmaW5lIE1QQzgzWFhfU0lDUkxfT0ZGUyAgICAgICAgIDB4MTE0Ci0jZGVmaW5lIE1QQzgzWFhfU0lDUkxfVVNCMCAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgTVBDODNYWF9TSUNSTF9VU0IxICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JMX1VTQl9NQVNLICAgICAweDYwMDAwMDAwCisjZGVmaW5lIE1QQzgzNFhfU0lDUkxfVVNCMCAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTVBDODM0WF9TSUNSTF9VU0IxICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4MzFYX1NJQ1JMX1VTQl9NQVNLICAgICAweDAwMDAwYzAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkxfVVNCX1VMUEkgICAgIDB4MDAwMDA4MDAKIAogLyogc3lzdGVtIGkvbyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGhpZ2ggKi8KICNkZWZpbmUgTVBDODNYWF9TSUNSSF9PRkZTICAgICAgICAgMHgxMTgKLSNkZWZpbmUgTVBDODNYWF9TSUNSSF9VU0JfVVRNSSAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JIX1VTQl9VVE1JICAgICAweDAwMDIwMDAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkhfVVNCX01BU0sgICAgIDB4MDAwMDAwZTAKKyNkZWZpbmUgTVBDODMxWF9TSUNSSF9VU0JfVUxQSSAgICAgMHgwMDAwMDBhMAorCisvKiBVU0IgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBGU0xfVVNCMl9DT05UUk9MX09GRlMgICAgICAweDUwMAorI2RlZmluZSBDT05UUk9MX1VUTUlfUEhZX0VOICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIENPTlRST0xfUkVGU0VMXzQ4TUhaICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQ09OVFJPTF9QSFlfQ0xLX1NFTF9VTFBJICAgMHgwMDAwMDQwMAorI2RlZmluZSBDT05UUk9MX09UR19QT1JUICAgICAgICAgICAweDAwMDAwMDIwCisKKy8qIFVTQiBQT1JUU0MgUmVnaXN0ZXJzICovCisjZGVmaW5lIEZTTF9VU0IyX1BPUlRTQzFfT0ZGUyAgICAgIDB4MTg0CisjZGVmaW5lIEZTTF9VU0IyX1BPUlRTQzJfT0ZGUyAgICAgIDB4MTg4CisjZGVmaW5lIFBPUlRTQ1hfUFRXXzE2QklUICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgUE9SVFNDWF9QVFNfVVRNSSAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQT1JUU0NYX1BUU19VTFBJICAgICAgICAgICAweDgwMDAwMDAwCiAKIC8qCiAgKiBEZWNsYXJhdGlvbiBmb3IgdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZQogICogbXBjODN4eF8qIGZpbGVzLiBNb3N0bHkgZm9yIHVzZSBieSBtcGM4M3h4X3NldHVwCiAgKi8KIAotZXh0ZXJuIGludCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKLWV4dGVybiBpbnQgbXBjODN4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOworZXh0ZXJuIGludCBtcGM4M3h4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgIHVfY2hhciBidXMsIHVfY2hhciBkZXZmbik7CiBleHRlcm4gdm9pZCBtcGM4M3h4X3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiBsb25nIG1wYzgzeHhfdGltZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBtcGM4MzR4X3VzYl9jZmcodm9pZCk7CitleHRlcm4gaW50IG1wYzgzMXhfdXNiX2NmZyh2b2lkKTsKIAogI2VuZGlmCQkJCS8qIF9fTVBDODNYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwppbmRleCA3NzQ0NTdkLi5jMGUyYjg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCkBAIC0zMywxOSArMzMsMTQgQEAKICNkZWZpbmUgREJHKHguLi4pCiAjZW5kaWYKIAotaW50IG1wYzgzeHhfcGNpMl9idXNubzsKLQotaW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCWlmICgoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAobXBjODN4eF9wY2kyX2J1c25vKQotCQlpZiAoYnVzID09IChtcGM4M3h4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1pbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitpbnQgX19pbml0IG1wYzgzeHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTY2LDExICs2MSwxMCBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CkBAIC04Niw4ICs4MCw2IEBACiAJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4NjAwKSB7CiAJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg4MzgwLCBpbW1yICsgMHg4Mzg0KTsKIAkJcHJpbWFyeSA9IDA7Ci0JCWhvc2UtPmJ1c19vZmZzZXQgPSBob3NlLT5maXJzdF9idXNubzsKLQkJbXBjODN4eF9wY2kyX2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVBDODN4eCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmZGYwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC91c2IuYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIEZyZWVzY2FsZSA4M3h4IFVTQiBTT0Mgc2V0dXAgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBMaSBZYW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAibXBjODN4eC5oIgorCisKKyNpZmRlZiBDT05GSUdfTVBDODM0eAoraW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2Njciwgc2ljcmwsIHNpY3JoOworCXZvaWQgX19pb21lbSAqaW1tYXA7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJaW50IHBvcnQwX2lzX2RyID0gMCwgcG9ydDFfaXNfZHIgPSAwOworCWNvbnN0IHZvaWQgKnByb3AsICpkcl9tb2RlOworCisJaW1tYXAgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpLCAweDEwMDApOworCWlmICghaW1tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUmVhZCByZWdpc3RlcnMgKi8KKwkvKiBOb3RlOiBEUiBhbmQgTVBIIG11c3QgdXNlIHRoZSBzYW1lIGNsb2NrIHNldHRpbmcgaW4gU0NDUiAqLworCXNjY3IgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpICYgfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKKwlzaWNybCA9IGluX2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMpICYgfk1QQzgzNFhfU0lDUkxfVVNCX01BU0s7CisJc2ljcmggPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTKSAmIH5NUEM4MzRYX1NJQ1JIX1VTQl9VVE1JOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAidXNiIiwgImZzbC11c2IyLWRyIik7CisJaWYgKG5wKSB7CisJCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9EUkNNXzExOyAgLyogMTozICovCisKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInBoeV90eXBlIiwgTlVMTCk7CisJCWlmIChwcm9wICYmICghc3RyY21wKHByb3AsICJ1dG1pIikgfHwKKwkJCQkJIXN0cmNtcChwcm9wLCAidXRtaV93aWRlIikpKSB7CisJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjAgfCBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCQlzaWNyaCB8PSBNUEM4MzRYX1NJQ1JIX1VTQl9VVE1JOworCQkJcG9ydDFfaXNfZHIgPSAxOworCQl9IGVsc2UgaWYgKHByb3AgJiYgIXN0cmNtcChwcm9wLCAic2VyaWFsIikpIHsKKwkJCWRyX21vZGUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkcl9tb2RlIiwgTlVMTCk7CisJCQlpZiAoZHJfbW9kZSAmJiAhc3RyY21wKGRyX21vZGUsICJvdGciKSkgeworCQkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMCB8IE1QQzgzNFhfU0lDUkxfVVNCMTsKKwkJCQlwb3J0MV9pc19kciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChwcm9wICYmICFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiODM0eCBVU0IgUEhZIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisJCX0KKwkJcG9ydDBfaXNfZHIgPSAxOworCQlvZl9ub2RlX3B1dChucCk7CisJfQorCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1tcGgiKTsKKwlpZiAobnApIHsKKwkJc2NjciB8PSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzExOyAvKiAxOjMgKi8KKworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicG9ydDAiLCBOVUxMKTsKKwkJaWYgKHByb3ApIHsKKwkJCWlmIChwb3J0MF9pc19kcikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSI4MzR4IFVTQiBwb3J0MCBjYW4ndCBiZSB1c2VkIGJ5IGJvdGggRFIgYW5kIE1QSCFcbiIpOworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwOworCQl9CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwb3J0MSIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJaWYgKHBvcnQxX2lzX2RyKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIjgzNHggVVNCIHBvcnQxIGNhbid0IGJlIHVzZWQgYnkgYm90aCBEUiBhbmQgTVBIIVxuIik7CisJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCX0KKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKworCS8qIFdyaXRlIGJhY2sgKi8KKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTLCBzY2NyKTsKKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUywgc2ljcmwpOworCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTLCBzaWNyaCk7CisKKwlpb3VubWFwKGltbWFwKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTVBDODM0eCAqLworCisjaWZkZWYgQ09ORklHX1BQQ19NUEM4MzF4CitpbnQgbXBjODMxeF91c2JfY2ZnKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdm9pZCBfX2lvbWVtICppbW1hcCwgKnVzYl9yZWdzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCWNvbnN0IHZvaWQgKnByb3A7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0ID0gMDsKKyNpZmRlZiBDT05GSUdfVVNCX09URworCWNvbnN0IHZvaWQgKmRyX21vZGU7CisjZW5kaWYKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1kciIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHlfdHlwZSIsIE5VTEwpOworCisJLyogTWFwIElNTVIgc3BhY2UgZm9yIHBpbiBhbmQgY2xvY2sgc2V0dGluZ3MgKi8KKwlpbW1hcCA9IGlvcmVtYXAoZ2V0X2ltbXJiYXNlKCksIDB4MTAwMCk7CisJaWYgKCFpbW1hcCkgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIENvbmZpZ3VyZSBjbG9jayAqLworCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpOworCXRlbXAgJj0gfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKKwl0ZW1wIHw9IE1QQzgzWFhfU0NDUl9VU0JfRFJDTV8xMTsgIC8qIDE6MyAqLworCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMsIHRlbXApOworCisJLyogQ29uZmlndXJlIHBpbiBtdXggZm9yIFVMUEkuICBUaGVyZSBpcyBubyBwaW4gbXV4IGZvciBVVE1JICovCisJaWYgKCFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQl0ZW1wID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUyk7CisJCXRlbXAgJj0gfk1QQzgzMVhfU0lDUkxfVVNCX01BU0s7CisJCXRlbXAgfD0gTVBDODMxWF9TSUNSTF9VU0JfVUxQSTsKKwkJb3V0X2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMsIHRlbXApOworCisJCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTKTsKKwkJdGVtcCAmPSB+TVBDODMxWF9TSUNSSF9VU0JfTUFTSzsKKwkJdGVtcCB8PSBNUEM4MzFYX1NJQ1JIX1VTQl9VTFBJOworCQlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkhfT0ZGUywgdGVtcCk7CisJfQorCisJaW91bm1hcChpbW1hcCk7CisKKwkvKiBNYXAgVVNCIFNPQyBzcGFjZSAqLworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCWlmIChyZXQpIHsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm4gcmV0OworCX0KKwl1c2JfcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSk7CisKKwkvKiBVc2luZyBvbi1jaGlwIFBIWSAqLworCWlmICghc3RyY21wKHByb3AsICJ1dG1pX3dpZGUiKSB8fAorCQkJIXN0cmNtcChwcm9wLCAidXRtaSIpKSB7CisJCS8qIFNldCBVVE1JX1BIWV9FTiwgUkVGU0VMIHRvIDQ4TUhaICovCisJCW91dF9iZTMyKHVzYl9yZWdzICsgRlNMX1VTQjJfQ09OVFJPTF9PRkZTLAorCQkJCUNPTlRST0xfVVRNSV9QSFlfRU4gfCBDT05UUk9MX1JFRlNFTF80OE1IWik7CisJLyogVXNpbmcgZXh0ZXJuYWwgVVBMSSBQSFkgKi8KKwl9IGVsc2UgaWYgKCFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQkvKiBTZXQgUEhZX0NMS19TRUwgdG8gVUxQSSAqLworCQl0ZW1wID0gQ09OVFJPTF9QSFlfQ0xLX1NFTF9VTFBJOworI2lmZGVmIENPTkZJR19VU0JfT1RHCisJCS8qIFNldCBPVEdfUE9SVCAqLworCQlkcl9tb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZHJfbW9kZSIsIE5VTEwpOworCQlpZiAoZHJfbW9kZSAmJiAhc3RyY21wKGRyX21vZGUsICJvdGciKSkKKwkJCXRlbXAgfD0gQ09OVFJPTF9PVEdfUE9SVDsKKyNlbmRpZiAvKiBDT05GSUdfVVNCX09URyAqLworCQlvdXRfYmUzMih1c2JfcmVncyArIEZTTF9VU0IyX0NPTlRST0xfT0ZGUywgdGVtcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiODMxeCBVU0IgUEhZIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJaW91bm1hcCh1c2JfcmVncyk7CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19NUEM4MzF4ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYwppbmRleCAzZTYyZmNiLi40ZmUzNzZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9taXNjLmMKQEAgLTEzLDExICsxMyw0MyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisKK3N0YXRpYyBfX2JlMzIgX19pb21lbSAqcnN0Y3I7CiAKIGV4dGVybiB2b2lkIGFib3J0KHZvaWQpOwogCitzdGF0aWMgaW50IF9faW5pdCBtcGM4NXh4X3JzdGNyKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJnbG9iYWwtdXRpbGl0aWVzIik7CisJaWYgKChucCAmJiBvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsaGFzLXJzdGNyIiwgTlVMTCkpKSB7CisJCWNvbnN0IHUzMiAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJLyogbWFwIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAqIDB4RTAwQjAgaXMgb2Zmc2V0IG9mIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAqLworCQkJcnN0Y3IgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpICsgKnByb3AgKyAweEIwLCAweGZmKTsKKwkJCWlmICghcnN0Y3IpCisJCQkJcHJpbnRrIChLRVJOX0VNRVJHICJFcnJvcjogcmVzZXQgY29udHJvbCAiCisJCQkJCQkicmVnaXN0ZXIgbm90IG1hcHBlZCFcbiIpOworCQl9CisJfSBlbHNlCisJCXByaW50ayAoS0VSTl9JTkZPICJyc3RjciBjb21wYXRpYmxlIHJlZ2lzdGVyIGRvZXMgbm90IGV4aXN0IVxuIik7CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChucCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwobXBjODV4eF9yc3Rjcik7CisKIHZvaWQgbXBjODV4eF9yZXN0YXJ0KGNoYXIgKmNtZCkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWlmIChyc3RjcikKKwkJLyogc2V0IHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJb3V0X2JlMzIocnN0Y3IsIDB4Mik7CS8qIEhSRVNFVF9SRVEgKi8KIAlhYm9ydCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQ0X2RzLmMKaW5kZXggYmVjODRmZi4uNmZiOTBhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0NF9kcy5jCkBAIC02MSwyNCArNjEsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIEFsbG9jIG1waWMgc3RydWN0dXJlIGFuZCBwZXIgaXN1IGhhcyAxNiBJTlQgZW50cmllcy4gKi8KIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKIAkJCSAgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKLQkJCSAgMTYsIDY0LCAiIE9QRU5QSUMgICAgICIpOworCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCi0JLyoKLQkgKiA0OCBJbnRlcm5hbCBJbnRlcnJ1cHRzCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0KLQkvKgotCSAqIDE2IEV4dGVybmFsIGludGVycnVwdHMKLQkgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMywgci5zdGFydCArIDB4MTAwMDApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmgKaW5kZXggODM0MTVkYi4uNzI4NmZmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCkBAIC0xNSw0ICsxNSw0IEBACiAgKi8KIAogZXh0ZXJuIHZvaWQgbXBjODV4eF9yZXN0YXJ0KGNoYXIgKik7Ci1leHRlcm4gaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4NXh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwppbmRleCA1ZDI3NjIxLi43MjM1ZjcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwpAQCAtMzgsMTMgKzM4LDkgQEAKICNpbmNsdWRlIDxhc20vZnNfcGQuaD4KICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtOTEsMzAgKzg3LDEwIEBACiAKIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKIAkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCi0JCQk0LCAwLCAiIE9wZW5QSUMgICIpOworCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCW9mX25vZGVfcHV0KG5wKTsKIAotCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCByLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHIuc3RhcnQgKyAweDEwMjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgci5zdGFydCArIDB4MTAzMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAzLCByLnN0YXJ0ICsgMHgxMDM4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDQsIHIuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNSwgci5zdGFydCArIDB4MTA0ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA2LCByLnN0YXJ0ICsgMHgxMDUwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDcsIHIuc3RhcnQgKyAweDEwNTgwKTsKLQotCS8qIFVudXNlZCBvbiB0aGlzIHBsYXRmb3JtIChsZWF2ZSByb29tIGZvciA4NTQ4KSAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19DUE0yCkBAIC0yNDEsNyArMjE3LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4NXh4X2FkZF9icmlkZ2UobnApOwogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCmluZGV4IDE0OTBlYjMuLjUwYzhkNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCkBAIC00NywxMSArNDcsNiBAQAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSAibXBjODV4eC5oIgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQgY2RzX3BjaV9zbG90ID0gMjsKIHN0YXRpYyB2b2xhdGlsZSB1OCAqY2FkbXVzOwogCkBAIC02MCwxNSArNTUsMTEgQEAKICNkZWZpbmUgQVJDQURJQV9IT1NUX0JSSURHRV9JRFNFTAkxNwogI2RlZmluZSBBUkNBRElBXzJORF9CUklER0VfSURTRUwJMwogCi1leHRlcm4gaW50IG1wYzg1eHhfcGNpMl9idXNubzsKLQotc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3N0YXRpYyBpbnQgbXBjODV4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCWlmICgoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAobXBjODV4eF9wY2kyX2J1c25vKQotCQlpZiAoYnVzID09IChtcGM4NXh4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAkvKiBXZSBleHBsaWNpdGx5IGRvIG5vdCBnbyBwYXN0IHRoZSBUdW5kcmEgMzIwIEJyaWRnZSAqLwogCWlmICgoYnVzID09IDEpICYmIChQQ0lfU0xPVChkZXZmbikgPT0gQVJDQURJQV8yTkRfQlJJREdFX0lEU0VMKSkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKQEAgLTc4LDUyICs2OSw0NCBAQAogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9jZHNfcGNpYmlvc19maXh1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfY2RzX3BjaV9pcnFfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCXVfY2hhcgkJYzsKKwl1X2NoYXIgYzsKKwlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9WSUEpIHsKKwkJc3dpdGNoIChkZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xOgorCQkJLyoKKwkJCSAqIFUtQm9vdCBkb2VzIG5vdCBzZXQgdGhlIGVuYWJsZSBiaXRzCisJCQkgKiBmb3IgdGhlIElERSBkZXZpY2UuIEZvcmNlIHRoZW0gb24gaGVyZS4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQwLCAmYyk7CisJCQljIHw9IDB4MDM7IC8qIElERTogQ2hpcCBFbmFibGUgQml0cyAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgYyk7CiAKLQlpZiAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLAotCQkJCQlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSwgTlVMTCkpKSB7CisJCQkvKgorCQkJICogU2luY2Ugb25seSBwcmltYXJ5IGludGVyZmFjZSB3b3JrcywgZm9yY2UgdGhlCisJCQkgKiBJREUgZnVuY3Rpb24gdG8gc3RhbmRhcmQgcHJpbWFyeSBJREUgaW50ZXJydXB0CisJCQkgKiB3LyA4MjU5IG9mZnNldAorCQkJICovCisJCQlkZXYtPmlycSA9IDE0OworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJCQlicmVhazsKIAkJLyoKLQkJICogVS1Cb290IGRvZXMgbm90IHNldCB0aGUgZW5hYmxlIGJpdHMKLQkJICogZm9yIHRoZSBJREUgZGV2aWNlLiBGb3JjZSB0aGVtIG9uIGhlcmUuCisJCSAqIEZvcmNlIGxlZ2FjeSBVU0IgaW50ZXJydXB0IHJvdXRpbmcKIAkJICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJmMpOwotCQljIHw9IDB4MDM7IC8qIElERTogQ2hpcCBFbmFibGUgQml0cyAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQwLCBjKTsKLQotCQkvKgotCQkgKiBTaW5jZSBvbmx5IHByaW1hcnkgaW50ZXJmYWNlIHdvcmtzLCBmb3JjZSB0aGUKLQkJICogSURFIGZ1bmN0aW9uIHRvIHN0YW5kYXJkIHByaW1hcnkgSURFIGludGVycnVwdAotCQkgKiB3LyA4MjU5IG9mZnNldAorCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yOgorCQkvKiBUaGVyZSBhcmUgdHdvIFVTQiBjb250cm9sbGVycy4KKwkJICogSWRlbnRpZnkgdGhlbSBieSBmdW5jdG9uIG51bWJlcgogCQkgKi8KLQkJZGV2LT5pcnEgPSAxNDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Ci0JCXBjaV9kZXZfcHV0KGRldik7CisJCQlpZiAoUENJX0ZVTkMoZGV2LT5kZXZmbikpCisJCQkJZGV2LT5pcnEgPSAxMTsKKwkJCWVsc2UKKwkJCQlkZXYtPmlycSA9IDEwOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KLQotCS8qCi0JICogRm9yY2UgbGVnYWN5IFVTQiBpbnRlcnJ1cHQgcm91dGluZwotCSAqLwotCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCi0JCQkJCVBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yLCBOVUxMKSkpIHsKLQkJZGV2LT5pcnEgPSAxMDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAxMCk7Ci0JCXBjaV9kZXZfcHV0KGRldik7Ci0JfQotCi0JaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKLQkJCQkJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzIsIGRldikpKSB7Ci0JCWRldi0+aXJxID0gMTE7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMTEpOwotCQlwY2lfZGV2X3B1dChkZXYpOwotCX0KLQotCS8qIE5vdyBtYXAgYWxsIHRoZSBQQ0kgaXJxcyAqLwotCWRldiA9IE5VTEw7Ci0JZm9yX2VhY2hfcGNpX2RldihkZXYpCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7CiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX0k4MjU5CkBAIC0xNjUsMzMgKzE0OCwxMiBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAogCS8qIFJldHVybiB0aGUgbXBpYyBub2RlICovCiAJb2Zfbm9kZV9wdXQobnApOwogCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTAyODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDMwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMzgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA1LCByLnN0YXJ0ICsgMHgxMDQ4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDYsIHIuc3RhcnQgKyAweDEwNTAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNywgci5zdGFydCArIDB4MTA1ODApOwotCi0JLyogVXNlZCBvbmx5IGZvciA4NTQ4IHNvIGZhciwgYnV0IG5vIGhhcm0gaW4KLQkgKiBhbGxvY2F0aW5nIHRoZW0gZm9yIGV2ZXJ5b25lICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDgsIHIuc3RhcnQgKyAweDEwNjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgOSwgci5zdGFydCArIDB4MTA2ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMCwgci5zdGFydCArIDB4MTA3MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMSwgci5zdGFydCArIDB4MTA3ODApOwotCi0JLyogRXh0ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMiwgci5zdGFydCArIDB4MTAwMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMywgci5zdGFydCArIDB4MTAwODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxNCwgci5zdGFydCArIDB4MTAxMDApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpAQCAtMjU3LDkgKzIxOSw5IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAotCXBwY19tZC5wY2liaW9zX2ZpeHVwID0gbXBjODV4eF9jZHNfcGNpYmlvc19maXh1cDsKKwlwcGNfbWQucGNpX2lycV9maXh1cCA9IG1wYzg1eHhfY2RzX3BjaV9pcnFfZml4dXA7CiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggZTNkZGRiZi4uMDA0YjgwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTU5LDExICs1OSw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC0xMDAsNyArOTUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykgewotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAl9CiAJb2Zfbm9kZV9wdXQobnApOwogI2VuZGlmCkBAIC0xODEsMjkgKzE3NiwxMCBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAlvZl9ub2RlX3B1dChucCk7CiAKLQkvKiBJbnRlcm5hbCBJbnRlcnJ1cHRzICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTAyODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDMwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMzgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA1LCByLnN0YXJ0ICsgMHgxMDQ4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDYsIHIuc3RhcnQgKyAweDEwNTAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNywgci5zdGFydCArIDB4MTA1ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYwppbmRleCA0OGYxN2UyLi44MTE4NDE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3BjaS5jCkBAIC0zMywxMCArMzMsOCBAQAogI2RlZmluZSBEQkcoeC4uLikKICNlbmRpZgogCi1pbnQgbXBjODV4eF9wY2kyX2J1c25vID0gMDsKLQogI2lmZGVmIENPTkZJR19QQ0kKLWludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK2ludCBfX2luaXQgbXBjODV4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtNTcsMTEgKzU1LDEwIEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKQEAgLTc0LDggKzcxLDYgQEAKIAlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDkwMDApIHsKIAkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIGltbXIgKyAweDkwMDAsIGltbXIgKyAweDkwMDQpOwogCQlwcmltYXJ5ID0gMDsKLQkJaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOwotCQltcGM4NXh4X3BjaTJfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNUEM4NXh4IFBDSSBob3N0IGJyaWRnZSBhdCAweCUwMTZsbHguICIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKaW5kZXggZDFiY2ZmNS4uMGZhZWJmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjaG9pY2UKLQlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlwcm9tcHQgIjg2eHggQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIFBQQ184Nnh4CiAJZGVmYXVsdCBNUEM4NjQxX0hQQ04KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4LmgKaW5kZXggMjgzNDQ2Mi4uMjNmN2VkMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eC5oCkBAIC0xNSwxNSArMTUsMTAgQEAKICAqIG1wYzg2eHhfKiBmaWxlcy4gTW9zdGx5IGZvciB1c2UgYnkgbXBjODZ4eF9zZXR1cCgpLgogICovCiAKLWV4dGVybiBpbnQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CitleHRlcm4gaW50IG1wYzg2eHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiAKLWV4dGVybiBpbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOwotCi1leHRlcm4gdm9pZCBzZXR1cF9pbmRpcmVjdF9wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkgICAgICAgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpOwotZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpZV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJCSAgICAgdm9pZCBfX2lvbWVtICpjZmdfYWRkciwKLQkJCQkJICAgICB2b2lkIF9faW9tZW0gKmNmZ19kYXRhKTsKK2V4dGVybiBpbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOwogCiBleHRlcm4gdm9pZCBfX2luaXQgbXBjODZ4eF9zbXBfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCmluZGV4IDEwNTE3MDIuLjViMDFlYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKQEAgLTQ0LDEzICs0NCw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIHBjaV9kcmFtX29mZnNldCA9IDA7Ci0jZW5kaWYKLQotCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIHZvaWQgbXBjODZ4eF84MjU5X2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewpAQCAtODEsMjIgKzc0LDkgQEAKIAkvKiBBbGxvYyBtcGljIHN0cnVjdHVyZSBhbmQgcGVyIGlzdSBoYXMgMTYgSU5UIGVudHJpZXMuICovCiAJbXBpYzEgPSBtcGljX2FsbG9jKG5wLCByZXMuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJMTYsIE5SX0lSUVMgLSA0LAotCQkJIiBNUElDICAgICAiKTsKKwkJCTAsIDI1NiwgIiBNUElDICAgICAiKTsKIAlCVUdfT04obXBpYzEgPT0gTlVMTCk7CiAKLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDAsIHJlcy5zdGFydCArIDB4MTAwMDApOwotCi0JLyogNDggSW50ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljMSwgMSwgcmVzLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMxLCAyLCByZXMuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDMsIHJlcy5zdGFydCArIDB4MTA2MDApOwotCi0JLyogMTYgRXh0ZXJuYWwgaW50ZXJydXB0cwotCSAqIE1vdmluZyB0aGVtIGZyb20gWzAgLSAxNV0gdG8gWzY0IC0gNzldCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMxLCA0LCByZXMuc3RhcnQgKyAweDEwMDAwKTsKLQogCW1waWNfaW5pdChtcGljMSk7CiAKICNpZmRlZiBDT05GSUdfUENJCkBAIC0zMTksNiArMjk5LDcgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4MDQsIDB4MDQwNSk7CisJZGV2LT5jbGFzcyAmPSB+MHg1OwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgJnRlbXApOwogCXRlbXAgfD0gMHgxMDAwOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NGEsIHRlbXApOwpAQCAtMzY0LDkgKzM0NSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKLQotCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4Nnh4X2V4Y2x1ZGVfZGV2aWNlOworCQltcGM4Nnh4X2FkZF9icmlkZ2UobnApOwogI2VuZGlmCiAKIAlwcmludGsoIk1QQzg2eHggSFBDTiBib2FyZCBmcm9tIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYwppbmRleCA4MjM1YzU2Li43M2NkNWIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BjaS5jCkBAIC0xMjIsNyArMTIyLDYgQEAKIG1wYzg2eHhfc2V0dXBfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHUzMiBwY2llX29mZnNldCwgdTMyIHBjaWVfc2l6ZSkKIHsKIAl1MTYgY21kOwotCXVuc2lnbmVkIGludCB0ZW1wczsKIAogCURCRygiUENJRSBob3N0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0IDB4JTA4eCwgc2l6ZSAweCUwOHguXG4iLAogCQkJcGNpZV9vZmZzZXQsIHBjaWVfc2l6ZSk7CkBAIC0xMzMsMjIgKzEzMiw0OSBAQAogCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSV9DT01NQU5ELCBjbWQpOwogCiAJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgMCwgMCwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ODApOwotCi0JLyogUENJRSBCdXMsIEZpeCB0aGUgTVBDODY0MUQgaG9zdCBicmlkZ2UncyBsb2NhdGlvbiB0byBidXMgMHhGRi4gKi8KLQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCAwLCAwLCBQQ0lfUFJJTUFSWV9CVVMsICZ0ZW1wcyk7Ci0JdGVtcHMgPSAodGVtcHMgJiAweGZmMDAwMDAwKSB8ICgweGZmKSB8ICgweDAgPDwgOCkgfCAoMHhmZSA8PCAxNik7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIDAsIDAsIFBDSV9QUklNQVJZX0JVUywgdGVtcHMpOwogfQogCi1pbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIHJlc19pZHggPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAKLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworCS8qCisJICogTWFrZSB0aGUgYnJpZGdlIGJlIHRyYW5zcGFyZW50LgorCSAqLworCWRldi0+dHJhbnNwYXJlbnQgPSAxOworCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7CisJaWYgKCFob3NlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBob3NlIGZvciBidXMgJWRcbiIsCisJCSAgICAgICBkZXYtPmJ1cy0+bnVtYmVyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChob3NlLT5pb19yZXNvdXJjZS5mbGFncykgeworCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVtyZXNfaWR4KytdOworCQlyZXMtPnN0YXJ0ID0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQ7CisJCXJlcy0+ZW5kID0gaG9zZS0+aW9fcmVzb3VyY2UuZW5kOworCQlyZXMtPmZsYWdzID0gaG9zZS0+aW9fcmVzb3VyY2UuZmxhZ3M7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVtyZXNfaWR4ICsgaV07CisJCXJlcy0+c3RhcnQgPSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0OworCQlyZXMtPmVuZCA9IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZW5kOworCQlyZXMtPmZsYWdzID0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5mbGFnczsKKwl9CiB9CiAKLWludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKKworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCAweDcwMTAsIHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgMHg3MDExLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CisKKyNkZWZpbmUgUENJRV9MVFNTTQkweDQwNAkvKiBQQ0llIExpbmsgVHJhaW5pbmcgYW5kIFN0YXR1cyAqLworI2RlZmluZSBQQ0lFX0xUU1NNX0wwCTB4MTYJLyogTDAgc3RhdGUgKi8KKworaW50IF9faW5pdCBtcGM4Nnh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC0xNTYsNiArMTgyLDcgQEAKIAljb25zdCBpbnQgKmJ1c19yYW5nZTsKIAlpbnQgaGFzX2FkZHJlc3MgPSAwOwogCWludCBwcmltYXJ5ID0gMDsKKwl1MTYgdmFsOwogCiAJREJHKCJBZGRpbmcgUENJRSBob3N0IGJyaWRnZSAlc1xuIiwgZGV2LT5mdWxsX25hbWUpOwogCkBAIC0xNjgsMTcgKzE5NSwyMyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAotCS8qIGxhc3RfYnVzbm8gPSAweGZlIGNhdXNlIGJ5IE1QQzg2NDEgUENJRSBidWcgKi8KKwlob3NlLT5pbmRpcmVjdF90eXBlID0gUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRyB8CisJCQkJUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVM7CisKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDB4MDsKLQlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZTsKKwlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIAotCXNldHVwX2luZGlyZWN0X3BjaWUoaG9zZSwgcnNyYy5zdGFydCwgcnNyYy5zdGFydCArIDB4NCk7CisJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIHJzcmMuc3RhcnQsIHJzcmMuc3RhcnQgKyAweDQpOworCisJLyogUHJvYmUgdGhlIGhvc2UgbGluayB0cmFpbmluZyBzdGF0dXMgKi8KKwllYXJseV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSUVfTFRTU00sICZ2YWwpOworCWlmICh2YWwgPCBQQ0lFX0xUU1NNX0wwKQorCQlyZXR1cm4gLUVOWElPOwogCiAJLyogU2V0dXAgdGhlIFBDSUUgaG9zdCBjb250cm9sbGVyLiAqLwogCW1wYzg2eHhfc2V0dXBfcGNpZShob3NlLCByc3JjLnN0YXJ0LCByc3JjLmVuZCAtIHJzcmMuc3RhcnQgKyAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYwppbmRleCAwOTAxZGJhLi5mMTY5MzU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcmVnLmg+CkBAIC00OSw2ICs1MCwxMCBAQAogCiAjaW5jbHVkZSAic3lzZGV2L21wYzh4eF9waWMuaCIKIAorI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorc3RydWN0IG1wYzh4eF9wY21jaWFfb3BzIG04eHhfcGNtY2lhX29wczsKKyNlbmRpZgorCiB2b2lkIG04eHhfY2FsaWJyYXRlX2RlY3Iodm9pZCk7CiBleHRlcm4gdm9pZCBtOHh4X3dkdF9oYW5kbGVyX2luc3RhbGwoYmRfdCAqYnApOwogZXh0ZXJuIGludCBjcG1fcGljX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCmluZGV4IGMzNmU0NzUuLjVhODA4ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mc19lbmV0X3BkLmg+CiAjaW5jbHVkZSA8bGludXgvZnNfdWFydF9wZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KQEAgLTM5LDcgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiBleHRlcm4gdm9pZCBjcG1fcmVzZXQodm9pZCk7Ci1leHRlcm4gdm9pZCBtcGM4eHhfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSopOworZXh0ZXJuIHZvaWQgbXBjOHh4X3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKik7CiBleHRlcm4gdm9pZCBtcGM4eHhfcmVzdGFydChjaGFyICpjbWQpOwogZXh0ZXJuIHZvaWQgbXBjOHh4X2NhbGlicmF0ZV9kZWNyKHZvaWQpOwogZXh0ZXJuIGludCBtcGM4eHhfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pOwpAQCAtNDcsOSArNDgsNzMgQEAKIGV4dGVybiB2b2lkIG04eHhfcGljX2luaXQodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgaW50IG1wYzh4eF9nZXRfaXJxKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSk7Ci1zdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSk7Ci1zdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyogcHRyKTsKK3N0YXRpYyB2b2lkIGluaXRfc21jMV91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKTsKK3N0YXRpYyB2b2lkIGluaXRfc21jMl91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKTsKK3N0YXRpYyB2b2lkIGluaXRfc2NjM19pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpwdHIpOworCisjaWZkZWYgQ09ORklHX1BDTUNJQV9NOFhYCitzdGF0aWMgdm9pZCBwY21jaWFfaHdfc2V0dXAoaW50IHNsb3QsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgKmJjc3JfaW87CisKKwliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpZiAoZW5hYmxlKQorCQljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUENDRU4pOworCWVsc2UKKwkJc2V0Yml0czMyKGJjc3JfaW8sIEJDU1IxX1BDQ0VOKTsKKworCWlvdW5tYXAoYmNzcl9pbyk7Cit9CisKK3N0YXRpYyBpbnQgcGNtY2lhX3NldF92b2x0YWdlKGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXUzMiByZWcgPSAwOworCXVuc2lnbmVkICpiY3NyX2lvOworCisJYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAxOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJY2FzZSAxMjA6CisJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAwOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCisJY2xyYml0czMyKGJjc3JfaW8sIDB4MDA2MTAwMDApOworCisJLyogZW5hYmxlIG5ldyBwb3dlcnNldHRpbmdzICovCisJc2V0Yml0czMyKGJjc3JfaW8sIHJlZyk7CisKKwlpb3VubWFwKGJjc3JfaW8pOworCXJldHVybiAwOworfQorI2VuZGlmCiAKIHZvaWQgX19pbml0IG1wYzg4NWFkc19ib2FyZF9zZXR1cCh2b2lkKQogewpAQCAtNjIsNyArMTI3LDcgQEAKICNlbmRpZgogCiAJYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAKIAlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSXG4iKTsKQEAgLTc1LDEzICsxNDAsMTMgQEAKIAlvdXRfOCgmKGNwLT5jcF9zbWNbMF0uc21jX3NtY20pLCB0bXB2YWw4KTsKIAljbHJiaXRzMTYoJmNwLT5jcF9zbWNbMF0uc21jX3NtY21yLCBTTUNNUl9SRU4gfCBTTUNNUl9URU4pOwkvKiBicmcxICovCiAjZWxzZQotCXNldGJpdHMzMihiY3NyX2lvLEJDU1IxX1JTMjMyRU5fMSk7CisJc2V0Yml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMSk7CiAJb3V0X2JlMTYoJmNwLT5jcF9zbWNbMF0uc21jX3NtY21yLCAwKTsKIAlvdXRfOCgmY3AtPmNwX3NtY1swXS5zbWNfc21jZSwgMCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfQ1BNX1NNQzIKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzIpOworCWNscmJpdHMzMihiY3NyX2lvLCBCQ1NSMV9SUzIzMkVOXzIpOwogCWNscmJpdHMzMigmY3AtPmNwX3NpbW9kZSwgMHhlMDAwMDAwMCA+PiAxKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9zaW1vZGUsIDB4MjAwMDAwMDAgPj4gMSk7CS8qIGJyZzIgKi8KIAl0bXB2YWw4ID0gaW5fOCgmKGNwLT5jcF9zbWNbMV0uc21jX3NtY20pKSB8IChTTUNNX1JYIHwgU01DTV9UWCk7CkBAIC05MCw3ICsxNTUsNyBAQAogCiAJaW5pdF9zbWMyX3VhcnRfaW9wb3J0cygwKTsKICNlbHNlCi0Jc2V0Yml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8yKTsKKwlzZXRiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8yKTsKIAlvdXRfYmUxNigmY3AtPmNwX3NtY1sxXS5zbWNfc21jbXIsIDApOwogCW91dF84KCZjcC0+Y3Bfc21jWzFdLnNtY19zbWNlLCAwKTsKICNlbmRpZgpAQCAtOTksMjkgKzE2NCwzNCBAQAogCiAjaWZkZWYgQ09ORklHX0ZTX0VORVQKIAkvKiB1c2UgTURDIGZvciBNSUkgKGNvbW1vbikgKi8KLQlpb19wb3J0ID0gKGlvcDh4eF90KilpbW1yX21hcChpbV9pb3BvcnQpOworCWlvX3BvcnQgPSAoaW9wOHh4X3QgKikgaW1tcl9tYXAoaW1faW9wb3J0KTsKIAlzZXRiaXRzMTYoJmlvX3BvcnQtPmlvcF9wZHBhciwgMHgwMDgwKTsKIAljbHJiaXRzMTYoJmlvX3BvcnQtPmlvcF9wZGRpciwgMHgwMDgwKTsKIAogCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1I1LCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTFfRU4pOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTFfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjVfTUlJMV9FTik7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTFfUlNUKTsKICNpZm5kZWYgQ09ORklHX0ZDX0VORVRfSEFTX1NDQwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTJfRU4pOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTJfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjVfTUlJMl9FTik7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTJfUlNUKTsKIAogI2VuZGlmCiAJaW91bm1hcChiY3NyX2lvKTsKIAlpbW1yX3VubWFwKGlvX3BvcnQpOwogCiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorCS8qU2V0IHVwIGJvYXJkIHNwZWNpZmljIGhvb2stdXBzICovCisJbTh4eF9wY21jaWFfb3BzLmh3X2N0cmwgPSBwY21jaWFfaHdfc2V0dXA7CisJbTh4eF9wY21jaWFfb3BzLnZvbHRhZ2Vfc2V0ID0gcGNtY2lhX3NldF92b2x0YWdlOworI2VuZGlmCiB9CiAKLQotc3RhdGljIHZvaWQgaW5pdF9mZWMxX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8qIHB0cikKK3N0YXRpYyB2b2lkIGluaXRfZmVjMV9pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpwdHIpCiB7Ci0JY3BtOHh4X3QgKmNwID0gKGNwbTh4eF90ICopaW1tcl9tYXAoaW1fY3BtKTsKLQlpb3A4eHhfdCAqaW9fcG9ydCA9IChpb3A4eHhfdCAqKWltbXJfbWFwKGltX2lvcG9ydCk7CisJY3BtOHh4X3QgKmNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CisJaW9wOHh4X3QgKmlvX3BvcnQgPSAoaW9wOHh4X3QgKikgaW1tcl9tYXAoaW1faW9wb3J0KTsKIAogCS8qIGNvbmZpZ3VyZSBGRUMxIHBpbnMgICovCiAJc2V0Yml0czE2KCZpb19wb3J0LT5pb3BfcGFwYXIsIDB4ZjgzMCk7CkBAIC0xNDMsMTEgKzIxMywxMCBAQAogCWltbXJfdW5tYXAoY3ApOwogfQogCi0KLXN0YXRpYyB2b2lkIGluaXRfZmVjMl9pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKiBwdHIpCitzdGF0aWMgdm9pZCBpbml0X2ZlYzJfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqcHRyKQogewotCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7Ci0JaW9wOHh4X3QgKmlvX3BvcnQgPSAoaW9wOHh4X3QgKilpbW1yX21hcChpbV9pb3BvcnQpOworCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOworCWlvcDh4eF90ICppb19wb3J0ID0gKGlvcDh4eF90ICopIGltbXJfbWFwKGltX2lvcG9ydCk7CiAKIAkvKiBjb25maWd1cmUgRkVDMiBwaW5zICovCiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIDB4MDAwM2ZmZmMpOwpAQCAtMTc3LDE1ICsyNDYsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfc2NjM19pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKiBmcGkpCitzdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqZnBpKQogewogCXVuc2lnbmVkICpiY3NyX2lvOwogCWlvcDh4eF90ICppb19wb3J0OwogCWNwbTh4eF90ICpjcDsKIAogCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1JfQUREUiwgQkNTUl9TSVpFKTsKLQlpb19wb3J0ID0gKGlvcDh4eF90ICopaW1tcl9tYXAoaW1faW9wb3J0KTsKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJaW9fcG9ydCA9IChpb3A4eHhfdCAqKSBpbW1yX21hcChpbV9pb3BvcnQpOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAKIAlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSXG4iKTsKQEAgLTE5NCw5ICsyNjMsOSBAQAogCiAJLyogRW5hYmxlIHRoZSBQSFkuCiAJICovCi0JY2xyYml0czMyKGJjc3JfaW8rNCwgQkNTUjRfRVRIMTBfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbyArIDQsIEJDU1I0X0VUSDEwX1JTVCk7CiAJdWRlbGF5KDEwMDApOwotCXNldGJpdHMzMihiY3NyX2lvKzQsIEJDU1I0X0VUSDEwX1JTVCk7CisJc2V0Yml0czMyKGJjc3JfaW8gKyA0LCBCQ1NSNF9FVEgxMF9SU1QpOwogCS8qIENvbmZpZ3VyZSBwb3J0IEEgcGlucyBmb3IgVHhkIGFuZCBSeGQuCiAJICovCiAJc2V0Yml0czE2KCZpb19wb3J0LT5pb3BfcGFwYXIsIFBBX0VORVRfUlhEIHwgUEFfRU5FVF9UWEQpOwpAQCAtMjEyLDggKzI4MSw3IEBACiAJICovCiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVwYXIsIFBFX0VORVRfVEVOQSk7Ci0JY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsCi0JCSAgUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLIHwgUEVfRU5FVF9URU5BKTsKKwljbHJiaXRzMzIoJmNwLT5jcF9wZWRpciwgUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLIHwgUEVfRU5FVF9URU5BKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9wZXNvLCBQRV9FTkVUX1RDTEsgfCBQRV9FTkVUX1JDTEspOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIFBFX0VORVRfVEVOQSk7CiAKQEAgLTIzNyw3ICszMDUsNyBAQAogCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLCBQRV9FTkVUX1RFTkEpOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIFBFX0VORVRfVEVOQSk7CiAKLQlzZXRiaXRzMzIoYmNzcl9pbys0LCBCQ1NSMV9FVEhFTik7CisJc2V0Yml0czMyKGJjc3JfaW8gKyA0LCBCQ1NSMV9FVEhFTik7CiAJaW91bm1hcChiY3NyX2lvKTsKIAlpbW1yX3VubWFwKGlvX3BvcnQpOwogCWltbXJfdW5tYXAoY3ApOwpAQCAtMjU3LDUwICszMjUsNDggQEAKIAl9CiB9CiAKLQotCi1zdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIHB0cikKK3N0YXRpYyB2b2lkIGluaXRfc21jMV91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqcHRyKQogewotICAgICAgICB1bnNpZ25lZCAqYmNzcl9pbzsKKwl1bnNpZ25lZCAqYmNzcl9pbzsKIAljcG04eHhfdCAqY3A7CiAKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJY3AgPSAoY3BtOHh4X3QgKikgaW1tcl9tYXAoaW1fY3BtKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXBhciwgMHgwMDAwMDBjMCk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsIDB4MDAwMDAwYzApOwogCWNscmJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDAwNDApOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDAwODApOwogCWltbXJfdW5tYXAoY3ApOwogCi0gICAgICAgIGJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0gICAgICAgIGlmIChiY3NyX2lvID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUjFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzEpOwotICAgICAgICBpb3VubWFwKGJjc3JfaW8pOworCWlmIChiY3NyX2lvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKKwkJcmV0dXJuOworCX0KKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8xKTsKKwlpb3VubWFwKGJjc3JfaW8pOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSkKK3N0YXRpYyB2b2lkIGluaXRfc21jMl91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKQogewotICAgICAgICB1bnNpZ25lZCAqYmNzcl9pbzsKKwl1bnNpZ25lZCAqYmNzcl9pbzsKIAljcG04eHhfdCAqY3A7CiAKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJY3AgPSAoY3BtOHh4X3QgKikgaW1tcl9tYXAoaW1fY3BtKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXBhciwgMHgwMDAwMGMwMCk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsIDB4MDAwMDBjMDApOwogCWNscmJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDA0MDApOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDA4MDApOwogCWltbXJfdW5tYXAoY3ApOwogCi0gICAgICAgIGJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0gICAgICAgIGlmIChiY3NyX2lvID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUjFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzIpOwotICAgICAgICBpb3VubWFwKGJjc3JfaW8pOworCWlmIChiY3NyX2lvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKKwkJcmV0dXJuOworCX0KKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8yKTsKKwlpb3VubWFwKGJjc3JfaW8pOwogfQogCiB2b2lkIGluaXRfc21jX2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZGF0YSkKQEAgLTM3MywxNSArNDM5LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKLWRlZmluZV9tYWNoaW5lKG1wYzg4NV9hZHMpIHsKLQkubmFtZQkJCT0gIk1QQzg4NSBBRFMiLAotCS5wcm9iZQkJCT0gbXBjODg1YWRzX3Byb2JlLAotCS5zZXR1cF9hcmNoCQk9IG1wYzg4NWFkc19zZXR1cF9hcmNoLAotCS5pbml0X0lSUQkJPSBtOHh4X3BpY19pbml0LAotCS5zaG93X2NwdWluZm8JCT0gbXBjOHh4X3Nob3dfY3B1aW5mbywKLQkuZ2V0X2lycQkJPSBtcGM4eHhfZ2V0X2lycSwKLQkucmVzdGFydAkJPSBtcGM4eHhfcmVzdGFydCwKLQkuY2FsaWJyYXRlX2RlY3IJCT0gbXBjOHh4X2NhbGlicmF0ZV9kZWNyLAotCS5zZXRfcnRjX3RpbWUJCT0gbXBjOHh4X3NldF9ydGNfdGltZSwKLQkuZ2V0X3J0Y190aW1lCQk9IG1wYzh4eF9nZXRfcnRjX3RpbWUsCi19OworZGVmaW5lX21hY2hpbmUobXBjODg1X2FkcykKK3sKKy5uYW1lID0gIk1QQzg4NSBBRFMiLC5wcm9iZSA9IG1wYzg4NWFkc19wcm9iZSwuc2V0dXBfYXJjaCA9CisJICAgIG1wYzg4NWFkc19zZXR1cF9hcmNoLC5pbml0X0lSUSA9CisJICAgIG04eHhfcGljX2luaXQsLnNob3dfY3B1aW5mbyA9IG1wYzh4eF9zaG93X2NwdWluZm8sLmdldF9pcnEgPQorCSAgICBtcGM4eHhfZ2V0X2lycSwucmVzdGFydCA9IG1wYzh4eF9yZXN0YXJ0LC5jYWxpYnJhdGVfZGVjciA9CisJICAgIG1wYzh4eF9jYWxpYnJhdGVfZGVjciwuc2V0X3J0Y190aW1lID0KKwkgICAgbXBjOHh4X3NldF9ydGNfdGltZSwuZ2V0X3J0Y190aW1lID0gbXBjOHh4X2dldF9ydGNfdGltZSx9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDM2MWFjZmEuLjMzNTQ1ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTIsNyArMiw3IEBACiAKIGNob2ljZQogCXByb21wdCAiTWFjaGluZSB0eXBlIgotCWRlcGVuZHMgb24gUFBDNjQgfHwgQ0xBU1NJQzMyCisJZGVwZW5kcyBvbiBQUEM2NCB8fCA2eHgKIAlkZWZhdWx0IFBQQ19NVUxUSVBMQVRGT1JNCiAKIGNvbmZpZyBQUENfTVVMVElQTEFURk9STQpAQCAtMTYsMTUgKzE2LDMwIEBACiAJYm9vbCAiRW1iZWRkZWQgNnh4Lzd4eC83eHh4LWJhc2VkIGJvYXJkIgogCWRlcGVuZHMgb24gUFBDMzIgJiYgKEJST0tFTnx8QlJPS0VOX09OX1NNUCkKIAotY29uZmlnIEFQVVMKLQlib29sICJBbWlnYS1BUFVTIgotCWRlcGVuZHMgb24gUFBDMzIgJiYgQlJPS0VOCitjb25maWcgUFBDXzgyeHgKKwlib29sICJGcmVlc2NhbGUgODJ4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCitjb25maWcgUFBDXzgzeHgKKwlib29sICJGcmVlc2NhbGUgODN4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IDgzeHgKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCitjb25maWcgUFBDXzg2eHgKKwlib29sICJGcmVlc2NhbGUgODZ4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IEFMVElWRUMKIAloZWxwCi0JICBTZWxlY3QgQVBVUyBpZiBjb25maWd1cmluZyBmb3IgYSBQb3dlclVQIEFtaWdhLgotCSAgTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQ6Ci0JICA8aHR0cDovL2xpbnV4LWFwdXMuc291cmNlZm9yZ2UubmV0Lz4uCisJICBUaGUgRnJlZXNjYWxlIEU2MDAgU29DcyBoYXZlIDc0eHggY29yZXMuCiBlbmRjaG9pY2UKIAorY29uZmlnIENMQVNTSUMzMgorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIDZ4eCAmJiBQUENfTVVMVElQTEFURk9STQorCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjVmZGU5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCkBAIC0wLDAgKzEsMjIxIEBACitjb25maWcgUFBDNjQKKwlib29sICI2NC1iaXQga2VybmVsIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNlbGVjdHMgd2hldGhlciBhIDMyLWJpdCBvciBhIDY0LWJpdCBrZXJuZWwKKwkgIHdpbGwgYmUgYnVpbHQuCisKK21lbnUgIlByb2Nlc3NvciBzdXBwb3J0IgorY2hvaWNlCisJcHJvbXB0ICJQcm9jZXNzb3IgVHlwZSIKKwlkZXBlbmRzIG9uIFBQQzMyCisJZGVmYXVsdCA2eHgKKwloZWxwCisJICBUaGVyZSBhcmUgZml2ZSBmYW1pbGllcyBvZiAzMiBiaXQgUG93ZXJQQyBjaGlwcyBzdXBwb3J0ZWQuCisJICBUaGUgbW9zdCBjb21tb24gb25lcyBhcmUgdGhlIGRlc2t0b3AgYW5kIHNlcnZlciBDUFVzICg2MDEsIDYwMywKKwkgIDYwNCwgNzQwLCA3NTAsIDc0eHgpIENQVXMgZnJvbSBGcmVlc2NhbGUgYW5kIElCTSwgd2l0aCB0aGVpcgorCSAgZW1iZWRkZWQgNTJ4eC84Mnh4LzgzeHgvODZ4eCBjb3VudGVycGFydHMuCisJICBUaGUgb3RoZXIgZW1iZWVkZWQgcGFydHMsIG5hbWVseSA0eHgsIDh4eCwgZTIwMCAoNTV4eCkgYW5kIGU1MDAKKwkgICg4NXh4KSBlYWNoIGZvcm0gYSBmYW1pbHkgb2YgdGhlaXIgb3duIHRoYXQgaXMgbm90IGNvbXBhdGlibGUKKwkgIHdpdGggdGhlIG90aGVycy4KKworCSAgSWYgdW5zdXJlLCBzZWxlY3QgNTJ4eC82eHgvN3h4Lzc0eHgvODJ4eC84M3h4Lzg2eHguCisKK2NvbmZpZyA2eHgKKwlib29sICI1Mnh4LzZ4eC83eHgvNzR4eC84Mnh4LzgzeHgvODZ4eCIKKwlzZWxlY3QgUFBDX0ZQVQorCitjb25maWcgUFBDXzg1eHgKKwlib29sICJGcmVlc2NhbGUgODV4eCIKKwlzZWxlY3QgRTUwMAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IDg1eHgKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCitjb25maWcgUFBDXzh4eAorCWJvb2wgIkZyZWVzY2FsZSA4eHgiCisJc2VsZWN0IEZTTF9TT0MKKwlzZWxlY3QgOHh4CisKK2NvbmZpZyA0MHgKKwlib29sICJBTUNDIDQweCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKKworY29uZmlnIDQ0eAorCWJvb2wgIkFNQ0MgNDR4IgorCXNlbGVjdCBQUENfRENSX05BVElWRQorCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCisKK2NvbmZpZyBFMjAwCisJYm9vbCAiRnJlZXNjYWxlIGUyMDAiCisKK2VuZGNob2ljZQorCitjb25maWcgUE9XRVI0X09OTFkKKwlib29sICJPcHRpbWl6ZSBmb3IgUE9XRVI0IgorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBDYXVzZSB0aGUgY29tcGlsZXIgdG8gb3B0aW1pemUgZm9yIFBPV0VSNC9QT1dFUjUvUFBDOTcwIHByb2Nlc3NvcnMuCisJICBUaGUgcmVzdWx0aW5nIGJpbmFyeSB3aWxsIG5vdCB3b3JrIG9uIFBPV0VSMyBvciBSUzY0IHByb2Nlc3NvcnMKKwkgIHdoZW4gY29tcGlsZWQgd2l0aCBiaW51dGlscyAyLjE1IG9yIGxhdGVyLgorCitjb25maWcgUE9XRVIzCisJYm9vbAorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IHkgaWYgIVBPV0VSNF9PTkxZCisKK2NvbmZpZyBQT1dFUjQKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmX2Jvb2wgeQorCitjb25maWcgNnh4CisJYm9vbAorCisjIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKK2NvbmZpZyA4eHgKKwlib29sCisKKyMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYworY29uZmlnIDgzeHgKKwlib29sCisKKyMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYworY29uZmlnIDg1eHgKKwlib29sCisKK2NvbmZpZyBFNTAwCisJYm9vbAorCitjb25maWcgUFBDX0ZQVQorCWJvb2wKKwlkZWZhdWx0IHkgaWYgUFBDNjQKKworY29uZmlnIDR4eAorCWJvb2wKKwlkZXBlbmRzIG9uIDQweCB8fCA0NHgKKwlkZWZhdWx0IHkKKworY29uZmlnIEJPT0tFCisJYm9vbAorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwIHx8IDQ0eAorCWRlZmF1bHQgeQorCitjb25maWcgRlNMX0JPT0tFCisJYm9vbAorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwCisJZGVmYXVsdCB5CisKK2NvbmZpZyBQVEVfNjRCSVQKKwlib29sCisJZGVwZW5kcyBvbiA0NHggfHwgRTUwMAorCWRlZmF1bHQgeSBpZiA0NHgKKwlkZWZhdWx0IHkgaWYgRTUwMCAmJiBQSFlTXzY0QklUCisKK2NvbmZpZyBQSFlTXzY0QklUCisJYm9vbCAnTGFyZ2UgcGh5c2ljYWwgYWRkcmVzcyBzdXBwb3J0JyBpZiBFNTAwCisJZGVwZW5kcyBvbiA0NHggfHwgRTUwMAorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQKKwlkZWZhdWx0IHkgaWYgNDR4CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgbGFyZ2VyIHRoYW4gMzItYml0IHBoeXNpY2FsCisJICBhZGRyZXNzZXMuICBUaGlzIGZlYXR1cmVzIGlzIG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIGU1MDAgY29yZXMuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTiBoZXJlLgorCitjb25maWcgQUxUSVZFQworCWJvb2wgIkFsdGlWZWMgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIENMQVNTSUMzMiB8fCBQT1dFUjQKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgQWx0aXZlYyBleHRlbnNpb25zIHRvIHRoZQorCSAgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5IHN1cHBvcnRzIHNhdmluZyBhbmQgcmVzdG9yaW5nCisJICBhbHRpdmVjIHJlZ2lzdGVycywgYW5kIHR1cm5pbmcgb24gdGhlICdhbHRpdmVjIGVuYWJsZScgYml0IHNvIHVzZXIKKwkgIHByb2Nlc3NlcyBjYW4gZXhlY3V0ZSBhbHRpdmVjIGluc3RydWN0aW9ucy4KKworCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWxseSBpZiB5b3UgaGF2ZSBhIHByb2Nlc3NvciB0aGF0IHN1cHBvcnRzCisJICBhbHRpdmVjIChHNCwgb3RoZXJ3aXNlIGtub3duIGFzIDc0eHggc2VyaWVzKSwgYnV0IGRvZXMgbm90IGhhdmUKKwkgIGFueSBhZmZlY3Qgb24gYSBub24tYWx0aXZlYyBjcHUgKGl0IGRvZXMsIGhvd2V2ZXIgYWRkIGNvZGUgdG8gdGhlCisJICBrZXJuZWwpLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KKworY29uZmlnIFNQRQorCWJvb2wgIlNQRSBTdXBwb3J0IgorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIFNpZ25hbCBQcm9jZXNzaW5nCisJICBFeHRlbnNpb25zIChTUEUpIHRvIHRoZSBQb3dlclBDIHByb2Nlc3Nvci4gVGhlIGtlcm5lbCBjdXJyZW50bHkKKwkgIHN1cHBvcnRzIHNhdmluZyBhbmQgcmVzdG9yaW5nIFNQRSByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZQorCSAgJ3NwZSBlbmFibGUnIGJpdCBzbyB1c2VyIHByb2Nlc3NlcyBjYW4gZXhlY3V0ZSBTUEUgaW5zdHJ1Y3Rpb25zLgorCisJICBUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2Nlc3NvciB0aGF0IHN1cHBvcnRzCisJICBTUEUgKGU1MDAsIG90aGVyd2lzZSBrbm93biBhcyA4NXh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlIGFueQorCSAgZWZmZWN0IG9uIGEgbm9uLXNwZSBjcHUgKGl0IGRvZXMsIGhvd2V2ZXIgYWRkIGNvZGUgdG8gdGhlIGtlcm5lbCkuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgWSBoZXJlLgorCitjb25maWcgUFBDX1NURF9NTVUKKwlib29sCisJZGVwZW5kcyBvbiA2eHggfHwgUE9XRVIzIHx8IFBPV0VSNCB8fCBQUEM2NAorCWRlZmF1bHQgeQorCitjb25maWcgUFBDX1NURF9NTVVfMzIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBQUENfU1REX01NVSAmJiBQUEMzMgorCitjb25maWcgUFBDX01NX1NMSUNFUworCWJvb2wKKwlkZWZhdWx0IHkgaWYgSFVHRVRMQl9QQUdFCisJZGVmYXVsdCBuCisKK2NvbmZpZyBWSVJUX0NQVV9BQ0NPVU5USU5HCisJYm9vbCAiRGV0ZXJtaW5pc3RpYyB0YXNrIGFuZCBDUFUgdGltZSBhY2NvdW50aW5nIgorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIG1vcmUgYWNjdXJhdGUgdGFzayBhbmQgQ1BVIHRpbWUKKwkgIGFjY291bnRpbmcuICBUaGlzIGlzIGRvbmUgYnkgcmVhZGluZyBhIENQVSBjb3VudGVyIG9uIGVhY2gKKwkgIGtlcm5lbCBlbnRyeSBhbmQgZXhpdCBhbmQgb24gdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBrZXJuZWwKKwkgIGJldHdlZW4gc3lzdGVtLCBzb2Z0aXJxIGFuZCBoYXJkaXJxIHN0YXRlLCBzbyB0aGVyZSBpcyBhCisJICBzbWFsbCBwZXJmb3JtYW5jZSBpbXBhY3QuICBUaGlzIGFsc28gZW5hYmxlcyBhY2NvdW50aW5nIG9mCisJICBzdG9sZW4gdGltZSBvbiBsb2dpY2FsbHktcGFydGl0aW9uZWQgc3lzdGVtcyBydW5uaW5nIG9uCisJICBJQk0gUE9XRVI1LWJhc2VkIG1hY2hpbmVzLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KKworY29uZmlnIFNNUAorCWRlcGVuZHMgb24gUFBDX1NURF9NTVUKKwlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUuIElmIHlvdSBoYXZlCisJICBhIHN5c3RlbSB3aXRoIG9ubHkgb25lIENQVSwgc2F5IE4uIElmIHlvdSBoYXZlIGEgc3lzdGVtIHdpdGggbW9yZQorCSAgdGhhbiBvbmUgQ1BVLCBzYXkgWS4gIE5vdGUgdGhhdCB0aGUga2VybmVsIGRvZXMgbm90IGN1cnJlbnRseQorCSAgc3VwcG9ydCBTTVAgbWFjaGluZXMgd2l0aCA2MDMvNjAzZS82MDNldiBvciBQUEM3NTAgKCJHMyIpIHByb2Nlc3NvcnMKKwkgIHNpbmNlIHRoZXkgaGF2ZSBpbmFkZXF1YXRlIGhhcmR3YXJlIHN1cHBvcnQgZm9yIG11bHRpcHJvY2Vzc29yCisJICBvcGVyYXRpb24uCisKKwkgIElmIHlvdSBzYXkgTiBoZXJlLCB0aGUga2VybmVsIHdpbGwgcnVuIG9uIHNpbmdsZSBhbmQgbXVsdGlwcm9jZXNzb3IKKwkgIG1hY2hpbmVzLCBidXQgd2lsbCB1c2Ugb25seSBvbmUgQ1BVIG9mIGEgbXVsdGlwcm9jZXNzb3IgbWFjaGluZS4gSWYKKwkgIHlvdSBzYXkgWSBoZXJlLCB0aGUga2VybmVsIHdpbGwgcnVuIG9uIHNpbmdsZS1wcm9jZXNzb3IgbWFjaGluZXMuCisJICBPbiBhIHNpbmdsZS1wcm9jZXNzb3IgbWFjaGluZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBmYXN0ZXIgaWYgeW91IHNheQorCSAgTiBoZXJlLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCitjb25maWcgTlJfQ1BVUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0xMjgpIgorCXJhbmdlIDIgMTI4CisJZGVwZW5kcyBvbiBTTVAKKwlkZWZhdWx0ICIzMiIgaWYgUFBDNjQKKwlkZWZhdWx0ICI0IgorCitjb25maWcgTk9UX0NPSEVSRU5UX0NBQ0hFCisJYm9vbAorCWRlcGVuZHMgb24gNHh4IHx8IDh4eCB8fCBFMjAwCisJZGVmYXVsdCB5CisKK2NvbmZpZyBDT05GSUdfQ0hFQ0tfQ0FDSEVfQ09IRVJFTkNZCisJYm9vbAorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FwdXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvYXB1cy9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmRlM2JmLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvYXB1cy9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLQotY29uZmlnIEFNSUdBCi0JYm9vbAotCWRlcGVuZHMgb24gQVBVUwotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFtaWdhIHNlcmllcyBvZiBjb21wdXRlcnMuCi0KLWNvbmZpZyBaT1JSTwotCWJvb2wKLQlkZXBlbmRzIG9uIEFQVVMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFpvcnJvIGJ1cyBpbiB0aGUgQW1pZ2EuIElmIHlvdSBoYXZlCi0JICBleHBhbnNpb24gY2FyZHMgaW4geW91ciBBbWlnYSB0aGF0IGNvbmZvcm0gdG8gdGhlIEFtaWdhCi0JICBBdXRvQ29uZmlnKHRtKSBzcGVjaWZpY2F0aW9uLCBzYXkgWSwgb3RoZXJ3aXNlIE4uIE5vdGUgdGhhdCBldmVuCi0JICBleHBhbnNpb24gY2FyZHMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBab3JybyBzbG90cyBidXQgZml0IGluIGUuZy4KLQkgIHRoZSBDUFUgc2xvdCBtYXkgZmFsbCBpbiB0aGlzIGNhdGVnb3J5LCBzbyB5b3UgaGF2ZSB0byBzYXkgWSB0byBsZXQKLQkgIExpbnV4IHVzZSB0aGVzZS4KLQotY29uZmlnIEFCU1RSQUNUX0NPTlNPTEUKLQlib29sCi0JZGVwZW5kcyBvbiBBUFVTCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBBUFVTX0ZBU1RfRVhDRVBUCi0JYm9vbAotCWRlcGVuZHMgb24gQVBVUwotCWRlZmF1bHQgeQotCi1jb25maWcgQU1JR0FfUENNQ0lBCi0JYm9vbCAiQW1pZ2EgMTIwMC82MDAgUENNQ0lBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBpbiB0aGUga2VybmVsIGZvciBwY21jaWEgb24gQW1pZ2EgMTIwMCBhbmQgQW1pZ2EKLQkgIDYwMC4gSWYgeW91IGludGVuZCB0byB1c2UgcGNtY2lhIGNhcmRzIHNheSBZOyBvdGhlcndpc2Ugc2F5IE4uCi0KLWNvbmZpZyBBTUlHQV9CVUlMVElOX1NFUklBTAotCXRyaXN0YXRlICJBbWlnYSBidWlsdGluIHNlcmlhbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIElmIHlvdSB3YW50IHRvIHVzZSB5b3VyIEFtaWdhJ3MgYnVpbHQtaW4gc2VyaWFsIHBvcnQgaW4gTGludXgsCi0JICBhbnN3ZXIgWS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KLQotY29uZmlnIEdWUElPRVhUCi0JdHJpc3RhdGUgIkdWUCBJTy1FeHRlbmRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIElmIHlvdSB3YW50IHRvIHVzZSBhIEdWUCBJTy1FeHRlbmRlciBzZXJpYWwgY2FyZCBpbiBMaW51eCwgc2F5IFkuCi0JICBPdGhlcndpc2UsIHNheSBOLgotCi1jb25maWcgR1ZQSU9FWFRfTFAKLQl0cmlzdGF0ZSAiR1ZQIElPLUV4dGVuZGVyIHBhcmFsbGVsIHByaW50ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEdWUElPRVhUCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIGRyaXZpbmcgYSBwcmludGVyIGZyb20gdGhlIHBhcmFsbGVsIHBvcnQgb24geW91cgotCSAgR1ZQIElPLUV4dGVuZGVyIGNhcmQsIE4gb3RoZXJ3aXNlLgotCi1jb25maWcgR1ZQSU9FWFRfUExJUAotCXRyaXN0YXRlICJHVlAgSU8tRXh0ZW5kZXIgUExJUCBzdXBwb3J0IgotCWRlcGVuZHMgb24gR1ZQSU9FWFQKLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgZG9pbmcgSVAgb3ZlciB0aGUgcGFyYWxsZWwgcG9ydCBvbiB5b3VyIEdWUAotCSAgSU8tRXh0ZW5kZXIgY2FyZCwgTiBvdGhlcndpc2UuCi0KLWNvbmZpZyBNVUxUSUZBQ0VfSUlJX1RUWQotCXRyaXN0YXRlICJNdWx0aWZhY2UgQ2FyZCBJSUkgc2VyaWFsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTCi0JaGVscAotCSAgSWYgeW91IHdhbnQgdG8gdXNlIGEgTXVsdGlmYWNlIElJSSBjYXJkJ3Mgc2VyaWFsIHBvcnQgaW4gTGludXgsCi0JICBhbnN3ZXIgWS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KLQotY29uZmlnIEEyMjMyCi0JdHJpc3RhdGUgIkNvbW1vZG9yZSBBMjIzMiBzZXJpYWwgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBBUFVTCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgdGhlIDIyMzIgNy1wb3J0IHNlcmlhbCBjYXJkIHNoaXBwZWQgd2l0aCB0aGUKLQkgIEFtaWdhIDIwMDAgYW5kIG90aGVyIFpvcnJvLWJ1cyBtYWNoaW5lcywgZGF0aW5nIGZyb20gMTk4OS4gIEF0Ci0JICBhIG1heCBvZiAxOSwyMDAgYnBzLCB0aGUgcG9ydHMgYXJlIHNlcnZlZCBieSBhIDY1NTEgQUNJQSBVQVJUIGNoaXAKLQkgIGVhY2gsIHBsdXMgYSA4NTIwIENJQSwgYW5kIGEgbWFzdGVyIDY1MDIgQ1BVIGFuZCBidWZmZXIgYXMgd2VsbC4gVGhlCi0JICBwb3J0cyB3ZXJlIGNvbm5lY3RlZCB3aXRoIDggcGluIERJTiBjb25uZWN0b3JzIG9uIHRoZSBjYXJkIGJyYWNrZXQsCi0JICBmb3Igd2hpY2ggOCBwaW4gdG8gREIyNSBhZGFwdGVycyB3ZXJlIHN1cHBsaWVkLiBUaGUgY2FyZCBhbHNvIGhhZAotCSAganVtcGVycyBpbnRlcm5hbGx5IHRvIHRvZ2dsZSB2YXJpb3VzIHBpbm5pbmcgY29uZmlndXJhdGlvbnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZTsgYnV0IHRoZW4gImdlbmVyaWNfc2VyaWFsIgotCSAgd2lsbCBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBUaGlzIGhhcyB0byBiZSBsb2FkZWQgYmVmb3JlCi0JICAic2VyX2EyMjMyIi4gSWYgeW91IHdhbnQgdG8gZG8gdGhpcywgYW5zd2VyIE0gaGVyZS4KLQotY29uZmlnIFdISVBQRVRfU0VSSUFMCi0JdHJpc3RhdGUgIkhpc29mdCBXaGlwcGV0IFBDTUNJQSBzZXJpYWwgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFNSUdBX1BDTUNJQQotCWhlbHAKLQkgIEhpU29mdCBoYXMgYSB3ZWIgcGFnZSBhdCA8aHR0cDovL3d3dy5oaXNvZnQuY28udWsvPiwgYnV0IHRoZXJlCi0JICBpcyBubyBsaXN0aW5nIGZvciB0aGUgV2hpcHBldCBpbiB0aGVpciBBbWlnYSBzZWN0aW9uLgotCi1jb25maWcgQVBORQotCXRyaXN0YXRlICJQQ01DSUEgTkUyMDAwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBTUlHQV9QQ01DSUEKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhIFBDTUNJQSBORTIwMDAgY29tcGF0aWJsZSBhZGFwdGVyLCBzYXkgWS4gIE90aGVyd2lzZSwKLQkgIHNheSBOLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcG5lLgotCi1jb25maWcgU0VSSUFMX0NPTlNPTEUKLQlib29sICJTdXBwb3J0IGZvciBzZXJpYWwgcG9ydCBjb25zb2xlIgotCWRlcGVuZHMgb24gQVBVUyAmJiAoQU1JR0FfQlVJTFRJTl9TRVJJQUw9eSB8fCBHVlBJT0VYVD15IHx8IE1VTFRJRkFDRV9JSUlfVFRZPXkpCi0KLWNvbmZpZyBIRUFSVEJFQVQKLQlib29sICJVc2UgcG93ZXIgTEVEIGFzIGEgaGVhcnRiZWF0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIFVzZSB0aGUgcG93ZXItb24gTEVEIG9uIHlvdXIgbWFjaGluZSBhcyBhIGxvYWQgbWV0ZXIuICBUaGUgZXhhY3QKLQkgIGJlaGF2aW9yIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IG5vcm1hbGx5IHRoZSBmbGFzaCBmcmVxdWVuY3kgaXMKLQkgIGEgaHlwZXJib2xpYyBmdW5jdGlvbiBvZiB0aGUgNS1taW51dGUgbG9hZCBhdmVyYWdlLgotCi1jb25maWcgUFJPQ19IQVJEV0FSRQotCWJvb2wgIi9wcm9jL2hhcmR3YXJlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTCi0KLXNvdXJjZSAiZHJpdmVycy96b3Jyby9LY29uZmlnIgotCi1jb25maWcgUENJX1BFUk1FRElBCi0JYm9vbCAiUENJIGZvciBQZXJtZWRpYTIiCi0JZGVwZW5kcyBvbiAhNHh4ICYmICE4eHggJiYgQVBVUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYwppbmRleCA3ZmI5MmYyLi45ZDdjMmVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpUENJX0ZJWF9BRERSKGFkZHIpOwogCiAJCS8qIENoZWNrIGlmIGl0J3MgaW4gYWxsb3dlZCByYW5nZSBmb3IgIFBJTyAqLwotCQlpZiAodmFkZHIgPCBQSEJTX0lPX0JBU0UgfHwgdmFkZHIgPj0gSU1BTExPQ19CQVNFKQorCQlpZiAodmFkZHIgPCBQSEJfSU9fQkFTRSB8fCB2YWRkciA+IFBIQl9JT19FTkQpCiAJCQlyZXR1cm47CiAKIAkJLyogVHJ5IHRvIGZpbmQgYSBQVEUuIElmIG5vdCwgY2xlYXIgdGhlIHBhZGRyLCB3ZSdsbCBkbwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwppbmRleCBhN2Y1YTc2Li45NmE4ZjYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbnV4X2xvZ28uaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgogI2luY2x1ZGUgPGFzbS94bW9uLmg+CkBAIC0xODMsNyArMTg0LDcgQEAKIAkJc3B1LT5zbGJfcmVwbGFjZSA9IDA7CiAKIAlzcHVfcmVzdGFydF9kbWEoc3B1KTsKLQorCXNwdS0+c3RhdHMuc2xiX2ZsdCsrOwogCXJldHVybiAwOwogfQogCkBAIC0zMzIsNiArMzMzLDcgQEAKIAlpZiAoc3RhdCAmIDB4MTApIC8qIFNQVSBtYWlsYm94IHRocmVzaG9sZCAqLwogCQlzcHUtPndib3hfY2FsbGJhY2soc3B1KTsKIAorCXNwdS0+c3RhdHMuY2xhc3MyX2ludHIrKzsKIAlyZXR1cm4gc3RhdCA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7CiB9CiAKQEAgLTQ2Miw4ICs0NjQsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwdV9mcmVlKTsKIAorc3RhdGljIGludCBzcHVfc2h1dGRvd24oc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOworCisJc3B1X2ZyZWVfaXJxcyhzcHUpOworCXNwdV9kZXN0cm95X3NwdShzcHUpOworCXJldHVybiAwOworfQorCiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHNwdV9zeXNkZXZfY2xhc3MgPSB7Ci0Jc2V0X2tzZXRfbmFtZSgic3B1IikKKwlzZXRfa3NldF9uYW1lKCJzcHUiKSwKKwkuc2h1dGRvd24gPSBzcHVfc2h1dGRvd24sCiB9OwogCiBpbnQgc3B1X2FkZF9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cikKQEAgLTU3NCw2ICs1ODYsOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwdV9saXN0X2xvY2ssIGZsYWdzKTsKIAltdXRleF91bmxvY2soJnNwdV9tdXRleCk7CiAKKwlzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlID0gU1BVX1VUSUxfSURMRTsKKwlzcHUtPnN0YXRzLnRzdGFtcCA9IGppZmZpZXM7CisKIAlnb3RvIG91dDsKIAogb3V0X2ZyZWVfaXJxczoKQEAgLTU4Niw2ICs2MDEsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqc3B1X3N0YXRlX25hbWVzW10gPSB7CisJInVzZXIiLCAic3lzdGVtIiwgImlvd2FpdCIsICJpZGxlIgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVfYWNjdF90aW1lKHN0cnVjdCBzcHUgKnNwdSwKKwkJZW51bSBzcHVfdXRpbGl6YXRpb25fc3RhdGUgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWUgPSBzcHUtPnN0YXRzLnRpbWVzW3N0YXRlXTsKKworCWlmIChzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlID09IHN0YXRlKQorCQl0aW1lICs9IGppZmZpZXMgLSBzcHUtPnN0YXRzLnRzdGFtcDsKKworCXJldHVybiBqaWZmaWVzX3RvX21zZWNzKHRpbWUpOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHNwdV9zdGF0X3Nob3coc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcHUgKnNwdSA9IGNvbnRhaW5lcl9vZihzeXNkZXYsIHN0cnVjdCBzcHUsIHN5c2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlbGx1ICVsbHUgJWxsdSAlbGx1ICIKKwkJICAgICAgIiVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJc3B1X3N0YXRlX25hbWVzW3NwdS0+c3RhdHMudXRpbGl6YXRpb25fc3RhdGVdLAorCQlzcHVfYWNjdF90aW1lKHNwdSwgU1BVX1VUSUxfVVNFUiksCisJCXNwdV9hY2N0X3RpbWUoc3B1LCBTUFVfVVRJTF9TWVNURU0pLAorCQlzcHVfYWNjdF90aW1lKHNwdSwgU1BVX1VUSUxfSU9XQUlUKSwKKwkJc3B1X2FjY3RfdGltZShzcHUsIFNQVV9VVElMX0lETEUpLAorCQlzcHUtPnN0YXRzLnZvbF9jdHhfc3dpdGNoLAorCQlzcHUtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2gsCisJCXNwdS0+c3RhdHMuc2xiX2ZsdCwKKwkJc3B1LT5zdGF0cy5oYXNoX2ZsdCwKKwkJc3B1LT5zdGF0cy5taW5fZmx0LAorCQlzcHUtPnN0YXRzLm1hal9mbHQsCisJCXNwdS0+c3RhdHMuY2xhc3MyX2ludHIsCisJCXNwdS0+c3RhdHMubGliYXNzaXN0KTsKK30KKworc3RhdGljIFNZU0RFVl9BVFRSKHN0YXQsIDA2NDQsIHNwdV9zdGF0X3Nob3csIE5VTEwpOworCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwdV9iYXNlKHZvaWQpCiB7CiAJaW50IGksIHJldCA9IDA7CkBAIC02MDMsMTQgKzY1NywyOCBAQAogCiAJcmV0ID0gc3B1X2VudW1lcmF0ZV9zcHVzKGNyZWF0ZV9zcHUpOwogCi0JaWYgKHJldCkgeworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBpbml0aWFsaXppbmcgc3B1c1xuIiwKIAkJCV9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gb3V0X3VucmVnaXN0ZXJfc3lzZGV2X2NsYXNzOwogCX0KIAorCWlmIChyZXQgPiAwKSB7CisJCS8qCisJCSAqIFdlIGNhbm5vdCBwdXQgdGhlIGZvcndhcmQgZGVjbGFyYXRpb24gaW4KKwkJICogPGxpbnV4L2xpbnV4X2xvZ28uaD4gYmVjYXVzZSBvZiBjb25mbGljdGluZyBzZXNzaW9uIHR5cGUKKwkJICogY29uZmxpY3RzIGZvciBjb25zdCBhbmQgX19pbml0ZGF0YSB3aXRoIGRpZmZlcmVudCBjb21waWxlcgorCQkgKiB2ZXJzaW9ucworCQkgKi8KKwkJZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvIGxvZ29fc3BlX2NsdXQyMjQ7CisKKwkJZmJfYXBwZW5kX2V4dHJhX2xvZ28oJmxvZ29fc3BlX2NsdXQyMjQsIHJldCk7CisJfQorCiAJeG1vbl9yZWdpc3Rlcl9zcHVzKCZzcHVfZnVsbF9saXN0KTsKIAorCXNwdV9hZGRfc3lzZGV2X2F0dHIoJmF0dHJfc3RhdCk7CisKIAlyZXR1cm4gMDsKIAogIG91dF91bnJlZ2lzdGVyX3N5c2Rldl9jbGFzczoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCmluZGV4IDFkNDU2MmEuLjc1ZWQ1MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYwpAQCAtMjc5LDYgKzI3OSw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJdW5zaWduZWQgaW50IG4gPSAwOwogCiAJcmV0ID0gLUVOT0RFVjsKIAlmb3IgKG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAic3BlIik7CkBAIC0yODksOCArMjkwLDkgQEAKIAkJCQlfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUpOwogCQkJYnJlYWs7CiAJCX0KKwkJbisrOwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZXQgPyByZXQgOiBuOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBvZl9jcmVhdGVfc3B1KHN0cnVjdCBzcHUgKnNwdSwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKaW5kZXggZDMyZGI5Zi4uMDdhMGU4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKQEAgLTMyMCw2ICszMjAsMTIgQEAKIAkvKiBGSVhNRTogd2hhdCBhcmUgdGhlIHNpZGUtZWZmZWN0cyBvZiB0aGlzPyAqLwogCXByb2ItPmRtYV9xdWVyeW1hc2tfUlcgPSBtYXNrOwogCXByb2ItPmRtYV9xdWVyeXR5cGVfUlcgPSBtb2RlOworCS8qIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgU1BVIGNvbnRleHQgaXMgYWx3YXlzCisJICogYWNxdWlyZWQgaW4gcnVubmFibGUgc3RhdGUgd2hlbiBuZXcgYml0cyBhcmUgYWRkZWQgdG8gdGhlCisJICogbWFzayAodGFnd2FpdCksIHNvIGl0J3Mgc3VmZmljaWVudCBqdXN0IHRvIG1hc2sKKwkgKiBkbWFfdGFnc3RhdHVzX1Igd2l0aCB0aGUgJ21hc2snIHBhcmFtZXRlciBoZXJlLgorCSAqLworCWN0eC0+Y3NhLnByb2IuZG1hX3RhZ3N0YXR1c19SICY9IG1hc2s7CiBvdXQ6CiAJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYwppbmRleCA3YzUxY2I1Li42ZDdiZDYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKQEAgLTIzLDEwICsyMywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgogI2luY2x1ZGUgInNwdWZzLmgiCiAKKworYXRvbWljX3QgbnJfc3B1X2NvbnRleHRzID0gQVRPTUlDX0lOSVQoMCk7CisKIHN0cnVjdCBzcHVfY29udGV4dCAqYWxsb2Nfc3B1X2NvbnRleHQoc3RydWN0IHNwdV9nYW5nICpnYW5nKQogewogCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OwpAQCAtNTMsMTAgKzU3LDEyIEBACiAJSU5JVF9MSVNUX0hFQUQoJmN0eC0+cnEpOwogCWlmIChnYW5nKQogCQlzcHVfZ2FuZ19hZGRfY3R4KGdhbmcsIGN0eCk7Ci0JY3R4LT5ydF9wcmlvcml0eSA9IGN1cnJlbnQtPnJ0X3ByaW9yaXR5OwotCWN0eC0+cG9saWN5ID0gY3VycmVudC0+cG9saWN5OwotCWN0eC0+cHJpbyA9IGN1cnJlbnQtPnByaW87Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmN0eC0+c2NoZWRfd29yaywgc3B1X3NjaGVkX3RpY2spOworCWN0eC0+Y3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNwdV9zZXRfdGltZXNsaWNlKGN0eCk7CisJY3R4LT5zdGF0cy5leGVjdXRpb25fc3RhdGUgPSBTUFVDVFhfVVRJTF9VU0VSOworCWN0eC0+c3RhdHMudHN0YW1wID0gamlmZmllczsKKworCWF0b21pY19pbmMoJm5yX3NwdV9jb250ZXh0cyk7CiAJZ290byBvdXQ7CiBvdXRfZnJlZToKIAlrZnJlZShjdHgpOwpAQCAtNzYsNiArODIsNyBAQAogCWlmIChjdHgtPmdhbmcpCiAJCXNwdV9nYW5nX3JlbW92ZV9jdHgoY3R4LT5nYW5nLCBjdHgpOwogCUJVR19PTighbGlzdF9lbXB0eSgmY3R4LT5ycSkpOworCWF0b21pY19kZWMoJm5yX3NwdV9jb250ZXh0cyk7CiAJa2ZyZWUoY3R4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwppbmRleCAwZjc1YzA3Li5lMDY0ZDBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwpAQCAtMzMsNyArMzMsOCBAQAogICogZnVuY3Rpb24uIEN1cnJlbnRseSwgdGhlcmUgYXJlIGEgZmV3IGNvcm5lciBjYXNlcyB0aGF0IHdlIGhhdmVuJ3QgaGFkCiAgKiB0byBoYW5kbGUgZm9ydHVuYXRlbHkuCiAgKi8KLXN0YXRpYyBpbnQgc3B1X2hhbmRsZV9tbV9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBkc2lzcikKK3N0YXRpYyBpbnQgc3B1X2hhbmRsZV9tbV9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwKKwkJdW5zaWduZWQgbG9uZyBkc2lzciwgdW5zaWduZWQgKmZsdCkKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAl1bnNpZ25lZCBsb25nIGlzX3dyaXRlOwpAQCAtNzMsNyArNzQsOCBAQAogCQkJZ290byBiYWRfYXJlYTsKIAl9CiAJcmV0ID0gMDsKLQlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpKSB7CisJKmZsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpOworCXN3aXRjaCAoKmZsdCkgewogCWNhc2UgVk1fRkFVTFRfTUlOT1I6CiAJCWN1cnJlbnQtPm1pbl9mbHQrKzsKIAkJYnJlYWs7CkBAIC0xNTMsNiArMTU1LDcgQEAKIHsKIAl1NjQgZWEsIGRzaXNyLCBhY2Nlc3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBmbHQgPSAwOwogCWludCByZXQ7CiAKIAkvKgpAQCAtMTc4LDkgKzE4MSwxNyBAQAogCWlmICghKGRzaXNyICYgKE1GQ19EU0lTUl9QVEVfTk9UX0ZPVU5EIHwgTUZDX0RTSVNSX0FDQ0VTU19ERU5JRUQpKSkKIAkJcmV0dXJuIDA7CiAKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfSU9XQUlUKTsKKwogCXByX2RlYnVnKCJjdHggJXA6IGVhICUwMTZseCwgZHNpc3IgJTAxNmx4IHN0YXRlICVkXG4iLCBjdHgsIGVhLAogCQlkc2lzciwgY3R4LT5zdGF0ZSk7CiAKKwljdHgtPnN0YXRzLmhhc2hfZmx0Kys7CisJaWYgKGN0eC0+c3RhdGUgPT0gU1BVX1NUQVRFX1JVTk5BQkxFKSB7CisJCWN0eC0+c3B1LT5zdGF0cy5oYXNoX2ZsdCsrOworCQlzcHVfc3dpdGNoX3N0YXRlKGN0eC0+c3B1LCBTUFVfVVRJTF9JT1dBSVQpOworCX0KKwogCS8qIHdlIG11c3Qgbm90IGhvbGQgdGhlIGxvY2sgd2hlbiBlbnRlcmluZyBzcHVfaGFuZGxlX21tX2ZhdWx0ICovCiAJc3B1X3JlbGVhc2UoY3R4KTsKIApAQCAtMTkyLDcgKzIwMyw3IEBACiAKIAkvKiBoYXNoaW5nIGZhaWxlZCwgc28gdHJ5IHRoZSBhY3R1YWwgZmF1bHQgaGFuZGxlciAqLwogCWlmIChyZXQpCi0JCXJldCA9IHNwdV9oYW5kbGVfbW1fZmF1bHQoY3VycmVudC0+bW0sIGVhLCBkc2lzcik7CisJCXJldCA9IHNwdV9oYW5kbGVfbW1fZmF1bHQoY3VycmVudC0+bW0sIGVhLCBkc2lzciwgJmZsdCk7CiAKIAlzcHVfYWNxdWlyZShjdHgpOwogCS8qCkBAIC0yMDEsMTEgKzIxMiwyMyBAQAogCSAqIEluIGNhc2Ugb2YgdW5oYW5kbGVkIGVycm9yIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB1c2VyIHNwYWNlLgogCSAqLwogCWlmICghcmV0KSB7CisJCWlmIChmbHQgPT0gVk1fRkFVTFRfTUlOT1IpCisJCQljdHgtPnN0YXRzLm1pbl9mbHQrKzsKKwkJZWxzZQorCQkJY3R4LT5zdGF0cy5tYWpfZmx0Kys7CisJCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQkJaWYgKGZsdCA9PSBWTV9GQVVMVF9NSU5PUikKKwkJCQljdHgtPnNwdS0+c3RhdHMubWluX2ZsdCsrOworCQkJZWxzZQorCQkJCWN0eC0+c3B1LT5zdGF0cy5tYWpfZmx0Kys7CisJCX0KKwogCQlpZiAoY3R4LT5zcHUpCiAJCQljdHgtPm9wcy0+cmVzdGFydF9kbWEoY3R4KTsKIAl9IGVsc2UKIAkJc3B1ZnNfaGFuZGxlX2RtYV9lcnJvcihjdHgsIGVhLCBTUEVfRVZFTlRfU1BFX0RBVEFfU1RPUkFHRSk7CiAKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfU1lTVEVNKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3B1ZnNfaGFuZGxlX2NsYXNzMSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwppbmRleCBiMWU3ZTJmLi5jMjgxNGVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CkBAIC0zOSw2ICs0MCw3IEBACiAKICNkZWZpbmUgU1BVRlNfTU1BUF80SyAoUEFHRV9TSVpFID09IDB4MTAwMCkKIAorCiBzdGF0aWMgaW50CiBzcHVmc19tZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKQEAgLTIxNiwxMiArMjE4LDEyIEBACiAjZW5kaWYgLyogQ09ORklHX1NQVV9GU182NEtfTFMgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfbWVtX2ZvcHMgPSB7Ci0JLm9wZW4JIAkJPSBzcHVmc19tZW1fb3BlbiwKLQkucmVsZWFzZSAJCT0gc3B1ZnNfbWVtX3JlbGVhc2UsCi0JLnJlYWQgICAJCT0gc3B1ZnNfbWVtX3JlYWQsCi0JLndyaXRlICAgCQk9IHNwdWZzX21lbV93cml0ZSwKLQkubGxzZWVrICAJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkubW1hcCAgICAJCT0gc3B1ZnNfbWVtX21tYXAsCisJLm9wZW4JCQk9IHNwdWZzX21lbV9vcGVuLAorCS5yZWxlYXNlCQk9IHNwdWZzX21lbV9yZWxlYXNlLAorCS5yZWFkCQkJPSBzcHVmc19tZW1fcmVhZCwKKwkud3JpdGUJCQk9IHNwdWZzX21lbV93cml0ZSwKKwkubGxzZWVrCQkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5tbWFwCQkJPSBzcHVmc19tZW1fbW1hcCwKICNpZmRlZiBDT05GSUdfU1BVX0ZTXzY0S19MUwogCS5nZXRfdW5tYXBwZWRfYXJlYQk9IHNwdWZzX2dldF91bm1hcHBlZF9hcmVhLAogI2VuZGlmCkBAIC0xNDk3LDE0ICsxNDk5LDE1IEBACiAJCWlmIChzdGF0dXMpCiAJCQlyZXQgPSBzdGF0dXM7CiAJfQotCXNwdV9yZWxlYXNlKGN0eCk7CiAKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJY3R4LT50YWd3YWl0IHw9IDEgPDwgY21kLnRhZzsKIAlyZXQgPSBzaXplOwogCitvdXRfdW5sb2NrOgorCXNwdV9yZWxlYXNlKGN0eCk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MTUsMTQgKzE1MTgsMTQgQEAKIAl1MzIgZnJlZV9lbGVtZW50cywgdGFnc3RhdHVzOwogCXVuc2lnbmVkIGludCBtYXNrOwogCisJcG9sbF93YWl0KGZpbGUsICZjdHgtPm1mY193cSwgd2FpdCk7CisKIAlzcHVfYWNxdWlyZShjdHgpOwogCWN0eC0+b3BzLT5zZXRfbWZjX3F1ZXJ5KGN0eCwgY3R4LT50YWd3YWl0LCAyKTsKIAlmcmVlX2VsZW1lbnRzID0gY3R4LT5vcHMtPmdldF9tZmNfZnJlZV9lbGVtZW50cyhjdHgpOwogCXRhZ3N0YXR1cyA9IGN0eC0+b3BzLT5yZWFkX21mY190YWdzdGF0dXMoY3R4KTsKIAlzcHVfcmVsZWFzZShjdHgpOwogCi0JcG9sbF93YWl0KGZpbGUsICZjdHgtPm1mY193cSwgd2FpdCk7Ci0KIAltYXNrID0gMDsKIAlpZiAoZnJlZV9lbGVtZW50cyAmIDB4ZmZmZikKIAkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKQEAgLTE3OTcsNiArMTgwMCwyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNwdWZzX2NhcHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkpCisJCXNlcV9wdXRzKHMsICJzY2hlZFxuIik7CisJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfSVNPTEFURSkpCisJCXNlcV9wdXRzKHMsICJzdGVwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc19jYXBzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNwdWZzX2NhcHNfc2hvdywgU1BVRlNfSShpbm9kZSktPmlfY3R4KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfY2Fwc19mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX2NhcHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKwogc3RhdGljIHNzaXplX3QgX19zcHVmc19tYm94X2luZm9fcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKIAkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQogewpAQCAtMjAxNCw3ICsyMDQwLDEwNSBAQAogCS5yZWFkID0gc3B1ZnNfcHJveHlkbWFfaW5mb19yZWFkLAogfTsKIAorc3RhdGljIGludCBzcHVmc19zaG93X3RpZChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihzLCAiJWRcbiIsIGN0eC0+dGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc190aWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc3B1ZnNfc2hvd190aWQsIFNQVUZTX0koaW5vZGUpLT5pX2N0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX3RpZF9mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX3RpZF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3R4X3N0YXRlX25hbWVzW10gPSB7CisJInVzZXIiLCAic3lzdGVtIiwgImlvd2FpdCIsICJsb2FkZWQiCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX2FjY3RfdGltZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgdGltZSA9IGN0eC0+c3RhdHMudGltZXNbc3RhdGVdOworCisJaWYgKGN0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlID09IHN0YXRlKQorCQl0aW1lICs9IGppZmZpZXMgLSBjdHgtPnN0YXRzLnRzdGFtcDsKKworCXJldHVybiBqaWZmaWVzX3RvX21zZWNzKHRpbWUpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX3NsYl9mbHRzKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzbGJfZmx0cyA9IGN0eC0+c3RhdHMuc2xiX2ZsdDsKKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQlzbGJfZmx0cyArPSAoY3R4LT5zcHUtPnN0YXRzLnNsYl9mbHQgLQorCQkJICAgICBjdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSk7CisJfQorCisJcmV0dXJuIHNsYl9mbHRzOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX2NsYXNzMl9pbnRycyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2xhc3MyX2ludHJzID0gY3R4LT5zdGF0cy5jbGFzczJfaW50cjsKKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQljbGFzczJfaW50cnMgKz0gKGN0eC0+c3B1LT5zdGF0cy5jbGFzczJfaW50ciAtCisJCQkJIGN0eC0+c3RhdHMuY2xhc3MyX2ludHJfYmFzZSk7CisJfQorCisJcmV0dXJuIGNsYXNzMl9pbnRyczsKK30KKworCitzdGF0aWMgaW50IHNwdWZzX3Nob3dfc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJc3B1X2FjcXVpcmUoY3R4KTsKKwlzZXFfcHJpbnRmKHMsICIlcyAlbGx1ICVsbHUgJWxsdSAlbGx1ICIKKwkJICAgICAgIiVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJY3R4X3N0YXRlX25hbWVzW2N0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlXSwKKwkJc3B1ZnNfYWNjdF90aW1lKGN0eCwgU1BVQ1RYX1VUSUxfVVNFUiksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX1NZU1RFTSksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX0lPV0FJVCksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX0xPQURFRCksCisJCWN0eC0+c3RhdHMudm9sX2N0eF9zd2l0Y2gsCisJCWN0eC0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCwKKwkJc3B1ZnNfc2xiX2ZsdHMoY3R4KSwKKwkJY3R4LT5zdGF0cy5oYXNoX2ZsdCwKKwkJY3R4LT5zdGF0cy5taW5fZmx0LAorCQljdHgtPnN0YXRzLm1hal9mbHQsCisJCXNwdWZzX2NsYXNzMl9pbnRycyhjdHgpLAorCQljdHgtPnN0YXRzLmxpYmFzc2lzdCk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc19zdGF0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNwdWZzX3Nob3dfc3RhdCwgU1BVRlNfSShpbm9kZSktPmlfY3R4KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfc3RhdF9mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX3N0YXRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworCiBzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfY29udGVudHNbXSA9IHsKKwl7ICJjYXBhYmlsaXRpZXMiLCAmc3B1ZnNfY2Fwc19mb3BzLCAwNDQ0LCB9LAogCXsgIm1lbSIsICAmc3B1ZnNfbWVtX2ZvcHMsICAwNjY2LCB9LAogCXsgInJlZ3MiLCAmc3B1ZnNfcmVnc19mb3BzLCAgMDY2NiwgfSwKIAl7ICJtYm94IiwgJnNwdWZzX21ib3hfZm9wcywgMDQ0NCwgfSwKQEAgLTIwNDYsMTAgKzIxNzAsMTMgQEAKIAl7ICJ3Ym94X2luZm8iLCAmc3B1ZnNfd2JveF9pbmZvX2ZvcHMsIDA0NDQsIH0sCiAJeyAiZG1hX2luZm8iLCAmc3B1ZnNfZG1hX2luZm9fZm9wcywgMDQ0NCwgfSwKIAl7ICJwcm94eWRtYV9pbmZvIiwgJnNwdWZzX3Byb3h5ZG1hX2luZm9fZm9wcywgMDQ0NCwgfSwKKwl7ICJ0aWQiLCAmc3B1ZnNfdGlkX2ZvcHMsIDA0NDQsIH0sCisJeyAic3RhdCIsICZzcHVmc19zdGF0X2ZvcHMsIDA0NDQsIH0sCiAJe30sCiB9OwogCiBzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfbm9zY2hlZF9jb250ZW50c1tdID0geworCXsgImNhcGFiaWxpdGllcyIsICZzcHVmc19jYXBzX2ZvcHMsIDA0NDQsIH0sCiAJeyAibWVtIiwgICZzcHVmc19tZW1fZm9wcywgIDA2NjYsIH0sCiAJeyAibWJveCIsICZzcHVmc19tYm94X2ZvcHMsIDA0NDQsIH0sCiAJeyAiaWJveCIsICZzcHVmc19pYm94X2ZvcHMsIDA0NDQsIH0sCkBAIC0yMDY4LDYgKzIxOTUsOCBAQAogCXsgInBzbWFwIiwgJnNwdWZzX3BzbWFwX2ZvcHMsIDA2NjYsIH0sCiAJeyAicGh5cy1pZCIsICZzcHVmc19pZF9vcHMsIDA2NjYsIH0sCiAJeyAib2JqZWN0LWlkIiwgJnNwdWZzX29iamVjdF9pZF9vcHMsIDA2NjYsIH0sCisJeyAidGlkIiwgJnNwdWZzX3RpZF9mb3BzLCAwNDQ0LCB9LAorCXsgInN0YXQiLCAmc3B1ZnNfc3RhdF9mb3BzLCAwNDQ0LCB9LAogCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwppbmRleCA5ODA3MjA2Li5mMzc0NjBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwpAQCAtMjMyLDEwICsyMzIsNiBAQAogCXJldHVybiBkY2FjaGVfZGlyX2Nsb3NlKGlub2RlLCBmaWxlKTsKIH0KIAotY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3B1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLmxvb2t1cCA9IHNpbXBsZV9sb29rdXAsCi19OwotCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2NvbnRleHRfZm9wcyA9IHsKIAkub3BlbgkJPSBkY2FjaGVfZGlyX29wZW4sCiAJLnJlbGVhc2UJPSBzcHVmc19kaXJfY2xvc2UsCkBAIC0yNjksNyArMjY1LDcgQEAKIAkJZ290byBvdXRfaXB1dDsKIAogCWN0eC0+ZmxhZ3MgPSBmbGFnczsKLQlpbm9kZS0+aV9vcCA9ICZzcHVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAlpZiAoZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpCiAJCXJldCA9IHNwdWZzX2ZpbGxfZGlyKGRlbnRyeSwgc3B1ZnNfZGlyX25vc2NoZWRfY29udGVudHMsCkBAIC0zODYsNyArMzgyLDcgQEAKIAlpZiAoIWdhbmcpCiAJCWdvdG8gb3V0X2lwdXQ7CiAKLQlpbm9kZS0+aV9vcCA9ICZzcHVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CkBAIC01OTMsNyArNTg5LDcgQEAKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dDsKIAotCWlub2RlLT5pX29wID0gJnNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwogCVNQVUZTX0koaW5vZGUpLT5pX2N0eCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYwppbmRleCA1NzYyNjYwLi41OGFlMTNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCkBAIC0yOSw3ICsyOSw4IEBACiAJc3B1ID0gY3R4LT5zcHU7CiAJcHRlX2ZhdWx0ID0gc3B1LT5kc2lzciAmCiAJICAgIChNRkNfRFNJU1JfUFRFX05PVF9GT1VORCB8IE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKTsKLQlyZXR1cm4gKCEoKnN0YXQgJiAweDEpIHx8IHB0ZV9mYXVsdCB8fCBzcHUtPmNsYXNzXzBfcGVuZGluZykgPyAxIDogMDsKKwlyZXR1cm4gKCEoKnN0YXQgJiBTUFVfU1RBVFVTX1JVTk5JTkcpIHx8IHB0ZV9mYXVsdCB8fCBzcHUtPmNsYXNzXzBfcGVuZGluZykgPworCQkxIDogMDsKIH0KIAogc3RhdGljIGludCBzcHVfc2V0dXBfaXNvbGF0ZWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCkBAIC0xNDIsOCArMTQzLDExIEBACiAJCQlydW5jbnRsID0gU1BVX1JVTkNOVExfUlVOTkFCTEU7CiAJCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgcnVuY250bCk7CiAJfSBlbHNlIHsKLQkJc3B1X3N0YXJ0X3RpY2soY3R4KTsKKwkJdW5zaWduZWQgbG9uZyBtb2RlID0gU1BVX1BSSVZDTlRMX01PREVfTk9STUFMOwogCQljdHgtPm9wcy0+bnBjX3dyaXRlKGN0eCwgKm5wYyk7CisJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJCW1vZGUgPSBTUFVfUFJJVkNOVExfTU9ERV9TSU5HTEVfU1RFUDsKKwkJb3V0X2JlNjQoJmN0eC0+c3B1LT5wcml2Mi0+c3B1X3ByaXZjbnRsX1JXLCBtb2RlKTsKIAkJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LCBTUFVfUlVOQ05UTF9SVU5OQUJMRSk7CiAJfQogCkBAIC0xNTUsNyArMTU5LDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXNwdV9zdG9wX3RpY2soY3R4KTsKIAkqc3RhdHVzID0gY3R4LT5vcHMtPnN0YXR1c19yZWFkKGN0eCk7CiAJKm5wYyA9IGN0eC0+b3BzLT5ucGNfcmVhZChjdHgpOwogCXNwdV9yZWxlYXNlKGN0eCk7CkBAIC0yOTgsOSArMzAxLDIyIEBACiAJY3R4LT5vcHMtPm1hc3Rlcl9zdGFydChjdHgpOwogCWN0eC0+ZXZlbnRfcmV0dXJuID0gMDsKIAotCXJldCA9IHNwdV9hY3F1aXJlX3J1bm5hYmxlKGN0eCwgMCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlzcHVfYWNxdWlyZShjdHgpOworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9TQVZFRCkgeworCQlfX3NwdV91cGRhdGVfc2NoZWRfaW5mbyhjdHgpOworCisJCXJldCA9IHNwdV9hY3RpdmF0ZShjdHgsIDApOworCQlpZiAocmV0KSB7CisJCQlzcHVfcmVsZWFzZShjdHgpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBoYXZlIHRvIHVwZGF0ZSB0aGUgc2NoZWR1bGluZyBwcmlvcml0eSB1bmRlciBhY3RpdmVfbXV0ZXgKKwkJICogdG8gcHJvdGVjdCBhZ2FpbnN0IGZpbmRfdmljdGltKCkuCisJCSAqLworCQlzcHVfdXBkYXRlX3NjaGVkX2luZm8oY3R4KTsKKwl9CiAKIAlyZXQgPSBzcHVfcnVuX2luaXQoY3R4LCBucGMpOwogCWlmIChyZXQpIHsKQEAgLTMyNSwxNiArMzQxLDIwIEBACiAKIAkJaWYgKHVubGlrZWx5KGN0eC0+c3RhdGUgIT0gU1BVX1NUQVRFX1JVTk5BQkxFKSkgewogCQkJcmV0ID0gc3B1X3JlYWNxdWlyZV9ydW5uYWJsZShjdHgsIG5wYywgJnN0YXR1cyk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJc3B1X3N0b3BfdGljayhjdHgpOworCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dDI7Ci0JCQl9CiAJCQljb250aW51ZTsKIAkJfQogCQlyZXQgPSBzcHVfcHJvY2Vzc19ldmVudHMoY3R4KTsKIAogCX0gd2hpbGUgKCFyZXQgJiYgIShzdGF0dXMgJiAoU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1AgfAotCQkJCSAgICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUKSkpOworCQkJCSAgICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUIHwKKwkJCQkgICAgICAgU1BVX1NUQVRVU19TSU5HTEVfU1RFUCkpKTsKKworCWlmICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApICYmCisJICAgICgoKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpICYgMHgzZjAwKSA9PSAweDIxMDApICYmCisJICAgIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkpCisJCWN0eC0+c3RhdHMubGliYXNzaXN0Kys7CiAKIAljdHgtPm9wcy0+bWFzdGVyX3N0b3AoY3R4KTsKIAlyZXQgPSBzcHVfcnVuX2ZpbmkoY3R4LCBucGMsICZzdGF0dXMpOwpAQCAtMzQ0LDEwICszNjQsMTUgQEAKIAlpZiAoKHJldCA9PSAwKSB8fAogCSAgICAoKHJldCA9PSAtRVJFU1RBUlRTWVMpICYmCiAJICAgICAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUKSB8fAorCSAgICAgIChzdGF0dXMgJiBTUFVfU1RBVFVTX1NJTkdMRV9TVEVQKSB8fAogCSAgICAgICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApICYmCiAJICAgICAgIChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUICE9IDB4MjEwNCkpKSkpCiAJCXJldCA9IHN0YXR1czsKIAorCS8qIE5vdGU6IHdlIGRvbid0IG5lZWQgdG8gZm9yY2Vfc2lnIFNJR1RSQVAgb24gc2luZ2xlLXN0ZXAKKwkgKiBzaW5jZSB3ZSBoYXZlIFRJRl9TSU5HTEVTVEVQIHNldCwgdGh1cyB0aGUga2VybmVsIHdpbGwgZG8KKwkgKiBpdCB1cG9uIHJldHVybiBmcm9tIHRoZSBzeXNjYWxsIGFueWF3eQorCSAqLwogCWlmICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApCiAJICAgICYmIChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUKSA9PSAweDNmZmYpIHsKIAkJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCAzYjgzMWUwLi5lNWI0ZGQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtMzUsNiArMzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9udW1hLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KQEAgLTQzLDU0ICs0NywxMjYgQEAKICNpbmNsdWRlIDxhc20vc3B1X3ByaXYxLmg+CiAjaW5jbHVkZSAic3B1ZnMuaCIKIAotI2RlZmluZSBTUFVfVElNRVNMSUNFCShIWikKLQogc3RydWN0IHNwdV9wcmlvX2FycmF5IHsKIAlERUNMQVJFX0JJVE1BUChiaXRtYXAsIE1BWF9QUklPKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJ1bnFbTUFYX1BSSU9dOwogCXNwaW5sb2NrX3QgcnVucV9sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX2xpc3RbTUFYX05VTU5PREVTXTsKIAlzdHJ1Y3QgbXV0ZXggYWN0aXZlX211dGV4W01BWF9OVU1OT0RFU107CisJaW50IG5yX2FjdGl2ZVtNQVhfTlVNTk9ERVNdOworCWludCBucl93YWl0aW5nOwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgc3B1X2F2ZW5ydW5bM107CiBzdGF0aWMgc3RydWN0IHNwdV9wcmlvX2FycmF5ICpzcHVfcHJpbzsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc3B1X3NjaGVkX3dxOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3B1c2NoZWRfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzcHVzY2hlZF90aW1lcjsKIAotc3RhdGljIGlubGluZSBpbnQgbm9kZV9hbGxvd2VkKGludCBub2RlKQorLyoKKyAqIFByaW9yaXR5IG9mIGEgbm9ybWFsLCBub24tcnQsIG5vbi1uaWNlZCdkIHByb2Nlc3MgKGFrYSBuaWNlIGxldmVsIDApLgorICovCisjZGVmaW5lIE5PUk1BTF9QUklPCQkxMjAKKworLyoKKyAqIEZyZXF1ZW5jeSBvZiB0aGUgc3B1IHNjaGVkdWxlciB0aWNrLiAgQnkgZGVmYXVsdCB3ZSBkbyBvbmUgU1BVIHNjaGVkdWxlcgorICogdGljayBmb3IgZXZlcnkgMTAgQ1BVIHNjaGVkdWxlciB0aWNrcy4KKyAqLworI2RlZmluZSBTUFVTQ0hFRF9USUNLCQkoMTApCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlICd0dW5pbmcga25vYnMnIG9mIHRoZSBzY2hlZHVsZXI6CisgKgorICogTWluaW11bSB0aW1lc2xpY2UgaXMgNSBtc2VjcyAob3IgMSBzcHUgc2NoZWR1bGVyIHRpY2ssIHdoaWNoZXZlciBpcworICogbGFyZ2VyKSwgZGVmYXVsdCB0aW1lc2xpY2UgaXMgMTAwIG1zZWNzLCBtYXhpbXVtIHRpbWVzbGljZSBpcyA4MDAgbXNlY3MuCisgKi8KKyNkZWZpbmUgTUlOX1NQVV9USU1FU0xJQ0UJbWF4KDUgKiBIWiAvICgxMDAwICogU1BVU0NIRURfVElDSyksIDEpCisjZGVmaW5lIERFRl9TUFVfVElNRVNMSUNFCSgxMDAgKiBIWiAvICgxMDAwICogU1BVU0NIRURfVElDSykpCisKKyNkZWZpbmUgTUFYX1VTRVJfUFJJTwkJKE1BWF9QUklPIC0gTUFYX1JUX1BSSU8pCisjZGVmaW5lIFNDQUxFX1BSSU8oeCwgcHJpbykgXAorCW1heCh4ICogKE1BWF9QUklPIC0gcHJpbykgLyAoTUFYX1VTRVJfUFJJTyAvIDIpLCBNSU5fU1BVX1RJTUVTTElDRSkKKworLyoKKyAqIHNjYWxlIHVzZXItbmljZSB2YWx1ZXMgWyAtMjAgLi4uIDAgLi4uIDE5IF0gdG8gdGltZSBzbGljZSB2YWx1ZXM6CisgKiBbODAwbXMgLi4uIDEwMG1zIC4uLiA1bXNdCisgKgorICogVGhlIGhpZ2hlciBhIHRocmVhZCdzIHByaW9yaXR5LCB0aGUgYmlnZ2VyIHRpbWVzbGljZXMKKyAqIGl0IGdldHMgZHVyaW5nIG9uZSByb3VuZCBvZiBleGVjdXRpb24uIEJ1dCBldmVuIHRoZSBsb3dlc3QKKyAqIHByaW9yaXR5IHRocmVhZCBnZXRzIE1JTl9USU1FU0xJQ0Ugd29ydGggb2YgZXhlY3V0aW9uIHRpbWUuCisgKi8KK3ZvaWQgc3B1X3NldF90aW1lc2xpY2Uoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0JY3B1bWFza190IG1hc2s7Ci0KLQlpZiAoIW5yX2NwdXNfbm9kZShub2RlKSkKLQkJcmV0dXJuIDA7Ci0JbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKLQlpZiAoIWNwdXNfaW50ZXJzZWN0cyhtYXNrLCBjdXJyZW50LT5jcHVzX2FsbG93ZWQpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKwlpZiAoY3R4LT5wcmlvIDwgTk9STUFMX1BSSU8pCisJCWN0eC0+dGltZV9zbGljZSA9IFNDQUxFX1BSSU8oREVGX1NQVV9USU1FU0xJQ0UgKiA0LCBjdHgtPnByaW8pOworCWVsc2UKKwkJY3R4LT50aW1lX3NsaWNlID0gU0NBTEVfUFJJTyhERUZfU1BVX1RJTUVTTElDRSwgY3R4LT5wcmlvKTsKIH0KIAotdm9pZCBzcHVfc3RhcnRfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKKy8qCisgKiBVcGRhdGUgc2NoZWR1bGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLgorICovCit2b2lkIF9fc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWlmIChjdHgtPnBvbGljeSA9PSBTQ0hFRF9SUikgewotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhlIGV4aXRpbmcgYml0IGlzIGNsZWFyZWQuCi0JCSAqLwotCQljbGVhcl9iaXQoU1BVX1NDSEVEX0VYSVRJTkcsICZjdHgtPnNjaGVkX2ZsYWdzKTsKLQkJbWIoKTsKLQkJcXVldWVfZGVsYXllZF93b3JrKHNwdV9zY2hlZF93cSwgJmN0eC0+c2NoZWRfd29yaywgU1BVX1RJTUVTTElDRSk7Ci0JfQorCS8qCisJICogMzItQml0IGFzc2lnbm1lbnQgYXJlIGF0b21pYyBvbiBwb3dlcnBjLCBhbmQgd2UgZG9uJ3QgY2FyZSBhYm91dAorCSAqIG1lbW9yeSBvcmRlcmluZyBoZXJlIGJlY2F1c2UgcmV0cml2aW5nIHRoZSBjb250cm9sbGluZyB0aHJlYWQgaXMKKwkgKiBwZXIgZGVmaW50aW9uIHJhY3kuCisJICovCisJY3R4LT50aWQgPSBjdXJyZW50LT5waWQ7CisKKwkvKgorCSAqIFdlIGRvIG91ciBvd24gcHJpb3JpdHkgY2FsY3VsYXRpb25zLCBzbyB3ZSBub3JtYWxseSB3YW50CisJICogLT5zdGF0aWNfcHJpbyB0byBzdGFydCB3aXRoLiBVbmZvcnR1bmF0ZWx5IHRoaWVzIGZpZWxkCisJICogY29udGFpbnMganVuayBmb3IgdGhyZWFkcyB3aXRoIGEgcmVhbHRpbWUgc2NoZWR1bGluZworCSAqIHBvbGljeSBzbyB3ZSBoYXZlIHRvIGxvb2sgYXQgLT5wcmlvIGluIHRoaXMgY2FzZS4KKwkgKi8KKwlpZiAocnRfcHJpbyhjdXJyZW50LT5wcmlvKSkKKwkJY3R4LT5wcmlvID0gY3VycmVudC0+cHJpbzsKKwllbHNlCisJCWN0eC0+cHJpbyA9IGN1cnJlbnQtPnN0YXRpY19wcmlvOworCWN0eC0+cG9saWN5ID0gY3VycmVudC0+cG9saWN5OworCisJLyoKKwkgKiBBIGxvdCBvZiBwbGFjZXMgdGhhdCBkb24ndCBob2xkIGFjdGl2ZV9tdXRleCBwb2tlIGludG8KKwkgKiBjcHVzX2FsbG93ZWQsIGluY2x1ZGluZyBncmFiX3J1bm5hYmxlX2NvbnRleHQgd2hpY2gKKwkgKiBhbHJlYWR5IGhvbGRzIHRoZSBydW5xX2xvY2suICBTbyBhYnVzZSBydW5xX2xvY2sKKwkgKiB0byBwcm90ZWN0IHRoaXMgZmllbGQgYXN3ZWxsLgorCSAqLworCXNwaW5fbG9jaygmc3B1X3ByaW8tPnJ1bnFfbG9jayk7CisJY3R4LT5jcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc3Bpbl91bmxvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogfQogCi12b2lkIHNwdV9zdG9wX3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit2b2lkIHNwdV91cGRhdGVfc2NoZWRfaW5mbyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlpZiAoY3R4LT5wb2xpY3kgPT0gU0NIRURfUlIpIHsKLQkJLyoKLQkJICogV2hpbGUgdGhlIHdvcmsgY2FuIGJlIHJlYXJtaW5nIG5vcm1hbGx5IHNldHRpbmcgdGhpcyBmbGFnCi0JCSAqIG1ha2VzIHN1cmUgaXQgZG9lcyBub3QgcmVhcm0gaXRzZWxmIGFueW1vcmUuCi0JCSAqLwotCQlzZXRfYml0KFNQVV9TQ0hFRF9FWElUSU5HLCAmY3R4LT5zY2hlZF9mbGFncyk7Ci0JCW1iKCk7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJmN0eC0+c2NoZWRfd29yayk7CisJaW50IG5vZGUgPSBjdHgtPnNwdS0+bm9kZTsKKworCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCV9fc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKGN0eCk7CisJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKK30KKworc3RhdGljIGludCBfX25vZGVfYWxsb3dlZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgaW50IG5vZGUpCit7CisJaWYgKG5yX2NwdXNfbm9kZShub2RlKSkgeworCQljcHVtYXNrX3QgbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKKworCQlpZiAoY3B1c19pbnRlcnNlY3RzKG1hc2ssIGN0eC0+Y3B1c19hbGxvd2VkKSkKKwkJCXJldHVybiAxOwogCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5vZGVfYWxsb3dlZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgaW50IG5vZGUpCit7CisJaW50IHJ2YWw7CisKKwlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOworCXJ2YWwgPSBfX25vZGVfYWxsb3dlZChjdHgsIG5vZGUpOworCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKworCXJldHVybiBydmFsOwogfQogCiAvKioKQEAgLTk5LDkgKzE3NSwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBzcHVfYWRkX3RvX2FjdGl2ZV9saXN0KHN0cnVjdCBzcHUgKnNwdSkKIHsKLQltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W3NwdS0+bm9kZV0pOwotCWxpc3RfYWRkX3RhaWwoJnNwdS0+bGlzdCwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtzcHUtPm5vZGVdKTsKLQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbc3B1LT5ub2RlXSk7CisJaW50IG5vZGUgPSBzcHUtPm5vZGU7CisKKwltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwlzcHVfcHJpby0+bnJfYWN0aXZlW25vZGVdKys7CisJbGlzdF9hZGRfdGFpbCgmc3B1LT5saXN0LCAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdKTsKKwltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworfQorCitzdGF0aWMgdm9pZCBfX3NwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJbGlzdF9kZWxfaW5pdCgmc3B1LT5saXN0KTsKKwlzcHVfcHJpby0+bnJfYWN0aXZlW3NwdS0+bm9kZV0tLTsKIH0KIAogLyoqCkBAIC0xMTMsNyArMTk4LDcgQEAKIAlpbnQgbm9kZSA9IHNwdS0+bm9kZTsKIAogCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwotCWxpc3RfZGVsX2luaXQoJnNwdS0+bGlzdCk7CisJX19zcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3B1KTsKIAltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogfQogCkBAIC0xNDQsNiArMjI5LDEwIEBACiB7CiAJcHJfZGVidWcoIiVzOiBwaWQ9JWQgU1BVPSVkIE5PREU9JWRcbiIsIF9fRlVOQ1RJT05fXywgY3VycmVudC0+cGlkLAogCQkgc3B1LT5udW1iZXIsIHNwdS0+bm9kZSk7CisKKwljdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSA9IHNwdS0+c3RhdHMuc2xiX2ZsdDsKKwljdHgtPnN0YXRzLmNsYXNzMl9pbnRyX2Jhc2UgPSBzcHUtPnN0YXRzLmNsYXNzMl9pbnRyOworCiAJc3B1LT5jdHggPSBjdHg7CiAJc3B1LT5mbGFncyA9IDA7CiAJY3R4LT5zcHUgPSBzcHU7CkBAIC0xNjEsOCArMjUwLDggQEAKIAlzcHUtPnRpbWVzdGFtcCA9IGppZmZpZXM7CiAJc3B1X2NwdV9hZmZpbml0eV9zZXQoc3B1LCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlzcHVfc3dpdGNoX25vdGlmeShzcHUsIGN0eCk7Ci0Jc3B1X2FkZF90b19hY3RpdmVfbGlzdChzcHUpOwogCWN0eC0+c3RhdGUgPSBTUFVfU1RBVEVfUlVOTkFCTEU7CisJc3B1X3N3aXRjaF9zdGF0ZShzcHUsIFNQVV9VVElMX1NZU1RFTSk7CiB9CiAKIC8qKgpAQCAtMTc1LDcgKzI2NCw4IEBACiAJcHJfZGVidWcoIiVzOiB1bmJpbmQgcGlkPSVkIFNQVT0lZCBOT0RFPSVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCSBzcHUtPnBpZCwgc3B1LT5udW1iZXIsIHNwdS0+bm9kZSk7CiAKLQlzcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3B1KTsKKwlzcHVfc3dpdGNoX3N0YXRlKHNwdSwgU1BVX1VUSUxfSURMRSk7CisKIAlzcHVfc3dpdGNoX25vdGlmeShzcHUsIE5VTEwpOwogCXNwdV91bm1hcF9tYXBwaW5ncyhjdHgpOwogCXNwdV9zYXZlKCZjdHgtPmNzYSwgc3B1KTsKQEAgLTE5Miw2ICsyODIsMTEgQEAKIAljdHgtPnNwdSA9IE5VTEw7CiAJc3B1LT5mbGFncyA9IDA7CiAJc3B1LT5jdHggPSBOVUxMOworCisJY3R4LT5zdGF0cy5zbGJfZmx0ICs9CisJCShzcHUtPnN0YXRzLnNsYl9mbHQgLSBjdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSk7CisJY3R4LT5zdGF0cy5jbGFzczJfaW50ciArPQorCQkoc3B1LT5zdGF0cy5jbGFzczJfaW50ciAtIGN0eC0+c3RhdHMuY2xhc3MyX2ludHJfYmFzZSk7CiB9CiAKIC8qKgpAQCAtMjAwLDIwICsyOTUsMzkgQEAKICAqLwogc3RhdGljIHZvaWQgX19zcHVfYWRkX3RvX3JxKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWludCBwcmlvID0gY3R4LT5wcmlvOwotCi0JbGlzdF9hZGRfdGFpbCgmY3R4LT5ycSwgJnNwdV9wcmlvLT5ydW5xW3ByaW9dKTsKLQlzZXRfYml0KHByaW8sIHNwdV9wcmlvLT5iaXRtYXApOworCS8qCisJICogVW5mb3J0dW5hdGVseSB0aGlzIGNvZGUgcGF0aCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcworCSAqIG9uIGJlaGFsZiBvZiBhIHNpbmdsZSBjb250ZXh0IGR1ZSB0byB0aGUgd2F5IHRoZSBwcm9ibGVtIHN0YXRlCisJICogbW1hcCBzdXBwb3J0IHdvcmtzLgorCSAqCisJICogRm9ydHVuYXRlbHkgd2UgbmVlZCB0byB3YWtlIHVwIGFsbCB0aGVzZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUKKwkgKiBhbmQgY2FuIHNpbXBseSBza2lwIHRoZSBydW5xdWV1ZSBhZGRpdGlvbiBmb3IgZXZlcnkgYnV0IHRoZSBmaXJzdAorCSAqIHRocmVhZCBnZXR0aW5nIGludG8gdGhpcyBjb2RlcGF0aC4KKwkgKgorCSAqIEl0J3Mgc3RpbGwgcXVpdGUgaGFja3ksIGFuZCBsb25nLXRlcm0gd2Ugc2hvdWxkIHByb3h5IGFsbCBvdGhlcgorCSAqIHRocmVhZHMgdGhyb3VnaCB0aGUgb3duZXIgdGhyZWFkIHNvIHRoYXQgc3B1X3J1biBpcyBpbiBjb250cm9sCisJICogb2YgYWxsIHRoZSBzY2hlZHVsaW5nIGFjdGl2aXR5IGZvciBhIGdpdmVuIGNvbnRleHQuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmN0eC0+cnEpKSB7CisJCWxpc3RfYWRkX3RhaWwoJmN0eC0+cnEsICZzcHVfcHJpby0+cnVucVtjdHgtPnByaW9dKTsKKwkJc2V0X2JpdChjdHgtPnByaW8sIHNwdV9wcmlvLT5iaXRtYXApOworCQlpZiAoIXNwdV9wcmlvLT5ucl93YWl0aW5nKyspCisJCQlfX21vZF90aW1lcigmc3B1c2NoZWRfdGltZXIsIGppZmZpZXMgKyBTUFVTQ0hFRF9USUNLKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fc3B1X2RlbF9mcm9tX3JxKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewogCWludCBwcmlvID0gY3R4LT5wcmlvOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnJxKSkKKwlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+cnEpKSB7CisJCWlmICghLS1zcHVfcHJpby0+bnJfd2FpdGluZykKKwkJCWRlbF90aW1lcigmc3B1c2NoZWRfdGltZXIpOwogCQlsaXN0X2RlbF9pbml0KCZjdHgtPnJxKTsKLQlpZiAobGlzdF9lbXB0eSgmc3B1X3ByaW8tPnJ1bnFbcHJpb10pKQotCQljbGVhcl9iaXQocHJpbywgc3B1X3ByaW8tPmJpdG1hcCk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJnNwdV9wcmlvLT5ydW5xW3ByaW9dKSkKKwkJCWNsZWFyX2JpdChwcmlvLCBzcHVfcHJpby0+Yml0bWFwKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHNwdV9wcmlvX3dhaXQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCkBAIC0yNDQsNyArMzU4LDcgQEAKIAogCWZvciAobiA9IDA7IG4gPCBNQVhfTlVNTk9ERVM7IG4rKywgbm9kZSsrKSB7CiAJCW5vZGUgPSAobm9kZSA8IE1BWF9OVU1OT0RFUykgPyBub2RlIDogMDsKLQkJaWYgKCFub2RlX2FsbG93ZWQobm9kZSkpCisJCWlmICghbm9kZV9hbGxvd2VkKGN0eCwgbm9kZSkpCiAJCQljb250aW51ZTsKIAkJc3B1ID0gc3B1X2FsbG9jX25vZGUobm9kZSk7CiAJCWlmIChzcHUpCkBAIC0yNzYsMTUgKzM5MCwxNSBAQAogCW5vZGUgPSBjcHVfdG9fbm9kZShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlmb3IgKG4gPSAwOyBuIDwgTUFYX05VTU5PREVTOyBuKyssIG5vZGUrKykgewogCQlub2RlID0gKG5vZGUgPCBNQVhfTlVNTk9ERVMpID8gbm9kZSA6IDA7Ci0JCWlmICghbm9kZV9hbGxvd2VkKG5vZGUpKQorCQlpZiAoIW5vZGVfYWxsb3dlZChjdHgsIG5vZGUpKQogCQkJY29udGludWU7CiAKIAkJbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3B1LCAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdLCBsaXN0KSB7CiAJCQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKnRtcCA9IHNwdS0+Y3R4OwogCi0JCQlpZiAodG1wLT5ydF9wcmlvcml0eSA8IGN0eC0+cnRfcHJpb3JpdHkgJiYKLQkJCSAgICAoIXZpY3RpbSB8fCB0bXAtPnJ0X3ByaW9yaXR5IDwgdmljdGltLT5ydF9wcmlvcml0eSkpCisJCQlpZiAodG1wLT5wcmlvID4gY3R4LT5wcmlvICYmCisJCQkgICAgKCF2aWN0aW0gfHwgdG1wLT5wcmlvID4gdmljdGltLT5wcmlvKSkKIAkJCQl2aWN0aW0gPSBzcHUtPmN0eDsKIAkJfQogCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwpAQCAtMzEyLDcgKzQyNiwxMCBAQAogCQkJCXZpY3RpbSA9IE5VTEw7CiAJCQkJZ290byByZXN0YXJ0OwogCQkJfQorCQkJc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CiAJCQlzcHVfdW5iaW5kX2NvbnRleHQoc3B1LCB2aWN0aW0pOworCQkJdmljdGltLT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoKys7CisJCQlzcHUtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2grKzsKIAkJCW11dGV4X3VubG9jaygmdmljdGltLT5zdGF0ZV9tdXRleCk7CiAJCQkvKgogCQkJICogV2UgbmVlZCB0byBicmVhayBvdXQgb2YgdGhlIHdhaXQgbG9vcCBpbiBzcHVfcnVuCkBAIC0zMzgsMjIgKzQ1NSwzMCBAQAogICovCiBpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCi0JaWYgKGN0eC0+c3B1KQotCQlyZXR1cm4gMDsKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfU1lTVEVNKTsKIAogCWRvIHsKIAkJc3RydWN0IHNwdSAqc3B1OwogCisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgc2luZ2xlIGNvbnRleHQKKwkJICogb25seSBvbmUgYWN0dWFsbHkgYmluZHMgdGhlIGNvbnRleHQgd2hpbGUgdGhlIG90aGVycyB3aWxsCisJCSAqIG9ubHkgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBzdGF0ZV9tdXRleCBvbmNlIHRoZSBjb250ZXh0CisJCSAqIGFscmVhZHkgaXMgaW4gcnVubmFibGUgc3RhdGUuCisJCSAqLworCQlpZiAoY3R4LT5zcHUpCisJCQlyZXR1cm4gMDsKKwogCQlzcHUgPSBzcHVfZ2V0X2lkbGUoY3R4KTsKIAkJLyoKIAkJICogSWYgdGhpcyBpcyBhIHJlYWx0aW1lIHRocmVhZCB3ZSB0cnkgdG8gZ2V0IGl0IHJ1bm5pbmcgYnkKIAkJICogcHJlZW1wdGluZyBhIGxvd2VyIHByaW9yaXR5IHRocmVhZC4KIAkJICovCi0JCWlmICghc3B1ICYmIGN0eC0+cnRfcHJpb3JpdHkpCisJCWlmICghc3B1ICYmIHJ0X3ByaW8oY3R4LT5wcmlvKSkKIAkJCXNwdSA9IGZpbmRfdmljdGltKGN0eCk7CiAJCWlmIChzcHUpIHsKIAkJCXNwdV9iaW5kX2NvbnRleHQoc3B1LCBjdHgpOworCQkJc3B1X2FkZF90b19hY3RpdmVfbGlzdChzcHUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMzY5LDIzICs0OTQsMjggQEAKICAqIFJlbW92ZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBjb250ZXh0IG9uIHRoZSBydW5xdWV1ZSBhbmQgcmV0dXJuIGl0CiAgKiB0byB0aGUgY2FsbGVyLiAgUmV0dXJucyAlTlVMTCBpZiBubyBydW5uYWJsZSBjb250ZXh0IHdhcyBmb3VuZC4KICAqLwotc3RhdGljIHN0cnVjdCBzcHVfY29udGV4dCAqZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGludCBwcmlvKQorc3RhdGljIHN0cnVjdCBzcHVfY29udGV4dCAqZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGludCBwcmlvLCBpbnQgbm9kZSkKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IE5VTEw7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CiAJaW50IGJlc3Q7CiAKIAlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogCWJlc3QgPSBzY2hlZF9maW5kX2ZpcnN0X2JpdChzcHVfcHJpby0+Yml0bWFwKTsKLQlpZiAoYmVzdCA8IHByaW8pIHsKKwl3aGlsZSAoYmVzdCA8IHByaW8pIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcnEgPSAmc3B1X3ByaW8tPnJ1bnFbYmVzdF07CiAKLQkJQlVHX09OKGxpc3RfZW1wdHkocnEpKTsKLQotCQljdHggPSBsaXN0X2VudHJ5KHJxLT5uZXh0LCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIHJxKTsKLQkJX19zcHVfZGVsX2Zyb21fcnEoY3R4KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsIHJxLCBycSkgeworCQkJLyogWFhYKGhjaCk6IGNoZWNrIGZvciBhZmZpbml0eSBoZXJlIGFzd2VsbCAqLworCQkJaWYgKF9fbm9kZV9hbGxvd2VkKGN0eCwgbm9kZSkpIHsKKwkJCQlfX3NwdV9kZWxfZnJvbV9ycShjdHgpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJYmVzdCsrOwogCX0KKwljdHggPSBOVUxMOworIGZvdW5kOgogCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKLQogCXJldHVybiBjdHg7CiB9CiAKQEAgLTM5NSw5ICs1MjUsMTIgQEAKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKm5ldyA9IE5VTEw7CiAKIAlpZiAoc3B1KSB7Ci0JCW5ldyA9IGdyYWJfcnVubmFibGVfY29udGV4dChtYXhfcHJpbyk7CisJCW5ldyA9IGdyYWJfcnVubmFibGVfY29udGV4dChtYXhfcHJpbywgc3B1LT5ub2RlKTsKIAkJaWYgKG5ldyB8fCBmb3JjZSkgeworCQkJc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CiAJCQlzcHVfdW5iaW5kX2NvbnRleHQoc3B1LCBjdHgpOworCQkJY3R4LT5zdGF0cy52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1LT5zdGF0cy52b2xfY3R4X3N3aXRjaCsrOwogCQkJc3B1X2ZyZWUoc3B1KTsKIAkJCWlmIChuZXcpCiAJCQkJd2FrZV91cCgmbmV3LT5zdG9wX3dxKTsKQEAgLTQxNyw3ICs1NTAsMTcgQEAKICAqLwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKKwkvKgorCSAqIFdlIG11c3QgbmV2ZXIgcmVhY2ggdGhpcyBmb3IgYSBub3NjaGVkIGNvbnRleHQsCisJICogYnV0IGhhbmRsZSB0aGUgY2FzZSBncmFjZWZ1bGwgaW5zdGVhZCBvZiBwYW5pY2luZy4KKwkgKi8KKwlpZiAoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCiAJX19zcHVfZGVhY3RpdmF0ZShjdHgsIDEsIE1BWF9QUklPKTsKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfVVNFUik7CiB9CiAKIC8qKgpAQCAtNDMyLDU2ICs1NzUsMTc4IEBACiB7CiAJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkpIHsKIAkJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7Ci0JCV9fc3B1X2RlYWN0aXZhdGUoY3R4LCAwLCBNQVhfUFJJTyk7CisJCWlmIChfX3NwdV9kZWFjdGl2YXRlKGN0eCwgMCwgTUFYX1BSSU8pKQorCQkJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1VTRVIpOworCQllbHNlIHsKKwkJCXNwdWN0eF9zd2l0Y2hfc3RhdGUoY3R4LCBTUFVDVFhfVVRJTF9MT0FERUQpOworCQkJc3B1X3N3aXRjaF9zdGF0ZShjdHgtPnNwdSwgU1BVX1VUSUxfVVNFUik7CisJCX0KIAkJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKIAl9CiB9CiAKLXZvaWQgc3B1X3NjaGVkX3RpY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgc3B1c2NoZWRfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIHNjaGVkX3dvcmsud29yayk7Ci0JaW50IHByZWVtcHRlZDsKLQotCS8qCi0JICogSWYgdGhpcyBjb250ZXh0IGlzIGJlaW5nIHN0b3BwZWQgYXZvaWQgcmVzY2hlZHVsaW5nIGZyb20gdGhlCi0JICogc2NoZWR1bGVyIHRpY2sgYmVjYXVzZSB3ZSB3b3VsZCBibG9jayBvbiB0aGUgc3RhdGVfbXV0ZXguCi0JICogVGhlIGNhbGxlciB3aWxsIHlpZWxkIHRoZSBzcHUgbGF0ZXIgb24gYW55d2F5LgotCSAqLwotCWlmICh0ZXN0X2JpdChTUFVfU0NIRURfRVhJVElORywgJmN0eC0+c2NoZWRfZmxhZ3MpKQorCWlmIChjdHgtPmZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQorCQlyZXR1cm47CisJaWYgKGN0eC0+cG9saWN5ID09IFNDSEVEX0ZJRk8pCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwotCXByZWVtcHRlZCA9IF9fc3B1X2RlYWN0aXZhdGUoY3R4LCAwLCBjdHgtPnByaW8gKyAxKTsKLQltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOworCWlmICgtLWN0eC0+dGltZV9zbGljZSkKKwkJcmV0dXJuOwogCi0JaWYgKHByZWVtcHRlZCkgewotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGJyZWFrIG91dCBvZiB0aGUgd2FpdCBsb29wIGluIHNwdV9ydW4gbWFudWFsbHkKLQkJICogdG8gZW5zdXJlIHRoaXMgY29udGV4dCBnZXRzIHB1dCBvbiB0aGUgcnVucXVldWUgYWdhaW4KLQkJICogQVNBUC4KLQkJICovCi0JCXdha2VfdXAoJmN0eC0+c3RvcF93cSk7CisJLyoKKwkgKiBVbmZvcnR1bmF0ZWx5IGFjdGl2ZV9tdXRleCByYW5rcyBvdXRzaWRlIG9mIHN0YXRlX211dGV4LCBzbworCSAqIHdlIGhhdmUgdG8gdHJ5bG9jayBoZXJlLiAgSWYgd2UgZmFpbCBnaXZlIHRoZSBjb250ZXh0IGFub3RoZXIKKwkgKiB0aWNrIGFuZCB0cnkgYWdhaW4uCisJICovCisJaWYgKG11dGV4X3RyeWxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpKSB7CisJCXN0cnVjdCBzcHUgKnNwdSA9IGN0eC0+c3B1OworCQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKm5ldzsKKworCQluZXcgPSBncmFiX3J1bm5hYmxlX2NvbnRleHQoY3R4LT5wcmlvICsgMSwgc3B1LT5ub2RlKTsKKwkJaWYgKG5ldykgeworCisJCQlfX3NwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzcHUpOworCQkJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKKwkJCWN0eC0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1LT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoKys7CisJCQlzcHVfZnJlZShzcHUpOworCQkJd2FrZV91cCgmbmV3LT5zdG9wX3dxKTsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIGJyZWFrIG91dCBvZiB0aGUgd2FpdCBsb29wIGluCisJCQkgKiBzcHVfcnVuIG1hbnVhbGx5IHRvIGVuc3VyZSB0aGlzIGNvbnRleHQKKwkJCSAqIGdldHMgcHV0IG9uIHRoZSBydW5xdWV1ZSBhZ2FpbiBBU0FQLgorCQkJICovCisJCQl3YWtlX3VwKCZjdHgtPnN0b3Bfd3EpOworCQl9CisJCXNwdV9zZXRfdGltZXNsaWNlKGN0eCk7CisJCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAJfSBlbHNlIHsKLQkJc3B1X3N0YXJ0X3RpY2soY3R4KTsKKwkJY3R4LT50aW1lX3NsaWNlKys7CiAJfQogfQogCisvKioKKyAqIGNvdW50X2FjdGl2ZV9jb250ZXh0cyAtIGNvdW50IG5yIG9mIGFjdGl2ZSB0YXNrcworICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRhc2tzIGN1cnJlbnRseSBydW5uaW5nIG9yIHdhaXRpbmcgdG8gcnVuLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBkb24ndCB0YWtlIHJ1bnFfbG9jayAvIGFjdGl2ZV9tdXRleCBoZXJlLiAgUmVhZGluZworICogYSBzaW5nbGUgMzJiaXQgdmFsdWUgaXMgYXRvbWljIG9uIHBvd2VycGMsIGFuZCB3ZSBkb24ndCBjYXJlCisgKiBhYm91dCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzIGhlcmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvdW50X2FjdGl2ZV9jb250ZXh0cyh2b2lkKQoreworCWludCBucl9hY3RpdmUgPSAwLCBub2RlOworCisJZm9yIChub2RlID0gMDsgbm9kZSA8IE1BWF9OVU1OT0RFUzsgbm9kZSsrKQorCQlucl9hY3RpdmUgKz0gc3B1X3ByaW8tPm5yX2FjdGl2ZVtub2RlXTsKKwlucl9hY3RpdmUgKz0gc3B1X3ByaW8tPm5yX3dhaXRpbmc7CisKKwlyZXR1cm4gbnJfYWN0aXZlOworfQorCisvKioKKyAqIHNwdV9jYWxjX2xvYWQgLSBnaXZlbiB0aWNrIGNvdW50LCB1cGRhdGUgdGhlIGF2ZW5ydW4gbG9hZCBlc3RpbWF0ZXMuCisgKiBAdGljazoJdGljayBjb3VudAorICoKKyAqIE5vIGxvY2tpbmcgYWdhaW5zdCByZWFkaW5nIHRoZXNlIHZhbHVlcyBmcm9tIHVzZXJzcGFjZSwgYXMgZm9yCisgKiB0aGUgQ1BVIGxvYWRhdmcgY29kZS4KKyAqLworc3RhdGljIHZvaWQgc3B1X2NhbGNfbG9hZCh1bnNpZ25lZCBsb25nIHRpY2tzKQoreworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3Rhc2tzOyAvKiBmaXhlZC1wb2ludCAqLworCXN0YXRpYyBpbnQgY291bnQgPSBMT0FEX0ZSRVE7CisKKwljb3VudCAtPSB0aWNrczsKKworCWlmICh1bmxpa2VseShjb3VudCA8IDApKSB7CisJCWFjdGl2ZV90YXNrcyA9IGNvdW50X2FjdGl2ZV9jb250ZXh0cygpICogRklYRURfMTsKKwkJZG8geworCQkJQ0FMQ19MT0FEKHNwdV9hdmVucnVuWzBdLCBFWFBfMSwgYWN0aXZlX3Rhc2tzKTsKKwkJCUNBTENfTE9BRChzcHVfYXZlbnJ1blsxXSwgRVhQXzUsIGFjdGl2ZV90YXNrcyk7CisJCQlDQUxDX0xPQUQoc3B1X2F2ZW5ydW5bMl0sIEVYUF8xNSwgYWN0aXZlX3Rhc2tzKTsKKwkJCWNvdW50ICs9IExPQURfRlJFUTsKKwkJfSB3aGlsZSAoY291bnQgPCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwdXNjaGVkX3dha2UodW5zaWduZWQgbG9uZyBkYXRhKQoreworCW1vZF90aW1lcigmc3B1c2NoZWRfdGltZXIsIGppZmZpZXMgKyBTUFVTQ0hFRF9USUNLKTsKKwl3YWtlX3VwX3Byb2Nlc3Moc3B1c2NoZWRfdGFzayk7CisJc3B1X2NhbGNfbG9hZChTUFVTQ0hFRF9USUNLKTsKK30KKworc3RhdGljIGludCBzcHVzY2hlZF90aHJlYWQodm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBzcHUgKnNwdSwgKm5leHQ7CisJaW50IG5vZGU7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCQlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlKyspIHsKKwkJCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwdSwgbmV4dCwKKwkJCQkJCSAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdLAorCQkJCQkJIGxpc3QpCisJCQkJc3B1c2NoZWRfdGljayhzcHUtPmN0eCk7CisJCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTE9BRF9JTlQoeCkgKCh4KSA+PiBGU0hJRlQpCisjZGVmaW5lIExPQURfRlJBQyh4KSBMT0FEX0lOVCgoKHgpICYgKEZJWEVEXzEtMSkpICogMTAwKQorCitzdGF0aWMgaW50IHNob3dfc3B1X2xvYWRhdmcoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCWludCBhLCBiLCBjOworCisJYSA9IHNwdV9hdmVucnVuWzBdICsgKEZJWEVEXzEvMjAwKTsKKwliID0gc3B1X2F2ZW5ydW5bMV0gKyAoRklYRURfMS8yMDApOworCWMgPSBzcHVfYXZlbnJ1blsyXSArIChGSVhFRF8xLzIwMCk7CisKKwkvKgorCSAqIE5vdGUgdGhhdCBsYXN0X3BpZCBkb2Vzbid0IHJlYWxseSBtYWtlIG11Y2ggc2Vuc2UgZm9yIHRoZQorCSAqIFNQVSBsb2FkYXZnIChpdCBldmVuIHNlZW1zIHZlcnkgb2RkIG9uIHRoZSBDUFUgc2lkZS4uKSwKKwkgKiBidXQgd2UgaW5jbHVkZSBpdCBoZXJlIHRvIGhhdmUgYSAxMDAlIGNvbXBhdGlibGUgaW50ZXJmYWNlLgorCSAqLworCXNlcV9wcmludGYocywgIiVkLiUwMmQgJWQuJTAyZCAlZC4lMDJkICVsZC8lZCAlZFxuIiwKKwkJTE9BRF9JTlQoYSksIExPQURfRlJBQyhhKSwKKwkJTE9BRF9JTlQoYiksIExPQURfRlJBQyhiKSwKKwkJTE9BRF9JTlQoYyksIExPQURfRlJBQyhjKSwKKwkJY291bnRfYWN0aXZlX2NvbnRleHRzKCksCisJCWF0b21pY19yZWFkKCZucl9zcHVfY29udGV4dHMpLAorCQljdXJyZW50LT5uc3Byb3h5LT5waWRfbnMtPmxhc3RfcGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVfbG9hZGF2Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzaG93X3NwdV9sb2FkYXZnLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1X2xvYWRhdmdfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVfbG9hZGF2Z19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCiBpbnQgX19pbml0IHNwdV9zY2hlZF9pbml0KHZvaWQpCiB7Ci0JaW50IGk7Ci0KLQlzcHVfc2NoZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic3B1c2NoZWQiKTsKLQlpZiAoIXNwdV9zY2hlZF93cSkKLQkJcmV0dXJuIDE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwlpbnQgZXJyID0gLUVOT01FTSwgaTsKIAogCXNwdV9wcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNwdV9wcmlvX2FycmF5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcHVfcHJpbykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIHByaW9yaXR5IHF1ZXVlLlxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCSAgICAgICBkZXN0cm95X3dvcmtxdWV1ZShzcHVfc2NoZWRfd3EpOwotCQlyZXR1cm4gMTsKLQl9CisJaWYgKCFzcHVfcHJpbykKKwkJZ290byBvdXQ7CisKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1BSSU87IGkrKykgewogCQlJTklUX0xJU1RfSEVBRCgmc3B1X3ByaW8tPnJ1bnFbaV0pOwogCQlfX2NsZWFyX2JpdChpLCBzcHVfcHJpby0+Yml0bWFwKTsKQEAgLTQ5Miw3ICs3NTcsMzAgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtpXSk7CiAJfQogCXNwaW5fbG9ja19pbml0KCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKworCXNldHVwX3RpbWVyKCZzcHVzY2hlZF90aW1lciwgc3B1c2NoZWRfd2FrZSwgMCk7CisKKwlzcHVzY2hlZF90YXNrID0ga3RocmVhZF9ydW4oc3B1c2NoZWRfdGhyZWFkLCBOVUxMLCAic3B1c2NoZWQiKTsKKwlpZiAoSVNfRVJSKHNwdXNjaGVkX3Rhc2spKSB7CisJCWVyciA9IFBUUl9FUlIoc3B1c2NoZWRfdGFzayk7CisJCWdvdG8gb3V0X2ZyZWVfc3B1X3ByaW87CisJfQorCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgic3B1X2xvYWRhdmciLCAwLCBOVUxMKTsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIG91dF9zdG9wX2t0aHJlYWQ7CisJZW50cnktPnByb2NfZm9wcyA9ICZzcHVfbG9hZGF2Z19mb3BzOworCisJcHJfZGVidWcoInNwdXNjaGVkOiB0aWNrOiAlZCwgbWluIHRpY2tzOiAlZCwgZGVmYXVsdCB0aWNrczogJWRcbiIsCisJCQlTUFVTQ0hFRF9USUNLLCBNSU5fU1BVX1RJTUVTTElDRSwgREVGX1NQVV9USU1FU0xJQ0UpOwogCXJldHVybiAwOworCisgb3V0X3N0b3Bfa3RocmVhZDoKKwlrdGhyZWFkX3N0b3Aoc3B1c2NoZWRfdGFzayk7Cisgb3V0X2ZyZWVfc3B1X3ByaW86CisJa2ZyZWUoc3B1X3ByaW8pOworIG91dDoKKwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIF9fZXhpdCBzcHVfc2NoZWRfZXhpdCh2b2lkKQpAQCAtNTAwLDYgKzc4OCwxMSBAQAogCXN0cnVjdCBzcHUgKnNwdSwgKnRtcDsKIAlpbnQgbm9kZTsKIAorCXJlbW92ZV9wcm9jX2VudHJ5KCJzcHVfbG9hZGF2ZyIsIE5VTEwpOworCisJZGVsX3RpbWVyX3N5bmMoJnNwdXNjaGVkX3RpbWVyKTsKKwlrdGhyZWFkX3N0b3Aoc3B1c2NoZWRfdGFzayk7CisKIAlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlKyspIHsKIAkJbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcHUsIHRtcCwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSwKQEAgLTUxMCw1ICs4MDMsNCBAQAogCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogCX0KIAlrZnJlZShzcHVfcHJpbyk7Ci0JZGVzdHJveV93b3JrcXVldWUoc3B1X3NjaGVkX3dxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKaW5kZXggMGJmNzIzZC4uNGUxOWVkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogICogVGhpcyBjb2RlIGRldmlhdGVzIGZyb20gdGhlIGRvY3VtZW50ZWQgc2VxdWVuY2UgaW4gdGhlCiAgKiBmb2xsb3dpbmcgYXNwZWN0czoKICAqCi0gKiAJMS4gVGhlIEVBIGZvciBMU0NTQSBpcyBwYXNzZWQgZnJvbSBQUEUgaW4gdGhlCisgKgkxLiBUaGUgRUEgZm9yIExTQ1NBIGlzIHBhc3NlZCBmcm9tIFBQRSBpbiB0aGUKICAqCSAgIHNpZ25hbCBub3RpZmljYXRpb24gY2hhbm5lbHMuCiAgKgkyLiBUaGUgcmVnaXN0ZXIgc3BpbGwgYXJlYSBpcyBwdWxsZWQgYnkgU1BVCiAgKgkgICBpbnRvIExTLCByYXRoZXIgdGhhbiBwdXNoZWQgYnkgUFBFLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYwppbmRleCAxOTYwMzNiLi5hZTk1Y2MxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYwpAQCAtNDQsNyArNDQsNyBAQAogCSAqICAgIFJlYWQgdGhlIFNQVV9SZEV2ZW50TXNrIGNoYW5uZWwgYW5kIHNhdmUgdG8gdGhlIExTQ1NBLgogCSAqLwogCW9mZnNldCA9IExTQ1NBX1FXX09GRlNFVChldmVudF9tYXNrKTsKLQlyZWdzX3NwaWxsW29mZnNldF0uc2xvdFswXSA9IHNwdV9yZWFkY2goU1BVX1JkRXZlbnRTdGF0TWFzayk7CisJcmVnc19zcGlsbFtvZmZzZXRdLnNsb3RbMF0gPSBzcHVfcmVhZGNoKFNQVV9SZEV2ZW50TWFzayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3RhZ19tYXNrKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCmluZGV4IDQ3NjE3ZTguLjA4YjM1MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CkBAIC0zOSw5ICs0MCwxNyBAQAogc3RydWN0IHNwdV9jb250ZXh0X29wczsKIHN0cnVjdCBzcHVfZ2FuZzsKIAotLyogY3R4LT5zY2hlZF9mbGFncyAqLwotZW51bSB7Ci0JU1BVX1NDSEVEX0VYSVRJTkcgPSAwLAorLyoKKyAqIFRoaXMgaXMgdGhlIHN0YXRlIGZvciBzcHUgdXRpbGl6YXRpb24gcmVwb3J0aW5nIHRvIHVzZXJzcGFjZS4KKyAqIEJlY2F1c2UgdGhpcyBzdGF0ZSBpcyB2aXNpYmxlIHRvIHVzZXJzcGFjZSBpdCBtdXN0IG5ldmVyIGNoYW5nZSBhbmQgbmVlZHMKKyAqIHRvIGJlIGtlcHQgc3RyaWN0bHkgc2VwYXJhdGUgZnJvbSBhbnkgaW50ZXJuYWwgc3RhdGUga2VwdCBieSB0aGUga2VybmVsLgorICovCitlbnVtIHNwdWN0eF9leGVjdXRpb25fc3RhdGUgeworCVNQVUNUWF9VVElMX1VTRVIgPSAwLAorCVNQVUNUWF9VVElMX1NZU1RFTSwKKwlTUFVDVFhfVVRJTF9JT1dBSVQsCisJU1BVQ1RYX1VUSUxfTE9BREVELAorCVNQVUNUWF9VVElMX01BWAogfTsKIAogc3RydWN0IHNwdV9jb250ZXh0IHsKQEAgLTgxLDEzICs5MCwzNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZ2FuZ19saXN0OwogCXN0cnVjdCBzcHVfZ2FuZyAqZ2FuZzsKIAorCS8qIG93bmVyIHRocmVhZCAqLworCXBpZF90IHRpZDsKKwogCS8qIHNjaGVkdWxlciBmaWVsZHMgKi8KLSAJc3RydWN0IGxpc3RfaGVhZCBycTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHNjaGVkX3dvcms7CisJc3RydWN0IGxpc3RfaGVhZCBycTsKKwl1bnNpZ25lZCBpbnQgdGltZV9zbGljZTsKIAl1bnNpZ25lZCBsb25nIHNjaGVkX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgcnRfcHJpb3JpdHk7CisJY3B1bWFza190IGNwdXNfYWxsb3dlZDsKIAlpbnQgcG9saWN5OwogCWludCBwcmlvOworCisJLyogc3RhdGlzdGljcyAqLworCXN0cnVjdCB7CisJCS8qIHVwZGF0ZXMgcHJvdGVjdGVkIGJ5IGN0eC0+c3RhdGVfbXV0ZXggKi8KKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIGV4ZWN1dGlvbl9zdGF0ZTsKKwkJdW5zaWduZWQgbG9uZyB0c3RhbXA7CQkvKiB0aW1lIG9mIGxhc3QgY3R4IHN3aXRjaCAqLworCQl1bnNpZ25lZCBsb25nIHRpbWVzW1NQVUNUWF9VVElMX01BWF07CisJCXVuc2lnbmVkIGxvbmcgbG9uZyB2b2xfY3R4X3N3aXRjaDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGludm9sX2N0eF9zd2l0Y2g7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgbWFqX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGhhc2hfZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgc2xiX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHNsYl9mbHRfYmFzZTsgLyogIyBhdCBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRyOworCQl1bnNpZ25lZCBsb25nIGxvbmcgY2xhc3MyX2ludHJfYmFzZTsgLyogIyBhdCBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIGxpYmFzc2lzdDsKKwl9IHN0YXRzOwogfTsKIAogc3RydWN0IHNwdV9nYW5nIHsKQEAgLTE3Nyw2ICsyMDcsNyBAQAogaW50IHNwdWZzX2hhbmRsZV9jbGFzczEoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogCiAvKiBjb250ZXh0IG1hbmFnZW1lbnQgKi8KK2V4dGVybiBhdG9taWNfdCBucl9zcHVfY29udGV4dHM7CiBzdGF0aWMgaW5saW5lIHZvaWQgc3B1X2FjcXVpcmUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CiAJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CkBAIC0yMDAsOSArMjMxLDkgQEAKIGludCBzcHVfYWN0aXZhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CiB2b2lkIHNwdV95aWVsZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Ci12b2lkIHNwdV9zdGFydF90aWNrKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKLXZvaWQgc3B1X3N0b3BfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Ci12b2lkIHNwdV9zY2hlZF90aWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHNwdV9zZXRfdGltZXNsaWNlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK3ZvaWQgc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK3ZvaWQgX19zcHVfdXBkYXRlX3NjaGVkX2luZm8oc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogaW50IF9faW5pdCBzcHVfc2NoZWRfaW5pdCh2b2lkKTsKIHZvaWQgX19leGl0IHNwdV9zY2hlZF9leGl0KHZvaWQpOwogCkBAIC0yMTAsNyArMjQxLDcgQEAKIAogLyoKICAqIHNwdWZzX3dhaXQKLSAqIAlTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCisgKglTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCiAgKgl3ZSBuZWVkIHRvIGNhbGwgc3B1X3JlbGVhc2UoY3R4KSBiZWZvcmUgc2xlZXBpbmcsIGFuZAogICoJdGhlbiBzcHVfYWNxdWlyZShjdHgpIHdoZW4gYXdva2VuLgogICovCkBAIC0yNTYsNCArMjg3LDM3IEBACiBleHRlcm4gc3RydWN0IHNwdWZzX2NvcmVkdW1wX3JlYWRlciBzcHVmc19jb3JlZHVtcF9yZWFkW107CiBleHRlcm4gaW50IHNwdWZzX2NvcmVkdW1wX251bV9ub3RlczsKIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBsaXR0bGUgYml0IHRvbyBsYXJnZSBmb3IgYW4gaW5saW5lLCBidXQKKyAqIGFzIGZhdWx0LmMgaXMgYnVpbHQgaW50byB0aGUga2VybmVsIHdlIGNhbid0IG1vdmUgaXQgb3V0IG9mCisgKiBsaW5lLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3B1Y3R4X3N3aXRjaF9zdGF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIG5ld19zdGF0ZSkKK3sKKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmN0eC0+c3RhdGVfbXV0ZXgpKTsKKworCWlmIChjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZSAhPSBuZXdfc3RhdGUpIHsKKwkJdW5zaWduZWQgbG9uZyBjdXJ0aW1lID0gamlmZmllczsKKworCQljdHgtPnN0YXRzLnRpbWVzW2N0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlXSArPQorCQkJCSBjdXJ0aW1lIC0gY3R4LT5zdGF0cy50c3RhbXA7CisJCWN0eC0+c3RhdHMudHN0YW1wID0gY3VydGltZTsKKwkJY3R4LT5zdGF0cy5leGVjdXRpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3B1X3N3aXRjaF9zdGF0ZShzdHJ1Y3Qgc3B1ICpzcHUsCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBuZXdfc3RhdGUpCit7CisJaWYgKHNwdS0+c3RhdHMudXRpbGl6YXRpb25fc3RhdGUgIT0gbmV3X3N0YXRlKSB7CisJCXVuc2lnbmVkIGxvbmcgY3VydGltZSA9IGppZmZpZXM7CisKKwkJc3B1LT5zdGF0cy50aW1lc1tzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlXSArPQorCQkJCSBjdXJ0aW1lIC0gc3B1LT5zdGF0cy50c3RhbXA7CisJCXNwdS0+c3RhdHMudHN0YW1wID0gY3VydGltZTsKKwkJc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwl9Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCmluZGV4IDcxYTBiNDEuLjljNTA2YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKQEAgLTcwLDcgKzcwLDcgQEAKICAgfQogI2VuZGlmCQkJCS8qIGRlYnVnICovCiAKLSNkZWZpbmUgUE9MTF9XSElMRV9GQUxTRShfYykgCVBPTExfV0hJTEVfVFJVRSghKF9jKSkKKyNkZWZpbmUgUE9MTF9XSElMRV9GQUxTRShfYykJUE9MTF9XSElMRV9UUlVFKCEoX2MpKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNxdWlyZV9zcHVfbG9jayhzdHJ1Y3Qgc3B1ICpzcHUpCiB7CkBAIC0zODcsNiArMzg3LDE5IEBACiAJY3NhLT5wcm9iLmRtYV9xdWVyeXR5cGVfUlcgPSBpbl9iZTMyKCZwcm9iLT5kbWFfcXVlcnl0eXBlX1JXKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcHB1X3RhZ3N0YXR1cyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUgdGhlIFByeHlfVGFnU3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBDU0EuCisJICoKKwkgKiBJdCBpcyB1bm5lY2Vzc2FyeSB0byByZXN0b3JlIGRtYV90YWdzdGF0dXNfUiwgaG93ZXZlciwKKwkgKiBkbWFfdGFnc3RhdHVzX1IgaW4gdGhlIENTQSBpcyBhY2Nlc3NlZCB2aWEgYmFja2luZ19vcHMsIHNvCisJICogd2UgbXVzdCBzYXZlIGl0LgorCSAqLworCWNzYS0+cHJvYi5kbWFfdGFnc3RhdHVzX1IgPSBpbl9iZTMyKCZwcm9iLT5kbWFfdGFnc3RhdHVzX1IpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9tZmNfY3NyX3RzcShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKIHsKIAlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKQEAgLTE4MTIsNiArMTgyNSw3IEBACiAJc2F2ZV9tZmNfcXVldWVzKHByZXYsIHNwdSk7CS8qIFN0ZXAgMTkuICovCiAJc2F2ZV9wcHVfcXVlcnltYXNrKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjAuICovCiAJc2F2ZV9wcHVfcXVlcnl0eXBlKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjEuICovCisJc2F2ZV9wcHVfdGFnc3RhdHVzKHByZXYsIHNwdSk7ICAvKiBORVcuICAgICAqLwogCXNhdmVfbWZjX2Nzcl90c3EocHJldiwgc3B1KTsJLyogU3RlcCAyMi4gKi8KIAlzYXZlX21mY19jc3JfY21kKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjMuICovCiAJc2F2ZV9tZmNfY3NyX2F0byhwcmV2LCBzcHUpOwkvKiBTdGVwIDI0LiAqLwpAQCAtMTkzMCw3ICsxOTQ0LDcgQEAKIAlyZXNldF9zcHVfcHJpdmNudGwocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDE2LiAqLwogCXJlc2V0X3NwdV9sc2xyKHByZXYsIHNwdSk7ICAgICAgICAgICAgICAvKiBTdGVwIDE3LiAqLwogCXNldHVwX21mY19zcjEocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDE4LiAqLwotCXNwdV9pbnZhbGlkYXRlX3NsYnMoc3B1KTsgICAgICAgIAkvKiBTdGVwIDE5LiAqLworCXNwdV9pbnZhbGlkYXRlX3NsYnMoc3B1KTsJCS8qIFN0ZXAgMTkuICovCiAJcmVzZXRfY2hfcGFydDEocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDIwLiAqLwogCXJlc2V0X2NoX3BhcnQyKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyMS4gKi8KIAllbmFibGVfaW50ZXJydXB0cyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMjIuICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCmluZGV4IGQyYzY5MDUuLjIyYjRiNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCkBAIC04LDQgKzgsNSBAQAogCXNlbGVjdCBQUENfTVBDMTA2CiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFBQQ19OQVRJVkUKKwlzZWxlY3QgUENJCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvTWFrZWZpbGUKaW5kZXggOTAyZmViMS4uNGIzYmZhZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKLW9iai15CQkJCSs9IHNldHVwLm8gdGltZS5vIHBlZ2Fzb3NfZXRoLm8KLW9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubworb2JqLXkJCQkJKz0gc2V0dXAubyB0aW1lLm8gcGVnYXNvc19ldGgubyBwY2kubwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiBvYmotJChDT05GSUdfTlZSQU0pCQkrPSBudnJhbS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKaW5kZXggZDMyZmVkYy4uMzY5MDYyNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYwpAQCAtOTksNyArOTksNyBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAob2Zmc2V0ICYgMHhmZikgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKIAkJfCAoKChidXMtPm51bWJlciAtIGhvc2UtPmZpcnN0X2J1c25vKSAmIDB4ZmYpIDw8IDE2KQotCQl8IChob3NlLT5pbmRleCA8PCAyNCk7CisJCXwgKGhvc2UtPmdsb2JhbF9udW1iZXIgPDwgMjQpOwogICAgICAgICBpbnQgcmV0ID0gLTE7CiAJaW50IHJ2YWw7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAob2Zmc2V0ICYgMHhmZikgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKIAkJfCAoKChidXMtPm51bWJlciAtIGhvc2UtPmZpcnN0X2J1c25vKSAmIDB4ZmYpIDw8IDE2KQotCQl8IChob3NlLT5pbmRleCA8PCAyNCk7CisJCXwgKGhvc2UtPmdsb2JhbF9udW1iZXIgPDwgMjQpOwogCWludCBydmFsOwogCiAJcnZhbCA9IHJ0YXNfY2FsbChydGFzX3Rva2VuKCJ3cml0ZS1wY2ktY29uZmlnIiksIDMsIDEsIE5VTEwsCkBAIC0yNTQsMTMgKzI1NCwxMiBAQAogCQkJcHJpbnRrKCIgYXQgJWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpci5zdGFydCk7CiAJCXByaW50aygiXG4iKTsKIAotCQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAkJaWYgKCFob3NlKSB7CiAJCQlwcmludGsoIkNhbid0IGFsbG9jYXRlIFBDSSBjb250cm9sbGVyIHN0cnVjdHVyZSBmb3IgJXNcbiIsCiAJCQkJZGV2LT5mdWxsX25hbWUpOwogCQkJY29udGludWU7CiAJCX0KLQkJaG9zZS0+YXJjaF9kYXRhID0gZGV2OwogCQlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZVswXTsKIAkJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZVsxXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCmluZGV4IGYyZDI2MjYuLmJlYzc3MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKQEAgLTI4LDYgKzI4LDcgQEAKIAlib29sICJQUEM3NTBHWC9DTCB3aXRoIFRTSTEweCBicmlkZ2UgKEhpY2tvcnkvSG9sbHkpIgogCXNlbGVjdCBUU0kxMDhfQlJJREdFCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCisJc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKIAloZWxwCiAJICBTZWxlY3QgUFBDX0hPTExZIGlmIGNvbmZpZ3VyaW5nIGZvciBhbiBJQk0gNzUwR1gvQ0wgRXZhbAogCSAgQm9hcmQgd2l0aCBUU0kxMDgvOSBicmlkZ2UgKEhpY2tvcnkvSG9sbHkpCkBAIC00NCw2ICs0NSw3IEBACiBjb25maWcgVFNJMTA4X0JSSURHRQogCWJvb2wKIAlkZXBlbmRzIG9uIE1QQzc0NDhIUEMyIHx8IFBQQ19IT0xMWQorCXNlbGVjdCBQQ0kKIAlzZWxlY3QgTVBJQwogCXNlbGVjdCBNUElDX1dFSVJECiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKaW5kZXggM2EwYjRhMC4uNjI5MmUzNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYwpAQCAtNDUsNyArNDUsNyBAQAogCiAjZGVmaW5lIEhPTExZX1BDSV9DRkdfUEhZUyAweDdjMDAwMDAwCiAKLWludCBob2xseV9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCitpbnQgaG9sbHlfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jCmluZGV4IGI0MTJmMDAuLmY0ZDBhN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKQEAgLTU0LDggKzU0LDkgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGxpbmtzdGF0aW9uX2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CisjaWZkZWYgQ09ORklHX1BDSQogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCWNvbnN0IGludCAqYnVzX3JhbmdlOwpAQCAtNjcsMTggKzY4LDE3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCiAJCQkJIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAlpZiAoaG9zZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwogCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCAweGZlYzAwMDAwLCAweGZlZTAwMDAwKTsKIAogCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KIAkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgMSk7Ci0KKyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC05Miw3ICs5Miw3IEBACiAKIAkvKiBMb29rdXAgUENJIGhvc3QgYnJpZGdlcyAqLwogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCWxpbmtzdGF0aW9uX2FkZF9icmlkZ2UobnApOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQlVGRkFMTyBOZXR3b3JrIEF0dGFjaGVkIFN0b3JhZ2UgU2VyaWVzXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICIoQykgMjAwMi0yMDA1IEJVRkZBTE8gSU5DLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwppbmRleCA0NTQyZTBjOC4uMWUzY2M2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCkBAIC01NCwxNSArNTQsMTAgQEAKIAogI2RlZmluZSBNUEM3NDQ4SFBDMl9QQ0lfQ0ZHX1BIWVMgMHhmYjAwMDAwMAogCi0jaWZuZGVmIENPTkZJR19QQ0kKLWlzYV9pb19iYXNlID0gTVBDNzQ0OF9IUEMyX0lTQV9JT19CQVNFOwotaXNhX21lbV9iYXNlID0gTVBDNzQ0OF9IUEMyX0lTQV9NRU1fQkFTRTsKLXBjaV9kcmFtX29mZnNldCA9IE1QQzc0NDhfSFBDMl9QQ0lfTUVNX09GRlNFVDsKLSNlbmRpZgotCiBleHRlcm4gdm9pZCBfbm1hc2tfYW5kX29yX21zcih1bnNpZ25lZCBsb25nIG5tYXNrLCB1bnNpZ25lZCBsb25nIG9yX3ZhbCk7CiAKLWludCBtcGM3NDQ4X2hwYzJfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IG1wYzc0NDhfaHBjMl9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQogewogCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5oCmluZGV4IGE1NDNhNTIuLmY3ZTBlMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuaApAQCAtMTgsOSArMTgsNCBAQAogCiAjaW5jbHVkZSA8YXNtL3BwY2Jvb3QuaD4KIAotLyogQmFzZSBBZGRyZXNzZXMgZm9yIHRoZSBQQ0kgYnVzCi0gKi8KLSNkZWZpbmUgTVBDNzQ0OF9IUEMyX1BDSV9NRU1fT0ZGU0VUCSgweDAwMDAwMDAwKQotI2RlZmluZSBNUEM3NDQ4X0hQQzJfSVNBX0lPX0JBU0UJKDB4MDAwMDAwMDApCi0jZGVmaW5lIE1QQzc0NDhfSFBDMl9JU0FfTUVNX0JBU0UJKDB4MDAwMDAwMDApCiAjZW5kaWYJCQkJLyogX19QUENfUExBVEZPUk1TX01QQzc0NDhfSFBDMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9jYWxsX2hwdC5oCmluZGV4IGE4NDNiMGYuLjhkOTVmZTRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaApAQCAtNzYsMjQgKzc2LDI1IEBACiAJcmV0dXJuIGNvbXByZXNzZWRTdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kVmFsaWQoaHB0ZV90ICpocHRlLCB1NjQgdnBuKQorc3RhdGljIGlubGluZSB1NjQgSHZDYWxsSHB0X2ZpbmRWYWxpZChzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHU2NCB2cG4pCiB7CiAJcmV0dXJuIEh2Q2FsbDNSZXQxNihIdkNhbGxIcHRGaW5kVmFsaWQsIGhwdGUsIHZwbiwgMCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kTmV4dFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKK3N0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kTmV4dFZhbGlkKHN0cnVjdCBoYXNoX3B0ZSAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKIAkJdTggYml0c29uLCB1OCBiaXRzb2ZmKQogewogCXJldHVybiBIdkNhbGwzUmV0MTYoSHZDYWxsSHB0RmluZE5leHRWYWxpZCwgaHB0ZSwgaHB0ZUluZGV4LAogCQkJYml0c29uLCBiaXRzb2ZmKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9nZXQoaHB0ZV90ICpocHRlLCB1MzIgaHB0ZUluZGV4KQorc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9nZXQoc3RydWN0IGhhc2hfcHRlICpocHRlLCB1MzIgaHB0ZUluZGV4KQogewogCUh2Q2FsbDJSZXQxNihIdkNhbGxIcHRHZXQsIGhwdGUsIGhwdGVJbmRleCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfYWRkVmFsaWRhdGUodTMyIGhwdGVJbmRleCwgdTMyIGhCaXQsIGhwdGVfdCAqaHB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfYWRkVmFsaWRhdGUodTMyIGhwdGVJbmRleCwgdTMyIGhCaXQsCisJCQkJCSBzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUpCiB7CiAJSHZDYWxsNChIdkNhbGxIcHRBZGRWYWxpZGF0ZSwgaHB0ZUluZGV4LCBoQml0LCBocHRlLT52LCBocHRlLT5yKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jCmluZGV4IGVkNDRkZmMuLmI0ZTJjN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2h0YWIuYwpAQCAtNDQsNyArNDQsNyBAQAogCQkJIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCBpbnQgcHNpemUpCiB7CiAJbG9uZyBzbG90OwotCWhwdGVfdCBsaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgbGhwdGU7CiAJaW50IHNlY29uZGFyeSA9IDA7CiAKIAlCVUdfT04ocHNpemUgIT0gTU1VX1BBR0VfNEspOwpAQCAtOTksNyArOTksNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpU2VyaWVzX2hwdGVfZ2V0d29yZDAodW5zaWduZWQgbG9uZyBzbG90KQogewotCWhwdGVfdCBocHRlOworCXN0cnVjdCBoYXNoX3B0ZSBocHRlOwogCiAJSHZDYWxsSHB0X2dldCgmaHB0ZSwgc2xvdCk7CiAJcmV0dXJuIGhwdGUudjsKQEAgLTE0NCw3ICsxNDQsNyBAQAogc3RhdGljIGxvbmcgaVNlcmllc19ocHRlX3VwZGF0ZXBwKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyBuZXdwcCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSwgaW50IGxvY2FsKQogewotCWhwdGVfdCBocHRlOworCXN0cnVjdCBoYXNoX3B0ZSBocHRlOwogCXVuc2lnbmVkIGxvbmcgd2FudF92OwogCiAJaVNlcmllc19obG9jayhzbG90KTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogICovCiBzdGF0aWMgbG9uZyBpU2VyaWVzX2hwdGVfZmluZCh1bnNpZ25lZCBsb25nIHZwbikKIHsKLQlocHRlX3QgaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgaHB0ZTsKIAlsb25nIHNsb3Q7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCmluZGV4IDljOTc0MjIuLmRhODcxNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKQEAgLTc0Miw2ICs3NDIsMTEgQEAKIAkvKiBJbnN0YWxsIElPIGhvb2tzICovCiAJcHBjX3BjaV9pbyA9IGlzZXJpZXNfcGNpX2lvOwogCisJLyogaVNlcmllcyBoYXMgbm8gSU8gc3BhY2UgaW4gdGhlIGNvbW1vbiBzZW5zZSwgaXQgbmVlZHMgdG8gc2V0CisJICogdGhlIElPIGJhc2UgdG8gMAorCSAqLworCXBjaV9pb19iYXNlID0gMDsKKwogCWlmIChyb290ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiaVNlcmllc19wY2liaW9zX2luaXQ6IGNhbid0IGZpbmQgcm9vdCAiCiAJCQkJIm9mIGRldmljZSB0cmVlXG4iKTsKQEAgLTc2Myw3ICs3NjgsNyBAQAogCQlpZiAocGhiID09IE5VTEwpCiAJCQljb250aW51ZTsKIAotCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gcGhiLT5sb2NhbF9udW1iZXIgPSBidXM7CisJCXBoYi0+cGNpX21lbV9vZmZzZXQgPSBidXM7CiAJCXBoYi0+Zmlyc3RfYnVzbm8gPSBidXM7CiAJCXBoYi0+bGFzdF9idXNubyA9IGJ1czsKIAkJcGhiLT5vcHMgPSAmaVNlcmllc19wY2lfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCA3ZjVkY2VlLi4xM2E4YjE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtNzksOCArNzksNiBAQAogc3RhdGljIHZvaWQgaVNlcmllc19wY2lfZmluYWxfZml4dXAodm9pZCkgeyB9CiAjZW5kaWYKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90YjsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGl0YW47CiAKIHN0cnVjdCBNZW1vcnlCbG9jayB7CiAJdW5zaWduZWQgbG9uZyBhYnNTdGFydDsKQEAgLTI5Miw4ICsyOTAsOCBAQAogewogCURCRygiIC0+IGlTZXJpZXNfaW5pdF9lYXJseSgpXG4iKTsKIAotCWlTZXJpZXNfcmVjYWxfdGIgPSBnZXRfdGIoKTsKLQlpU2VyaWVzX3JlY2FsX3RpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOworCS8qIFNuYXBzaG90IHRoZSB0aW1lYmFzZSwgZm9yIHVzZSBpbiBsYXRlciByZWNhbGlicmF0aW9uICovCisJaVNlcmllc190aW1lX2luaXRfZWFybHkoKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgRE1BL1RDRSBtYW5hZ2VtZW50CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYwppbmRleCA3YWFhNWJiLi5mY2VhYWU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCXUzX2h0ID0gaG9zZTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IG1hcGxlX2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC01MTksMjMgKzUxOSw2IEBACiAJREJHKCIgPC0gbWFwbGVfcGNpX2lycV9maXh1cFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtYXBsZV9maXh1cF9waGJfcmVzb3VyY2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewotCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCi0JCWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICs9IG9mZnNldDsKLQkJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IG9mZnNldDsKLQotCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgSG9zdCAlZCwgaW8gc3RhcnQ6ICVsbHg7IGlvIGVuZDogJWxseFxuIiwKLQkJICAgICAgIGhvc2UtPmdsb2JhbF9udW1iZXIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylob3NlLT5pb19yZXNvdXJjZS5lbmQpOwotCX0KLX0KLQogdm9pZCBfX2luaXQgbWFwbGVfcGNpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcm9vdDsKQEAgLTU1OCw3ICs1NDEsNyBAQAogCQkJY29udGludWU7CiAJCWlmICgob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJ1NC1wY2llIikgfHwKIAkJICAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInUzLWFncCIpKSAmJgotCQkgICAgYWRkX2JyaWRnZShucCkgPT0gMCkKKwkJICAgIG1hcGxlX2FkZF9icmlkZ2UobnApID09IDApCiAJCQlvZl9ub2RlX2dldChucCk7CiAKIAkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAidTMtaHQiKSkgewpAQCAtNTcwLDI3ICs1NTMsOSBAQAogCiAJLyogTm93IHNldHVwIHRoZSBIeXBlclRyYW5zcG9ydCBob3N0IGlmIHdlIGZvdW5kIGFueQogCSAqLwotCWlmIChodCAmJiBhZGRfYnJpZGdlKGh0KSAhPSAwKQorCWlmIChodCAmJiBtYXBsZV9hZGRfYnJpZGdlKGh0KSAhPSAwKQogCQlvZl9ub2RlX3B1dChodCk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbmVlZCB0byBjYWxsIHBjaV9zZXR1cF9waGJfaW8gZm9yIHRoZSBIVCBicmlkZ2UgZmlyc3QKLSAgICAgICAgICogc28gaXQgZ2V0cyB0aGUgSS9PIHBvcnQgbnVtYmVycyBzdGFydGluZyBhdCAwLCBhbmQgd2UKLSAgICAgICAgICogbmVlZCB0byBjYWxsIGl0IGZvciB0aGUgQUdQIGJyaWRnZSBhZnRlciB0aGF0IHNvIGl0IGdldHMKLSAgICAgICAgICogc21hbGwgcG9zaXRpdmUgSS9PIHBvcnQgbnVtYmVycy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh1M19odCkKLSAgICAgICAgICAgICAgICBwY2lfc2V0dXBfcGhiX2lvKHUzX2h0LCAxKTsKLSAgICAgICAgaWYgKHUzX2FncCkKLSAgICAgICAgICAgICAgICBwY2lfc2V0dXBfcGhiX2lvKHUzX2FncCwgMCk7Ci0gICAgICAgIGlmICh1NF9wY2llKQotICAgICAgICAgICAgICAgIHBjaV9zZXR1cF9waGJfaW8odTRfcGNpZSwgMCk7Ci0KLQkvKiBGaXh1cCB0aGUgSU8gcmVzb3VyY2VzIG9uIG91ciBob3N0IGJyaWRnZXMgYXMgdGhlIGNvbW1vbiBjb2RlCi0JICogZG9lcyBpdCBvbmx5IGZvciBjaGlsZHMgb2YgdGhlIGhvc3QgYnJpZGdlcwotCSAqLwotCW1hcGxlX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8gCiAJcGNpX2RldnNfcGhiX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcKaW5kZXggN2M1MDc2ZS4uOTVjZDkwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnCkBAIC0yNSw0ICsyNSwxMyBAQAogCWhlbHAKIAkgIERyaXZlciBmb3IgTURJTyB2aWEgR1BJTyBvbiBQV1JmaWNpZW50IHBsYXRmb3JtcwogCitjb25maWcgRUxFQ1RSQV9JREUKKyAgICAgIHRyaXN0YXRlICJFbGVjdHJhIElERSBkcml2ZXIiCisgICAgICBkZWZhdWx0IHkKKyAgICAgIGRlcGVuZHMgb24gUFBDX1BBU0VNSSAmJiBBVEEKKyAgICAgIHNlbGVjdCBQQVRBX1BMQVRGT1JNCisgICAgICBoZWxwCisJVGhpcyBpbmNsdWRlcyBkcml2ZXIgc3VwcG9ydCBmb3IgdGhlIEVsZWN0cmEgb24tYm9hcmQgSURFCisJaW50ZXJmYWNlLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCmluZGV4IDJjZDJhNGYuLmY0N2ZjYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCkBAIC0xLDMgKzEsNCBAQAogb2JqLXkJKz0gc2V0dXAubyBwY2kubyB0aW1lLm8gaWRsZS5vIHBvd2Vyc2F2ZS5vIGlvbW11Lm8KIG9iai0kKENPTkZJR19QUENfUEFTRU1JX01ESU8pCSs9IGdwaW9fbWRpby5vCitvYmotJChDT05GSUdfRUxFQ1RSQV9JREUpICs9IGVsZWN0cmFfaWRlLm8KIG9iai0kKENPTkZJR19QUENfUEFTRU1JX0NQVUZSRVEpICs9IGNwdWZyZXEubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZWxlY3RyYV9pZGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2VsZWN0cmFfaWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmYjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2VsZWN0cmFfaWRlLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBQQSBTZW1pLCBJbmMKKyAqCisgKiBNYWludGFpbmVkIGJ5OiBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIFRoZSBlbGVjdHJhIElERSBpbnRlcmZhY2UgaXMgaW5jcmVkaWJseSBzaW1wbGU6IEp1c3QgYSBkZXZpY2Ugb24gdGhlIGxvY2FsYnVzCisgKiB3aXRoIGludGVycnVwdHMgaG9va2VkIHVwIHRvIG9uZSBvZiB0aGUgR1BJT3MuIFRoZSBkZXZpY2UgdHJlZSBjb250YWlucyB0aGUKKyAqIGFkZHJlc3Mgd2luZG93IGFuZCBpbnRlcnJ1cHQgbWFwcGluZ3MgYWxyZWFkeSwgYW5kIHRoZSBwYXRhX3BsYXRmb3JtIGRyaXZlciBoYW5kbGVzCisgKiB0aGUgcmVzdC4gV2UganVzdCBuZWVkIHRvIGhvb2sgdGhlIHR3byB1cC4KKyAqLworCisjZGVmaW5lIE1BWF9JRlMJNAkvKiByZWFsbHksIHdlIGhhdmUgb25seSBvbmUgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZzW01BWF9JRlNdOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbGVjdHJhX2lkZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgcmVzb3VyY2UgclszXTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgImlkZSIsICJlbGVjdHJhLWlkZSIpOworCWkgPSAwOworCisJd2hpbGUgKG5wICYmIGkgPCBNQVhfSUZTKSB7CisJCW1lbXNldChyLCAwLCBzaXplb2YocikpOworCisJCS8qIHBhdGFfcGxhdGZvcm0gd2FudHMgdHdvIGFkZHJlc3MgcmFuZ2VzOiBvbmUgZm9yIHRoZSBiYXNlIHJlZ2lzdGVycywKKwkJICogYW5vdGhlciBmb3IgdGhlIGNvbnRyb2wgKGFsdHN0YXR1cykuIEl0J3MgbG9jYXRlZCBhdCBvZmZzZXQgMHgzZjYgaW4KKwkJICogdGhlIHdpbmRvdywgYnV0IHRoZSBkZXZpY2UgdHJlZSBvbmx5IGhhcyBvbmUgbGFyZ2UgcmVnaXN0ZXIgd2luZG93CisJCSAqIHRoYXQgY292ZXJzIGJvdGggcmFuZ2VzLiBTbyB3ZSBuZWVkIHRvIHNwbGl0IGl0IHVwIGJ5IGhhbmQgaGVyZToKKwkJICovCisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJbMF0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXJbMV0uc3RhcnQgKz0gMHgzZjY7CisJCXJbMF0uZW5kID0gclsxXS5zdGFydC0xOworCisJCXJbMl0uc3RhcnQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJCXJbMl0uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCQlyWzJdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisKKwkJcHJfZGVidWcoInJlZ2lzdGVyaW5nIHBsYXRmb3JtIGRldmljZSBhdCAweCVseC8weCVseCwgaXJxIGlzICVsZFxuIiwKKwkJCSByWzBdLnN0YXJ0LCByWzFdLnN0YXJ0LCByWzJdLnN0YXJ0KTsKKwkJcGRldnNbaV0gPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJwYXRhX3BsYXRmb3JtIiwgaSwgciwgMyk7CisJCWlmIChJU19FUlIocGRldnNbaV0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBkZXZzW2ldKTsKKwkJCXBkZXZzW2ldID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsICJpZGUiLCAiZWxlY3RyYS1pZGUiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGVsZWN0cmFfaWRlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZWxlY3RyYV9pZGVfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9JRlM7IGkrKykKKwkJaWYgKHBkZXZzW2ldKQorCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldnNbaV0pOworfQorbW9kdWxlX2V4aXQoZWxlY3RyYV9pZGVfZXhpdCk7CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUiAoIk9sb2YgSm9oYW5zc29uIDxvbG9mQGxpeG9tLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUEEgU2VtaSBFbGVjdHJhIElERSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKaW5kZXggYmJjNmRmYy4uYWIxZjVmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcCgweGUwMDAwMDAwLCAweDEwMDAwMDAwKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IHBhc19hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIApAQCAtMTUwLDI5ICsxNTAsMTEgQEAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBQQS1QWFAgUENJIGhvc3QgYnJpZGdlLlxuIik7CiAKIAkvKiBJbnRlcnByZXQgdGhlICJyYW5nZXMiIHByb3BlcnR5ICovCi0JLyogVGhpcyBhbHNvIG1hcHMgdGhlIEkvTyByZWdpb24gYW5kIHNldHMgaXNhX2lvL21lbV9iYXNlICovCiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBkZXYsIDEpOwotCXBjaV9zZXR1cF9waGJfaW8oaG9zZSwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2luaXQgcGFzX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQkJaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKz0gb2Zmc2V0OwotCQlob3NlLT5pb19yZXNvdXJjZS5lbmQgKz0gb2Zmc2V0OwotCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgSG9zdCAlZCwgaW8gc3RhcnQ6ICVseDsgaW8gZW5kOiAlbHhcbiIsCi0JCSAgICAgICBob3NlLT5nbG9iYWxfbnVtYmVyLAotCQkgICAgICAgaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQsIGhvc2UtPmlvX3Jlc291cmNlLmVuZCk7Ci0JfQotfQotCi0KIHZvaWQgX19pbml0IHBhc19wY2lfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpyb290OwpAQCAtMTg1LDEzICsxNjcsMTEgQEAKIAl9CiAKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZ2V0X25leHRfY2hpbGQocm9vdCwgbnApKSAhPSBOVUxMOykKLQkJaWYgKG5wLT5uYW1lICYmICFzdHJjbXAobnAtPm5hbWUsICJweHAiKSAmJiAhYWRkX2JyaWRnZShucCkpCisJCWlmIChucC0+bmFtZSAmJiAhc3RyY21wKG5wLT5uYW1lLCAicHhwIikgJiYgIXBhc19hZGRfYnJpZGdlKG5wKSkKIAkJCW9mX25vZGVfZ2V0KG5wKTsKIAogCW9mX25vZGVfcHV0KHJvb3QpOwogCi0JcGFzX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8KIAlwY2lfZGV2c19waGJfaW5pdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYwppbmRleCBjNWEzZjYxLi5mZmU2NTI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCXJldHVybiAxOwogfQogCi1kZWZpbmVfbWFjaGluZShwYXMpIHsKK2RlZmluZV9tYWNoaW5lKHBhc2VtaSkgewogCS5uYW1lCQkJPSAiUEEgU2VtaSBQQTZULTE2ODJNIiwKIAkucHJvYmUJCQk9IHBhc19wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBwYXNfc2V0dXBfYXJjaCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZwppbmRleCA1YjdhZmU1Li4wNTU5OTBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCWJvb2wgIkFwcGxlIFBvd2VyTWFjIGJhc2VkIG1hY2hpbmVzIgogCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0KIAlzZWxlY3QgTVBJQworCXNlbGVjdCBQQ0kKIAlzZWxlY3QgUFBDX0lORElSRUNUX1BDSSBpZiBQUEMzMgogCXNlbGVjdCBQUENfTVBDMTA2IGlmIFBQQzMyCiAJc2VsZWN0IFBQQ19OQVRJVkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKaW5kZXggM2Y1MDdhYi4uZWZkZjVlYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9rZXlsYXJnby5oPgogI2luY2x1ZGUgPGFzbS91bmlub3J0aC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtODQsNyArODUsNyBAQAogCXZvaWQJCQkqaG9zdGRhdGE7CiAJaW50CQkJY2hhbm5lbDsJLyogc29tZSBob3N0cyBoYXZlIG11bHRpcGxlICovCiAJaW50CQkJbW9kZTsJCS8qIGN1cnJlbnQgbW9kZSAqLwotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJaW50CQkJb3BlbmVkOwogCWludAkJCXBvbGxlZDsJCS8qIG9wZW4gbW9kZSAqLwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBsYXRmb3JtX2RldjsKQEAgLTEwNCw3ICsxMDUsNyBAQAogCiBzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdwogewotCXN0cnVjdCBzZW1hcGhvcmUJbXV0ZXg7CQkvKiBBY2Nlc3MgbXV0ZXggZm9yIHVzZSBieQorCXN0cnVjdCBtdXRleAkJbXV0ZXg7CQkvKiBBY2Nlc3MgbXV0ZXggZm9yIHVzZSBieQogCQkJCQkJICogaTJjLWtleXdlc3QgKi8KIAl2b2lkIF9faW9tZW0JCSpiYXNlOwkJLyogcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCiAJaW50CQkJYnN0ZXBzOwkJLyogcmVnaXN0ZXIgc3RlcHBpbmcgKi8KQEAgLTM3NSwxNCArMzc2LDE0IEBACiBzdGF0aWMgaW50IGt3X2kyY19vcGVuKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCA9IGJ1cy0+aG9zdGRhdGE7Ci0JZG93bigmaG9zdC0+bXV0ZXgpOworCW11dGV4X2xvY2soJmhvc3QtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQga3dfaTJjX2Nsb3NlKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCA9IGJ1cy0+aG9zdGRhdGE7Ci0JdXAoJmhvc3QtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmhvc3QtPm11dGV4KTsKIH0KIAogc3RhdGljIGludCBrd19pMmNfeGZlcihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsIHU4IGFkZHJkaXIsIGludCBzdWJzaXplLApAQCAtNDk4LDcgKzQ5OSw3IEBACiAJCWtmcmVlKGhvc3QpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaW5pdF9NVVRFWCgmaG9zdC0+bXV0ZXgpOworCW11dGV4X2luaXQoJmhvc3QtPm11dGV4KTsKIAlpbml0X2NvbXBsZXRpb24oJmhvc3QtPmNvbXBsZXRlKTsKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CiAJaW5pdF90aW1lcigmaG9zdC0+dGltZW91dF90aW1lcik7CkBAIC01NzEsNyArNTcyLDcgQEAKIAlidXMtPm9wZW4gPSBrd19pMmNfb3BlbjsKIAlidXMtPmNsb3NlID0ga3dfaTJjX2Nsb3NlOwogCWJ1cy0+eGZlciA9IGt3X2kyY194ZmVyOwotCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwltdXRleF9pbml0KCZidXMtPm11dGV4KTsKIAlpZiAoY29udHJvbGxlciA9PSBidXNub2RlKQogCQlidXMtPmZsYWdzID0gcG1hY19pMmNfbXVsdGlidXM7CiAJbGlzdF9hZGQoJmJ1cy0+bGluaywgJnBtYWNfaTJjX2J1c3Nlcyk7CkBAIC03OTgsNyArNzk5LDcgQEAKIAkJYnVzLT5tb2RlID0gcG1hY19pMmNfbW9kZV9zdGQ7CiAJCWJ1cy0+aG9zdGRhdGEgPSBidXMgKyAxOwogCQlidXMtPnhmZXIgPSBwbXVfaTJjX3hmZXI7Ci0JCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwkJbXV0ZXhfaW5pdCgmYnVzLT5tdXRleCk7CiAJCWJ1cy0+ZmxhZ3MgPSBwbWFjX2kyY19tdWx0aWJ1czsKIAkJbGlzdF9hZGQoJmJ1cy0+bGluaywgJnBtYWNfaTJjX2J1c3Nlcyk7CiAKQEAgLTkyMSw3ICs5MjIsNyBAQAogCQlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKIAkJYnVzLT5ob3N0ZGF0YSA9IGJ1cyArIDE7CiAJCWJ1cy0+eGZlciA9IHNtdV9pMmNfeGZlcjsKLQkJaW5pdF9NVVRFWCgmYnVzLT5zZW0pOworCQltdXRleF9pbml0KCZidXMtPm11dGV4KTsKIAkJYnVzLT5mbGFncyA9IDA7CiAJCWxpc3RfYWRkKCZidXMtPmxpbmssICZwbWFjX2kyY19idXNzZXMpOwogCkBAIC0xMDkzLDEzICsxMDk0LDEzIEBACiB7CiAJaW50IHJjOwogCi0JZG93bigmYnVzLT5zZW0pOworCW11dGV4X2xvY2soJmJ1cy0+bXV0ZXgpOwogCWJ1cy0+cG9sbGVkID0gcG9sbGVkIHx8IHBtYWNfaTJjX2ZvcmNlX3BvbGw7CiAJYnVzLT5vcGVuZWQgPSAxOwogCWJ1cy0+bW9kZSA9IHBtYWNfaTJjX21vZGVfc3RkOwogCWlmIChidXMtPm9wZW4gJiYgKHJjID0gYnVzLT5vcGVuKGJ1cykpICE9IDApIHsKIAkJYnVzLT5vcGVuZWQgPSAwOwotCQl1cCgmYnVzLT5zZW0pOworCQltdXRleF91bmxvY2soJmJ1cy0+bXV0ZXgpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJldHVybiAwOwpAQCAtMTExMiw3ICsxMTEzLDcgQEAKIAlpZiAoYnVzLT5jbG9zZSkKIAkJYnVzLT5jbG9zZShidXMpOwogCWJ1cy0+b3BlbmVkID0gMDsKLQl1cCgmYnVzLT5zZW0pOworCW11dGV4X3VubG9jaygmYnVzLT5tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19jbG9zZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IGM0YWY5ZTIuLjkyNTg2ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtMzUsOCArMzUsNiBAQAogI2RlZmluZSBEQkcoeC4uLikKICNlbmRpZgogCi1zdGF0aWMgaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwotCiAvKiBYWFggQ291bGQgYmUgcGVyLWNvbnRyb2xsZXIsIGJ1dCBJIGRvbid0IHRoaW5rIHdlIHJpc2sgYW55dGhpbmcgYnkKICAqIGFzc3VtaW5nIHdlIHdvbid0IGhhdmUgYm90aCBVbmlOb3J0aCBhbmQgQmFuZGl0ICovCiBzdGF0aWMgaW50IGhhc191bmlub3J0aDsKQEAgLTg5Nyw3ICs4OTUsNyBAQAogICogInBjaSIgKGEgTVBDMTA2KSBhbmQgbm8gYmFuZGl0IG9yIGNoYW9zIGJyaWRnZXMsIGFuZCBjb250cmFyaXdpc2UsCiAgKiBpZiB3ZSBoYXZlIG9uZSBvciBtb3JlIGJhbmRpdCBvciBjaGFvcyBicmlkZ2VzLCB3ZSBkb24ndCBoYXZlIGEgTVBDMTA2LgogICovCi1zdGF0aWMgaW50IF9faW5pdCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQorc3RhdGljIGludCBfX2luaXQgcG1hY19hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtOTE4LDE1ICs5MTYsOSBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCS8qIFhYWCBEaWZmZXJlbnQgcHJvdG90eXBlcywgdG8gYmUgbWVyZ2VkICovCi0jaWZkZWYgQ09ORklHX1BQQzY0CiAJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwotI2Vsc2UKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7Ci0jZW5kaWYKIAlpZiAoIWhvc2UpCiAJCXJldHVybiAtRU5PTUVNOwotCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CiAKQEAgLTEwMDYsMTkgKzk5OCw2IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiB9CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLXN0YXRpYyB2b2lkIF9faW5pdCBwbWFjX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIEhvc3QgJWQsIGlvIHN0YXJ0OiAlbHg7IGlvIGVuZDogJWx4XG4iLAotCQkgICAgICAgaG9zZS0+Z2xvYmFsX251bWJlciwKLQkJICAgICAgIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOwotCX0KLX0KLSNlbmRpZgotCiB2b2lkIF9faW5pdCBwbWFjX3BjaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnJvb3Q7CkBAIC0xMDM2LDcgKzEwMTUsNyBAQAogCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAiYmFuZGl0IikgPT0gMAogCQkgICAgfHwgc3RyY21wKG5wLT5uYW1lLCAiY2hhb3MiKSA9PSAwCiAJCSAgICB8fCBzdHJjbXAobnAtPm5hbWUsICJwY2kiKSA9PSAwKSB7Ci0JCQlpZiAoYWRkX2JyaWRnZShucCkgPT0gMCkKKwkJCWlmIChwbWFjX2FkZF9icmlkZ2UobnApID09IDApCiAJCQkJb2Zfbm9kZV9nZXQobnApOwogCQl9CiAJCWlmIChzdHJjbXAobnAtPm5hbWUsICJodCIpID09IDApIHsKQEAgLTEwNTAsMjggKzEwMjksOSBAQAogCS8qIFByb2JlIEhUIGxhc3QgYXMgaXQgcmVsaWVzIG9uIHRoZSBhZ3AgcmVzb3VyY2VzIHRvIGJlIGFscmVhZHkKIAkgKiBzZXR1cAogCSAqLwotCWlmIChodCAmJiBhZGRfYnJpZGdlKGh0KSAhPSAwKQorCWlmIChodCAmJiBwbWFjX2FkZF9icmlkZ2UoaHQpICE9IDApCiAJCW9mX25vZGVfcHV0KGh0KTsKIAotCS8qCi0JICogV2UgbmVlZCB0byBjYWxsIHBjaV9zZXR1cF9waGJfaW8gZm9yIHRoZSBIVCBicmlkZ2UgZmlyc3QKLQkgKiBzbyBpdCBnZXRzIHRoZSBJL08gcG9ydCBudW1iZXJzIHN0YXJ0aW5nIGF0IDAsIGFuZCB3ZQotCSAqIG5lZWQgdG8gY2FsbCBpdCBmb3IgdGhlIEFHUCBicmlkZ2UgYWZ0ZXIgdGhhdCBzbyBpdCBnZXRzCi0JICogc21hbGwgcG9zaXRpdmUgSS9PIHBvcnQgbnVtYmVycy4KLQkgKi8KLQlpZiAodTNfaHQpCi0JCXBjaV9zZXR1cF9waGJfaW8odTNfaHQsIDEpOwotCWlmICh1M19hZ3ApCi0JCXBjaV9zZXR1cF9waGJfaW8odTNfYWdwLCAwKTsKLQlpZiAodTRfcGNpZSkKLQkJcGNpX3NldHVwX3BoYl9pbyh1NF9wY2llLCAwKTsKLQotCS8qCi0JICogT24gcHBjNjQsIGZpeHVwIHRoZSBJTyByZXNvdXJjZXMgb24gb3VyIGhvc3QgYnJpZGdlcyBhcwotCSAqIHRoZSBjb21tb24gY29kZSBkb2VzIGl0IG9ubHkgZm9yIGNoaWxkcmVuIG9mIHRoZSBob3N0IGJyaWRnZXMKLQkgKi8KLQlwbWFjX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8KIAlwY2lfZGV2c19waGJfaW5pdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwppbmRleCA0MGYwMDA4Li5hMDUwNzliIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKQEAgLTcsNiArNyw3IEBACiAJc2VsZWN0IFVTQl9PSENJX0JJR19FTkRJQU5fTU1JTwogCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KKwlzZWxlY3QgTUVNT1JZX0hPVFBMVUcKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBTb255IFBTMyBnYW1lIGNvbnNvbGUKIAkgIGFuZCBvdGhlciBwbGF0Zm9ybXMgdXNpbmcgdGhlIFBTMyBoeXBlcnZpc29yLgpAQCAtNzMsMTggKzc0LDEyIEBACiAKIGNvbmZpZyBQUzNfVlVBUlQKIAlkZXBlbmRzIG9uIFBQQ19QUzMKLQlib29sICJQUzMgVmlydHVhbCBVQVJUIHN1cHBvcnQiIGlmIFBTM19BRFZBTkNFRAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFBTMyBWaXJ0dWFsIFVBUlQuCi0KLQkgIFRoaXMgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3Igc2V2ZXJhbCBzeXN0ZW0gc2VydmljZXMKLQkgIGluY2x1ZGluZyB0aGUgU3lzdGVtIE1hbmFnZXIgYW5kIEFWIFNldHRpbmdzLiAgSW4KLQkgIGdlbmVyYWwsIGFsbCB1c2VycyB3aWxsIHNheSBZLgorCXRyaXN0YXRlCiAKIGNvbmZpZyBQUzNfUFMzQVYKKwlkZXBlbmRzIG9uIFBQQ19QUzMKIAl0cmlzdGF0ZSAiUFMzIEFWIHNldHRpbmdzIGRyaXZlciIgaWYgUFMzX0FEVkFOQ0VECi0JZGVwZW5kcyBvbiBQUzNfVlVBUlQKKwlzZWxlY3QgUFMzX1ZVQVJUCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUFMzIEFWIFNldHRpbmdzIGRyaXZlci4KQEAgLTkzLDEzICs4OCwxOCBAQAogCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkgb3IgTS4KIAogY29uZmlnIFBTM19TWVNfTUFOQUdFUgotCWJvb2wgIlBTMyBTeXN0ZW0gTWFuYWdlciBkcml2ZXIiIGlmIFBTM19BRFZBTkNFRAotCWRlcGVuZHMgb24gUFMzX1ZVQVJUCi0JZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQUENfUFMzCisJdHJpc3RhdGUgIlBTMyBTeXN0ZW0gTWFuYWdlciBkcml2ZXIiIGlmIFBTM19BRFZBTkNFRAorCXNlbGVjdCBQUzNfVlVBUlQKKwlkZWZhdWx0IG0KIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBQUzMgU3lzdGVtIE1hbmFnZXIuCiAKIAkgIFRoaXMgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3Igc3lzdGVtIGNvbnRyb2wuICBJbgotCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkuCisJICBnZW5lcmFsLCBhbGwgdXNlcnMgd2lsbCBzYXkgWSBvciBNLgorCitjb25maWcgUFMzX1NUT1JBR0UKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwl0cmlzdGF0ZQogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCmluZGV4IGEwMDQ4ZmMuLmFjMWJkZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCkBAIC00LDMgKzQsNCBAQAogCiBvYmotJChDT05GSUdfU01QKSArPSBzbXAubwogb2JqLSQoQ09ORklHX1NQVV9CQVNFKSArPSBzcHUubworb2JqLXkgKz0gZGV2aWNlLWluaXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1ZWJiMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKQEAgLTAsMCArMSw3ODUgQEAKKy8qCisgKiAgUFMzIGRldmljZSByZWdpc3RyYXRpb24gcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3BzM3N0b3IuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qKgorICogcHMzX3NldHVwX2dlbGljX2RldmljZSAtIFNldHVwIGFuZCByZWdpc3RlciBhIGdlbGljIGRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UsIGluaXRpYWxpc2VzIHRoZQorICogc3RydWN0dXJlIG1lbWJlcnMsIGFuZCByZWdpc3RlcnMgdGhlIGRldmljZSBpbnN0YW5jZSB3aXRoIHRoZSBzeXN0ZW0gYnVzLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zZXR1cF9nZWxpY19kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwkJc3RydWN0IHBzM19kbWFfcmVnaW9uIGRfcmVnaW9uOworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJQlVHX09OKHJlcG8tPmJ1c190eXBlICE9IFBTM19CVVNfVFlQRV9TQik7CisJQlVHX09OKHJlcG8tPmRldl90eXBlICE9IFBTM19ERVZfVFlQRV9TQl9HRUxJQyk7CisKKwlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxheW91dCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYWxsb2M7CisJfQorCisJcC0+ZGV2Lm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0dFTElDOworCXAtPmRldi5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9TQjsKKwlwLT5kZXYuYnVzX2lkID0gcmVwby0+YnVzX2lkOworCXAtPmRldi5kZXZfaWQgPSByZXBvLT5kZXZfaWQ7CisJcC0+ZGV2LmRfcmVnaW9uID0gJnAtPmRfcmVnaW9uOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQocmVwbywKKwkJUFMzX0lOVEVSUlVQVF9UWVBFX0VWRU5UX1BPUlQsICZwLT5kZXYuaW50ZXJydXB0X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9maW5kX2ludGVycnVwdDsKKwl9CisKKwlCVUdfT04ocC0+ZGV2LmludGVycnVwdF9pZCAhPSAwKTsKKworCXJlc3VsdCA9IHBzM19kbWFfcmVnaW9uX2luaXQoJnAtPmRldiwgcC0+ZGV2LmRfcmVnaW9uLCBQUzNfRE1BXzY0SywKKwkJUFMzX0RNQV9PVEhFUiwgTlVMTCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfZG1hX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kbWFfaW5pdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2RldmljZV9yZWdpc3RlcjsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorZmFpbF9kbWFfaW5pdDoKK2ZhaWxfZmluZF9pbnRlcnJ1cHQ6CisJa2ZyZWUocCk7CitmYWlsX21hbGxvYzoKKwlwcl9kZWJ1ZygiIDwtICVzOiVkOiBmYWlsLlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdF9yZWZvayBwczNfc2V0dXBfdWhjX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLCBlbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZCwKKwllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRlcnJ1cHRfdHlwZSwgZW51bSBwczNfcmVnX3R5cGUgcmVnX3R5cGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbGF5b3V0IHsKKwkJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBkZXY7CisJCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiBkX3JlZ2lvbjsKKwkJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiBtX3JlZ2lvbjsKKwl9ICpwOworCXU2NCBidXNfYWRkcjsKKwl1NjQgbGVuOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCUJVR19PTihyZXBvLT5idXNfdHlwZSAhPSBQUzNfQlVTX1RZUEVfU0IpOworCUJVR19PTihyZXBvLT5kZXZfdHlwZSAhPSBQUzNfREVWX1RZUEVfU0JfVVNCKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX21hbGxvYzsKKwl9CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBtYXRjaF9pZDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfU0I7CisJcC0+ZGV2LmJ1c19pZCA9IHJlcG8tPmJ1c19pZDsKKwlwLT5kZXYuZGV2X2lkID0gcmVwby0+ZGV2X2lkOworCXAtPmRldi5kX3JlZ2lvbiA9ICZwLT5kX3JlZ2lvbjsKKwlwLT5kZXYubV9yZWdpb24gPSAmcC0+bV9yZWdpb247CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChyZXBvLAorCQlpbnRlcnJ1cHRfdHlwZSwgJnAtPmRldi5pbnRlcnJ1cHRfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2ZpbmRfaW50ZXJydXB0OworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKHJlcG8sIHJlZ190eXBlLAorCQkmYnVzX2FkZHIsICZsZW4pOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2ZpbmRfcmVnOworCX0KKworCXJlc3VsdCA9IHBzM19kbWFfcmVnaW9uX2luaXQoJnAtPmRldiwgcC0+ZGV2LmRfcmVnaW9uLCBQUzNfRE1BXzY0SywKKwkJUFMzX0RNQV9JTlRFUk5BTCwgTlVMTCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfZG1hX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kbWFfaW5pdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfbW1pb19yZWdpb25faW5pdCgmcC0+ZGV2LCBwLT5kZXYubV9yZWdpb24sIGJ1c19hZGRyLCBsZW4sCisJCVBTM19NTUlPXzRLKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19tbWlvX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9tbWlvX2luaXQ7CisJfQorCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kZXZpY2VfcmVnaXN0ZXI7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworCitmYWlsX2RldmljZV9yZWdpc3RlcjoKK2ZhaWxfbW1pb19pbml0OgorZmFpbF9kbWFfaW5pdDoKK2ZhaWxfZmluZF9yZWc6CitmYWlsX2ZpbmRfaW50ZXJydXB0OgorCWtmcmVlKHApOworZmFpbF9tYWxsb2M6CisJcHJfZGVidWcoIiA8LSAlczolZDogZmFpbC5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3NldHVwX2VoY2lfZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJcmV0dXJuIHBzM19zZXR1cF91aGNfZGV2aWNlKHJlcG8sIFBTM19NQVRDSF9JRF9FSENJLAorCQlQUzNfSU5URVJSVVBUX1RZUEVfU0JfRUhDSSwgUFMzX1JFR19UWVBFX1NCX0VIQ0kpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfc2V0dXBfb2hjaV9kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlyZXR1cm4gcHMzX3NldHVwX3VoY19kZXZpY2UocmVwbywgUFMzX01BVENIX0lEX09IQ0ksCisJCVBTM19JTlRFUlJVUFRfVFlQRV9TQl9PSENJLCBQUzNfUkVHX1RZUEVfU0JfT0hDSSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zZXR1cF92dWFydF9kZXZpY2UoZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQsCisJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBtYXRjaF9pZCAldSwgcG9ydCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQltYXRjaF9pZCwgcG9ydF9udW1iZXIpOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBtYXRjaF9pZDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfVlVBUlQ7CisJcC0+ZGV2LnBvcnRfbnVtYmVyID0gcG9ydF9udW1iZXI7CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzc3Rvcl93YWl0X2Zvcl9jb21wbGV0aW9uKHU2NCBkZXZfaWQsIHU2NCB0YWcsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCWludCByZXN1bHQgPSAtMTsKKwl1bnNpZ25lZCBpbnQgcmV0cmllcyA9IDA7CisJdTY0IHN0YXR1czsKKworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCB0aW1lb3V0OyByZXRyaWVzKyspIHsKKwkJcmVzdWx0ID0gbHYxX3N0b3JhZ2VfY2hlY2tfYXN5bmNfc3RhdHVzKGRldl9pZCwgdGFnLCAmc3RhdHVzKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlicmVhazsKKworCQltc2xlZXAoMSk7CisJfQorCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiV1OiBjaGVja19hc3luY19zdGF0dXM6ICVzLCBzdGF0dXMgJWx4XG4iLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpLCBzdGF0dXMpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBwczNfc3RvcmFnZV93YWl0X2Zvcl9kZXZpY2UgLSBXYWl0IGZvciBhIHN0b3JhZ2UgZGV2aWNlIHRvIGJlY29tZSByZWFkeS4KKyAqIEByZXBvOiBUaGUgcmVwb3NpdG9yeSBkZXZpY2UgdG8gd2FpdCBmb3IuCisgKgorICogVXNlcyB0aGUgaHlwZXJ2aXNvcidzIHN0b3JhZ2UgZGV2aWNlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20gdG8gd2FpdCB1bnRpbAorICogYSBzdG9yYWdlIGRldmljZSBpcyByZWFkeS4gIFRoZSBkZXZpY2Ugbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB1c2VzIGEKKyAqIHBzdWVkbyBkZXZpY2UgKGlkID0gLTEpIHRvIGFzeW5jaHJvbm91c2x5IG5vdGlmeSB0aGUgZ3Vlc3Qgd2hlbiBzdG9yYWdlCisgKiBkZXZpY2VzIGJlY29tZSByZWFkeS4gIFRoZSBub3RpZmljYXRpb24gZGV2aWNlIGhhcyBhIGJsb2NrIHNpemUgb2YgNTEyCisgKiBieXRlcy4KKyAqLworCitzdGF0aWMgaW50IHBzM19zdG9yYWdlX3dhaXRfZm9yX2RldmljZShjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCWludCByZXN1bHQ7CisJY29uc3QgdTY0IG5vdGlmaWNhdGlvbl9kZXZfaWQgPSAodTY0KS0xTEw7CisJY29uc3QgdW5zaWduZWQgaW50IHRpbWVvdXQgPSBIWjsKKwl1NjQgbHBhcjsKKwl1NjQgdGFnOworCXN0cnVjdCB7CisJCXU2NCBvcGVyYXRpb25fY29kZTsJLyogbXVzdCBiZSB6ZXJvICovCisJCXU2NCBldmVudF9tYXNrOwkJLyogMSA9IGRldmljZSByZWFkeSAqLworCX0gKm5vdGlmeV9jbWQ7CisJc3RydWN0IHsKKwkJdTY0IGV2ZW50X3R5cGU7CQkvKiBub3RpZnlfZGV2aWNlX3JlYWR5ICovCisJCXU2NCBidXNfaWQ7CisJCXU2NCBkZXZfaWQ7CisJCXU2NCBkZXZfdHlwZTsKKwkJdTY0IGRldl9wb3J0OworCX0gKm5vdGlmeV9ldmVudDsKKwllbnVtIHsKKwkJbm90aWZ5X2RldmljZV9yZWFkeSA9IDEKKwl9OworCisJcHJfZGVidWcoIiAtPiAlczoldTogYnVzX2lkICV1LCBkZXZfaWQgJXUsIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywKKwkJIF9fTElORV9fLCByZXBvLT5idXNfaWQsIHJlcG8tPmRldl9pZCwgcmVwby0+ZGV2X3R5cGUpOworCisJbm90aWZ5X2NtZCA9IGt6YWxsb2MoNTEyLCBHRlBfS0VSTkVMKTsKKwlub3RpZnlfZXZlbnQgPSAodm9pZCAqKW5vdGlmeV9jbWQ7CisJaWYgKCFub3RpZnlfY21kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxwYXIgPSBwczNfbW1fcGh5c190b19scGFyKF9fcGEobm90aWZ5X2NtZCkpOworCisJcmVzdWx0ID0gbHYxX29wZW5fZGV2aWNlKHJlcG8tPmJ1c19pZCwgbm90aWZpY2F0aW9uX2Rldl9pZCwgMCk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiBsdjFfb3Blbl9kZXZpY2UgJXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9mcmVlOworCX0KKworCS8qIFNldHVwIGFuZCB3cml0ZSB0aGUgcmVxdWVzdCBmb3IgZGV2aWNlIG5vdGlmaWNhdGlvbi4gKi8KKworCW5vdGlmeV9jbWQtPm9wZXJhdGlvbl9jb2RlID0gMDsJLyogbXVzdCBiZSB6ZXJvICovCisJbm90aWZ5X2NtZC0+ZXZlbnRfbWFzayA9IDB4MDE7CS8qIGRldmljZSByZWFkeSAqLworCisJcmVzdWx0ID0gbHYxX3N0b3JhZ2Vfd3JpdGUobm90aWZpY2F0aW9uX2Rldl9pZCwgMCwgMCwgMSwgMCwgbHBhciwKKwkJCQkgICAmdGFnKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHdyaXRlIGZhaWxlZCAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkgICAgICAgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2Nsb3NlOworCX0KKworCS8qIFdhaXQgZm9yIHRoZSB3cml0ZSBjb21wbGV0aW9uICovCisKKwlyZXN1bHQgPSBwczNzdG9yX3dhaXRfZm9yX2NvbXBsZXRpb24obm90aWZpY2F0aW9uX2Rldl9pZCwgdGFnLAorCQkJCQkgICAgIHRpbWVvdXQpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogd3JpdGUgbm90IGNvbXBsZXRlZCAlc1xuIiwgX19mdW5jX18sCisJCSAgICAgICBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2Nsb3NlOworCX0KKworCS8qIExvb3AgaGVyZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0ZWQgbm90aWZpY2F0aW9uIGV2ZW50cy4gKi8KKworCXJlc3VsdCA9IC1FTk9ERVY7CisJd2hpbGUgKDEpIHsKKwkJbWVtc2V0KG5vdGlmeV9ldmVudCwgMCwgc2l6ZW9mKCpub3RpZnlfZXZlbnQpKTsKKworCQlyZXN1bHQgPSBsdjFfc3RvcmFnZV9yZWFkKG5vdGlmaWNhdGlvbl9kZXZfaWQsIDAsIDAsIDEsIDAsCisJCQkJCSAgbHBhciwgJnRhZyk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHdyaXRlIGZhaWxlZCAlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHBzM3N0b3Jfd2FpdF9mb3JfY29tcGxldGlvbihub3RpZmljYXRpb25fZGV2X2lkLCB0YWcsCisJCQkJCQkgICAgIHRpbWVvdXQpOworCQlpZiAocmVzdWx0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiByZWFkIG5vdCBjb21wbGV0ZWQgJXNcbiIsCisJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobm90aWZ5X2V2ZW50LT5ldmVudF90eXBlICE9IG5vdGlmeV9kZXZpY2VfcmVhZHkgfHwKKwkJICAgIG5vdGlmeV9ldmVudC0+YnVzX2lkICE9IHJlcG8tPmJ1c19pZCkgeworCQkJcHJfZGVidWcoIiVzOiV1OiBiYWQgbm90aWZ5X2V2ZW50OiBldmVudCAlbHUsICIKKwkJCQkgImRldl9pZCAlbHUsIGRldl90eXBlICVsdVxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fLCBub3RpZnlfZXZlbnQtPmV2ZW50X3R5cGUsCisJCQkJIG5vdGlmeV9ldmVudC0+ZGV2X2lkLCBub3RpZnlfZXZlbnQtPmRldl90eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5vdGlmeV9ldmVudC0+ZGV2X2lkID09IHJlcG8tPmRldl9pZCAmJgorCQkgICAgbm90aWZ5X2V2ZW50LT5kZXZfdHlwZSA9PSByZXBvLT5kZXZfdHlwZSkgeworCQkJcHJfZGVidWcoIiVzOiV1OiBkZXZpY2UgcmVhZHk6IGRldl9pZCAldVxuIiwgX19mdW5jX18sCisJCQkJIF9fTElORV9fLCByZXBvLT5kZXZfaWQpOworCQkJcmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5vdGlmeV9ldmVudC0+ZGV2X2lkID09IHJlcG8tPmRldl9pZCAmJgorCQkgICAgbm90aWZ5X2V2ZW50LT5kZXZfdHlwZSA9PSBQUzNfREVWX1RZUEVfTk9BQ0NFU1MpIHsKKwkJCXByX2RlYnVnKCIlczoldTogbm8gYWNjZXNzOiBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAorCQkJCSBfX0xJTkVfXywgcmVwby0+ZGV2X2lkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitmYWlsX2Nsb3NlOgorCWx2MV9jbG9zZV9kZXZpY2UocmVwby0+YnVzX2lkLCBub3RpZmljYXRpb25fZGV2X2lkKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShub3RpZnlfY21kKTsKKwlwcl9kZWJ1ZygiIDwtICVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3NldHVwX3N0b3JhZ2VfZGV2KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sCisJCQkJIGVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqcDsKKwl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7CisJdW5zaWduZWQgaW50IG51bV9yZWdpb25zLCBpOworCisJcHJfZGVidWcoIiAtPiAlczoldTogbWF0Y2hfaWQgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbWF0Y2hfaWQpOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvKHJlcG8tPmJ1c19pbmRleCwKKwkJCQkJCSAgIHJlcG8tPmRldl9pbmRleCwgJnBvcnQsCisJCQkJCQkgICAmYmxrX3NpemUsICZudW1fYmxvY2tzLAorCQkJCQkJICAgJm51bV9yZWdpb25zKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IF9yZWFkX3N0b3JfZGV2X2luZm8gZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JXU6IGluZGV4ICV1OiV1OiBwb3J0ICVsdSBibGtfc2l6ZSAlbHUgbnVtX2Jsb2NrcyAlbHUgIgorCQkgIm51bV9yZWdpb25zICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwKKwkJIHJlcG8tPmRldl9pbmRleCwgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3MsIG51bV9yZWdpb25zKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlKSArCisJCSAgICBudW1fcmVnaW9ucyAqIHNpemVvZihzdHJ1Y3QgcHMzX3N0b3JhZ2VfcmVnaW9uKSwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghcCkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfbWFsbG9jOworCX0KKworCXAtPnNiZC5tYXRjaF9pZCA9IG1hdGNoX2lkOworCXAtPnNiZC5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9TQjsKKwlwLT5zYmQuYnVzX2lkID0gcmVwby0+YnVzX2lkOworCXAtPnNiZC5kZXZfaWQgPSByZXBvLT5kZXZfaWQ7CisJcC0+c2JkLmRfcmVnaW9uID0gJnAtPmRtYV9yZWdpb247CisJcC0+YmxrX3NpemUgPSBibGtfc2l6ZTsKKwlwLT5udW1fcmVnaW9ucyA9IG51bV9yZWdpb25zOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQocmVwbywKKwkJCQkJICAgICAgIFBTM19JTlRFUlJVUFRfVFlQRV9FVkVOVF9QT1JULAorCQkJCQkgICAgICAgJnAtPnNiZC5pbnRlcnJ1cHRfaWQpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogZmluZF9pbnRlcnJ1cHQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIF9fTElORV9fLCByZXN1bHQpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfZmluZF9pbnRlcnJ1cHQ7CisJfQorCisJLyogRklYTUU6IEFycmFuZ2UgdG8gb25seSBkbyB0aGlzIG9uIGEgJ2NvbGQnIGJvb3QgKi8KKworCXJlc3VsdCA9IHBzM19zdG9yYWdlX3dhaXRfZm9yX2RldmljZShyZXBvKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHN0b3JhZ2Vfbm90aWZpY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX3Byb2JlX25vdGlmaWNhdGlvbjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ2lvbnM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaWQ7CisJCXU2NCBzdGFydCwgc2l6ZTsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbihyZXBvLT5idXNfaW5kZXgsCisJCQkJCQkJICAgICByZXBvLT5kZXZfaW5kZXgsCisJCQkJCQkJICAgICBpLCAmaWQsICZzdGFydCwKKwkJCQkJCQkgICAgICZzaXplKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiV1OiByZWFkX3N0b3JfZGV2X3JlZ2lvbiBmYWlsZWQgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbF9yZWFkX3JlZ2lvbjsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6JXU6IHJlZ2lvbiAldTogaWQgJXUgc3RhcnQgJWx1IHNpemUgJWx1XG4iLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgaSwgaWQsIHN0YXJ0LCBzaXplKTsKKworCQlwLT5yZWdpb25zW2ldLmlkID0gaWQ7CisJCXAtPnJlZ2lvbnNbaV0uc3RhcnQgPSBzdGFydDsKKwkJcC0+cmVnaW9uc1tpXS5zaXplID0gc2l6ZTsKKwl9CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPnNiZCk7CisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCSBfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorZmFpbF9yZWFkX3JlZ2lvbjoKK2ZhaWxfcHJvYmVfbm90aWZpY2F0aW9uOgorZmFpbF9maW5kX2ludGVycnVwdDoKKwlrZnJlZShwKTsKK2ZhaWxfbWFsbG9jOgorCXByX2RlYnVnKCIgPC0gJXM6JXU6IGZhaWwuXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19yZWdpc3Rlcl92dWFydF9kZXZpY2VzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9hdl9wb3J0KCZwb3J0X251bWJlcik7CisJaWYgKHJlc3VsdCkKKwkJcG9ydF9udW1iZXIgPSAwOyAvKiBhdiBkZWZhdWx0ICovCisKKwlyZXN1bHQgPSBwczNfc2V0dXBfdnVhcnRfZGV2aWNlKFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUywgcG9ydF9udW1iZXIpOworCVdBUk5fT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfc3lzbWdyX3BvcnQoJnBvcnRfbnVtYmVyKTsKKwlpZiAocmVzdWx0KQorCQlwb3J0X251bWJlciA9IDI7IC8qIHN5c21nciBkZWZhdWx0ICovCisKKwlyZXN1bHQgPSBwczNfc2V0dXBfdnVhcnRfZGV2aWNlKFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUiwKKwkJcG9ydF9udW1iZXIpOworCVdBUk5fT04ocmVzdWx0KTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3JlZ2lzdGVyX3NvdW5kX2RldmljZXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwkJc3RydWN0IHBzM19kbWFfcmVnaW9uIGRfcmVnaW9uOworCQlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uIG1fcmVnaW9uOworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAtPmRldi5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9TT1VORDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfSU9DMDsKKwlwLT5kZXYuZF9yZWdpb24gPSAmcC0+ZF9yZWdpb247CisJcC0+ZGV2Lm1fcmVnaW9uID0gJnAtPm1fcmVnaW9uOworCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfZ3JhcGhpY3NfZGV2aWNlcyh2b2lkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1M7CisJcC0+ZGV2LmRldl90eXBlID0gUFMzX0RFVklDRV9UWVBFX0lPQzA7CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3JlZ2lzdGVyX3JlcG9zaXRvcnlfZGV2aWNlIC0gUmVnaXN0ZXIgYSBkZXZpY2UgZnJvbSB0aGUgcmVwb3NpdGlvcnkgaW5mby4KKyAqCisgKi8KKworc3RhdGljIGludCBwczNfcmVnaXN0ZXJfcmVwb3NpdG9yeV9kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChyZXBvLT5kZXZfdHlwZSkgeworCWNhc2UgUFMzX0RFVl9UWVBFX1NCX0dFTElDOgorCQlyZXN1bHQgPSBwczNfc2V0dXBfZ2VsaWNfZGV2aWNlKHJlcG8pOworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3NldHVwX2dlbGljX2RldmljZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBTM19ERVZfVFlQRV9TQl9VU0I6CisKKwkJLyogRWFjaCBVU0IgZGV2aWNlIGhhcyBib3RoIGFuIEVIQ0kgYW5kIGFuIE9IQ0kgSEMgKi8KKworCQlyZXN1bHQgPSBwczNfc2V0dXBfZWhjaV9kZXZpY2UocmVwbyk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19zZXR1cF9laGNpX2RldmljZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19zZXR1cF9vaGNpX2RldmljZShyZXBvKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3NldHVwX29oY2lfZGV2aWNlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQl9CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVl9UWVBFX1NUT1JfRElTSzoKKwkJcmVzdWx0ID0gcHMzX3NldHVwX3N0b3JhZ2VfZGV2KHJlcG8sIFBTM19NQVRDSF9JRF9TVE9SX0RJU0spOworCisJCS8qIFNvbWUgZGV2aWNlcyBhcmUgbm90IGFjY2Vzc2FibGUgZnJvbSB0aGUgT3RoZXIgT1MgbHBhci4gKi8KKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKSB7CisJCQlyZXN1bHQgPSAwOworCQkJcHJfZGVidWcoIiVzOiV1OiBub3QgYWNjZXNzYWJsZVxuIiwgX19mdW5jX18sCisJCQkJIF9fTElORV9fKTsKKwkJfQorCisJCWlmIChyZXN1bHQpCisJCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3NldHVwX3N0b3JhZ2VfZGV2IGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJYnJlYWs7CisKKwljYXNlIFBTM19ERVZfVFlQRV9TVE9SX1JPTToKKwkJcmVzdWx0ID0gcHMzX3NldHVwX3N0b3JhZ2VfZGV2KHJlcG8sIFBTM19NQVRDSF9JRF9TVE9SX1JPTSk7CisJCWlmIChyZXN1bHQpCisJCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3NldHVwX3N0b3JhZ2VfZGV2IGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJYnJlYWs7CisKKwljYXNlIFBTM19ERVZfVFlQRV9TVE9SX0ZMQVNIOgorCQlyZXN1bHQgPSBwczNfc2V0dXBfc3RvcmFnZV9kZXYocmVwbywgUFMzX01BVENIX0lEX1NUT1JfRkxBU0gpOworCQlpZiAocmVzdWx0KQorCQkJcHJfZGVidWcoIiVzOiV1IHBzM19zZXR1cF9zdG9yYWdlX2RldiBmYWlsZWRcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gMDsKKwkJcHJfZGVidWcoIiVzOiV1OiB1bnN1cHBvcnRlZCBkZXZfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcmVwby0+ZGV2X3R5cGUpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3Byb2JlX3RocmVhZCAtIEJhY2tncm91bmQgcmVwb3NpdG9yeSBwcm9iaW5nIGF0IHN5c3RlbSBzdGFydHVwLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBiYWNrZ3JvdW5kIHByb2Jpbmcgb24gYSBzaW5nbGUgYnVzLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Byb2JlX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8gPSBkYXRhOworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IG1zID0gMjUwOworCisJcHJfZGVidWcoIiAtPiAlczoldToga3RocmVhZCBzdGFydGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJZG8geworCQl0cnlfdG9fZnJlZXplKCk7CisKKwkJcHJfZGVidWcoIiVzOiV1OiBwcm9iaW5nLi4uXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJCWRvIHsKKwkJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKHJlcG8pOworCisJCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCQkJcHJfZGVidWcoIiVzOiV1OiBub3RoaW5nIG5ld1xuIiwgX19mdW5jX18sCisJCQkJCV9fTElORV9fKTsKKwkJCWVsc2UgaWYgKHJlc3VsdCkKKwkJCQlwcl9kZWJ1ZygiJXM6JXU6IGZpbmQgZGV2aWNlIGVycm9yLlxuIiwKKwkJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCWVsc2UgeworCQkJCXByX2RlYnVnKCIlczoldTogZm91bmQgZGV2aWNlXG4iLCBfX2Z1bmNfXywKKwkJCQkJX19MSU5FX18pOworCQkJCXBzM19yZWdpc3Rlcl9yZXBvc2l0b3J5X2RldmljZShyZXBvKTsKKwkJCQlwczNfcmVwb3NpdG9yeV9idW1wX2RldmljZShyZXBvKTsKKwkJCQltcyA9IDI1MDsKKwkJCX0KKwkJfSB3aGlsZSAoIXJlc3VsdCk7CisKKwkJcHJfZGVidWcoIiVzOiV1OiBtcyAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtcyk7CisKKwkJaWYgKCBtcyA+IDYwMDAwKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwX2ludGVycnVwdGlibGUobXMpOworCisJCS8qIEFuIGV4cG9uZW50aWFsIGJhY2tvZmYuICovCisJCW1zIDw8PSAxOworCisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiV1OiBrdGhyZWFkIGZpbmlzaGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3N0YXJ0X3Byb2JlX3RocmVhZCAtIFN0YXJ0cyB0aGUgYmFja2dyb3VuZCBwcm9iZSB0aHJlYWQuCisgKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zdGFydF9wcm9iZV90aHJlYWQoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RhdGljIHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgcmVwbzsgLyogbXVzdCBiZSBzdGF0aWMgKi8KKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltZW1zZXQoJnJlcG8sIDAsIHNpemVvZihyZXBvKSk7CisKKwlyZXBvLmJ1c190eXBlID0gYnVzX3R5cGU7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2J1cyhyZXBvLmJ1c190eXBlLCAwLCAmcmVwby5idXNfaW5kZXgpOworCisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgZmluZCBidXMgKCVkKVxuIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKHJlcG8uYnVzX2luZGV4LCAmcmVwby5idXNfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkX2J1c19pZCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkJcmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdGFzayA9IGt0aHJlYWRfcnVuKHBzM19wcm9iZV90aHJlYWQsICZyZXBvLCAicHMzLXByb2JlLSV1IiwgYnVzX3R5cGUpOworCisJaWYgKElTX0VSUih0YXNrKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKHRhc2spOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBrdGhyZWFkX3J1biBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM19yZWdpc3Rlcl9kZXZpY2VzIC0gUHJvYmUgdGhlIHN5c3RlbSBhbmQgcmVnaXN0ZXIgZGV2aWNlcyBmb3VuZC4KKyAqCisgKiBBIGRldmljZV9pbml0Y2FsbCgpIHJvdXRpbmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcHMzX3JlZ2lzdGVyX2RldmljZXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkvKiBwczNfcmVwb3NpdG9yeV9kdW1wX2J1c19pbmZvKCk7ICovCisKKwlyZXN1bHQgPSBwczNfc3RhcnRfcHJvYmVfdGhyZWFkKFBTM19CVVNfVFlQRV9TVE9SQUdFKTsKKworCXBzM19yZWdpc3Rlcl92dWFydF9kZXZpY2VzKCk7CisKKwlwczNfcmVnaXN0ZXJfZ3JhcGhpY3NfZGV2aWNlcygpOworCisJcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2VzKFBTM19CVVNfVFlQRV9TQiwKKwkJcHMzX3JlZ2lzdGVyX3JlcG9zaXRvcnlfZGV2aWNlKTsKKworCXBzM19yZWdpc3Rlcl9zb3VuZF9kZXZpY2VzKCk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwocHMzX3JlZ2lzdGVyX2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCmluZGV4IGExNDA5ZTQuLjVkMmUxNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKQEAgLTI5LDEyICsyOSwxMiBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAotc3RhdGljIGhwdGVfdCAqaHRhYjsKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9wdGUgKmh0YWI7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBodGFiX2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqYm9sdHRhYjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnVzZXRhYjsKQEAgLTQ0LDggKzQ0LDggQEAKICNkZWZpbmUgZGVidWdfZHVtcF9ocHRlKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nKSBcCiAJX2RlYnVnX2R1bXBfaHB0ZShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX19mdW5jX18sIF9fTElORV9fKQogc3RhdGljIHZvaWQgX2RlYnVnX2R1bXBfaHB0ZSh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHZhLAotCXVuc2lnbmVkIGxvbmcgZ3JvdXAsIHVuc2lnbmVkIGxvbmcgYml0bWFwLCBocHRlX3QgbGhwdGUsIGludCBwc2l6ZSwKLQl1bnNpZ25lZCBsb25nIHNsb3QsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQorCXVuc2lnbmVkIGxvbmcgZ3JvdXAsIHVuc2lnbmVkIGxvbmcgYml0bWFwLCBzdHJ1Y3QgaGFzaF9wdGUgbGhwdGUsCisJaW50IHBzaXplLCB1bnNpZ25lZCBsb25nIHNsb3QsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCURCRygiJXM6JWQ6IHBhICAgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIHBhKTsKIAlEQkcoIiVzOiVkOiBscGFyICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLApAQCAtNjMsNyArNjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgcmZsYWdzLCB1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgc2xvdDsKLQlocHRlX3QgbGhwdGU7CisJc3RydWN0IGhhc2hfcHRlIGxocHRlOwogCWludCBzZWNvbmRhcnkgPSAwOwogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgYml0bWFwOwpAQCAtMjM0LDEwICsyMzQsMTcgQEAKIAogc3RhdGljIHZvaWQgcHMzX2hwdGVfY2xlYXIodm9pZCkKIHsKLQkvKiBNYWtlIHN1cmUgdG8gY2xlYW4gdXAgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgZmlyc3QgKi8KLQlwczNmYl9jbGVhbnVwKCk7CisJaW50IHJlc3VsdDsKIAotCWx2MV91bm1hcF9odGFiKGh0YWJfYWRkcik7CisJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlyZXN1bHQgPSBsdjFfdW5tYXBfaHRhYihodGFiX2FkZHIpOworCUJVR19PTihyZXN1bHQpOworCisJcHMzX21tX3NodXRkb3duKCk7CisJcHMzX21tX3Zhc19kZXN0cm95KCk7CisKKwlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIAogdm9pZCBfX2luaXQgcHMzX2hwdGVfaW5pdCh1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZSkKQEAgLTI1NSw3ICsyNjIsNyBAQAogCiAJcHBjNjRfcGZ0X3NpemUgPSBfX2lsb2cyKGh0YWJfc2l6ZSk7CiAKLQliaXRtYXBfc2l6ZSA9IGh0YWJfc2l6ZSAvIHNpemVvZihocHRlX3QpIC8gODsKKwliaXRtYXBfc2l6ZSA9IGh0YWJfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgaGFzaF9wdGUpIC8gODsKIAogCWJvbHR0YWIgPSBfX3ZhKGxtYl9hbGxvYyhiaXRtYXBfc2l6ZSwgMSkpOwogCWludXNldGFiID0gX192YShsbWJfYWxsb2MoYml0bWFwX3NpemUsIDEpKTsKQEAgLTI3Myw4ICsyODAsOCBAQAogCiAJcmVzdWx0ID0gbHYxX21hcF9odGFiKDAsICZodGFiX2FkZHIpOwogCi0JaHRhYiA9IChocHRlX3QgKilfX2lvcmVtYXAoaHRhYl9hZGRyLCBodGFiX3NpemUsCi0JCQkJICAgcGdwcm90X3ZhbChQQUdFX1JFQURPTkxZX1gpKTsKKwlodGFiID0gKF9fZm9yY2Ugc3RydWN0IGhhc2hfcHRlICopaW9yZW1hcF9mbGFncyhodGFiX2FkZHIsIGh0YWJfc2l6ZSwKKwkJCQkJICAgIHBncHJvdF92YWwoUEFHRV9SRUFET05MWV9YKSk7CiAKIAlEQkcoIiVzOiVkOiBscGFyICUwMTZseGgsIHZpcnQgJTAxNmx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlodGFiX2FkZHIsICh1bnNpZ25lZCBsb25nKWh0YWIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwppbmRleCBlYzkwMzBkLi42N2UzMmVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpAQCAtMzAsOSArMzAsOSBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogLyoqCkBAIC03OCwxOSArNzgsODUgQEAKIC8qKgogICogc3RydWN0IHBzM19wcml2YXRlIC0gYSBwZXIgY3B1IGRhdGEgc3RydWN0dXJlCiAgKiBAYm1wOiBwczNfYm1wIHN0cnVjdHVyZQotICogQG5vZGU6IEhWIGxvZ2ljYWxfcHBlX2lkCi0gKiBAY3B1OiBIViB0aHJlYWRfaWQKKyAqIEBwcGVfaWQ6IEhWIGxvZ2ljYWxfcHBlX2lkCisgKiBAdGhyZWFkX2lkOiBIViB0aHJlYWRfaWQKICAqLwogCiBzdHJ1Y3QgcHMzX3ByaXZhdGUgewogCXN0cnVjdCBwczNfYm1wIGJtcCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoUFMzX0JNUF9NSU5BTElHTikpKTsKLQl1NjQgbm9kZTsKLQl1bnNpZ25lZCBpbnQgY3B1OworCXU2NCBwcGVfaWQ7CisJdTY0IHRocmVhZF9pZDsKIH07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcHMzX3ByaXZhdGUsIHBzM19wcml2YXRlKTsKIAogLyoqCisgKiBwczNfY2hpcF9tYXNrIC0gU2V0IGFuIGludGVycnVwdCBtYXNrIGJpdCBpbiBwczNfYm1wLgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIFNldHMgcHMzX2JtcC5tYXNrIGFuZCBjYWxscyBsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzaygpLgorICovCisKK3N0YXRpYyB2b2lkIHBzM19jaGlwX21hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IHRocmVhZF9pZCAlbHUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJcGQtPnRocmVhZF9pZCwgdmlycSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY2xlYXJfYml0KDYzIC0gdmlycSwgJnBkLT5ibXAubWFzayk7CisJbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIHBzM19jaGlwX3VubWFzayAtIENsZWFyIGFuIGludGVycnVwdCBtYXNrIGJpdCBpbiBwczNfYm1wLgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIENsZWFycyBwczNfYm1wLm1hc2sgYW5kIGNhbGxzIGx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKCkuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX2NoaXBfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzOiVkOiB0aHJlYWRfaWQgJWx1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXBkLT50aHJlYWRfaWQsIHZpcnEpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXNldF9iaXQoNjMgLSB2aXJxLCAmcGQtPmJtcC5tYXNrKTsKKwlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICogcHMzX2NoaXBfZW9pIC0gSFYgZW5kLW9mLWludGVycnVwdC4KKyAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KKyAqCisgKiBDYWxscyBsdjFfZW5kX29mX2ludGVycnVwdF9leHQoKS4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfY2hpcF9lb2kodW5zaWduZWQgaW50IHZpcnEpCit7CisJY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOworCWx2MV9lbmRfb2ZfaW50ZXJydXB0X2V4dChwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKK30KKworLyoqCisgKiBwczNfaXJxX2NoaXAgLSBSZXByZXNlbnRzIHRoZSBwczNfYm1wIGFzIGEgTGludXggc3RydWN0IGlycV9jaGlwLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcHMzX2lycV9jaGlwID0geworCS50eXBlbmFtZSA9ICJwczMiLAorCS5tYXNrID0gcHMzX2NoaXBfbWFzaywKKwkudW5tYXNrID0gcHMzX2NoaXBfdW5tYXNrLAorCS5lb2kgPSBwczNfY2hpcF9lb2ksCit9OworCisvKioKICAqIHBzM192aXJxX3NldHVwIC0gdmlycSByZWxhdGVkIHNldHVwLgogICogQGNwdTogZW51bSBwczNfY3B1X2JpbmRpbmcgaW5kaWNhdGluZyB0aGUgY3B1IHRoZSBpbnRlcnJ1cHQgc2hvdWxkIGJlCiAgKiBzZXJ2aWNlZCBvbi4KQEAgLTEzNCw2ICsyMDAsOCBAQAogCQlnb3RvIGZhaWxfc2V0OwogCX0KIAorCXBzM19jaGlwX21hc2soKnZpcnEpOworCiAJcmV0dXJuIHJlc3VsdDsKIAogZmFpbF9zZXQ6CkBAIC0xNTMsOCArMjIxLDggQEAKIHsKIAljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IG5vZGUgJWx1LCBjcHUgJWQsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJcGQtPm5vZGUsIHBkLT5jcHUsIHZpcnEpOworCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsdSwgdGhyZWFkX2lkICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAogCXNldF9pcnFfY2hpcF9kYXRhKHZpcnEsIE5VTEwpOwogCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CkBAIC0xOTAsNyArMjU4LDggQEAKIAogCS8qIEJpbmRzIG91dGxldCB0byBjcHUgKyB2aXJxLiAqLwogCi0JcmVzdWx0ID0gbHYxX2Nvbm5lY3RfaXJxX3BsdWdfZXh0KHBkLT5ub2RlLCBwZC0+Y3B1LCAqdmlycSwgb3V0bGV0LCAwKTsKKwlyZXN1bHQgPSBsdjFfY29ubmVjdF9pcnFfcGx1Z19leHQocGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwgKnZpcnEsCisJCW91dGxldCwgMCk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXByX2luZm8oIiVzOiVkOiBsdjFfY29ubmVjdF9pcnFfcGx1Z19leHQgZmFpbGVkOiAlc1xuIiwKQEAgLTIyMiwxMCArMjkxLDEyIEBACiAJaW50IHJlc3VsdDsKIAljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IG5vZGUgJWx1LCBjcHUgJWQsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJcGQtPm5vZGUsIHBkLT5jcHUsIHZpcnEpOworCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsdSwgdGhyZWFkX2lkICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAotCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2lycV9wbHVnX2V4dChwZC0+bm9kZSwgcGQtPmNwdSwgdmlycSk7CisJcHMzX2NoaXBfbWFzayh2aXJxKTsKKworCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2lycV9wbHVnX2V4dChwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAogCWlmIChyZXN1bHQpCiAJCXByX2luZm8oIiVzOiVkOiBsdjFfZGlzY29ubmVjdF9pcnFfcGx1Z19leHQgZmFpbGVkOiAlc1xuIiwKQEAgLTI4Miw3ICszNTMsOSBAQAogewogCWludCByZXN1bHQ7CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkIHZpcnE6ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHZpcnEpOworCXByX2RlYnVnKCIgLT4gJXM6JWQgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCB2aXJxKTsKKworCXBzM19jaGlwX21hc2sodmlycSk7CiAKIAlyZXN1bHQgPSBsdjFfZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0KHZpcnFfdG9faHcodmlycSkpOwogCkBAIC0yOTAsMTcgKzM2MywxNCBAQAogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAotCS8qIGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQoKSBkZXN0cm95cyB0aGUgSVJRIHBsdWcsCi0JICogc28gZG9uJ3QgY2FsbCBwczNfaXJxX3BsdWdfZGVzdHJveSgpIGhlcmUuCisJLyoKKwkgKiBEb24ndCBjYWxsIHBzM192aXJxX2Rlc3Ryb3koKSBoZXJlIHNpbmNlIHBzM19zbXBfY2xlYW51cF9jcHUoKQorCSAqIGNhbGxzIGZyb20gaW50ZXJydXB0IGNvbnRleHQgKHNtcF9jYWxsX2Z1bmN0aW9uKSB3aGVuIGtleGVjaW5nLgogCSAqLwogCi0JcmVzdWx0ID0gcHMzX3ZpcnFfZGVzdHJveSh2aXJxKTsKLQlCVUdfT04ocmVzdWx0KTsKLQogCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSk7CiAKIGludCBwczNfc2VuZF9ldmVudF9sb2NhbGx5KHVuc2lnbmVkIGludCB2aXJxKQogewpAQCAtMzExLDE3ICszODEsMTUgQEAKICAqIHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAgLSBTZXR1cCBhIHN5c3RlbSBidXMgZXZlbnQgcmVjZWl2ZSBwb3J0LgogICogQGNwdTogZW51bSBwczNfY3B1X2JpbmRpbmcgaW5kaWNhdGluZyB0aGUgY3B1IHRoZSBpbnRlcnJ1cHQgc2hvdWxkIGJlCiAgKiBzZXJ2aWNlZCBvbi4KLSAqIEBkaWQ6IFRoZSBIViBkZXZpY2UgaWRlbnRpZmllciByZWFkIGZyb20gdGhlIHN5c3RlbSByZXBvc2l0b3J5LgotICogQGludGVycnVwdF9pZDogVGhlIGRldmljZSBpbnRlcnJ1cHQgaWQgcmVhZCBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeS4KKyAqIEBkZXY6IFRoZSBzeXN0ZW0gYnVzIGRldmljZSBpbnN0YW5jZS4KICAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KICAqCiAgKiBBbiBldmVudCBpcnEgcmVwcmVzZW50cyBhIHZpcnR1YWwgZGV2aWNlIGludGVycnVwdC4gIFRoZSBpbnRlcnJ1cHRfaWQKICAqIGNvcmVzcG9uZHMgdG8gdGhlIHNvZnR3YXJlIGludGVycnVwdCBudW1iZXIuCiAgKi8KIAotaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoZW51bSBwczNfY3B1X2JpbmRpbmcgY3B1LAotCWNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsIHVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsCi0JdW5zaWduZWQgaW50ICp2aXJxKQoraW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCWVudW0gcHMzX2NwdV9iaW5kaW5nIGNwdSwgdW5zaWduZWQgaW50ICp2aXJxKQogewogCS8qIHRoaXMgc2hvdWxkIGdvIGluIHN5c3RlbS1idXMuYyAqLwogCkBAIC0zMzIsOCArNDAwLDggQEAKIAlpZiAocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwogCi0JcmVzdWx0ID0gbHYxX2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkaWQtPmJ1c19pZCwKLQkJZGlkLT5kZXZfaWQsIHZpcnFfdG9faHcoKnZpcnEpLCBpbnRlcnJ1cHRfaWQpOworCXJlc3VsdCA9IGx2MV9jb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQoZGV2LT5idXNfaWQsCisJCWRldi0+ZGV2X2lkLCB2aXJxX3RvX2h3KCp2aXJxKSwgZGV2LT5pbnRlcnJ1cHRfaWQpOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQiCkBAIC0zNDUsMjQgKzQxMywyNCBAQAogCX0KIAogCXByX2RlYnVnKCIlczolZDogaW50ZXJydXB0X2lkICV1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWludGVycnVwdF9pZCwgKnZpcnEpOworCQlkZXYtPmludGVycnVwdF9pZCwgKnZpcnEpOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXApOwogCi1pbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCi0JdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50IHZpcnEpCitpbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAkvKiB0aGlzIHNob3VsZCBnbyBpbiBzeXN0ZW0tYnVzLmMgKi8KIAogCWludCByZXN1bHQ7CiAKIAlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBpbnRlcnJ1cHRfaWQgJXUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJaW50ZXJydXB0X2lkLCB2aXJxKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaWQsIHZpcnEpOwogCi0JcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkaWQtPmJ1c19pZCwKLQkJZGlkLT5kZXZfaWQsIHZpcnFfdG9faHcodmlycSksIGludGVycnVwdF9pZCk7CisJcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkZXYtPmJ1c19pZCwKKwkJZGV2LT5kZXZfaWQsIHZpcnFfdG9faHcodmlycSksIGRldi0+aW50ZXJydXB0X2lkKTsKIAogCWlmIChyZXN1bHQpCiAJCXByX2RlYnVnKCIlczolZDogbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCIKQEAgLTM3Miw2ICs0NDAsMTQgQEAKIAlyZXN1bHQgPSBwczNfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3kodmlycSk7CiAJQlVHX09OKHJlc3VsdCk7CiAKKwkvKgorCSAqIHBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSgpIGRlc3Ryb3lzIHRoZSBJUlEgcGx1ZywKKwkgKiBzbyBkb24ndCBjYWxsIHBzM19pcnFfcGx1Z19kZXN0cm95KCkgaGVyZS4KKwkgKi8KKworCXJlc3VsdCA9IHBzM192aXJxX2Rlc3Ryb3kodmlycSk7CisJQlVHX09OKHJlc3VsdCk7CisKIAlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC00MTIsMTYgKzQ4OCwyNCBAQAogaW50IHBzM19pb19pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgb3V0bGV0ID0gdmlycV90b19odyh2aXJxKTsKIAotCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KHZpcnFfdG9faHcodmlycSkpOworCXBzM19jaGlwX21hc2sodmlycSk7CisKKwkvKgorCSAqIGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KCkgd2lsbCBkZXN0cm95IHRoZSBJUlEgcGx1ZywKKwkgKiBzbyBjYWxsIHBzM19pcnFfcGx1Z19kZXN0cm95KCkgZmlyc3QuCisJICovCisKKwlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KG91dGxldCk7CiAKIAlpZiAocmVzdWx0KQogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0IGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKLQlCVUdfT04ocmVzdWx0KTsKLQogCXJldHVybiByZXN1bHQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwczNfaW9faXJxX2Rlc3Ryb3kpOwpAQCAtNDYxLDExICs1NDUsMTMgQEAKIAogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfaXJxX3NldHVwKTsKIAogaW50IHBzM192dWFydF9pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAlpbnQgcmVzdWx0OwogCisJcHMzX2NoaXBfbWFzayh2aXJxKTsKIAlyZXN1bHQgPSBsdjFfZGVjb25maWd1cmVfdmlydHVhbF91YXJ0X2lycSgpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtNDc5LDYgKzU2NSw3IEBACiAKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X2lycV9kZXN0cm95KTsKIAogLyoqCiAgKiBwczNfc3BlX2lycV9zZXR1cCAtIFNldHVwIGFuIHNwZSB2aXJxLgpAQCAtNTE0LDkgKzYwMSwxNCBAQAogCiBpbnQgcHMzX3NwZV9pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKLQlpbnQgcmVzdWx0ID0gcHMzX2lycV9wbHVnX2Rlc3Ryb3kodmlycSk7CisJaW50IHJlc3VsdDsKKworCXBzM19jaGlwX21hc2sodmlycSk7CisKKwlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKIAlCVUdfT04ocmVzdWx0KTsKLQlyZXR1cm4gMDsKKworCXJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtNTMzLDcgKzYyNSw3IEBACiAJCSpwICYgMHhmZmZmKTsKIH0KIAotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wXzI1Nl9ibXAoY29uc3QgY2hhciAqaGVhZGVyLAorc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgX2R1bXBfMjU2X2JtcChjb25zdCBjaGFyICpoZWFkZXIsCiAJY29uc3QgdTY0ICpwLCB1bnNpZ25lZCBjcHUsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCXByX2RlYnVnKCIlczolZDogJXMgJXUgeyUwMTZseDolMDE2bHg6JTAxNmx4OiUwMTZseH1cbiIsCkBAIC01NDYsODYgKzYzOCwyNSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7Ci0JX2R1bXBfNjRfYm1wKCJzdGF0IiwgJnBkLT5ibXAuc3RhdHVzLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKLQlfZHVtcF82NF9ibXAoIm1hc2siLCAmcGQtPmJtcC5tYXNrLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKKwlfZHVtcF82NF9ibXAoInN0YXQiLCAmcGQtPmJtcC5zdGF0dXMsIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwogfQogCiAjZGVmaW5lIGR1bXBfbWFzayhfeCkgX2R1bXBfbWFzayhfeCwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX21hc2soc3RydWN0IHBzM19wcml2YXRlKiBwZCwKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX21hc2soc3RydWN0IHBzM19wcml2YXRlICpwZCwKIAljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwotCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT5jcHUsIGZ1bmMsIGxpbmUpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwogfQogI2Vsc2UKIHN0YXRpYyB2b2lkIGR1bXBfYm1wKHN0cnVjdCBwczNfcHJpdmF0ZSogcGQpIHt9OwogI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCiAKLXN0YXRpYyB2b2lkIHBzM19jaGlwX21hc2sodW5zaWduZWQgaW50IHZpcnEpCi17Ci0Jc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwotCXU2NCBiaXQgPSAweDgwMDAwMDAwMDAwMDAwMDBVTCA+PiB2aXJxOwotCXU2NCAqcCA9ICZwZC0+Ym1wLm1hc2s7Ci0JdTY0IG9sZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcHJfZGVidWcoIiVzOiVkOiBjcHUgJXUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcGQtPmNwdSwgdmlycSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JYXNtIHZvbGF0aWxlKAotCQkgICAgICIxOglsZGFyeCAlMCwwLCUzXG4iCi0JCSAgICAgImFuZGMJJTAsJTAsJTJcbiIKLQkJICAgICAic3RkY3guCSUwLDAsJTNcbiIKLQkJICAgICAiYm5lLQkxYiIKLQkJICAgICA6ICI9JnIiIChvbGQpLCAiK20iICgqcCkKLQkJICAgICA6ICJyIiAoYml0KSwgInIiIChwKQotCQkgICAgIDogImNjIiApOwotCi0JbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPm5vZGUsIHBkLT5jcHUpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcHMzX2NoaXBfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQotewotCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKLQl1NjQgYml0ID0gMHg4MDAwMDAwMDAwMDAwMDAwVUwgPj4gdmlycTsKLQl1NjQgKnAgPSAmcGQtPmJtcC5tYXNrOwotCXU2NCBvbGQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCIlczolZDogY3B1ICV1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBkLT5jcHUsIHZpcnEpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWFzbSB2b2xhdGlsZSgKLQkJICAgICAiMToJbGRhcnggJTAsMCwlM1xuIgotCQkgICAgICJvcgklMCwlMCwlMlxuIgotCQkgICAgICJzdGRjeC4JJTAsMCwlM1xuIgotCQkgICAgICJibmUtCTFiIgotCQkgICAgIDogIj0mciIgKG9sZCksICIrbSIgKCpwKQotCQkgICAgIDogInIiIChiaXQpLCAiciIgKHApCi0JCSAgICAgOiAiY2MiICk7Ci0KLQlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+bm9kZSwgcGQtPmNwdSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBwczNfY2hpcF9lb2kodW5zaWduZWQgaW50IHZpcnEpCi17Ci0JY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwotCWx2MV9lbmRfb2ZfaW50ZXJydXB0X2V4dChwZC0+bm9kZSwgcGQtPmNwdSwgdmlycSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXJxX2NoaXAgPSB7Ci0JLnR5cGVuYW1lID0gInBzMyIsCi0JLm1hc2sgPSBwczNfY2hpcF9tYXNrLAotCS51bm1hc2sgPSBwczNfY2hpcF91bm1hc2ssCi0JLmVvaSA9IHBzM19jaGlwX2VvaSwKLX07Ci0KIHN0YXRpYyB2b2lkIHBzM19ob3N0X3VubWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEpCiB7CiAJc2V0X2lycV9jaGlwX2RhdGEodmlycSwgTlVMTCk7CkBAIC02MzcsNyArNjY4LDcgQEAKIAlwcl9kZWJ1ZygiJXM6JWQ6IGh3aXJxICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBod2lycSwKIAkJdmlycSk7CiAKLQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmlycV9jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmcHMzX2lycV9jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTcsNyArNjg4LDcgQEAKIAkJY3B1LCB2aXJxLCBwZC0+Ym1wLmlwaV9kZWJ1Z19icmtfbWFzayk7CiB9CiAKLXVuc2lnbmVkIGludCBwczNfZ2V0X2lycSh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBwczNfZ2V0X2lycSh2b2lkKQogewogCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSAmX19nZXRfY3B1X3ZhcihwczNfcHJpdmF0ZSk7CiAJdTY0IHggPSAocGQtPmJtcC5zdGF0dXMgJiBwZC0+Ym1wLm1hc2spOwpAQCAtNjcyLDggKzcwMyw4IEBACiAJcGx1ZyAmPSAweDNmOwogCiAJaWYgKHVubGlrZWx5KHBsdWcpID09IE5PX0lSUSkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vIHBsdWcgZm91bmQ6IGNwdSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJcGQtPmNwdSk7CisJCXByX2RlYnVnKCIlczolZDogbm8gcGx1ZyBmb3VuZDogdGhyZWFkX2lkICVsdVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgcGQtPnRocmVhZF9pZCk7CiAJCWR1bXBfYm1wKCZwZXJfY3B1KHBzM19wcml2YXRlLCAwKSk7CiAJCWR1bXBfYm1wKCZwZXJfY3B1KHBzM19wcml2YXRlLCAxKSk7CiAJCXJldHVybiBOT19JUlE7CkBAIC03MDMsMTYgKzczNCwxNiBAQAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJc3RydWN0IHBzM19wcml2YXRlICpwZCA9ICZwZXJfY3B1KHBzM19wcml2YXRlLCBjcHUpOwogCi0JCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBkLT5ub2RlKTsKLQkJcGQtPmNwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKwkJbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcGQtPnBwZV9pZCk7CisJCXBkLT50aHJlYWRfaWQgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CiAJCXNwaW5fbG9ja19pbml0KCZwZC0+Ym1wLmxvY2spOwogCi0JCXByX2RlYnVnKCIlczolZDogbm9kZSAlbHUsIGNwdSAlZCwgYm1wICVseGhcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIHBkLT5ub2RlLCBwZC0+Y3B1LAorCQlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbHUsIHRocmVhZF9pZCAlbHUsIGJtcCAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLAogCQkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKCZwZC0+Ym1wKSkpOwogCi0JCXJlc3VsdCA9IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwZC0+bm9kZSwgcGQtPmNwdSwKLQkJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYSgmcGQtPmJtcCkpKTsKKwkJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBkLT5wcGVfaWQsCisJCQlwZC0+dGhyZWFkX2lkLCBwczNfbW1fcGh5c190b19scGFyKF9fcGEoJnBkLT5ibXApKSk7CiAKIAkJaWYgKHJlc3VsdCkKIAkJCXByX2RlYnVnKCIlczolZDogbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwIGZhaWxlZDoiCkBAIC03MjIsMyArNzUzLDE2IEBACiAKIAlwcGNfbWQuZ2V0X2lycSA9IHBzM19nZXRfaXJxOwogfQorCit2b2lkIHBzM19zaHV0ZG93bl9JUlEoaW50IGNwdSkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCBwcGVfaWQ7CisJdTY0IHRocmVhZF9pZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKworCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBwZV9pZCk7CisJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBwZV9pZCwgdGhyZWFkX2lkLCAwKTsKKworCURCRygiJXM6JWQ6IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCAoJWx1OiVsdS8lZCkgJXNcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgcHBlX2lkLCB0aHJlYWRfaWQsIGNwdSwgcHMzX3Jlc3VsdChyZXN1bHQpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCmluZGV4IGY4YTNlMjAuLjdiYjNlMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwpAQCAtMzAsOSArMzAsOSBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogZW51bSB7CkBAIC0xMTUsNyArMTE1LDggQEAKIH07CiAKICNkZWZpbmUgZGVidWdfZHVtcF9tYXAoeCkgX2RlYnVnX2R1bXBfbWFwKHgsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9kZWJ1Z19kdW1wX21hcChjb25zdCBzdHJ1Y3QgbWFwKiBtLCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kZWJ1Z19kdW1wX21hcChjb25zdCBzdHJ1Y3QgbWFwICptLAorCWNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQogewogCURCRygiJXM6JWQ6IG1hcC50b3RhbCAgICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT50b3RhbCk7CiAJREJHKCIlczolZDogbWFwLnJtLnNpemUgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnJtLnNpemUpOwpAQCAtMjEyLDkgKzIxMywxNSBAQAogCiB2b2lkIHBzM19tbV92YXNfZGVzdHJveSh2b2lkKQogeworCWludCByZXN1bHQ7CisKKwlEQkcoIiVzOiVkOiBtYXAudmFzX2lkICAgID0gJWx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG1hcC52YXNfaWQpOworCiAJaWYgKG1hcC52YXNfaWQpIHsKLQkJbHYxX3NlbGVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UoMCk7Ci0JCWx2MV9kZXN0cnVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UobWFwLnZhc19pZCk7CisJCXJlc3VsdCA9IGx2MV9zZWxlY3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlKDApOworCQlCVUdfT04ocmVzdWx0KTsKKwkJcmVzdWx0ID0gbHYxX2Rlc3RydWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZShtYXAudmFzX2lkKTsKKwkJQlVHX09OKHJlc3VsdCk7CiAJCW1hcC52YXNfaWQgPSAwOwogCX0KIH0KQEAgLTIzMiw3ICsyMzksNyBAQAogICogQHNpemUgaXMgcm91bmRlZCBkb3duIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHZhcyBsYXJnZSBwYWdlIHNpemUuCiAgKi8KIAotaW50IHBzM19tbV9yZWdpb25fY3JlYXRlKHN0cnVjdCBtZW1fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IHBzM19tbV9yZWdpb25fY3JlYXRlKHN0cnVjdCBtZW1fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIG11aWQ7CkBAIC0yNzMsMTAgKzI4MCwxNCBAQAogICogQHI6IHBvaW50ZXIgdG8gc3RydWN0IG1lbV9yZWdpb24KICAqLwogCi12b2lkIHBzM19tbV9yZWdpb25fZGVzdHJveShzdHJ1Y3QgbWVtX3JlZ2lvbiAqcikKK3N0YXRpYyB2b2lkIHBzM19tbV9yZWdpb25fZGVzdHJveShzdHJ1Y3QgbWVtX3JlZ2lvbiAqcikKIHsKKwlpbnQgcmVzdWx0OworCisJREJHKCIlczolZDogci0+YmFzZSA9ICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgci0+YmFzZSk7CiAJaWYgKHItPmJhc2UpIHsKLQkJbHYxX3JlbGVhc2VfbWVtb3J5KHItPmJhc2UpOworCQlyZXN1bHQgPSBsdjFfcmVsZWFzZV9tZW1vcnkoci0+YmFzZSk7CisJCUJVR19PTihyZXN1bHQpOwogCQlyLT5zaXplID0gci0+YmFzZSA9IHItPm9mZnNldCA9IDA7CiAJCW1hcC50b3RhbCA9IG1hcC5ybS5zaXplOwogCX0KQEAgLTMyOSwzMSArMzQwLDM0IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioKLSAqIGRtYV9scGFyX3RvX2J1cyAtIFRyYW5zbGF0ZSBhbiBscGFyIGFkZHJlc3MgdG8gaW9jIG1hcHBlZCBidXMgYWRkcmVzcy4KKyAqIGRtYV9zYl9scGFyX3RvX2J1cyAtIFRyYW5zbGF0ZSBhbiBscGFyIGFkZHJlc3MgdG8gaW9jIG1hcHBlZCBidXMgYWRkcmVzcy4KICAqIEByOiBwb2ludGVyIHRvIGRtYSByZWdpb24gc3RydWN0dXJlCiAgKiBAbHBhcl9hZGRyOiBIViBscGFyIGFkZHJlc3MKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfbHBhcl90b19idXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX3NiX2xwYXJfdG9fYnVzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKIAl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcikKIHsKLQlCVUdfT04obHBhcl9hZGRyID49IG1hcC5yMS5iYXNlICsgbWFwLnIxLnNpemUpOwotCXJldHVybiByLT5idXNfYWRkciArIChscGFyX2FkZHIgPD0gbWFwLnJtLnNpemUgPyBscGFyX2FkZHIKLQkJOiBscGFyX2FkZHIgLSBtYXAucjEub2Zmc2V0KTsKKwlpZiAobHBhcl9hZGRyID49IG1hcC5ybS5zaXplKQorCQlscGFyX2FkZHIgLT0gbWFwLnIxLm9mZnNldDsKKwlCVUdfT04obHBhcl9hZGRyIDwgci0+b2Zmc2V0KTsKKwlCVUdfT04obHBhcl9hZGRyID49IHItPm9mZnNldCArIHItPmxlbik7CisJcmV0dXJuIHItPmJ1c19hZGRyICsgbHBhcl9hZGRyIC0gci0+b2Zmc2V0OwogfQogCiAjZGVmaW5lIGRtYV9kdW1wX3JlZ2lvbihfYSkgX2RtYV9kdW1wX3JlZ2lvbihfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX2RtYV9kdW1wX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIGNvbnN0IGNoYXIqIGZ1bmMsCi0JaW50IGxpbmUpCitzdGF0aWMgdm9pZCAgX19tYXliZV91bnVzZWQgX2RtYV9kdW1wX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCiB7Ci0JREJHKCIlczolZDogZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGlkLmJ1c19pZCwKLQkJci0+ZGlkLmRldl9pZCk7CisJREJHKCIlczolZDogZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGV2LT5idXNfaWQsCisJCXItPmRldi0+ZGV2X2lkKTsKIAlEQkcoIiVzOiVkOiBwYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCByLT5wYWdlX3NpemUpOwogCURCRygiJXM6JWQ6IGJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+YnVzX2FkZHIpOwogCURCRygiJXM6JWQ6IGxlbiAgICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bGVuKTsKKwlEQkcoIiVzOiVkOiBvZmZzZXQgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPm9mZnNldCk7CiB9CiAKLS8qKgorICAvKioKICAqIGRtYV9jaHVuayAtIEEgY2h1bmsgb2YgZG1hIHBhZ2VzIG1hcHBlZCBieSB0aGUgaW8gY29udHJvbGxlci4KICAqIEByZWdpb24gLSBUaGUgZG1hIHJlZ2lvbiB0aGF0IG93bnMgdGhpcyBjaHVuay4KICAqIEBscGFyX2FkZHI6IFN0YXJ0aW5nIGxwYXIgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCkBAIC0zODEsMTAgKzM5NSwxMSBAQAogCWludCBsaW5lKQogewogCURCRygiJXM6JWQ6IHIuZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwKLQkJYy0+cmVnaW9uLT5kaWQuYnVzX2lkLCBjLT5yZWdpb24tPmRpZC5kZXZfaWQpOworCQljLT5yZWdpb24tPmRldi0+YnVzX2lkLCBjLT5yZWdpb24tPmRldi0+ZGV2X2lkKTsKIAlEQkcoIiVzOiVkOiByLmJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5idXNfYWRkcik7CiAJREJHKCIlczolZDogci5wYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCBjLT5yZWdpb24tPnBhZ2Vfc2l6ZSk7CiAJREJHKCIlczolZDogci5sZW4gICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+bGVuKTsKKwlEQkcoIiVzOiVkOiByLm9mZnNldCAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5vZmZzZXQpOwogCURCRygiJXM6JWQ6IGMubHBhcl9hZGRyICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5scGFyX2FkZHIpOwogCURCRygiJXM6JWQ6IGMuYnVzX2FkZHIgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5idXNfYWRkcik7CiAJREJHKCIlczolZDogYy5sZW4gICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPmxlbik7CkBAIC0zOTUsMzkgKzQxMCw2OCBAQAogewogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CiAJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2J1cyA9IF9BTElHTl9ET1dOKGJ1c19hZGRyLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7Ci0JdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4sIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbitidXNfYWRkci1hbGlnbmVkX2J1cywKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CiAJCS8qIGludGVyc2VjdGlvbiAqLwotCQlpZiAoYWxpZ25lZF9idXMgPj0gYy0+YnVzX2FkZHIKLQkJCSYmIGFsaWduZWRfYnVzIDwgYy0+YnVzX2FkZHIgKyBjLT5sZW4KLQkJCSYmIGFsaWduZWRfYnVzICsgYWxpZ25lZF9sZW4gPD0gYy0+YnVzX2FkZHIgKyBjLT5sZW4pIHsKKwkJaWYgKGFsaWduZWRfYnVzID49IGMtPmJ1c19hZGRyICYmCisJCSAgICBhbGlnbmVkX2J1cyArIGFsaWduZWRfbGVuIDw9IGMtPmJ1c19hZGRyICsgYy0+bGVuKQogCQkJcmV0dXJuIGM7Ci0JCX0KKwogCQkvKiBiZWxvdyAqLwotCQlpZiAoYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkcikgeworCQlpZiAoYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkcikKIAkJCWNvbnRpbnVlOwotCQl9CisKIAkJLyogYWJvdmUgKi8KLQkJaWYgKGFsaWduZWRfYnVzID49IGMtPmJ1c19hZGRyICsgYy0+bGVuKSB7CisJCWlmIChhbGlnbmVkX2J1cyA+PSBjLT5idXNfYWRkciArIGMtPmxlbikKIAkJCWNvbnRpbnVlOwotCQl9CiAKIAkJLyogd2UgZG9uJ3QgaGFuZGxlIHRoZSBtdWx0aS1jaHVuayBjYXNlIGZvciBub3cgKi8KLQogCQlkbWFfZHVtcF9jaHVuayhjKTsKIAkJQlVHKCk7CiAJfQogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGRtYV9mcmVlX2NodW5rKHN0cnVjdCBkbWFfY2h1bmsgKmMpCitzdGF0aWMgc3RydWN0IGRtYV9jaHVuayAqZG1hX2ZpbmRfY2h1bmtfbHBhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyBscGFyX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xwYXIgPSBfQUxJR05fRE9XTihscGFyX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIGxwYXJfYWRkciAtIGFsaWduZWRfbHBhciwKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CisJCS8qIGludGVyc2VjdGlvbiAqLworCQlpZiAoYy0+bHBhcl9hZGRyIDw9IGFsaWduZWRfbHBhciAmJgorCQkgICAgYWxpZ25lZF9scGFyIDwgYy0+bHBhcl9hZGRyICsgYy0+bGVuKSB7CisJCQlpZiAoYWxpZ25lZF9scGFyICsgYWxpZ25lZF9sZW4gPD0gYy0+bHBhcl9hZGRyICsgYy0+bGVuKQorCQkJCXJldHVybiBjOworCQkJZWxzZSB7CisJCQkJZG1hX2R1bXBfY2h1bmsoYyk7CisJCQkJQlVHKCk7CisJCQl9CisJCX0KKwkJLyogYmVsb3cgKi8KKwkJaWYgKGFsaWduZWRfbHBhciArIGFsaWduZWRfbGVuIDw9IGMtPmxwYXJfYWRkcikgeworCQkJY29udGludWU7CisJCX0KKwkJLyogYWJvdmUgKi8KKwkJaWYgKGMtPmxwYXJfYWRkciArIGMtPmxlbiA8PSBhbGlnbmVkX2xwYXIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGRtYV9zYl9mcmVlX2NodW5rKHN0cnVjdCBkbWFfY2h1bmsgKmMpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlpZiAoYy0+YnVzX2FkZHIpIHsKLQkJcmVzdWx0ID0gbHYxX3VubWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwKLQkJCWMtPnJlZ2lvbi0+ZGlkLmRldl9pZCwgYy0+YnVzX2FkZHIsIGMtPmxlbik7CisJCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfZG1hX3JlZ2lvbihjLT5yZWdpb24tPmRldi0+YnVzX2lkLAorCQkJYy0+cmVnaW9uLT5kZXYtPmRldl9pZCwgYy0+YnVzX2FkZHIsIGMtPmxlbik7CiAJCUJVR19PTihyZXN1bHQpOwogCX0KIApAQCAtNDM1LDggKzQ3OSwzOSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfZnJlZV9jaHVuayhzdHJ1Y3QgZG1hX2NodW5rICpjKQoreworCWludCByZXN1bHQgPSAwOworCWludCBpb3BhZ2U7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IHBzM19kbWFfcmVnaW9uICpyID0gYy0+cmVnaW9uOworCisJREJHKCIlczpzdGFydFxuIiwgX19mdW5jX18pOworCWZvciAoaW9wYWdlID0gMDsgaW9wYWdlIDwgKGMtPmxlbiA+PiByLT5wYWdlX3NpemUpOyBpb3BhZ2UrKykgeworCQlvZmZzZXQgPSAoMSA8PCByLT5wYWdlX3NpemUpICogaW9wYWdlOworCQkvKiBwdXQgSU5WQUxJRCBlbnRyeSAqLworCQlyZXN1bHQgPSBsdjFfcHV0X2lvcHRlKDAsCisJCQkJICAgICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkJCSAgICAgICBjLT5scGFyX2FkZHIgKyBvZmZzZXQsCisJCQkJICAgICAgIHItPmlvaWQsCisJCQkJICAgICAgIDApOworCQlEQkcoIiVzOiBidXM9JSNseCwgbHBhcj0lI2x4LCBpb2lkPSVkXG4iLCBfX2Z1bmNfXywKKwkJICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkgICAgci0+aW9pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJREJHKCIlczolZDogbHYxX3B1dF9pb3B0ZSBmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJfQorCX0KKwlrZnJlZShjKTsKKwlEQkcoIiVzOmVuZFxuIiwgX19mdW5jX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgotICogZG1hX21hcF9wYWdlcyAtIE1hcHMgZG1hIHBhZ2VzIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYnVzIGFkZHJlc3Mgc3BhY2UuCisgKiBkbWFfc2JfbWFwX3BhZ2VzIC0gTWFwcyBkbWEgcGFnZXMgaW50byB0aGUgaW8gY29udHJvbGxlciBidXMgYWRkcmVzcyBzcGFjZS4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICogQHBoeXNfYWRkcjogU3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgpAQCAtNDQ2LDggKzUyMSw4IEBACiAgKiBtYWtlIHRoZSBIViBjYWxsIHRvIGFkZCB0aGUgcGFnZXMgaW50byB0aGUgaW8gY29udHJvbGxlciBhZGRyZXNzIHNwYWNlLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9wYWdlcyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgZG1hX2NodW5rICoqY19vdXQpCitzdGF0aWMgaW50IGRtYV9zYl9tYXBfcGFnZXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBkbWFfY2h1bmsgKipjX291dCwgdTY0IGlvcHRlX2ZsYWcpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgZG1hX2NodW5rICpjOwpAQCAtNDYxLDEzICs1MzYsMTMgQEAKIAogCWMtPnJlZ2lvbiA9IHI7CiAJYy0+bHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOwotCWMtPmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIGMtPmxwYXJfYWRkcik7CisJYy0+YnVzX2FkZHIgPSBkbWFfc2JfbHBhcl90b19idXMociwgYy0+bHBhcl9hZGRyKTsKIAljLT5sZW4gPSBsZW47CiAKLQlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwKLQkJYy0+cmVnaW9uLT5kaWQuZGV2X2lkLCBjLT5scGFyX2FkZHIsIGMtPmJ1c19hZGRyLCBjLT5sZW4sCi0JCTB4ZjgwMDAwMDAwMDAwMDAwMFVMKTsKLQorCUJVR19PTihpb3B0ZV9mbGFnICE9IDB4ZjgwMDAwMDAwMDAwMDAwMFVMKTsKKwlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGV2LT5idXNfaWQsCisJCQkJCSAgIGMtPnJlZ2lvbi0+ZGV2LT5kZXZfaWQsIGMtPmxwYXJfYWRkciwKKwkJCQkJICAgYy0+YnVzX2FkZHIsIGMtPmxlbiwgaW9wdGVfZmxhZyk7CiAJaWYgKHJlc3VsdCkgewogCQlEQkcoIiVzOiVkOiBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CkBAIC00ODcsMjYgKzU2MiwxMjAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IGRtYV9pb2MwX21hcF9wYWdlcyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBkbWFfY2h1bmsgKipjX291dCwKKwkJCSAgICAgIHU2NCBpb3B0ZV9mbGFnKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRtYV9jaHVuayAqYywgKmxhc3Q7CisJaW50IGlvcGFnZSwgcGFnZXM7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlEQkcoS0VSTl9FUlIgIiVzOiBwaHk9JSNseCwgbHBhciUjbHgsIGxlbj0lI2x4XG4iLCBfX2Z1bmNfXywKKwkgICAgcGh5c19hZGRyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkciksIGxlbik7CisJYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfY2h1bmspLCBHRlBfQVRPTUlDKTsKKworCWlmICghYykgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYWxsb2M7CisJfQorCisJYy0+cmVnaW9uID0gcjsKKwljLT5sZW4gPSBsZW47CisJYy0+bHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOworCS8qIGFsbG9jYXRlIElPIGFkZHJlc3MgKi8KKwlpZiAobGlzdF9lbXB0eSgmci0+Y2h1bmtfbGlzdC5oZWFkKSkgeworCQkvKiBmaXJzdCBvbmUgKi8KKwkJYy0+YnVzX2FkZHIgPSByLT5idXNfYWRkcjsKKwl9IGVsc2UgeworCQkvKiBkZXJpdmUgZnJvbSBsYXN0IGJ1cyBhZGRyKi8KKwkJbGFzdCAgPSBsaXN0X2VudHJ5KHItPmNodW5rX2xpc3QuaGVhZC5uZXh0LAorCQkJCSAgIHN0cnVjdCBkbWFfY2h1bmssIGxpbmspOworCQljLT5idXNfYWRkciA9IGxhc3QtPmJ1c19hZGRyICsgbGFzdC0+bGVuOworCQlEQkcoIiVzOiBsYXN0IGJ1cz0lI2x4LCBsZW49JSNseFxuIiwgX19mdW5jX18sCisJCSAgICBsYXN0LT5idXNfYWRkciwgbGFzdC0+bGVuKTsKKwl9CisKKwkvKiBGSVhNRTogY2hlY2sgd2hldGhlciBsZW5ndGggZXhjZWVkcyByZWdpb24gc2l6ZSAqLworCisJLyogYnVpbGQgaW9wdGVzIGZvciB0aGUgYXJlYSAqLworCXBhZ2VzID0gbGVuID4+IHItPnBhZ2Vfc2l6ZTsKKwlEQkcoIiVzOiBwZ3NpemU9JSN4IGxlbj0lI2x4IHBhZ2VzPSUjeCBpb3B0ZWZsYWc9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHItPnBhZ2Vfc2l6ZSwgci0+bGVuLCBwYWdlcywgaW9wdGVfZmxhZyk7CisJZm9yIChpb3BhZ2UgPSAwOyBpb3BhZ2UgPCBwYWdlczsgaW9wYWdlKyspIHsKKwkJb2Zmc2V0ID0gKDEgPDwgci0+cGFnZV9zaXplKSAqIGlvcGFnZTsKKwkJcmVzdWx0ID0gbHYxX3B1dF9pb3B0ZSgwLAorCQkJCSAgICAgICBjLT5idXNfYWRkciArIG9mZnNldCwKKwkJCQkgICAgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkJCSAgICAgICByLT5pb2lkLAorCQkJCSAgICAgICBpb3B0ZV9mbGFnKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24gIgorCQkJCSJmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCWdvdG8gZmFpbF9tYXA7CisJCX0KKwkJREJHKCIlczogcGc9JWQgYnVzPSUjbHgsIGxwYXI9JSNseCwgaW9pZD0lI3hcbiIsIF9fZnVuY19fLAorCQkgICAgaW9wYWdlLCBjLT5idXNfYWRkciArIG9mZnNldCwgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkgICAgci0+aW9pZCk7CisJfQorCisJLyogYmUgc3VyZSB0aGF0IGxhc3QgYWxsb2NhdGVkIG9uZSBpcyBpbnNlcnRlZCBhdCBoZWFkICovCisJbGlzdF9hZGQoJmMtPmxpbmssICZyLT5jaHVua19saXN0LmhlYWQpOworCisJKmNfb3V0ID0gYzsKKwlEQkcoIiVzOiBlbmRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKKworZmFpbF9tYXA6CisJZm9yIChpb3BhZ2UtLTsgMCA8PSBpb3BhZ2U7IGlvcGFnZS0tKSB7CisJCWx2MV9wdXRfaW9wdGUoMCwKKwkJCSAgICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkJICAgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkJICAgICAgci0+aW9pZCwKKwkJCSAgICAgIDApOworCX0KKwlrZnJlZShjKTsKK2ZhaWxfYWxsb2M6CisJKmNfb3V0ID0gTlVMTDsKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKioKLSAqIGRtYV9yZWdpb25fY3JlYXRlIC0gQ3JlYXRlIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBkbWFfc2JfcmVnaW9uX2NyZWF0ZSAtIENyZWF0ZSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKgogICogVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIGRtYSByZWdpb24gY3JlYXRlIHJvdXRpbmUsIGFuZCBpcyB0aGUgb25lIHRoYXQKICAqIHdpbGwgbWFrZSB0aGUgSFYgY2FsbCB0byBjcmVhdGUgdGhlIHJlZ2lvbi4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiogcikKK3N0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CiAKLQlyLT5sZW4gPSBfQUxJR05fVVAobWFwLnRvdGFsLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJcHJfaW5mbygiIC0+ICVzOiVkOlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCUJVR19PTighcik7CisKKwlpZiAoIXItPmRldi0+YnVzX2lkKSB7CisJCXByX2luZm8oIiVzOiVkOiAldToldSBubyBkbWFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCk7CisJCXJldHVybiAwOworCX0KKworCURCRygiJXM6JXU6IGxlbiA9IDB4JWx4LCBwYWdlX3NpemUgPSAldSwgb2Zmc2V0ID0gMHglbHhcbiIsIF9fZnVuY19fLAorCSAgICBfX0xJTkVfXywgci0+bGVuLCByLT5wYWdlX3NpemUsIHItPm9mZnNldCk7CisKKwlCVUdfT04oIXItPmxlbik7CisJQlVHX09OKCFyLT5wYWdlX3NpemUpOworCUJVR19PTighci0+cmVnaW9uX29wcyk7CisKIAlJTklUX0xJU1RfSEVBRCgmci0+Y2h1bmtfbGlzdC5oZWFkKTsKIAlzcGluX2xvY2tfaW5pdCgmci0+Y2h1bmtfbGlzdC5sb2NrKTsKIAotCXJlc3VsdCA9IGx2MV9hbGxvY2F0ZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAotCQlyLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgci0+cmVnaW9uX3R5cGUsICZyLT5idXNfYWRkcik7Ci0KLQlkbWFfZHVtcF9yZWdpb24ocik7CisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uKHItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCwKKwkJcm91bmR1cF9wb3dfb2ZfdHdvKHItPmxlbiksIHItPnBhZ2Vfc2l6ZSwgci0+cmVnaW9uX3R5cGUsCisJCSZyLT5idXNfYWRkcik7CiAKIAlpZiAocmVzdWx0KSB7CiAJCURCRygiJXM6JWQ6IGx2MV9hbGxvY2F0ZV9kZXZpY2VfZG1hX3JlZ2lvbiBmYWlsZWQ6ICVzXG4iLApAQCAtNTE3LDYgKzY4NiwyNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKworCUlOSVRfTElTVF9IRUFEKCZyLT5jaHVua19saXN0LmhlYWQpOworCXNwaW5fbG9ja19pbml0KCZyLT5jaHVua19saXN0LmxvY2spOworCisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2lvX3NlZ21lbnQoMCwKKwkJCQkJIHItPmxlbiwKKwkJCQkJIHItPnBhZ2Vfc2l6ZSwKKwkJCQkJICZyLT5idXNfYWRkcik7CisJaWYgKHJlc3VsdCkgeworCQlEQkcoIiVzOiVkOiBsdjFfYWxsb2NhdGVfaW9fc2VnbWVudCBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyLT5sZW4gPSByLT5idXNfYWRkciA9IDA7CisJfQorCURCRygiJXM6IGxlbj0lI2x4LCBwZz0lZCwgYnVzPSUjbHhcbiIsIF9fZnVuY19fLAorCSAgICByLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgci0+YnVzX2FkZHIpOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgogICogZG1hX3JlZ2lvbl9mcmVlIC0gRnJlZSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCkBAIC01MjUsMzEgKzcxNSw2MiBAQAogICogd2lsbCBtYWtlIHRoZSBIViBjYWxsIHRvIGZyZWUgdGhlIHJlZ2lvbi4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24qIHIpCitzdGF0aWMgaW50IGRtYV9zYl9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgZG1hX2NodW5rICpjOwogCXN0cnVjdCBkbWFfY2h1bmsgKnRtcDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKLQkJbGlzdF9kZWwoJmMtPmxpbmspOwotCQlkbWFfZnJlZV9jaHVuayhjKTsKKwlCVUdfT04oIXIpOworCisJaWYgKCFyLT5kZXYtPmJ1c19pZCkgeworCQlwcl9pbmZvKCIlczolZDogJXU6JXUgbm8gZG1hXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQpOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXN1bHQgPSBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfc2JfZnJlZV9jaHVuayhjKTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQsCiAJCXItPmJ1c19hZGRyKTsKIAogCWlmIChyZXN1bHQpCiAJCURCRygiJXM6JWQ6IGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQlyLT5sZW4gPSByLT5idXNfYWRkciA9IDA7CisJci0+YnVzX2FkZHIgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkbWFfaW9jMF9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjLCAqbjsKKworCURCRygiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIG4sICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfaW9jMF9mcmVlX2NodW5rKGMpOworCX0KKworCXJlc3VsdCA9IGx2MV9yZWxlYXNlX2lvX3NlZ21lbnQoMCwgci0+YnVzX2FkZHIpOworCisJaWYgKHJlc3VsdCkKKwkJREJHKCIlczolZDogbHYxX2ZyZWVfZGV2aWNlX2RtYV9yZWdpb24gZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKworCXItPmJ1c19hZGRyID0gMDsKKwlEQkcoIiVzOiBlbmRcbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgotICogZG1hX21hcF9hcmVhIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl9tYXBfYXJlYSAtIE1hcCBhbiBhcmVhIG9mIG1lbW9yeSBpbnRvIGEgZGV2aWNlIGRtYSByZWdpb24uCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqIEB2aXJ0X2FkZHI6IFN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgpAQCAtNTU5LDE2ICs3ODAsMTkgQEAKICAqIFRoaXMgaXMgdGhlIGNvbW1vbiBkbWEgbWFwcGluZyByb3V0aW5lLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKQorc3RhdGljIGludCBkbWFfc2JfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwkgICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJICAgdTY0IGlvcHRlX2ZsYWcpCiB7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CiAJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBpc19rZXJuZWxfYWRkcih2aXJ0X2FkZHIpID8gX19wYSh2aXJ0X2FkZHIpCiAJCTogdmlydF9hZGRyOwotCi0JKmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX3BoeXMgPSBfQUxJR05fRE9XTihwaHlzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIHBoeXNfYWRkciAtIGFsaWduZWRfcGh5cywKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCSpidXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcikpOwogCiAJaWYgKCFVU0VfRFlOQU1JQ19ETUEpIHsKIAkJdW5zaWduZWQgbG9uZyBscGFyX2FkZHIgPSBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcik7CkBAIC01ODgsMTcgKzgxMiwxOCBAQAogCWMgPSBkbWFfZmluZF9jaHVuayhyLCAqYnVzX2FkZHIsIGxlbik7CiAKIAlpZiAoYykgeworCQlEQkcoIiVzOiVkOiByZXVzaW5nIG1hcHBlZCBjaHVuayIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWRtYV9kdW1wX2NodW5rKGMpOwogCQljLT51c2FnZV9jb3VudCsrOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmVzdWx0ID0gZG1hX21hcF9wYWdlcyhyLCBfQUxJR05fRE9XTihwaHlzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKSwKLQkJX0FMSUdOX1VQKGxlbiwgMSA8PCByLT5wYWdlX3NpemUpLCAmYyk7CisJcmVzdWx0ID0gZG1hX3NiX21hcF9wYWdlcyhyLCBhbGlnbmVkX3BoeXMsIGFsaWduZWRfbGVuLCAmYywgaW9wdGVfZmxhZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCSpidXNfYWRkciA9IDA7Ci0JCURCRygiJXM6JWQ6IGRtYV9tYXBfcGFnZXMgZmFpbGVkICglZClcbiIsCisJCURCRygiJXM6JWQ6IGRtYV9zYl9tYXBfcGFnZXMgZmFpbGVkICglZClcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtNjEwLDggKzgzNSw1NyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwkgICAgIHU2NCBpb3B0ZV9mbGFnKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjOworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gaXNfa2VybmVsX2FkZHIodmlydF9hZGRyKSA/IF9fcGEodmlydF9hZGRyKQorCQk6IHZpcnRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfcGh5cyA9IF9BTElHTl9ET1dOKHBoeXNfYWRkciwgMSA8PCByLT5wYWdlX3NpemUpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgcGh5c19hZGRyIC0gYWxpZ25lZF9waHlzLAorCQkJCQkgICAgICAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisKKwlEQkcoS0VSTl9FUlIgIiVzOiB2YWRkcj0lI2x4LCBsZW49JSNseFxuIiwgX19mdW5jX18sCisJICAgIHZpcnRfYWRkciwgbGVuKTsKKwlEQkcoS0VSTl9FUlIgIiVzOiBwaD0lI2x4IGFfcGg9JSNseCBhX2w9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHBoeXNfYWRkciwgYWxpZ25lZF9waHlzLCBhbGlnbmVkX2xlbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJYyA9IGRtYV9maW5kX2NodW5rX2xwYXIociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpLCBsZW4pOworCisJaWYgKGMpIHsKKwkJLyogRklYTUUgKi8KKwkJQlVHKCk7CisJCSpidXNfYWRkciA9IGMtPmJ1c19hZGRyICsgcGh5c19hZGRyIC0gYWxpZ25lZF9waHlzOworCQljLT51c2FnZV9jb3VudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzdWx0ID0gZG1hX2lvYzBfbWFwX3BhZ2VzKHIsIGFsaWduZWRfcGh5cywgYWxpZ25lZF9sZW4sICZjLAorCQkJCSAgICBpb3B0ZV9mbGFnKTsKKworCWlmIChyZXN1bHQpIHsKKwkJKmJ1c19hZGRyID0gMDsKKwkJREJHKCIlczolZDogZG1hX2lvYzBfbWFwX3BhZ2VzIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJKmJ1c19hZGRyID0gYy0+YnVzX2FkZHIgKyBwaHlzX2FkZHIgLSBhbGlnbmVkX3BoeXM7CisJREJHKCIlczogdmE9JSNseCBwYT0lI2x4IGFfcGE9JSNseCBidXM9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHZpcnRfYWRkciwgcGh5c19hZGRyLCBhbGlnbmVkX3BoeXMsICpidXNfYWRkcik7CisJYy0+dXNhZ2VfY291bnQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCi0gKiBkbWFfdW5tYXBfYXJlYSAtIFVubWFwIGFuIGFyZWEgb2YgbWVtb3J5IGZyb20gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl91bm1hcF9hcmVhIC0gVW5tYXAgYW4gYXJlYSBvZiBtZW1vcnkgZnJvbSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKiBAYnVzX2FkZHI6IFRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCkBAIC02MTksNyArODkzLDcgQEAKICAqIFRoaXMgaXMgdGhlIGNvbW1vbiBkbWEgdW5tYXAgcm91dGluZS4KICAqLwogCi1pbnQgZG1hX3VubWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAorc3RhdGljIGludCBkbWFfc2JfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTYzMSw3ICs5MDUsOCBAQAogCWlmICghYykgewogCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsCiAJCQkxIDw8IHItPnBhZ2Vfc2l6ZSk7Ci0JCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgYnVzX2FkZHIKKwkJCS0gYWxpZ25lZF9idXMsIDEgPDwgci0+cGFnZV9zaXplKTsKIAkJREJHKCIlczolZDogbm90IGZvdW5kOiBidXNfYWRkciAlbHhoXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfYWRkcik7CiAJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogbGVuICVseGhcbiIsCkBAIC02NDcsOTQgKzkyMiwxNjYgQEAKIAogCWlmICghYy0+dXNhZ2VfY291bnQpIHsKIAkJbGlzdF9kZWwoJmMtPmxpbmspOwotCQlkbWFfZnJlZV9jaHVuayhjKTsKKwkJZG1hX3NiX2ZyZWVfY2h1bmsoYyk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJCQl1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisKKwlEQkcoIiVzOiBzdGFydCBhPSUjbHggbD0lI2x4XG4iLCBfX2Z1bmNfXywgYnVzX2FkZHIsIGxlbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCWMgPSBkbWFfZmluZF9jaHVuayhyLCBidXNfYWRkciwgbGVuKTsKKworCWlmICghYykgeworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsCisJCQkJCQkJMSA8PCByLT5wYWdlX3NpemUpOworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIGJ1c19hZGRyCisJCQkJCQkgICAgICAtIGFsaWduZWRfYnVzLAorCQkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGJ1c19hZGRyICVseGhcbiIsCisJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19hZGRyKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBsZW4gJWx4aFxuIiwKKwkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywgbGVuKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBhbGlnbmVkX2J1cyAlbHhoXG4iLAorCQkgICAgX19mdW5jX18sIF9fTElORV9fLCBhbGlnbmVkX2J1cyk7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogYWxpZ25lZF9sZW4gJWx4aFxuIiwKKwkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywgYWxpZ25lZF9sZW4pOworCQlCVUcoKTsKKwl9CisKKwljLT51c2FnZV9jb3VudC0tOworCisJaWYgKCFjLT51c2FnZV9jb3VudCkgeworCQlsaXN0X2RlbCgmYy0+bGluayk7CisJCWRtYV9pb2MwX2ZyZWVfY2h1bmsoYyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJREJHKCIlczogZW5kXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKIC8qKgotICogZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyIC0gU2V0dXAgYSBsaW5lYXIgZG1hIG1hcGluZyBmb3IgYSBkZXZpY2UuCisgKiBkbWFfc2JfcmVnaW9uX2NyZWF0ZV9saW5lYXIgLSBTZXR1cCBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqCiAgKiBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhbiBIViBkbWEgcmVnaW9uIGZvciB0aGUgZGV2aWNlIGFuZCBtYXBzIGFsbCBhdmFpbGFibGUKICAqIHJhbSBpbnRvIHRoZSBpbyBjb250cm9sbGVyIGJ1cyBhZGRyZXNzIHNwYWNlLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3N0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCBsZW4sIHRtcDsKIAotCS8qIGZvcmNlIDE2TSBkbWEgcGFnZXMgZm9yIGxpbmVhciBtYXBwaW5nICovCi0KLQlpZiAoci0+cGFnZV9zaXplICE9IFBTM19ETUFfMTZNKSB7Ci0JCXByX2luZm8oIiVzOiVkOiBmb3JjaW5nIDE2TSBwYWdlcyBmb3IgbGluZWFyIG1hcFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXItPnBhZ2Vfc2l6ZSA9IFBTM19ETUFfMTZNOworCWlmIChyLT5sZW4gPiAxNioxMDI0KjEwMjQpIHsJLyogRklYTUU6IG5lZWQgcHJvcGVyIGZpeCAqLworCQkvKiBmb3JjZSAxNk0gZG1hIHBhZ2VzIGZvciBsaW5lYXIgbWFwcGluZyAqLworCQlpZiAoci0+cGFnZV9zaXplICE9IFBTM19ETUFfMTZNKSB7CisJCQlwcl9pbmZvKCIlczolZDogZm9yY2luZyAxNk0gcGFnZXMgZm9yIGxpbmVhciBtYXBcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXItPnBhZ2Vfc2l6ZSA9IFBTM19ETUFfMTZNOworCQkJci0+bGVuID0gX0FMSUdOX1VQKHItPmxlbiwgMSA8PCByLT5wYWdlX3NpemUpOworCQl9CiAJfQogCi0JcmVzdWx0ID0gZG1hX3JlZ2lvbl9jcmVhdGUocik7CisJcmVzdWx0ID0gZG1hX3NiX3JlZ2lvbl9jcmVhdGUocik7CiAJQlVHX09OKHJlc3VsdCk7CiAKLQlyZXN1bHQgPSBkbWFfbWFwX2FyZWEociwgbWFwLnJtLmJhc2UsIG1hcC5ybS5zaXplLCAmdG1wKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlpZiAoci0+b2Zmc2V0IDwgbWFwLnJtLnNpemUpIHsKKwkJLyogTWFwIChwYXJ0IG9mKSAxc3QgUkFNIGNodW5rICovCisJCXZpcnRfYWRkciA9IG1hcC5ybS5iYXNlICsgci0+b2Zmc2V0OworCQlsZW4gPSBtYXAucm0uc2l6ZSAtIHItPm9mZnNldDsKKwkJaWYgKGxlbiA+IHItPmxlbikKKwkJCWxlbiA9IHItPmxlbjsKKwkJcmVzdWx0ID0gZG1hX3NiX21hcF9hcmVhKHIsIHZpcnRfYWRkciwgbGVuLCAmdG1wLAorCQkJSU9QVEVfUFBfVyB8IElPUFRFX1BQX1IgfCBJT1BURV9TT19SVyB8IElPUFRFX00pOworCQlCVUdfT04ocmVzdWx0KTsKKwl9CiAKLQlpZiAoVVNFX0xQQVJfQUREUikKLQkJcmVzdWx0ID0gZG1hX21hcF9hcmVhKHIsIG1hcC5yMS5iYXNlLCBtYXAucjEuc2l6ZSwKLQkJCSZ0bXApOwotCWVsc2UKLQkJcmVzdWx0ID0gZG1hX21hcF9hcmVhKHIsIG1hcC5ybS5zaXplLCBtYXAucjEuc2l6ZSwKLQkJCSZ0bXApOwotCi0JQlVHX09OKHJlc3VsdCk7CisJaWYgKHItPm9mZnNldCArIHItPmxlbiA+IG1hcC5ybS5zaXplKSB7CisJCS8qIE1hcCAocGFydCBvZikgMm5kIFJBTSBjaHVuayAqLworCQl2aXJ0X2FkZHIgPSBVU0VfTFBBUl9BRERSID8gbWFwLnIxLmJhc2UgOiBtYXAucm0uc2l6ZTsKKwkJbGVuID0gci0+bGVuOworCQlpZiAoci0+b2Zmc2V0ID49IG1hcC5ybS5zaXplKQorCQkJdmlydF9hZGRyICs9IHItPm9mZnNldCAtIG1hcC5ybS5zaXplOworCQllbHNlCisJCQlsZW4gLT0gbWFwLnJtLnNpemUgLSByLT5vZmZzZXQ7CisJCXJlc3VsdCA9IGRtYV9zYl9tYXBfYXJlYShyLCB2aXJ0X2FkZHIsIGxlbiwgJnRtcCwKKwkJCUlPUFRFX1BQX1cgfCBJT1BURV9QUF9SIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCi0gKiBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyIC0gRnJlZSBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCisgKiBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyIC0gRnJlZSBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqCiAgKiBUaGlzIHJvdXRpbmUgd2lsbCB1bm1hcCBhbGwgbWFwcGVkIGFyZWFzIGFuZCBmcmVlIHRoZSBIViBkbWEgcmVnaW9uLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3JlZ2lvbl9mcmVlX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCitzdGF0aWMgaW50IGRtYV9zYl9yZWdpb25fZnJlZV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgbGVuLCBscGFyX2FkZHI7CiAKLQlyZXN1bHQgPSBkbWFfdW5tYXBfYXJlYShyLCBkbWFfbHBhcl90b19idXMociwgMCksIG1hcC5ybS5zaXplKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlpZiAoci0+b2Zmc2V0IDwgbWFwLnJtLnNpemUpIHsKKwkJLyogVW5tYXAgKHBhcnQgb2YpIDFzdCBSQU0gY2h1bmsgKi8KKwkJbHBhcl9hZGRyID0gbWFwLnJtLmJhc2UgKyByLT5vZmZzZXQ7CisJCWxlbiA9IG1hcC5ybS5zaXplIC0gci0+b2Zmc2V0OworCQlpZiAobGVuID4gci0+bGVuKQorCQkJbGVuID0gci0+bGVuOworCQlidXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBscGFyX2FkZHIpOworCQlyZXN1bHQgPSBkbWFfc2JfdW5tYXBfYXJlYShyLCBidXNfYWRkciwgbGVuKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQogCi0JcmVzdWx0ID0gZG1hX3VubWFwX2FyZWEociwgZG1hX2xwYXJfdG9fYnVzKHIsIG1hcC5yMS5iYXNlKSwKLQkJbWFwLnIxLnNpemUpOwotCUJVR19PTihyZXN1bHQpOworCWlmIChyLT5vZmZzZXQgKyByLT5sZW4gPiBtYXAucm0uc2l6ZSkgeworCQkvKiBVbm1hcCAocGFydCBvZikgMm5kIFJBTSBjaHVuayAqLworCQlscGFyX2FkZHIgPSBtYXAucjEuYmFzZTsKKwkJbGVuID0gci0+bGVuOworCQlpZiAoci0+b2Zmc2V0ID49IG1hcC5ybS5zaXplKQorCQkJbHBhcl9hZGRyICs9IHItPm9mZnNldCAtIG1hcC5ybS5zaXplOworCQllbHNlCisJCQlsZW4gLT0gbWFwLnJtLnNpemUgLSByLT5vZmZzZXQ7CisJCWJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIGxwYXJfYWRkcik7CisJCXJlc3VsdCA9IGRtYV9zYl91bm1hcF9hcmVhKHIsIGJ1c19hZGRyLCBsZW4pOworCQlCVUdfT04ocmVzdWx0KTsKKwl9CiAKLQlyZXN1bHQgPSBkbWFfcmVnaW9uX2ZyZWUocik7CisJcmVzdWx0ID0gZG1hX3NiX3JlZ2lvbl9mcmVlKHIpOwogCUJVR19PTihyZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCi0gKiBkbWFfbWFwX2FyZWFfbGluZWFyIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl9tYXBfYXJlYV9saW5lYXIgLSBNYXAgYW4gYXJlYSBvZiBtZW1vcnkgaW50byBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKiBAdmlydF9hZGRyOiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIG1hcC4KICAqIEBidXNfYWRkcjogQSBwb2ludGVyIHRvIHJldHVybiB0aGUgc3RhcnRpbmcgaW9jIGJ1cyBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvCiAgKiBtYXAuCiAgKgotICogVGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucyB0aGUgY29yZXNwb25kaW5nIGJ1cyBhZGRyZXNzLiAgQWN0dWFsIG1hcHBpbmcKKyAqIFRoaXMgcm91dGluZSBqdXN0IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgYnVzIGFkZHJlc3MuICBBY3R1YWwgbWFwcGluZwogICogb2NjdXJzIGluIGRtYV9yZWdpb25fY3JlYXRlX2xpbmVhcigpLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCi0JdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcikKK3N0YXRpYyBpbnQgZG1hX3NiX21hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwl1NjQgaW9wdGVfZmxhZykKIHsKIAl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IGlzX2tlcm5lbF9hZGRyKHZpcnRfYWRkcikgPyBfX3BhKHZpcnRfYWRkcikKIAkJOiB2aXJ0X2FkZHI7Ci0JKmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CisJKmJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0NCw0MiArMTA5MSw5OCBAQAogICogQGJ1c19hZGRyOiBUaGUgc3RhcnRpbmcgaW9jIGJ1cyBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIHVubWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIHVubWFwLgogICoKLSAqIFRoaXMgcm91dGluZSBkb2VzIG5vdGhpbmcuICBVbm1hcHBpbmcgb2NjdXJzIGluIGRtYV9yZWdpb25fZnJlZV9saW5lYXIoKS4KKyAqIFRoaXMgcm91dGluZSBkb2VzIG5vdGhpbmcuICBVbm1hcHBpbmcgb2NjdXJzIGluIGRtYV9zYl9yZWdpb25fZnJlZV9saW5lYXIoKS4KICAqLwogCi1zdGF0aWMgaW50IGRtYV91bm1hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCitzdGF0aWMgaW50IGRtYV9zYl91bm1hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCiAJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyBwczNfZG1hX3NiX3JlZ2lvbl9vcHMgPSAgeworCS5jcmVhdGUgPSBkbWFfc2JfcmVnaW9uX2NyZWF0ZSwKKwkuZnJlZSA9IGRtYV9zYl9yZWdpb25fZnJlZSwKKwkubWFwID0gZG1hX3NiX21hcF9hcmVhLAorCS51bm1hcCA9IGRtYV9zYl91bm1hcF9hcmVhCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyBwczNfZG1hX3NiX3JlZ2lvbl9saW5lYXJfb3BzID0geworCS5jcmVhdGUgPSBkbWFfc2JfcmVnaW9uX2NyZWF0ZV9saW5lYXIsCisJLmZyZWUgPSBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyLAorCS5tYXAgPSBkbWFfc2JfbWFwX2FyZWFfbGluZWFyLAorCS51bm1hcCA9IGRtYV9zYl91bm1hcF9hcmVhX2xpbmVhcgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgcHMzX2RtYV9pb2MwX3JlZ2lvbl9vcHMgPSB7CisJLmNyZWF0ZSA9IGRtYV9pb2MwX3JlZ2lvbl9jcmVhdGUsCisJLmZyZWUgPSBkbWFfaW9jMF9yZWdpb25fZnJlZSwKKwkubWFwID0gZG1hX2lvYzBfbWFwX2FyZWEsCisJLnVubWFwID0gZG1hX2lvYzBfdW5tYXBfYXJlYQorfTsKKworaW50IHBzM19kbWFfcmVnaW9uX2luaXQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemUsCisJZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcjsKKworCWxwYXJfYWRkciA9IGFkZHIgPyBwczNfbW1fcGh5c190b19scGFyKF9fcGEoYWRkcikpIDogMDsKKworCXItPmRldiA9IGRldjsKKwlyLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7CisJci0+cmVnaW9uX3R5cGUgPSByZWdpb25fdHlwZTsKKwlyLT5vZmZzZXQgPSBscGFyX2FkZHI7CisJaWYgKHItPm9mZnNldCA+PSBtYXAucm0uc2l6ZSkKKwkJci0+b2Zmc2V0IC09IG1hcC5yMS5vZmZzZXQ7CisJci0+bGVuID0gbGVuID8gbGVuIDogX0FMSUdOX1VQKG1hcC50b3RhbCwgMSA8PCByLT5wYWdlX3NpemUpOworCisJc3dpdGNoIChkZXYtPmRldl90eXBlKSB7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfU0I6CisJCXItPnJlZ2lvbl9vcHMgPSAgKFVTRV9EWU5BTUlDX0RNQSkKKwkJCT8gJnBzM19kbWFfc2JfcmVnaW9uX29wcworCQkJOiAmcHMzX2RtYV9zYl9yZWdpb25fbGluZWFyX29wczsKKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfSU9DMDoKKwkJci0+cmVnaW9uX29wcyA9ICZwczNfZG1hX2lvYzBfcmVnaW9uX29wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wocHMzX2RtYV9yZWdpb25faW5pdCk7CiAKIGludCBwczNfZG1hX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9yZWdpb25fY3JlYXRlKHIpCi0JCTogZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHIpOworCUJVR19PTighcik7CisJQlVHX09OKCFyLT5yZWdpb25fb3BzKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMtPmNyZWF0ZSk7CisJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPmNyZWF0ZShyKTsKIH0KK0VYUE9SVF9TWU1CT0wocHMzX2RtYV9yZWdpb25fY3JlYXRlKTsKIAogaW50IHBzM19kbWFfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9yZWdpb25fZnJlZShyKQotCQk6IGRtYV9yZWdpb25fZnJlZV9saW5lYXIocik7CisJQlVHX09OKCFyKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMpOworCUJVR19PTighci0+cmVnaW9uX29wcy0+ZnJlZSk7CisJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPmZyZWUocik7CiB9CitFWFBPUlRfU1lNQk9MKHBzM19kbWFfcmVnaW9uX2ZyZWUpOwogCiBpbnQgcHMzX2RtYV9tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIpCisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCXU2NCBpb3B0ZV9mbGFnKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9tYXBfYXJlYShyLCB2aXJ0X2FkZHIsIGxlbiwgYnVzX2FkZHIpCi0JCTogZG1hX21hcF9hcmVhX2xpbmVhcihyLCB2aXJ0X2FkZHIsIGxlbiwgYnVzX2FkZHIpOworCXJldHVybiByLT5yZWdpb25fb3BzLT5tYXAociwgdmlydF9hZGRyLCBsZW4sIGJ1c19hZGRyLCBpb3B0ZV9mbGFnKTsKIH0KIAogaW50IHBzM19kbWFfdW5tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKSA/IGRtYV91bm1hcF9hcmVhKHIsIGJ1c19hZGRyLCBsZW4pCi0JCTogZG1hX3VubWFwX2FyZWFfbGluZWFyKHIsIGJ1c19hZGRyLCBsZW4pOworCXJldHVybiByLT5yZWdpb25fb3BzLT51bm1hcChyLCBidXNfYWRkciwgbGVuKTsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTgxMCwxMiArMTIxMywxMyBAQAogCUJVR19PTihtYXAucm0uYmFzZSk7CiAJQlVHX09OKCFtYXAucm0uc2l6ZSk7CiAKLQlsbWJfYWRkKG1hcC5ybS5iYXNlLCBtYXAucm0uc2l6ZSk7Ci0JbG1iX2FuYWx5emUoKTsKIAogCS8qIGFycmFuZ2UgdG8gZG8gdGhpcyBpbiBwczNfbW1fYWRkX21lbW9yeSAqLwogCXBzM19tbV9yZWdpb25fY3JlYXRlKCZtYXAucjEsIG1hcC50b3RhbCAtIG1hcC5ybS5zaXplKTsKIAorCS8qIGNvcnJlY3QgbWFwLnRvdGFsIGZvciB0aGUgcmVhbCB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHdlIHVzZSAqLworCW1hcC50b3RhbCA9IG1hcC5ybS5zaXplICsgbWFwLnIxLnNpemU7CisKIAlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCmluZGV4IDVjM2RhMDguLmI3MGU0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogfSBzdGF0aWMgc2F2ZWRfcGFyYW1zOwogCiAjZGVmaW5lIGR1bXBfaGVhZGVyKF9hKSBfZHVtcF9oZWFkZXIoX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9kdW1wX2hlYWRlcihjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgX19pb21lbSAqaCwgY29uc3QgY2hhciogZnVuYywKK3N0YXRpYyB2b2lkIF9kdW1wX2hlYWRlcihjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgKmgsIGNvbnN0IGNoYXIgKmZ1bmMsCiAJaW50IGxpbmUpCiB7CiAJcHJfZGVidWcoIiVzOiVkOiBoLm1hZ2ljX251bTogICAgICAgICAnJXMnXG4iLCBmdW5jLCBsaW5lLApAQCAtMTUxLDcgKzE1MSw3IEBACiB9CiAKICNkZWZpbmUgZHVtcF9wYXJhbXMoX2EpIF9kdW1wX3BhcmFtcyhfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX2R1bXBfcGFyYW1zKGNvbnN0IHN0cnVjdCBvc19hcmVhX3BhcmFtcyBfX2lvbWVtICpwLCBjb25zdCBjaGFyKiBmdW5jLAorc3RhdGljIHZvaWQgX2R1bXBfcGFyYW1zKGNvbnN0IHN0cnVjdCBvc19hcmVhX3BhcmFtcyAqcCwgY29uc3QgY2hhciAqZnVuYywKIAlpbnQgbGluZSkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6IHAuYm9vdF9mbGFnOiAgICAgICAldVxuIiwgZnVuYywgbGluZSwgcC0+Ym9vdF9mbGFnKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9wbGF0Zm9ybS5oCmluZGV4IGNhMDRmMDMuLjg3ZDUyMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaApAQCAtNDEsNiArNDEsNyBAQAogLyogaXJxICovCiAKIHZvaWQgcHMzX2luaXRfSVJRKHZvaWQpOwordm9pZCBwczNfc2h1dGRvd25fSVJRKGludCBjcHUpOwogdm9pZCBfX2luaXQgcHMzX3JlZ2lzdGVyX2lwaV9kZWJ1Z19icmsodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHZpcnEpOwogCiAvKiBzbXAgKi8KQEAgLTgyLDYgKzgzLDcgQEAKIAlQUzNfREVWX1RZUEVfU1RPUl9ST00gPSBUWVBFX1JPTSwJLyogNSAqLwogCVBTM19ERVZfVFlQRV9TQl9HUElPID0gNiwKIAlQUzNfREVWX1RZUEVfU1RPUl9GTEFTSCA9IFRZUEVfUkJDLAkvKiAxNCAqLworCVBTM19ERVZfVFlQRV9OT0FDQ0VTUyA9IDI1NSwKIH07CiAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19zdHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwgY29uc3QgY2hhciAqYnVzX3N0ciwKQEAgLTEyOSwyNCArMTMxLDI4IEBACiAvKiByZXBvc2l0b3J5IGJ1cyBlbnVtZXJhdG9ycyAqLwogCiBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHsKKwllbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZTsKIAl1bnNpZ25lZCBpbnQgYnVzX2luZGV4OworCXVuc2lnbmVkIGludCBidXNfaWQ7CisJZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGU7CiAJdW5zaWduZWQgaW50IGRldl9pbmRleDsKLQlzdHJ1Y3QgcHMzX2RldmljZV9pZCBkaWQ7CisJdW5zaWduZWQgaW50IGRldl9pZDsKIH07CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZShlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKLQllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpzdGFydF9kZXYsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbmxpbmUgaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZmlyc3RfZGV2aWNlKAotCWVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLCBlbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnBzM19yZXBvc2l0b3J5X2J1bXBfZGV2aWNlKAorCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCiB7Ci0JcmV0dXJuIHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKGJ1c190eXBlLCBkZXZfdHlwZSwgTlVMTCwgZGV2KTsKKwlyZXBvLT5kZXZfaW5kZXgrKzsKKwlyZXR1cm4gcmVwbzsKIH0KLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2Uoc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbyk7CitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2VzKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLAorCWludCAoKmNhbGxiYWNrKShjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9idXMoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsIHVuc2lnbmVkIGludCBmcm9tLAorCXVuc2lnbmVkIGludCAqYnVzX2luZGV4KTsKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAogCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludHJfdHlwZSwgdW5zaWduZWQgaW50ICppbnRlcnJ1cHRfaWQpOwotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldiwKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAogCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlLCB1NjQgKmJ1c19hZGRyLCB1NjQgKmxlbik7CiAKIC8qIHJlcG9zaXRvcnkgYmxvY2sgZGV2aWNlIGluZm8gKi8KQEAgLTIxNiw0ICsyMjIsMTkgQEAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX3NwdV9yZXNvdXJjZV9pZCh1bnNpZ25lZCBpbnQgcmVzX2luZGV4LAogCWVudW0gcHMzX3NwdV9yZXNvdXJjZV90eXBlKiByZXNvdXJjZV90eXBlLCB1bnNpZ25lZCBpbnQgKnJlc291cmNlX2lkKTsKIAorLyogcmVwb3NpdG9yeSB2dWFydCBpbmZvICovCisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X2F2X3BvcnQodW5zaWduZWQgaW50ICpwb3J0KTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X3N5c21ncl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCk7CisKKy8qIFBhZ2UgdGFibGUgZW50cmllcyAqLworI2RlZmluZSBJT1BURV9QUF9XCQkweDgwMDAwMDAwMDAwMDAwMDB1bCAvKiBwcm90ZWN0aW9uOiB3cml0ZSAqLworI2RlZmluZSBJT1BURV9QUF9SCQkweDQwMDAwMDAwMDAwMDAwMDB1bCAvKiBwcm90ZWN0aW9uOiByZWFkICovCisjZGVmaW5lIElPUFRFX00JCQkweDIwMDAwMDAwMDAwMDAwMDB1bCAvKiBjb2hlcmVuY3kgcmVxdWlyZWQgKi8KKyNkZWZpbmUgSU9QVEVfU09fUgkJMHgxMDAwMDAwMDAwMDAwMDAwdWwgLyogb3JkZXJpbmc6IHdyaXRlcyAqLworI2RlZmluZSBJT1BURV9TT19SVyAgICAgICAgICAgICAweDE4MDAwMDAwMDAwMDAwMDB1bCAvKiBvcmRlcmluZzogciAmIHcgKi8KKyNkZWZpbmUgSU9QVEVfUlBOX01hc2sJCTB4MDdmZmZmZmZmZmZmZjAwMHVsIC8qIFJQTiAqLworI2RlZmluZSBJT1BURV9ICQkJMHgwMDAwMDAwMDAwMDAwODAwdWwgLyogY2FjaGUgaGludCAqLworI2RlZmluZSBJT1BURV9JT0lEX01hc2sJCTB4MDAwMDAwMDAwMDAwMDdmZnVsIC8qIGlvaWQgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKaW5kZXggYWU1ODZhMC4uOGNjMzdjZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAJCWR1bXBfbm9kZV9uYW1lKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40KTsKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJZHVtcF9ub2RlKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40LCB2MSwgdjIpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MjogJTAxNmx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCB2Mik7CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogfQogCiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfc3RyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIGNvbnN0IGNoYXIgKmJ1c19zdHIsCkBAIC0zMTQsMzI0ICszMTQsMTQwIEBACiAJCXJlZ19pbmRleCwgYnVzX2FkZHIsIGxlbik7CiB9CiAKLSNpZiBkZWZpbmVkKERFQlVHKQotaW50IHBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAotCXVuc2lnbmVkIGludCBkZXZfaW5kZXgpCisKKworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCiB7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IHJlc19pbmRleDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgdG1wID0gKnJlcG87CisJdW5zaWduZWQgaW50IG51bV9kZXY7CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKKwlCVUdfT04ocmVwby0+YnVzX2luZGV4ID4gMTApOworCUJVR19PTihyZXBvLT5kZXZfaW5kZXggPiAxMCk7CiAKLQlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgewotCQllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGU7Ci0JCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7CisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2Rldih0bXAuYnVzX2luZGV4LCAmbnVtX2Rldik7CiAKLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCXJlc19pbmRleCwgJmludHJfdHlwZSwgJmludGVycnVwdF9pZCk7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQotCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyIgotCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkICgldToldSkgaW50cl90eXBlICV1LCBpbnRlcnJ1cHRfaWQgJXVcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCBpbnRyX3R5cGUsCi0JCQlpbnRlcnJ1cHRfaWQpOwotCX0KLQotCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7Ci0JCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlOwotCQl1NjQgYnVzX2FkZHI7Ci0JCXU2NCBsZW47Ci0KLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJcmVzX2luZGV4LCAmcmVnX3R5cGUsICZidXNfYWRkciwgJmxlbik7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQotCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWciCi0JCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdfdHlwZSAldSwgYnVzX2FkZHIgJWx4aCwgbGVuICVseGhcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCByZWdfdHlwZSwKLQkJCWJ1c19hZGRyLCBsZW4pOwotCX0KLQotCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBkdW1wX3N0b3JfZGV2X2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IGRldl9pbmRleCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHJlZ2lvbl9pbmRleDsKLQl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7Ci0KLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQotCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyhidXNfaW5kZXgsIGRldl9pbmRleCwgJnBvcnQsCi0JCSZibGtfc2l6ZSwgJm51bV9ibG9ja3MsICZudW1fcmVnaW9ucyk7CiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvIgotCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQlnb3RvIG91dDsKKwkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXByX2RlYnVnKCIlczolZCAgKCV1OiV1KTogcG9ydCAlbHUsIGJsa19zaXplICVsdSwgbnVtX2Jsb2NrcyAiCi0JCSAiJWx1LCBudW1fcmVnaW9ucyAldVxuIiwKLQkJIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIHBvcnQsCi0JCSBibGtfc2l6ZSwgbnVtX2Jsb2NrcywgbnVtX3JlZ2lvbnMpOworCXByX2RlYnVnKCIlczolZDogYnVzX3R5cGUgJXUsIGJ1c19pbmRleCAldSwgYnVzX2lkICV1LCBudW1fZGV2ICV1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIHRtcC5idXNfdHlwZSwgdG1wLmJ1c19pbmRleCwgdG1wLmJ1c19pZCwKKwkJbnVtX2Rldik7CiAKLQlmb3IgKHJlZ2lvbl9pbmRleCA9IDA7IHJlZ2lvbl9pbmRleCA8IG51bV9yZWdpb25zOyByZWdpb25faW5kZXgrKykgewotCQl1bnNpZ25lZCBpbnQgcmVnaW9uX2lkOwotCQl1NjQgcmVnaW9uX3N0YXJ0LCByZWdpb25fc2l6ZTsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbihidXNfaW5kZXgsCi0JCQlkZXZfaW5kZXgsIHJlZ2lvbl9pbmRleCwgJnJlZ2lvbl9pZCwgJnJlZ2lvbl9zdGFydCwKLQkJCSZyZWdpb25fc2l6ZSk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCSBwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9yZWdpb24iCi0JCQkJICAiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJICBidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIHJlZ2lvbl9pZCAldSwgc3RhcnQgJWx4aCwgc2l6ZSAlbHhoXG4iLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIHJlZ2lvbl9pZCwKLQkJCSByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplKTsKKwlpZiAodG1wLmRldl9pbmRleCA+PSBudW1fZGV2KSB7CisJCXByX2RlYnVnKCIlczolZDogbm8gZGV2aWNlIGZvdW5kXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLW91dDoKLQlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByZXN1bHQ7CisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSh0bXAuYnVzX2luZGV4LCB0bXAuZGV2X2luZGV4LAorCQkmdG1wLmRldl90eXBlKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X3R5cGUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKHRtcC5idXNfaW5kZXgsIHRtcC5kZXZfaW5kZXgsCisJCSZ0bXAuZGV2X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkIGZhaWxlZFxuIiwgX19mdW5jX18sCisJCV9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kOiBkZXZfdHlwZSAldSwgZGV2X2luZGV4ICV1LCBkZXZfaWQgJXVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgdG1wLmRldl90eXBlLCB0bXAuZGV2X2luZGV4LCB0bXAuZGV2X2lkKTsKKworCSpyZXBvID0gdG1wOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR1bXBfZGV2aWNlX2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwgZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsCi0JCQkgICAgdW5zaWduZWQgaW50IG51bV9kZXYpCitpbnQgX19kZXZpbml0IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlcyhlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKKwlpbnQgKCpjYWxsYmFjaykoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IGRldl9pbmRleDsKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHJlcG87CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBidXNfJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4KTsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBmaW5kIGJ1c190eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c190eXBlKTsKIAotCWZvciAoZGV2X2luZGV4ID0gMDsgZGV2X2luZGV4IDwgbnVtX2RldjsgZGV2X2luZGV4KyspIHsKLQkJZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGU7Ci0JCXVuc2lnbmVkIGludCBkZXZfaWQ7CisJZm9yIChyZXBvLmJ1c19pbmRleCA9IDA7IHJlcG8uYnVzX2luZGV4IDwgMTA7IHJlcG8uYnVzX2luZGV4KyspIHsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJJmRldl90eXBlKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSIKLQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZChidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCSZkZXZfaWQpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCIKLQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IGRldl90eXBlICV1LCBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCBkZXZfdHlwZSwgZGV2X2lkKTsKLQotCQlwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8oYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCi0JCWlmIChidXNfdHlwZSA9PSBQUzNfQlVTX1RZUEVfU1RPUkFHRSkKLQkJCWR1bXBfc3Rvcl9kZXZfaW5mbyhidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JfQotCi0JcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9idXNfaW5mbyh2b2lkKQotewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBidXNfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JZm9yIChidXNfaW5kZXggPSAwOyBidXNfaW5kZXggPCAxMDsgYnVzX2luZGV4KyspIHsKLQkJZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGU7Ci0JCXVuc2lnbmVkIGludCBidXNfaWQ7Ci0JCXVuc2lnbmVkIGludCBudW1fZGV2OwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoYnVzX2luZGV4LCAmYnVzX3R5cGUpOworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX3R5cGUpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChidXNfaW5kZXgsICZidXNfaWQpOworCQlpZiAocmVwby5idXNfdHlwZSAhPSBidXNfdHlwZSkgeworCQkJcHJfZGVidWcoIiVzOiVkOiBza2lwLCBidXNfdHlwZSAldVxuIiwgX19mdW5jX18sCisJCQkJX19MSU5FX18sIHJlcG8uYnVzX3R5cGUpOworCQkJY29udGludWU7CisJCX0KKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChyZXBvLmJ1c19pbmRleCwKKwkJCSZyZXBvLmJ1c19pZCk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX2lkKCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoYnVzX2luZGV4ICE9IGJ1c19pZCkKLQkJCXByX2RlYnVnKCIlczolZCBidXNfaW5kZXggIT0gYnVzX2lkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWZvciAocmVwby5kZXZfaW5kZXggPSAwOyA7IHJlcG8uZGV2X2luZGV4KyspIHsKKwkJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKCZyZXBvKTsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KGJ1c19pbmRleCwgJm51bV9kZXYpOworCQkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKSB7CisJCQkJcmVzdWx0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAocmVzdWx0KQorCQkJCWJyZWFrOwogCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2KCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOwotCQkJY29udGludWU7CisJCQlyZXN1bHQgPSBjYWxsYmFjaygmcmVwbyk7CisKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6JWQ6IGFib3J0IGF0IGNhbGxiYWNrXG4iLCBfX2Z1bmNfXywKKwkJCQkJX19MSU5FX18pOworCQkJCWJyZWFrOworCQkJfQogCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkIGJ1c18ldTogYnVzX3R5cGUgJXUsIGJ1c19pZCAldSwgbnVtX2RldiAldVxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBidXNfdHlwZSwgYnVzX2lkLAotCQkJbnVtX2Rldik7Ci0KLQkJZHVtcF9kZXZpY2VfaW5mbyhidXNfaW5kZXgsIGJ1c190eXBlLCBudW1fZGV2KTsKKwkJYnJlYWs7CiAJfQogCiAJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQotI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCiAKLXN0YXRpYyBpbnQgZmluZF9kZXZpY2UodW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IG51bV9kZXYsCi0JdW5zaWduZWQgaW50IHN0YXJ0X2Rldl9pbmRleCwgZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGUsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQoraW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfYnVzKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLCB1bnNpZ25lZCBpbnQgZnJvbSwKKwl1bnNpZ25lZCBpbnQgKmJ1c19pbmRleCkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgZGV2X2luZGV4OworCXVuc2lnbmVkIGludCBpOworCWVudW0gcHMzX2J1c190eXBlIHR5cGU7CisJaW50IGVycm9yOwogCi0JcHJfZGVidWcoIiVzOiVkOiBmaW5kIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldl90eXBlKTsKLQotCWRldi0+ZGV2X2luZGV4ID0gVUlOVF9NQVg7Ci0KLQlmb3IgKGRldl9pbmRleCA9IHN0YXJ0X2Rldl9pbmRleDsgZGV2X2luZGV4IDwgbnVtX2RldjsgZGV2X2luZGV4KyspIHsKLQkJZW51bSBwczNfZGV2X3R5cGUgeDsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJJngpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl90eXBlIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWlmICh4ID09IGRldl90eXBlKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGRldl9pbmRleCA9PSBudW1fZGV2KQotCQlyZXR1cm4gLTE7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kIGRldl90eXBlICV1IGF0IGRldl9pbmRleCAldVxuIiwKLQkJX19mdW5jX18sIF9fTElORV9fLCBkZXZfdHlwZSwgZGV2X2luZGV4KTsKLQotCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkmZGV2LT5kaWQuZGV2X2lkKTsKLQotCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X2lkIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JZGV2LT5kZXZfaW5kZXggPSBkZXZfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQgZm91bmQ6IGRldl9pZCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlkZXYtPmRpZC5kZXZfaWQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlIChlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKLQllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpzdGFydF9kZXYsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQotewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBidXNfaW5kZXg7Ci0JdW5zaWduZWQgaW50IG51bV9kZXY7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGZpbmQgYnVzX3R5cGUgJXUsIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c190eXBlLCBkZXZfdHlwZSk7Ci0KLQlCVUdfT04oc3RhcnRfZGV2ICYmIHN0YXJ0X2Rldi0+YnVzX2luZGV4ID4gMTApOwotCi0JZm9yIChidXNfaW5kZXggPSBzdGFydF9kZXYgPyBzdGFydF9kZXYtPmJ1c19pbmRleCA6IDA7IGJ1c19pbmRleCA8IDEwOwotCQlidXNfaW5kZXgrKykgewotCQllbnVtIHBzM19idXNfdHlwZSB4OwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoYnVzX2luZGV4LCAmeCk7Ci0KLQkJaWYgKHJlc3VsdCkgeworCWZvciAoaSA9IGZyb207IGkgPCAxMDsgaSsrKSB7CisJCWVycm9yID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZShpLCAmdHlwZSk7CisJCWlmIChlcnJvcikgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX3R5cGUgZmFpbGVkXG4iLAogCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlkZXYtPmJ1c19pbmRleCA9IFVJTlRfTUFYOwotCQkJcmV0dXJuIHJlc3VsdDsKKwkJCSpidXNfaW5kZXggPSBVSU5UX01BWDsKKwkJCXJldHVybiBlcnJvcjsKIAkJfQotCQlpZiAoeCA9PSBidXNfdHlwZSkKLQkJCWJyZWFrOworCQlpZiAodHlwZSA9PSBidXNfdHlwZSkgeworCQkJKmJ1c19pbmRleCA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KLQotCWlmIChidXNfaW5kZXggPj0gMTApCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJfZGVidWcoIiVzOiVkOiBmb3VuZCBidXNfdHlwZSAldSBhdCBidXNfaW5kZXggJXVcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX3R5cGUsIGJ1c19pbmRleCk7Ci0KLQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KGJ1c19pbmRleCwgJm51bV9kZXYpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfbnVtX2RldiBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXJlc3VsdCA9IGZpbmRfZGV2aWNlKGJ1c19pbmRleCwgbnVtX2Rldiwgc3RhcnRfZGV2Ci0JCT8gc3RhcnRfZGV2LT5kZXZfaW5kZXggKyAxIDogMCwgZGV2X3R5cGUsIGRldik7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZCBnZXRfZGlkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChidXNfaW5kZXgsICZkZXYtPmRpZC5idXNfaWQpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlkZXYtPmJ1c19pbmRleCA9IGJ1c19pbmRleDsKLQotCXByX2RlYnVnKCIlczolZCBmb3VuZDogYnVzX2lkICV1LCBkZXZfaWQgJXVcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOwotCi0JcmV0dXJuIHJlc3VsdDsKKwkqYnVzX2luZGV4ID0gVUlOVF9NQVg7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKIAllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGUsIHVuc2lnbmVkIGludCAqaW50ZXJydXB0X2lkKQogewogCWludCByZXN1bHQgPSAwOwpAQCAtNjQ1LDggKzQ2MSw4IEBACiAJCWVudW0gcHMzX2ludGVycnVwdF90eXBlIHQ7CiAJCXVuc2lnbmVkIGludCBpZDsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKGRldi0+YnVzX2luZGV4LAotCQkJZGV2LT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnQsICZpZCk7CisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmaWQpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9pbnRyIGZhaWxlZFxuIiwKQEAgLTY2OSw3ICs0ODUsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKIAllbnVtIHBzM19yZWdfdHlwZSByZWdfdHlwZSwgdTY0ICpidXNfYWRkciwgdTY0ICpsZW4pCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC02ODQsOCArNTAwLDggQEAKIAkJdTY0IGE7CiAJCXU2NCBsOwogCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyhkZXYtPmJ1c19pbmRleCwKLQkJCWRldi0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmYSwgJmwpOworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmYSwgJmwpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9yZWcgZmFpbGVkXG4iLApAQCAtOTY1LDYgKzc4MSwzNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X2F2X3BvcnQodW5zaWduZWQgaW50ICpwb3J0KQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoInZpcl91YXJ0IiwgMCksCisJCW1ha2VfZmllbGQoInBvcnQiLCAwKSwKKwkJbWFrZV9maWVsZCgiYXZzZXQiLCAwKSwKKwkJJnYxLCAwKTsKKwkqcG9ydCA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X3N5c21ncl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJ2aXJfdWFydCIsIDApLAorCQltYWtlX2ZpZWxkKCJwb3J0IiwgMCksCisJCW1ha2VfZmllbGQoInN5c21nciIsIDApLAorCQkmdjEsIDApOworCSpwb3J0ID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCiAgICogcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9pbmZvIC0gR2V0IGFkZHJlc3MgYW5kIHNpemUgb2YgY2VsbF9leHRfb3NfYXJlYS4KICAgKiBhZGRyZXNzOiBscGFyIGFkZHJlc3Mgb2YgY2VsbF9leHRfb3NfYXJlYQpAQCAtMTAyNiwzICs4NzIsMjA1IEBACiAJcmV0dXJuIHJlc3VsdCA/IHJlc3VsdAogCQk6IHBzM19yZXBvc2l0b3J5X3JlYWRfdGJfZnJlcShub2RlX2lkLCB0Yl9mcmVxKTsKIH0KKworI2lmIGRlZmluZWQoREVCVUcpCisKK2ludCBwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8oY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVzX2luZGV4OworCisJcHJfZGVidWcoIiAtPiAlczolZDogKCV1OiV1KVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisKKwlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgeworCQllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGU7CisJCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJmludHJfdHlwZSwgJmludGVycnVwdF9pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQorCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyIgorCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICgldToldSkgaW50cl90eXBlICV1LCBpbnRlcnJ1cHRfaWQgJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJaW50cl90eXBlLCBpbnRlcnJ1cHRfaWQpOworCX0KKworCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7CisJCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlOworCQl1NjQgYnVzX2FkZHI7CisJCXU2NCBsZW47CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVzX2luZGV4LCAmcmVnX3R5cGUsICZidXNfYWRkciwgJmxlbik7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQorCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWciCisJCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdfdHlwZSAldSwgYnVzX2FkZHIgJWx4aCwgbGVuICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJcmVnX3R5cGUsIGJ1c19hZGRyLCBsZW4pOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdW1wX3N0b3JfZGV2X2luZm8oc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHJlZ2lvbl9pbmRleDsKKwl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyhyZXBvLT5idXNfaW5kZXgsCisJCXJlcG8tPmRldl9pbmRleCwgJnBvcnQsICZibGtfc2l6ZSwgJm51bV9ibG9ja3MsICZudW1fcmVnaW9ucyk7CisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvIgorCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IHBvcnQgJWx1LCBibGtfc2l6ZSAlbHUsIG51bV9ibG9ja3MgIgorCQkgIiVsdSwgbnVtX3JlZ2lvbnMgJXVcbiIsCisJCSBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LCBwb3J0LAorCQkgYmxrX3NpemUsIG51bV9ibG9ja3MsIG51bV9yZWdpb25zKTsKKworCWZvciAocmVnaW9uX2luZGV4ID0gMDsgcmVnaW9uX2luZGV4IDwgbnVtX3JlZ2lvbnM7IHJlZ2lvbl9pbmRleCsrKSB7CisJCXVuc2lnbmVkIGludCByZWdpb25faWQ7CisJCXU2NCByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfcmVnaW9uKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVnaW9uX2luZGV4LCAmcmVnaW9uX2lkLAorCQkJJnJlZ2lvbl9zdGFydCwgJnJlZ2lvbl9zaXplKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJIHByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbiIKKwkJCQkgICIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkgIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICgldToldSkgcmVnaW9uX2lkICV1LCBzdGFydCAlbHhoLCBzaXplICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJcmVnaW9uX2lkLCByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplKTsKKwl9CisKK291dDoKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAorCXVuc2lnbmVkIGludCBudW1fZGV2KQoreworCWludCByZXN1bHQgPSAwOworCisJcHJfZGVidWcoIiAtPiAlczolZDogYnVzXyV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCk7CisKKwlmb3IgKHJlcG8tPmRldl9pbmRleCA9IDA7IHJlcG8tPmRldl9pbmRleCA8IG51bV9kZXY7CisJCXJlcG8tPmRldl9pbmRleCsrKSB7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZShyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsICZyZXBvLT5kZXZfdHlwZSk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUiCisJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCAmcmVwby0+ZGV2X2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQiCisJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICAoJXU6JXUpOiBkZXZfdHlwZSAldSwgZGV2X2lkICV1XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwKKwkJCXJlcG8tPmRldl90eXBlLCByZXBvLT5kZXZfaWQpOworCisJCXBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyhyZXBvKTsKKworCQlpZiAocmVwby0+YnVzX3R5cGUgPT0gUFMzX0JVU19UWVBFX1NUT1JBR0UpCisJCQlkdW1wX3N0b3JfZGV2X2luZm8ocmVwbyk7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9idXNfaW5mbyh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgcmVwbzsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltZW1zZXQoJnJlcG8sIDAsIHNpemVvZihyZXBvKSk7CisKKwlmb3IgKHJlcG8uYnVzX2luZGV4ID0gMDsgcmVwby5idXNfaW5kZXggPCAxMDsgcmVwby5idXNfaW5kZXgrKykgeworCQl1bnNpZ25lZCBpbnQgbnVtX2RldjsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX3R5cGUpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQoJXUpIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlcG8uYnVzX2luZGV4ICE9IHJlcG8uYnVzX2lkKQorCQkJcHJfZGVidWcoIiVzOiVkIGJ1c19pbmRleCAhPSBidXNfaWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KHJlcG8uYnVzX2luZGV4LAorCQkJJm51bV9kZXYpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2KCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCBidXNfJXU6IGJ1c190eXBlICV1LCBidXNfaWQgJXUsIG51bV9kZXYgJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4LCByZXBvLmJ1c190eXBlLAorCQkJcmVwby5idXNfaWQsIG51bV9kZXYpOworCisJCWR1bXBfZGV2aWNlX2luZm8oJnJlcG8sIG51bV9kZXYpOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwppbmRleCA5MzUzOTY3Li5hYTA1Mjg4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKQEAgLTM3LDI4ICszNywzNiBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKENPTkZJR19TTVApCiBzdGF0aWMgdm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpIHt9CiAjZW5kaWYKIAotaW50IHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbih1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiAqdikKK3N0YXRpYyB1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiBwczNfZmlybXdhcmVfdmVyc2lvbjsKKwordm9pZCBwczNfZ2V0X2Zpcm13YXJlX3ZlcnNpb24odW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gKnYpCiB7Ci0JaW50IHJlc3VsdCA9IGx2MV9nZXRfdmVyc2lvbl9pbmZvKCZ2LT5yYXcpOwotCi0JaWYgKHJlc3VsdCkgewotCQl2LT5yYXcgPSAwOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKKwkqdiA9IHBzM19maXJtd2FyZV92ZXJzaW9uOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKTsKIAoraW50IHBzM19jb21wYXJlX2Zpcm13YXJlX3ZlcnNpb24odTE2IG1ham9yLCB1MTYgbWlub3IsIHUxNiByZXYpCit7CisJdW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24geDsKKworCXgucGFkID0gMDsKKwl4Lm1ham9yID0gbWFqb3I7CisJeC5taW5vciA9IG1pbm9yOworCXgucmV2ID0gcmV2OworCisJcmV0dXJuIChwczNfZmlybXdhcmVfdmVyc2lvbi5yYXcgLSB4LnJhdyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfY29tcGFyZV9maXJtd2FyZV92ZXJzaW9uKTsKKwogc3RhdGljIHZvaWQgcHMzX3Bvd2VyX3NhdmUodm9pZCkKIHsKIAkvKgpAQCAtOTksNyArMTA3LDggQEAKIAl3aGlsZSgxKTsKIH0KIAotI2lmZGVmIENPTkZJR19GQl9QUzMKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9QUzMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX1BTM19NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19QUzNfRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX1BTM19GTEFTSF9NT0RVTEUpCiBzdGF0aWMgdm9pZCBwcmVhbGxvYyhzdHJ1Y3QgcHMzX3ByZWFsbG9jICpwKQogewogCWlmICghcC0+c2l6ZSkKQEAgLTExNSwxMiArMTI0LDE1IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVsdSBieXRlcyBhdCAlcFxuIiwgcC0+bmFtZSwgcC0+c2l6ZSwKIAkgICAgICAgcC0+YWRkcmVzcyk7CiB9CisjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0ZCX1BTMykgfHwgZGVmaW5lZChDT05GSUdfRkJfUFMzX01PRFVMRSkKIHN0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmJfdmlkZW9tZW1vcnkgPSB7Ci0gICAgLm5hbWUgPSAicHMzZmIgdmlkZW9tZW1vcnkiLAotICAgIC5zaXplID0gQ09ORklHX0ZCX1BTM19ERUZBVUxUX1NJWkVfTSoxMDI0KjEwMjQsCi0gICAgLmFsaWduID0gMTAyNCoxMDI0CQkJLyogdGhlIEdQVSByZXF1aXJlcyAxIE1pQiBhbGlnbm1lbnQgKi8KKwkubmFtZSA9ICJwczNmYiB2aWRlb21lbW9yeSIsCisJLnNpemUgPSBDT05GSUdfRkJfUFMzX0RFRkFVTFRfU0laRV9NKjEwMjQqMTAyNCwKKwkuYWxpZ24gPSAxMDI0KjEwMjQJCS8qIHRoZSBHUFUgcmVxdWlyZXMgMSBNaUIgYWxpZ25tZW50ICovCiB9OworRVhQT1JUX1NZTUJPTF9HUEwocHMzZmJfdmlkZW9tZW1vcnkpOwogI2RlZmluZSBwcmVhbGxvY19wczNmYl92aWRlb21lbW9yeSgpCXByZWFsbG9jKCZwczNmYl92aWRlb21lbW9yeSkKIAogc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfcHMzZmIoY2hhciAqcCkKQEAgLTEzNyw2ICsxNDksMzAgQEAKICNkZWZpbmUgcHJlYWxsb2NfcHMzZmJfdmlkZW9tZW1vcnkoKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1BTM19GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfUFMzX0ZMQVNIX01PRFVMRSkKK3N0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmxhc2hfYm91bmNlX2J1ZmZlciA9IHsKKwkubmFtZSA9ICJwczNmbGFzaCBib3VuY2UgYnVmZmVyIiwKKwkuc2l6ZSA9IDI1NioxMDI0LAorCS5hbGlnbiA9IDI1NioxMDI0Cit9OworRVhQT1JUX1NZTUJPTF9HUEwocHMzZmxhc2hfYm91bmNlX2J1ZmZlcik7CisjZGVmaW5lIHByZWFsbG9jX3BzM2ZsYXNoX2JvdW5jZV9idWZmZXIoKQlwcmVhbGxvYygmcHMzZmxhc2hfYm91bmNlX2J1ZmZlcikKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfcHMzZmxhc2goY2hhciAqcCkKK3sKKwlpZiAoIXApCisJCXJldHVybiAxOworCisJaWYgKCFzdHJjbXAocCwgIm9mZiIpKQorCQlwczNmbGFzaF9ib3VuY2VfYnVmZmVyLnNpemUgPSAwOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgicHMzZmxhc2giLCBlYXJseV9wYXJzZV9wczNmbGFzaCk7CisjZWxzZQorI2RlZmluZSBwcmVhbGxvY19wczNmbGFzaF9ib3VuY2VfYnVmZmVyKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKIHN0YXRpYyBpbnQgcHMzX3NldF9kYWJyKHU2NCBkYWJyKQogewogCWVudW0ge0RBQlJfVVNFUiA9IDEsIERBQlJfS0VSTkVMID0gMix9OwpAQCAtMTQ2LDEzICsxODIsMTMgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHBzM19zZXR1cF9hcmNoKHZvaWQpCiB7Ci0JdW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gdjsKIAogCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JcHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKCZ2KTsKLQlwcmludGsoS0VSTl9JTkZPICJQUzMgZmlybXdhcmUgdmVyc2lvbiAldS4ldS4ldVxuIiwgdi5tYWpvciwgdi5taW5vciwKLQkJdi5yZXYpOworCWx2MV9nZXRfdmVyc2lvbl9pbmZvKCZwczNfZmlybXdhcmVfdmVyc2lvbi5yYXcpOworCXByaW50ayhLRVJOX0lORk8gIlBTMyBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1XG4iLAorCSAgICAgICBwczNfZmlybXdhcmVfdmVyc2lvbi5tYWpvciwgcHMzX2Zpcm13YXJlX3ZlcnNpb24ubWlub3IsCisJICAgICAgIHBzM19maXJtd2FyZV92ZXJzaW9uLnJldik7CiAKIAlwczNfc3B1X3NldF9wbGF0Zm9ybSgpOwogCXBzM19tYXBfaHRhYigpOwpAQCAtMTY2LDYgKzIwMiw4IEBACiAjZW5kaWYKIAogCXByZWFsbG9jX3BzM2ZiX3ZpZGVvbWVtb3J5KCk7CisJcHJlYWxsb2NfcHMzZmxhc2hfYm91bmNlX2J1ZmZlcigpOworCiAJcHBjX21kLnBvd2VyX3NhdmUgPSBwczNfcG93ZXJfc2F2ZTsKIAogCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtMTg0LDcgKzIyMiw3IEBACiAJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlkdF9yb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKGR0X3Jvb3QsICJQUzMiKSkKKwlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShkdF9yb290LCAic29ueSxwczMiKSkKIAkJcmV0dXJuIDA7CiAKIAlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzIHw9IEZXX0ZFQVRVUkVfUFMzX1BPU1NJQkxFOwpAQCAtMjAxLDMxICsyMzksMTIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19LRVhFQykKIHN0YXRpYyB2b2lkIHBzM19rZXhlY19jcHVfZG93bihpbnQgY3Jhc2hfc2h1dGRvd24sIGludCBzZWNvbmRhcnkpCiB7Ci0JREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmIChzZWNvbmRhcnkpIHsKLQkJaW50IGNwdTsKLQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCQlpZiAoY3B1KQotCQkJCXBzM19zbXBfY2xlYW51cF9jcHUoY3B1KTsKLQl9IGVsc2UKLQkJcHMzX3NtcF9jbGVhbnVwX2NwdSgwKTsKKwlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOwogCi0JREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBzM19tYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQotewotCXVuc2lnbmVkIGxvbmcgcHBlX2lkOwotCi0JREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwcGVfaWQpOwotCWx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwcGVfaWQsIDAsIDApOwotCXBzM19tbV9zaHV0ZG93bigpOwotCXBzM19tbV92YXNfZGVzdHJveSgpOwotCi0JZGVmYXVsdF9tYWNoaW5lX2tleGVjKGltYWdlKTsKKwlwczNfc21wX2NsZWFudXBfY3B1KGNwdSk7CisJcHMzX3NodXRkb3duX0lSUShjcHUpOwogCiAJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiB9CkBAIC0yNDcsNyArMjY2LDcgQEAKIAkucG93ZXJfb2ZmCQkJPSBwczNfcG93ZXJfb2ZmLAogI2lmIGRlZmluZWQoQ09ORklHX0tFWEVDKQogCS5rZXhlY19jcHVfZG93bgkJCT0gcHMzX2tleGVjX2NwdV9kb3duLAotCS5tYWNoaW5lX2tleGVjCQkJPSBwczNfbWFjaGluZV9rZXhlYywKKwkubWFjaGluZV9rZXhlYwkJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjLAogCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjX3ByZXBhcmUsCiAJLm1hY2hpbmVfY3Jhc2hfc2h1dGRvd24JCT0gZGVmYXVsdF9tYWNoaW5lX2NyYXNoX3NodXRkb3duLAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCmluZGV4IDUzNDE2ZWMuLmYwYjEyZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAogI2lmIGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNkZWZpbmUgREJHIHVkYmdfcHJpbnRmCiAjZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2RlZmluZSBEQkcgcHJfZGVidWcKICNlbmRpZgogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaXBpX2Z1bmN0aW9uX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqbXNnKQpAQCAtMzksMTEgKzM5LDExIEBACiB9CiAKIC8qKgotICAqIHZpcnFzIC0gYSBwZXIgY3B1IGFycmF5IG9mIHZpcnFzIGZvciBpcGkgdXNlCisgICogcHMzX2lwaV92aXJxcyAtIGEgcGVyIGNwdSBhcnJheSBvZiB2aXJxcyBmb3IgaXBpIHVzZQogICAqLwogCiAjZGVmaW5lIE1TR19DT1VOVCA0Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCB2aXJxc1tNU0dfQ09VTlRdKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHBzM19pcGlfdmlycXNbTVNHX0NPVU5UXSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lc1tNU0dfQ09VTlRdID0gewogCSJpcGkgY2FsbCIsCkBAIC02Miw3ICs2Miw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl2aXJxID0gcGVyX2NwdSh2aXJxcywgdGFyZ2V0KVttc2ddOworCXZpcnEgPSBwZXJfY3B1KHBzM19pcGlfdmlycXMsIHRhcmdldClbbXNnXTsKIAlyZXN1bHQgPSBwczNfc2VuZF9ldmVudF9sb2NhbGx5KHZpcnEpOwogCiAJaWYgKHJlc3VsdCkKQEAgLTk0LDEzICs5NCwxMyBAQAogc3RhdGljIHZvaWQgX19pbml0IHBzM19zbXBfc2V0dXBfY3B1KGludCBjcHUpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdSh2aXJxcywgY3B1KTsKKwl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdShwczNfaXBpX3ZpcnFzLCBjcHUpOwogCWludCBpOwogCiAJREJHKCIgLT4gJXM6JWQ6ICglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY3B1KTsKIAogCS8qCi0JICogQ2hlY2sgYXNzdW1wdGlvbnMgb24gdmlycXNbXSBpbmRleGluZy4gSWYgdGhpcworCSAqIENoZWNrIGFzc3VtcHRpb25zIG9uIHBzM19pcGlfdmlycXNbXSBpbmRleGluZy4gSWYgdGhpcwogCSAqIGNoZWNrIGZhaWxzLCB0aGVuIGEgZGlmZmVyZW50IG1hcHBpbmcgb2YgUFBDX01TR18KIAkgKiB0byBpbmRleCBuZWVkcyB0byBiZSBzZXR1cC4KIAkgKi8KQEAgLTEzMiwxMyArMTMyLDEzIEBACiAKIHZvaWQgcHMzX3NtcF9jbGVhbnVwX2NwdShpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHZpcnFzLCBjcHUpOworCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHBzM19pcGlfdmlycXMsIGNwdSk7CiAJaW50IGk7CiAKIAlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOwogCiAJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7Ci0JCWZyZWVfaXJxKHZpcnFzW2ldLCAodm9pZCopKGxvbmcpaSk7CisJCS8qIENhbid0IGNhbGwgZnJlZV9pcnEgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gKi8KIAkJcHMzX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHZpcnFzW2ldKTsKIAkJdmlycXNbaV0gPSBOT19JUlE7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwppbmRleCA2NTE0MzdjLi41MDJkODBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwpAQCAtMTgyLDE1ICsxODIsMTggQEAKIHsKIAlzdHJ1Y3QgdGFibGUge2NoYXIqIG5hbWU7IHVuc2lnbmVkIGxvbmcgYWRkcjsgdW5zaWduZWQgbG9uZyBzaXplO307CiAKLQlzcHVfcGRhdGEoc3B1KS0+c2hhZG93ID0gX19pb3JlbWFwKAotCQlzcHVfcGRhdGEoc3B1KS0+c2hhZG93X2FkZHIsIHNpemVvZihzdHJ1Y3Qgc3BlX3NoYWRvdyksCi0JCXBncHJvdF92YWwoUEFHRV9SRUFET05MWSkgfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOworCXNwdV9wZGF0YShzcHUpLT5zaGFkb3cgPSBpb3JlbWFwX2ZsYWdzKHNwdV9wZGF0YShzcHUpLT5zaGFkb3dfYWRkciwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc3BlX3NoYWRvdyksCisJCQkJCSAgICAgICBwZ3Byb3RfdmFsKFBBR0VfUkVBRE9OTFkpIHwKKwkJCQkJICAgICAgIF9QQUdFX05PX0NBQ0hFKTsKIAlpZiAoIXNwdV9wZGF0YShzcHUpLT5zaGFkb3cpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIHNoYWRvdyBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCWdvdG8gZmFpbF9pb3JlbWFwOwogCX0KIAotCXNwdS0+bG9jYWxfc3RvcmUgPSBpb3JlbWFwKHNwdS0+bG9jYWxfc3RvcmVfcGh5cywgTFNfU0laRSk7CisJc3B1LT5sb2NhbF9zdG9yZSA9IChfX2ZvcmNlIHZvaWQgKilpb3JlbWFwX2ZsYWdzKHNwdS0+bG9jYWxfc3RvcmVfcGh5cywKKwkJTFNfU0laRSwgX1BBR0VfTk9fQ0FDSEUpOworCiAJaWYgKCFzcHUtPmxvY2FsX3N0b3JlKSB7CiAJCXByX2RlYnVnKCIlczolZDogaW9yZW1hcCBsb2NhbF9zdG9yZSBmYWlsZWRcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtMTk5LDYgKzIwMiw3IEBACiAKIAlzcHUtPnByb2JsZW0gPSBpb3JlbWFwKHNwdS0+cHJvYmxlbV9waHlzLAogCQlzaXplb2Yoc3RydWN0IHNwdV9wcm9ibGVtKSk7CisKIAlpZiAoIXNwdS0+cHJvYmxlbSkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgcHJvYmxlbSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCWdvdG8gZmFpbF9pb3JlbWFwOwpAQCAtMjA2LDYgKzIxMCw3IEBACiAKIAlzcHUtPnByaXYyID0gaW9yZW1hcChzcHVfcGRhdGEoc3B1KS0+cHJpdjJfYWRkciwKIAkJc2l6ZW9mKHN0cnVjdCBzcHVfcHJpdjIpKTsKKwogCWlmICghc3B1LT5wcml2MikgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgcHJpdjIgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlnb3RvIGZhaWxfaW9yZW1hcDsKQEAgLTQwMCwxMSArNDA1LDEzIEBACiAJCX0KIAl9CiAKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IEVycm9yIGluaXRpYWxpemluZyBzcHVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBudW1fcmVzb3VyY2VfaWQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBzcHVfbWFuYWdlbWVudF9vcHMgc3B1X21hbmFnZW1lbnRfcHMzX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwppbmRleCA2YmRhNTEwLi40YmI2MzRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCkBAIC0zMCwyMiArMzAsMjI4IEBACiAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCitzdGF0aWMgc3RydWN0IGRldmljZSBwczNfc3lzdGVtX2J1cyA9IHsKKwkuYnVzX2lkID0gInBzM19zeXN0ZW0iLAorfTsKKworLyogRklYTUU6IG5lZWQgZGV2aWNlIHVzYWdlIGNvdW50ZXJzISAqLworc3RydWN0IHsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IHNiXzExOyAvKiB1c2IgMCAqLworCWludCBzYl8xMjsgLyogdXNiIDAgKi8KKwlpbnQgZ3B1OworfSBzdGF0aWMgdXNhZ2VfaGFjazsKKworc3RhdGljIGludCBwczNfaXNfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwkJCSB1bnNpZ25lZCBpbnQgYnVzX2lkLCB1bnNpZ25lZCBpbnQgZGV2X2lkKQoreworCXJldHVybiBkZXYtPmJ1c19pZCA9PSBidXNfaWQgJiYgZGV2LT5kZXZfaWQgPT0gZGV2X2lkOworfQorCitzdGF0aWMgaW50IHBzM19vcGVuX2h2X2RldmljZV9zYihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCUJVR19PTighZGV2LT5idXNfaWQpOworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJaWYgKHBzM19pc19kZXZpY2UoZGV2LCAxLCAxKSkgeworCQl1c2FnZV9oYWNrLnNiXzExKys7CisJCWlmICh1c2FnZV9oYWNrLnNiXzExID4gMSkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMikpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMisrOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMiA+IDEpIHsKKwkJCXJlc3VsdCA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UoZGV2LT5idXNfaWQsIGRldi0+ZGV2X2lkLCAwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfb3Blbl9kZXZpY2UgZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM19jbG9zZV9odl9kZXZpY2Vfc2Ioc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisKKwlCVUdfT04oIWRldi0+YnVzX2lkKTsKKwltdXRleF9sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMSkpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMS0tOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMSkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMikpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMi0tOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMikgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCXJlc3VsdCA9IGx2MV9jbG9zZV9kZXZpY2UoZGV2LT5idXNfaWQsIGRldi0+ZGV2X2lkKTsKKwlCVUdfT04ocmVzdWx0KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX29wZW5faHZfZGV2aWNlX2dwdShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJdXNhZ2VfaGFjay5ncHUrKzsKKwlpZiAodXNhZ2VfaGFjay5ncHUgPiAxKSB7CisJCXJlc3VsdCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZ3B1X29wZW4oMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2dwdV9vcGVuIGZhaWxlZDogJXNcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJfQorCitkb25lOgorCW11dGV4X3VubG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfY2xvc2VfaHZfZGV2aWNlX2dwdShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJdXNhZ2VfaGFjay5ncHUtLTsKKwlpZiAodXNhZ2VfaGFjay5ncHUpIHsKKwkJcmVzdWx0ID0gMDsKKwkJZ290byBkb25lOworCX0KKworCXJlc3VsdCA9IGx2MV9ncHVfY2xvc2UoKTsKKwlCVUdfT04ocmVzdWx0KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfb3Blbl9odl9kZXZpY2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCUJVR19PTighZGV2KTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKKworCXN3aXRjaCAoZGV2LT5tYXRjaF9pZCkgeworCWNhc2UgUFMzX01BVENIX0lEX0VIQ0k6CisJY2FzZSBQUzNfTUFUQ0hfSURfT0hDSToKKwljYXNlIFBTM19NQVRDSF9JRF9HRUxJQzoKKwljYXNlIFBTM19NQVRDSF9JRF9TVE9SX0RJU0s6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9ST006CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9GTEFTSDoKKwkJcmV0dXJuIHBzM19vcGVuX2h2X2RldmljZV9zYihkZXYpOworCisJY2FzZSBQUzNfTUFUQ0hfSURfU09VTkQ6CisJY2FzZSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1M6CisJCXJldHVybiBwczNfb3Blbl9odl9kZXZpY2VfZ3B1KGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKKwljYXNlIFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUjoKKwkJcHJfZGVidWcoIiVzOiVkOiB1bnN1cHBvcnRlZCBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOworCQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+YnVzX2lkKTsKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiVkOiB1bmtub3duIG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKKwlCVUcoKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19vcGVuX2h2X2RldmljZSk7CisKK2ludCBwczNfY2xvc2VfaHZfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlCVUdfT04oIWRldik7CisJcHJfZGVidWcoIiVzOiVkOiBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCk7CisKKwlzd2l0Y2ggKGRldi0+bWF0Y2hfaWQpIHsKKwljYXNlIFBTM19NQVRDSF9JRF9FSENJOgorCWNhc2UgUFMzX01BVENIX0lEX09IQ0k6CisJY2FzZSBQUzNfTUFUQ0hfSURfR0VMSUM6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9ESVNLOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfUk9NOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfRkxBU0g6CisJCXJldHVybiBwczNfY2xvc2VfaHZfZGV2aWNlX3NiKGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9TT1VORDoKKwljYXNlIFBTM19NQVRDSF9JRF9HUkFQSElDUzoKKwkJcmV0dXJuIHBzM19jbG9zZV9odl9kZXZpY2VfZ3B1KGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKKwljYXNlIFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUjoKKwkJcHJfZGVidWcoIiVzOiVkOiB1bnN1cHBvcnRlZCBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOworCQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+YnVzX2lkKTsKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiVkOiB1bmtub3duIG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKKwlCVUcoKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19jbG9zZV9odl9kZXZpY2UpOworCiAjZGVmaW5lIGR1bXBfbW1pb19yZWdpb24oX2EpIF9kdW1wX21taW9fcmVnaW9uKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCiBzdGF0aWMgdm9pZCBfZHVtcF9tbWlvX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uKiByLAogCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewotCXByX2RlYnVnKCIlczolZDogZGV2ICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLCByLT5kaWQuYnVzX2lkLAotCQlyLT5kaWQuZGV2X2lkKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGRldiAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGV2LT5idXNfaWQsCisJCXItPmRldi0+ZGV2X2lkKTsKIAlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19hZGRyICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5idXNfYWRkcik7CiAJcHJfZGVidWcoIiVzOiVkOiBsZW4gICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bGVuKTsKIAlwcl9kZWJ1ZygiJXM6JWQ6IGxwYXJfYWRkciAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5scGFyX2FkZHIpOwogfQogCi1pbnQgcHMzX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQorc3RhdGljIGludCBwczNfc2JfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX21taW9fcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJcmVzdWx0ID0gbHYxX21hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkLAogCQlyLT5idXNfYWRkciwgci0+bGVuLCByLT5wYWdlX3NpemUsICZyLT5scGFyX2FkZHIpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtNTcsMTMgKzI2MywyNiBAQAogCWR1bXBfbW1pb19yZWdpb24ocik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KKworc3RhdGljIGludCBwczNfaW9jMF9tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3sKKwkvKiBkZXZpY2Ugc3BlY2lmaWM7IGRvIG5vdGhpbmcgY3VycmVudGx5ICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBwczNfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCit7CisJcmV0dXJuIHItPm1taW9fb3BzLT5jcmVhdGUocik7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChwczNfbW1pb19yZWdpb25fY3JlYXRlKTsKIAotaW50IHBzM19mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCitzdGF0aWMgaW50IHBzM19zYl9mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGlkLmJ1c19pZCwgci0+ZGlkLmRldl9pZCwKKwlkdW1wX21taW9fcmVnaW9uKHIpOworOworCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkLAogCQlyLT5scGFyX2FkZHIpOwogCiAJaWYgKHJlc3VsdCkKQEAgLTczLDE0ICsyOTIsNjAgQEAKIAlyLT5scGFyX2FkZHIgPSAwOwogCXJldHVybiByZXN1bHQ7CiB9CisKK3N0YXRpYyBpbnQgcHMzX2lvYzBfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQoreworCS8qIGRldmljZSBzcGVjaWZpYzsgZG8gbm90aGluZyBjdXJyZW50bHkgKi8KKwlyZXR1cm4gMDsKK30KKworCitpbnQgcHMzX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3sKKwlyZXR1cm4gci0+bW1pb19vcHMtPmZyZWUocik7Cit9CisKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM19mcmVlX21taW9fcmVnaW9uKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzIHBzM19tbWlvX3NiX3JlZ2lvbl9vcHMgPSB7CisJLmNyZWF0ZSA9IHBzM19zYl9tbWlvX3JlZ2lvbl9jcmVhdGUsCisJLmZyZWUgPSBwczNfc2JfZnJlZV9tbWlvX3JlZ2lvbgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzIHBzM19tbWlvX2lvYzBfcmVnaW9uX29wcyA9IHsKKwkuY3JlYXRlID0gcHMzX2lvYzBfbW1pb19yZWdpb25fY3JlYXRlLAorCS5mcmVlID0gcHMzX2lvYzBfZnJlZV9tbWlvX3JlZ2lvbgorfTsKKworaW50IHBzM19tbWlvX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwllbnVtIHBzM19tbWlvX3BhZ2Vfc2l6ZSBwYWdlX3NpemUpCit7CisJci0+ZGV2ID0gZGV2OworCXItPmJ1c19hZGRyID0gYnVzX2FkZHI7CisJci0+bGVuID0gbGVuOworCXItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKKwlzd2l0Y2ggKGRldi0+ZGV2X3R5cGUpIHsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9TQjoKKwkJci0+bW1pb19vcHMgPSAmcHMzX21taW9fc2JfcmVnaW9uX29wczsKKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfSU9DMDoKKwkJci0+bW1pb19vcHMgPSAmcHMzX21taW9faW9jMF9yZWdpb25fb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX21taW9fcmVnaW9uX2luaXQpOworCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKl9kZXYsCiAJc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCiB7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPSB0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoX2Rydik7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydiA9IHBzM19kcnZfdG9fc3lzdGVtX2J1c19kcnYoX2Rydik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAogCXJlc3VsdCA9IGRldi0+bWF0Y2hfaWQgPT0gZHJ2LT5tYXRjaF9pZDsKIApAQCAtOTIsMzIgKzM1NywxNCBAQAogCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0KLQkJdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKF9kZXYtPmRyaXZlcik7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnY7CiAKLQlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQsIDApOworCUJVR19PTighZGV2KTsKKwlwcl9pbmZvKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIF9kZXYtPmJ1c19pZCk7CiAKLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZDogbHYxX29wZW5fZGV2aWNlIGZhaWxlZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUFDQ0VTOwotCQlnb3RvIGNsZWFuX25vbmU7Ci0JfQotCi0JaWYgKGRldi0+ZF9yZWdpb24tPmRpZC5idXNfaWQpIHsKLQkJcmVzdWx0ID0gcHMzX2RtYV9yZWdpb25fY3JlYXRlKGRldi0+ZF9yZWdpb24pOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9yZWdpb25fY3JlYXRlIGZhaWxlZCAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKLQkJCUJVR19PTigiY2hlY2sgcmVnaW9uIHR5cGUiKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFuX2RldmljZTsKLQkJfQotCX0KLQorCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b19zeXN0ZW1fYnVzX2RydihkZXYpOwogCUJVR19PTighZHJ2KTsKIAogCWlmIChkcnYtPnByb2JlKQpAQCAtMTI2LDU2ICszNzMsMTI3IEBACiAJCXByX2luZm8oIiVzOiVkOiAlcyBubyBwcm9iZSBtZXRob2RcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCWRldi0+Y29yZS5idXNfaWQpOwogCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IGRydi0+cHJvYmUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIGNsZWFuX2RtYTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi1jbGVhbl9kbWE6Ci0JcHMzX2RtYV9yZWdpb25fZnJlZShkZXYtPmRfcmVnaW9uKTsKLWNsZWFuX2RldmljZToKLQlsdjFfY2xvc2VfZGV2aWNlKGRldi0+ZGlkLmJ1c19pZCwgZGV2LT5kaWQuZGV2X2lkKTsKLWNsZWFuX25vbmU6CisJcHJfaW5mbygiIDwtICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPQotCQl0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydjsKKworCUJVR19PTighZGV2KTsKKwlwcl9pbmZvKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIF9kZXYtPmJ1c19pZCk7CisKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoZGV2KTsKKwlCVUdfT04oIWRydik7CiAKIAlpZiAoZHJ2LT5yZW1vdmUpCi0JCWRydi0+cmVtb3ZlKGRldik7CisJCXJlc3VsdCA9IGRydi0+cmVtb3ZlKGRldik7CiAJZWxzZQotCQlwcl9pbmZvKCIlczolZDogJXMgbm8gcmVtb3ZlIG1ldGhvZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJZGV2LT5jb3JlLmJ1c19pZCk7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkICVzOiBubyByZW1vdmUgbWV0aG9kXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CiAKLQlwczNfZG1hX3JlZ2lvbl9mcmVlKGRldi0+ZF9yZWdpb24pOwotCXBzM19mcmVlX21taW9fcmVnaW9uKGRldi0+bV9yZWdpb24pOwotCWx2MV9jbG9zZV9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOworCXByX2luZm8oIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KIAorc3RhdGljIHZvaWQgcHMzX3N5c3RlbV9idXNfc2h1dGRvd24oc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydjsKKworCUJVR19PTighZGV2KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZDogbWF0Y2hfaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CisKKwlpZiAoIWRldi0+Y29yZS5kcml2ZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIGRyaXZlciBib3VuZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoZGV2KTsKKworCUJVR19PTighZHJ2KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlcyAtPiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPmNvcmUuYnVzX2lkLCBkcnYtPmNvcmUubmFtZSk7CisKKwlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5zaHV0ZG93bihkZXYpOworCWVsc2UgaWYgKGRydi0+cmVtb3ZlKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkICVzOiBubyBzaHV0ZG93biwgY2FsbGluZyByZW1vdmVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKKwkJZHJ2LT5yZW1vdmUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCAlczogbm8gc2h1dGRvd24gbWV0aG9kXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CisJCUJVRygpOworCX0KKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKK30KKworc3RhdGljIGludCBwczNfc3lzdGVtX2J1c191ZXZlbnQoc3RydWN0IGRldmljZSAqX2RldiwgY2hhciAqKmVudnAsCisJCQkJIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgaSA9IDAsIGxlbmd0aCA9IDA7CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLAorCQkJICAgJmxlbmd0aCwgIk1PREFMSUFTPXBzMzolZCIsCisJCQkgICBkZXYtPm1hdGNoX2lkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnZwW2ldID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYSwKKwljaGFyICpidWYpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJwczM6JWRcbiIsIGRldi0+bWF0Y2hfaWQpOworCisJcmV0dXJuIChsZW4gPj0gUEFHRV9TSVpFKSA/IChQQUdFX1NJWkUgLSAxKSA6IGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBzM19zeXN0ZW1fYnVzX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhtb2RhbGlhcyksCisJX19BVFRSX05VTEwsCit9OworCiBzdHJ1Y3QgYnVzX3R5cGUgcHMzX3N5c3RlbV9idXNfdHlwZSA9IHsKIAkubmFtZSA9ICJwczNfc3lzdGVtX2J1cyIsCiAJLm1hdGNoID0gcHMzX3N5c3RlbV9idXNfbWF0Y2gsCisJLnVldmVudCA9IHBzM19zeXN0ZW1fYnVzX3VldmVudCwKIAkucHJvYmUgPSBwczNfc3lzdGVtX2J1c19wcm9iZSwKIAkucmVtb3ZlID0gcHMzX3N5c3RlbV9idXNfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHBzM19zeXN0ZW1fYnVzX3NodXRkb3duLAorCS5kZXZfYXR0cnMgPSBwczNfc3lzdGVtX2J1c19kZXZfYXR0cnMsCiB9OwogCi1pbnQgX19pbml0IHBzM19zeXN0ZW1fYnVzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zeXN0ZW1fYnVzX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OwogCiAJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltdXRleF9pbml0KCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCXJlc3VsdCA9IGRldmljZV9yZWdpc3RlcigmcHMzX3N5c3RlbV9idXMpOworCUJVR19PTihyZXN1bHQpOworCiAJcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZwczNfc3lzdGVtX2J1c190eXBlKTsKIAlCVUdfT04ocmVzdWx0KTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTg1LDE2ICs1MDMsMTMgQEAKICAqIFJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFuZCBzZXRzIGRtYV9oYW5kbGUKICAqIHRvIHRoZSBkbWEgYWRkcmVzcyAobWFwcGluZykgb2YgdGhlIGZpcnN0IHBhZ2UuCiAgKi8KLQogc3RhdGljIHZvaWQgKiBwczNfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqX2Rldiwgc2l6ZV90IHNpemUsCi0JZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKKwkJCQkgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQogewogCWludCByZXN1bHQ7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHI7CiAKLQlCVUdfT04oIWRldi0+ZF9yZWdpb24tPmJ1c19hZGRyKTsKLQogCWZsYWcgJj0gfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKTsKIAlmbGFnIHw9IF9fR0ZQX1pFUk87CiAKQEAgLTIwNSw3ICs1MjAsOCBAQAogCQlnb3RvIGNsZWFuX25vbmU7CiAJfQogCi0JcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgdmlydF9hZGRyLCBzaXplLCBkbWFfaGFuZGxlKTsKKwlyZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLCB2aXJ0X2FkZHIsIHNpemUsIGRtYV9oYW5kbGUsCisJCQkgICAgIElPUFRFX1BQX1cgfCBJT1BURV9QUF9SIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKQEAgLTIyNiw3ICs1NDIsNyBAQAogc3RhdGljIHZvaWQgcHMzX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqX2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAogCXBzM19kbWFfdW5tYXAoZGV2LT5kX3JlZ2lvbiwgZG1hX2hhbmRsZSwgc2l6ZSk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKQEAgLTIzOSwxNSArNTU1LDE2IEBACiAgKiBieXRlIHdpdGhpbiB0aGUgcGFnZSBhcyB2YWRkci4KICAqLwogCi1zdGF0aWMgZG1hX2FkZHJfdCBwczNfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorc3RhdGljIGRtYV9hZGRyX3QgcHMzX3NiX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqX2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOwogCiAJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgKHVuc2lnbmVkIGxvbmcpcHRyLCBzaXplLAotCQkmYnVzX2FkZHIpOworCQkJICAgICAmYnVzX2FkZHIsCisJCQkgICAgIElPUFRFX1BQX1IgfCBJT1BURV9QUF9XIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKQEAgLTI1NywxMCArNTc0LDQ0IEBACiAJcmV0dXJuIGJ1c19hZGRyOwogfQogCitzdGF0aWMgZG1hX2FkZHJfdCBwczNfaW9jMF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHZvaWQgKnB0ciwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CisJdTY0IGlvcHRlX2ZsYWc7CisKKwlpb3B0ZV9mbGFnID0gSU9QVEVfTTsKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCWlvcHRlX2ZsYWcgfD0gSU9QVEVfUFBfUiB8IElPUFRFX1BQX1cgfCBJT1BURV9TT19SVzsKKwkJYnJlYWs7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlpb3B0ZV9mbGFnIHw9IElPUFRFX1BQX1IgfCBJT1BURV9TT19SOworCQlicmVhazsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJaW9wdGVfZmxhZyB8PSBJT1BURV9QUF9XIHwgSU9QVEVfU09fUlc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5vdCBoYXBwbmVkICovCisJCUJVRygpOworCX07CisJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgKHVuc2lnbmVkIGxvbmcpcHRyLCBzaXplLAorCQkJICAgICAmYnVzX2FkZHIsIGlvcHRlX2ZsYWcpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfbWFwIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCX0KKwlyZXR1cm4gYnVzX2FkZHI7Cit9CisKIHN0YXRpYyB2b2lkIHBzM191bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqX2RldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKIAlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCWludCByZXN1bHQ7CiAKIAlyZXN1bHQgPSBwczNfZG1hX3VubWFwKGRldi0+ZF9yZWdpb24sIGRtYV9hZGRyLCBzaXplKTsKQEAgLTI3MSwyMCArNjIyLDIwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHBzM19tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorc3RhdGljIGludCBwczNfc2JfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfUFMzX0RZTkFNSUNfRE1BKQogCUJVR19PTigiZG8iKTsKIAlyZXR1cm4gLUVQRVJNOwogI2Vsc2UKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CiAJCWludCByZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLAogCQkJcGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQsIHNnLT5sZW5ndGgsCi0JCQkmc2ctPmRtYV9hZGRyZXNzKTsKKwkJCQkJICZzZy0+ZG1hX2FkZHJlc3MsIDApOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9tYXAgZmFpbGVkICglZClcbiIsCkBAIC0yOTksNyArNjUwLDE1IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgcHMzX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCitzdGF0aWMgaW50IHBzM19pb2MwX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgaW50IG5lbnRzLAorCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUJVRygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwczNfc2JfdW5tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKIAlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19QUzNfRFlOQU1JQ19ETUEpCkBAIC0zMDcsMTggKzY2NiwzNCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB2b2lkIHBzM19pb2MwX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHKCk7Cit9CisKIHN0YXRpYyBpbnQgcHMzX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqX2RldiwgdTY0IG1hc2spCiB7CiAJcmV0dXJuIG1hc2sgPj0gRE1BXzMyQklUX01BU0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBzM19kbWFfb3BzID0geworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcHMzX3NiX2RtYV9vcHMgPSB7CiAJLmFsbG9jX2NvaGVyZW50ID0gcHMzX2FsbG9jX2NvaGVyZW50LAogCS5mcmVlX2NvaGVyZW50ID0gcHMzX2ZyZWVfY29oZXJlbnQsCi0JLm1hcF9zaW5nbGUgPSBwczNfbWFwX3NpbmdsZSwKKwkubWFwX3NpbmdsZSA9IHBzM19zYl9tYXBfc2luZ2xlLAogCS51bm1hcF9zaW5nbGUgPSBwczNfdW5tYXBfc2luZ2xlLAotCS5tYXBfc2cgPSBwczNfbWFwX3NnLAotCS51bm1hcF9zZyA9IHBzM191bm1hcF9zZywKKwkubWFwX3NnID0gcHMzX3NiX21hcF9zZywKKwkudW5tYXBfc2cgPSBwczNfc2JfdW5tYXBfc2csCisJLmRtYV9zdXBwb3J0ZWQgPSBwczNfZG1hX3N1cHBvcnRlZAorfTsKKworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcHMzX2lvYzBfZG1hX29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQgPSBwczNfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQgPSBwczNfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NpbmdsZSA9IHBzM19pb2MwX21hcF9zaW5nbGUsCisJLnVubWFwX3NpbmdsZSA9IHBzM191bm1hcF9zaW5nbGUsCisJLm1hcF9zZyA9IHBzM19pb2MwX21hcF9zZywKKwkudW5tYXBfc2cgPSBwczNfaW9jMF91bm1hcF9zZywKIAkuZG1hX3N1cHBvcnRlZCA9IHBzM19kbWFfc3VwcG9ydGVkCiB9OwogCkBAIC0zMjgsNyArNzAzLDcgQEAKIAogc3RhdGljIHZvaWQgcHMzX3N5c3RlbV9idXNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqX2RldikKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAlrZnJlZShkZXYpOwogfQogCkBAIC0zNDMsMTggKzcxOCwzNyBAQAogaW50IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9jb3VudCA9IDE7CisJc3RhdGljIHVuc2lnbmVkIGludCBkZXZfaW9jMF9jb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9zYl9jb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl92dWFydF9jb3VudDsKIAotCWRldi0+Y29yZS5wYXJlbnQgPSBOVUxMOworCWlmICghZGV2LT5jb3JlLnBhcmVudCkKKwkJZGV2LT5jb3JlLnBhcmVudCA9ICZwczNfc3lzdGVtX2J1czsKIAlkZXYtPmNvcmUuYnVzID0gJnBzM19zeXN0ZW1fYnVzX3R5cGU7CiAJZGV2LT5jb3JlLnJlbGVhc2UgPSBwczNfc3lzdGVtX2J1c19yZWxlYXNlX2RldmljZTsKIAotCWRldi0+Y29yZS5hcmNoZGF0YS5vZl9ub2RlID0gTlVMTDsKLQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfZG1hX29wczsKLQlkZXYtPmNvcmUuYXJjaGRhdGEubnVtYV9ub2RlID0gMDsKKwlzd2l0Y2ggKGRldi0+ZGV2X3R5cGUpIHsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9JT0MwOgorCQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfaW9jMF9kbWFfb3BzOworCQlzbnByaW50ZihkZXYtPmNvcmUuYnVzX2lkLCBzaXplb2YoZGV2LT5jb3JlLmJ1c19pZCksCisJCQkiaW9jMF8lMDJ4IiwgKytkZXZfaW9jMF9jb3VudCk7CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVklDRV9UWVBFX1NCOgorCQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfc2JfZG1hX29wczsKKwkJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLAorCQkJInNiXyUwMngiLCArK2Rldl9zYl9jb3VudCk7CiAKLQlzbnByaW50ZihkZXYtPmNvcmUuYnVzX2lkLCBzaXplb2YoZGV2LT5jb3JlLmJ1c19pZCksICJzYl8lMDJ4IiwKLQkJZGV2X2NvdW50KyspOworCQlicmVhazsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9WVUFSVDoKKwkJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLAorCQkJInZ1YXJ0XyUwMngiLCArK2Rldl92dWFydF9jb3VudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX07CisKKwlkZXYtPmNvcmUuYXJjaGRhdGEub2Zfbm9kZSA9IE5VTEw7CisJZGV2LT5jb3JlLmFyY2hkYXRhLm51bWFfbm9kZSA9IDA7CiAKIAlwcl9kZWJ1ZygiJXM6JWQgYWRkICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Y29yZS5idXNfaWQpOwogCkBAIC0zNjgsOSArNzYyLDE1IEBACiB7CiAJaW50IHJlc3VsdDsKIAorCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKKworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlkcnYtPmNvcmUuYnVzID0gJnBzM19zeXN0ZW1fYnVzX3R5cGU7CiAKIAlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM3OCw3ICs3NzgsOSBAQAogCiB2b2lkIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydikKIHsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMKaW5kZXggMWJhZThiMS4uODAyYTljYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3RpbWUuYwpAQCAtMzksNyArMzksNyBAQAogfQogCiAjZGVmaW5lIGR1bXBfdGltZShfYSkgX2R1bXBfdGltZShfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX3RpbWUoaW50IHRpbWUsIGNvbnN0IGNoYXIqIGZ1bmMsCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF90aW1lKGludCB0aW1lLCBjb25zdCBjaGFyICpmdW5jLAogCWludCBsaW5lKQogewogCXN0cnVjdCBydGNfdGltZSB0bTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQppbmRleCBhZTFmYzkyLi45OTJiYTY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KIG9iai0kKENPTkZJR19YSUNTKQkrPSB4aWNzLm8KIG9iai0kKENPTkZJR19TQ0FOTE9HKQkrPSBzY2FubG9nLm8KLW9iai0kKENPTkZJR19FRUgpCSs9IGVlaC5vIGVlaF9jYWNoZS5vIGVlaF9kcml2ZXIubyBlZWhfZXZlbnQubworb2JqLSQoQ09ORklHX0VFSCkJKz0gZWVoLm8gZWVoX2NhY2hlLm8gZWVoX2RyaXZlci5vIGVlaF9ldmVudC5vIGVlaF9zeXNmcy5vCiBvYmotJChDT05GSUdfS0VYRUMpCSs9IGtleGVjLm8KIG9iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaV9kbHBhci5vCiBvYmotJChDT05GSUdfUENJX01TSSkJKz0gbXNpLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYwppbmRleCA1ZjNlNmQ4Li5iODc3MDM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCkBAIC0xLDYgKzEsOCBAQAogLyoKICAqIGVlaC5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2ZSBFbmdlYnJldHNlbiAmIFRvZGQgSW5nbGV0dCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMSwgMjAwNSwgMjAwNgorICogQ29weXJpZ2h0IERhdmUgRW5nZWJyZXRzZW4gJiBUb2RkIEluZ2xldHQgMjAwMQorICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgMjAwNSwgMjAwNgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTUsNiArMTcsOCBAQAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBQbGVhc2UgYWRkcmVzcyBjb21tZW50cyBhbmQgZmVlZGJhY2sgdG8gTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMTcsNyArMTIxLDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfY2hlY2s7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9tbWlvX2ZmczsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZhbHNlX3Bvc2l0aXZlczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfZmFpbHVyZXM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbG90X3Jlc2V0czsKIAogI2RlZmluZSBJU19CUklER0UoY2xhc3NfY29kZSkgKCgoY2xhc3NfY29kZSk8PDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19CUklER0UpCkBAIC01MDUsNiArNTA4LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUVIOiByZWFkX3Nsb3RfcmVzZXRfc3RhdGUoKSBmYWlsZWQ7IHJjPSVkIGRuPSVzXG4iLAogCQkgICAgICAgcmV0LCBkbi0+ZnVsbF9uYW1lKTsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC01MTMsNiArNTE3LDcgQEAKIAkgKiB0aGV5IGFyZSBlbXB0eSB3aGVuIHRoZXkgZG9uJ3QgaGF2ZSBjaGlsZHJlbi4gKi8KIAlpZiAoKHJldHNbMF0gPT0gNSkgJiYgKGRuLT5jaGlsZCA9PSBOVUxMKSkgewogCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzICsrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTUyMiw2ICs1MjcsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IGV2ZW50IG9uIHVuc3VwcG9ydGVkIGRldmljZSwgcmM9JWQgZG49JXNcbiIsCiAJCSAgICAgICByZXQsIGRuLT5mdWxsX25hbWUpOwogCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzICsrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTUyOSw2ICs1MzUsNyBAQAogCS8qIElmIG5vdCB0aGUga2luZCBvZiBlcnJvciB3ZSBrbm93IGFib3V0LCBwdW50LiAqLwogCWlmIChyZXRzWzBdICE9IDEgJiYgcmV0c1swXSAhPSAyICYmIHJldHNbMF0gIT0gNCAmJiByZXRzWzBdICE9IDUpIHsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC05MjEsNiArOTI4LDcgQEAKIAlwZG4tPmVlaF9tb2RlID0gMDsKIAlwZG4tPmVlaF9jaGVja19jb3VudCA9IDA7CiAJcGRuLT5lZWhfZnJlZXplX2NvdW50ID0gMDsKKwlwZG4tPmVlaF9mYWxzZV9wb3NpdGl2ZXMgPSAwOwogCiAJaWYgKHN0YXR1cyAmJiBzdHJjbXAoc3RhdHVzLCAib2siKSAhPSAwKQogCQlyZXR1cm4gTlVMTDsJLyogaWdub3JlIGRldmljZXMgd2l0aCBiYWQgc3RhdHVzICovCkBAIC0xMTM5LDcgKzExNDcsOCBAQAogCXBkbiA9IFBDSV9ETihkbik7CiAJcGRuLT5wY2lkZXYgPSBkZXY7CiAKLQlwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlIChkZXYpOworCXBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UoZGV2KTsKKwllZWhfc3lzZnNfYWRkX2RldmljZShkZXYpOwogfQogCiB2b2lkIGVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQpAQCAtMTE3OCw2ICsxMTg3LDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiRUVIOiByZW1vdmUgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKICNlbmRpZgogCXBjaV9hZGRyX2NhY2hlX3JlbW92ZV9kZXZpY2UoZGV2KTsKKwllZWhfc3lzZnNfcmVtb3ZlX2RldmljZShkZXYpOwogCiAJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKIAlpZiAoUENJX0ROKGRuKS0+cGNpZGV2KSB7CkBAIC0xMjE0LDExICsxMjI0LDEwIEBACiAJCQkJImNoZWNrIG5vdCB3YW50ZWQ9JWxkXG4iCiAJCQkJImVlaF90b3RhbF9tbWlvX2Zmcz0lbGRcbiIKIAkJCQkiZWVoX2ZhbHNlX3Bvc2l0aXZlcz0lbGRcbiIKLQkJCQkiZWVoX2lnbm9yZWRfZmFpbHVyZXM9JWxkXG4iCiAJCQkJImVlaF9zbG90X3Jlc2V0cz0lbGRcbiIsCiAJCQkJbm9fZGV2aWNlLCBub19kbiwgbm9fY2ZnX2FkZHIsIAogCQkJCWlnbm9yZWRfY2hlY2ssIHRvdGFsX21taW9fZmZzLCAKLQkJCQlmYWxzZV9wb3NpdGl2ZXMsIGlnbm9yZWRfZmFpbHVyZXMsIAorCQkJCWZhbHNlX3Bvc2l0aXZlcywKIAkJCQlzbG90X3Jlc2V0cyk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKaW5kZXggZjJiYWUwNC4uZTQ5YzgxNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwpAQCAtMiw3ICsyLDggQEAKICAqIGVlaF9jYWNoZS5jCiAgKiBQQ0kgYWRkcmVzcyBjYWNoZTsgYWxsb3dzIHRoZSBsb29rdXAgb2YgUENJIGRldmljZXMgYmFzZWQgb24gSS9PIGFkZHJlc3MKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA0CisgKiBDb3B5cmlnaHQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IDIwMDQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI5NSw2ICsyOTYsOCBAQAogCQkJY29udGludWU7CiAJCXBjaV9kZXZfZ2V0IChkZXYpOyAgLyogbWF0Y2hpbmcgcHV0IGlzIGluIGVlaF9yZW1vdmVfZGV2aWNlKCkgKi8KIAkJUENJX0ROKGRuKS0+cGNpZGV2ID0gZGV2OworCisJCWVlaF9zeXNmc19hZGRfZGV2aWNlKGRldik7CiAJfQogCiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCmluZGV4IDE2MWE1ODQuLjE1ZTAxNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBQQ0kgRXJyb3IgUmVjb3ZlcnkgRHJpdmVyIGZvciBSUEEtY29tcGxpYW50IFBQQzY0IHBsYXRmb3JtLgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IExpbmFzIFZlcHN0YXMgPGxpbmFzQGxpbmFzLm9yZz4KKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNCAyMDA1CisgKiBDb3B5cmlnaHQgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPiAyMDA0LCAyMDA1CiAgKgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0xOSw4ICsyMCw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKgotICogU2VuZCBmZWVkYmFjayB0byA8bGluYXNAdXMuaWJtLmNvbT4KLSAqCisgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogU3lzZnMgZW50cmllcyBmb3IgUENJIEVycm9yIFJlY292ZXJ5IGZvciBQQVBSLWNvbXBsaWFudCBwbGF0Zm9ybS4KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNworICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPiAyMDA3CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisKKy8qKgorICogRUVIX1NIT1dfQVRUUiAtLSBjcmVhdGUgc3lzZnMgZW50cnkgZm9yIGVlaCBzdGF0aXN0aWMKKyAqIEBfbmFtZTogbmFtZSBvZiBmaWxlIGluIHN5c2ZzIGRpcmVjdG9yeQorICogQF9tZW1iOiBuYW1lIG9mIG1lbWJlciBpbiBzdHJ1Y3QgcGNpX2RuIHRvIGFjY2VzcworICogQF9mb3JtYXQ6IHByaW50ZiBmb3JtYXQgZm9yIGRpc3BsYXkKKyAqCisgKiBBbGwgb2YgdGhlIGF0dHJpYnV0ZXMgbG9vayB2ZXJ5IHNpbWlsYXIsIHNvIGp1c3QKKyAqIGF1dG8tZ2VuIGEgY3V0LW4tcGFzdGUgcm91dGluZSB0byBkaXNwbGF5IHRoZW0uCisgKi8KKyNkZWZpbmUgRUVIX1NIT1dfQVRUUihfbmFtZSxfbWVtYixfZm9ybWF0KSAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IGVlaF9zaG93XyMjX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCAgICAgIFwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOyAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOyBcCisJc3RydWN0IHBjaV9kbiAqcGRuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoIWRuIHx8IFBDSV9ETihkbikgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcGRuID0gUENJX0ROKGRuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgX2Zvcm1hdCAiXG4iLCBwZG4tPl9tZW1iKTsgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgU19JUlVHTywgZWVoX3Nob3dfIyNfbmFtZSwgTlVMTCk7CisKKworRUVIX1NIT1dfQVRUUihlZWhfbW9kZSwgZWVoX21vZGUsICIweCV4Iik7CitFRUhfU0hPV19BVFRSKGVlaF9jb25maWdfYWRkciwgZWVoX2NvbmZpZ19hZGRyLCAiMHgleCIpOworRUVIX1NIT1dfQVRUUihlZWhfcGVfY29uZmlnX2FkZHIsIGVlaF9wZV9jb25maWdfYWRkciwgIjB4JXgiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2NoZWNrX2NvdW50LCBlZWhfY2hlY2tfY291bnQsICIlZCIpOworRUVIX1NIT1dfQVRUUihlZWhfZnJlZXplX2NvdW50LCBlZWhfZnJlZXplX2NvdW50LCAiJWQiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2ZhbHNlX3Bvc2l0aXZlcywgZWVoX2ZhbHNlX3Bvc2l0aXZlcywgIiVkIik7CisKK3ZvaWQgZWVoX3N5c2ZzX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHJjPTA7CisKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9tb2RlKTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jb25maWdfYWRkcik7CisJcmMgKz0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfcGVfY29uZmlnX2FkZHIpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2NoZWNrX2NvdW50KTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mYWxzZV9wb3NpdGl2ZXMpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2ZyZWV6ZV9jb3VudCk7CisKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVFSDogVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBlbnRyaWVzXG4iKTsKK30KKwordm9pZCBlZWhfc3lzZnNfcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9tb2RlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jb25maWdfYWRkcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfcGVfY29uZmlnX2FkZHIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2NoZWNrX2NvdW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mYWxzZV9wb3NpdGl2ZXMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2ZyZWV6ZV9jb3VudCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IDM2MmRmYmMuLjhjYzZlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtMzczLDEyICszNzMsMjMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHNpemVfYnl0ZXMgPSAxVUwgPDwgcHBjNjRfcGZ0X3NpemU7CiAJdW5zaWduZWQgbG9uZyBocHRlX2NvdW50ID0gc2l6ZV9ieXRlcyA+PiA0OwotCXVuc2lnbmVkIGxvbmcgZHVtbXkxLCBkdW1teTI7CisJdW5zaWduZWQgbG9uZyBkdW1teTEsIGR1bW15MiwgZHdvcmQwOworCWxvbmcgbHBhcl9yYzsKIAlpbnQgaTsKIAogCS8qIFRPRE86IFVzZSBidWxrIGNhbGwgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKQotCQlwbHBhcl9wdGVfcmVtb3ZlX3JhdygwLCBpLCAwLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKSB7CisJCS8qIGRvbnQgcmVtb3ZlIEhQVEVzIHdpdGggVlJNQSBtYXBwaW5ncyAqLworCQlscGFyX3JjID0gcGxwYXJfcHRlX3JlbW92ZV9yYXcoSF9BTkRDT05ELCBpLCBIUFRFX1ZfMVRCX1NFRywKKwkJCQkJCSZkdW1teTEsICZkdW1teTIpOworCQlpZiAobHBhcl9yYyA9PSBIX05PVF9GT1VORCkgeworCQkJbHBhcl9yYyA9IHBscGFyX3B0ZV9yZWFkX3JhdygwLCBpLCAmZHdvcmQwLCAmZHVtbXkxKTsKKwkJCWlmICghbHBhcl9yYyAmJiAoKGR3b3JkMCAmIEhQVEVfVl9WUk1BX01BU0spCisJCQkJIT0gSFBURV9WX1ZSTUFfTUFTSykpCisJCQkJLyogQ2FuIGJlIGhwdGUgZm9yIDFUQiBTZWcuIFNvIHJlbW92ZSBpdCAqLworCQkJCXBscGFyX3B0ZV9yZW1vdmVfcmF3KDAsIGksIDAsICZkdW1teTEsICZkdW1teTIpOworCQl9CisJfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCmluZGV4IGZmYWY2YzUuLjQ3ZjBlMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKQEAgLTExMCw4ICsxMTAsNiBAQAogCQkJfQogCQl9CiAJfQotCi0JZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKGJ1cyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyk7CiAKQEAgLTEzOSw2ICsxMzcsOCBAQAogCiAJLyogTWFrZSB0aGUgZGlzY292ZXJlZCBkZXZpY2VzIGF2YWlsYWJsZSAqLwogCXBjaV9idXNfYWRkX2RldmljZXMoY2hpbGRfYnVzKTsKKworCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShjaGlsZF9idXMpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzEsNiArMTcxLDcgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZidXMtPmRldmljZXMpKSB7CiAJCQlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhidXMsIDApOwogCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCQkJZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKGJ1cyk7CiAJCX0KIAl9IGVsc2UgaWYgKG1vZGUgPT0gUENJX1BST0JFX05PUk1BTCkgewogCQkvKiB1c2UgbGVnYWN5IHByb2JlICovCkBAIC0xNzksNiArMTgwLDcgQEAKIAkJaWYgKG51bSkgewogCQkJcGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMoYnVzLCAxKTsKIAkJCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKKwkJCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShidXMpOwogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KQpAQCAtMjAwLDggKzIwMiw2IEBACiAJcnRhc19zZXR1cF9waGIocGhiKTsKIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYiwgZG4sIDApOwogCi0JcGNpX3NldHVwX3BoYl9pb19keW5hbWljKHBoYiwgcHJpbWFyeSk7Ci0KIAlwY2lfZGV2c19waGJfaW5pdF9keW5hbWljKHBoYik7CiAKIAlpZiAoZG4tPmNoaWxkKQpAQCAtMjEwLDYgKzIxMCw3IEBACiAJc2Nhbl9waGIocGhiKTsKIAlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhwaGItPmJ1cywgMCk7CiAJcGNpX2J1c19hZGRfZGV2aWNlcyhwaGItPmJ1cyk7CisJZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKHBoYi0+YnVzKTsKIAogCXJldHVybiBwaGI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCmluZGV4IDJlNGQxMGMuLmQwMDNjODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCkBAIC0xMDgsNiArMTA4LDIxIEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBwbHBhcl9wdGVfcmVhZF9yYXcgY2FuIGJlIGNhbGxlZCBpbiByZWFsIG1vZGUuIEl0IGNhbGxzIHBscGFyX2hjYWxsX3JhdyAqLworc3RhdGljIGlubGluZSBsb25nIHBscGFyX3B0ZV9yZWFkX3Jhdyh1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIHB0ZXgsCisJCXVuc2lnbmVkIGxvbmcgKm9sZF9wdGVoX3JldCwgdW5zaWduZWQgbG9uZyAqb2xkX3B0ZWxfcmV0KQoreworCWxvbmcgcmM7CisJdW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTExfQlVGU0laRV07CisKKwlyYyA9IHBscGFyX2hjYWxsX3JhdyhIX1JFQUQsIHJldGJ1ZiwgZmxhZ3MsIHB0ZXgpOworCisJKm9sZF9wdGVoX3JldCA9IHJldGJ1ZlswXTsKKwkqb2xkX3B0ZWxfcmV0ID0gcmV0YnVmWzFdOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW5saW5lIGxvbmcgcGxwYXJfcHRlX3Byb3RlY3QodW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBwdGV4LAogCQl1bnNpZ25lZCBsb25nIGF2cG4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXMuaAppbmRleCAyNzI5ZDU1Li42MWUxOWY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzLmgKQEAgLTMzLDYgKzMzLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9rZXhlY19jcHVfZG93bl9tcGljKHZvaWQpIHsgfQogI2VuZGlmCiAKK2V4dGVybiB2b2lkIHBTZXJpZXNfZmluYWxfZml4dXAodm9pZCk7CisKIC8qIFBvd2Vyb24gZmxhZyB1c2VkIGZvciBlbmFibGluZyBhdXRvIHVwcyByZXN0YXJ0ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBydGFzX3Bvd2Vyb25fYXV0bzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCA1YWE5N2FmLi5jMDJmODc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJc3RyY3B5KG5wLT5mdWxsX25hbWUsIHBhdGgpOwogCiAJbnAtPnByb3BlcnRpZXMgPSBwcm9wbGlzdDsKLQlPRl9NQVJLX0RZTkFNSUMobnApOworCW9mX25vZGVfc2V0X2ZsYWcobnAsIE9GX0RZTkFNSUMpOwogCWtyZWZfaW5pdCgmbnAtPmtyZWYpOwogCiAJbnAtPnBhcmVudCA9IGRlcml2ZV9wYXJlbnQocGF0aCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCmluZGV4IGEwMzFkOTkuLjU5ZTY5ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCkBAIC0zOTksNiArMzk5LDcgQEAKIAkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCiAJICovCiAJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKKwlnZXRfbHBwYWNhKCktPmRvbmF0ZV9kZWRpY2F0ZWRfY3B1ID0gMTsKIAogCS8qCiAJICogV2UgY29tZSBpbiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGFuZCBuZWVkX3Jlc2NoZWQoKQpAQCAtNDMxLDYgKzQzMiw3IEBACiAKIG91dDoKIAlITVRfbWVkaXVtKCk7CisJZ2V0X2xwcGFjYSgpLT5kb25hdGVfZGVkaWNhdGVkX2NwdSA9IDA7CiAJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKaW5kZXggZjFkZjk0Mi4uNWJkOTBhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCkBAIC0xNTYsOSArMTU2LDkgQEAKIAogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSkKK3N0YXRpYyBpbnQgZ2V0X2lycV9zZXJ2ZXIodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBzdHJpY3RfY2hlY2spCiB7Ci0JdW5zaWduZWQgaW50IHNlcnZlcjsKKwlpbnQgc2VydmVyOwogCS8qIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUgKi8KIAljcHVtYXNrX3QgY3B1bWFzayA9IGlycV9kZXNjW3ZpcnFdLmFmZmluaXR5OwogCWNwdW1hc2tfdCB0bXAgPSBDUFVfTUFTS19OT05FOwpAQCAtMTY2LDIyICsxNjYsMjUgQEAKIAlpZiAoIWRpc3RyaWJ1dGVfaXJxcykKIAkJcmV0dXJuIGRlZmF1bHRfc2VydmVyOwogCi0JaWYgKGNwdXNfZXF1YWwoY3B1bWFzaywgQ1BVX01BU0tfQUxMKSkgewotCQlzZXJ2ZXIgPSBkZWZhdWx0X2Rpc3RyaWJfc2VydmVyOwotCX0gZWxzZSB7CisJaWYgKCFjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKIAkJY3B1c19hbmQodG1wLCBjcHVfb25saW5lX21hcCwgY3B1bWFzayk7CiAKLQkJaWYgKGNwdXNfZW1wdHkodG1wKSkKLQkJCXNlcnZlciA9IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7Ci0JCWVsc2UKLQkJCXNlcnZlciA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoZmlyc3RfY3B1KHRtcCkpOworCQlzZXJ2ZXIgPSBmaXJzdF9jcHUodG1wKTsKKworCQlpZiAoc2VydmVyIDwgTlJfQ1BVUykKKwkJCXJldHVybiBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHNlcnZlcik7CisKKwkJaWYgKHN0cmljdF9jaGVjaykKKwkJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR1cm4gc2VydmVyOworCWlmIChjcHVzX2VxdWFsKGNwdV9vbmxpbmVfbWFwLCBjcHVfcHJlc2VudF9tYXApKQorCQlyZXR1cm4gZGVmYXVsdF9kaXN0cmliX3NlcnZlcjsKIAorCXJldHVybiBkZWZhdWx0X3NlcnZlcjsKIH0KICNlbHNlCi1zdGF0aWMgaW50IGdldF9pcnFfc2VydmVyKHVuc2lnbmVkIGludCB2aXJxKQorc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHN0cmljdF9jaGVjaykKIHsKIAlyZXR1cm4gZGVmYXVsdF9zZXJ2ZXI7CiB9CkBAIC0xOTIsNyArMTk1LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCWludCBjYWxsX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgc2VydmVyOworCWludCBzZXJ2ZXI7CiAKIAlwcl9kZWJ1ZygieGljczogdW5tYXNrIHZpcnEgJWRcbiIsIHZpcnEpOwogCkBAIC0yMDEsNyArMjA0LDcgQEAKIAlpZiAoaXJxID09IFhJQ1NfSVBJIHx8IGlycSA9PSBYSUNTX0lSUV9TUFVSSU9VUykKIAkJcmV0dXJuOwogCi0Jc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIodmlycSk7CisJc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIodmlycSwgMCk7CiAKIAljYWxsX3N0YXR1cyA9IHJ0YXNfY2FsbChpYm1fc2V0X3hpdmUsIDMsIDEsIE5VTEwsIGlycSwgc2VydmVyLAogCQkJCURFRkFVTFRfUFJJT1JJVFkpOwpAQCAtMzk4LDggKzQwMSw3IEBACiAJdW5zaWduZWQgaW50IGlycTsKIAlpbnQgc3RhdHVzOwogCWludCB4aWNzX3N0YXR1c1syXTsKLQl1bnNpZ25lZCBsb25nIG5ld21hc2s7Ci0JY3B1bWFza190IHRtcCA9IENQVV9NQVNLX05PTkU7CisJaW50IGlycV9zZXJ2ZXI7CiAKIAlpcnEgPSAodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnE7CiAJaWYgKGlycSA9PSBYSUNTX0lQSSB8fCBpcnEgPT0gWElDU19JUlFfU1BVUklPVVMpCkBAIC00MTMsMTggKzQxNSwyMSBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogRm9yIHRoZSBtb21lbnQgb25seSBpbXBsZW1lbnQgZGVsaXZlcnkgdG8gYWxsIGNwdXMgb3Igb25lIGNwdSAqLwotCWlmIChjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKLQkJbmV3bWFzayA9IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7Ci0JfSBlbHNlIHsKLQkJY3B1c19hbmQodG1wLCBjcHVfb25saW5lX21hcCwgY3B1bWFzayk7Ci0JCWlmIChjcHVzX2VtcHR5KHRtcCkpCi0JCQlyZXR1cm47Ci0JCW5ld21hc2sgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGZpcnN0X2NwdSh0bXApKTsKKwkvKgorCSAqIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUuCisJICogR2V0IGN1cnJlbnQgaXJxX3NlcnZlciBmb3IgdGhlIGdpdmVuIGlycQorCSAqLworCWlycV9zZXJ2ZXIgPSBnZXRfaXJxX3NlcnZlcihpcnEsIDEpOworCWlmIChpcnFfc2VydmVyID09IC0xKSB7CisJCWNoYXIgY3B1bGlzdFsxMjhdOworCQljcHVtYXNrX3NjbnByaW50ZihjcHVsaXN0LCBzaXplb2YoY3B1bGlzdCksIGNwdW1hc2spOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4aWNzX3NldF9hZmZpbml0eTogTm8gb25saW5lIGNwdXMgaW4gIgorCQkJCSJ0aGUgbWFzayAlcyBmb3IgaXJxICVkXG4iLCBjcHVsaXN0LCB2aXJxKTsKKwkJcmV0dXJuOwogCX0KIAogCXN0YXR1cyA9IHJ0YXNfY2FsbChpYm1fc2V0X3hpdmUsIDMsIDEsIE5VTEwsCi0JCQkJaXJxLCBuZXdtYXNrLCB4aWNzX3N0YXR1c1sxXSk7CisJCQkJaXJxLCBpcnFfc2VydmVyLCB4aWNzX3N0YXR1c1sxXSk7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieGljc19zZXRfYWZmaW5pdHk6IGlycT0ldSBpYm0sc2V0LXhpdmUgIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggYzNjZTBiZC4uZjY1MDc4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC01LDcgKzUsNiBAQAogbXBpYy1tc2ktb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IG1waWNfbXNpLm8gbXBpY191M21zaS5vCiBvYmotJChDT05GSUdfTVBJQykJCSs9IG1waWMubyAkKG1waWMtbXNpLW9iai15KQogCi1vYmotJChDT05GSUdfUFBDX0lORElSRUNUX1BDSSkJKz0gaW5kaXJlY3RfcGNpLm8KIG9iai0kKENPTkZJR19QUENfTVBDMTA2KQkrPSBncmFja2xlLm8KIG9iai0kKENPTkZJR19QUENfRENSKQkJKz0gZGNyLm8KIG9iai0kKENPTkZJR19QUENfRENSX05BVElWRSkJKz0gZGNyLWxvdy5vCkBAIC0xMywxNiArMTIsMTkgQEAKIG9iai0kKENPTkZJR19VM19EQVJUKQkJKz0gZGFydF9pb21tdS5vCiBvYmotJChDT05GSUdfTU1JT19OVlJBTSkJKz0gbW1pb19udnJhbS5vCiBvYmotJChDT05GSUdfRlNMX1NPQykJCSs9IGZzbF9zb2Mubwotb2JqLSQoQ09ORklHX0ZTTF9QQ0lFKQkJKz0gZnNsX3BjaWUubwogb2JqLSQoQ09ORklHX1RTSTEwOF9CUklER0UpCSs9IHRzaTEwOF9wY2kubyB0c2kxMDhfZGV2Lm8KIG9iai0kKENPTkZJR19RVUlDQ19FTkdJTkUpCSs9IHFlX2xpYi8KIG12NjR4NjAtJChDT05GSUdfUENJKQkJKz0gbXY2NHg2MF9wY2kubwogb2JqLSQoQ09ORklHX01WNjRYNjApCQkrPSAkKG12NjR4NjAteSkgbXY2NHg2MF9waWMubyBtdjY0eDYwX2Rldi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9DTU9TKQkrPSBydGNfY21vc19zZXR1cC5vCiAKICMgY29udGFpbnMgb25seSB0aGUgc3VzcGVuZCBoYW5kbGVyIGZvciB0aW1lCitpZmVxICgkKENPTkZJR19SVENfQ0xBU1MpLCkKIG9iai0kKENPTkZJR19QTSkJCSs9IHRpbWVyLm8KK2VuZGlmCiAKIGlmZXEgKCQoQ09ORklHX1BQQ19NRVJHRSkseSkKK29iai0kKENPTkZJR19QUENfSU5ESVJFQ1RfUENJKQkrPSBpbmRpcmVjdF9wY2kubwogb2JqLSQoQ09ORklHX1BQQ19JODI1OSkJCSs9IGk4MjU5Lm8KIG9iai0kKENPTkZJR19QUENfODN4eCkJCSs9IGlwaWMubwogb2JqLSQoQ09ORklHXzR4eCkJCSs9IHVpYy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWMwN2UuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciBpbmRpcmVjdCBQQ0kgYnJpZGdlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggR2FicmllbCBQYXViZXJ0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIlRlbXBvcmFyeSIgTVBDODU0OCBFcnJhdGEgZmlsZSAtCi0gKiBUaGUgc3RhbmRhcmQgaW5kaXJlY3RfcGNpIGNvZGUgc2hvdWxkIHdvcmsgd2l0aCBmdXR1cmUgc2lsaWNvbiB2ZXJzaW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0KLSNkZWZpbmUgUENJX0NGR19PVVQgb3V0X2JlMzIKLQotLyogRVJSQVRBIFBDSS1FeCAxNCBQQ0lFIENvbnRyb2xsZXIgdGltZW91dCAqLwotI2RlZmluZSBQQ0lFX0ZJWAkJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIrMHg0LCAweDA0MDBmZmZmKQotCi0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3JlYWRfY29uZmlnX3BjaWUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAotCQkgICAgIGludCBsZW4sIHUzMiAqdmFsKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKLQl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOwotCXUzMiB0ZW1wOwotCi0JaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCi0JCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JLyogUG9zc2libGUgYXJ0aWZhY3Qgb2YgQ0RDcHA1MDkzNyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gKi8KLQlpZiAoZGV2Zm4gIT0gMHgwICYmIGJ1cy0+bnVtYmVyID09IDB4ZmYpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQlQQ0lFX0ZJWDsKLQlpZiAoYnVzLT5udW1iZXIgPT0gMHhmZikgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMCB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9IGVsc2UgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMSB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlQQ0lFX0ZJWDsKLQl0ZW1wID0gaW5fbGUzMihjZmdfZGF0YSk7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCSp2YWwgPSAodGVtcCA+PiAoKChvZmZzZXQgJiAzKSkqOCkpICYgMHhmZjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpKjgpKSAmIDB4ZmZmZjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IHRlbXA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCi0JCSAgICAgIGludCBsZW4sIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwotCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7Ci0JdTMyIHRlbXA7Ci0KLQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKLQkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkvKiBQb3NzaWJsZSBhcnRpZmFjdCBvZiBDRENwcDUwOTM3IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiAqLwotCWlmIChkZXZmbiAhPSAweDAgJiYgYnVzLT5udW1iZXIgPT0gMHhmZikKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCVBDSUVfRklYOwotCWlmIChidXMtPm51bWJlciA9PSAweGZmKSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgICgweDgwMDAwMDAwIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKLQkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOwotCX0gZWxzZSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgICgweDgwMDAwMDAxIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKLQkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOwotICAgICAgICB9Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlzd2l0Y2ggKGxlbikgewotCWNhc2UgMToKLQkJUENJRV9GSVg7Ci0JCXRlbXAgPSBpbl9sZTMyKGNmZ19kYXRhKTsKLQkJdGVtcCA9ICh0ZW1wICYgfigweGZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpIHwKLQkJCSh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKLQkJUENJRV9GSVg7Ci0JCW91dF9sZTMyKGNmZ19kYXRhLCB0ZW1wKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlQQ0lFX0ZJWDsKLQkJdGVtcCA9IGluX2xlMzIoY2ZnX2RhdGEpOwotCQl0ZW1wID0gKHRlbXAgJiB+KDB4ZmZmZiA8PCAoKG9mZnNldCAmIDMpICogOCkpKTsKLQkJdGVtcCB8PSAodmFsIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkgOwotCQlQQ0lFX0ZJWDsKLQkJb3V0X2xlMzIoY2ZnX2RhdGEsIHRlbXApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQQ0lFX0ZJWDsKLQkJb3V0X2xlMzIoY2ZnX2RhdGEsIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQlQQ0lFX0ZJWDsKLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgaW5kaXJlY3RfcGNpZV9vcHMgPSB7Ci0JaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZSwKLQlpbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZQotfTsKLQotdm9pZCBfX2luaXQKLXNldHVwX2luZGlyZWN0X3BjaWVfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCB2b2lkIF9faW9tZW0gKiBjZmdfYWRkciwKLQl2b2lkIF9faW9tZW0gKiBjZmdfZGF0YSkKLXsKLQlob3NlLT5jZmdfYWRkciA9IGNmZ19hZGRyOwotCWhvc2UtPmNmZ19kYXRhID0gY2ZnX2RhdGE7Ci0JaG9zZS0+b3BzID0gJmluZGlyZWN0X3BjaWVfb3BzOwotfQotCi12b2lkIF9faW5pdAotc2V0dXBfaW5kaXJlY3RfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQotewotCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOwotCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKLQotCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOwotCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOwotCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCi0JCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKLQlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKLQlzZXR1cF9pbmRpcmVjdF9wY2llX25vbWFwKGhvc2UsIGFkZHIsIGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCBjYWQxNzU3Li5jMGRkYzgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMTAyOCw2ICsxMDI4LDE5IEBACiAKIGFyY2hfaW5pdGNhbGwoZnNfZW5ldF9vZl9pbml0KTsKIAorc3RhdGljIGludCBfX2luaXQgZnNsX3BjbWNpYV9vZl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJLyoKKwkgKiBSZWdpc3RlciBhbGwgdGhlIGRldmljZXMgd2hpY2ggdHlwZSBpcyAicGNtY2lhIgorCSAqLworCXdoaWxlICgobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwKKwkJCSJwY21jaWEiLCAiZnNsLHBxLXBjbWNpYSIpKSAhPSBOVUxMKQorCQkJICAgIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJtOHh4LXBjbWNpYSIsIE5VTEwpOworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGZzbF9wY21jaWFfb2ZfaW5pdCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbWNfcmVncyA9ICJyZWdzIjsKIHN0YXRpYyBjb25zdCBjaGFyICpzbWNfcHJhbSA9ICJwcmFtIjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2luZGlyZWN0X3BjaS5jCmluZGV4IGU3MTQ4ODQuLmM3ZTZlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pbmRpcmVjdF9wY2kuYwpAQCAtMzMsMTggKzMzLDI3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7CiAJdTggY2ZnX3R5cGUgPSAwOworCXUzMiBidXNfbm8sIHJlZzsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2Zm4pKQogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAkKLQlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfU0VUX0NGR19UWVBFKQogCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCiAJCQljZmdfdHlwZSA9IDE7CiAKLQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwgCQkJCQkgCi0JCSAoMHg4MDAwMDAwMCB8ICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgfCBjZmdfdHlwZSkpKTsKKwlidXNfbm8gPSAoYnVzLT5udW1iZXIgPT0gaG9zZS0+Zmlyc3RfYnVzbm8pID8KKwkJCWhvc2UtPnNlbGZfYnVzbm8gOiBidXMtPm51bWJlcjsKKworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRykKKwkJcmVnID0gKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwgKG9mZnNldCAmIDB4ZmMpOworCWVsc2UKKwkJcmVnID0gb2Zmc2V0ICYgMHhmYzsKKworCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAorCQkgKDB4ODAwMDAwMDAgfCAoYnVzX25vIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgcmVnIHwgY2ZnX3R5cGUpKTsKIAogCS8qCiAJICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCkBAIC03MiwxOCArODEsMzMgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKIAl1OCBjZmdfdHlwZSA9IDA7CisJdTMyIGJ1c19ubywgcmVnOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0JaWYgKGhvc2UtPnNldF9jZmdfdHlwZSkKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX1NFVF9DRkdfVFlQRSkKIAkJaWYgKGJ1cy0+bnVtYmVyICE9IGhvc2UtPmZpcnN0X2J1c25vKQogCQkJY2ZnX3R5cGUgPSAxOwogCi0JUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsIAkJCQkJIAotCQkgKDB4ODAwMDAwMDAgfCAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCi0JCSAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpIHwgY2ZnX3R5cGUpKSk7CisJYnVzX25vID0gKGJ1cy0+bnVtYmVyID09IGhvc2UtPmZpcnN0X2J1c25vKSA/CisJCQlob3NlLT5zZWxmX2J1c25vIDogYnVzLT5udW1iZXI7CisKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX0VYVF9SRUcpCisJCXJlZyA9ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8IChvZmZzZXQgJiAweGZjKTsKKwllbHNlCisJCXJlZyA9IG9mZnNldCAmIDB4ZmM7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKGJ1c19ubyA8PCAxNikKKwkJICB8IChkZXZmbiA8PCA4KSB8IHJlZyB8IGNmZ190eXBlKSk7CisKKwkvKiBzdXJwcmVzcyBzZXR0aW5nIG9mIFBDSV9QUklNQVJZX0JVUyAqLworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVMpCisJCWlmICgob2Zmc2V0ID09IFBDSV9QUklNQVJZX0JVUykgJiYKKwkJCShidXMtPm51bWJlciA9PSBob3NlLT5maXJzdF9idXNubykpCisJCXZhbCAmPSAweGZmZmZmZjAwOwogCiAJLyoKIAkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKaW5kZXggYWZhMmVlNi4uOWZlMDBlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKQEAgLTQsOSArNCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi1leHRlcm4gc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1wYzh4eF9waWM7Ci0KIGludCBtcGM4eHhfcGljX2luaXQodm9pZCk7CiB1bnNpZ25lZCBpbnQgbXBjOHh4X2dldF9pcnEodm9pZCk7CiAKKy8qCisgKiBTb21lIGludGVybmFsIGludGVycnVwdCByZWdpc3RlcnMgdXNlIGFuIDgtYml0IG1hc2sgZm9yIHRoZSBpbnRlcnJ1cHQKKyAqIGxldmVsIGluc3RlYWQgb2YgYSBudW1iZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludCBta19pbnRfaW50X21hc2sodWludCBtYXNrKQoreworCXJldHVybiAoMSA8PCAoNyAtIChtYXNrLzIpKSk7Cit9CisKICNlbmRpZiAvKiBfUFBDX0tFUk5FTF9QUEM4eHhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCmluZGV4IDRiMGE5YzguLmI2MThmYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L212NjQzeHguaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApAQCAtNDIwLDMgKzQyMSwzMCBAQAogCXJldHVybiBlcnI7CiB9CiBhcmNoX2luaXRjYWxsKG12NjR4NjBfZGV2aWNlX3NldHVwKTsKKworc3RhdGljIGludCBfX2luaXQgbXY2NHg2MF9hZGRfbXBzY19jb25zb2xlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJY29uc3QgY2hhciAqcHJvcDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKKwlpZiAocHJvcCA9PSBOVUxMKQorCQlnb3RvIG5vdF9tcHNjOworCisJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aChwcm9wKTsKKwlpZiAoIW5wKQorCQlnb3RvIG5vdF9tcHNjOworCisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgIm1hcnZlbGwsbXBzYyIpKQorCQlnb3RvIG5vdF9tcHNjOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJsb2NrLWluZGV4IiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlnb3RvIG5vdF9tcHNjOworCisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlNTSIsICooaW50ICopcHJvcCwgTlVMTCk7CisKK25vdF9tcHNjOgorCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChtdjY0eDYwX2FkZF9tcHNjX2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCmluZGV4IGI1YWVmNGMuLjQ1ZGI4NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKQEAgLTEzNywxOCArMTM3LDE1IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKLQogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIAogCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgNCk7Ci0JaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOworCWhvc2UtPnNlbGZfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKIAogCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1WNjR4NjAgUENJIGhvc3QgYnJpZGdlIGF0IDB4JTAxNmxseC4gIgogCSAgICAgICAiRmlybXdhcmUgYnVzIG51bWJlcjogJWQtPiVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwppbmRleCBhYzEyYTQ0Li5mOTcwZTU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDAsNiArNDEsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19zZXRfcWVfbXV4X21paV9tbmcpOwogCiBpbnQgdWNjX3NldF90eXBlKGludCB1Y2NfbnVtLCBzdHJ1Y3QgdWNjX2NvbW1vbiAqcmVncywKIAkJIGVudW0gdWNjX3NwZWVkX3R5cGUgc3BlZWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYwppbmRleCA5MTQzMjM2Li4zZGYyMDJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgpAQCAtNzAsNiArNzEsNyBAQAogCXByaW50ayhLRVJOX0lORk8gImd1ZW1yIDogYWRkciAtIDB4JTA4eCwgdmFsIC0gMHglMDJ4IiwKIAkJICAodTMyKSAmIHVjY2YtPnVmX3JlZ3MtPmd1ZW1yLCB1Y2NmLT51Zl9yZWdzLT5ndWVtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2R1bXBfcmVncyk7CiAKIHUzMiB1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2soaW50IHVjY2ZfbnVtKQogewpAQCAtODUsMTEgKzg3LDEzIEBACiAJZGVmYXVsdDogcmV0dXJuIFFFX0NSX1NVQkJMT0NLX0lOVkFMSUQ7CiAJfQogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2spOwogCiB2b2lkIHVjY19mYXN0X3RyYW5zbWl0X29uX2RlbWFuZChzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YpCiB7CiAJb3V0X2JlMTYoJnVjY2YtPnVmX3JlZ3MtPnV0b2RyLCBVQ0NfRkFTVF9UT0QpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF90cmFuc21pdF9vbl9kZW1hbmQpOwogCiB2b2lkIHVjY19mYXN0X2VuYWJsZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YsIGVudW0gY29tbV9kaXIgbW9kZSkKIHsKQEAgLTExMCw2ICsxMTQsNyBAQAogCX0KIAlvdXRfYmUzMigmdWZfcmVncy0+Z3VtciwgZ3Vtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2VuYWJsZSk7CiAKIHZvaWQgdWNjX2Zhc3RfZGlzYWJsZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YsIGVudW0gY29tbV9kaXIgbW9kZSkKIHsKQEAgLTEzMCw2ICsxMzUsNyBAQAogCX0KIAlvdXRfYmUzMigmdWZfcmVncy0+Z3VtciwgZ3Vtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2Rpc2FibGUpOwogCiBpbnQgdWNjX2Zhc3RfaW5pdChzdHJ1Y3QgdWNjX2Zhc3RfaW5mbyAqIHVmX2luZm8sIHN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICoqIHVjY2ZfcmV0KQogewpAQCAtMzQxLDYgKzM0Nyw3IEBACiAJKnVjY2ZfcmV0ID0gdWNjZjsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wodWNjX2Zhc3RfaW5pdCk7CiAKIHZvaWQgdWNjX2Zhc3RfZnJlZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YpCiB7CkBAIC0zNTUsMyArMzYyLDQgQEAKIAogCWtmcmVlKHVjY2YpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9mcmVlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc2MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9ydGNfY21vc19zZXR1cC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBTZXR1cCBjb2RlIGZvciBQQy1zdHlsZSBSZWFsLVRpbWUgQ2xvY2suCisgKgorICogQXV0aG9yOiBXYWRlIEZhcm5zd29ydGggPHdmYXJuc3dvcnRoQG12aXN0YS5jb20+CisgKgorICogMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCitzdGF0aWMgaW50ICBfX2luaXQgYWRkX3J0Yyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGQ7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0OworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicG5wUE5QLGIwMCIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CisJb2Zfbm9kZV9wdXQobnApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFJUQ19QT1JUKHgpIGlzIGhhcmRjb2RlZCBpbiBhc20vbWMxNDY4MThydGMuaC4gIFZlcmlmeSB0aGF0IHRoZQorCSAqIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIGRldmljZSBub2RlIG1hdGNoZXMuCisJICovCisJaWYgKHJlcy5zdGFydCAhPSBSVENfUE9SVCgwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJ0Y19jbW9zIiwgLTEsCisJCQkJCSAgICAgJnJlcywgMSk7CisJaWYgKElTX0VSUihwZCkpCisJCXJldHVybiBQVFJfRVJSKHBkKTsKKworCXJldHVybiAwOworfQorZnNfaW5pdGNhbGwoYWRkX3J0Yyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMKaW5kZXggNGEwMTc0OC4uZTgxZTdlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90aW1lci5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdGltZXIuYwpAQCAtMjQsNyArMjQsMTIgQEAKIAogCS8qIGdldCBjdXJyZW50IFJUQyB0aW1lIGFuZCBjb252ZXJ0IHRvIHNlY29uZHMgKi8KIAlnZXRfcnRjX3RpbWUoJmN1cl9ydGNfdG0pOwotCXJ0Y190bV90b190aW1lKCZjdXJfcnRjX3RtLCAmY3VyX3J0Y190aW1lKTsKKwljdXJfcnRjX3RpbWUgPSBta3RpbWUoY3VyX3J0Y190bS50bV95ZWFyICsgMTkwMCwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbW9uICsgMSwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbWRheSwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1faG91ciwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbWluLAorCQkJICAgICAgY3VyX3J0Y190bS50bV9zZWMpOwogCiAJZGlmZiA9IGN1cl9ydGNfdGltZSAtIHN1c3BlbmRfcnRjX3RpbWU7CiAKQEAgLTQ0LDcgKzQ5LDEyIEBACiAJV0FSTl9PTighcHBjX21kLmdldF9ydGNfdGltZSk7CiAKIAlnZXRfcnRjX3RpbWUoJnN1c3BlbmRfcnRjX3RtKTsKLQlydGNfdG1fdG9fdGltZSgmc3VzcGVuZF9ydGNfdG0sICZzdXNwZW5kX3J0Y190aW1lKTsKKwlzdXNwZW5kX3J0Y190aW1lID0gbWt0aW1lKHN1c3BlbmRfcnRjX3RtLnRtX3llYXIgKyAxOTAwLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fbW9uICsgMSwKKwkJCQkgIHN1c3BlbmRfcnRjX3RtLnRtX21kYXksCisJCQkJICBzdXNwZW5kX3J0Y190bS50bV9ob3VyLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fbWluLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fc2VjKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCA3ZDNiMDliLi5hMTEzZDgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtNzIsMTIgKzcyLDExIEBACiAJaW50IHJldDsKIAogCWZvciAobnAgPSBOVUxMLCBpID0gMDsKLQkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJ0c2ktZXRoZXJuZXQiKSkgIT0gTlVMTDsKKwkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJ0c2kxMDgtZXRoZXJuZXQiKSkgIT0gTlVMTDsKIAkgICAgIGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgclsyXTsKLQkJc3RydWN0IGRldmljZV9ub2RlICpwaHk7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5LCAqbWRpbzsKIAkJaHdfaW5mbyB0c2lfZXRoX2RhdGE7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCAqaWQ7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqcGh5X2lkOwogCQljb25zdCB2b2lkICptYWNfYWRkcjsKIAkJY29uc3QgcGhhbmRsZSAqcGg7CkBAIC0xMTEsNiArMTEwLDEzIEBACiAJCWlmIChtYWNfYWRkcikKIAkJCW1lbWNweSh0c2lfZXRoX2RhdGEubWFjX2FkZHIsIG1hY19hZGRyLCA2KTsKIAorCQlwaCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1kaW8taGFuZGxlIiwgTlVMTCk7CisJCW1kaW8gPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG1kaW8sIDAsICZyZXMpOworCQlvZl9ub2RlX3B1dChtZGlvKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5yZWc7CisKIAkJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CiAJCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CiAKQEAgLTExOSwyMCArMTI1LDI1IEBACiAJCQlnb3RvIHVucmVnOwogCQl9CiAKLQkJaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7Ci0JCXBoeV9pZCA9IG9mX2dldF9wcm9wZXJ0eShwaHksICJwaHktaWQiLCBOVUxMKTsKLQkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShwaHksIDAsICZyZXMpOwotCQlpZiAocmV0KSB7Ci0JCQlvZl9ub2RlX3B1dChwaHkpOwotCQkJZ290byB1bnJlZzsKLQkJfQorCQlwaHlfaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CisKIAkJdHNpX2V0aF9kYXRhLnJlZ3MgPSByWzBdLnN0YXJ0OwogCQl0c2lfZXRoX2RhdGEucGh5cmVncyA9IHJlcy5zdGFydDsKIAkJdHNpX2V0aF9kYXRhLnBoeSA9ICpwaHlfaWQ7CiAJCXRzaV9ldGhfZGF0YS5pcnFfbnVtID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGh5LCAiYmNtNTR4eCIpKQorCisJCS8qIFNvbWUgYm9hcmRzIHdpdGggdGhlIFRTSTEwOCBicmlkZ2UgKGUuZy4gSG9sbHkpCisJCSAqIGhhdmUgYSBtaXN3aXJpbmcgb2YgdGhlIGV0aGVybmV0IFBIWXMgd2hpY2gKKwkJICogcmVxdWlyZXMgYSB3b3JrYXJvdW5kLiAgVGhlIHNwZWNpYWwKKwkJICogInR4Yy1yeGMtZGVsYXktZGlzYWJsZSIgcHJvcGVydHkgZW5hYmxlcyB0aGlzCisJCSAqIHdvcmthcm91bmQuICBGSVhNRTogTmVlZCB0byBwb3J0IHRoZSB0c2kxMDhfZXRoCisJCSAqIGRyaXZlciBpdHNlbGYgdG8gcGh5bGliIGFuZCB1c2UgYSBub24tbWlzbGVhZGluZworCQkgKiBuYW1lIGZvciB0aGUgd29ya2Fyb3VuZCBmbGFnIC0gaXQncyBub3QgYWN0dWFsbHkgdG8KKwkJICogZG8gd2l0aCB0aGUgbW9kZWwgb2YgUEhZIGluIHVzZSAqLworCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KHBoeSwgInR4Yy1yeGMtZGVsYXktZGlzYWJsZSIsIE5VTEwpKQogCQkJdHNpX2V0aF9kYXRhLnBoeV90eXBlID0gVFNJMTA4X1BIWV9CQ001NFhYOwogCQlvZl9ub2RlX3B1dChwaHkpOworCiAJCXJldCA9CiAJCSAgICBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEodHNpX2V0aF9kZXYsICZ0c2lfZXRoX2RhdGEsCiAJCQkJCSAgICAgc2l6ZW9mKGh3X2luZm8pKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKaW5kZXggMjE1MzE2My4uOTBkYjhhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKQEAgLTY0LDkgKzY0LDEwIEBACiAJCQkgICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgdmFsKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmNmZ19hZGRyOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2ZnVuYykpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmdW5jKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAljZmdfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopKHRzaV9ta19jb25maWdfYWRkcihidXMtPm51bWJlciwKQEAgLTE0OSwxMCArMTUwLDExIEBACiAJCQkgIGludCBsZW4sIHUzMiAqIHZhbCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfYWRkcjsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdTMyIHRlbXA7CiAKIAlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoaG9zZSwgYnVzLT5udW1iZXIsIGRldmZuKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAljZmdfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopKHRzaV9ta19jb25maWdfYWRkcihidXMtPm51bWJlciwKQEAgLTIxOSwxNCArMjIxLDEyIEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAogCWlmICghaG9zZSkgewogCQlwcmludGsoIlBDSSBIb3N0IGJyaWRnZSBpbml0IGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwppbmRleCAyOGZkZjRmLi42NjllNjU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCkBAIC0yNjM0LDcgKzI2MzQsNyBAQAogX19pbml0Y2FsbChzZXR1cF94bW9uX3N5c3JxKTsKICNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KIAotaW50IF9faW5pdGRhdGEgeG1vbl9lYXJseSwgeG1vbl9vZmY7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgeG1vbl9lYXJseSwgeG1vbl9vZmY7CiAKIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3htb24oY2hhciAqcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCmluZGV4IGQzMTlmOWIuLjBkYTU1MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKKysrIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwpAQCAtMzI4LDcgKzMyOCw3IEBACiAJbXRzcHIgICBTUFJOX0wxQ1NSMCxyMwogCWlzeW5jCiAJYmxyCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCiAJbWZzcHIJcjMsU1BSTl9MMUNTUjEKIAlvcmkJcjMscjMsTDFDU1IxX0lDRkl8TDFDU1IxX0lDTEZSCiAJbXRzcHIJU1BSTl9MMUNTUjEscjMKQEAgLTM1NSw3ICszNTUsNyBAQAogX0dMT0JBTChfX2ZsdXNoX2ljYWNoZV9yYW5nZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCWxpCXI1LEwxX0NBQ0hFX0JZVEVTLTEKIAlhbmRjCXIzLHIzLHI1CiAJc3ViZglyNCxyMyxyNApAQCAtNDcyLDcgKzQ3Miw3IEBACiBfR0xPQkFMKF9fZmx1c2hfZGNhY2hlX2ljYWNoZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSkKIAlybHdpbm0JcjMscjMsMCwwLDE5CQkJLyogR2V0IHBhZ2UgYmFzZSBhZGRyZXNzICovCiAJbGkJcjQsNDA5Ni9MMV9DQUNIRV9CWVRFUwkvKiBOdW1iZXIgb2YgbGluZXMgaW4gYSBwYWdlICovCiAJbXRjdHIJcjQKQEAgLTUwMCw3ICs1MDAsNyBAQAogX0dMT0JBTChfX2ZsdXNoX2RjYWNoZV9pY2FjaGVfcGh5cykKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSkKIAltZm1zcglyMTAKIAlybHdpbm0JcjAscjEwLDAsMjgsMjYJCQkvKiBjbGVhciBEUiAqLwogCW10bXNyCXIwCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggYTQxNjUyMC4uNjNmMGE5OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtNjQsNyArNjQsNiBAQAogCiBFWFBPUlRfU1lNQk9MKGNsZWFyX3BhZ2VzKTsKIEVYUE9SVF9TWU1CT0woY2xlYXJfdXNlcl9wYWdlKTsKLUVYUE9SVF9TWU1CT0woZG9fc2lnbmFsKTsKIEVYUE9SVF9TWU1CT0wodHJhbnNmZXJfdG9faGFuZGxlcik7CiBFWFBPUlRfU1lNQk9MKGRvX0lSUSk7CiBFWFBPUlRfU1lNQk9MKG1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKaW5kZXggYzc5NzA0Zi4uOTY3YzFlZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKQEAgLTUyNiw3ICs1MjYsNyBAQAogCSAqIFN5c3RlbXMgd2l0aCBPRiBjYW4gbG9vayBpbiB0aGUgcHJvcGVydGllcyBvbiB0aGUgY3B1IG5vZGUocykKIAkgKiBmb3IgYSBwb3NzaWJseSBtb3JlIGFjY3VyYXRlIHZhbHVlLgogCSAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkpIHsKKwlpZiAoISBjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKSkgewogCQlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKIAkJaWNhY2hlX2JzaXplID0gY3VyX2NwdV9zcGVjLT5pY2FjaGVfYnNpemU7CiAJCXVjYWNoZV9ic2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCmluZGV4IGFlYTEwMGIuLjNmM2IyOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCkBAIC05Miw2ICs5Miw3IEBACiAJaWYgKG5sKQogCQlwcmludGsoIlxuIik7CiAJc2hvd19yZWdzKGZwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAkvKiBkb19leGl0KCkgc2hvdWxkIHRha2UgY2FyZSBvZiBwYW5pYydpbmcgZnJvbSBhbiBpbnRlcnJ1cHQKIAkgKiBjb250ZXh0IHNvIHdlIGRvbid0IGhhbmRsZSBpdCBoZXJlCkBAIC02MTksNyArNjIwLDcgQEAKIAkJCXJldHVybjsKIAogCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfUFIpICYmICAvKiBub3QgdXNlci1tb2RlICovCi0JCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCkgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CisJCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCwgcmVncykgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5uaXAgKz0gNDsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbW0vdGxiLmMgYi9hcmNoL3BwYy9tbS90bGIuYwppbmRleCBmYTI5NzQwLi40ZmYyNjBiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS90bGIuYworKysgYi9hcmNoL3BwYy9tbS90bGIuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYwppbmRleCA2ZjIxMTEwLi4zYzU2NjU0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcmVwX3NldHVwLmMKQEAgLTY5LDkgKzY5LDYgQEAKIAogVE9EQ19BTExPQygpOwogCi11bnNpZ25lZCBjaGFyIHVjQm9hcmRSZXY7Ci11bnNpZ25lZCBjaGFyIHVjQm9hcmRSZXZNYWosIHVjQm9hcmRSZXZNaW47Ci0KIGV4dGVybiB1bnNpZ25lZCBjaGFyIHByZXBfbnZyYW1fcmVhZF92YWwoaW50IGFkZHIpOwogZXh0ZXJuIHZvaWQgcHJlcF9udnJhbV93cml0ZV92YWwoaW50IGFkZHIsCiAJCQkJIHVuc2lnbmVkIGNoYXIgdmFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZSBiL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZQppbmRleCA5NTY5NDE1Li41NDM3OTViIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogCiB3ZHQtbXBjOHh4LSQoQ09ORklHXzh4eF9XRFQpCSs9IG04eHhfd2R0Lm8KIAorb2JqLSQoQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kpCSs9IGluZGlyZWN0X3BjaS5vCiBvYmotJChDT05GSUdfUFBDQlVHX05WUkFNKQkrPSBwcmVwX252cmFtLm8KIG9iai0kKENPTkZJR19QUENfT0NQKQkJKz0gb2NwLm8KIG9iai0kKENPTkZJR19JQk1fT0NQKQkJKz0gaWJtX29jcC5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMgYi9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiMzIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9pbmRpcmVjdF9wY2kuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIFN1cHBvcnQgZm9yIGluZGlyZWN0IFBDSSBicmlkZ2VzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBHYWJyaWVsIFBhdWJlcnQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKworI2lmZGVmIENPTkZJR19QUENfSU5ESVJFQ1RfUENJX0JFCisjZGVmaW5lIFBDSV9DRkdfT1VUIG91dF9iZTMyCisjZWxzZQorI2RlZmluZSBQQ0lfQ0ZHX09VVCBvdXRfbGUzMgorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2luZGlyZWN0X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJICAgICBpbnQgbGVuLCB1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKwl1OCBjZmdfdHlwZSA9IDA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQljZmdfdHlwZSA9IDE7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiAzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbCA9IGluXzgoY2ZnX2RhdGEpOworCQlicmVhazsKKwljYXNlIDI6CisJCSp2YWwgPSBpbl9sZTE2KGNmZ19kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnZhbCA9IGluX2xlMzIoY2ZnX2RhdGEpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludAoraW5kaXJlY3Rfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJICAgICAgaW50IGxlbiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKwl1OCBjZmdfdHlwZSA9IDA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQljZmdfdHlwZSA9IDE7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiAzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJb3V0XzgoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3V0X2xlMTYoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW91dF9sZTMyKGNmZ19kYXRhLCB2YWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIGluZGlyZWN0X3BjaV9vcHMgPQoreworCWluZGlyZWN0X3JlYWRfY29uZmlnLAorCWluZGlyZWN0X3dyaXRlX2NvbmZpZworfTsKKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHZvaWQgX19pb21lbSAqIGNmZ19hZGRyLAorCXZvaWQgX19pb21lbSAqIGNmZ19kYXRhKQoreworCWhvc2UtPmNmZ19hZGRyID0gY2ZnX2FkZHI7CisJaG9zZS0+Y2ZnX2RhdGEgPSBjZmdfZGF0YTsKKwlob3NlLT5vcHMgPSAmaW5kaXJlY3RfcGNpX29wczsKK30KKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOworCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKKworCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOworCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOworCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCisJCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKKwlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKKwlzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoaG9zZSwgYWRkciwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuYyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCmluZGV4IDE2NTQ2NzguLmFjZTRlYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCkBAIC03MSw2ICs3MSwyMSBAQAogCX0sIFwKIH0KIAorLyoKKyAqIE1MMzAwL01MNDAzIFZpZGVvIERldmljZTogc2hvcnRjdXQgbWFjcm8gZm9yIHNpbmdsZSBpbnN0YW5jZQorICovCisjZGVmaW5lIFhQQVJfVEZUKG51bSkgeyBcCisJLm5hbWUgPSAieGlsaW54ZmIiLCBcCisJLmlkID0gbnVtLCBcCisJLm51bV9yZXNvdXJjZXMgPSAxLCBcCisJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7IFwKKwkJeyBcCisJCQkuc3RhcnQgPSBYUEFSX1RGVF8jI251bSMjX0JBU0VBRERSLCBcCisJCQkuZW5kID0gWFBBUl9URlRfIyNudW0jI19CQVNFQUREUis3LCBcCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lPLCBcCisJCX0sIFwKKwl9LCBcCit9CiAKIC8qIFVBUlQgODI1MCBkcml2ZXIgcGxhdGZvcm0gZGF0YSB0YWJsZSAqLwogc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHZpcnRleF9zZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0gewpAQCAtMTQ2LDIwICsxNjEsMTcgQEAKIAlYUEFSX1NZU0FDRSgxKSwKICNlbmRpZgogCi0JLyogTUwzMDAvNDAzIHJlZmVyZW5jZSBkZXNpZ24gZnJhbWVidWZmZXIgKi8KICNpZiBkZWZpbmVkKFhQQVJfVEZUXzBfQkFTRUFERFIpCi0JewotCQkubmFtZQkJPSAieGlsaW54ZmIiLAotCQkuaWQJCT0gMCwKLQkJLm51bV9yZXNvdXJjZXMJPSAxLAotCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKLQkJCXsKLQkJCQkuc3RhcnQJPSBYUEFSX1RGVF8wX0JBU0VBRERSLAotCQkJCS5lbmQJPSBYUEFSX1RGVF8wX0JBU0VBRERSKzcsCi0JCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKLQkJCX0sCi0JCX0sCi0JfSwKKwlYUEFSX1RGVCgwKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfMV9CQVNFQUREUikKKwlYUEFSX1RGVCgxKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfMl9CQVNFQUREUikKKwlYUEFSX1RGVCgyKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfM19CQVNFQUREUikKKwlYUEFSX1RGVCgzKSwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmggYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaAppbmRleCAzZDRiZTE0Li45ZjM4ZDkyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaAorKysgYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaApAQCAtMzEsNCArMzEsMTEgQEAKICAqLwogaW50IHZpcnRleF9kZXZpY2VfZml4dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKIAorLyogU1BJIENvbnRyb2xsZXIgSVAgKi8KK3N0cnVjdCB4c3BpX3BsYXRmb3JtX2RhdGEgeworCXMxNiBidXNfbnVtOworCXUxNiBudW1fY2hpcHNlbGVjdDsKKwl1MzIgc3BlZWRfaHo7Cit9OworCiAjZW5kaWYgIC8qIF9fQVNNX1ZJUlRFWF9ERVZJQ0VTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMmE4ZjA4Ny4uZjQ1MDNjYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC0yOTQsNyArMjk0LDYgQEAKIHN0YXRpYyBpbnQKIGRvX3B0cmFjZV9ub3JtYWwoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlwdHJhY2VfYXJlYSBwYXJlYTsgCiAJaW50IGNvcGllZCwgcmV0OwogCkBAIC0zMDQsMTAgKzMwMyw3IEBACiAJCS8qIFJlbW92ZSBoaWdoIG9yZGVyIGJpdCBmcm9tIGFkZHJlc3MgKG9ubHkgZm9yIDMxIGJpdCkuICovCiAJCWFkZHIgJj0gUFNXX0FERFJfSU5TTjsKIAkJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJcmV0dXJuIHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSBfX3VzZXIgKikgZGF0YSk7CisJCXJldHVybiBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9QRUVLVVNSOgogCQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KQEAgLTMxOCwxMCArMzE0LDcgQEAKIAkJLyogUmVtb3ZlIGhpZ2ggb3JkZXIgYml0IGZyb20gYWRkcmVzcyAob25seSBmb3IgMzEgYml0KS4gKi8KIAkJYWRkciAmPSBQU1dfQUREUl9JTlNOOwogCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwxKTsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YoZGF0YSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgogCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCBlZTkxODZmLi44ZWM5ZGVmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCkBAIC0yNjIsNiArMjYyLDcgQEAKIAlwcmludF9tb2R1bGVzKCk7CiAJc2hvd19yZWdzKHJlZ3MpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTMxOSw3ICszMjAsNyBAQAogCQllbHNlIHsKIAkJCWVudW0gYnVnX3RyYXBfdHlwZSBidHQ7CiAKLQkJCWJ0dCA9IHJlcG9ydF9idWcocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKTsKKwkJCWJ0dCA9IHJlcG9ydF9idWcocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOLCByZWdzKTsKIAkJCWlmIChidHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKQogCQkJCXJldHVybjsKIAkJCWRpZShzdHIsIHJlZ3MsIGludGVycnVwdGlvbl9jb2RlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCAwMzgxNzllLi5kOGVkNjY3IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC01NSw4ICs1NSwyMSBAQAogY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlkZWZfYm9vbCBuCiAKK2NvbmZpZyBTWVNfU1VQUE9SVFNfUE0KKwlib29sCisKIGNvbmZpZyBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgogCWJvb2wKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BNCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfU01QCisJYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX05VTUEKKwlib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfUENJCisJYm9vbAogCiBjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKIAlib29sCkBAIC04MSwyNTcgKzk0LDggQEAKIAogbWVudSAiU3lzdGVtIHR5cGUiCiAKLWNvbmZpZyBTT0xVVElPTl9FTkdJTkUKLQlib29sCi0KLWNob2ljZQotCXByb21wdCAiU3VwZXJIIHN5c3RlbSB0eXBlIgotCWRlZmF1bHQgU0hfVU5LTk9XTgotCi1jb25maWcgU0hfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmUiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCWhlbHAKLQkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQotCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzIyX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzcyMiIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcyMgotCWhlbHAKLQkgIFNlbGVjdCA3NzIyIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzIKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MQotCWhlbHAKLQkgIFNlbGVjdCA3NzUxIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzUxCi0JICBldmFsdWF0aW9uIGJvYXJkLgotCSAgCi1jb25maWcgU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTc3ODAiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3ODAKLQloZWxwCi0JICBTZWxlY3QgNzc4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFNINzc4MAotCSAgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIXzczMDBfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmU3MzAwIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzAwCi0JaGVscAotCSAgU2VsZWN0IDczMDAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQotCSAgU0g3MzAwKFNILU1vYmlsZSBWKSBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzM0M19TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTczNDMiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDczNDMKLQloZWxwCi0JICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKLSAgICAgICBib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzE4MAotCWhlbHAKLQkgIFNlbGVjdCA3MzE4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczMTgwKFNILU1vYmlsZSAzKSBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzc1MV9TWVNURU1ICi0JYm9vbCAiU3lzdGVtSDc3NTFSIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFN5c3RlbUggaWYgeW91IGFyZSBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFN5c3RlbUgKLQkgIDc3NTFSIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF9IUDZYWAotCWJvb2wgIkhQNlhYIgotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgotCWhlbHAKLQkgIFNlbGVjdCBIUDZYWCBpZiBjb25maWd1cmluZyBmb3IgYSBIUCBqb3JuYWRhIEhQNnh4LgotCSAgTW9yZSBpbmZvcm1hdGlvbiAoaGFyZHdhcmUgb25seSkgYXQKLQkgIDxodHRwOi8vd3d3LmhwLmNvbS9qb3JuYWRhLz4uCi0KLWNvbmZpZyBTSF9TQVRVUk4KLQlib29sICJTYXR1cm4iCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzYwNAotCWhlbHAKLQkgIFNlbGVjdCBTYXR1cm4gaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBTYXR1cm4uCi0KLWNvbmZpZyBTSF9EUkVBTUNBU1QKLQlib29sICJEcmVhbWNhc3QiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzA5MQotCWhlbHAKLQkgIFNlbGVjdCBEcmVhbWNhc3QgaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBEcmVhbWNhc3QuCi0JICBNb3JlIGluZm9ybWF0aW9uIGF0Ci0JICA8aHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC9kcmVhbWNhc3QvPi4gIFRoZXJlIGlzIGEKLQkgIERyZWFtY2FzdCBwcm9qZWN0IGlzIGF0IDxodHRwOi8vbGludXhkYy5zb3VyY2Vmb3JnZS5uZXQvPi4KLQotY29uZmlnIFNIX01QQzEyMTEKLQlib29sICJJbnRlcmZhY2UgTVBDMTIxMSIKLQloZWxwCi0JICBDVFAvUENJLVNIMDIgaXMgYSBDUFUgbW9kdWxlIGNvbXB1dGVyIHRoYXQgaXMgcHJvZHVjZWQKLQkgIGJ5IEludGVyZmFjZSBDb3Jwb3JhdGlvbi4KLQkgIE1vcmUgaW5mb3JtYXRpb24gYXQgPGh0dHA6Ly93d3cuaW50ZXJmYWNlLmNvLmpwPgotCi1jb25maWcgU0hfU0gwMwotCWJvb2wgIkludGVyZmFjZSBDVFAvUENJLVNIMDMiCi0JaGVscAotCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCi0JICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCi0JICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KLQotY29uZmlnIFNIX1NFQ1VSRUVER0U1NDEwCi0JYm9vbCAiU2VjdXJlRWRnZTU0MTAiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgU2VjdXJlRWRnZTU0MTAgaWYgY29uZmlndXJpbmcgZm9yIGEgU25hcEdlYXIgU0ggYm9hcmQuCi0JICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIE9FTSBTZWN1cmVFZGdlIHByb2R1Y3RzIGFzIHdlbGwgYXMgdGhlCi0JICBTTUUgcHJvZHVjdCBsaW5lLgotCi1jb25maWcgU0hfSFM3NzUxUlZPSVAKLQlib29sICJIUzc3NTFSVk9JUCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIFNlbGVjdCBIUzc3NTFSVk9JUCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKLQkgIFNhbGVzIFZvSVAgYm9hcmQuCi0KLWNvbmZpZyBTSF83NzEwVk9JUEdXCi0JYm9vbCAiU0g3NzEwLVZPSVAtR1ciCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcxMAotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBidWlsZCBhIGtlcm5lbCBmb3IgdGhlIFNINzcxMCBiYXNlZAotCSAgVk9JUCBHVy4KLQotY29uZmlnIFNIX1JUUzc3NTFSMkQKLQlib29sICJSVFM3NzUxUjJEIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFJUUzc3NTFSMkQgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5Ci0JICBTYWxlcyBTSC1HcmFwaGljcyBib2FyZC4KLQotY29uZmlnIFNIX0hJR0hMQU5ERVIKLQlib29sICJIaWdobGFuZGVyIgotCi1jb25maWcgU0hfRURPU0s3NzA1Ci0JYm9vbCAiRURPU0s3NzA1IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3MDUKLQotY29uZmlnIFNIX1NINDIwMl9NSUNST0RFVgotCWJvb2wgIlNINC0yMDIgTWljcm9EZXYiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINF8yMDIKLQloZWxwCi0JICBTZWxlY3QgU0g0LTIwMiBNaWNyb0RldiBpZiBjb25maWd1cmluZyBmb3IgYSBTdXBlckggTWljcm9EZXYgYm9hcmQKLQkgIHdpdGggYW4gU0g0LTIwMiBDUFUuCi0KLWNvbmZpZyBTSF9MQU5ESVNLCi0JYm9vbCAiTEFORElTSyIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIEktTyBEQVRBIERFVklDRSwgSU5DLiAiTEFORElTSyBTZXJpZXMiIHN1cHBvcnQuCi0KLWNvbmZpZyBTSF9USVRBTgotCWJvb2wgIlRJVEFOIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFRpdGFuIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgTmltYmxlIE1pY3Jvc3lzdGVtcwotCSAgTmV0RW5naW5lIE5QNTFSLgotCi1jb25maWcgU0hfU0hNSU4KLQlib29sICJTSE1JTiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzA2Ci0JaGVscAotCSAgU2VsZWN0IFNITUlOIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgU0hNSU4gYm9hcmQuCi0KLWNvbmZpZyBTSF83MjA2X1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzIwNiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JaGVscAotCSAgU2VsZWN0IDcyMDYgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDcyMDYKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NjE5X1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzYxOSIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NjE5Ci0JaGVscAotCSAgU2VsZWN0IDc2MTkgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc2MTkKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0JCi1jb25maWcgU0hfTEJPWF9SRTIKLQlib29sICJMLUJPWCBSRTIiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgTC1CT1ggUkUyIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyLgotCi1jb25maWcgU0hfVU5LTk9XTgotCWJvb2wgIkJhcmVDUFUiCi0JaGVscAotCSAgIkJhcmUgQ1BVIiBha2EgInVua25vd24iIG1lYW5zIGFuIFNILWJhc2VkIHN5c3RlbSB3aGljaCBpcyBub3Qgb25lCi0JICBvZiB0aGUgc3BlY2lmaWMgb25lcyBtZW50aW9uZWQgYWJvdmUsIHdoaWNoIG1lYW5zIHlvdSBuZWVkIHRvIGVudGVyCi0JICBhbGwgc29ydHMgb2Ygc3R1ZmYgbGlrZSBDT05GSUdfTUVNT1JZX1NUQVJUIGJlY2F1c2UgdGhlIGNvbmZpZwotCSAgc3lzdGVtIGRvZXNuJ3QgYWxyZWFkeSBrbm93IHdoYXQgaXQgaXMuICBZb3UgZ2V0IGEgbWFjaGluZSB2ZWN0b3IKLQkgIHdpdGhvdXQgYW55IHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgaW4gaXQsIHNvIHRoaW5ncyBsaWtlIHRoZSBSVEMgbWF5Ci0JICBub3Qgd29yay4KLQotCSAgVGhpcyBvcHRpb24gaXMgZm9yIHRoZSBlYXJseSBzdGFnZXMgb2YgcG9ydGluZyB0byBhIG5ldyBtYWNoaW5lLgotCi1lbmRjaG9pY2UKLQotc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWciCi1zb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9LY29uZmlnIgotc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZyIKLQogc291cmNlICJhcmNoL3NoL21tL0tjb25maWciCiAKLWNvbmZpZyBDRl9FTkFCTEVSCi0JYm9vbCAiQ29tcGFjdCBGbGFzaCBFbmFibGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTSF9TT0xVVElPTl9FTkdJTkUgfHwgU0hfVU5LTk9XTiB8fCBTSF9TSDAzCi0JLS0taGVscC0tLQotCSAgQ29tcGFjdCBGbGFzaCBpcyBhIHNtYWxsLCByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZSBpbnRyb2R1Y2VkCi0JICBpbiAxOTk0IG9yaWdpbmFsbHkgYXMgYSBQQ01DSUEgZGV2aWNlLiAgSWYgeW91IHNheSBgWScgaGVyZSwgeW91Ci0JICBjb21waWxlIGluIHN1cHBvcnQgZm9yIENvbXBhY3QgRmxhc2ggZGV2aWNlcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KLQkgIGEgU3VwZXJIIHByb2Nlc3Nvci4gIEEgQ29tcGFjdCBGbGFzaCBGQVEgaXMgYXZhaWxhYmxlIGF0Ci0JICA8aHR0cDovL3d3dy5jb21wYWN0Zmxhc2gub3JnL2ZhcXMvZmFxLmh0bT4uCi0KLQkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCBhdCBhcmVhIDUgb3IgNiwKLQkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBvcHRpb24uICBUaGVuLCB5b3UgY2FuIHVzZSBDRiBhcwotCSAgcHJpbWFyeSBJREUgZHJpdmUgKG9ubHkgdGVzdGVkIGZvciBTYW5EaXNrKS4KLQotCSAgSWYgaW4gZG91YnQsIHNlbGVjdCAnTicuCi0KLWNob2ljZQotCXByb21wdCAiQ29tcGFjdCBGbGFzaCBDb25uZWN0aW9uIEFyZWEiCi0JZGVwZW5kcyBvbiBDRl9FTkFCTEVSCi0JZGVmYXVsdCBDRl9BUkVBNgotCi1jb25maWcgQ0ZfQVJFQTUKLQlib29sICJBcmVhNSIKLQloZWxwCi0JICBJZiB5b3VyIGJvYXJkIGhhcyAiRGlyZWN0bHkgQ29ubmVjdGVkIiBDb21wYWN0Rmxhc2gsIFlvdSBzaG91bGQKLQkgIHNlbGVjdCB0aGUgYXJlYSB3aGVyZSB5b3VyIENGIGlzIGNvbm5lY3RlZCB0by4KLQotCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQotCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCi0KLQkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4KLQotY29uZmlnIENGX0FSRUE2Ci0JYm9vbCAiQXJlYTYiCi0KLWVuZGNob2ljZQotCi1jb25maWcgQ0ZfQkFTRV9BRERSCi0JaGV4Ci0JZGVwZW5kcyBvbiBDRl9FTkFCTEVSCi0JZGVmYXVsdCAiMHhiODAwMDAwMCIgaWYgQ0ZfQVJFQTYKLQlkZWZhdWx0ICIweGI0MDAwMDAwIiBpZiBDRl9BUkVBNQotCiBtZW51ICJQcm9jZXNzb3IgZmVhdHVyZXMiCiAKIGNob2ljZQpAQCAtMzUxLDcgKzExNSw3IEBACiAKIGNvbmZpZyBTSF9GUFUKIAlib29sICJGUFUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFDUFVfU0gzCisJZGVwZW5kcyBvbiBDUFVfU0g0CiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIFNIIHByb2Nlc3NvcnMgdGhhdApAQCAtNDM3LDYgKzIwMSwyMDkgQEAKIAogZW5kbWVudQogCittZW51ICJCb2FyZCBzdXBwb3J0IgorCitjb25maWcgU09MVVRJT05fRU5HSU5FCisJYm9vbAorCitjb25maWcgU0hfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmUiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzA5IHx8IENQVV9TVUJUWVBFX1NINzc1MAorCWhlbHAKKwkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQorCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MjA2X1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzIwNiIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDcyMDYKKwloZWxwCisJICBTZWxlY3QgNzIwNiBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzIwNgorCSAgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc2MTlfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NjE5IgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzYxOQorCWhlbHAKKwkgIFNlbGVjdCA3NjE5IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NjE5CisJICBldmFsdWF0aW9uIGJvYXJkLgorCQorY29uZmlnIFNIXzc3MjJfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzIyIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcyMgorCWhlbHAKKwkgIFNlbGVjdCA3NzIyIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzIKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEKKwloZWxwCisJICBTZWxlY3QgNzc1MSBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzc1MQorCSAgZXZhbHVhdGlvbiBib2FyZC4KKwkgIAorY29uZmlnIFNIXzc3ODBfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzgwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwCisJaGVscAorCSAgU2VsZWN0IDc3ODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBTSDc3ODAKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzAwX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzMwMCIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDczMDAKKwloZWxwCisJICBTZWxlY3QgNzMwMCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczMDAoU0gtTW9iaWxlIFYpIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzQzX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzM0MyIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDczNDMKKwloZWxwCisJICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzMxODAKKwloZWxwCisJICBTZWxlY3QgNzMxODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQorCSAgU0g3MzE4MChTSC1Nb2JpbGUgMykgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc3NTFfU1lTVEVNSAorCWJvb2wgIlN5c3RlbUg3NzUxUiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBTZWxlY3QgU3lzdGVtSCBpZiB5b3UgYXJlIGNvbmZpZ3VyaW5nIGZvciBhIFJlbmVzYXMgU3lzdGVtSAorCSAgNzc1MVIgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIX0hQNlhYCisJYm9vbCAiSFA2WFgiCisJc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCisJc2VsZWN0IEhENjQ0NlhfU0VSSUVTCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkKKwloZWxwCisJICBTZWxlY3QgSFA2WFggaWYgY29uZmlndXJpbmcgZm9yIGEgSFAgam9ybmFkYSBIUDZ4eC4KKwkgIE1vcmUgaW5mb3JtYXRpb24gKGhhcmR3YXJlIG9ubHkpIGF0CisJICA8aHR0cDovL3d3dy5ocC5jb20vam9ybmFkYS8+LgorCitjb25maWcgU0hfRFJFQU1DQVNUCisJYm9vbCAiRHJlYW1jYXN0IgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDcwOTEKKwloZWxwCisJICBTZWxlY3QgRHJlYW1jYXN0IGlmIGNvbmZpZ3VyaW5nIGZvciBhIFNFR0EgRHJlYW1jYXN0LgorCSAgTW9yZSBpbmZvcm1hdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cubTE3bi5vcmcvbGludXgtc2gvZHJlYW1jYXN0Lz4uICBUaGVyZSBpcyBhCisJICBEcmVhbWNhc3QgcHJvamVjdCBpcyBhdCA8aHR0cDovL2xpbnV4ZGMuc291cmNlZm9yZ2UubmV0Lz4uCisKK2NvbmZpZyBTSF9NUEMxMjExCisJYm9vbCAiSW50ZXJmYWNlIE1QQzEyMTEiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEgJiYgQlJPS0VOCisJaGVscAorCSAgQ1RQL1BDSS1TSDAyIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KKworY29uZmlnIFNIX1NIMDMKKwlib29sICJJbnRlcmZhY2UgQ1RQL1BDSS1TSDAzIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxICYmIEJST0tFTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KKworY29uZmlnIFNIX1NFQ1VSRUVER0U1NDEwCisJYm9vbCAiU2VjdXJlRWRnZTU0MTAiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgU2VjdXJlRWRnZTU0MTAgaWYgY29uZmlndXJpbmcgZm9yIGEgU25hcEdlYXIgU0ggYm9hcmQuCisJICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIE9FTSBTZWN1cmVFZGdlIHByb2R1Y3RzIGFzIHdlbGwgYXMgdGhlCisJICBTTUUgcHJvZHVjdCBsaW5lLgorCitjb25maWcgU0hfSFM3NzUxUlZPSVAKKwlib29sICJIUzc3NTFSVk9JUCIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBTZWxlY3QgSFM3NzUxUlZPSVAgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5CisJICBTYWxlcyBWb0lQIGJvYXJkLgorCitjb25maWcgU0hfNzcxMFZPSVBHVworCWJvb2wgIlNINzcxMC1WT0lQLUdXIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzEwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGJ1aWxkIGEga2VybmVsIGZvciB0aGUgU0g3NzEwIGJhc2VkCisJICBWT0lQIEdXLgorCitjb25maWcgU0hfUlRTNzc1MVIyRAorCWJvb2wgIlJUUzc3NTFSMkQiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgUlRTNzc1MVIyRCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKKwkgIFNhbGVzIFNILUdyYXBoaWNzIGJvYXJkLgorCitjb25maWcgU0hfSElHSExBTkRFUgorCWJvb2wgIkhpZ2hsYW5kZXIiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgQ1BVX1NVQlRZUEVfU0g3Nzg1CisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKworY29uZmlnIFNIX0VET1NLNzcwNQorCWJvb2wgIkVET1NLNzcwNSIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNQorCitjb25maWcgU0hfU0g0MjAyX01JQ1JPREVWCisJYm9vbCAiU0g0LTIwMiBNaWNyb0RldiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINF8yMDIKKwloZWxwCisJICBTZWxlY3QgU0g0LTIwMiBNaWNyb0RldiBpZiBjb25maWd1cmluZyBmb3IgYSBTdXBlckggTWljcm9EZXYgYm9hcmQKKwkgIHdpdGggYW4gU0g0LTIwMiBDUFUuCisKK2NvbmZpZyBTSF9MQU5ESVNLCisJYm9vbCAiTEFORElTSyIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWhlbHAKKwkgIEktTyBEQVRBIERFVklDRSwgSU5DLiAiTEFORElTSyBTZXJpZXMiIHN1cHBvcnQuCisKK2NvbmZpZyBTSF9USVRBTgorCWJvb2wgIlRJVEFOIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxUgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgU2VsZWN0IFRpdGFuIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgTmltYmxlIE1pY3Jvc3lzdGVtcworCSAgTmV0RW5naW5lIE5QNTFSLgorCitjb25maWcgU0hfU0hNSU4KKwlib29sICJTSE1JTiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNgorCWhlbHAKKwkgIFNlbGVjdCBTSE1JTiBpZiBjb25maWd1cmluZyBmb3IgdGhlIFNITUlOIGJvYXJkLgorCitjb25maWcgU0hfTEJPWF9SRTIKKwlib29sICJMLUJPWCBSRTIiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgTC1CT1ggUkUyIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyLgorCitlbmRtZW51CisKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9LY29uZmlnIgorc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWciCisKIG1lbnUgIlRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uIgogCiBjb25maWcgU0hfVE1VCkBAIC00NzMsMTMgKzQ0MCwxMyBAQAogCWludCAiUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KSIKIAlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MzE4MCB8fCBDUFVfU1VCVFlQRV9TSDczNDMKIAlkZWZhdWx0ICIzMTI1MDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAiMzIwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzcyMgogCWRlZmF1bHQgIjMzMzMzMzMzIiBpZiBDUFVfU1VCVFlQRV9TSDczMDAgfHwgQ1BVX1NVQlRZUEVfU0g3NzcwIHx8IFwKIAkJCSAgICAgIENQVV9TVUJUWVBFX1NINzc2MCB8fCBDUFVfU1VCVFlQRV9TSDc3MDUgfHwgXAogCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JZGVmYXVsdCAiNTAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MCB8fCBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgXAotCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3Nzg1Ci0JZGVmYXVsdCAiNjAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MQorCWRlZmF1bHQgIjYwMDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3NTEgfHwgQ1BVX1NVQlRZUEVfU0g3NzUxUgogCWRlZmF1bHQgIjY2MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDRfMjAyCisJZGVmYXVsdCAiNTAwMDAwMDAiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeS4KIAkgIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBkZXRlcm1pbmluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIHZhbHVlIG9uCkBAIC00ODcsOCArNDU0LDEwIEBACiAKIGNvbmZpZyBTSF9DTEtfTUQKIAlpbnQgIkNQVSBNb2RlIFBpbiBTZXR0aW5nIgotCWRlZmF1bHQgMAogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NjE5IHx8IENQVV9TVUJUWVBFX1NINzIwNgorCWRlZmF1bHQgNiBpZiBDUFVfU1VCVFlQRV9TSDcyMDYKKwlkZWZhdWx0IDUgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAwCiAJaGVscAogCSAgTUQyIC0gTUQwIHBpbiBzZXR0aW5nLgogCkBAIC01NjAsNiArNTI5LDcgQEAKIAogY29uZmlnIFNNUAogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfU01QCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4gSWYgeW91IGhhdmUKIAkgIGEgc3lzdGVtIHdpdGggb25seSBvbmUgQ1BVLCBsaWtlIG1vc3QgcGVyc29uYWwgY29tcHV0ZXJzLCBzYXkgTi4gSWYKQEAgLTU4NCw2ICs1NTQsNyBAQAogCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0zMikiCiAJcmFuZ2UgMiAzMgogCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCAiNCIgaWYgQ1BVX1NIWDMKIAlkZWZhdWx0ICIyIgogCWhlbHAKIAkgIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHdoaWNoIHRoaXMKQEAgLTYyMyw2ICs1OTQsNyBAQAogCiBjb25maWcgVUJDX1dBS0VVUAogCWJvb2wgIldha2V1cCBVQkMgb24gc3RhcnR1cCIKKwlkZXBlbmRzIG9uIENQVV9TSDQKIAloZWxwCiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCB3YWtldXAgdGhlIFVzZXIgQnJlYWsgQ29udHJvbGxlciAoVUJDKSBvbgogCSAgc3RhcnR1cC4gQWx0aG91Z2ggdGhlIFVCQyBpcyBsZWZ0IGluIGFuIGF3YWtlIHN0YXRlIHdoZW4gdGhlIHByb2Nlc3NvcgpAQCAtNjUxLDggKzYyMyw4IEBACiAjIHdlJ3JlIG5vdCB1c2luZyBQQ01DSUEsIHNvIHdlIG1ha2UgaXQgZGVwZW5kZW50IG9uCiAjIFBDTUNJQSBvdXRyaWdodC4gLS0gUEZNLgogY29uZmlnIElTQQotCWJvb2wKLQlkZWZhdWx0IHkgaWYgUENNQ0lBCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gUENNQ0lBICYmIEhENjQ0NlhfU0VSSUVTCiAJaGVscAogCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBJU0Egc2xvdHMgb24geW91ciBtb3RoZXJib2FyZC4gIElTQSBpcyB0aGUKIAkgIG5hbWUgb2YgYSBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYKQEAgLTY5MCw2ICs2NjIsNDkgQEAKIAl0cmlzdGF0ZSAiU3VwZXJIeXdheSBCdXMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINF8yMDIKIAorY29uZmlnIENGX0VOQUJMRVIKKwlib29sICJDb21wYWN0IEZsYXNoIEVuYWJsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPTFVUSU9OX0VOR0lORSB8fCBTSF9TSDAzCisJLS0taGVscC0tLQorCSAgQ29tcGFjdCBGbGFzaCBpcyBhIHNtYWxsLCByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZSBpbnRyb2R1Y2VkCisJICBpbiAxOTk0IG9yaWdpbmFsbHkgYXMgYSBQQ01DSUEgZGV2aWNlLiAgSWYgeW91IHNheSBgWScgaGVyZSwgeW91CisJICBjb21waWxlIGluIHN1cHBvcnQgZm9yIENvbXBhY3QgRmxhc2ggZGV2aWNlcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KKwkgIGEgU3VwZXJIIHByb2Nlc3Nvci4gIEEgQ29tcGFjdCBGbGFzaCBGQVEgaXMgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy5jb21wYWN0Zmxhc2gub3JnL2ZhcXMvZmFxLmh0bT4uCisKKwkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCBhdCBhcmVhIDUgb3IgNiwKKwkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBvcHRpb24uICBUaGVuLCB5b3UgY2FuIHVzZSBDRiBhcworCSAgcHJpbWFyeSBJREUgZHJpdmUgKG9ubHkgdGVzdGVkIGZvciBTYW5EaXNrKS4KKworCSAgSWYgaW4gZG91YnQsIHNlbGVjdCAnTicuCisKK2Nob2ljZQorCXByb21wdCAiQ29tcGFjdCBGbGFzaCBDb25uZWN0aW9uIEFyZWEiCisJZGVwZW5kcyBvbiBDRl9FTkFCTEVSCisJZGVmYXVsdCBDRl9BUkVBNgorCitjb25maWcgQ0ZfQVJFQTUKKwlib29sICJBcmVhNSIKKwloZWxwCisJICBJZiB5b3VyIGJvYXJkIGhhcyAiRGlyZWN0bHkgQ29ubmVjdGVkIiBDb21wYWN0Rmxhc2gsIFlvdSBzaG91bGQKKwkgIHNlbGVjdCB0aGUgYXJlYSB3aGVyZSB5b3VyIENGIGlzIGNvbm5lY3RlZCB0by4KKworCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQorCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCisKKwkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4KKworY29uZmlnIENGX0FSRUE2CisJYm9vbCAiQXJlYTYiCisKK2VuZGNob2ljZQorCitjb25maWcgQ0ZfQkFTRV9BRERSCisJaGV4CisJZGVwZW5kcyBvbiBDRl9FTkFCTEVSCisJZGVmYXVsdCAiMHhiODAwMDAwMCIgaWYgQ0ZfQVJFQTYKKwlkZWZhdWx0ICIweGI0MDAwMDAwIiBpZiBDRl9BUkVBNQorCiBzb3VyY2UgImFyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgpAQCAtNzA3LDcgKzcyMiw3IEBACiBlbmRtZW51CiAKIG1lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKSIKLWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCitkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBTWVNfU1VQUE9SVFNfUE0KIAogc291cmNlIGtlcm5lbC9wb3dlci9LY29uZmlnCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZwppbmRleCBiNTYzMDcyLi41MmY2YTk5IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9zaC9LY29uZmlnLmRlYnVnCkBAIC01Miw2ICs1MiwxMCBAQAogCSAgc2VsZWN0IGJvdGggdGhlIEVBUkxZX1NDSUZfQ09OU09MRSBhbmQgU0hfU1RBTkRBUkRfQklPUywgdXNpbmcKIAkgIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0b2dnbGUgYmFjayBhbmQgZm9ydGguCiAKK2NvbmZpZyBERUJVR19CT09UTUVNCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlib29sICJEZWJ1ZyBCT09UTUVNIGluaXRpYWxpemF0aW9uIgorCiBjb25maWcgREVCVUdfU1RBQ0tPVkVSRkxPVwogCWJvb2wgIkNoZWNrIGZvciBzdGFjayBvdmVyZmxvd3MiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTgyLDYgKzg2LDcgQEAKIAlib29sICJJbmNsdWRlIEtHREIga2VybmVsIGRlYnVnZ2VyIgogCXNlbGVjdCBGUkFNRV9QT0lOVEVSCiAJc2VsZWN0IERFQlVHX0lORk8KKwlkZXBlbmRzIG9uIENQVV9TSDMgfHwgQ1BVX1NINAogCWhlbHAKIAkgIEluY2x1ZGUgaW4ta2VybmVsIGhvb2tzIGZvciBrZ2RiLCB0aGUgTGludXgga2VybmVsIHNvdXJjZSBsZXZlbAogCSAgZGVidWdnZXIuICBTZWUgPGh0dHA6Ly9rZ2RiLnNvdXJjZWZvcmdlLm5ldC8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggODgzYjAzYi4uNzdmZWNjNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0zNCwyMCArMzQsMjAgQEAKIGVuZGlmCiBlbmRpZgogCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NIMikJCTo9IC1tMgotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJOj0gLW0yYSAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAtbTMKLWNmbGFncy0kKENPTkZJR19DUFVfU0g0KQkJOj0gLW00IFwKK2NmbGFncy0kKENPTkZJR19DUFVfU0gyKQkJOj0gJChjYWxsIGNjLW9wdGlvbiwtbTIsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTJhLCkgXAorCQkJCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tMywpCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NINCkJCTo9ICQoY2FsbCBjYy1vcHRpb24sLW00LCkgXAogCSQoY2FsbCBjYy1vcHRpb24sLW1uby1pbXBsaWNpdC1mcCwtbTQtbm9mcHUpCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NINEEpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEsKSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDRBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTRhLCkgXAorCQkJCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX0JJR19FTkRJQU4pCQkrPSAtbWIKIGNmbGFncy0kKENPTkZJR19DUFVfTElUVExFX0VORElBTikJKz0gLW1sCiAKIGNmbGFncy15CSs9ICQoY2FsbCBhcy1vcHRpb24sLVdhJChjb21tYSktaXNhPSQoaXNhLXkpLCkgLWZmcmVlc3RhbmRpbmcKIAotY2ZsYWdzLSQoQ09ORklHX1NIX0RTUCkJCQkrPSAtV2EsLWRzcAotCiBjZmxhZ3MtJChDT05GSUdfTU9SRV9DT01QSUxFX09QVElPTlMpCSs9IFwKIAkkKHNoZWxsIGVjaG8gJChDT05GSUdfQ09NUElMRV9PUFRJT05TKSB8IHNlZCAtZSAncy8iLy9nJykKIApAQCAtODcsMzkgKzg3LDM3IEBACiBjb3JlLSQoQ09ORklHX1NIX0ZQVV9FTVUpCSs9IGFyY2gvc2gvbWF0aC1lbXUvCiAKICMgQm9hcmRzCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSkJCTo9IHNlLzc3MHgKLW1hY2hkaXItJChDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3MjIKLW1hY2hkaXItJChDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3NTEKLW1hY2hkaXItJChDT05GSUdfU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3ODAKLW1hY2hkaXItJChDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczMDAKLW1hY2hkaXItJChDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczNDMKLW1hY2hkaXItJChDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MzE4MAotbWFjaGRpci0kKENPTkZJR19TSF9IUDZYWCkJCQk6PSBocDZ4eAotbWFjaGRpci0kKENPTkZJR19TSF9TQVRVUk4pCQkJOj0gc2F0dXJuCi1tYWNoZGlyLSQoQ09ORklHX1NIX0RSRUFNQ0FTVCkJCQk6PSBkcmVhbWNhc3QKLW1hY2hkaXItJChDT05GSUdfU0hfTVBDMTIxMSkJCQk6PSBtcGMxMjExCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NIMDMpCQkJOj0gc2gwMwotbWFjaGRpci0kKENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCkJCTo9IHNuYXBnZWFyCi1tYWNoZGlyLSQoQ09ORklHX1NIX0hTNzc1MVJWT0lQKQkJOj0gcmVuZXNhcy9oczc3NTFydm9pcAotbWFjaGRpci0kKENPTkZJR19TSF9SVFM3NzUxUjJEKQkJCTo9IHJlbmVzYXMvcnRzNzc1MXIyZAotbWFjaGRpci0kKENPTkZJR19TSF83NzUxX1NZU1RFTUgpCQk6PSByZW5lc2FzL3N5c3RlbWgKLW1hY2hkaXItJChDT05GSUdfU0hfRURPU0s3NzA1KQkJCTo9IHJlbmVzYXMvZWRvc2s3NzA1Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0hJR0hMQU5ERVIpCQkJOj0gcmVuZXNhcy9yNzc4MHJwCi1tYWNoZGlyLSQoQ09ORklHX1NIXzc3MTBWT0lQR1cpCQkJOj0gcmVuZXNhcy9zaDc3MTB2b2lwZ3cKLW1hY2hkaXItJChDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWKQkJOj0gc3VwZXJoL21pY3JvZGV2Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0xBTkRJU0spCQkJOj0gbGFuZGlzawotbWFjaGRpci0kKENPTkZJR19TSF9USVRBTikJCQk6PSB0aXRhbgotbWFjaGRpci0kKENPTkZJR19TSF9TSE1JTikJCQk6PSBzaG1pbgotbWFjaGRpci0kKENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzIwNgotbWFjaGRpci0kKENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzYxOQotbWFjaGRpci0kKENPTkZJR19TSF9MQk9YX1JFMikJCQk6PSBsYm94cmUyCi1tYWNoZGlyLSQoQ09ORklHX1NIX1VOS05PV04pCQkJOj0gdW5rbm93bgorbWFjaGRpci0kKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCQkrPSBzZS83NzB4CittYWNoZGlyLSQoQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzIyCittYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzUxCittYWNoZGlyLSQoQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzgwCittYWNoZGlyLSQoQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzAwCittYWNoZGlyLSQoQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzQzCittYWNoZGlyLSQoQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSkJKz0gc2UvNzMxODAKK21hY2hkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJKz0gaHA2eHgKK21hY2hkaXItJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJCSs9IGRyZWFtY2FzdAorbWFjaGRpci0kKENPTkZJR19TSF9NUEMxMjExKQkJCSs9IG1wYzEyMTEKK21hY2hkaXItJChDT05GSUdfU0hfU0gwMykJCQkrPSBzaDAzCittYWNoZGlyLSQoQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwKQkJKz0gc25hcGdlYXIKK21hY2hkaXItJChDT05GSUdfU0hfSFM3NzUxUlZPSVApCQkrPSByZW5lc2FzL2hzNzc1MXJ2b2lwCittYWNoZGlyLSQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCQkJKz0gcmVuZXNhcy9ydHM3NzUxcjJkCittYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU1lTVEVNSCkJCSs9IHJlbmVzYXMvc3lzdGVtaAorbWFjaGRpci0kKENPTkZJR19TSF9FRE9TSzc3MDUpCQkJKz0gcmVuZXNhcy9lZG9zazc3MDUKK21hY2hkaXItJChDT05GSUdfU0hfSElHSExBTkRFUikJCQkrPSByZW5lc2FzL3I3NzgwcnAKK21hY2hkaXItJChDT05GSUdfU0hfNzcxMFZPSVBHVykJCQkrPSByZW5lc2FzL3NoNzcxMHZvaXBndworbWFjaGRpci0kKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCQkrPSBzdXBlcmgvbWljcm9kZXYKK21hY2hkaXItJChDT05GSUdfU0hfTEFORElTSykJCQkrPSBsYW5kaXNrCittYWNoZGlyLSQoQ09ORklHX1NIX1RJVEFOKQkJCSs9IHRpdGFuCittYWNoZGlyLSQoQ09ORklHX1NIX1NITUlOKQkJCSs9IHNobWluCittYWNoZGlyLSQoQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MjA2CittYWNoZGlyLSQoQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NjE5CittYWNoZGlyLSQoQ09ORklHX1NIX0xCT1hfUkUyKQkJCSs9IGxib3hyZTIKIAotaW5jZGlyLXkJCQk6PSAkKG5vdGRpciAkKG1hY2hkaXIteSkpCi1pbmNkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJOj0gaHA2eHgKK2luY2Rpci15CTo9ICQobm90ZGlyICQobWFjaGRpci15KSkKIAogaWZuZXEgKCQobWFjaGRpci15KSwpCi1jb3JlLXkJCQkJKz0gYXJjaC9zaC9ib2FyZHMvJChtYWNoZGlyLXkpLworY29yZS15CSs9ICQoYWRkcHJlZml4IGFyY2gvc2gvYm9hcmRzLywgXAorCSAgICAgJChmaWx0ZXItb3V0IC4sICQocGF0c3Vic3QgJSwlLywkKG1hY2hkaXIteSkpKSkKIGVuZGlmCiAKICMgQ29tcGFuaW9uIGNoaXBzCkBAIC0xNTcsMTkgKzE1NSwzMSBAQAogIwlNb3N0IGJvYXJkcyBoYXZlIHRoZWlyIG93biBtYWNoIGRpcmVjdG9yaWVzLiAgRm9yIHRoZSBvbmVzIHRoYXQKICMJZG9uJ3QsIGp1c3QgcmVmZXJlbmNlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHNvIHRoZSBzZW1hbnRpY3MgYXJlCiAjCWtlcHQgcm91Z2hseSB0aGUgc2FtZS4KKyMKKyMJV2hlbiBtdWx0aXBsZSBib2FyZHMgYXJlIGNvbXBpbGVkIGluIGF0IHRoZSBzYW1lIHRpbWUsIHByZWZlcmVuY2UKKyMJZm9yIHRoZSBtYWNoIGxpbmsgaXMgZ2l2ZW4gdG8gd2hpY2hldmVyIGhhcyBhIGRpcmVjdG9yeSBmb3IgaXRzCisjCWhlYWRlcnMuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBhIHdvcmthcm91bmQgdW50aWwgcGxhdGZvcm1zIHRoYXQKKyMJY2FuIGxpdmUgaW4gdGhlIHNhbWUga2VybmVsIGltYWdlIGJhY2sgYXdheSBmcm9tIHJlbHlpbmcgb24gdGhlCisjCW1hY2ggbGluay4KIAogaW5jbHVkZS9hc20tc2gvLm1hY2g6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvc2gvKi5oKSBcCiAJCSAgICAgIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZiBGT1JDRQotCUBlY2hvIC1uICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvbWFjaCAtPiAnCiAJJChRKWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaCBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUvYXNtLXNoOyBmaQotCSQoUSlpZiBbIC1kICQoaW5jZGlyLXByZWZpeCkkKGluY2Rpci15KSBdOyB0aGVuIFwKLQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gvJChpbmNkaXIteSknOyBcCi0JCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSQoaW5jZGlyLXkpIFwKKwkkKFEpcm0gLWYgaW5jbHVkZS9hc20tc2gvbWFjaAorCSQoUSlmb3IgaSBpbiAkKGluY2Rpci15KTsgZG8gXAorCWlmIFsgLWQgJChpbmNkaXItcHJlZml4KSQkaSBdOyB0aGVuIFwKKwkJZWNobyAtbiAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLXNoL21hY2ggLT4gJzsgXAorCQllY2hvIC1lICJpbmNsdWRlL2FzbS1zaC8kJGkiOyBcCisJCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSQkaSBcCiAJCQlpbmNsdWRlL2FzbS1zaC9tYWNoOyBcCiAJZWxzZSBcCi0JCWVjaG8gLWUgJ2luY2x1ZGUvYXNtLXNoJzsgXAotCQlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkgaW5jbHVkZS9hc20tc2gvbWFjaDsgXAotCWZpCisJCWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaC9tYWNoIF07IHRoZW4gXAorCQkJZWNobyAtbiAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLXNoL21hY2ggLT4gJzsgXAorCQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gnOyBcCisJCQlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkgaW5jbHVkZS9hc20tc2gvbWFjaDsgXAorCQlmaTsgXAorCWZpOyBcCisJZG9uZQogCUB0b3VjaCAkQAogCiBhcmNocHJlcGFyZTogaW5jbHVkZS9hc20tc2gvLmNwdSBpbmNsdWRlL2FzbS1zaC8ubWFjaCBtYWtldG9vbHMKQEAgLTE4OCw3ICsxOTgsOSBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmgKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oIFwKKwkgICAgICAgaW5jbHVkZS9hc20tc2gvY3B1IGluY2x1ZGUvYXNtLXNoLy5jcHUgXAorCSAgICAgICBpbmNsdWRlL2FzbS1zaC9tYWNoIGluY2x1ZGUvYXNtLXNoLy5tYWNoCiAKIGRlZmluZSBhcmNoaGVscAogCUBlY2hvICcqIHpJbWFnZSAJICAgICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlJwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZHJlYW1jYXN0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwppbmRleCBmMTMwMTdlLi44Nzk5ZGY2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwpAQCAtNjAsNyArNjAsNyBAQAogI2VuZGlmCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9kcmVhbWNhc3QgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2RyZWFtY2FzdCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU2VnYSBEcmVhbWNhc3QiLAogCS5tdl9zZXR1cAkJPSBkcmVhbWNhc3Rfc2V0dXAsCiAJLm12X2lycV9kZW11eAkJPSBzeXN0ZW1hc2ljX2lycV9kZW11eCwKQEAgLTcwLDQgKzcwLDMgQEAKIAkubXZfY29uc2lzdGVudF9mcmVlCT0gZHJlYW1jYXN0X2NvbnNpc3RlbnRfZnJlZSwKICNlbmRpZgogfTsKLUFMSUFTX01WKGRyZWFtY2FzdCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkYmJhOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvaHA2eHgvbWFjaC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBNYWNoaW5lIHZlY3RvciBmb3IgdGhlIEhQNjgwCi0gKi8KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHA2eHggX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMgPSBIRDY0NDYxX0lSUUJBU0UgKyBIRDY0NDYxX0lSUV9OVU0sCi0KLQkubXZfaW5iID0gaGQ2NDQ2MV9pbmIsCi0JLm12X2ludyA9IGhkNjQ0NjFfaW53LAotCS5tdl9pbmwgPSBoZDY0NDYxX2lubCwKLQkubXZfb3V0YiA9IGhkNjQ0NjFfb3V0YiwKLQkubXZfb3V0dyA9IGhkNjQ0NjFfb3V0dywKLQkubXZfb3V0bCA9IGhkNjQ0NjFfb3V0bCwKLQotCS5tdl9pbmJfcCA9IGhkNjQ0NjFfaW5iX3AsCi0JLm12X2lud19wID0gaGQ2NDQ2MV9pbncsCi0JLm12X2lubF9wID0gaGQ2NDQ2MV9pbmwsCi0JLm12X291dGJfcCA9IGhkNjQ0NjFfb3V0Yl9wLAotCS5tdl9vdXR3X3AgPSBoZDY0NDYxX291dHcsCi0JLm12X291dGxfcCA9IGhkNjQ0NjFfb3V0bCwKLQotCS5tdl9pbnNiID0gaGQ2NDQ2MV9pbnNiLAotCS5tdl9pbnN3ID0gaGQ2NDQ2MV9pbnN3LAotCS5tdl9pbnNsID0gaGQ2NDQ2MV9pbnNsLAotCS5tdl9vdXRzYiA9IGhkNjQ0NjFfb3V0c2IsCi0JLm12X291dHN3ID0gaGQ2NDQ2MV9vdXRzdywKLQkubXZfb3V0c2wgPSBoZDY0NDYxX291dHNsLAotCi0JLm12X3JlYWR3ID0gaGQ2NDQ2MV9yZWFkdywKLQkubXZfd3JpdGV3ID0gaGQ2NDQ2MV93cml0ZXcsCi0KLQkubXZfaXJxX2RlbXV4ID0gaGQ2NDQ2MV9pcnFfZGVtdXgsCi19OwotCi1BTElBU19NVihocDZ4eCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9zZXR1cC5jCmluZGV4IDZhZWVlODUuLjdhZTcwODkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYwpAQCAtOTgsMTAgKzk4LDkgQEAKIH0KIGRldmljZV9pbml0Y2FsbChocDZ4eF9kZXZpY2VzX3NldHVwKTsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hwNnh4IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ocDZ4eCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9ICJocDZ4eCIsCiAJLm12X3NldHVwID0gaHA2eHhfc2V0dXAsCiAJLm12X25yX2lycXMgPSBIRDY0NDYxX0lSUUJBU0UgKyBIRDY0NDYxX0lSUV9OVU0sCiAJLm12X2lycV9kZW11eCA9IGhkNjQ0NjFfaXJxX2RlbXV4LAogfTsKLUFMSUFTX01WKGhwNnh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jCmluZGV4IGY5NTNjNzQuLmVkYTcxNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL3NldHVwLmMKQEAgLTk3LDEwICs5Nyw5IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYW5kaXNrIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYW5kaXNrIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIkxBTkRJU0siLAogCS5tdl9ucl9pcnFzID0gNzIsCiAJLm12X3NldHVwID0gbGFuZGlza19zZXR1cCwKIAkubXZfaW5pdF9pcnEgPSBpbml0X2xhbmRpc2tfSVJRLAogfTsKLUFMSUFTX01WKGxhbmRpc2spCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMKaW5kZXggNGUyMGY3Yy4uOWM4MzBmZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbGJveHJlMi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xib3hyZTIvc2V0dXAuYwpAQCAtNzcsOSArNzcsOCBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGJveHJlMiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGJveHJlMiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiTC1CT1ggUkUyIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9sYm94cmUyX0lSUSwKIH07Ci1BTElBU19NVihsYm94cmUyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCmluZGV4IDFhMDYwNGIuLjhjZTAzZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKQEAgLTMzOCwxMSArMzM4LDEwIEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJJbnRlcmZhY2UgTVBDLTEyMTEoQ1RQL1BDSS9NUEMtU0gwMikiLAogCS5tdl9zZXR1cAkJPSBtcGMxMjExX3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDQ4LAogCS5tdl9pcnFfZGVtdXgJCT0gbXBjMTIxMV9pcnFfZGVtdXgsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfbXBjMTIxMV9JUlEsCiB9OwotQUxJQVNfTVYobXBjMTIxMSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2Vkb3NrNzcwNS9zZXR1cC5jCmluZGV4IGVjNWJlMDEuLmYwNzZjNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9lZG9zazc3MDUvc2V0dXAuYwpAQCAtMjEsNyArMjEsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZWRvc2s3NzA1IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9lZG9zazc3MDUgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkVET1NLNzcwNSIsCiAJLm12X25yX2lycXMJCT0gODAsCiAKQEAgLTQxLDQgKzQxLDMgQEAKIAkubXZfaXNhX3BvcnQyYWRkcgk9IHNoX2Vkb3NrNzcwNV9pc2FfcG9ydDJhZGRyLAogCS5tdl9pbml0X2lycQkJPSBzaF9lZG9zazc3MDVfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoZWRvc2s3NzA1KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jCmluZGV4IGY3ZDBlMzAuLmZhNWZhMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgSFM3NzUxUlZvSVAtMiBzdXBwb3J0LlxuIik7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oczc3NTFydm9pcCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHM3NzUxcnZvaXAgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkhTNzc1MVJWb0lQIiwKIAkubXZfc2V0dXAJCT0gaHM3NzUxcnZvaXBfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCkBAIC0xMTgsNCArMTE4LDMgQEAKIAkubXZfaW5pdF9pcnEJCT0gaHM3NzUxcnZvaXBfaW5pdF9pcnEsCiAJLm12X2lvcG9ydF9tYXAJCT0gaHM3NzUxcnZvaXBfaW9wb3J0X21hcCwKIH07Ci1BTElBU19NVihoczc3NTFydm9pcCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKaW5kZXggOWZiMTE2NC4uZmM4ZjI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKQEAgLTYsMTggKzYsMTggQEAKIAogY29uZmlnIFNIX1I3NzgwUlAKIAlib29sICJSNzc4MFJQLTEgYm9hcmQgc3VwcG9ydCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzgwCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAKIAogY29uZmlnIFNIX1I3NzgwTVAKIAlib29sICJSNzc4ME1QIGJvYXJkIHN1cHBvcnQiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc4MAorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwCiAJaGVscAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBtYXNzLXByb2R1Y3Rpb24KIAkgIHZlcnNpb24gb2YgdGhlIFI3NzgwUlAuIElmIGluIGRvdWJ0LCBzYXkgWS4KIAogY29uZmlnIFNIX1I3Nzg1UlAKIAlib29sICJSNzc4NVJQIGJvYXJkIHN1cHBvcnQiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc4NQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3Nzg1CiAKIGVuZGNob2ljZQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCmluZGV4IDA3MjdlZjkuLjVhZmI4NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCkBAIC0xNjYsMTAgKzE2Niw5IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oaWdobGFuZGVyIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oaWdobGFuZGVyIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJIaWdobGFuZGVyIiwKIAkubXZfbnJfaXJxcwkJPSAxMDksCiAJLm12X3NldHVwCQk9IGhpZ2hsYW5kZXJfc2V0dXAsCiAJLm12X2luaXRfaXJxCQk9IGhpZ2hsYW5kZXJfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoaGlnaGxhbmRlcikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKaW5kZXggNTkzZjI2YS4uNjU2ZmRhMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfcnRzNzc1MXIyZCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfcnRzNzc1MXIyZCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiUlRTNzc1MVIyRCIsCiAJLm12X3NldHVwCQk9IHJ0czc3NTFyMmRfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCkBAIC0xODksNCArMTg5LDMgQEAKIAkubXZfY29uc2lzdGVudF9mcmVlCT0gdm95YWdlcmd4X2NvbnNpc3RlbnRfZnJlZSwKICNlbmRpZgogfTsKLUFMSUFTX01WKHJ0czc3NTFyMmQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYwppbmRleCAxODA4MTBiLi4yZGNlOGJkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKQEAgLTg4LDkgKzg4LDggQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoNzcxMHZvaXBndyBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2g3NzEwdm9pcGd3IF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTSDc3MTAgVm9JUCBHYXRld2F5IiwKIAkubXZfbnJfaXJxcwkJPSAxMDQsCiAJLm12X2luaXRfaXJxCQk9IHNoNzcxMHZvaXBnd19pbml0X2lycSwKIH07Ci1BTElBU19NVihzaDc3MTB2b2lwZ3cpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCmluZGV4IDkzNjExNzYuLmVlNzhhZjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCkBAIC0yOCw3ICsyOCw3IEBACiAJbWFrZV9zeXN0ZW1oX2lycSgweGIpOwkvKiBFdGhlcm5ldCBpbnRlcnJ1cHQgKi8KIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzeXN0ZW1oIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc3lzdGVtaCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiNzc1MSBTeXN0ZW1IIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIApAQCAtNTUsNCArNTUsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IHNoNzc1MXN5c3RlbWhfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoNzc1MXN5c3RlbWgpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTMwNDIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgU2VnYSBTYXR1cm4gc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAotIwotCi1vYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi0KLW9iai0kKENPTkZJR19TTVApICs9IHNtcC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pby5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTRmN2YuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKLSAqCi0gKiBJL08gcm91dGluZXMgZm9yIHRoZSBTZWdhIFNhdHVybi4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgotICovCi0jaW5jbHVkZSA8YXNtL3NhdHVybi9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0KLXVuc2lnbmVkIGxvbmcgc2F0dXJuX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JcmV0dXJuIG9mZnNldDsKLX0KLQotdm9pZCAqc2F0dXJuX2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gKHZvaWQgKilvZmZzZXQ7Ci19Ci0KLXZvaWQgc2F0dXJuX2lvdW5tYXAodm9pZCAqYWRkcikKLXsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQxZDNmLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qCi0gKiBJbnRlcnJ1cHRzIG1hcCBvdXQgYXMgZm9sbG93czoKLSAqCi0gKiAgVmVjdG9yCU5hbWUJCU1hc2sKLSAqCi0gKiAJNjQJVkJMQU5LSU4JMHgwMDAxCi0gKiAJNjUJVkJMQU5LT1VUCTB4MDAwMgotICoJNjYJSEJMQU5LSU4JMHgwMDA0Ci0gKgk2NwlUSU1FUjAJCTB4MDAwOAotICoJNjgJVElNRVIxCQkweDAwMTAKLSAqCTY5CURTUEVORAkJMHgwMDIwCi0gKgk3MAlTT1VORFJFUVVFU1QJMHgwMDQwCi0gKgk3MQlTWVNURU1NQU5BR0VSCTB4MDA4MAotICoJNzIJUEFECQkweDAxMDAKLSAqCTczCUxFVkVMMkRNQUVORAkweDAyMDAKLSAqCTc0CUxFVkVMMURNQUVORAkweDA0MDAKLSAqCTc1CUxFVkVMMERNQUVORAkweDA4MDAKLSAqCTc2CURNQUlMTEVHQUwJMHgxMDAwCi0gKgk3NwlTUklURURSQVdFTkQJMHgyMDAwCi0gKgk3OAlBQlVTCQkweDgwMDAKLSAqCi0gKi8KLSNkZWZpbmUgU0FUVVJOX0lSUV9NSU4JCTY0CS8qIFZCTEFOS0lOICovCi0jZGVmaW5lIFNBVFVSTl9JUlFfTUFYCQk3OAkvKiBBQlVTICovCi0KLSNkZWZpbmUgU0FUVVJOX0lSUV9NQVNLCQkweGJmZmYKLQotc3RhdGljIGlubGluZSB1MzIgc2F0dXJuX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JdTMyIG1hc2s7Ci0KLQltYXNrID0gKDEgPDwgKGlycV9uciAtIFNBVFVSTl9JUlFfTUlOKSk7Ci0JbWFzayA8PD0gKGlycV9uciA9PSBTQVRVUk5fSVJRX01BWCk7Ci0JbWFzayAmPSBTQVRVUk5fSVJRX01BU0s7Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1hc2tfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXUzMiBtYXNrOwotCi0JbWFzayA9IGN0cmxfaW5sKFNBVFVSTl9JTVIpOwotCW1hc2sgfD0gc2F0dXJuX2lycV9tYXNrKGlycV9ucik7Ci0JY3RybF9vdXRsKG1hc2ssIFNBVFVSTl9JTVIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5tYXNrX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1MzIgbWFzazsKLQotCW1hc2sgPSBjdHJsX2lubChTQVRVUk5fSU1SKTsKLQltYXNrICY9IH5zYXR1cm5faXJxX21hc2soaXJxX25yKTsKLQljdHJsX291dGwobWFzaywgU0FUVVJOX0lNUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCW1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXVubWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JbWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxX25yXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJdW5tYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1bm1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQltYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBzYXR1cm5faW50ID0gewotCS50eXBlbmFtZQk9ICJTYXR1cm4iLAotCS5lbmFibGUJCT0gZW5hYmxlX3NhdHVybl9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX3NhdHVybl9pcnEsCi0JLmFjawkJPSBtYXNrX2FuZF9hY2tfc2F0dXJuX2lycSwKLQkuZW5kCQk9IGVuZF9zYXR1cm5faXJxLAotCS5zdGFydHVwCT0gc3RhcnR1cF9zYXR1cm5faXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX3NhdHVybl9pcnEsCi19OwotCi1pbnQgc2F0dXJuX2lycV9kZW11eChpbnQgaXJxX25yKQotewotCS8qIEZJWE1FICovCi0JcmV0dXJuIGlycV9ucjsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhMzdjOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIAotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMKLSAqCi0gKiBIYXJkd2FyZSBzdXBwb3J0IGZvciB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lvLmg+Ci0KLWV4dGVybiBpbnQgc2F0dXJuX2lycV9kZW11eChpbnQgaXJxX25yKTsKLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2F0dXJuIF9faW5pdG12ID0gewotCS5tdl9uYW1lCQk9ICJTZWdhIFNhdHVybiIsCi0JLm12X25yX2lycXMJCT0gODAsCS8qIEZpeCB0aGlzIGxhdGVyICovCi0KLQkubXZfaXNhX3BvcnQyYWRkcgk9IHNhdHVybl9pc2FfcG9ydDJhZGRyLAotCS5tdl9pcnFfZGVtdXgJCT0gc2F0dXJuX2lycV9kZW11eCwKLQotCS5tdl9pb3JlbWFwCQk9IHNhdHVybl9pb3JlbWFwLAotCS5tdl9pb3VubWFwCQk9IHNhdHVybl9pb3VubWFwLAotfTsKLUFMSUFTX01WKHNhdHVybikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0NjA5MS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiAKLSAqIGFyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYwotICoKLSAqIFNNUCBzdXBwb3J0IGZvciB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQotI2luY2x1ZGUgPGFzbS9zYXR1cm4vc21wYy5oPgotCi1leHRlcm4gdm9pZCBzdGFydF9zZWNvbmRhcnkodm9pZCk7Ci0KLXZvaWQgX19zbXBfc2VuZF9pcGkodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbikKLXsKLQkvKiBOb3RoaW5nIGhlcmUgeWV0IC4uICovCi19Ci0KLXVuc2lnbmVkIGludCBfX3NtcF9wcm9iZV9jcHVzKHZvaWQpCi17Ci0JLyoKLQkgKiBUaGlzIGlzIGp1c3QgYSBzdHJhaWdodGZvcndhcmQgbWFzdGVyL3NsYXZlIGNvbmZpZ3VyYXRpb24sCi0JICogYW5kIHByb2JpbmcgaXNuJ3QgcmVhbGx5IHN1cHBvcnRlZC4uCi0JICovCi0JcmV0dXJuIDI7Ci19Ci0KLS8qCi0gKiBXZSdyZSBvbmx5IGFsbG93ZWQgdG8gZG8gYnl0ZS1hY2Nlc3MgdG8gU01QQyByZWdpc3RlcnMuIEluCi0gKiBhZGRpdGlvbiB0byB3aGljaCwgd2UgdHJlYXQgdGhlbSBhcyB3cml0ZS1vbmx5LCBzaW5jZQotICogcmVhZGluZyBmcm9tIHRoZW0gd2lsbCByZXR1cm4gdW5kZWZpbmVkIGRhdGEuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXBjX3NsYXZlX3N0b3AodW5zaWduZWQgaW50IGNwdSkKLXsKLQlzbXBjX2JhcnJpZXIoKTsKLQljdHJsX291dGIoMSwgU01QQ19TVEFUVVMpOwotCi0JY3RybF9vdXRiKFNNUENfQ01EX1NTSE9GRiwgU01QQ19DT01NQU5EKTsKLQlzbXBjX2JhcnJpZXIoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNtcGNfc2xhdmVfc3RhcnQodW5zaWduZWQgaW50IGNwdSkKLXsKLQljdHJsX291dGIoMSwgU01QQ19TVEFUVVMpOwotCWN0cmxfb3V0YihTTVBDX0NNRF9TU0hPTiwgU01QQ19DT01NQU5EKTsKLQotCXNtcGNfYmFycmllcigpOwotfQotCi12b2lkIF9fc21wX3NsYXZlX2luaXQodW5zaWduZWQgaW50IGNwdSkKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHZicjsKLQl2b2lkICoqZW50cnk7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0YyB2YnIsICUwXG5cdCIgOiAiPXIiICh2YnIpKTsKLQllbnRyeSA9ICh2b2lkICoqKSh2YnIgKyAweDMxMCArIDB4OTQpOwotCi0Jc21wY19zbGF2ZV9zdG9wKGNwdSk7Ci0KLQkqKHZvaWQgKiopZW50cnkgPSAodm9pZCAqKXN0YXJ0X3NlY29uZGFyeTsKLQotCXNtcGNfc2xhdmVfc3RhcnQoY3B1KTsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jCmluZGV4IGNhNzE0ODcuLmEwNzRiNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKQEAgLTcwLDcgKzcwLDcgQEAKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIlNvbHV0aW9uRW5naW5lIiwKIAkubXZfbnJfaXJxcwkJPSAyNTYsCiAJLm12X2luYgkJCT0gc2U3MjA2X2luYiwKQEAgLTk2LDQgKzk2LDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlNzIwNl9JUlEsCiB9OwotQUxJQVNfTVYoc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMKaW5kZXggZjE5NjA5NS4uZWI0NjlmNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYwpAQCAtNDYsNyArNDYsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzMwMHNlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83MzAwc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiU29sdXRpb25FbmdpbmUgNzMwMCIsCiAJLm12X25yX2lycXMgPSAxMDksCiAJLm12X2luYiA9IHNoNzMwMHNlX2luYiwKQEAgLTcyLDQgKzcyLDMgQEAKIAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMwMHNlX0lSUSwKIH07Ci1BTElBU19NVig3MzAwc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvc2V0dXAuYwppbmRleCBlMTQzMDE3Li4xZGVlZTg1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMTgwc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMTgwc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiU29sdXRpb25FbmdpbmUgNzMxODAiLAogCS5tdl9ucl9pcnFzID0gMTA4LAogCS5tdl9pbmIgPSBzaDczMTgwc2VfaW5iLApAQCAtNzMsNCArNzMsMyBAQAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMxODBzZV9JUlEsCiAJLm12X2lycV9kZW11eCA9IHNobXNlX2lycV9kZW11eCwKIH07Ci1BTElBU19NVig3MzE4MHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jCmluZGV4IDNmZGIxNmYuLjhmZWMxNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMKQEAgLTY0LDcgKzY0LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczNDNzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzM0M3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIlNvbHV0aW9uRW5naW5lIDczNDMiLAogCS5tdl9zZXR1cCA9IHNoNzM0M3NlX3NldHVwLAogCS5tdl9ucl9pcnFzID0gMTA4LApAQCAtOTIsNCArOTIsMyBAQAogCS5tdl9pbml0X2lycSA9IGluaXRfNzM0M3NlX0lSUSwKIAkubXZfaXJxX2RlbXV4ID0gc2htc2VfaXJxX2RlbXV4LAogfTsKLUFMSUFTX01WKDczNDNzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYwppbmRleCA1MmQyYzRkLi4xZDBlZjdmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzYxOS9zZXR1cC5jCkBAIC0xNSw4ICsxNSw3IEBACiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTb2x1dGlvbkVuZ2luZSIsCiAJLm12X25yX2lycXMJCT0gMTA4LAogfTsKLUFMSUFTX01WKHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKaW5kZXggYzhlY2NmZi4uY2RiMDgwNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCkBAIC0xNSw0NiArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZS5oPgogCi0vKiAKLSAqIElmIHRoZSBwcm9ibGVtIG9mIG1ha2VfaXByX2lycSBpcyBzb2x2ZWQsIAotICogdGhpcyBjb2RlIHdpbGwgYmVjb21lIHVubmVjZXNzYXJ5LiA6LSkgCi0gKi8KLXN0YXRpYyB2b2lkIHNlNzcweF9kaXNhYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCi0JY3RybF9vdXR3KGN0cmxfaW53KHAtPmFkZHIpICYgKDB4ZmZmZiBeICgweGYgPDwgcC0+c2hpZnQpKSwgcC0+YWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlNzcweF9lbmFibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBwLT5hZGRyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzZTc3MHhfaXJxX2NoaXAgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gIk1TNzcweFNFLUZQR0EiLAotCS5tYXNrICAgICAgICAgICA9IHNlNzcweF9kaXNhYmxlX2lwcl9pcnEsCi0JLnVubWFzayAgICAgICAgID0gc2U3NzB4X2VuYWJsZV9pcHJfaXJxLAotCS5tYXNrX2FjayAgICAgICA9IHNlNzcweF9kaXNhYmxlX2lwcl9pcnEsCi19OwotCi12b2lkIG1ha2Vfc2U3NzB4X2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGlycSA9IHRhYmxlW2ldLmlycTsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJnNlNzcweF9pcnFfY2hpcCwKLQkJCWhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwotCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsICZ0YWJsZVtpXSk7Ci0JCXNlNzcweF9lbmFibGVfaXByX2lycShpcnEpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTc3MHhfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyoKIAkqIFN1cGVyIEkvTyAoSnVzdCBtaW1pYyBQQyk6CiAJKiAgMToga2V5Ym9hcmQKQEAgLTY4LDQ2ICsyOSw2NyBAQAogCSovCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQogCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLwotCXsgMTMsIDAsIDgsICAweDBmLTEzICxCQ1JfSUxDUkF9LAotCXsgNSAsIDAsIDQsICAweDBmLSA1ICxCQ1JfSUxDUkF9LAotCXsgMTAsIDAsIDAsICAweDBmLTEwLCBCQ1JfSUxDUkJ9LAotCXsgNyAsIDAsIDQsICAweDBmLSA3LCBCQ1JfSUxDUkN9LAotCXsgMyAsIDAsIDAsICAweDBmLSAzLCBCQ1JfSUxDUkN9LAotCXsgMSAsIDAsIDEyLCAweDBmLSAxLCBCQ1JfSUxDUkR9LAotCXsgMTIsIDAsIDQsICAweDBmLTEyLCBCQ1JfSUxDUkR9LCAvKiBMQU4gKi8KLQl7IDIgLCAwLCA4LCAgMHgwZi0gMiwgQkNSX0lMQ1JFfSwgLyogUENJUlEyICovCi0JeyA2ICwgMCwgNCwgIDB4MGYtIDYsIEJDUl9JTENSRX0sIC8qIFBDSVJRMSAqLwotCXsgMTQsIDAsIDAsICAweDBmLTE0LCBCQ1JfSUxDUkV9LCAvKiBQQ0lSUTAgKi8KLQl7IDAgLCAwLCAxMiwgMHgwZiAgICwgQkNSX0lMQ1JGfSwgCi0JeyA0ICwgMCwgNCwgIDB4MGYtIDQsIEJDUl9JTENSRn0sCi0JeyA4ICwgMCwgMTIsIDB4MGYtIDgsIEJDUl9JTENSR30sCi0JeyA5ICwgMCwgOCwgIDB4MGYtIDksIEJDUl9JTENSR30sCi0JeyAxMSwgMCwgNCwgIDB4MGYtMTEsIEJDUl9JTENSR30sCisJeyAxMywgMCwgOCwgIDB4MGYtMTMsIH0sCisJeyA1ICwgMCwgNCwgIDB4MGYtIDUsIH0sCisJeyAxMCwgMSwgMCwgIDB4MGYtMTAsIH0sCisJeyA3ICwgMiwgNCwgIDB4MGYtIDcsIH0sCisJeyAzICwgMiwgMCwgIDB4MGYtIDMsIH0sCisJeyAxICwgMywgMTIsIDB4MGYtIDEsIH0sCisJeyAxMiwgMywgNCwgIDB4MGYtMTIsIH0sIC8qIExBTiAqLworCXsgMiAsIDQsIDgsICAweDBmLSAyLCB9LCAvKiBQQ0lSUTIgKi8KKwl7IDYgLCA0LCA0LCAgMHgwZi0gNiwgfSwgLyogUENJUlExICovCisJeyAxNCwgNCwgMCwgIDB4MGYtMTQsIH0sIC8qIFBDSVJRMCAqLworCXsgMCAsIDUsIDEyLCAweDBmICAgLCB9LCAKKwl7IDQgLCA1LCA0LCAgMHgwZi0gNCwgfSwKKwl7IDggLCA2LCAxMiwgMHgwZi0gOCwgfSwKKwl7IDkgLCA2LCA4LCAgMHgwZi0gOSwgfSwKKwl7IDExLCA2LCA0LCAgMHgwZi0xMSwgfSwKICNlbHNlCi0JeyAxNCwgMCwgIDgsIDB4MGYtMTQgLEJDUl9JTENSQX0sCi0JeyAxMiwgMCwgIDQsIDB4MGYtMTIgLEJDUl9JTENSQX0sCi0JeyAgOCwgMCwgIDQsIDB4MGYtIDggLEJDUl9JTENSQn0sCi0JeyAgNiwgMCwgMTIsIDB4MGYtIDYgLEJDUl9JTENSQ30sCi0JeyAgNSwgMCwgIDgsIDB4MGYtIDUgLEJDUl9JTENSQ30sCi0JeyAgNCwgMCwgIDQsIDB4MGYtIDQgLEJDUl9JTENSQ30sCi0JeyAgMywgMCwgIDAsIDB4MGYtIDMgLEJDUl9JTENSQ30sCi0JeyAgMSwgMCwgMTIsIDB4MGYtIDEgLEJDUl9JTENSRH0sCisJeyAxNCwgMCwgIDgsIDB4MGYtMTQsIH0sCisJeyAxMiwgMCwgIDQsIDB4MGYtMTIsIH0sCisJeyAgOCwgMSwgIDQsIDB4MGYtIDgsIH0sCisJeyAgNiwgMiwgMTIsIDB4MGYtIDYsIH0sCisJeyAgNSwgMiwgIDgsIDB4MGYtIDUsIH0sCisJeyAgNCwgMiwgIDQsIDB4MGYtIDQsIH0sCisJeyAgMywgMiwgIDAsIDB4MGYtIDMsIH0sCisJeyAgMSwgMywgMTIsIDB4MGYtIDEsIH0sCiAjaWYgZGVmaW5lZChDT05GSUdfU1ROSUMpCiAJLyogU1QgTklDICovCi0JeyAxMCwgMCwgIDQsIDB4MGYtMTAgLEJDUl9JTENSRH0sIAkvKiBMQU4gKi8KKwl7IDEwLCAzLCAgNCwgMHgwZi0xMCwgfSwgCS8qIExBTiAqLwogI2VuZGlmCiAJLyogTVJTSFBDIElSUXMgc2V0dGluZyAqLwotCXsgIDAsIDAsIDEyLCAweDBmLSAwICxCQ1JfSUxDUkV9LAkvKiBQQ0lSUTMgKi8KLQl7IDExLCAwLCAgOCwgMHgwZi0xMSAsQkNSX0lMQ1JFfSwgCS8qIFBDSVJRMiAqLwotCXsgIDksIDAsICA0LCAweDBmLSA5ICxCQ1JfSUxDUkV9LCAJLyogUENJUlExICovCi0JeyAgNywgMCwgIDAsIDB4MGYtIDcgLEJDUl9JTENSRX0sIAkvKiBQQ0lSUTAgKi8KKwl7ICAwLCA0LCAxMiwgMHgwZi0gMCwgfSwJLyogUENJUlEzICovCisJeyAxMSwgNCwgIDgsIDB4MGYtMTEsIH0sIAkvKiBQQ0lSUTIgKi8KKwl7ICA5LCA0LCAgNCwgMHgwZi0gOSwgfSwgCS8qIFBDSVJRMSAqLworCXsgIDcsIDQsICAwLCAweDBmLSA3LCB9LCAJLyogUENJUlEwICovCiAJLyogIzIsICMxMyBhcmUgYWxsb2NhdGVkIGZvciBTTE9UIElSUSAjMSBhbmQgIzIgKGZvciBub3cpICovCiAJLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KLQl7IDEzLCAwLCAgNCwgMHgwZi0xMyAsQkNSX0lMQ1JHfSwgCS8qIFNMT1RJUlEyICovCi0JeyAgMiwgMCwgIDAsIDB4MGYtIDIgLEJDUl9JTENSR30sIAkvKiBTTE9USVJRMSAqLworCXsgMTMsIDYsICA0LCAweDBmLTEzLCB9LCAJLyogU0xPVElSUTIgKi8KKwl7ICAyLCA2LCAgMCwgMHgwZi0gMiwgfSwgCS8qIFNMT1RJUlExICovCiAjZW5kaWYKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJQkNSX0lMQ1JBLAorCUJDUl9JTENSQiwKKwlCQ1JfSUxDUkMsCisJQkNSX0lMQ1JELAorCUJDUl9JTENSRSwKKwlCQ1JfSUxDUkYsCisJQkNSX0lMQ1JHLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2U3NzB4IiwKKwl9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwpAQCAtMTIyLDUgKzEwNCw1IEBACiAJY3RybF9vdXR3KDAsIEJDUl9JTENSRik7CiAJY3RybF9vdXR3KDAsIEJDUl9JTENSRyk7CiAKLQltYWtlX3NlNzcweF9pcnEoc2U3NzB4X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3NzB4X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYwppbmRleCAxN2EyNjMxLi4yOTYyZGExIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU29sdXRpb25FbmdpbmUiLAogCS5tdl9zZXR1cAkJPSBzbXNjX3NldHVwLAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCkBAIC0xNjAsNCArMTYwLDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlX0lSUSwKIH07Ci1BTElBU19NVihzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL2lycS5jCmluZGV4IDA5OWU1ZGUuLjI2Y2ZmMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9pcnEuYwpAQCAtMTksMTUgKzE5LDI0IEBACiAjZGVmaW5lIElOVENfSU5UTVNLMCAgICAgICAgICAgICAweEZGRDAwMDQ0CiAjZGVmaW5lIElOVENfSU5UTVNLQ0xSMCAgICAgICAgICAweEZGRDAwMDY0CiAKK3N0cnVjdCBzZTc3MjJfZGF0YSB7CisJdW5zaWduZWQgY2hhciBpcnE7CisJdW5zaWduZWQgY2hhciBpcHJfaWR4OworCXVuc2lnbmVkIGNoYXIgc2hpZnQ7CisJdW5zaWduZWQgc2hvcnQgcHJpb3JpdHk7CisJdW5zaWduZWQgbG9uZyBhZGRyOworfTsKKworCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3NlNzcyMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBzZTc3MjJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJY3RybF9vdXR3KCBjdHJsX2ludyggcC0+YWRkciApIHwgcC0+cHJpb3JpdHkgLCBwLT5hZGRyICk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9zZTc3MjJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3Qgc2U3NzIyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCWN0cmxfb3V0dyggY3RybF9pbncoIHAtPmFkZHIgKSAmIH5wLT5wcmlvcml0eSAsIHAtPmFkZHIgKTsKIH0KIApAQCAtMzgsNyArNDcsNyBAQAogCS5tYXNrX2FjayAgICAgICA9IGRpc2FibGVfc2U3NzIyX2lycSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBzZTc3MjJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogaXJxICAgICAgICAsaWR4LHNmdCwgcHJpb3JpdHkgICAgICwgYWRkciAgICovCiAJeyBNUlNIUENfSVJRMCAsIDAgLCAwICwgTVJTSFBDX0JJVDAgLCBJUlEwMV9NQVNLIH0gLAogCXsgTVJTSFBDX0lSUTEgLCAwICwgMCAsIE1SU0hQQ19CSVQxICwgSVJRMDFfTUFTSyB9ICwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYwppbmRleCA2MzZjYTZjLi42Y2NhNmNiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9zZXR1cC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzcyMiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2U3NzIyIF9faW5pdG12ID0gewogCS5tdl9uYW1lICAgICAgICAgICAgICAgID0gIlNvbHV0aW9uIEVuZ2luZSA3NzIyIiAsCiAJLm12X3NldHVwICAgICAgICAgICAgICAgPSBzZTc3MjJfc2V0dXAgLAogCS5tdl9ucl9pcnFzCQk9IDEwOSAsCkBAIC0xNDUsNCArMTQ1LDMgQEAKIAkubXZfaXJxX2RlbXV4ICAgICAgICAgICA9IHNlNzcyMl9pcnFfZGVtdXgsCiAKIH07Ci1BTElBU19NVihzZTc3MjIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYwppbmRleCBlNGM2M2E0Li5jM2QxMjU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMKQEAgLTE0LDQ0ICsxNCwzMSBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2U3NzUxLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3NzUxX2lwcl9tYXBbXSA9IHsKLSAgLyogTGVhdmUgb2xkIFNvbHV0aW9uIEVuZ2luZSBjb2RlIGluIGZvciByZWZlcmVuY2UuICovCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FKQotCS8qCi0JICogU3VwZXIgSS9PIChKdXN0IG1pbWljIFBDKToKLQkgKiAgMToga2V5Ym9hcmQKLQkgKiAgMzogc2VyaWFsIDAKLQkgKiAgNDogc2VyaWFsIDEKLQkgKiAgNTogcHJpbnRlcgotCSAqICA2OiBmbG9wcHkKLQkgKiAgODogcnRjCi0JICogMTI6IG1vdXNlCi0JICogMTQ6IGlkZTAKLQkgKi8KLQl7IDE0LCBCQ1JfSUxDUkEsIDIsIDB4MGYtMTQgfSwKLQl7IDEyLCBCQ1JfSUxDUkEsIDEsIDB4MGYtMTIgfSwKLQl7ICA4LCBCQ1JfSUxDUkIsIDEsIDB4MGYtIDggfSwKLQl7ICA2LCBCQ1JfSUxDUkMsIDMsIDB4MGYtIDYgfSwKLQl7ICA1LCBCQ1JfSUxDUkMsIDIsIDB4MGYtIDUgfSwKLQl7ICA0LCBCQ1JfSUxDUkMsIDEsIDB4MGYtIDQgfSwKLQl7ICAzLCBCQ1JfSUxDUkMsIDAsIDB4MGYtIDMgfSwKLQl7ICAxLCBCQ1JfSUxDUkQsIDMsIDB4MGYtIDEgfSwKLQotCXsgMTAsIEJDUl9JTENSRCwgMSwgMHgwZi0xMCB9LCAvKiBMQU4gKi8KLQotCXsgIDAsIEJDUl9JTENSRSwgMywgMHgwZi0gMCB9LCAvKiBQQ0lSUTMgKi8KLQl7IDExLCBCQ1JfSUxDUkUsIDIsIDB4MGYtMTEgfSwgLyogUENJUlEyICovCi0JeyAgOSwgQkNSX0lMQ1JFLCAxLCAweDBmLSA5IH0sIC8qIFBDSVJRMSAqLwotCXsgIDcsIEJDUl9JTENSRSwgMCwgMHgwZi0gNyB9LCAvKiBQQ0lSUTAgKi8KLQotCS8qICMyLCAjMTMgYXJlIGFsbG9jYXRlZCBmb3IgU0xPVCBJUlEgIzEgYW5kICMyIChmb3Igbm93KSAqLwotCS8qIE5PVEU6ICMyIGFuZCAjMTMgYXJlIG5vdCB1c2VkIG9uIFBDICovCi0JeyAxMywgQkNSX0lMQ1JHLCAxLCAweDBmLTEzIH0sIC8qIFNMT1RJUlEyICovCi0JeyAgMiwgQkNSX0lMQ1JHLCAwLCAweDBmLSAyIH0sIC8qIFNMT1RJUlExICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSkKLQl7IDEzLCBCQ1JfSUxDUkQsIDMsIDIgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgMTMsIDMsIDMsIDIgfSwKIAkvKiBBZGQgYWRkaXRpb25hbCBlbnRyaWVzIGhlcmUgYXMgZHJpdmVycyBhcmUgYWRkZWQgYW5kIHRlc3RlZC4gKi8KLSNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlCQ1JfSUxDUkEsCisJQkNSX0lMQ1JCLAorCUJDUl9JTENSQywKKwlCQ1JfSUxDUkQsCisJQkNSX0lMQ1JFLAorCUJDUl9JTENSRiwKKwlCQ1JfSUxDUkcsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNlNzc1MSIsCisJfSwKIH07CiAKIC8qCkBAIC01OSw1ICs0Niw1IEBACiAgKi8KIHZvaWQgX19pbml0IGluaXRfNzc1MXNlX0lSUSh2b2lkKQogewotCW1ha2VfaXByX2lycShzZTc3NTFfaXByX21hcCwgQVJSQVlfU0laRShzZTc3NTFfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jCmluZGV4IDUyYzdiZmEuLjc4NzNkMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL3NldHVwLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzc1MXNlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICI3NzUxIFNvbHV0aW9uRW5naW5lIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIApAQCAtNzEsNCArNzEsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfNzc1MXNlX0lSUSwKIH07Ci1BTElBU19NVig3NzUxc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9pcnEuYwppbmRleCAzZDA2MjVjLi44NzQ5MTQ3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvaXJxLmMKQEAgLTE2LDI4ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlNzc4MC5oPgogCi0jZGVmaW5lIElOVENfSU5UTVNLMCAgICAgICAgICAgICAweEZGRDAwMDQ0Ci0jZGVmaW5lIElOVENfSU5UTVNLQ0xSMCAgICAgICAgICAweEZGRDAwMDY0Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfc2U3NzgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIElOVENfSU5UTVNLMCArIHAtPm1za19vZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfc2U3NzgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIElOVENfSU5UTVNLQ0xSMCArIHAtPm1za19vZmZzZXQpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHNlNzc4MF9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lICAgICAgICAgICA9ICJTRTc3ODAiLAotCS5tYXNrICAgICAgICAgICA9IGRpc2FibGVfc2U3NzgwX2lycSwKLQkudW5tYXNrICAgICAgICAgPSBlbmFibGVfc2U3NzgwX2lycSwKLQkubWFza19hY2sgICAgICAgPSBkaXNhYmxlX3NlNzc4MF9pcnEsCi19OwotCiBzdGF0aWMgc3RydWN0IGludGMyX2RhdGEgaW50YzJfaXJxX3RhYmxlW10gPSB7CiAJeyAyLCAgMCwgMzEsIDAsIDMxLCAzIH0sIC8qIGRhdWdodGVyIGJvYXJkIEVYVElOVDEgKi8KIAl7IDQsICAwLCAzMCwgMCwgMzAsIDMgfSwgLyogZGF1Z2h0ZXIgYm9hcmQgRVhUSU5UMiAqLwpAQCAtNTEsMTMgKzI5LDI0IEBACiAJeyAwICwgMCwgMjQsIDAsIDI0LCAzIH0sIC8qIFNNNTAxICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMCwgLyogTi9BICovCisJLm1za19iYXNlCT0gMHhmZmQwMDA0NCwKKwkubXNrY2xyX2Jhc2UJPSAweGZmZDAwMDY0LAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2U3NzgwIiwKKwl9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwogdm9pZCBfX2luaXQgaW5pdF9zZTc3ODBfSVJRKHZvaWQpCiB7Ci0JaW50IGkgOwotCiAJLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHQgYXQgRlBHQSAqLwogCWN0cmxfb3V0dygwLCBGUEdBX0lOVE1TSzEpOwogCS8qIG1hc2sgU001MDEgaW50ZXJydXB0ICovCkBAIC03OSwxMSArNjgsNSBAQAogCS8qIEZQR0EgKyAweDBBICovCiAJY3RybF9vdXR3KChJUlFQSU5fUENDUFcgPDwgSVJRUE9TX1BDQ1BXKSwgRlBHQV9JTlRTRUwzKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSk7IGkrKykgewotCQlkaXNhYmxlX2lycV9ub3N5bmMoaW50YzJfaXJxX3RhYmxlW2ldLmlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKCBpbnRjMl9pcnFfdGFibGVbaV0uaXJxLCAmc2U3NzgwX2lycV9jaGlwLAotCQkJaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7Ci0JCXNldF9pcnFfY2hpcF9kYXRhKCBpbnRjMl9pcnFfdGFibGVbaV0uaXJxLCAmaW50YzJfaXJxX3RhYmxlW2ldICk7Ci0JCWRpc2FibGVfc2U3NzgwX2lycShpbnRjMl9pcnFfdGFibGVbaV0uaXJxKTsKLQl9CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jCmluZGV4IGRmN2QwOGEuLjcyM2YyZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL3NldHVwLmMKQEAgLTExMywxMCArMTEzLDkgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzc4MCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2U3NzgwIF9faW5pdG12ID0gewogCS5tdl9uYW1lICAgICAgICAgICAgICAgID0gIlNvbHV0aW9uIEVuZ2luZSA3NzgwIiAsCiAJLm12X3NldHVwICAgICAgICAgICAgICAgPSBzZTc3ODBfc2V0dXAgLAogCS5tdl9ucl9pcnFzCQk9IDExMSAsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc2U3NzgwX0lSUSwKIH07Ci1BTElBU19NVihzZTc3ODApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKaW5kZXggYzA2OWM0NC4uOWMwMzFhOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYwpAQCAtMTUsMTcgKzE1LDMzIEBACiAjaW5jbHVkZSA8YXNtL3NoMDMvc2gwMy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDAzX2lwcl9tYXBbXSA9IHsKLQl7IElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkgfSwKLQl7IElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkgfSwKLQl7IElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkgfSwKLQl7IElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgSVJMMF9JUlEsIDAsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSB9LAorCXsgSVJMMV9JUlEsIDAsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSB9LAorCXsgSVJMMl9JUlEsIDAsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSB9LAorCXsgSVJMM19JUlEsIDAsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlJTlRDX0lQUkQsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoMDMiLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zaDAzX0lSUSh2b2lkKQogewogCWN0cmxfb3V0dyhjdHJsX2ludyhJTlRDX0lDUikgfCBJTlRDX0lDUl9JUkxNLCBJTlRDX0lDUik7Ci0JbWFrZV9pcHJfaXJxKHNoMDNfaXByX21hcCwgQVJSQVlfU0laRShzaDAzX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogZXh0ZXJuIHZvaWQgKmNmX2lvX2Jhc2U7CkBAIC03NCwxMSArOTAsMTAgQEAKIH0KIF9faW5pdGNhbGwoc2gwM19kZXZpY2VzX3NldHVwKTsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMDMgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMDMgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkludGVyZmFjZSAoQ1RQL1BDSS1TSDAzKSIsCiAJLm12X3NldHVwCQk9IHNoMDNfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNDgsCiAJLm12X2lvcG9ydF9tYXAJCT0gc2gwM19pb3BvcnRfbWFwLAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NoMDNfSVJRLAogfTsKLUFMSUFTX01WKHNoMDMpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYwppbmRleCA0YTlkZjRhLi5kZmQxMjQ1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKQEAgLTYsMjggKzYsNDQgQEAKICAqIFNITUlOIFN1cHBvcnQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vc2htaW4uaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgUEZDX1BIQ1IJMHhhNDAwMDEwZVVMCiAjZGVmaW5lIElOVENfSUNSMQkweGE0MDAwMDEwVUwKICNkZWZpbmUgSU5UQ19JUFJDCTB4YTQwMDAwMTZVTAogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNobWluX2lwcl9tYXBbXSA9IHsKLQl7IC5pcnE9MzIsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PSAwLCAucHJpb3JpdHk9MCB9LAotCXsgLmlycT0zMywgLmFkZHI9SU5UQ19JUFJDLCAuc2hpZnQ9IDQsIC5wcmlvcml0eT0wIH0sCi0JeyAuaXJxPTM0LCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0gOCwgLnByaW9yaXR5PTggfSwKLQl7IC5pcnE9MzUsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PTEyLCAucHJpb3JpdHk9MCB9LAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyAzMiwgMCwgMCwgMCB9LAorCXsgMzMsIDAsIDQsIDAgfSwKKwl7IDM0LCAwLCA4LCA4IH0sCisJeyAzNSwgMCwgMTIsIDAgfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJSU5UQ19JUFJDLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaG1pbiIsCisJfSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NobWluX2lycSh2b2lkKQogewogCWN0cmxfb3V0dygweDJhMDAsIFBGQ19QSENSKTsJLy8gSVJRMC0zPUlSUQogCWN0cmxfb3V0dygweDBhYWEsIElOVENfSUNSMSk7CS8vIElSUTAtMz1JUlEtbW9kZSxMb3ctYWN0aXZlLgotCW1ha2VfaXByX2lycShzaG1pbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNobWluX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogc3RhdGljIHZvaWQgX19pb21lbSAqc2htaW5faW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBzaXplKQpAQCAtNDMsOSArNTksOCBAQAogCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaG1pbiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2htaW4gX19pbml0bXYgPSB7CiAJLm12X25hbWUJPSAiU0hNSU4iLAogCS5tdl9pbml0X2lycQk9IGluaXRfc2htaW5faXJxLAogCS5tdl9pb3BvcnRfbWFwCT0gc2htaW5faW9wb3J0X21hcCwKIH07Ci1BTElBU19NVihzaG1pbikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCmluZGV4IDY1MGZiMzYuLjg0MjcxZDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYwpAQCAtNjgsMTEgKzY4LDI3IEBACiAgKiBJUkwzID0gY3J5cHRvCiAgKi8KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzbmFwZ2Vhcl9pcHJfbWFwW10gPSB7Ci0JbWFrZV9pcHJfaXJxKElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwxX0lSUSwgSVJMMV9JUFJfQUREUiwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMMl9JUlEsIElSTDJfSVBSX0FERFIsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkpOworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyBJUkwwX0lSUSwgMCwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZIH0sCisJeyBJUkwxX0lSUSwgMCwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZIH0sCisJeyBJUkwyX0lSUSwgMCwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZIH0sCisJeyBJUkwzX0lSUSwgMCwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCUlOVENfSVBSRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc25hcGdlYXIiLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zbmFwZ2Vhcl9JUlEodm9pZCkKQEAgLTgyLDcgKzk4LDcgQEAKIAogCXByaW50aygiU2V0dXAgU25hcEdlYXIgSVJRL0lQUiAuLi5cbiIpOwogCi0JbWFrZV9pcHJfaXJxKHNuYXBnZWFyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc25hcGdlYXJfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQogCiAvKgpAQCAtOTYsNyArMTEyLDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NuYXBnZWFyIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zbmFwZ2VhciBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU25hcEdlYXIgU2VjdXJlRWRnZTU0MTAiLAogCS5tdl9zZXR1cAkJPSBzbmFwZ2Vhcl9zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA3MiwKQEAgLTExNyw0ICsxMzMsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc25hcGdlYXJfSVJRLAogfTsKLUFMSUFTX01WKHNuYXBnZWFyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYwppbmRleCA2Mzk2Y2VhLi5mYzhjZDA2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYwpAQCAtMzcxLDcgKzM3MSw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDQyMDJfbWljcm9kZXYgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoNDIwMl9taWNyb2RldiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU0g0LTIwMiBNaWNyb0RldiIsCiAJLm12X3NldHVwCQk9IG1pY3JvZGV2X3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDcyLAkJLyogUVFRIG5lZWQgdG8gY2hlY2sgdGhpcyAtIHVzZSB0aGUgTUFDUk8gKi8KQEAgLTQwMyw0ICs0MDMsMyBAQAogCS5tdl9oZWFydGJlYXQJCT0gbWljcm9kZXZfaGVhcnRiZWF0LAogI2VuZGlmCiB9OwotQUxJQVNfTVYoc2g0MjAyX21pY3JvZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMKaW5kZXggNmJjZDkzOS4uNjA2ZDI1YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8YXNtL3RpdGFuLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgdGl0YW5faXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFIgaWR4LCBzaGlmdCwgcHJpbyAqLwogCXsgVElUQU5fSVJRX1dBTiwgICAzLCAxMiwgOCB9LAkvKiBldGgwIChXQU4pICovCiAJeyBUSVRBTl9JUlFfTEFOLCAgIDMsICA4LCA4IH0sCS8qIGV0aDEgKExBTikgKi8KQEAgLTIwLDE1ICsyMCwzMyBAQAogCXsgVElUQU5fSVJRX1VTQiwgICAzLCAgMCwgOCB9LAkvKiBtUENJIEIgKGJvdHRvbSksIFVTQiAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsgLyogc3RvbGVuIGZyb20gc2V0dXAtc2g3NzUwLmMgKi8KKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItdGl0YW4iLAorCX0sCit9Owogc3RhdGljIHZvaWQgX19pbml0IGluaXRfdGl0YW5faXJxKHZvaWQpCiB7CiAJLyogZW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFscyAqLwogCWlwcl9pcnFfZW5hYmxlX2lybG0oKTsKIAkvKiByZWdpc3RlciBpcHIgaXJxcyAqLwotCW1ha2VfaXByX2lycSh0aXRhbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHRpdGFuX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3RpdGFuIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl90aXRhbiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9CSJUaXRhbiIsCiAKIAkubXZfaW5iID0JdGl0YW5faW5iLApAQCAtNTIsNCArNzAsMyBAQAogCiAJLm12X2luaXRfaXJxID0JaW5pdF90aXRhbl9pcnEsCiB9OwotQUxJQVNfTVYodGl0YW4pCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxOGY0MC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB1bmtub3duIFNIIGJvYXJkcyAKLSMKLQotb2JqLXkJIDo9IHNldHVwLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU0NjEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy91bmtub3duL3NldHVwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBTZXR1cCBjb2RlIGZvciBhbiB1bmtub3duIG1hY2hpbmUgKGludGVybmFsIHBlcmlwaGVyYWxzIG9ubHkpCi0gKgotICogVGhpcyBpcyB0aGUgc2ltcGxlc3Qgb2YgYWxsIGJvYXJkcywgYW5kIHNlcnZlcyBvbmx5IGFzIGEgcXVpY2sgYW5kIGRpcnR5Ci0gKiBtZXRob2QgdG8gc3RhcnQgZGVidWdnaW5nIGEgbmV3IGJvYXJkIGR1cmluZyBicmluZy11cCB1bnRpbCBwcm9wZXIgYm9hcmQKLSAqIHNldHVwIGNvZGUgaXMgd3JpdHRlbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfdW5rbm93biBfX2luaXRtdiA9IHsKLQkubXZfbmFtZQkJPSAiVW5rbm93biIsCi19OwotQUxJQVNfTVYodW5rbm93bikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY2NoaXBzL0tjb25maWcgYi9hcmNoL3NoL2NjaGlwcy9LY29uZmlnCmluZGV4IDA1ODJjYTguLjJlNTE2ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL0tjb25maWcKKysrIGIvYXJjaC9zaC9jY2hpcHMvS2NvbmZpZwpAQCAtMTMsMTAgKzEzLDggQEAKIAkgIGFyZSBhZGRpdGlvbmFsIEdQSU8gYml0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyZmFjZSB0bwogCSAgZXh0ZXJuYWwgYXMgd2VsbC4KIAotIyBBIGJvYXJkIG11c3QgaGF2ZSBkZWZpbmVkIEhENjQ0NlhfU0VSSUVTIGluIG9yZGVyIHRvIHNlZSB0aGVzZQogY29uZmlnIEhENjQ0NlhfU0VSSUVTCi0JYm9vbCAiSEQ2NDQ2eCBzdXBwb3J0IgotCWRlZmF1bHQgbgorCWJvb2wKIAogY2hvaWNlCiAJcHJvbXB0ICJIRDY0NDZ4IG9wdGlvbnMiCkBAIC0yNSw3ICsyMyw2IEBACiAKIGNvbmZpZyBIRDY0NDYxCiAJYm9vbCAiSGl0YWNoaSBIRDY0NDYxIGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkKIAktLS1oZWxwLS0tCiAJICBUaGUgSGl0YWNoaSBIRDY0NDYxIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IKIAkgIHRoZSBTSDc3MDkgQ1BVLCBzdXBwb3J0aW5nIGEgTENEIGNvbnRyb2xsZXIsCkBAIC00MCw3ICszNyw2IEBACiAKIGNvbmZpZyBIRDY0NDY1CiAJYm9vbCAiSGl0YWNoaSBIRDY0NDY1IGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTAKIAktLS1oZWxwLS0tCiAJICBUaGUgSGl0YWNoaSBIRDY0NDY1IHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IKIAkgIHRoZSBTSDc3NTAgQ1BVLCBzdXBwb3J0aW5nIGEgTENEIGNvbnRyb2xsZXIsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCmluZGV4IDhiNmI1YTcuLjNmZGQyNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCkBAIC0xLDE1ICsxLDIzIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgVHVlIE9jdCAgMyAxMDo1MTo1NSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFNhdCBKdWwgIDcgMDM6NDc6NDUgMjAwNwogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1lTX1NVUFBPUlRTX1BDST15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0yOCw2ICszNiw3IEBACiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiAjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKQEAgLTM1LDggKzQ0LDEwIEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNTAsMTQgKzYxLDE5IEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtOTMsNDQgKzEwOSw5IEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9EUkVBTUNBU1Q9eQotIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfVU5LTk9XTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIHNlbGVjdGlvbgotIwogQ09ORklHX0NQVV9TSDQ9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMyBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xMzgsNzkgKzExOSw5MyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAotCi0jCi0jIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLUNPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTA9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxPXkKLUNPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDEwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CiBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfRlBVPXkKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CiBDT05GSUdfU0hfU1RPUkVfUVVFVUVTPXkKIENPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JUFJfSVJRPXkKIENPTkZJR19DUFVfSEFTX1NSX1JCPXkKK0NPTkZJR19DUFVfSEFTX1BURUE9eQogCiAjCi0jIFRpbWVyIHN1cHBvcnQKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NIX0RSRUFNQ0FTVD15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgogQ09ORklHX1NIX1BDTEtfRlJFUT00OTg3NjUwNAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMzIsNiArMjI3LDcgQEAKICMKICMgRE1BIHN1cHBvcnQKICMKK0NPTkZJR19TSF9ETUFfQVBJPXkKIENPTkZJR19TSF9ETUE9eQogQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFM9NAogQ09ORklHX05SX0RNQV9DSEFOTkVMU19CT09MPXkKQEAgLTI0MCwxNyArMjM2LDIzIEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorCisjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAorIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBmZWF0dXJlcwogIwogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKIENPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUPXkKQEAgLTI2OSwzMyArMjcxLDIzIEBACiAjIEJ1cyBvcHRpb25zCiAjCiBDT05GSUdfUENJPXkKLSMgQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19QQ0lfQVVUTz15Ci0jIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwogIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCiAjCiBDT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfRkxBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogQ09ORklHX05FVD15CkBAIC0zMDMsMTMgKzI5NSwxMyBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogQ09ORklHX1hGUk09eQogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzI3LDMwICszMTksMjAgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNzYsNyArMzU4LDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zOTQsMTAgKzM4NSw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKIAogIwpAQCAtNDA4LDYgKzM5NSw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtNDIxLDEzICs0MDksMTYgQEAKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjIE1pc2MgZGV2aWNlcwogIworIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDM2LDEwICs0MjcsNiBAQAogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCkBAIC00NTUsNiArNDQyLDcgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCkBAIC00NzAsMTUgKzQ1OCw3IEBACiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwpAQCAtNTIxLDQ3ICs1MDEsMTYgQEAKICMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RMQU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MySU8gaXMgbm90IHNldAotIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIworIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAogCiAjCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIyBXaXJlbGVzcyBMQU4KICMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CkBAIC02MDQsMTcgKzU1MywxOSBAQAogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1BTMiBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjYwLDEwICs2MTEsNiBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC02ODAsMTQgKzYyNyw4IEBACiAjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKQEAgLTY5NSwxMSArNjM2LDcgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC03MTEsNDQgKzY0OCw1MSBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKLUNPTkZJR19IV01PTj15Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogQ09ORklHX0ZCPXkKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKKyMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIwogIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldApAQCAtNzYzLDEzICs3MDcsMTcgQEAKICMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAogIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtNzg5LDEwICs3MzcsNiBAQAogIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF8xMHgxOCBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCiBDT05GSUdfTE9HTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CkBAIC04MDAsNyArNzQ0LDYgQEAKICMgQ09ORklHX0xPR09fU1VQRVJIX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19TVVBFUkhfVkdBMTYgaXMgbm90IHNldAogQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQ9eQotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZApAQCAtODA4LDYgKzc1MSwxMiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKICMgVVNCIHN1cHBvcnQKICMKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKQEAgLTgyMywxMCArNzcyLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC04NzQsMTAgKzgxOSwxMiBAQAogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC05NTcsNiArOTA0LDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogQ09ORklHX1BST0ZJTElORz15CkBAIC05NjUsMTcgKzkxNywxOCBAQAogIwogIyBLZXJuZWwgaGFja2luZwogIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfU0hfS0dEQiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtOTkxLDggKzk0NCwxMyBAQAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCitDT05GSUdfQklUUkVWRVJTRT15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Zjc0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBtcF9kZWZjb25maWcKQEAgLTAsMCArMSwxMjIzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIE1vbiBKdW4gMTEgMTA6MjQ6NTcgMjAwNworIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9OT09QPXkKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCisKKyMKKyMgU3lzdGVtIHR5cGUKKyMKK0NPTkZJR19DUFVfU0g0PXkKK0NPTkZJR19DUFVfU0g0QT15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MD15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUVVJQ0tMSVNUPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwODAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDgwMDAwMDAKKyMgQ09ORklHXzMyQklUIGlzIG5vdCBzZXQKK0NPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1NIX0ZQVT15CisjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CitDT05GSUdfU1BFQ1VMQVRJVkVfRVhFQ1VUSU9OPXkKK0NPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlE9eQorQ09ORklHX0NQVV9IQVNfU1JfUkI9eQorCisjCisjIEJvYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9ISUdITEFOREVSPXkKKyMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3NzgwTVA9eQorIyBDT05GSUdfU0hfUjc3ODVSUCBpcyBub3Qgc2V0CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0yOAorQ09ORklHX1NIX1BDTEtfRlJFUT0zMjAwMDAwMAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisjIENPTkZJR19IRDY0NDZYX1NFUklFUyBpcyBub3Qgc2V0CisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0hFQVJUQkVBVCBpcyBub3Qgc2V0CitDT05GSUdfUFVTSF9TV0lUQ0g9eQorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfUFJFRU1QVF9CS0w9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAgcm9vdD0vZGV2L3NkYTEiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19QQ0k9eQorQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CitDT05GSUdfUENJX0FVVE89eQorQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorQ09ORklHX0JSSURHRT1tCisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfTExDPW0KKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPW0KKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1NJTD15CisjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorQ09ORklHX1BBVEFfUExBVEZPUk09eQorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKK0NPTkZJR19QQ05FVDMyPW0KKyMgQ09ORklHX1BDTkVUMzJfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5Q1A9bQorQ09ORklHXzgxMzlUT089bQorIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT09fODEyOT15CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKK0NPTkZJR19WSUFfUkhJTkU9bQorQ09ORklHX1ZJQV9SSElORV9NTUlPPXkKKyMgQ09ORklHX1ZJQV9SSElORV9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwPXkKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwMD1tCisjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorQ09ORklHX1I4MTY5PXkKKyMgQ09ORklHX1I4MTY5X05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDEgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwMD15CisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAorIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZQT1JUPXkKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKK0NPTkZJR19TT1VORF9QUklNRT1tCisjIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKKworIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFX0ZTPW0KKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorQ09ORklHX05URlNfRlM9eQorIyBDT05GSUdfTlRGU19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTlRGU19SVz15CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJGUz15CitDT05GSUdfSFVHRVRMQl9QQUdFPXkKK0NPTkZJR19SQU1GUz15CitDT05GSUdfQ09ORklHRlNfRlM9bQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfTkZTRF9UQ1A9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV85MzI9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX09QUk9GSUxFPW0KKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0tHREIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9eQorQ09ORklHX0NSWVBUT19QQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZwppbmRleCAwZjVlYzY0Li41YzI5MzM4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODVycF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjMwotIyBNb24gTWFyIDEyIDE0OjI2OjMzIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgVGh1IEp1bCAxMiAxMjozMzoxNSAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTExLDcgKzExLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19QQ0k9eQogQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CkBAIC00Myw2ICs0NSw3IEBACiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldApAQCAtNjAsMTMgKzYzLDE4IEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiAjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15Ci1DT05GSUdfU0xBQj15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTEwMiw1NSArMTEwLDExIEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotQ09ORklHX1NIX0hJR0hMQU5ERVI9eQotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SNzc4ME1QIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9SNzc4NVJQPXkKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIND15CiBDT05GSUdfQ1BVX1NINEE9eQogQ09ORklHX0NQVV9TSFgyPXkKLQotIwotIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0Ci0jCi0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKLQotIwotIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKLQotIwotIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xNTgsMTAgKzEyMiw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CkBAIC0xNzAsMjMgKzEzMSwxMiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NT15Ci0KLSMKLSMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CkBAIC0xOTQsNiArMTQ0LDcgQEAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwogIworQ09ORklHX1FVSUNLTElTVD15CiBDT05GSUdfTU1VPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MDgwMDAwMDAKQEAgLTIwMSw2ICsxNTIsMTIgQEAKIENPTkZJR18zMkJJVD15CiAjIENPTkZJR19YMlRMQiBpcyBub3Qgc2V0CiBDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMjE1LDE3ICsxNzIsMTcgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKQEAgLTI0MSwxMiArMTk4LDIyIEBACiBDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIworIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU0hfSElHSExBTkRFUj15CisjIENPTkZJR19TSF9SNzc4MFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1I3NzgwTVAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3Nzg1UlA9eQorCisjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MjgKLUNPTkZJR19OT19JRExFX0haPXkKIENPTkZJR19TSF9QQ0xLX0ZSRVE9NTAwMDAwMDAKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjYxLDcgKzIyOCw2IEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCkBAIC0yNzgsNyArMjQ0LDcgQEAKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogQ09ORklHX0tFWEVDPXkKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CkBAIC0zMDAsMzEgKzI2NiwyMiBAQAogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfUENJX0FVVE89eQogQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CiAjCiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKICMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKIAogIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0ZMQVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotCi0jCiAjIE5ldHdvcmtpbmcKICMKIENPTkZJR19ORVQ9eQpAQCAtMzMyLDcgKzI4OSw2IEBACiAjCiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIwotIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAogQ09ORklHX1BBQ0tFVD15CiAjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWD15CkBAIC0zNzcsMjAgKzMzMyw4IEBACiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogQ09ORklHX0JSSURHRT1tCkBAIC00MTcsOCArMzYxLDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTQzOCwxMCArMzkwLDYgQEAKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCiAjIENPTkZJR19NVEQgaXMgbm90IHNldAogCiAjCkBAIC00NzUsMTIgKzQyMywxMCBAQAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAogIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01MDksNiArNDU1LDcgQEAKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KIAogIwogIyBTQ1NJIFRyYW5zcG9ydHMKQEAgLTU1NCwxMCArNTAxLDYgQEAKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldApAQCAtNTgwLDYgKzUyMyw3IEBACiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CkBAIC02MjksNiArNTczLDcgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCkBAIC02NDQsMTUgKzU4OSw3IEBACiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwpAQCAtNjczLDEwICs2MTAsNyBAQAogIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCitDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldApAQCAtNjg5LDU1ICs2MjMsMjYgQEAKICMgQ09ORklHX1NLR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDEgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIworQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIworIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMgV2lyZWxlc3MgTEFOCiAjCi1DT05GSUdfTkVUX1JBRElPPXkKLSMgQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgaXMgbm90IHNldAotCi0jCi0jIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCi0jCi0jIENPTkZJR19TVFJJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAotIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAotCi0jCi0jIFByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BSSVNNNTQgaXMgbm90IHNldAotIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfV0lSRUxFU1M9eQotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZEREkgaXMgbm90IHNldAogIyBDT05GSUdfSElQUEkgaXMgbm90IHNldApAQCAtNzg5LDYgKzY5NCw3IEBACiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTgzMSwxNCArNzM3LDggQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKQEAgLTg0OCwxMCArNzQ4LDcgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC04NjQsMTYgKzc2MSwxNSBAQAogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0Ci0jCiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwpAQCAtODg1LDIyICs3ODEsMzAgQEAKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKIENPTkZJR19GQj15CiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC05MDgsNyArODEyLDcgQEAKICMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CiAKICMKLSMgRnJhbWJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiAjCiAjIENPTkZJR19GQl9DSVJSVVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUE0yIGlzIG5vdCBzZXQKQEAgLTkzMCwxMiArODM0LDExIEBACiAjIENPTkZJR19GQl9LWVJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCXzNERlggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WVDg2MjMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BUksgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUE0zIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwogIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CiAKICMKQEAgLTk1MiwxMyArODU1LDEwIEBACiAjIE9wZW4gU291bmQgU3lzdGVtCiAjCiBDT05GSUdfU09VTkRfUFJJTUU9bQotIyBDT05GSUdfT0JTT0xFVEVfT1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0lDSCBpcyBub3Qgc2V0CisjIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CiAKICMKICMgSElEIERldmljZXMKQEAgLTk4MiwxMCArODgyLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC0xMDI2LDE4ICs5MjIsMzAgQEAKIENPTkZJR19SVENfSU5URl9QUk9DPXkKIENPTkZJR19SVENfSU5URl9ERVY9eQogIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CiAKICMKLSMgUlRDIGRyaXZlcnMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKLUNPTkZJR19SVENfRFJWX1NIPXkKLSMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIwogIyBETUEgRW5naW5lIHN1cHBvcnQKICMKICMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldApAQCAtMTA1MSwxNCArOTU5LDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTExNTcsNiArMTA1Nyw3IEBACiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKKyMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CkBAIC0xMjM5LDcgKzExNDAsNiBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKQEAgLTEyNjYsNiArMTE2Niw3IEBACiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKIENPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CkBAIC0xMzAwLDYgKzEyMDEsNyBAQAogQ09ORklHX0NSWVBUT19DQkM9eQogQ09ORklHX0NSWVBUT19QQ0JDPW0KICMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0RFUz15CiAjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CkBAIC0xMzI4LDcgKzEyMzAsOSBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwppbmRleCA4N2FiOTA4Li5mMmYyYTNjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwpAQCAtMSwxOCArMSwyMiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5Ci0jIFdlZCBEZWMgIDYgMTQ6NDA6MTUgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBGcmkgSnVuIDE1IDE5OjM3OjQ2IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKICMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTM0LDggKzM4LDEwIEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNDgsMTIgKzU0LDE3IEBACiAjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorQ09ORklHX0FOT05fSU5PREVTPXkKICMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKLUNPTkZJR19TTEFCPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiAjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTgzLDUzICs5NCwxMCBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfRUMzMTA0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NBVFVSTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9EUkVBTUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAotQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0gyPXkKIENPTkZJR19DUFVfU0gyQT15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDY9eQotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTEzNywxMCArMTA1LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE0OSwzMiArMTE0LDI4IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDAwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX1BBR0VfU0laRV80S0I9eQogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CkBAIC0xODQsMzUgKzE0NSw0MiBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAotIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBmZWF0dXJlcwogIwogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKLSMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0hBU19JUFJfSVJRPXkKIAogIwotIyBUaW1lciBzdXBwb3J0CisjIEJvYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19TT0xVVElPTl9FTkdJTkU9eQorQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKKworIworIyBUaW1lciBhbmQgY2xvY2sgY29uZmlndXJhdGlvbgogIwogQ09ORklHX1NIX0NNVD15CiAjIENPTkZJR19TSF9NVFUyIGlzIG5vdCBzZXQKIENPTkZJR19TSF9USU1FUl9JUlE9MTQwCi0jIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKIENPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKIENPTkZJR19TSF9DTEtfTUQ9NgorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKQEAgLTIyNywxMSArMTk1LDExIEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCiAjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAogIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAogCiAjCkBAIC0yMzksMTAgKzIwNywxMSBAQAogIwogQ09ORklHX0haXzEwMD15CiAjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTEwMAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfTk9ORT15CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKQEAgLTI1MiwyMyArMjIxLDE4IEBACiAjCiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCi0jIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKICMKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAogIwogCiAjCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKLQotIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9GTEFUPXkKQEAgLTI3NywxMSArMjQxLDYgQEAKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTI4OSw3ICsyNDgsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VTklYIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldApAQCAtMzE0LDI1ICsyNzIsMTQgQEAKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNTgsNyArMzA1LDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zNzUsMTAgKzMzMSw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQpAQCAtMzkzLDYgKzM0NSw3IEBACiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCiAjCiBDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKIENPTkZJR19NVERfQkxPQ0s9eQogIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GVEwgaXMgbm90IHNldApAQCAtNDI0LDcgKzM3Nyw2IEBACiAjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAogCiAjCiAjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKQEAgLTQ1MiwxNiArNDA0LDEzIEBACiAjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKICMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKIAogIwotIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcwogIwotIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CiAKICMKICMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CkBAIC00NzEsNiArNDIwLDcgQEAKICMKICMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CiAjCisjIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKIAogIwogIyBCbG9jayBkZXZpY2VzCkBAIC00NzksMTggKzQyOSwxMyBAQAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIGRldmljZXMKICMKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk5LDEwICs0NDQsNiBAQAogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCkBAIC01MTEsMTkgKzQ1Miw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQpAQCAtNTMxLDEwICs0NTksNiBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU0NCwyNyArNDY4LDE0IEBACiBDT05GSUdfTUlJPXkKICMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKIENPTkZJR19TTUM5MVg9eQorQ09ORklHX05FVERFVl8xMDAwPXkKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjIFdpcmVsZXNzIExBTgogIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CkBAIC02MDQsNiArNTE1LDcgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjM5LDI5ICs1NTEsMTUgQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY3NCwyNyArNTcyLDMwIEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIwotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfREFCPXkKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCi0jIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzAzLDYgKzYwNCwxMiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKICMgVVNCIHN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldApAQCAtNzE3LDEwICs2MjQsNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMiw3ICs3MDUsNiBAQAogQ09ORklHX1BST0NfU1lTQ1RMPXkKICMgQ09ORklHX1NZU0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKIApAQCAtODE2LDcgKzcxOCw2IEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CkBAIC04NDksNiArNzUwLDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKQEAgLTg2MSwxNCArNzY3LDExIEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC04ODMsOCArNzg2LDEzIEBACiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwppbmRleCAyMGFjN2Y0Li4zYTNjM2MxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwpAQCAtMSwxOCArMSwyMiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5Ci0jIFdlZCBEZWMgIDYgMTY6MzU6MzYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBGcmkgSnVuIDE1IDE5OjQzOjA2IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKICMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTMxLDggKzM1LDEwIEBACiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CkBAIC00NSwxMiArNTEsMTcgQEAKICMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotQ09ORklHX1NMQUI9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKICMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0xCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtODAsNTIgKzkxLDkgQEAKICMKICMgU3lzdGVtIHR5cGUKICMKLSMgQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIMj15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTk9eQotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTEzMywxMCArMTAxLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE0NSwzMiArMTEwLDI4IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDAwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX1BBR0VfU0laRV80S0I9eQogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CkBAIC0xODAsMzQgKzE0MSw0MSBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiBDT05GSUdfU0hfV1JJVEVUSFJPVUdIPXkKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKICMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfQklHX0VORElBTj15Ci0jIENPTkZJR19TSF9GUFUgaXMgbm90IHNldAogIyBDT05GSUdfU0hfRlBVX0VNVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiAKICMKLSMgVGltZXIgc3VwcG9ydAorIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU09MVVRJT05fRU5HSU5FPXkKK0NPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9DTVQ9eQogQ09ORklHX1NIX1RJTUVSX0lSUT04NgotIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfUENMS19GUkVRPTMxMjUwMDAwCiBDT05GSUdfU0hfQ0xLX01EPTUKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMjIsMTEgKzE5MCwxMSBAQAogIwogIyBDb21wYW5pb24gQ2hpcHMKICMKLSMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKIAogIwogIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycwogIworIyBDT05GSUdfSEVBUlRCRUFUIGlzIG5vdCBzZXQKICMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKIAogIwpAQCAtMjM0LDEwICsyMDIsMTEgQEAKICMKIENPTkZJR19IWl8xMDA9eQogIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0xMDAKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX05PTkU9eQogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CkBAIC0yNDcsMjMgKzIxNiwxOCBAQAogIwogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAotIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRkxBVD15CkBAIC0yNzIsMTEgKzIzNiw2IEBACiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKQEAgLTI5NSwxMCArMjU0LDYgQEAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKQEAgLTMxMyw2ICsyNjgsNyBAQAogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwogIwogQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CiBDT05GSUdfTVREX0JMT0NLPXkKICMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKQEAgLTM0NCw3ICszMDAsNiBAQAogIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKIAogIwogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCkBAIC0zNzIsMTYgKzMyNywxMyBAQAogIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKLSMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKLSMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogCiAjCiAjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydApAQCAtMzkxLDYgKzM0Myw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtMzk4LDE3ICszNTEsMTIgQEAKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTQxNywxMCArMzY1LDYgQEAKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwotIwogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKIAogIwpAQCAtNDI5LDE5ICszNzMsNiBAQAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogCiAjCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCiAjIElTRE4gc3Vic3lzdGVtCiAjCiAKQEAgLTQ3MSw2ICs0MDIsNyBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCkBAIC01MDYsMjkgKzQzOCwxNSBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIwpAQCAtNTQxLDI2ICs0NTksMjkgQEAKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCi0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIworQ09ORklHX0RBQj15CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU2OSw2ICs0OTAsMTIgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIAogIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCiAjIFVTQiBzdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKQEAgLTU4MywxMCArNTEwLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC02NjgsNyArNTkxLDYgQEAKIENPTkZJR19QUk9DX1NZU0NUTD15CiAjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAKQEAgLTY4Miw3ICs2MDQsNiBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldApAQCAtNzE1LDE0ICs2MzYsMTEgQEAKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTczNyw4ICs2NTUsMTMgQEAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCmluZGV4IGNhNGM2NjMuLjc2NGI4MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjNwotIyBGcmkgQXByIDI3IDE2OjMwOjMwIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgV2VkIEp1biAyMCAxODowODowNCAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTExLDcgKzExLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19OVU1BPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApAQCAtNDMsNiArNDUsNyBAQAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CkBAIC02MCwxNCArNjMsMjAgQEAKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC0xMDMsNTcgKzExMiwxMiBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotQ09ORklHX1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FPXkKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hJR0hMQU5ERVIgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xCT1hfUkUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0g0PXkKIENPTkZJR19DUFVfU0g0QT15CiBDT05GSUdfQ1BVX1NINEFMX0RTUD15CiBDT05GSUdfQ1BVX1NIWDI9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTE2MiwxMCArMTI2LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldApAQCAtMTc0LDIzICsxMzQsMTEgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAotCi0jCi0jIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAotCi0jCi0jIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyPXkKQEAgLTE5OCwxNSArMTQ2LDIxIEBACiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKICMKK0NPTkZJR19RVUlDS0xJU1Q9eQogQ09ORklHX01NVT15CiBDT05GSUdfUEFHRV9PRkZTRVQ9MHg4MDAwMDAwMAogQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NJWkU9MHgwNDAwMDAwMAotIyBDT05GSUdfMzJCSVQgaXMgbm90IHNldAogIyBDT05GSUdfWDJUTEIgaXMgbm90IHNldAogQ09ORklHX1ZTWVNDQUxMPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19OVU1BPXkKK0NPTkZJR19OT0RFU19TSElGVD0xCitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MgogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMjE2LDI2ICsxNzAsMjUgQEAKICMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9NQU5VQUw9eQorQ09ORklHX1NQQVJTRU1FTT15CitDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUz15CitDT05GSUdfSEFWRV9NRU1PUllfUFJFU0VOVD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CisjIENPTkZJR19NRU1PUllfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX01JR1JBVElPTj15CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKIAogIwogIyBDYWNoZSBjb25maWd1cmF0aW9uCiAjCiAjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0Ci1DT05GSUdfQ0ZfRU5BQkxFUj15Ci0jIENPTkZJR19DRl9BUkVBNSBpcyBub3Qgc2V0Ci1DT05GSUdfQ0ZfQVJFQTY9eQotQ09ORklHX0NGX0JBU0VfQUREUj0weGI4MDAwMDAwCiAKICMKICMgUHJvY2Vzc29yIGZlYXR1cmVzCkBAIC0yNTIsMTIgKzIwNSwyMCBAQAogQ09ORklHX0NQVV9IQVNfUFRFQT15CiAKICMKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NPTFVUSU9OX0VOR0lORT15CitDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkU9eQorCisjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MTYKLUNPTkZJR19OT19JRExFX0haPXkKIENPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjcyLDcgKzIzMyw2IEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCkBAIC0yOTAsNyArMjUwLDYgQEAKIENPTkZJR19IWj0yNTAKIENPTkZJR19LRVhFQz15CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFQ9eQpAQCAtMzA3LDcgKzI2NiwxMSBAQAogIwogIyBCdXMgb3B0aW9ucwogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19DRl9FTkFCTEVSPXkKKyMgQ09ORklHX0NGX0FSRUE1IGlzIG5vdCBzZXQKK0NPTkZJR19DRl9BUkVBNj15CitDT05GSUdfQ0ZfQkFTRV9BRERSPTB4YjgwMDAwMDAKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CkBAIC0zMTUsMjIgKzI3OCwxMiBAQAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTMzOCw3ICsyOTEsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1BBQ0tFVF9NTUFQPXkKIENPTkZJR19VTklYPXkKQEAgLTM3NSwyMCArMzI3LDggQEAKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDE0LDcgKzM1NCwxNiBAQAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtNDMyLDEwICszODEsNiBAQAogIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCiAjCiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKICMgQ09ORklHX01URCBpcyBub3Qgc2V0CiAKICMKQEAgLTQ2NCwxMCArNDA5LDcgQEAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk2LDYgKzQzOCw3IEBACiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCiAKICMKICMgU0NTSSBUcmFuc3BvcnRzCkBAIC01MTEsMTAgKzQ1NCw2IEBACiAjCiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiBDT05GSUdfUEFUQV9QTEFURk9STT15CkBAIC01MjUsMTkgKzQ2NCw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQpAQCAtNTQ1LDEwICs0NzEsNiBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU1OCwyNyArNDgwLDE0IEBACiBDT05GSUdfTUlJPXkKICMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKIENPTkZJR19TTUM5MVg9eQorQ09ORklHX05FVERFVl8xMDAwPXkKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjIFdpcmVsZXNzIExBTgogIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CkBAIC02MjcsNiArNTM2LDcgQEAKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjY3LDE0ICs1NzcsOCBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIApAQCAtNjgyLDEwICs1ODYsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY5OCwxNiArNTk4LDE1IEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCkBAIC03MTksMTYgKzYxOCwxOSBAQAogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzU3LDEwICs2NTksNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMCwxOCArNjk4LDMwIEBACiBDT05GSUdfUlRDX0lOVEZfUFJPQz15CiBDT05GSUdfUlRDX0lOVEZfREVWPXkKICMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIFJUQyBkcml2ZXJzCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0RSVl9TSD15Ci0jIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TSD15CisKKyMKICMgRE1BIEVuZ2luZSBzdXBwb3J0CiAjCiAjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKQEAgLTgyNSwxNCArNzM1LDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTkzNywyMyArODM5LDI0IEBACiAjCiAjIFByb2ZpbGluZyBzdXBwb3J0CiAjCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEtfVElNRT15CiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAorQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VBUkxZX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKIAogIwpAQCAtOTczLDggKzg3NiwxMCBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19QTElTVD15CiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTliYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzU2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFdlZCBKdW4gMjAgMTQ6MDk6MjcgMjAwNworIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTk9PUD15CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJub29wIgorCisjCisjIFN5c3RlbSB0eXBlCisjCitDT05GSUdfQ1BVX1NIND15CitDT05GSUdfQ1BVX1NINEE9eQorQ09ORklHX0NQVV9TSFgzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSFgzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1FVSUNLTElTVD15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0Sz15CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8yNTZLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV80TUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRNQiBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9EU1A9eQorQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CitDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSU5UQzJfSVJRPXkKK0NPTkZJR19DUFVfSEFTX1NSX1JCPXkKKworIworIyBCb2FyZCBzdXBwb3J0CisjCisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgorQ09ORklHX1NIX1BDTEtfRlJFUT01MDAwMDAwMAorQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19IRUFSVEJFQVQ9eQorIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19QUkVFTVBUX0JLTD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCitDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCisjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCBpcD0xOTIuMTY4LjEuMjo6OjI1NS4yNTUuMjU1LjAgcm9vdD0vZGV2L25mcyBuZnNyb290PTE5Mi4xNjguMS4xOi9leHBvcnRzL2RldmVsL3Jmcy9tb2JpbGVyIG5vYWxpZW5jYWNoZSBlYXJseXByaW50az1iaW9zIGlnbm9yZV9sb2dsZXZlbCIKKworIworIyBCdXMgb3B0aW9ucworIworIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfUEFUQV9QTEFURk9STT15CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIEhJRCBEZXZpY2VzCisjCisjIENPTkZJR19ISUQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQkZTPXkKK0NPTkZJR19IVUdFVExCX1BBR0U9eQorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19QUklOVEtfVElNRT15CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CitDT05GSUdfREVCVUdfU0xBQl9MRUFLPXkKK0NPTkZJR19ERUJVR19QUkVFTVBUPXkKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DSz15CitDT05GSUdfREVCVUdfTVVURVhFUz15CitDT05GSUdfREVCVUdfTE9DS19BTExPQz15CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLREVQPXkKK0NPTkZJR19ERUJVR19MT0NLREVQPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRT15CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZNPXkKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKK0NPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CisjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCA5OTkzNWY5Li4zMzM4OTgwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0zNiwyMyArMzYsNiBAQAogCSAgc3VwcG9ydC4gU2V0dGluZyB0aGlzIHRvIGEgaGlnaGVyIHZhbHVlIGFsbG93cyBmb3IgY2FzY2FkaW5nIERNQUNzCiAJICB3aXRoIGFkZGl0aW9uYWwgY2hhbm5lbHMuCiAKLWNvbmZpZyBETUFfUEFHRV9PUFMKLQlib29sICJVc2UgRE1BQyBmb3IgcGFnZSBjb3B5L2NsZWFyIgotCWRlcGVuZHMgb24gU0hfRE1BICYmIEJST0tFTgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHVzZSBhIGR1YWwtYWRkcmVzcyBtb2RlIGNvbmZpZ3VyZWQgY2hhbm5lbAotCSAgaW4gdGhlIFNIIERNQUMgZm9yIGNvcHlfcGFnZSgpL2NsZWFyX3BhZ2UoKS4gUHJpbWFyaWx5IGEgcGVyZm9ybWFuY2UKLQkgIGhhY2suCi0KLWNvbmZpZyBETUFfUEFHRV9PUFNfQ0hBTk5FTAotCWRlcGVuZHMgb24gRE1BX1BBR0VfT1BTCi0JaW50ICJETUEgY2hhbm5lbCBmb3Igc2ggbWVtb3J5LW1hbmFnZXIgcGFnZSBjb3B5L2NsZWFyIgotCWRlZmF1bHQgIjMiCi0JaGVscAotCSAgVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGR1YWwgYWRkcmVzcyBkbWEgY2hhbm5lbCwKLQkgIGluIGNhc2UgY2hhbm5lbCAzIGlzIHVuYXZhaWxhYmxlLiBPbiB0aGUgU0g0LCBjaGFubmVscyAxLDIsIGFuZCAzCi0JICBhcmUgZHVhbC1hZGRyZXNzIGNhcGFibGUuCi0KIGNvbmZpZyBTSF9ETUFCUkcKIAlib29sICJTSDc3NjAgRE1BQlJHIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NjAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCA2ZDFjYmJlLi5mYmM2ZjJjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFBDSQogCWJvb2wgIlBDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX1BDSQogCWhlbHAKIAkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYSBQQ0kgbW90aGVyYm9hcmQuIFBDSSBpcyB0aGUgbmFtZSBvZiBhCiAJICBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCmluZGV4IDkxMDRiNjIuLjFmMTQxYTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCkBAIC00LDEwICs0LDkgQEAKIAogZXh0cmEteQk6PSBoZWFkLm8gaW5pdF90YXNrLm8gdm1saW51eC5sZHMKIAotb2JqLXkJOj0gcHJvY2Vzcy5vIHNpZ25hbC5vIHRyYXBzLm8gaXJxLm8gXAotCXB0cmFjZS5vIHNldHVwLm8gdGltZS5vIHN5c19zaC5vIHNlbWFwaG9yZS5vIFwKLQlpby5vIGlvX2dlbmVyaWMubyBzaF9rc3ltcy5vIHN5c2NhbGxzLm8gXAotCWRlYnVndHJhcHMubworb2JqLXkJOj0gZGVidWd0cmFwcy5vIGlvLm8gaW9fZ2VuZXJpYy5vIGlycS5vIG1hY2h2ZWMubyBwcm9jZXNzLm8gcHRyYWNlLm8gXAorCSAgIHNlbWFwaG9yZS5vIHNldHVwLm8gc2lnbmFsLm8gc3lzX3NoLm8gc3lzY2FsbHMubyBcCisJICAgdGltZS5vIHRvcG9sb2d5Lm8gdHJhcHMubwogCiBvYmoteQkJCQkrPSBjcHUvIHRpbWVycy8KIG9iai0kKENPTkZJR19WU1lTQ0FMTCkJCSs9IHZzeXNjYWxsLwpAQCAtMTcsNyArMTYsNyBAQAogb2JqLSQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpCSs9IHNoX2Jpb3Mubwogb2JqLSQoQ09ORklHX1NIX0tHREIpCQkrPSBrZ2RiX3N0dWIubyBrZ2RiX2ptcC5vCiBvYmotJChDT05GSUdfU0hfQ1BVX0ZSRVEpCSs9IGNwdWZyZXEubwotb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubworb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBzaF9rc3ltcy5vIG1vZHVsZS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIHJlbG9jYXRlX2tlcm5lbC5vCiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMgYi9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMKaW5kZXggZWJjNzNiOC4uMWMzYjk5NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY2YtZW5hYmxlci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NmLWVuYWJsZXIuYwpAQCAtNzUsMTEgKzc1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQogCWFsbG9jYXRlX2NmX2FyZWEoKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCi0JLyogVGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlYWNoIGJvYXJkJ3MgaW5pdF94eHhfaXJxLiAqLwotCW1ha2VfaW1hc2tfaXJxKDE0KTsKLQlkaXNhYmxlX2lycSgxNCk7Ci0jZW5kaWYKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYwppbmRleCA2NDUxYWQ2Li45MTcyZTk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKQEAgLTIxLDggKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotCi1leHRlcm4gdm9pZCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCk7CisjaW5jbHVkZSA8YXNtL3ViYy5oPgogCiAvKgogICogR2VuZXJpYyB3cmFwcGVyIGZvciBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGRpc2FibGUgb24tY2hpcApAQCAtMTUyLDE1ICsxNTEsNiBAQAogCWZsYWdzIHw9IENDUl9DQUNIRV9DQjsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NIX09DUkFNCi0JLyogVHVybiBvbiBPQ1JBTSAtLSBoYWx2ZSB0aGUgT0MgKi8KLQlmbGFncyB8PSBDQ1JfQ0FDSEVfT1JBOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgPj49IDE7Ci0KLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfc2l6ZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgKgotCQkJCSAgICBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3o7Ci0jZW5kaWYKLQogCWN0cmxfb3V0bChmbGFncywgQ0NSKTsKIAliYWNrX3RvX1AxKCk7CiB9CkBAIC0yNjksNyArMjU5LDYgQEAKIAl9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19VQkNfV0FLRVVQCiAJLyoKIAkgKiBTb21lIGJyYWluLWRhbWFnZWQgbG9hZGVycyBkZWNpZGVkIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIHB1dAogCSAqIHRoZSBVQkMgdG8gc2xlZXAuIFRoaXMgY2F1c2VzIHNvbWUgaXNzdWVzIHdoZW4gaXQgY29tZXMgdG8gdGhpbmdzCkBAIC0yNzcsNyArMjY2LDUgQEAKIAkgKiB3ZSB3YWtlIGl0IHVwIGFuZCBob3BlIHRoYXQgYWxsIGlzIHdlbGwuCiAJICovCiAJdWJjX3dha2V1cCgpOwotI2VuZGlmCi0KIAlzcGVjdWxhdGl2ZV9leGVjdXRpb25faW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jCmluZGV4IGQ4ZTIyZjQuLmNjNTIyMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKQEAgLTEzLDM2ICsxMywzMSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmUwODAwMDAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLCShJTlRDMl9CQVNFICsgMHg0MCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSCShJTlRDMl9CQVNFICsgMHg2MCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmZkNDAwMDAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLCShJTlRDMl9CQVNFICsgMHgzOCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSCShJTlRDMl9CQVNFICsgMHgzYykKLSNlbmRpZgorc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50YzJfZGVzYyAqZ2V0X2ludGMyX2Rlc2ModW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljaGlwIC0gb2Zmc2V0b2Yoc3RydWN0IGludGMyX2Rlc2MsIGNoaXApKTsKK30KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0sgKyBwLT5tc2tfb2Zmc2V0KTsKKwlzdHJ1Y3QgaW50YzJfZGVzYyAqZCA9IGdldF9pbnRjMl9kZXNjKGlycSk7CisKKwljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIGQtPm1za19iYXNlICsgcC0+bXNrX29mZnNldCArCisJCQkJICAgICAoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgKiA0KSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0tDTFIgKyBwLT5tc2tfb2Zmc2V0KTsKLX0KKwlzdHJ1Y3QgaW50YzJfZGVzYyAqZCA9IGdldF9pbnRjMl9kZXNjKGlycSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW50YzJfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIklOVEMyIiwKLQkubWFzawkJPSBkaXNhYmxlX2ludGMyX2lycSwKLQkudW5tYXNrCQk9IGVuYWJsZV9pbnRjMl9pcnEsCi0JLm1hc2tfYWNrCT0gZGlzYWJsZV9pbnRjMl9pcnEsCi19OworCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwgZC0+bXNrY2xyX2Jhc2UgKyBwLT5tc2tfb2Zmc2V0ICsKKwkJCQkgICAgIChoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSAqIDQpKTsKK30KIAogLyoKICAqIFNldHVwIGFuIElOVEMyIHN0eWxlIGludGVycnVwdC4KQEAgLTU2LDMwICs1MSwzNiBAQAogICoKICAqIGluIHRoZSBpbnRjMl9kYXRhIHRhYmxlLgogICovCi12b2lkIG1ha2VfaW50YzJfaXJxKHN0cnVjdCBpbnRjMl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpCit2b2lkIHJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoc3RydWN0IGludGMyX2Rlc2MgKmRlc2MpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CisJZGVzYy0+Y2hpcC5tYXNrID0gZGlzYWJsZV9pbnRjMl9pcnE7CisJZGVzYy0+Y2hpcC51bm1hc2sgPSBlbmFibGVfaW50YzJfaXJxOworCWRlc2MtPmNoaXAubWFza19hY2sgPSBkaXNhYmxlX2ludGMyX2lycTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9pcnFzOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBpcHIsIGZsYWdzOwotCQlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IHRhYmxlICsgaTsKKwkJc3RydWN0IGludGMyX2RhdGEgKnAgPSBkZXNjLT5pbnRjMl9kYXRhICsgaTsKIAogCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKIAotCQkvKiBTZXQgdGhlIHByaW9yaXR5IGxldmVsICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJaWYgKGRlc2MtPnByaW9fYmFzZSkgeworCQkJLyogU2V0IHRoZSBwcmlvcml0eSBsZXZlbCAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JCWlwciA9IGN0cmxfaW5sKElOVEMyX0JBU0UgKyBwLT5pcHJfb2Zmc2V0KTsKLQkJaXByICY9IH4oMHhmIDw8IHAtPmlwcl9zaGlmdCk7Ci0JCWlwciB8PSBwLT5wcmlvcml0eSA8PCBwLT5pcHJfc2hpZnQ7Ci0JCWN0cmxfb3V0bChpcHIsIElOVEMyX0JBU0UgKyBwLT5pcHJfb2Zmc2V0KTsKKwkJCWlwciA9IGN0cmxfaW5sKGRlc2MtPnByaW9fYmFzZSArIHAtPmlwcl9vZmZzZXQpOworCQkJaXByICY9IH4oMHhmIDw8IHAtPmlwcl9zaGlmdCk7CisJCQlpcHIgfD0gcC0+cHJpb3JpdHkgPDwgcC0+aXByX3NoaWZ0OworCQkJY3RybF9vdXRsKGlwciwgZGVzYy0+cHJpb19iYXNlICsgcC0+aXByX29mZnNldCk7CiAKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9CiAKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUocC0+aXJxLCAmaW50YzJfaXJxX2NoaXAsCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHAtPmlycSwgJmRlc2MtPmNoaXAsCiAJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwogCQlzZXRfaXJxX2NoaXBfZGF0YShwLT5pcnEsIHApOwogCi0JCWVuYWJsZV9pbnRjMl9pcnEocC0+aXJxKTsKKwkJZGlzYWJsZV9pbnRjMl9pcnEocC0+aXJxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYwppbmRleCAyMTAyODBiLi45OGU4NGY0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKQEAgLTIyLDU4ICsyMiw1NyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwcl9kZXNjICpnZXRfaXByX2Rlc2ModW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljaGlwIC0gb2Zmc2V0b2Yoc3RydWN0IGlwcl9kZXNjLCBjaGlwKSk7Cit9CisKIHN0YXRpYyB2b2lkIGRpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X2lwcl9kZXNjKGlycSktPmlwcl9vZmZzZXRzW3AtPmlwcl9pZHhdOwogCS8qIFNldCB0aGUgcHJpb3JpdHkgaW4gSVBSIHRvIDAgKi8KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBwLT5hZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncoYWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF9pcHJfZGVzYyhpcnEpLT5pcHJfb2Zmc2V0c1twLT5pcHJfaWR4XTsKIAkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBwLT5hZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncoYWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBhZGRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcHJfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIklQUiIsCi0JLm1hc2sJCT0gZGlzYWJsZV9pcHJfaXJxLAotCS51bm1hc2sJCT0gZW5hYmxlX2lwcl9pcnEsCi0JLm1hc2tfYWNrCT0gZGlzYWJsZV9pcHJfaXJxLAotfTsKKy8qCisgKiBUaGUgc2hpZnQgdmFsdWUgaXMgbm93IHRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCwgbm90IHRoZSBudW1iZXIgb2YKKyAqIGJpdHMvNC4gVGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZQorICogZGF0YXNoZWV0cy4gVGhlIElQUiBhZGRyZXNzIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGlwcl9vZmZzZXQgdGFibGUuCisgKi8KIAotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCXJldHVybiAwOwotfQotCi12b2lkIG1ha2VfaXByX2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcykKK3ZvaWQgcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoc3RydWN0IGlwcl9kZXNjICpkZXNjKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOworCWRlc2MtPmNoaXAubWFzayA9IGRpc2FibGVfaXByX2lycTsKKwlkZXNjLT5jaGlwLnVubWFzayA9IGVuYWJsZV9pcHJfaXJxOworCWRlc2MtPmNoaXAubWFza19hY2sgPSBkaXNhYmxlX2lwcl9pcnE7CiAKLQkJaWYgKCFpcnEpCi0JCQlpcnEgPSB0YWJsZVtpXS5pcnEgPSBpOworCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9pcnFzOyBpKyspIHsKKwkJc3RydWN0IGlwcl9kYXRhICpwID0gZGVzYy0+aXByX2RhdGEgKyBpOwogCi0JCS8qIGNvdWxkIHRoZSBJUFIgaW5kZXggYmUgbWFwcGVkLCBpZiBub3Qgd2UgaWdub3JlIHRoaXMgKi8KLQkJaWYgKCF0YWJsZVtpXS5hZGRyKSB7Ci0JCQl0YWJsZVtpXS5hZGRyID0gbWFwX2lwcmlkeF90b19hZGRyKHRhYmxlW2ldLmlwcl9pZHgpOwotCQkJaWYgKCF0YWJsZVtpXS5hZGRyKQotCQkJCWNvbnRpbnVlOwotCQl9CisJCUJVR19PTihwLT5pcHJfaWR4ID49IGRlc2MtPm5yX29mZnNldHMpOworCQlCVUdfT04oIWRlc2MtPmlwcl9vZmZzZXRzW3AtPmlwcl9pZHhdKTsKIAotCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaXByX2lycV9jaGlwLAorCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUocC0+aXJxLCAmZGVzYy0+Y2hpcCwKIAkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKLQkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCAmdGFibGVbaV0pOwotCQllbmFibGVfaXByX2lycShpcnEpOworCQlzZXRfaXJxX2NoaXBfZGF0YShwLT5pcnEsIHApOworCQlkaXNhYmxlX2lwcl9pcnEocC0+aXJxKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKG1ha2VfaXByX2lycSk7CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIpOwogCiAjaWYgIWRlZmluZWQoQ09ORklHX0NQVV9IQVNfUElOVF9JUlEpCiBpbnQgaXByX2lycV9kZW11eChpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TCmluZGV4IGMxNmRjOGYuLmVlOGYxZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2VudHJ5LlMKQEAgLTMxMSw2ICszMTEsNyBAQAogCXJ0ZQogCSBub3AKIAorCS5hbGlnbiAyCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiAxOiAgICAgLmxvbmcgICB0cmFjZV9oYXJkaXJxc19vZmYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jCmluZGV4IDEwOGU4MWIuLmFiYmYxNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMKQEAgLTksMjMgKzksMTQgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogaW50IF9faW5pdCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCi0JY3VycmVudF9jcHVfZGF0YS50eXBlCQkJPSBDUFVfU0g3NjA0OwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMJCT0gNDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcgk9ICgxPDwxMCk7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cwkJPSA2NDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmZsYWdzCQk9IDA7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQogCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYxOTsKIAljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CiAJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKaW5kZXggZjgzZmY4YS4uMWExMDdmZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCkBAIC01Miw3ICs1Miw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzYxOV9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc2MTlfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJeyA4NiwgMCwgIDQsIDIgfSwJLyogQ01JMCAqLwogCXsgODgsIDEsIDEyLCAzIH0sCS8qIFNDSUYwX0VSSSAqLwogCXsgODksIDEsIDEyLCAzIH0sCS8qIFNDSUYwX1JYSSAqLwpAQCAtNjgsNyArNjgsNyBAQAogCXsgOTksIDEsICA0LCAzIH0sCS8qIFNDSUYyX1RYSSAqLwogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBpcHJfb2Zmc2V0c1tdID0geworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKIAkweGY4MDgwMDAwLAkvKiBJUFJDICovCiAJMHhmODA4MDAwMiwJLyogSVBSRCAqLwogCTB4ZjgwODAwMDQsCS8qIElQUkUgKi8KQEAgLTc2LDE1ICs3NiwxOSBAQAogCTB4ZjgwODAwMDgsCS8qIElQUkcgKi8KIH07CiAKLS8qIGdpdmVuIHRoZSBJUFIgaW5kZXggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBJUFIgcmVnaXN0ZXIgKi8KLXVuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkKLXsKLQlpZiAodW5saWtlbHkoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzYxOSIsCisJfSwKK307CiAKIHZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc2MTlfaXByX21hcCwgQVJSQVlfU0laRShzaDc2MTlfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwppbmRleCA0ZWQ5MTEwLi5iNmUzYTYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwpAQCAtNTcsNyArNTcsNyBAQAogfQogX19pbml0Y2FsbChzaDcyMDZfZGV2aWNlc19zZXR1cCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3MjA2X2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCXsgMTQwLCAgNywgMTIsIDIgfSwJLyogQ01JMCAqLwogCXsgMTY0LCAgOCwgIDQsIDIgfSwJLyogTVRVMl9UR0kxQSAqLwogCXsgMjQwLCAxMywgMTIsIDMgfSwJLyogU0NJRjBfQlJJICovCkBAIC03OCw3ICs3OCw3IEBACiAJeyAyNTUsIDEzLCAgMCwgMyB9LAkvKiBTQ0lGM19UWEkgKi8KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXByX29mZnNldHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CiAJMHhmZmZlMDgxOCwJLyogSVBSMDEgKi8KIAkweGZmZmUwODFhLAkvKiBJUFIwMiAqLwogCTAsCQkvKiB1bnVzZWQgKi8KQEAgLTk1LDE1ICs5NSwxOSBAQAogCTB4ZmZmZTBjMTAsCS8qIElQUjE0ICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDcyMDYiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3MjA2X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3MjA2X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUwppbmRleCBiMGI1OWQ0Li5kOGUxMjI5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCkBAIC0zNDAsOCArMzQwLDI3IEBACiBnZW5lcmFsX2V4Y2VwdGlvbjoKIAltb3YubAkxZiwgazIKIAltb3YubAkyZiwgazMKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMworCW1vdi5sCUBrMiwgazIKKworCSEgSXMgRVhQRVZUIGxhcmdlciB0aGFuIDB4ODAwPworCW1vdgkjMHg4LCBrMAorCXNobGw4CWswCisJY21wL2hzCWswLCBrMgorCWJmCTBmCisKKwkhIHRoZW4gYWRkIDB4NTgwIChrMiBpcyAweGQ4MCBvciAweGRhMCkKKwltb3YJIzB4NTgsIGswCisJc2hsbDIJazAKKwlzaGxsMglrMAorCWFkZAlrMCwgazIKKzA6CisJYnJhCWhhbmRsZV9leGNlcHRpb24KKwkgbm9wCisjZWxzZQogCWJyYQloYW5kbGVfZXhjZXB0aW9uCiAJIG1vdi5sCUBrMiwgazIKKyNlbmRpZgogCS5hbGlnbgkyCiAxOgkubG9uZwlFWFBFVlQKIDI6CS5sb25nCXJldF9mcm9tX2V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKaW5kZXggMTk4M2ZiNy4uYTU1YjhjZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCkBAIC00OCw3ICs0OCw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcwNV9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDVfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtNzAsMjUgKzcwLDI5IEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4RkZGRkZFRTIJLyogMDogSVBSQSAqLwotLAkweEZGRkZGRUU0CS8qIDE6IElQUkIgKi8KLSwJMHhBNDAwMDAxNgkvKiAyOiBJUFJDICovCi0sCTB4QTQwMDAwMTgJLyogMzogSVBSRCAqLwotLAkweEE0MDAwMDFBCS8qIDQ6IElQUkUgKi8KLSwJMHhBNDA4MDAwMAkvKiA1OiBJUFJGICovCi0sCTB4QTQwODAwMDIJLyogNjogSVBSRyAqLwotLAkweEE0MDgwMDA0CS8qIDc6IElQUkggKi8KKwkweEZGRkZGRUUyLAkvKiAwOiBJUFJBICovCisJMHhGRkZGRkVFNCwJLyogMTogSVBSQiAqLworCTB4QTQwMDAwMTYsCS8qIDI6IElQUkMgKi8KKwkweEE0MDAwMDE4LAkvKiAzOiBJUFJEICovCisJMHhBNDAwMDAxQSwJLyogNDogSVBSRSAqLworCTB4QTQwODAwMDAsCS8qIDU6IElQUkYgKi8KKwkweEE0MDgwMDAyLAkvKiA2OiBJUFJHICovCisJMHhBNDA4MDAwNCwJLyogNzogSVBSSCAqLwogfTsKIAotLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCWlmIChpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKIAotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzA1IiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzcwNV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzcwNV9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYwppbmRleCBjN2Q3YzM1Li5kNzllYzBjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA5LmMKQEAgLTEyLDYgKzEyLDI2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL3NjaS5oPgogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPQl7CisJCS5zdGFydAk9IDB4ZmZmZmZlYzAsCisJCS5lbmQJPSAweGZmZmZmZWMwICsgMHgxZSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwlbMV0gPQl7CisJCS5zdGFydCAgPSAyMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPQl7CisJCS5zdGFydAk9IDIxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9CXsKKwkJLnN0YXJ0CT0gMjIsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZQk9IDB4ZmZmZmZlODAsCkBAIC00MSw4ICs2MSwxNiBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MDlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaV9kZXZpY2UsCisJJnJ0Y19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3MDlfZGV2aWNlc19zZXR1cCh2b2lkKQpAQCAtNTIsMzIgKzgwLDY2IEBACiB9CiBfX2luaXRjYWxsKHNoNzcwOV9kZXZpY2VzX3NldHVwKTsKIAotI2RlZmluZSBJUFJ4KEEsTikJLmFkZHI9QSwgLnNoaWZ0PU4KLSNkZWZpbmUgSVBSQShOKQlJUFJ4KDB4ZmZmZmZlZTJVTCxOKQotI2RlZmluZSBJUFJCKE4pCUlQUngoMHhmZmZmZmVlNFVMLE4pCi0jZGVmaW5lIElQUkMoTikJSVBSeCgweGE0MDAwMDE2VUwsTikKLSNkZWZpbmUgSVBSRChOKQlJUFJ4KDB4YTQwMDAwMThVTCxOKQotI2RlZmluZSBJUFJFKE4pCUlQUngoMHhhNDAwMDAxYVVMLE4pCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKKwl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KKwl7IDE3LCAwLCA4LCAgNCB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDE4LCAwLCA0LCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDE5LCAwLCA0LCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDIwLCAwLCAwLCAgMiB9LCAvKiBSVEMgQ1VJICovCisJeyAyMSwgMCwgMCwgIDIgfSwgLyogUlRDIENVSSAqLworCXsgMjIsIDAsIDAsICAyIH0sIC8qIFJUQyBDVUkgKi8KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDlfaXByX21hcFtdID0gewotCVsxNl0JCT0geyBJUFJBKDEyKSwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KLQlbMTddCQk9IHsgSVBSQSg4KSwgIDQgfSwgLyogVE1VIFRVTkkxICovCi0JWzE4IC4uLiAxOV0JPSB7IElQUkEoNCksICAxIH0sIC8qIFRNVSBUVU5JMSAqLwotCVsyMCAuLi4gMjJdCT0geyBJUFJBKDApLCAgMiB9LCAvKiBSVEMgQ1VJICovCi0JWzIzIC4uLiAyNl0JPSB7IElQUkIoNCksICAzIH0sIC8qIFNDSSAqLwotCVsyN10JCT0geyBJUFJCKDEyKSwgMiB9LCAvKiBXRFQgSVRJICovCi0JWzMyXQkJPSB7IElQUkMoMCksICAxIH0sIC8qIElSUSAwICovCi0JWzMzXQkJPSB7IElQUkMoNCksICAxIH0sIC8qIElSUSAxICovCi0JWzM0XQkJPSB7IElQUkMoOCksICAxIH0sIC8qIElSUSAyIEFQTSAqLwotCVszNV0JCT0geyBJUFJDKDEyKSwgMSB9LCAvKiBJUlEgMyBUT1VDSFNDUkVFTiAqLwotCVszNl0JCT0geyBJUFJEKDApLCAgMSB9LCAvKiBJUlEgNCAqLwotCVszN10JCT0geyBJUFJEKDQpLCAgMSB9LCAvKiBJUlEgNSAqLwotCVs0OCAuLi4gNTFdCT0geyBJUFJFKDEyKSwgNyB9LCAvKiBETUEgKi8KLQlbNTIgLi4uIDU1XQk9IHsgSVBSRSg4KSwgIDMgfSwgLyogSVJEQSAqLwotCVs1NiAuLi4gNTldCT0geyBJUFJFKDQpLCAgMyB9LCAvKiBTQ0lGICovCisJeyAyMywgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNCwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNSwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNiwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNywgMSwgMTIsIDMgfSwgLyogV0RUIElUSSAqLworCisJeyAzMiwgMiwgMCwgIDEgfSwgLyogSVJRIDAgKi8KKwl7IDMzLCAyLCA0LCAgMSB9LCAvKiBJUlEgMSAqLworCXsgMzQsIDIsIDgsICAxIH0sIC8qIElSUSAyIEFQTSAqLworCXsgMzUsIDIsIDEyLCAxIH0sIC8qIElSUSAzIFRPVUNIU0NSRUVOICovCisKKwl7IDM2LCAzLCAwLCAgMSB9LCAvKiBJUlEgNCAqLworCXsgMzcsIDMsIDQsICAxIH0sIC8qIElSUSA1ICovCisKKwl7IDQ4LCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDQ5LCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDUwLCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDUxLCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKworCXsgNTIsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKwl7IDUzLCA0LCA4LCAgMyB9LCAvKiBJUkRBICovCisJeyA1NCwgNCwgOCwgIDMgfSwgLyogSVJEQSAqLworCXsgNTUsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKworCXsgNTYsIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KKwl7IDU3LCA0LCA0LCAgMyB9LCAvKiBTQ0lGICovCisJeyA1OCwgNCwgNCwgIDMgfSwgLyogU0NJRiAqLworCXsgNTksIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KIH07CiAKLXZvaWQgX19pbml0IGluaXRfSVJRX2lwcigpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCTB4ZmZmZmZlZTIsCS8qIDA6IElQUkEgKi8KKwkweGZmZmZmZWU0LAkvKiAxOiBJUFJCICovCisJMHhhNDAwMDAxNiwJLyogMjogSVBSQyAqLworCTB4YTQwMDAwMTgsCS8qIDM6IElQUkQgKi8KKwkweGE0MDAwMDFhLAkvKiA0OiBJUFJFICovCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzcwOSIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc3MDlfaXByX21hcCwgQVJSQVlfU0laRShzaDc3MDlfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzEwLmMKaW5kZXggNTE3NjBhNy4uZjQwZTZkYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jCkBAIC00OSw3ICs0OSw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcxMF9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MTBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtNzgsMjYgKzc4LDMwIEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4QTQxNEZFRTIJLyogMDogSVBSQSAqLwotLAkweEE0MTRGRUU0CS8qIDE6IElQUkIgKi8KLSwJMHhBNDE0MDAxNgkvKiAyOiBJUFJDICovCi0sCTB4QTQxNDAwMTgJLyogMzogSVBSRCAqLwotLAkweEE0MTQwMDFBCS8qIDQ6IElQUkUgKi8KLSwJMHhBNDA4MDAwMAkvKiA1OiBJUFJGICovCi0sCTB4QTQwODAwMDIJLyogNjogSVBSRyAqLwotLAkweEE0MDgwMDA0CS8qIDc6IElQUkggKi8KLSwJMHhBNDA4MDAwNgkvKiA4OiBJUFJJICovCisJMHhBNDE0RkVFMiwJLyogMDogSVBSQSAqLworCTB4QTQxNEZFRTQsCS8qIDE6IElQUkIgKi8KKwkweEE0MTQwMDE2LAkvKiAyOiBJUFJDICovCisJMHhBNDE0MDAxOCwJLyogMzogSVBSRCAqLworCTB4QTQxNDAwMUEsCS8qIDQ6IElQUkUgKi8KKwkweEE0MDgwMDAwLAkvKiA1OiBJUFJGICovCisJMHhBNDA4MDAwMiwJLyogNjogSVBSRyAqLworCTB4QTQwODAwMDQsCS8qIDc6IElQUkggKi8KKwkweEE0MDgwMDA2LAkvKiA4OiBJUFJJICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pcHIoKQorCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MTAiLAorCX0sCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzEwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzEwX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCmluZGV4IDhhZGQxMGIuLmRhZGQ2YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsMTEgQEAKIAogIyBDUFUgc3VidHlwZSBzZXR1cAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKQkrPSBzZXR1cC1zaDc3NTAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpCSs9IHNldHVwLXNoNzc1MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkJKz0gc2V0dXAtc2g3NzYwLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQkrPSBzZXR1cC1zaDQtMjAyLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCmluZGV4IGZhYjJlYjAuLjY2YzNmNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKQEAgLTE0MSw2ICsxNDEsMTQgQEAKIAkJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOwogCQl9CiAJCWJyZWFrOworCWNhc2UgMHg0MDAwOgkvKiAxc3QgY3V0ICovCisJY2FzZSAweDQwMDE6CS8qIDJuZCBjdXQgKi8KKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NIWDM7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKKwkJCQkJICBDUFVfSEFTX0xMU0M7CisJCWJyZWFrOwogCWNhc2UgMHg4MDAwOgogCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU1Q0MFJBOwogCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKaW5kZXggMDNiMTRjZi4uZGExNTNiYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCkBAIC04Miw3ICs4Miw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzc1MF9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NTBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsIDEyLCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtMTA2LDggKzEwNiwyNyBAQAogCXsgMzgsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1BRSAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzUwIiwKKwl9LAorfTsKKwogI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzUxX2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZV9zaDc3NTFbXSA9IHsKIAl7IDQ0LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU0ICovCiAJeyA0NSwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFNSAqLwogCXsgNDYsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTYgKi8KQEAgLTExOCwyMSArMTM3LDI2IEBACiAJLyp7IDcyLCBJTlRQUkkwMCwgIDgsID8gfSwqLyAvKiBUTVUzIFRVTkkgKi8KIAkvKnsgNzYsIElOVFBSSTAwLCAxMiwgPyB9LCovIC8qIFRNVTQgVFVOSSAqLwogfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2Nfc2g3NzUxID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlX3NoNzc1MSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZV9zaDc3NTEpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3NTEiLAorCX0sCit9OwogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7Ci0JMHhmZmQwMDAwNFVMLAkvKiAwOiBJUFJBICovCi0JMHhmZmQwMDAwOFVMLAkvKiAxOiBJUFJCICovCi0JMHhmZmQwMDAwY1VMLAkvKiAyOiBJUFJDICovCi0JMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCi19OwotCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQlpZiAoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzY19zaDc3NTEpOworI2VuZGlmCiB9CiAKICNkZWZpbmUgSU5UQ19JQ1IJMHhmZmQwMDAwMFVMCkBAIC0xNDMsMTEgKzE2NywzIEBACiB7CiAJY3RybF9vdXR3KGN0cmxfaW53KElOVENfSUNSKSB8IElOVENfSUNSX0lSTE0sIElOVENfSUNSKTsKIH0KLQotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKLXsKLQltYWtlX2lwcl9pcnEoc2g3NzUwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzUwX2lwcl9tYXApKTsKLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCi0JbWFrZV9pcHJfaXJxKHNoNzc1MV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc1MV9pcHJfbWFwKSk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCmluZGV4IGI3YzcwMjguLjNkZjE2OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwpAQCAtOTYsNyArOTYsMjUgQEAKIAl7MTA5LDEyLCAgMCwgNCwgIDAsICAzfSwJLyogQ01USSAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NjBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmUwODAwMDAsCisJLm1za19iYXNlCT0gMHhmZTA4MDA0MCwKKwkubXNrY2xyX2Jhc2UJPSAweGZlMDgwMDYwLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2g3NzYwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaW50YzIodm9pZCkKK3sKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW9yaXR5ICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCBUVU5JKi8KIAl7IDE3LCAwLCAgOCwgMiB9LCAvKiBUTVUxIFRVTkkgKi8KQEAgLTEzMywyMCArMTUxLDE5IEBACiAJMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQotewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKLX0KKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKIAotdm9pZCBfX2luaXQgIGluaXRfSVJRX2lwcih2b2lkKQorCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzYwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzc2MF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc2MF9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCmluZGV4IGFiNzQyMmYuLjQwMDYyMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCSs9IHNldHVwLXNoNzMxODAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykJKz0gc2V0dXAtc2g3MzQzLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCSs9IHNldHVwLXNoNzcyMi5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykJCSs9IHNldHVwLXNoeDMubwogCiAjIFByaW1hcnkgb24tY2hpcCBjbG9ja3MgKGNvbW1vbikKIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCTo9IGNsb2NrLXNoNzMxODAubwpAQCAtMTcsNSArMTgsNiBAQAogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQk6PSBjbG9jay1zaDc3ODUubwogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQk6PSBjbG9jay1zaDczNDMubwogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQk6PSBjbG9jay1zaDc3MjIubworY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykJOj0gY2xvY2stc2h4My5vCiAKIG9iai15CSs9ICQoY2xvY2steSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjMwYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2h4My5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaHgzLmMKKyAqCisgKiBTSC1YMyBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBSZW5lc2FzIFRlY2hub2xvZ3kgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9mcmVxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgaWZjX2Rpdmlzb3JzW10gPSB7IDEsIDIsIDQgLDYgfTsKK3N0YXRpYyBpbnQgYmZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDEsIDEsIDEsIDEyLCAxNiwgMTgsIDI0LCAzMiwgMzYsIDQ4IH07CitzdGF0aWMgaW50IHBmY19kaXZpc29yc1tdID0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxOCwgMjQsIDMyLCAzNiwgNDggfTsKK3N0YXRpYyBpbnQgY2ZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDQsIDYgfTsKKworI2RlZmluZSBJRkNfUE9TCQkyOAorI2RlZmluZSBJRkNfTVNLCQkweDAwMDMKKyNkZWZpbmUgQkZDX01TSwkJMHgwMDBmCisjZGVmaW5lIFBGQ19NU0sJCTB4MDAwZgorI2RlZmluZSBDRkNfTVNLCQkweDAwMDMKKyNkZWZpbmUgQkZDX1BPUwkJMTYKKyNkZWZpbmUgUEZDX1BPUwkJMAorI2RlZmluZSBDRkNfUE9TCQkyMAorCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSAqPSBwZmNfZGl2aXNvcnNbKGN0cmxfaW5sKEZSUUNSKSA+PiBQRkNfUE9TKSAmIFBGQ19NU0tdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19tYXN0ZXJfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCit9OworCitzdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IFBGQ19QT1MpICYgUEZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfbW9kdWxlX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gQkZDX1BPUykgJiBCRkNfTVNLKTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19idXNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiBJRkNfUE9TKSAmIElGQ19NU0spOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaHgzX2NwdV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMgKnNoeDNfY2xrX29wc1tdID0geworCSZzaHgzX21hc3Rlcl9jbGtfb3BzLAorCSZzaHgzX21vZHVsZV9jbGtfb3BzLAorCSZzaHgzX2J1c19jbGtfb3BzLAorCSZzaHgzX2NwdV9jbGtfb3BzLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCBpZHgpCit7CisJaWYgKGlkeCA8IEFSUkFZX1NJWkUoc2h4M19jbGtfb3BzKSkKKwkJKm9wcyA9IHNoeDNfY2xrX29wc1tpZHhdOworfQorCitzdGF0aWMgdm9pZCBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IENGQ19QT1MpICYgQ0ZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBjZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfc2h5d2F5X2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBzaHl3YXlfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNoeDNfc2h5d2F5X2NsayA9IHsKKwkubmFtZQkJPSAic2h5d2F5X2NsayIsCisJLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkub3BzCQk9ICZzaHgzX3NoeXdheV9jbGtfb3BzLAorfTsKKworLyoKKyAqIEFkZGl0aW9uYWwgU0h4My1zcGVjaWZpYyBvbi1jaGlwIGNsb2NrcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHBhcnQgb2YgdGhlCisgKiBjbG9jayBmcmFtZXdvcmsKKyAqLworc3RhdGljIHN0cnVjdCBjbGsgKnNoeDNfb25jaGlwX2Nsb2Nrc1tdID0geworCSZzaHgzX3NoeXdheV9jbGssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaHgzX2Nsa19pbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldChOVUxMLCAibWFzdGVyX2NsayIpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2h4M19vbmNoaXBfY2xvY2tzKTsgaSsrKSB7CisJCXN0cnVjdCBjbGsgKmNsa3AgPSBzaHgzX29uY2hpcF9jbG9ja3NbaV07CisKKwkJY2xrcC0+cGFyZW50ID0gY2xrOworCQljbGtfcmVnaXN0ZXIoY2xrcCk7CisJCWNsa19lbmFibGUoY2xrcCk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBjbG9ja3MgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0bworCSAqIGZvcmNlIHRoZSBwYXJlbnQgY2xvY2sgdG8gcHJvcGFnYXRlIHNvIHRoYXQgdGhlc2UgY2xvY2tzIHdpbGwKKwkgKiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgdGhlaXIgcmF0ZS4gV2UgY2hlYXQgYnkgaGFuZGluZyB0aGUKKwkgKiBwYXJlbnQgY2xvY2sgaXRzIGN1cnJlbnQgcmF0ZSBhbmQgZm9yY2luZyBjaGlsZCBwcm9wYWdhdGlvbi4KKwkgKi8KKwljbGtfc2V0X3JhdGUoY2xrLCBjbGtfZ2V0X3JhdGUoY2xrKSk7CisKKwljbGtfcHV0KGNsayk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoc2h4M19jbGtfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCmluZGV4IDExNDNmYmYuLmEzZTE1OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFNINzcyMiBTZXR1cAogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8YXNtL3NjaS5oPgogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKQEAgLTQyLDcgKzQ0LDcgQEAKIH0KIF9faW5pdGNhbGwoc2g3NzIyX2RldmljZXNfc2V0dXApOwogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzcyMl9pcHJfbWFwW10gPSB7CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKIAkvKiBJUlEsIElQUi1pZHgsIHNoaWZ0LCBwcmlvICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCAqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgKi8KQEAgLTY3LDE0ICs2OSwyNSBAQAogCTB4YTQwODAwMmMsIC8qIDExOiBJUFJMICovCiB9OwogCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MjIiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzIyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzIyX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKK30KKwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKK3sKKwkvKiBSZWdpc3RlciB0aGUgVVJBTSBzcGFjZSBhcyBOb2RlIDEgKi8KKwlzZXR1cF9ib290bWVtX25vZGUoMSwgMHgwNTVmMDAwMCwgMHgwNTYxMDAwMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCmluZGV4IDlhZWFhMmQuLmI1N2M3NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCkBAIC0xMDIsNyArMTAyLDIwIEBACiAJeyA2OCwgMHgxNCwgIDgsIDAsIDE4LCAyIH0sCS8qIFBDSUM0ICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMHhmZmQ0MDAwMCwKKwkubXNrX2Jhc2UJPSAweGZmZDQwMDM4LAorCS5tc2tjbHJfYmFzZQk9IDB4ZmZkNDAwM2MsCisKKwkuaW50YzJfZGF0YQk9IGludGMyX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJTlRDMi1zaDc3ODAiLAorCX0sCit9OworCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQogewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCmluZGV4IDA3YjBkZTguLmNlMTBlYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCkBAIC05Nyw3ICs5NywyMSBAQAogCXsgNjAsIDEyLCAxNiwgMCwgNywgMyB9LAkvKiBTQ0lGNSBFUkksIFJYSSwgQlJJLCBUWEkgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaW50YzJfZGVzYyBpbnRjMl9pcnFfZGVzYyBfX3JlYWRfbW9zdGx5ID0geworCS5wcmlvX2Jhc2UJPSAweGZmZDQwMDAwLAorCS5tc2tfYmFzZQk9IDB4ZmZkNDAwMzgsCisJLm1za2Nscl9iYXNlCT0gMHhmZmQ0MDAzYywKKworCS5pbnRjMl9kYXRhCT0gaW50YzJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklOVEMyLXNoNzc4NSIsCisJfSwKK307CisKIHZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCiB7Ci0JbWFrZV9pbnRjMl9pcnEoaW50YzJfaXJxX3RhYmxlLCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSkpOworCXJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoJmludGMyX2lycV9kZXNjKTsKIH0KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjgzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaHgzLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIFNILVgzIFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NjaS5oPgorCitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gMHhmZmMzMDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDAsIDQxLCA0MywgNDIgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM0MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDQsIDQ1LCA0NywgNDYgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM1MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDgsIDQ5LCA1MSwgNTAgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM2MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNTIsIDUzLCA1NSwgNTQgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaHgzX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2h4M19kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoeDNfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaHgzX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2h4M19kZXZpY2VzX3NldHVwKTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kYXRhIGludGMyX2lycV90YWJsZVtdID0geworCXsgMTYsIDAsIDAsIDAsIDEsIDIgfSwJCS8qIFRNVTAgKi8KKwl7IDQwLCA0LCAwLCAweDIwLCAwLCAzIH0sCS8qIFNDSUYwIEVSSSAqLworCXsgNDEsIDQsIDAsIDB4MjAsIDEsIDMgfSwJLyogU0NJRjAgUlhJICovCisJeyA0MiwgNCwgMCwgMHgyMCwgMiwgMyB9LAkvKiBTQ0lGMCBCUkkgKi8KKwl7IDQzLCA0LCAwLCAweDIwLCAzLCAzIH0sCS8qIFNDSUYwIFRYSSAqLworfTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmU0MTAwMDAsCisJLm1za19iYXNlCT0gMHhmZTQxMDgyMCwKKwkubXNrY2xyX2Jhc2UJPSAweGZlNDEwODUwLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItU0hYMyIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCit7CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCAyN2I5MjNjLi4yNzg5Nzc5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMTU4LDE1ICsxNTgsMTEgQEAKIH0KIAogI2lmZGVmIENPTkZJR180S1NUQUNLUwotLyoKLSAqIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikgYXMgd2VsbCwgYnV0Ci0gKiBnY2MncyAzLjAgYW5kIGVhcmxpZXIgZG9uJ3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LgotICovCiBzdGF0aWMgY2hhciBzb2Z0aXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KLQkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisJCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuYnNzLnBhZ2VfYWxpZ25lZCIpKSk7CiAKIHN0YXRpYyBjaGFyIGhhcmRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXQotCQlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKTsKKwkJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikpKTsKIAogLyoKICAqIGFsbG9jYXRlIHBlci1jcHUgc3RhY2tzIGZvciBoYXJkaXJxIGFuZCBmb3Igc29mdGlycSBwcm9jZXNzaW5nCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjNTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2h2ZWMuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL21hY2h2ZWMuYworICoKKyAqIFRoZSBTdXBlckggbWFjaGluZSB2ZWN0b3Igc2V0dXAgaGFuZGxlcnMsIHlhbmtlZCBmcm9tIHNldHVwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBNVl9OQU1FX1NJWkUgMzIKKworI2RlZmluZSBmb3JfZWFjaF9tdihtdikgXAorCWZvciAoKG12KSA9IChzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OyBcCisJICAgICAobXYpICYmICh1bnNpZ25lZCBsb25nKShtdikgPCAodW5zaWduZWQgbG9uZykmX19tYWNodmVjX2VuZDsgXAorCSAgICAgKG12KSsrKQorCitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICogX19pbml0IGdldF9tdl9ieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKm12OworCisJZm9yX2VhY2hfbXYobXYpCisJCWlmIChzdHJjYXNlY21wKG5hbWUsIG12LT5tdl9uYW1lKSA9PSAwKQorCQkJcmV0dXJuIG12OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYWNodmVjX3NlbGVjdGVkOworCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9tdihjaGFyICpmcm9tKQoreworCWNoYXIgbXZfbmFtZVtNVl9OQU1FX1NJWkVdID0gIiI7CisJY2hhciAqbXZfZW5kOworCWNoYXIgKm12X2NvbW1hOworCWludCBtdl9sZW47CisJc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdnA7CisKKwltdl9lbmQgPSBzdHJjaHIoZnJvbSwgJyAnKTsKKwlpZiAobXZfZW5kID09IE5VTEwpCisJCW12X2VuZCA9IGZyb20gKyBzdHJsZW4oZnJvbSk7CisKKwltdl9jb21tYSA9IHN0cmNocihmcm9tLCAnLCcpOworCW12X2xlbiA9IG12X2VuZCAtIGZyb207CisJaWYgKG12X2xlbiA+IChNVl9OQU1FX1NJWkUtMSkpCisJCW12X2xlbiA9IE1WX05BTUVfU0laRS0xOworCW1lbWNweShtdl9uYW1lLCBmcm9tLCBtdl9sZW4pOworCW12X25hbWVbbXZfbGVuXSA9ICdcMCc7CisJZnJvbSA9IG12X2VuZDsKKworCW1hY2h2ZWNfc2VsZWN0ZWQgPSAxOworCisJLyogQm9vdCB3aXRoIHRoZSBnZW5lcmljIHZlY3RvciAqLworCWlmIChzdHJjbXAobXZfbmFtZSwgImdlbmVyaWMiKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW12cCA9IGdldF9tdl9ieW5hbWUobXZfbmFtZSk7CisJaWYgKHVubGlrZWx5KCFtdnApKSB7CisJCXByaW50aygiQXZhaWxhYmxlIHZlY3RvcnM6XG5cblx0JyVzJywgIiwgc2hfbXYubXZfbmFtZSk7CisJCWZvcl9lYWNoX212KG12cCkKKwkJCXByaW50aygiJyVzJywgIiwgbXZwLT5tdl9uYW1lKTsKKwkJcHJpbnRrKCJcblxuIik7CisJCXBhbmljKCJGYWlsZWQgdG8gc2VsZWN0IG1hY2h2ZWMgJyVzJyAtLSBoYWx0aW5nLlxuIiwKKwkJICAgICAgbXZfbmFtZSk7CisJfSBlbHNlCisJCXNoX212ID0gKm12cDsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oInNoX212IiwgZWFybHlfcGFyc2VfbXYpOworCit2b2lkIF9faW5pdCBzaF9tdl9zZXR1cCh2b2lkKQoreworCS8qCisJICogT25seSBvdmVybG9hZCB0aGUgbWFjaHZlYyBpZiBvbmUgaGFzbid0IGJlZW4gc2VsZWN0ZWQgb24KKwkgKiB0aGUgY29tbWFuZCBsaW5lIHdpdGggc2hfbXY9CisJICovCisJaWYgKCFtYWNodmVjX3NlbGVjdGVkKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFjaHZlY19zaXplOworCisJCW1hY2h2ZWNfc2l6ZSA9ICgodW5zaWduZWQgbG9uZykmX19tYWNodmVjX2VuZCAtCisJCQkJKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19zdGFydCk7CisKKwkJLyoKKwkJICogSWYgdGhlIG1hY2h2ZWMgaGFzbid0IGJlZW4gcHJlc2VsZWN0ZWQsIHVzZSB0aGUgZmlyc3QKKwkJICogdmVjdG9yICh1c3VhbGx5IHRoZSBvbmx5IG9uZSkgZnJvbSAubWFjaHZlYy5pbml0LgorCQkgKi8KKwkJaWYgKG1hY2h2ZWNfc2l6ZSA+PSBzaXplb2Yoc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yKSkKKwkJCXNoX212ID0gKihzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OworCX0KKworCXByaW50ayhLRVJOX05PVElDRSAiQm9vdGluZyBtYWNodmVjOiAlc1xuIiwgZ2V0X3N5c3RlbV90eXBlKCkpOworCisJLyoKKwkgKiBNYW51YWxseSB3YWxrIHRoZSB2ZWMsIGZpbGwgaW4gYW55dGhpbmcgdGhhdCB0aGUgYm9hcmQgaGFzbid0IHlldAorCSAqIGJ5IGhhbmQsIHdyYXBwaW5nIHRvIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uLgorCSAqLworI2RlZmluZSBtdl9zZXQoZWxlbSkgZG8geyBcCisJaWYgKCFzaF9tdi5tdl8jI2VsZW0pIFwKKwkJc2hfbXYubXZfIyNlbGVtID0gZ2VuZXJpY18jI2VsZW07IFwKK30gd2hpbGUgKDApCisKKwltdl9zZXQoaW5iKTsJbXZfc2V0KGludyk7CW12X3NldChpbmwpOworCW12X3NldChvdXRiKTsJbXZfc2V0KG91dHcpOwltdl9zZXQob3V0bCk7CisKKwltdl9zZXQoaW5iX3ApOwltdl9zZXQoaW53X3ApOwltdl9zZXQoaW5sX3ApOworCW12X3NldChvdXRiX3ApOwltdl9zZXQob3V0d19wKTsJbXZfc2V0KG91dGxfcCk7CisKKwltdl9zZXQoaW5zYik7CW12X3NldChpbnN3KTsJbXZfc2V0KGluc2wpOworCW12X3NldChvdXRzYik7CW12X3NldChvdXRzdyk7CW12X3NldChvdXRzbCk7CisKKwltdl9zZXQocmVhZGIpOwltdl9zZXQocmVhZHcpOwltdl9zZXQocmVhZGwpOworCW12X3NldCh3cml0ZWIpOwltdl9zZXQod3JpdGV3KTsJbXZfc2V0KHdyaXRlbCk7CisKKwltdl9zZXQoaW9wb3J0X21hcCk7CisJbXZfc2V0KGlvcG9ydF91bm1hcCk7CisJbXZfc2V0KGlycV9kZW11eCk7CisKKwlpZiAoIXNoX212Lm12X25yX2lycXMpCisJCXNoX212Lm12X25yX2lycXMgPSBOUl9JUlFTOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGExMWUyYWEuLjYzMzRhNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC0zMTksOSArMzIwLDcgQEAKIAljdHJsX291dGwocGMsIFVCQ19CQVJBKTsKIAogI2lmZGVmIENPTkZJR19NTVUKLQkvKiBXZSBkb24ndCBoYXZlIGFueSBBU0lEIHNldHRpbmdzIGZvciB0aGUgU0gtMiEgKi8KLQlpZiAoY3VycmVudF9jcHVfZGF0YS50eXBlICE9IENQVV9TSDc2MDQpCi0JCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOworCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOwogI2VuZGlmCiAKIAljdHJsX291dGwoMCwgVUJDX0JBTVJBKTsKQEAgLTQwNSw4ICs0MDQsOCBAQAogCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCXN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CiAjaWZkZWYgQ09ORklHX01NVQorCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLT5yZWdzWzE1XSwgcmVncywgMCwgTlVMTCwgTlVMTCk7CiAjZWxzZQogCS8qIGZvcmsgYWxtb3N0IHdvcmtzLCBlbm91Z2ggdG8gdHJpY2sgeW91IGludG8gbG9va2luZyBlbHNld2hlcmUgOi0oICovCkBAIC00NDksMjMgKzQ0OCwyMCBAQAogLyoKICAqIHN5c19leGVjdmUoKSBleGVjdXRlcyBhIG5ldyBwcm9ncmFtLgogICovCi1hc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgKnVmaWxlbmFtZSwgY2hhciAqKnVhcmd2LAotCQkJICBjaGFyICoqdWVudnAsIHVuc2lnbmVkIGxvbmcgcjcsCithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICp1ZmlsZW5hbWUsIGNoYXIgX191c2VyICogX191c2VyICp1YXJndiwKKwkJCSAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKnVlbnZwLCB1bnNpZ25lZCBsb25nIHI3LAogCQkJICBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCWludCBlcnJvcjsKIAljaGFyICpmaWxlbmFtZTsKIAotCWZpbGVuYW1lID0gZ2V0bmFtZSgoY2hhciBfX3VzZXIgKil1ZmlsZW5hbWUpOworCWZpbGVuYW1lID0gZ2V0bmFtZSh1ZmlsZW5hbWUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CiAJaWYgKElTX0VSUihmaWxlbmFtZSkpCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsCi0JCQkgIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKXVhcmd2LAotCQkJICAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKil1ZW52cCwKLQkJCSAgcmVncyk7CisJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIHVhcmd2LCB1ZW52cCwgcmVncyk7CiAJaWYgKGVycm9yID09IDApIHsKIAkJdGFza19sb2NrKGN1cnJlbnQpOwogCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2ZiNWZjMC4uODkxZDFkNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKQEAgLTkxLDE3ICs5MSw4IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLQkJYnJlYWs7Ci0JfQorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0xMjgsMTcgKzExOSwxNCBAQAogCQkJdG1wID0gISF0c2tfdXNlZF9tYXRoKGNoaWxkKTsKIAkJZWxzZQogCQkJdG1wID0gMDsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEpOwogCQlicmVhazsKIAl9CiAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpAQCAtMTk2LDcgKzE4NCw3IEBACiAKIAljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOiB7ICAvKiBzZXQgdGhlIHRyYXAgZmxhZy4gKi8KIAkJbG9uZyBwYzsKLQkJc3RydWN0IHB0X3JlZ3MgKmR1bW15ID0gTlVMTDsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBOVUxMOwogCiAJCXJldCA9IC1FSU87CiAJCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQpAQCAtMjA3LDcgKzE5NSw3IEBACiAJCQljaGlsZC0+cHRyYWNlIHw9IFBUX0RUUkFDRTsKIAkJfQogCi0JCXBjID0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsIChsb25nKSZkdW1teS0+cGMpOworCQlwYyA9IGdldF9zdGFja19sb25nKGNoaWxkLCAobG9uZykmcmVncy0+cGMpOwogCiAJCS8qIE5leHQgc2NoZWR1bGluZyB3aWxsIHNldCB1cCBVQkMgKi8KIAkJaWYgKGNoaWxkLT50aHJlYWQudWJjX3BjID09IDApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwppbmRleCBjMjc3MjkxLi5kZThlNmUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00MSwyMCArNDIsMTkgQEAKICAqIFRoZSBiaWdnZXIgdmFsdWUgbWVhbnMgbm8gcHJvYmxlbS4KICAqLwogc3RydWN0IHNoX2NwdWluZm8gYm9vdF9jcHVfZGF0YSA9IHsgQ1BVX1NIX05PTkUsIDEwMDAwMDAwLCB9OworCisvKgorICogVGhlIG1hY2hpbmUgdmVjdG9yLiBGaXJzdCBlbnRyeSBpbiAubWFjaHZlYy5pbml0LCBvciBjbG9iYmVyZWQgYnkKKyAqIHNoX212PSBvbiB0aGUgY29tbWFuZCBsaW5lLCBwcmlvciB0byAubWFjaHZlYy5pbml0IHRlYXJkb3duLgorICovCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXYgPSB7IC5tdl9uYW1lID0gImdlbmVyaWMiLCB9OworCiAjaWZkZWYgQ09ORklHX1ZUCiBzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXY7Ci0jZW5kaWYKLQogZXh0ZXJuIGludCByb290X21vdW50ZmxhZ3M7CiAKLSNkZWZpbmUgTVZfTkFNRV9TSVpFIDMyCi0KLXN0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqIF9faW5pdCBnZXRfbXZfYnluYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotCiAvKgogICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCiAgKi8KQEAgLTgwLDEzMSArODAsMTcgQEAKIAogdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJzZV9jbWRsaW5lIChjaGFyICoqIGNtZGxpbmVfcCwgY2hhciBtdl9uYW1lW01WX05BTUVfU0laRV0sCi0JCQkJICBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqKiBtdnAsCi0JCQkJICB1bnNpZ25lZCBsb25nICptdl9pb19iYXNlKQorc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfbWVtKGNoYXIgKnApCiB7Ci0JY2hhciBjID0gJyAnLCAqdG8gPSBjb21tYW5kX2xpbmUsICpmcm9tID0gQ09NTUFORF9MSU5FOwotCWludCBsZW4gPSAwOwotCi0JLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLwotCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FLCBDT01NQU5EX0xJTkVfU0laRSk7Ci0JYm9vdF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkUtMV0gPSAnXDAnOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAogCW1lbW9yeV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKVBBR0VfT0ZGU0VUK19fTUVNT1JZX1NUQVJUOwotCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBfX01FTU9SWV9TSVpFOwotCi0JZm9yICg7OykgewotCQkvKgotCQkgKiAibWVtPVhYWFtrS21NXSIgZGVmaW5lcyBhIHNpemUgb2YgbWVtb3J5LgotCQkgKi8KLQkJaWYgKGMgPT0gJyAnICYmICFtZW1jbXAoZnJvbSwgIm1lbT0iLCA0KSkgewotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJewotCQkJCXVuc2lnbmVkIGxvbmcgbWVtX3NpemU7Ci0KLQkJCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGZyb20rNCwgJmZyb20pOwotCQkJCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBtZW1fc2l6ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjID09ICcgJyAmJiAhbWVtY21wKGZyb20sICJzaF9tdj0iLCA2KSkgewotCQkJY2hhciogbXZfZW5kOwotCQkJY2hhciogbXZfY29tbWE7Ci0JCQlpbnQgbXZfbGVuOwotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJZnJvbSArPSA2OwotCQkJbXZfZW5kID0gc3RyY2hyKGZyb20sICcgJyk7Ci0JCQlpZiAobXZfZW5kID09IE5VTEwpCi0JCQkJbXZfZW5kID0gZnJvbSArIHN0cmxlbihmcm9tKTsKLQotCQkJbXZfY29tbWEgPSBzdHJjaHIoZnJvbSwgJywnKTsKLQkJCWlmICgobXZfY29tbWEgIT0gTlVMTCkgJiYgKG12X2NvbW1hIDwgbXZfZW5kKSkgewotCQkJCWludCBpbnRzWzNdOwotCQkJCWdldF9vcHRpb25zKG12X2NvbW1hKzEsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCQkJCSptdl9pb19iYXNlID0gaW50c1sxXTsKLQkJCQltdl9sZW4gPSBtdl9jb21tYSAtIGZyb207Ci0JCQl9IGVsc2UgewotCQkJCW12X2xlbiA9IG12X2VuZCAtIGZyb207Ci0JCQl9Ci0JCQlpZiAobXZfbGVuID4gKE1WX05BTUVfU0laRS0xKSkKLQkJCQltdl9sZW4gPSBNVl9OQU1FX1NJWkUtMTsKLQkJCW1lbWNweShtdl9uYW1lLCBmcm9tLCBtdl9sZW4pOwotCQkJbXZfbmFtZVttdl9sZW5dID0gJ1wwJzsKLQkJCWZyb20gPSBtdl9lbmQ7Ci0KLQkJCSptdnAgPSBnZXRfbXZfYnluYW1lKG12X25hbWUpOwotCQl9Ci0KLQkJYyA9ICooZnJvbSsrKTsKLQkJaWYgKCFjKQotCQkJYnJlYWs7Ci0JCWlmIChDT01NQU5EX0xJTkVfU0laRSA8PSArK2xlbikKLQkJCWJyZWFrOwotCQkqKHRvKyspID0gYzsKLQl9Ci0JKnRvID0gJ1wwJzsKLQkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzaF9tdl9zZXR1cChjaGFyICoqY21kbGluZV9wKQotewotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JZXh0ZXJuIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl91bmtub3duOwotI2VuZGlmCi0Jc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdiA9IE5VTEw7Ci0JY2hhciBtdl9uYW1lW01WX05BTUVfU0laRV0gPSAiIjsKLQl1bnNpZ25lZCBsb25nIG12X2lvX2Jhc2UgPSAwOwotCi0JcGFyc2VfY21kbGluZShjbWRsaW5lX3AsIG12X25hbWUsICZtdiwgJm12X2lvX2Jhc2UpOwotCi0jaWZkZWYgQ09ORklHX1NIX1VOS05PV04KLQlpZiAobXYgPT0gTlVMTCkgewotCQltdiA9ICZtdl91bmtub3duOwotCQlpZiAoKm12X25hbWUgIT0gJ1wwJykgewotCQkJcHJpbnRrKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBtYWNoaW5lICVzLCB1c2luZyB1bmtub3duXG4iLAotCQkJICAgICAgIG12X25hbWUpOwotCQl9Ci0JfQotCXNoX212ID0gKm12OwotI2VuZGlmCi0KLQkvKgotCSAqIE1hbnVhbGx5IHdhbGsgdGhlIHZlYywgZmlsbCBpbiBhbnl0aGluZyB0aGF0IHRoZSBib2FyZCBoYXNuJ3QgeWV0Ci0JICogYnkgaGFuZCwgd3JhcHBpbmcgdG8gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCi0JICovCi0jZGVmaW5lIG12X3NldChlbGVtKSBkbyB7IFwKLQlpZiAoIXNoX212Lm12XyMjZWxlbSkgXAotCQlzaF9tdi5tdl8jI2VsZW0gPSBnZW5lcmljXyMjZWxlbTsgXAotfSB3aGlsZSAoMCkKLQotCW12X3NldChpbmIpOwltdl9zZXQoaW53KTsJbXZfc2V0KGlubCk7Ci0JbXZfc2V0KG91dGIpOwltdl9zZXQob3V0dyk7CW12X3NldChvdXRsKTsKLQotCW12X3NldChpbmJfcCk7CW12X3NldChpbndfcCk7CW12X3NldChpbmxfcCk7Ci0JbXZfc2V0KG91dGJfcCk7CW12X3NldChvdXR3X3ApOwltdl9zZXQob3V0bF9wKTsKLQotCW12X3NldChpbnNiKTsJbXZfc2V0KGluc3cpOwltdl9zZXQoaW5zbCk7Ci0JbXZfc2V0KG91dHNiKTsJbXZfc2V0KG91dHN3KTsJbXZfc2V0KG91dHNsKTsKLQotCW12X3NldChyZWFkYik7CW12X3NldChyZWFkdyk7CW12X3NldChyZWFkbCk7Ci0JbXZfc2V0KHdyaXRlYik7CW12X3NldCh3cml0ZXcpOwltdl9zZXQod3JpdGVsKTsKLQotCW12X3NldChpb3BvcnRfbWFwKTsKLQltdl9zZXQoaW9wb3J0X3VubWFwKTsKLQltdl9zZXQoaXJxX2RlbXV4KTsKLQotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JX19zZXRfaW9fcG9ydF9iYXNlKG12X2lvX2Jhc2UpOwotI2VuZGlmCi0KLQlpZiAoIXNoX212Lm12X25yX2lycXMpCi0JCXNoX212Lm12X25yX2lycXMgPSBOUl9JUlFTOworCXNpemUgPSBtZW1wYXJzZShwLCAmcCk7CisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIHNpemU7CiAKIAlyZXR1cm4gMDsKIH0KK2Vhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9wYXJzZV9tZW0pOwogCiAvKgogICogUmVnaXN0ZXIgZnVsbHkgYXZhaWxhYmxlIGxvdyBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCkBAIC0yMzAsNyArMTE2LDcgQEAKIAlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoY3Vycl9wZm4pLCBQRk5fUEhZUyhwYWdlcykpOwogfQogCi12b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbikKK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHVuc2lnbmVkIGxvbmcgZnJlZV9wZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBib290bWFwX3NpemU7CiAKQEAgLTIzOSw5ICsxMjUsMTAgQEAKIAkgKiBib290c3RyYXAgc3RlcCBhbGwgYWxsb2NhdGlvbnMgKHVudGlsIHRoZSBwYWdlIGFsbG9jYXRvcgogCSAqIGlzIGludGFjdCkgbXVzdCBiZSBkb25lIHZpYSBib290bWVtX2FsbG9jKCkuCiAJICovCi0JYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBzdGFydF9wZm4sCisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBmcmVlX3BmbiwKIAkJCQkJIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CiAKKwlhZGRfYWN0aXZlX3JhbmdlKDAsIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CiAJcmVnaXN0ZXJfYm9vdG1lbV9sb3dfcGFnZXMoKTsKIAogCW5vZGVfc2V0X29ubGluZSgwKTsKQEAgLTI1NCw3ICsxNDEsNyBAQAogCSAqIGFuIGludmFsaWQgUkFNIGFyZWEuCiAJICovCiAJcmVzZXJ2ZV9ib290bWVtKF9fTUVNT1JZX1NUQVJUK1BBR0VfU0laRSwKLQkJKFBGTl9QSFlTKHN0YXJ0X3BmbikrYm9vdG1hcF9zaXplK1BBR0VfU0laRS0xKS1fX01FTU9SWV9TVEFSVCk7CisJCShQRk5fUEhZUyhmcmVlX3BmbikrYm9vdG1hcF9zaXplK1BBR0VfU0laRS0xKS1fX01FTU9SWV9TVEFSVCk7CiAKIAkvKgogCSAqIHJlc2VydmUgcGh5c2ljYWwgcGFnZSAwIC0gaXQncyBhIHNwZWNpYWwgQklPUyBwYWdlIG9uIG1hbnkgYm94ZXMsCkBAIC0yNjIsNiArMTQ5LDggQEAKIAkgKi8KIAlyZXNlcnZlX2Jvb3RtZW0oX19NRU1PUllfU1RBUlQsIFBBR0VfU0laRSk7CiAKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucygwKTsKKwogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCVJPT1RfREVWID0gTUtERVYoUkFNRElTS19NQUpPUiwgMCk7CiAJaWYgKCZfX3JkX3N0YXJ0ICE9ICZfX3JkX2VuZCkgewpAQCAtMzE1LDEwICsyMDQsNiBAQAogewogCWVuYWJsZV9tbXUoKTsKIAotI2lmZGVmIENPTkZJR19DTURMSU5FX0JPT0wKLQlzdHJjcHkoQ09NTUFORF9MSU5FLCBDT05GSUdfQ01ETElORSk7Ci0jZW5kaWYKLQogCVJPT1RfREVWID0gb2xkX2RlY29kZV9kZXYoT1JJR19ST09UX0RFVik7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KQEAgLTMzOSw5ICsyMjQsMjIgQEAKIAlkYXRhX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19waHlzKF9ldGV4dCk7CiAJZGF0YV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoX2VkYXRhKS0xOwogCisJbWVtb3J5X3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpUEFHRV9PRkZTRVQrX19NRU1PUllfU1RBUlQ7CisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIF9fTUVNT1JZX1NJWkU7CisKKyNpZmRlZiBDT05GSUdfQ01ETElORV9CT09MCisJc3RybGNweShjb21tYW5kX2xpbmUsIENPTkZJR19DTURMSU5FLCBzaXplb2YoY29tbWFuZF9saW5lKSk7CisjZWxzZQorCXN0cmxjcHkoY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkUsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKKyNlbmRpZgorCisJLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLworCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKKwogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKLQlzaF9tdl9zZXR1cChjbWRsaW5lX3ApOworCXNoX212X3NldHVwKCk7CiAKIAkvKgogCSAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKQEAgLTM1NSw4ICsyNTMsOSBAQAogCW1pbl9sb3dfcGZuID0gX19NRU1PUllfU1RBUlQgPj4gUEFHRV9TSElGVDsKIAogCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7CisKKwkvKiBTZXR1cCBib290bWVtIHdpdGggYXZhaWxhYmxlIFJBTSAqLwogCXNldHVwX21lbW9yeSgpOwotCXBhZ2luZ19pbml0KCk7CiAJc3BhcnNlX2luaXQoKTsKIAogI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCkBAIC0zNjYsNDYgKzI2NSwxMyBAQAogCS8qIFBlcmZvcm0gdGhlIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gKi8KIAlpZiAobGlrZWx5KHNoX212Lm12X3NldHVwKSkKIAkJc2hfbXYubXZfc2V0dXAoY21kbGluZV9wKTsKKworCXBhZ2luZ19pbml0KCk7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciogX19pbml0IGdldF9tdl9ieW5hbWUoY29uc3QgY2hhciogbmFtZSkKLXsKLQlleHRlcm4gbG9uZyBfX21hY2h2ZWNfc3RhcnQsIF9fbWFjaHZlY19lbmQ7Ci0Jc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICphbGxfdmVjcyA9Ci0JCShzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OwotCi0JaW50IGksIG4gPSAoKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19lbmQKLQkJICAgIC0gKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19zdGFydCkvCi0JCXNpemVvZihzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IpOwotCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKm12ID0gJmFsbF92ZWNzW2ldOwotCQlpZiAobXYgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RyY2FzZWNtcChuYW1lLCBnZXRfc3lzdGVtX3R5cGUoKSkgPT0gMCkgewotCQkJcmV0dXJuIG12OwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGNwdSBjcHVbTlJfQ1BVU107Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKLXsKLQlpbnQgY3B1X2lkOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdV9pZCkKLQkJcmVnaXN0ZXJfY3B1KCZjcHVbY3B1X2lkXSwgY3B1X2lkKTsKLQotCXJldHVybiAwOwotfQotCi1zdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpjcHVfbmFtZVtdID0gewogCVtDUFVfU0g3MjA2XQk9ICJTSDcyMDYiLAlbQ1BVX1NINzYxOV0JPSAiU0g3NjE5IiwKLQlbQ1BVX1NINzYwNF0JPSAiU0g3NjA0IiwJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCisJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCiAJW0NQVV9TSDc3MDVdCT0gIlNINzcwNSIsCVtDUFVfU0g3NzA2XQk9ICJTSDc3MDYiLAogCVtDUFVfU0g3NzA3XQk9ICJTSDc3MDciLAlbQ1BVX1NINzcwOF0JPSAiU0g3NzA4IiwKIAlbQ1BVX1NINzcwOV0JPSAiU0g3NzA5IiwJW0NQVV9TSDc3MTBdCT0gIlNINzcxMCIsCkBAIC00MTksNyArMjg1LDcgQEAKIAlbQ1BVX1NINzc3MF0JPSAiU0g3NzcwIiwJW0NQVV9TSDc3ODBdCT0gIlNINzc4MCIsCiAJW0NQVV9TSDc3ODFdCT0gIlNINzc4MSIsCVtDUFVfU0g3MzQzXQk9ICJTSDczNDMiLAogCVtDUFVfU0g3Nzg1XQk9ICJTSDc3ODUiLAlbQ1BVX1NINzcyMl0JPSAiU0g3NzIyIiwKLQlbQ1BVX1NIX05PTkVdCT0gIlVua25vd24iCisJW0NQVV9TSFgzXQk9ICJTSC1YMyIsCVtDUFVfU0hfTk9ORV0JPSAiVW5rbm93biIKIH07CiAKIGNvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZShzdHJ1Y3Qgc2hfY3B1aW5mbyAqYykKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCmluZGV4IGMxY2ZjYjkuLmM5NjhkY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYwpAQCAtNzgsNiArNzgsMTYgQEAKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtX2k0X2V2ZW4pOwogREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1faTRfb2RkKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0kxMl9pNCk7CisKKyNpZiAoX19HTlVDX01JTk9SX18gPT0gMiB8fCBkZWZpbmVkKF9fR05VQ19TVE1fUkVMRUFTRV9fKSkKKy8qCisgKiBHQ0MgNC4yIGVtaXRzIHRoZXNlIGZvciBkaXZpc2lvbiwgYXMgZG8gR0NDIDQuMS54IHZlcnNpb25zIG9mIHRoZSBTVAorICogY29tcGlsZXIgd2hpY2ggaW5jbHVkZSBiYWNrcG9ydGVkIHBhdGNoZXMuCisgKi8KK0RFQ0xBUkVfRVhQT1JUKF9fc2RpdnNpM19pNGkpOworREVDTEFSRV9FWFBPUlQoX191ZGl2X3Fybm5kXzE2KTsKK0RFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpM19pNGkpOworI2VuZGlmCiAjZWxzZSAvKiBHQ0MgMy54ICovCiBERUNMQVJFX0VYUE9SVChfX21vdnN0cl9pNF9ldmVuKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92c3RyX2k0X29kZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCmluZGV4IGUzMjNlMjkuLjcwNmQ4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yNjEsNyArMjYyLDcgQEAKIAkJZ290byBiYWRmcmFtZTsKIAkvKiBJdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBhdm9pZCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhhbiB0bwogCSAgIGNhbGwgaXQgYW5kIGlnbm9yZSBlcnJvcnMuICAqLwotCWRvX3NpZ2FsdHN0YWNrKCZzdCwgTlVMTCwgcmVncy0+cmVnc1sxNV0pOworCWRvX3NpZ2FsdHN0YWNrKChjb25zdCBzdGFja190IF9fdXNlciAqKSZzdCwgTlVMTCwgKHVuc2lnbmVkIGxvbmcpZnJhbWUpOwogCiAJcmV0dXJuIHIwOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCA3ZGIxYzJkLi5mZjU2NTZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKQEAgLTMwOCw5ICszMDgsOSBAQAogCS5sb25nIHN5c191dGltZXMKICAJLmxvbmcgc3lzX2ZhZHZpc2U2NF82NF93cmFwcGVyCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogUmVzZXJ2ZWQgZm9yIHZzZXJ2ZXIgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBSZXNlcnZlZCBmb3IgbWJpbmQgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAyNzUgLSBnZXRfbWVtcG9saWN5ICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc2V0X21lbXBvbGljeSAqLworCS5sb25nIHN5c19tYmluZAorCS5sb25nIHN5c19nZXRfbWVtcG9saWN5CQkvKiAyNzUgKi8KKwkubG9uZyBzeXNfc2V0X21lbXBvbGljeQogCS5sb25nIHN5c19tcV9vcGVuCiAJLmxvbmcgc3lzX21xX3VubGluawogCS5sb25nIHN5c19tcV90aW1lZHNlbmQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYwppbmRleCAyZDk5N2UyLi4wOTdlYmQ0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0YXRpYyBpbnQgdG11X3RpbWVyX3N0YXJ0KHZvaWQpCiB7Ci0JY3RybF9vdXRiKGN0cmxfaW5iKFRNVV9UU1RSKSB8IDB4MywgVE1VX1RTVFIpOworCWN0cmxfb3V0YihjdHJsX2luYihUTVVfMDEyX1RTVFIpIHwgMHgzLCBUTVVfMDEyX1RTVFIpOwogCXJldHVybiAwOwogfQogCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQgdG11X3RpbWVyX3N0b3Aodm9pZCkKIHsKLQljdHJsX291dGIoY3RybF9pbmIoVE1VX1RTVFIpICYgfjB4MywgVE1VX1RTVFIpOworCWN0cmxfb3V0YihjdHJsX2luYihUTVVfMDEyX1RTVFIpICYgfjB4MywgVE1VXzAxMl9UU1RSKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc0LDcgKzE3NCw4IEBACiAKICNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSAmJiBcCiAgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkgJiYgXAotICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCisgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQogCWN0cmxfb3V0YihUTVVfVE9DUl9JTklULCBUTVVfVE9DUik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ODQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdSwgY3B1X2RldmljZXMpOworCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworI2lmZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKKwkJcmVnaXN0ZXJfb25lX25vZGUoaSk7CisjZW5kaWYKKworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKKwkJcmV0ID0gcmVnaXN0ZXJfY3B1KCZwZXJfY3B1KGNwdV9kZXZpY2VzLCBpKSwgaSk7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlZ2lzdGVyX2NwdSAlZCBmYWlsZWQgKCVkKVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGksIHJldCk7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKKwkvKgorCSAqIEluIHRoZSBVUCBjYXNlLCBtYWtlIHN1cmUgdGhlIENQVSBhc3NvY2lhdGlvbiBpcyBzdGlsbAorCSAqIHJlZ2lzdGVyZWQgdW5kZXIgZWFjaCBub2RlLiBXaXRob3V0IHRoaXMsIHN5c2ZzIGZhaWxzCisJICogdG8gbWFrZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIG5vZGVzIG90aGVyIHRoYW4gbm9kZTAKKwkgKiBhbmQgY3B1MC4KKwkgKi8KKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKQorCQlpZiAoaSAhPSBudW1hX25vZGVfaWQoKSkKKwkJCXJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGkpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCmluZGV4IDhmMTg5MzAuLjUwMmQ0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwpAQCAtMTAzLDYgKzEwMyw3IEBACiAJCQkgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGN1cnJlbnQpKTsKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSkKQEAgLTU4NCw3ICs1ODUsNyBAQAogCQlpbmZvLnNpX3NpZ25vID0gU0lHQlVTOwogCQlpbmZvLnNpX2Vycm5vID0gMDsKIAkJaW5mby5zaV9jb2RlID0gc2lfY29kZTsKLQkJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgYWRkcmVzczsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcmVzczsKIAkJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgY3VycmVudCk7CiAJfSBlbHNlIHsKIAkJaWYgKHJlZ3MtPnBjICYgMSkKQEAgLTYxNyw3ICs2MTgsNyBAQAogICovCiBpbnQgaXNfZHNwX2luc3Qoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgc2hvcnQgaW5zdDsKKwl1bnNpZ25lZCBzaG9ydCBpbnN0ID0gMDsKIAogCS8qCiAJICogU2FmZSBndWFyZCBpZiBEU1AgbW9kZSBpcyBhbHJlYWR5IGVuYWJsZWQgb3Igd2UncmUgbGFja2luZwpAQCAtNjQ1LDcgKzY0Niw2IEBACiAJCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCXNpZ2luZm9fdCBpbmZvOwogCiAJc3dpdGNoIChyNCkgewpAQCAtODc0LDcgKzg3NCw3IEBACiB2b2lkIGhhbmRsZV9CVUcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZW51bSBidWdfdHJhcF90eXBlIHR0OwotCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5wYyk7CisJdHQgPSByZXBvcnRfYnVnKHJlZ3MtPnBjLCByZWdzKTsKIAlpZiAodHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCXJlZ3MtPnBjICs9IDI7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDRjNWI1N2UuLjA2OTY0MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtOTcsMTggKzk3LDIwIEBACiAgIF9faW5pdHJhbWZzX2VuZCA9IC47CiAjZW5kaWYKIAorIC4gPSBBTElHTig0KTsKICAgX19tYWNodmVjX3N0YXJ0ID0gLjsKLSAgLmluaXQubWFjaHZlYyA6IHsgKiguaW5pdC5tYWNodmVjKSB9CisgIC5tYWNodmVjLmluaXQgOiB7ICooLm1hY2h2ZWMuaW5pdCkgfQogICBfX21hY2h2ZWNfZW5kID0gLjsKKwogICAuID0gQUxJR04oUEFHRV9TSVpFKTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgLiA9IEFMSUdOKDQpOwotICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLSAgLmJzcyA6IHsgKiguYnNzKSB9Ci0KLSAgLiA9IEFMSUdOKDQpOwotICBfZW5kID0gLiA7CisgIC5ic3MgOiB7CisJX19pbml0X2VuZCA9IC47CisJX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTICovCisgIAkqKC5ic3MucGFnZV9hbGlnbmVkKQorICAJKiguYnNzKQorCS4gPSBBTElHTig0KTsKKwlfZW5kID0gLiA7CisgIH0KIAogICAvKiBXaGVuIHNvbWV0aGluZyBpbiB0aGUga2VybmVsIGlzIE5PVCBjb21waWxlZCBhcyBhIG1vZHVsZSwgdGhlCiAgICAqIG1vZHVsZSBjbGVhbnVwIGNvZGUgYW5kIGRhdGEgYXJlIHB1dCBpbnRvIHRoZXNlIHNlZ21lbnRzLiAgQm90aApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jIGIvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jCmluZGV4IGMwMjQ3M2EuLjRiZWYzYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL2RpdjY0LWdlbmVyaWMuYworKysgYi9hcmNoL3NoL2xpYi9kaXY2NC1nZW5lcmljLmMKQEAgLTQsMTYgKzQsMTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLWV4dGVybiB1NjQgX194ZGl2NjRfMzIodTY0IG4sIHUzMiBkKTsKK2V4dGVybiB1aW50NjRfdCBfX3hkaXY2NF8zMih1NjQgbiwgdTMyIGQpOwogCi11NjQgX19kaXY2NF8zMih1NjQgKnhwLCB1MzIgeSkKK3VpbnQzMl90IF9fZGl2NjRfMzIodTY0ICp4cCwgdTMyIHkpCiB7Ci0JdTY0IHJlbTsKLQl1NjQgcSA9IF9feGRpdjY0XzMyKCp4cCwgeSk7CisJdWludDMyX3QgcmVtOworCXVpbnQ2NF90IHEgPSBfX3hkaXY2NF8zMigqeHAsIHkpOwogCiAJcmVtID0gKnhwIC0gcSAqIHk7CiAJKnhwID0gcTsKIAogCXJldHVybiByZW07CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbGliL2RpdjY0LlMgYi9hcmNoL3NoL2xpYi9kaXY2NC5TCmluZGV4IGVlZmMyNzUuLjVlZTczMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL2RpdjY0LlMKKysrIGIvYXJjaC9zaC9saWIvZGl2NjQuUwpAQCAtMSwxMiArMSwxMiBAQAogLyoJCi0gKiB1bnNpZ25lZCBsb25nIGxvbmcgX194ZGl2NjRfMzIodW5zaWduZWQgbG9uZyBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCk7IAorICogdW5zaWduZWQgbG9uZyBfX3hkaXY2NF8zMih1bnNpZ25lZCBsb25nIGxvbmcgbiwgdW5zaWduZWQgbG9uZyBkKTsgCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogLnRleHQKIEVOVFJZKF9feGRpdjY0XzMyKQotI2lmZGVmICBfX0xJVFRMRV9FTkRJQU5fXworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogCW1vdglyNCwgcjAKIAltb3YJcjUsIHIxCiAjZWxzZQpAQCAtMzQsNyArMzQsNyBAQAogCXJvdGNsCXIwCiAJZGl2MQlyNiwgcjEKIAkuZW5kcgotI2lmZGVmICBfX0xJVFRMRV9FTkRJQU5fXworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogCW1vdglyMiwgcjEKIAlydHMKIAkgcm90Y2wJcjAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbWF0aC1lbXUvbWF0aC5jIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKaW5kZXggYTM4ZTFlZS4uYWMyZDdhYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKKysrIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKQEAgLTUwNyw2ICs1MDcsNyBAQAogCXVuc2lnbmVkIHNob3J0IGluc24gPSAqKHVuc2lnbmVkIHNob3J0ICopcmVncy0+cGM7CiAJdW5zaWduZWQgc2hvcnQgZmluc247CiAJdW5zaWduZWQgbG9uZyBuZXh0cGM7CisJc2lnaW5mb190IGluZm87CiAJaW50IG5pYls0XSA9IHsKIAkJKGluc24gPj4gMTIpICYgMHhmLAogCQkoaW5zbiA+PiA4KSAmIDB4ZiwKQEAgLTU1OSw5ICs1NjAsMTEgQEAKIAkJCQl+KEZQU0NSX0NBVVNFX01BU0sgfCBGUFNDUl9GTEFHX01BU0spOwogCQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKIAkJfSBlbHNlIHsKLQkJCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQkJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOwotCQkJZm9yY2Vfc2lnKFNJR0ZQRSwgdHNrKTsKKwkJCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLT5wYzsKKwkJCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CiAJCX0KIAogCQlyZWdzLT5wYyA9IG5leHRwYzsKQEAgLTU3NiwxNCArNTc5LDE3IEBACiAJCQkgICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXNpZ2luZm9fdCBpbmZvOwogCiAJaWYgKGllZWVfZnBlX2hhbmRsZXIgKCZyZWdzKSkKIAkJcmV0dXJuOwogCiAJcmVncy5wYyArPSAyOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKLQlmb3JjZV9zaWcoU0lHRlBFLCB0c2spOworCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gRlBFX0ZMVElOVjsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLnBjOworCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9LY29uZmlnIGIvYXJjaC9zaC9tbS9LY29uZmlnCmluZGV4IDI1MzM0NmQuLjI4ZDc5YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vS2NvbmZpZworKysgYi9hcmNoL3NoL21tL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi1tZW51ICJQcm9jZXNzb3Igc2VsZWN0aW9uIgotCiAjCiAjIFByb2Nlc3NvciBmYW1pbGllcwogIwpAQCAtMzgsMjcgKzM2LDMxIEBACiBjb25maWcgQ1BVX1NIWDIKIAlib29sCiAKK2NvbmZpZyBDUFVfU0hYMworCWJvb2wKKworY2hvaWNlCisJcHJvbXB0ICJQcm9jZXNzb3Igc3ViLXR5cGUgc2VsZWN0aW9uIgorCiAjCiAjIFByb2Nlc3NvciBzdWJ0eXBlcwogIwogCi1jb21tZW50ICJTSC0yIFByb2Nlc3NvciBTdXBwb3J0IgotCi1jb25maWcgQ1BVX1NVQlRZUEVfU0g3NjA0Ci0JYm9vbCAiU3VwcG9ydCBTSDc2MDQgcHJvY2Vzc29yIgotCXNlbGVjdCBDUFVfU0gyCisjIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzYxOQogCWJvb2wgIlN1cHBvcnQgU0g3NjE5IHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMgorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAotY29tbWVudCAiU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyMDYKIAlib29sICJTdXBwb3J0IFNINzIwNiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCi1jb21tZW50ICJTSC0zIFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMDAKIAlib29sICJTdXBwb3J0IFNINzMwMCBwcm9jZXNzb3IiCkBAIC0xMTMsNyArMTE1LDcgQEAKIAloZWxwCiAJICBTZWxlY3QgU0g3NzEyIGlmIHlvdSBoYXZlIGEgU0gzLURTUCBTSDc3MTIgQ1BVLgogCi1jb21tZW50ICJTSC00IFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTAKIAlib29sICJTdXBwb3J0IFNINzc1MCBwcm9jZXNzb3IiCkBAIC0xMjUsNyArMTI3LDcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcwOTEKIAlib29sICJTdXBwb3J0IFNINzA5MSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCWhlbHAKIAkgIFNlbGVjdCBTSDcwOTEgaWYgeW91IGhhdmUgYW4gU0gtNCBiYXNlZCBTZWdhIGRldmljZSAoc3VjaCBhcwogCSAgdGhlIERyZWFtY2FzdCwgTmFvbWksIGFuZCBOYW9taSAyKS4KQEAgLTEzMywxMyArMTM1LDExIEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUgogCWJvb2wgIlN1cHBvcnQgU0g3NzUwUiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUwogCWJvb2wgIlN1cHBvcnQgU0g3NzUwUyBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUxCkBAIC0xNTMsNyArMTUzLDYgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTFSCiAJYm9vbCAiU3VwcG9ydCBTSDc3NTFSIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINAotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTEKIAlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NjAKQEAgLTE2Niw3ICsxNjUsNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g0LTIwMiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKIAotY29tbWVudCAiU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydCIKKyMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU1Q0MFNUQjEKIAlib29sICJTdXBwb3J0IFNUNDBTVEIxL1NUNDBSQSBwcm9jZXNzb3JzIgpAQCAtMTgxLDcgKzE4MCw3IEBACiAJaGVscAogCSAgU2VsZWN0IFNUNDBHWDEgaWYgeW91IGhhdmUgYSBTVDQwR1gxIENQVS4KIAotY29tbWVudCAiU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NzAKIAlib29sICJTdXBwb3J0IFNINzc3MCBwcm9jZXNzb3IiCkBAIC0xOTgsNyArMTk3LDEzIEBACiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCiAKLWNvbW1lbnQgIlNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydCIKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSFgzCisJYm9vbCAiU3VwcG9ydCBTSC1YMyBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDRBCisJc2VsZWN0IENQVV9TSFgzCisJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCisKKyMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMTgwCiAJYm9vbCAiU3VwcG9ydCBTSDczMTgwIHByb2Nlc3NvciIKQEAgLTIxMyw4ICsyMTgsMTAgQEAKIAlzZWxlY3QgQ1BVX1NINEFMX0RTUAogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKKwlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCisJc2VsZWN0IFNZU19TVVBQT1JUU19OVU1BCiAKLWVuZG1lbnUKK2VuZGNob2ljZQogCiBtZW51ICJNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zIgogCkBAIC0yNjYsNyArMjczLDcgQEAKIAogY29uZmlnIDMyQklUCiAJYm9vbCAiU3VwcG9ydCAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB0aHJvdWdoIFBNQiIKLQlkZXBlbmRzIG9uIENQVV9TSDRBICYmIE1NVSAmJiAoIVgyVExCIHx8IEJST0tFTikKKwlkZXBlbmRzIG9uIE1NVSAmJiAoQ1BVX1NVQlRZUEVfU0g3NzgwIHx8IENQVV9TVUJUWVBFX1NINzc4NSkKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgcGh5c2ljYWwgYWRkcmVzc2luZyB3aWxsIGJlIGV4dGVuZGVkIHRvCkBAIC0yOTUsNiArMzAyLDE3IEBACiAJICBGb3Igc3lzdGVtcyB3aXRoIGFuIE1NVSB0aGF0IGNhbiBhZmZvcmQgdG8gZ2l2ZSB1cCBhIHBhZ2UsCiAJICAodGhlIGRlZmF1bHQgdmFsdWUpIHNheSBZLgogCitjb25maWcgTlVNQQorCWJvb2wgIk5vbiBVbmlmb3JtIE1lbW9yeSBBY2Nlc3MgKE5VTUEpIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBNTVUgJiYgU1lTX1NVUFBPUlRTX05VTUEgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCSAgU29tZSBTSCBzeXN0ZW1zIGhhdmUgbWFueSB2YXJpb3VzIG1lbW9yaWVzIHNjYXR0ZXJlZCBhcm91bmQKKwkgIHRoZSBhZGRyZXNzIHNwYWNlLCBlYWNoIHdpdGggdmFyeWluZyBsYXRlbmNpZXMuIFRoaXMgZW5hYmxlcworCSAgc3VwcG9ydCBmb3IgdGhlc2UgYmxvY2tzIGJ5IGJpbmRpbmcgdGhlbSB0byBub2RlcyBhbmQgYWxsb3dpbmcKKwkgIG1lbW9yeSBwb2xpY2llcyB0byBiZSB1c2VkIGZvciBwcmlvcml0aXppbmcgYW5kIGNvbnRyb2xsaW5nCisJICBhbGxvY2F0aW9uIGJlaGF2aW91ci4KKwogY29uZmlnIE5PREVTX1NISUZUCiAJaW50CiAJZGVmYXVsdCAiMSIKQEAgLTMwMiwxNCArMzIwLDM0IEBACiAKIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gIU5VTUEKKworY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCWRlZl9ib29sIHkKKwlzZWxlY3QgU1BBUlNFTUVNX1NUQVRJQworCitjb25maWcgQVJDSF9TUEFSU0VNRU1fREVGQVVMVAorCWRlZl9ib29sIHkKIAogY29uZmlnIE1BWF9BQ1RJVkVfUkVHSU9OUwogCWludAorCWRlZmF1bHQgIjIiIGlmIChDUFVfU1VCVFlQRV9TSDc3MjIgJiYgU1BBUlNFTUVNKQogCWRlZmF1bHQgIjEiCiAKIGNvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAogCWRlZl9ib29sIHkKIAorY29uZmlnIEFSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTAorCWRlZl9ib29sIHkKKworY29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gU1BBUlNFTUVNCisKK2NvbmZpZyBBUkNIX01FTU9SWV9QUk9CRQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE1FTU9SWV9IT1RQTFVHCisKIGNob2ljZQogCXByb21wdCAiS2VybmVsIHBhZ2Ugc2l6ZSIKIAlkZWZhdWx0IFBBR0VfU0laRV80S0IKQEAgLTM5NCwxNSArNDMyLDQgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIFNIX09DUkFNCi0JYm9vbCAiT3BlcmFuZCBDYWNoZSBSQU0gKE9DUkFNKSBzdXBwb3J0IgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgdGVhciBkb3duIHRoZSBudW1iZXIgb2YKLQkgIHNldHMgaW4gdGhlIGRjYWNoZSBieSBoYWxmLCB3aGljaCBpbiB0dXJuIGV4cG9zZXMgYSBtZW1vcnkgcmFuZ2UuCi0KLQkgIFRoZSBhZGRyZXNzZXMgZm9yIHRoZSBPQyBSQU0gYmFzZSB3aWxsIHZhcnkgYWNjb3JkaW5nIHRvIHRoZQotCSAgcHJvY2Vzc29yIHZlcnNpb24uIENvbnN1bHQgdmVuZG9yIGRvY3VtZW50YXRpb24gZm9yIHNwZWNpZmljcy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9NYWtlZmlsZSBiL2FyY2gvc2gvbW0vTWFrZWZpbGUKaW5kZXggM2ZmZDdmNi4uZDY3N2Q3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL21tL01ha2VmaWxlCkBAIC04LDkgKzgsNiBAQAogb2JqLSQoQ09ORklHX0NQVV9TSDMpCSs9IGNhY2hlLXNoMy5vCiBvYmotJChDT05GSUdfQ1BVX1NINCkJKz0gY2FjaGUtc2g0Lm8KIAotb2JqLSQoQ09ORklHX0RNQV9QQUdFX09QUykJKz0gcGctZG1hLm8KLW9iai0kKENPTkZJR19IVUdFVExCX1BBR0UpCSs9IGh1Z2V0bGJwYWdlLm8KLQogbW11LXkJCQk6PSBmYXVsdC1ub21tdS5vIHRsYi1ub21tdS5vIHBnLW5vbW11Lm8KIG1tdS0kKENPTkZJR19NTVUpCTo9IGZhdWx0Lm8gY2xlYXJfcGFnZS5vIGNvcHlfcGFnZS5vIHRsYi1mbHVzaC5vCVwKIAkJCSAgIGlvcmVtYXAubwpAQCAtMjcsNSArMjQsNyBAQAogb2JqLSQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKSArPSBwZy1zaDc3MDUubwogZW5kaWYKIAorb2JqLSQoQ09ORklHX0hVR0VUTEJfUEFHRSkJKz0gaHVnZXRsYnBhZ2Uubwogb2JqLSQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQkrPSBjYWNoZS1zaDc3MDUubwogb2JqLSQoQ09ORklHXzMyQklUKQkJKz0gcG1iLm8KK29iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2ZhdWx0LmMgYi9hcmNoL3NoL21tL2ZhdWx0LmMKaW5kZXggYzg3OGZhYS4uMGIzZWFmNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc2gvbW0vZmF1bHQuYwpAQCAtMzIsNyArMzIsNiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2U7CiAJaW50IHNpX2NvZGU7CiAJc2lnaW5mb190IGluZm87CiAKQEAgLTE3MCwyNCArMTY5LDM4IEBACiAgKiB0ZXJtaW5hdGUgdGhpbmdzIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCiAgKgogICovCi0JaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCi0JCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIpOwotCXByaW50aygiIGF0IHZpcnR1YWwgYWRkcmVzcyAlMDhseFxuIiwgYWRkcmVzcyk7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKLQlwYWdlID0gKHVuc2lnbmVkIGxvbmcpZ2V0X1RUQigpOwotCWlmIChwYWdlKSB7Ci0JCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKikgcGFnZSlbYWRkcmVzcyA+PiBQR0RJUl9TSElGVF07Ci0JCXByaW50ayhLRVJOX0FMRVJUICIqcGRlID0gJTA4bHhcbiIsIHBhZ2UpOwotCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKLQkJCXBhZ2UgJj0gUEFHRV9NQVNLOwotCQkJYWRkcmVzcyAmPSAweDAwM2ZmMDAwOwotCQkJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKSBfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IFBBR0VfU0hJRlRdOwotCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwdGUgPSAlMDhseFxuIiwgcGFnZSk7CisKKwlidXN0X3NwaW5sb2NrcygxKTsKKworCWlmIChvb3BzX21heV9wcmludCgpKSB7CisJCV9fdHlwZW9mX18ocHRlX3ZhbChfX3B0ZSgwKSkpIHBhZ2U7CisKKwkJaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCisJCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgTlVMTCAiCisJCQkJCSAgInBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyAiCisJCQkJCSAgInJlcXVlc3QiKTsKKwkJcHJpbnRrKCIgYXQgdmlydHVhbCBhZGRyZXNzICUwOGx4XG4iLCBhZGRyZXNzKTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKKwkJcGFnZSA9ICh1bnNpZ25lZCBsb25nKWdldF9UVEIoKTsKKwkJaWYgKHBhZ2UpIHsKKwkJCXBhZ2UgPSAoKF9fdHlwZW9mX18ocGFnZSkgKikgX192YShwYWdlKSlbYWRkcmVzcyA+PgorCQkJCQkJCQkgUEdESVJfU0hJRlRdOworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwZGUgPSAlMDhseFxuIiwgcGFnZSk7CisJCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKKwkJCQlwYWdlICY9IFBBR0VfTUFTSzsKKwkJCQlhZGRyZXNzICY9IDB4MDAzZmYwMDA7CisJCQkJcGFnZSA9ICgoX190eXBlb2ZfXyhwYWdlKSAqKQorCQkJCQkJX192YShwYWdlKSlbYWRkcmVzcyA+PgorCQkJCQkJCSAgICBQQUdFX1NISUZUXTsKKwkJCQlwcmludGsoS0VSTl9BTEVSVCAiKnB0ZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwkJCX0KIAkJfQogCX0KKwogCWRpZSgiT29wcyIsIHJlZ3MsIHdyaXRlYWNjZXNzKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKIAlkb19leGl0KFNJR0tJTEwpOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pbml0LmMgYi9hcmNoL3NoL21tL2luaXQuYwppbmRleCBlMGU2NDRmLi44MmI2OGM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2luaXQuYworKysgYi9hcmNoL3NoL21tL2luaXQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOwpAQCAtMzYsMTQgKzM3LDExIEBACiAJc2hvd19mcmVlX2FyZWFzKCk7CiAKIAlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGk7CiAKIAkJcGdkYXRfcmVzaXplX2xvY2socGdkYXQsICZmbGFncyk7Ci0JCXBhZ2UgPSBwZ2RhdC0+bm9kZV9tZW1fbWFwOwotCQllbmQgPSBwYWdlICsgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsKLQotCQlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcGdkYXRfcGFnZV9ucihwZ2RhdCwgaSk7CiAJCQl0b3RhbCsrOwogCQkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKIAkJCQlyZXNlcnZlZCsrOwpAQCAtNTUsOSArNTMsNyBAQAogCQkJCWZyZWUrKzsKIAkJCWVsc2UKIAkJCQlzaGFyZWQgKz0gcGFnZV9jb3VudChwYWdlKSAtIDE7Ci0JCQlwYWdlKys7Ci0JCX0gd2hpbGUgKHBhZ2UgPCBlbmQpOwotCisJCX0KIAkJcGdkYXRfcmVzaXplX3VubG9jayhwZ2RhdCwgJmZsYWdzKTsKIAl9CiAKQEAgLTEzNywxNiArMTMzLDEyIEBACiB9CiAjZW5kaWYJLyogQ09ORklHX01NVSAqLwogCi0vKiBSZWZlcmVuY2VzIHRvIHNlY3Rpb24gYm91bmRhcmllcyAqLwotCi1leHRlcm4gY2hhciBfdGV4dCwgX2V0ZXh0LCBfZWRhdGEsIF9fYnNzX3N0YXJ0LCBfZW5kOwotZXh0ZXJuIGNoYXIgX19pbml0X2JlZ2luLCBfX2luaXRfZW5kOwotCiAvKgogICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcwogICovCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwogCWludCBuaWQ7CiAKIAkvKiBXZSBkb24ndCBuZWVkIHRvIG1hcCB0aGUga2VybmVsIHRocm91Z2ggdGhlIFRMQiwgYXMKQEAgLTE1OCw0MyArMTUwLDM5IEBACiAJICogY2hlY2sgZm9yIGEgbnVsbCB2YWx1ZS4gKi8KIAlzZXRfVFRCKHN3YXBwZXJfcGdfZGlyKTsKIAorCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOworCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKLQkJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CiAJCXVuc2lnbmVkIGxvbmcgbG93LCBzdGFydF9wZm47CiAKLQkJbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7Ci0KIAkJc3RhcnRfcGZuID0gcGdkYXQtPmJkYXRhLT5ub2RlX2Jvb3Rfc3RhcnQgPj4gUEFHRV9TSElGVDsKIAkJbG93ID0gcGdkYXQtPmJkYXRhLT5ub2RlX2xvd19wZm47CiAKLQkJbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBsb3c7Ci0JCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBzdGFydF9wZm4sIGxvdyk7CisJCWlmIChtYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA8IGxvdykKKwkJCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbG93OwogCiAJCXByaW50aygiTm9kZSAldTogc3RhcnRfcGZuID0gMHglbHgsIGxvdyA9IDB4JWx4XG4iLAogCQkgICAgICAgbmlkLCBzdGFydF9wZm4sIGxvdyk7Ci0KLQkJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7Ci0KLQkJcHJpbnRrKCJOb2RlICV1OiBtZW1fbWFwIHN0YXJ0cyBhdCAlcFxuIiwKLQkJICAgICAgIHBnZGF0LT5ub2RlX2lkLCBwZ2RhdC0+bm9kZV9tZW1fbWFwKTsKIAl9CisKKwlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKIH0KIAogc3RhdGljIHN0cnVjdCBrY29yZV9saXN0IGtjb3JlX21lbSwga2NvcmVfdm1hbGxvYzsKIAogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKLQlpbnQgY29kZXNpemUsIHJlc2VydmVkcGFnZXMsIGRhdGFzaXplLCBpbml0c2l6ZTsKKwlpbnQgY29kZXNpemUsIGRhdGFzaXplLCBpbml0c2l6ZTsKIAlpbnQgbmlkOwogCi0JcmVzZXJ2ZWRwYWdlcyA9IDA7CisJbnVtX3BoeXNwYWdlcyA9IDA7CisJaGlnaF9tZW1vcnkgPSBOVUxMOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKIAkJdW5zaWduZWQgbG9uZyBub2RlX3BhZ2VzID0gMDsKIAkJdm9pZCAqbm9kZV9oaWdoX21lbW9yeTsKLQkJaW50IGk7CiAKIAkJbnVtX3BoeXNwYWdlcyArPSBwZ2RhdC0+bm9kZV9wcmVzZW50X3BhZ2VzOwogCkBAIC0yMDMsMTMgKzE5MSw5IEBACiAKIAkJdG90YWxyYW1fcGFnZXMgKz0gbm9kZV9wYWdlczsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbm9kZV9wYWdlczsgaSsrKQotCQkJaWYgKFBhZ2VSZXNlcnZlZChwZ2RhdC0+bm9kZV9tZW1fbWFwICsgaSkpCi0JCQkJcmVzZXJ2ZWRwYWdlcysrOwotCi0JCW5vZGVfaGlnaF9tZW1vcnkgPSAodm9pZCAqKSgocGdkYXQtPm5vZGVfc3RhcnRfcGZuICsKLQkJCQkJICAgICBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzKSA8PAotCQkJCQkJUEFHRV9TSElGVCk7CisJCW5vZGVfaGlnaF9tZW1vcnkgPSAodm9pZCAqKV9fdmEoKHBnZGF0LT5ub2RlX3N0YXJ0X3BmbiArCisJCQkJCQkgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlcykgPDwKKwkJCQkJCSBQQUdFX1NISUZUKTsKIAkJaWYgKG5vZGVfaGlnaF9tZW1vcnkgPiBoaWdoX21lbW9yeSkKIAkJCWhpZ2hfbWVtb3J5ID0gbm9kZV9oaWdoX21lbW9yeTsKIAl9CkBAIC0yMzksMTEgKzIyMywxMCBAQAogCQkgICBWTUFMTE9DX0VORCAtIFZNQUxMT0NfU1RBUlQpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5OiAlbHVrLyVsdWsgYXZhaWxhYmxlICglZGsga2VybmVsIGNvZGUsICIKLQkgICAgICAgIiVkayByZXNlcnZlZCwgJWRrIGRhdGEsICVkayBpbml0KVxuIiwKKwkgICAgICAgIiVkayBkYXRhLCAlZGsgaW5pdClcbiIsCiAJCSh1bnNpZ25lZCBsb25nKSBucl9mcmVlX3BhZ2VzKCkgPDwgKFBBR0VfU0hJRlQtMTApLAotCQl0b3RhbHJhbV9wYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCisJCW51bV9waHlzcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApLAogCQljb2Rlc2l6ZSA+PiAxMCwKLQkJcmVzZXJ2ZWRwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCiAJCWRhdGFzaXplID4+IDEwLAogCQlpbml0c2l6ZSA+PiAxMCk7CiAKQEAgLTI2NCw3ICsyNDcsOSBAQAogCQlmcmVlX3BhZ2UoYWRkcik7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayAoIkZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6ICVkayBmcmVlZFxuIiwgKCZfX2luaXRfZW5kIC0gJl9faW5pdF9iZWdpbikgPj4gMTApOworCXByaW50aygiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWxkayBmcmVlZFxuIiwKKwkgICAgICAgKCh1bnNpZ25lZCBsb25nKSZfX2luaXRfZW5kIC0KKwkgICAgICAgICh1bnNpZ25lZCBsb25nKSZfX2luaXRfYmVnaW4pID4+IDEwKTsKIH0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRApAQCAtMjc3LDYgKzI2Miw1MCBAQAogCQlmcmVlX3BhZ2UocCk7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayAoIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7CisJcHJpbnRrKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOwogfQogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKK3ZvaWQgb25saW5lX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOworCV9fZnJlZV9wYWdlKHBhZ2UpOworCXRvdGFscmFtX3BhZ2VzKys7CisJbnVtX3BoeXNwYWdlcysrOworfQorCitpbnQgYXJjaF9hZGRfbWVtb3J5KGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJcGdfZGF0YV90ICpwZ2RhdDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwlpbnQgcmV0OworCisJcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKKworCS8qIFdlIG9ubHkgaGF2ZSBaT05FX05PUk1BTCwgc28gdGhpcyBpcyBlYXN5Li4gKi8KKwlyZXQgPSBfX2FkZF9wYWdlcyhwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJpbnRrKCIlczogRmFpbGVkLCBfX2FkZF9wYWdlcygpID09ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXJjaF9hZGRfbWVtb3J5KTsKKworaW50IHJlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlbW92ZV9tZW1vcnkpOworCisjaWZkZWYgQ09ORklHX05VTUEKK2ludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgYWRkcikKK3sKKwkvKiBOb2RlIDAgZm9yIG5vdy4uICovCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9udW1hLmMgYi9hcmNoL3NoL21tL251bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZmMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9tbS9udW1hLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIGFyY2gvc2gvbW0vbnVtYS5jIC0gTXVsdGlwbGUgbm9kZSBzdXBwb3J0IGZvciBTSCBtYWNoaW5lcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKworc3RhdGljIGJvb3RtZW1fZGF0YV90IHBsYXRfbm9kZV9iZGF0YVtNQVhfTlVNTk9ERVNdOworc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobm9kZV9kYXRhKTsKKworLyoKKyAqIE9uIFNIIG1hY2hpbmVzIHRoZSBjb252ZW50aW9uYWwgYXBwcm9hY2ggaXMgdG8gc3Rhc2ggc3lzdGVtIFJBTQorICogaW4gbm9kZSAwLCBhbmQgb3RoZXIgbWVtb3J5IGJsb2NrcyBpbiB0byBub2RlIDEgYW5kIHVwLCBvcmRlcmVkIGJ5CisgKiBsYXRlbmN5LiBFYWNoIG5vZGUncyBwZ2RhdCBpcyBub2RlLWxvY2FsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5vZGUsCisgKiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgbm9kZSBtZW0gbWFwLgorICovCit2b2lkIF9faW5pdCBzZXR1cF9tZW1vcnkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWVfcGZuID0gUEZOX1VQKF9fcGEoX2VuZCkpOworCisJLyoKKwkgKiBOb2RlIDAgc2V0cyB1cCBpdHMgcGdkYXQgYXQgdGhlIGZpcnN0IGF2YWlsYWJsZSBwZm4sCisJICogYW5kIGJ1bXBzIGl0IHVwIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSBib290bWVtIGFsbG9jYXRvci4KKwkgKi8KKwlOT0RFX0RBVEEoMCkgPSBwZm5fdG9fa2FkZHIoZnJlZV9wZm4pOworCW1lbXNldChOT0RFX0RBVEEoMCksIDAsIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlmcmVlX3BmbiArPSBQRk5fVVAoc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOworCU5PREVfREFUQSgwKS0+YmRhdGEgPSAmcGxhdF9ub2RlX2JkYXRhWzBdOworCisJLyogU2V0IHVwIG5vZGUgMCAqLworCXNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKGZyZWVfcGZuKTsKKworCS8qIEdpdmUgdGhlIHBsYXRmb3JtcyBhIGNoYW5jZSB0byBob29rIHVwIHRoZWlyIG5vZGVzICovCisJcGxhdF9tZW1fc2V0dXAoKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9ub2RlKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9wYWdlcywgYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBmcmVlX3BmbiwgZW5kX3BmbjsKKworCS8qIERvbid0IGFsbG93IGJvZ3VzIG5vZGUgYXNzaWdubWVudCAqLworCUJVR19PTihuaWQgPiBNQVhfTlVNTk9ERVMgfHwgbmlkID09IDApOworCisJLyoKKwkgKiBUaGUgZnJlZSBwZm4gc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlLCBhbmQgaXMKKwkgKiBhZHZhbmNlZCBhcyBuZWNlc3NhcnkgZm9yIHBnZGF0IGFuZCBub2RlIG1hcCBhbGxvY2F0aW9ucy4KKwkgKi8KKwlmcmVlX3BmbiA9IHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJZW5kX3BmbiA9IGVuZCA+PiBQQUdFX1NISUZUOworCisJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisKKwkvKiBOb2RlLWxvY2FsIHBnZGF0ICovCisJTk9ERV9EQVRBKG5pZCkgPSBwZm5fdG9fa2FkZHIoZnJlZV9wZm4pOworCWZyZWVfcGZuICs9IFBGTl9VUChzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisKKwlOT0RFX0RBVEEobmlkKS0+YmRhdGEgPSAmcGxhdF9ub2RlX2JkYXRhW25pZF07CisJTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuID0gc3RhcnRfcGZuOworCU5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuOworCisJLyogTm9kZS1sb2NhbCBib290bWFwICovCisJYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhlbmRfcGZuIC0gc3RhcnRfcGZuKTsKKwlib290bWFwX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX2thZGRyKGZyZWVfcGZuKTsKKwlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgZnJlZV9wZm4sIHN0YXJ0X3BmbiwKKwkJCQkgICAgZW5kX3Bmbik7CisKKwlmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucyhuaWQsIGVuZF9wZm4pOworCisJLyogUmVzZXJ2ZSB0aGUgcGdkYXQgYW5kIGJvb3RtYXAgc3BhY2Ugd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgKi8KKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgZnJlZV9wZm4gPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKworCS8qIEl0J3MgdXAgKi8KKwlub2RlX3NldF9vbmxpbmUobmlkKTsKKworCS8qIEtpY2sgc3BhcnNlbWVtICovCisJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctZG1hLmMgYi9hcmNoL3NoL21tL3BnLWRtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzNjc5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvbW0vcGctZG1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogYXJjaC9zaC9tbS9wZy1kbWEuYwotICoKLSAqIEZhc3QgY2xlYXJfcGFnZSgpL2NvcHlfcGFnZSgpIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBTSCBETUFDCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzICBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qIENoYW5uZWwgdG8gdXNlIGZvciBwYWdlIG9wcywgbXVzdCBiZSBkdWFsLWFkZHJlc3MgbW9kZSBjYXBhYmxlLiAqLwotc3RhdGljIGludCBkbWFfY2hhbm5lbCA9IENPTkZJR19ETUFfUEFHRV9PUFNfQ0hBTk5FTDsKLQotc3RhdGljIHZvaWQgY29weV9wYWdlX2RtYSh2b2lkICp0bywgdm9pZCAqZnJvbSkKLXsKLQkvKiAKLQkgKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBnZXQgdHJpZ2dlcmVkIHVudGlsIGZ1cnRoZXIgYWxvbmcgaW4gdGhlCi0JICogYm9vdCBwcm9jZXNzLCBhdCB3aGljaCBwb2ludCB0aGUgRE1BQyBpcyBhbHJlYWR5IGluaXRpYWxpemVkLgotCSAqIEZpeCB0aGlzIGluIHRoZSBzYW1lIGZhc2hpb24gYXMgY2xlYXJfcGFnZV9kbWEoKSBpbiB0aGUgZXZlbnQKLQkgKiB0aGF0IHRoaXMgY3Jhc2hlcyBkdWUgdG8gdGhlIERNQUMgbm90IGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCi0JZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWZyb20sIFBBR0VfU0laRSk7Ci0JZG1hX3dyaXRlX3BhZ2UoZG1hX2NoYW5uZWwsICh1bnNpZ25lZCBsb25nKWZyb20sICh1bnNpZ25lZCBsb25nKXRvKTsKLQlkbWFfd2FpdF9mb3JfY29tcGxldGlvbihkbWFfY2hhbm5lbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFyX3BhZ2VfZG1hKHZvaWQgKnRvKQotewotCS8qCi0JICogV2UgZ2V0IGludm9rZWQgcXVpdGUgZWFybHkgb24sIGlmIHRoZSBETUFDIGhhc24ndCBiZWVuIGluaXRpYWxpemVkCi0JICogeWV0LCBmYWxsIGJhY2sgb24gdGhlIHNsb3cgbWFudWFsIGltcGxlbWVudGF0aW9uLgotCSAqLwotCWlmIChkbWFfaW5mb1tkbWFfY2hhbm5lbF0uY2hhbiAhPSBkbWFfY2hhbm5lbCkgewotCQljbGVhcl9wYWdlX3Nsb3codG8pOwotCQlyZXR1cm47Ci0JfQotCi0JZG1hX3dyaXRlX3BhZ2UoZG1hX2NoYW5uZWwsICh1bnNpZ25lZCBsb25nKWVtcHR5X3plcm9fcGFnZSwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpdG8pOwotCi0JLyoKLQkgKiBGSVhNRTogU29tZXRoaW5nIGlzIGEgYml0IHJhY3kgaGVyZSwgaWYgd2UgcG9sbCB0aGUgY291bnRlciByaWdodAotCSAqIGF3YXksIHdlIHNlZW0gdG8gbG9jay4gZmx1c2hpbmcgdGhlIHBhZ2UgZnJvbSB0aGUgZGNhY2hlIGRvZXNuJ3QKLQkgKiBzZWVtIHRvIG1ha2UgYSBkaWZmZXJlbmNlIG9uZSB3YXkgb3IgdGhlIG90aGVyLCB0aG91Z2ggZWl0aGVyIGEgZnVsbAotCSAqIGljYWNoZSBvciBkY2FjaGUgZmx1c2ggZG9lcy4KLQkgKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGlzIGlzIGltcG9ydGFudCBhcyB3ZWxsLCBhbmQgbXVzdCBoYXBwZW4gcHJpb3IgdG8KLQkgKiB0aGUgY29tcGxldGlvbiBsb29wIGJ1dCBhZnRlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC4KLQkgKgotCSAqIE9kZGx5IGVub3VnaCwgdGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBpc3N1ZSBmb3IgY29weV9wYWdlKCkuLgotCSAqLwotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl0bywgUEFHRV9TSVpFKTsKLQotCWRtYV93YWl0X2Zvcl9jb21wbGV0aW9uKGRtYV9jaGFubmVsKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcGdfZG1hX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCQotCXJldCA9IHJlcXVlc3RfZG1hKGRtYV9jaGFubmVsLCAicGFnZSBvcHMiKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQljb3B5X3BhZ2UgPSBjb3B5X3BhZ2VfZG1hOwotCWNsZWFyX3BhZ2UgPSBjbGVhcl9wYWdlX2RtYTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwZ19kbWFfZXhpdCh2b2lkKQotewotCWZyZWVfZG1hKGRtYV9jaGFubmVsKTsKLX0KLQotbW9kdWxlX2luaXQocGdfZG1hX2luaXQpOwotbW9kdWxlX2V4aXQocGdfZG1hX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJPcHRpbWl6ZWQgcGFnZSBjb3B5L2NsZWFyIHJvdXRpbmVzIHVzaW5nIGEgZHVhbC1hZGRyZXNzIG1vZGUgY2FwYWJsZSBETUFDIGNoYW5uZWwiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9NYWtlZmlsZSBiL2FyY2gvc2gvdG9vbHMvTWFrZWZpbGUKaW5kZXggM2MzNzBhMS4uNTY3NTE2YiAxMDA2NDQKLS0tIGEvYXJjaC9zaC90b29scy9NYWtlZmlsZQorKysgYi9hcmNoL3NoL3Rvb2xzL01ha2VmaWxlCkBAIC0xMiw0ICsxMiw1IEBACiAKIGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oOiAkKHNyYykvZ2VuLW1hY2gtdHlwZXMgJChzcmMpL21hY2gtdHlwZXMKIAlAZWNobyAnICBHZW5lcmF0aW5nICRAJworCSQoUSlpZiBbICEgLWQgaW5jbHVkZS9hc20tc2ggXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlL2FzbS1zaDsgZmkKIAkkKFEpJChBV0spIC1mICReID4gJEAgfHwgeyBybSAtZiAkQDsgL2Jpbi9mYWxzZTsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCmluZGV4IGZiNDBmMTguLjRiNWU5MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTE4LDcgKzE4LDYgQEAKIEhQNlhYCQkJU0hfSFA2WFgKIEhENjQ0NjEJCQlIRDY0NDYxCiBIRDY0NDY1CQkJSEQ2NDQ2NQotU0FUVVJOCQkJU0hfU0FUVVJOCiBEUkVBTUNBU1QJCVNIX0RSRUFNQ0FTVAogTVBDMTIxMQkJCVNIX01QQzEyMTEKIFNOQVBHRUFSCQlTSF9TRUNVUkVFREdFNTQxMApAQCAtMzQsMyArMzMsNCBAQAogVElUQU4JCQlTSF9USVRBTgogU0hNSU4JCQlTSF9TSE1JTgogNzcxMFZPSVBHVwkJU0hfNzcxMFZPSVBHVworTEJPWFJFMgkJCVNIX0xCT1hfUkUyCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zaDY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCA0ZTk1ZTE4Li5kZjA2YzY0IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTEyOSwxNyArMTI5LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE2NiwxMCArMTU4LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCmluZGV4IDRiMjY3NjMuLmJkNTUwMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCisrKyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCkBAIC0yMTMsMyArMjEzLDQgQEAKIAogCXJldHVybiAoX193c3VtKXJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0woY3N1bV90Y3B1ZHBfbm9mb2xkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCA4NTY3Y2M5Li43M2RmNzExIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC0yMTcsNiArMjE3LDkgQEAKIAogZW5kaWYKIAorY29uZmlnIE5PX0RNQQorCWRlZl9ib29sICFQQ0kKKwogY29uZmlnIFNVTl9PUEVOUFJPTUZTCiAJdHJpc3RhdGUgIk9wZW5wcm9tIHRyZWUgYXBwZWFycyBpbiAvcHJvYy9vcGVucHJvbSIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYwppbmRleCBkYzlmZmVhLi4zYmMzYmZmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogCiAJcHJpbnRrKCIlcyglZCk6ICVzIFsjJWRdXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHN0ciwgKytkaWVfY291bnRlcik7CiAJc2hvd19yZWdzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCiAJX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsgX19TQVZFOwogCV9fU0FWRTsgX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vc3JtbXUuYyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwppbmRleCBlNWVhYTgwLi5jYTI2MjMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3NybW11LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCkBAIC0xNjAsOSArMTYwLDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNybW11X3B0ZV9wcmVzZW50KHB0ZV90IHB0ZSkKIHsgcmV0dXJuICgocHRlX3ZhbChwdGUpICYgU1JNTVVfRVRfTUFTSykgPT0gU1JNTVVfRVRfUFRFKTsgfQogCi1zdGF0aWMgaW5saW5lIGludCBzcm1tdV9wdGVfcmVhZChwdGVfdCBwdGUpCi17IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIFNSTU1VX05PUkVBRCk7IH0KLQogc3RhdGljIGlubGluZSB2b2lkIHNybW11X3B0ZV9jbGVhcihwdGVfdCAqcHRlcCkKIHsgc3JtbXVfc2V0X3B0ZShwdGVwLCBfX3B0ZSgwKSk7IH0KIApAQCAtMjE4MSw3ICsyMTc4LDYgQEAKIAogCUJURklYVVBTRVRfQ0FMTChwdGVfcHJlc2VudCwgc3JtbXVfcHRlX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwdGVfY2xlYXIsIHNybW11X3B0ZV9jbGVhciwgQlRGSVhVUENBTExfU1dBUE8wRzApOwotCUJURklYVVBTRVRfQ0FMTChwdGVfcmVhZCwgc3JtbXVfcHRlX3JlYWQsIEJURklYVVBDQUxMX05PUk0pOwogCiAJQlRGSVhVUFNFVF9DQUxMKHBtZF9iYWQsIHNybW11X3BtZF9iYWQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwbWRfcHJlc2VudCwgc3JtbXVfcG1kX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jIGIvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCmluZGV4IDQzNjAyMWMuLmJkZDgzNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3VuNGMuYworKysgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKQEAgLTE3NDgsMTEgKzE3NDgsNiBAQAogfQogc3RhdGljIHZvaWQgc3VuNGNfcHRlX2NsZWFyKHB0ZV90ICpwdGVwKQl7ICpwdGVwID0gX19wdGUoMCk7IH0KIAotc3RhdGljIGludCBzdW40Y19wdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBfU1VONENfUEFHRV9SRUFEKTsKLX0KLQogc3RhdGljIGludCBzdW40Y19wbWRfYmFkKHBtZF90IHBtZCkKIHsKIAlyZXR1cm4gKCgocG1kX3ZhbChwbWQpICYgflBBR0VfTUFTSykgIT0gUEdEX1RBQkxFKSB8fApAQCAtMjIxMiw3ICsyMjA3LDYgQEAKIAogCUJURklYVVBTRVRfQ0FMTChwdGVfcHJlc2VudCwgc3VuNGNfcHRlX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwdGVfY2xlYXIsIHN1bjRjX3B0ZV9jbGVhciwgQlRGSVhVUENBTExfU1RHME8wKTsKLQlCVEZJWFVQU0VUX0NBTEwocHRlX3JlYWQsIHN1bjRjX3B0ZV9yZWFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAogCUJURklYVVBTRVRfQ0FMTChwbWRfYmFkLCBzdW40Y19wbWRfYmFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwocG1kX3ByZXNlbnQsIHN1bjRjX3BtZF9wcmVzZW50LCBCVEZJWFVQQ0FMTF9OT1JNKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKaW5kZXggNjU2NmQxMy4uYjg0YjZhZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKQEAgLTEwOCw2ICsxMDgsMTUgQEAKIAogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKK2NvbmZpZyBIT1RQTFVHX0NQVQorCWJvb2wgIlN1cHBvcnQgZm9yIGhvdC1wbHVnZ2FibGUgQ1BVcyIKKwlkZXBlbmRzIG9uIFNNUAorCXNlbGVjdCBIT1RQTFVHCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBleHBlcmltZW50IHdpdGggdHVybmluZyBDUFVzIG9mZiBhbmQgb24uICBDUFVzCisJICBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSMuCisJICBTYXkgTiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIENQVSBob3RwbHVnLgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogY29uZmlnIFNZU1ZJUENfQ09NUEFUCkBAIC0zMDUsNiArMzE0LDEyIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgU1VOX0xET01TCisJYm9vbCAiU3VuIExvZ2ljYWwgRG9tYWlucyBzdXBwb3J0IgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaXMgeW91IHdhbnQgdG8gc3VwcG9ydCB2aXJ0dWFsIGRldmljZXMgdmlhCisJICBMb2dpY2FsIERvbWFpbnMuCisKIGNvbmZpZyBQQ0kKIAlib29sICJQQ0kgc3VwcG9ydCIKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0kKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGY5NjRiZjIuLmI2Njg3NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNyBAQAogb2JqLSQoQ09ORklHX1BDSSkJICs9IGVidXMubyBpc2EubyBwY2lfY29tbW9uLm8gcGNpX2lvbW11Lm8gXAogCQkJICAgIHBjaV9wc3ljaG8ubyBwY2lfc2FicmUubyBwY2lfc2NoaXpvLm8gXAogCQkJICAgIHBjaV9zdW40di5vIHBjaV9zdW40dl9hc20ubyBwY2lfZmlyZS5vCi1vYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vIGh2dHJhbXAubwogb2JqLSQoQ09ORklHX1NQQVJDMzJfQ09NUEFUKSArPSBzeXMzMi5vIHN5c19zcGFyYzMyLm8gc2lnbmFsMzIubwogb2JqLSQoQ09ORklHX0JJTkZNVF9FTEYzMikgKz0gYmluZm10X2VsZjMyLm8KIG9iai0kKENPTkZJR19CSU5GTVRfQU9VVDMyKSArPSBiaW5mbXRfYW91dDMyLm8KQEAgLTI2LDYgKzI2LDcgQEAKIG9iai0kKENPTkZJR19VUzNfRlJFUSkgKz0gdXMzX2NwdWZyZXEubwogb2JqLSQoQ09ORklHX1VTMkVfRlJFUSkgKz0gdXMyZV9jcHVmcmVxLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKSArPSBrcHJvYmVzLm8KK29iai0kKENPTkZJR19TVU5fTERPTVMpICs9IGxkYy5vIHZpby5vIHZpb2hzLm8gZHMubwogb2JqLSQoQ09ORklHX0FVRElUKSArPSBhdWRpdC5vCiBvYmotJChDT05GSUdfQVVESVQpJChDT05GSUdfU1BBUkMzMl9DT01QQVQpICs9IGNvbXBhdF9hdWRpdC5vCiBvYmoteSArPSAkKG9iai15eSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAxNTMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9kcy5jCkBAIC0wLDAgKzEsMTE2OCBAQAorLyogZHMuYzogRG9tYWluIFNlcnZpY2VzIGRyaXZlciBmb3IgTG9naWNhbCBEb21haW5zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL2xkYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vcG93ZXIuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vaGVhZC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJkcyIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4wIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bCAxMSwgMjAwNyIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gTERPTSBkb21haW4gc2VydmljZXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCitzdHJ1Y3QgZHNfbXNnX3RhZyB7CisJX191MzIJCQl0eXBlOworI2RlZmluZSBEU19JTklUX1JFUQkJMHgwMAorI2RlZmluZSBEU19JTklUX0FDSwkJMHgwMQorI2RlZmluZSBEU19JTklUX05BQ0sJCTB4MDIKKyNkZWZpbmUgRFNfUkVHX1JFUQkJMHgwMworI2RlZmluZSBEU19SRUdfQUNLCQkweDA0CisjZGVmaW5lIERTX1JFR19OQUNLCQkweDA1CisjZGVmaW5lIERTX1VOUkVHX1JFUQkJMHgwNgorI2RlZmluZSBEU19VTlJFR19BQ0sJCTB4MDcKKyNkZWZpbmUgRFNfVU5SRUdfTkFDSwkJMHgwOAorI2RlZmluZSBEU19EQVRBCQkJMHgwOQorI2RlZmluZSBEU19OQUNLCQkJMHgwYQorCisJX191MzIJCQlsZW47Cit9OworCisvKiBSZXN1bHQgY29kZXMgKi8KKyNkZWZpbmUgRFNfT0sJCQkweDAwCisjZGVmaW5lIERTX1JFR19WRVJfTkFDSwkJMHgwMQorI2RlZmluZSBEU19SRUdfRFVQCQkweDAyCisjZGVmaW5lIERTX0lOVl9IREwJCTB4MDMKKyNkZWZpbmUgRFNfVFlQRV9VTktOT1dOCQkweDA0CisKK3N0cnVjdCBkc192ZXJzaW9uIHsKKwlfX3UxNgkJCW1ham9yOworCV9fdTE2CQkJbWlub3I7Cit9OworCitzdHJ1Y3QgZHNfdmVyX3JlcSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCXN0cnVjdCBkc192ZXJzaW9uCXZlcjsKK307CisKK3N0cnVjdCBkc192ZXJfYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191MTYJCQltaW5vcjsKK307CisKK3N0cnVjdCBkc192ZXJfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTE2CQkJbWFqb3I7Cit9OworCitzdHJ1Y3QgZHNfcmVnX3JlcSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTE2CQkJbWFqb3I7CisJX191MTYJCQltaW5vcjsKKwljaGFyCQkJc3ZjX2lkWzBdOworfTsKKworc3RydWN0IGRzX3JlZ19hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKKwlfX3UxNgkJCW1pbm9yOworfTsKKworc3RydWN0IGRzX3JlZ19uYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7CisJX191MTYJCQltYWpvcjsKK307CisKK3N0cnVjdCBkc191bnJlZ19yZXEgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc191bnJlZ19hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc191bnJlZ19uYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7Cit9OworCitzdHJ1Y3QgZHNfZGF0YSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworfTsKKworc3RydWN0IGRzX2RhdGFfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTY0CQkJcmVzdWx0OworfTsKKworc3RydWN0IGRzX2NhcF9zdGF0ZSB7CisJX191NjQJCQloYW5kbGU7CisKKwl2b2lkCQkJKCpkYXRhKShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworCWNvbnN0IGNoYXIJCSpzZXJ2aWNlX2lkOworCisJdTgJCQlzdGF0ZTsKKyNkZWZpbmUgQ0FQX1NUQVRFX1VOS05PV04JMHgwMAorI2RlZmluZSBDQVBfU1RBVEVfUkVHX1NFTlQJMHgwMQorI2RlZmluZSBDQVBfU1RBVEVfUkVHSVNURVJFRAkweDAyCit9OworCitzdGF0aWMgdm9pZCBtZF91cGRhdGVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCSAgIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBkb21haW5fc2h1dGRvd25fZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCSBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCQkgdm9pZCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGRvbWFpbl9wYW5pY19kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICAgICBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCSAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbik7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgdm9pZCBkcl9jcHVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pOworI2VuZGlmCitzdGF0aWMgdm9pZCBkc19wcmlfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pOworc3RhdGljIHZvaWQgZHNfdmFyX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworc3RydWN0IGRzX2NhcF9zdGF0ZSBkc19zdGF0ZXNbXSA9IHsKKwl7CisJCS5zZXJ2aWNlX2lkCT0gIm1kLXVwZGF0ZSIsCisJCS5kYXRhCQk9IG1kX3VwZGF0ZV9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJkb21haW4tc2h1dGRvd24iLAorCQkuZGF0YQkJPSBkb21haW5fc2h1dGRvd25fZGF0YSwKKwl9LAorCXsKKwkJLnNlcnZpY2VfaWQJPSAiZG9tYWluLXBhbmljIiwKKwkJLmRhdGEJCT0gZG9tYWluX3BhbmljX2RhdGEsCisJfSwKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwl7CisJCS5zZXJ2aWNlX2lkCT0gImRyLWNwdSIsCisJCS5kYXRhCQk9IGRyX2NwdV9kYXRhLAorCX0sCisjZW5kaWYKKwl7CisJCS5zZXJ2aWNlX2lkCT0gInByaSIsCisJCS5kYXRhCQk9IGRzX3ByaV9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJ2YXItY29uZmlnIiwKKwkJLmRhdGEJCT0gZHNfdmFyX2RhdGEsCisJfSwKKwl7CisJCS5zZXJ2aWNlX2lkCT0gInZhci1jb25maWctYmFja3VwIiwKKwkJLmRhdGEJCT0gZHNfdmFyX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHNfbG9jayk7CisKK3N0cnVjdCBkc19pbmZvIHsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwJKmxwOworCXU4CQkJaHNfc3RhdGU7CisjZGVmaW5lIERTX0hTX1NUQVJUCQkweDAxCisjZGVmaW5lIERTX0hTX0RPTkUJCTB4MDIKKworCXZvaWQJCQkqcmN2X2J1ZjsKKwlpbnQJCQlyY3ZfYnVmX2xlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHNfaW5mbyAqZHNfaW5mbzsKKworc3RhdGljIHN0cnVjdCBkc19jYXBfc3RhdGUgKmZpbmRfY2FwKHU2NCBoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGluZGV4ID0gaGFuZGxlID4+IDMyOworCisJaWYgKGluZGV4ID49IEFSUkFZX1NJWkUoZHNfc3RhdGVzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZkc19zdGF0ZXNbaW5kZXhdOworfQorCitzdGF0aWMgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZmluZF9jYXBfYnlfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc19zdGF0ZXMpOyBpKyspIHsKKwkJaWYgKHN0cmNtcChkc19zdGF0ZXNbaV0uc2VydmljZV9pZCwgbmFtZSkpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gJmRzX3N0YXRlc1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kc19zZW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGVyciwgbGltaXQgPSAxMDAwOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJZXJyID0gbGRjX3dyaXRlKGxwLCBkYXRhLCBsZW4pOworCQlpZiAoIWVyciB8fCAoZXJyICE9IC1FQUdBSU4pKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRzX3NlbmQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCWVyciA9IF9fZHNfc2VuZChscCwgZGF0YSwgbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSB7CisJX191NjQJCQkJcmVxX251bTsKK307CisKK3N0cnVjdCBkc19tZF91cGRhdGVfcmVzIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXJlc3VsdDsKK307CisKK3N0YXRpYyB2b2lkIG1kX3VwZGF0ZV9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpkcCwKKwkJCSAgIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZHNfZGF0YSAqZHBrdCA9IGJ1ZjsKKwlzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19tZF91cGRhdGVfcmVzCXJlczsKKwl9IHBrdDsKKworCXJwID0gKHN0cnVjdCBkc19tZF91cGRhdGVfcmVxICopIChkcGt0ICsgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiTWFjaGluZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4iKTsKKworCW1kZXNjX3VwZGF0ZSgpOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJcGt0LmRhdGEudGFnLmxlbiA9IHNpemVvZihwa3QpIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBkcC0+aGFuZGxlOworCXBrdC5yZXMucmVxX251bSA9IHJwLT5yZXFfbnVtOworCXBrdC5yZXMucmVzdWx0ID0gRFNfT0s7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7Cit9CisKK3N0cnVjdCBkc19zaHV0ZG93bl9yZXEgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJbXNfZGVsYXk7Cit9OworCitzdHJ1Y3QgZHNfc2h1dGRvd25fcmVzIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXJlc3VsdDsKKwljaGFyCQkJCXJlYXNvblsxXTsKK307CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9zaHV0ZG93bl9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJIHN0cnVjdCBkc19jYXBfc3RhdGUgKmRwLAorCQkJCSB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3NodXRkb3duX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19zaHV0ZG93bl9yZXMJcmVzOworCX0gcGt0OworCisJcnAgPSAoc3RydWN0IGRzX3NodXRkb3duX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJTaHV0ZG93biByZXF1ZXN0IGZyb20gIgorCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS50YWcubGVuID0gc2l6ZW9mKHBrdCkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXBrdC5kYXRhLmhhbmRsZSA9IGRwLT5oYW5kbGU7CisJcGt0LnJlcy5yZXFfbnVtID0gcnAtPnJlcV9udW07CisJcGt0LnJlcy5yZXN1bHQgPSBEU19PSzsKKwlwa3QucmVzLnJlYXNvblswXSA9IDA7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7CisKKwl3YWtlX3VwX3Bvd2VyZCgpOworfQorCitzdHJ1Y3QgZHNfcGFuaWNfcmVxIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworfTsKKworc3RydWN0IGRzX3BhbmljX3JlcyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisJY2hhcgkJCQlyZWFzb25bMV07Cit9OworCitzdGF0aWMgdm9pZCBkb21haW5fcGFuaWNfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQkgICAgICB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3BhbmljX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19wYW5pY19yZXMJcmVzOworCX0gcGt0OworCisJcnAgPSAoc3RydWN0IGRzX3BhbmljX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJQYW5pYyByZXF1ZXN0IGZyb20gIgorCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS50YWcubGVuID0gc2l6ZW9mKHBrdCkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXBrdC5kYXRhLmhhbmRsZSA9IGRwLT5oYW5kbGU7CisJcGt0LnJlcy5yZXFfbnVtID0gcnAtPnJlcV9udW07CisJcGt0LnJlcy5yZXN1bHQgPSBEU19PSzsKKwlwa3QucmVzLnJlYXNvblswXSA9IDA7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7CisKKwlwYW5pYygiUEFOSUMgcmVxdWVzdGVkIGJ5IExET00gbWFuYWdlci4iKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RydWN0IGRyX2NwdV90YWcgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJdHlwZTsKKyNkZWZpbmUgRFJfQ1BVX0NPTkZJR1VSRQkJMHg0MworI2RlZmluZSBEUl9DUFVfVU5DT05GSUdVUkUJCTB4NTUKKyNkZWZpbmUgRFJfQ1BVX0ZPUkNFX1VOQ09ORklHVVJFCTB4NDYKKyNkZWZpbmUgRFJfQ1BVX1NUQVRVUwkJCTB4NTMKKworLyogUmVzcG9uc2VzICovCisjZGVmaW5lIERSX0NQVV9PSwkJCTB4NmYKKyNkZWZpbmUgRFJfQ1BVX0VSUk9SCQkJMHg2NQorCisJX191MzIJCQkJbnVtX3JlY29yZHM7Cit9OworCitzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgeworCV9fdTMyCQkJCWNwdTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisjZGVmaW5lIERSX0NQVV9SRVNfT0sJCQkweDAwCisjZGVmaW5lIERSX0NQVV9SRVNfRkFJTFVSRQkJMHgwMQorI2RlZmluZSBEUl9DUFVfUkVTX0JMT0NLRUQJCTB4MDIKKyNkZWZpbmUgRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkcJMHgwMworI2RlZmluZSBEUl9DUFVfUkVTX05PVF9JTl9NRAkJMHgwNAorCisJX191MzIJCQkJc3RhdDsKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfTk9UX1BSRVNFTlQJCTB4MDAKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfVU5DT05GSUdVUkVECTB4MDEKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRAkJMHgwMgorCisJX191MzIJCQkJc3RyX29mZjsKK307CisKK3N0YXRpYyB2b2lkIF9fZHJfY3B1X3NlbmRfZXJyb3Ioc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsIHN0cnVjdCBkc19kYXRhICpkYXRhKQoreworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKGRhdGEgKyAxKTsKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBkc19pbmZvOworCXN0cnVjdCB7CisJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQlzdHJ1Y3QgZHJfY3B1X3RhZwl0YWc7CisJfSBwa3Q7CisJaW50IG1zZ19sZW47CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCXBrdC50YWcucmVxX251bSA9IHRhZy0+cmVxX251bTsKKwlwa3QudGFnLnR5cGUgPSBEUl9DUFVfRVJST1I7CisJcGt0LnRhZy5udW1fcmVjb3JkcyA9IDA7CisKKwltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQkgICBzaXplb2Yoc3RydWN0IGRyX2NwdV90YWcpKTsKKworCXBrdC5kYXRhLnRhZy5sZW4gPSBtc2dfbGVuIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKworCV9fZHNfc2VuZChkcC0+bHAsICZwa3QsIG1zZ19sZW4pOworfQorCitzdGF0aWMgdm9pZCBkcl9jcHVfc2VuZF9lcnJvcihzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwgc3RydWN0IGRzX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJX19kcl9jcHVfc2VuZF9lcnJvcihjcCwgZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIENQVV9TRU5USU5FTAkweGZmZmZmZmZmCisKK3N0YXRpYyB2b2lkIHB1cmdlX2R1cHModTMyICpsaXN0LCB1MzIgbnVtX2VudHMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHM7IGkrKykgeworCQl1MzIgY3B1ID0gbGlzdFtpXTsKKwkJdW5zaWduZWQgaW50IGo7CisKKwkJaWYgKGNwdSA9PSBDUFVfU0VOVElORUwpCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSBpICsgMTsgaiA8IG51bV9lbnRzOyBqKyspIHsKKwkJCWlmIChsaXN0W2pdID09IGNwdSkKKwkJCQlsaXN0W2pdID0gQ1BVX1NFTlRJTkVMOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGRyX2NwdV9zaXplX3Jlc3BvbnNlKGludCBuY3B1cykKK3sKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQlzaXplb2Yoc3RydWN0IGRyX2NwdV90YWcpICsKKwkJKHNpemVvZihzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkpICogbmNwdXMpKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X2luaXRfcmVzcG9uc2Uoc3RydWN0IGRzX2RhdGEgKnJlc3AsIHU2NCByZXFfbnVtLAorCQkJCSB1NjQgaGFuZGxlLCBpbnQgcmVzcF9sZW4sIGludCBuY3B1cywKKwkJCQkgY3B1bWFza190ICptYXNrLCB1MzIgZGVmYXVsdF9zdGF0KQoreworCXN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqZW50OworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWc7CisJaW50IGksIGNwdTsKKworCXRhZyA9IChzdHJ1Y3QgZHJfY3B1X3RhZyAqKSAocmVzcCArIDEpOworCWVudCA9IChzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgKikgKHRhZyArIDEpOworCisJcmVzcC0+dGFnLnR5cGUgPSBEU19EQVRBOworCXJlc3AtPnRhZy5sZW4gPSByZXNwX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZyk7CisJcmVzcC0+aGFuZGxlID0gaGFuZGxlOworCXRhZy0+cmVxX251bSA9IHJlcV9udW07CisJdGFnLT50eXBlID0gRFJfQ1BVX09LOworCXRhZy0+bnVtX3JlY29yZHMgPSBuY3B1czsKKworCWkgPSAwOworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJZW50W2ldLmNwdSA9IGNwdTsKKwkJZW50W2ldLnJlc3VsdCA9IERSX0NQVV9SRVNfT0s7CisJCWVudFtpXS5zdGF0ID0gZGVmYXVsdF9zdGF0OworCQlpKys7CisJfQorCUJVR19PTihpICE9IG5jcHVzKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X21hcmsoc3RydWN0IGRzX2RhdGEgKnJlc3AsIGludCBjcHUsIGludCBuY3B1cywKKwkJCXUzMiByZXMsIHUzMiBzdGF0KQoreworCXN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqZW50OworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWc7CisJaW50IGk7CisKKwl0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKHJlc3AgKyAxKTsKKwllbnQgPSAoc3RydWN0IGRyX2NwdV9yZXNwX2VudHJ5ICopICh0YWcgKyAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBuY3B1czsgaSsrKSB7CisJCWlmIChlbnRbaV0uY3B1ICE9IGNwdSkKKwkJCWNvbnRpbnVlOworCQllbnRbaV0ucmVzdWx0ID0gcmVzOworCQllbnRbaV0uc3RhdCA9IHN0YXQ7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBkcl9jcHVfY29uZmlndXJlKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCB1NjQgcmVxX251bSwKKwkJCSAgICBjcHVtYXNrX3QgKm1hc2spCit7CisJc3RydWN0IGRzX2RhdGEgKnJlc3A7CisJaW50IHJlc3BfbGVuLCBuY3B1cywgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluY3B1cyA9IGNwdXNfd2VpZ2h0KCptYXNrKTsKKwlyZXNwX2xlbiA9IGRyX2NwdV9zaXplX3Jlc3BvbnNlKG5jcHVzKTsKKwlyZXNwID0ga3phbGxvYyhyZXNwX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRyX2NwdV9pbml0X3Jlc3BvbnNlKHJlc3AsIHJlcV9udW0sIGNwLT5oYW5kbGUsCisJCQkgICAgIHJlc3BfbGVuLCBuY3B1cywgbWFzaywKKwkJCSAgICAgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRCk7CisKKwltZGVzY19maWxsX2luX2NwdV9kYXRhKCptYXNrKTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJaW50IGVycjsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RhcnRpbmcgY3B1ICVkLi4uXG4iLCBjcHUpOworCQllcnIgPSBjcHVfdXAoY3B1KTsKKwkJaWYgKGVycikgeworCQkJX191MzIgcmVzID0gRFJfQ1BVX1JFU19GQUlMVVJFOworCQkJX191MzIgc3RhdCA9IERSX0NQVV9TVEFUX1VOQ09ORklHVVJFRDsKKworCQkJaWYgKCFjcHVfcHJlc2VudChjcHUpKSB7CisJCQkJLyogQ1BVIG5vdCBwcmVzZW50IGluIE1EICovCisJCQkJcmVzID0gRFJfQ1BVX1JFU19OT1RfSU5fTUQ7CisJCQkJc3RhdCA9IERSX0NQVV9TVEFUX05PVF9QUkVTRU5UOworCQkJfSBlbHNlIGlmIChlcnIgPT0gLUVOT0RFVikgeworCQkJCS8qIENQVSBkaWQgbm90IGNhbGwgaW4gc3VjY2Vzc2Z1bGx5ICovCisJCQkJcmVzID0gRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkc7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJDUFUgc3RhcnR1cCBmYWlsZWQgZXJyPSVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlkcl9jcHVfbWFyayhyZXNwLCBjcHUsIG5jcHVzLCByZXMsIHN0YXQpOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlfX2RzX3NlbmQoZHNfaW5mby0+bHAsIHJlc3AsIHJlc3BfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlrZnJlZShyZXNwKTsKKworCS8qIFJlZGlzdHJpYnV0ZSBJUlFzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBuZXcgY3B1cy4gICovCisJZml4dXBfaXJxcygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJfY3B1X3VuY29uZmlndXJlKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCB1NjQgcmVxX251bSwKKwkJCSAgICAgIGNwdW1hc2tfdCAqbWFzaykKK3sKKwlzdHJ1Y3QgZHNfZGF0YSAqcmVzcDsKKwlpbnQgcmVzcF9sZW4sIG5jcHVzLCBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5jcHVzID0gY3B1c193ZWlnaHQoKm1hc2spOworCXJlc3BfbGVuID0gZHJfY3B1X3NpemVfcmVzcG9uc2UobmNwdXMpOworCXJlc3AgPSBremFsbG9jKHJlc3BfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc3ApCisJCXJldHVybiAtRU5PTUVNOworCisJZHJfY3B1X2luaXRfcmVzcG9uc2UocmVzcCwgcmVxX251bSwgY3AtPmhhbmRsZSwKKwkJCSAgICAgcmVzcF9sZW4sIG5jcHVzLCBtYXNrLAorCQkJICAgICBEUl9DUFVfU1RBVF9VTkNPTkZJR1VSRUQpOworCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCAqbWFzaykgeworCQlpbnQgZXJyOworCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDUFVbJWRdOiBTaHV0dGluZyBkb3duIGNwdSAlZC4uLlxuIiwKKwkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1KTsKKwkJZXJyID0gY3B1X2Rvd24oY3B1KTsKKwkJaWYgKGVycikKKwkJCWRyX2NwdV9tYXJrKHJlc3AsIGNwdSwgbmNwdXMsCisJCQkJICAgIERSX0NQVV9SRVNfRkFJTFVSRSwKKwkJCQkgICAgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlfX2RzX3NlbmQoZHNfaW5mby0+bHAsIHJlc3AsIHJlc3BfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlrZnJlZShyZXNwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkcl9jcHVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRhdGEgPSBidWY7CisJc3RydWN0IGRyX2NwdV90YWcgKnRhZyA9IChzdHJ1Y3QgZHJfY3B1X3RhZyAqKSAoZGF0YSArIDEpOworCXUzMiAqY3B1X2xpc3QgPSAodTMyICopICh0YWcgKyAxKTsKKwl1NjQgcmVxX251bSA9IHRhZy0+cmVxX251bTsKKwljcHVtYXNrX3QgbWFzazsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJc3dpdGNoICh0YWctPnR5cGUpIHsKKwljYXNlIERSX0NQVV9DT05GSUdVUkU6CisJY2FzZSBEUl9DUFVfVU5DT05GSUdVUkU6CisJY2FzZSBEUl9DUFVfRk9SQ0VfVU5DT05GSUdVUkU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworCQlyZXR1cm47CisJfQorCisJcHVyZ2VfZHVwcyhjcHVfbGlzdCwgdGFnLT5udW1fcmVjb3Jkcyk7CisKKwljcHVzX2NsZWFyKG1hc2spOworCWZvciAoaSA9IDA7IGkgPCB0YWctPm51bV9yZWNvcmRzOyBpKyspIHsKKwkJaWYgKGNwdV9saXN0W2ldID09IENQVV9TRU5USU5FTCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjcHVfbGlzdFtpXSA8IE5SX0NQVVMpCisJCQljcHVfc2V0KGNwdV9saXN0W2ldLCBtYXNrKTsKKwl9CisKKwlpZiAodGFnLT50eXBlID09IERSX0NQVV9DT05GSUdVUkUpCisJCWVyciA9IGRyX2NwdV9jb25maWd1cmUoY3AsIHJlcV9udW0sICZtYXNrKTsKKwllbHNlCisJCWVyciA9IGRyX2NwdV91bmNvbmZpZ3VyZShjcCwgcmVxX251bSwgJm1hc2spOworCisJaWYgKGVycikKKwkJZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworfQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitzdHJ1Y3QgZHNfcHJpX21zZyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3U2NAkJCQl0eXBlOworI2RlZmluZSBEU19QUklfUkVRVUVTVAkJCTB4MDAKKyNkZWZpbmUgRFNfUFJJX0RBVEEJCQkweDAxCisjZGVmaW5lIERTX1BSSV9VUERBVEUJCQkweDAyCit9OworCitzdGF0aWMgdm9pZCBkc19wcmlfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3ByaV9tc2cgKnJwOworCisJcnAgPSAoc3RydWN0IGRzX3ByaV9tc2cgKikgKGRwa3QgKyAxKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJQUkkgUkVRIFslbHg6JWx4XSwgbGVuPSVkXG4iLAorCSAgICAgICBycC0+cmVxX251bSwgcnAtPnR5cGUsIGxlbik7Cit9CisKK3N0cnVjdCBkc192YXJfaGRyIHsKKwlfX3UzMgkJCQl0eXBlOworI2RlZmluZSBEU19WQVJfU0VUX1JFUQkJCTB4MDAKKyNkZWZpbmUgRFNfVkFSX0RFTEVURV9SRVEJCTB4MDEKKyNkZWZpbmUgRFNfVkFSX1NFVF9SRVNQCQkJMHgwMgorI2RlZmluZSBEU19WQVJfREVMRVRFX1JFU1AJCTB4MDMKK307CisKK3N0cnVjdCBkc192YXJfc2V0X21zZyB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwljaGFyCQkJCW5hbWVfYW5kX3ZhbHVlWzBdOworfTsKKworc3RydWN0IGRzX3Zhcl9kZWxldGVfbXNnIHsKKwlzdHJ1Y3QgZHNfdmFyX2hkcgkJaGRyOworCWNoYXIJCQkJbmFtZVswXTsKK307CisKK3N0cnVjdCBkc192YXJfcmVzcCB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwlfX3UzMgkJCQlyZXN1bHQ7CisjZGVmaW5lIERTX1ZBUl9TVUNDRVNTCQkJMHgwMAorI2RlZmluZSBEU19WQVJfTk9fU1BBQ0UJCQkweDAxCisjZGVmaW5lIERTX1ZBUl9JTlZBTElEX1ZBUgkJMHgwMgorI2RlZmluZSBEU19WQVJfSU5WQUxJRF9WQUwJCTB4MDMKKyNkZWZpbmUgRFNfVkFSX05PVF9QUkVTRU5UCQkweDA0Cit9OworCitzdGF0aWMgREVGSU5FX01VVEVYKGRzX3Zhcl9tdXRleCk7CitzdGF0aWMgaW50IGRzX3Zhcl9kb29yYmVsbDsKK3N0YXRpYyBpbnQgZHNfdmFyX3Jlc3BvbnNlOworCitzdGF0aWMgdm9pZCBkc192YXJfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3Zhcl9yZXNwICpycDsKKworCXJwID0gKHN0cnVjdCBkc192YXJfcmVzcCAqKSAoZHBrdCArIDEpOworCisJaWYgKHJwLT5oZHIudHlwZSAhPSBEU19WQVJfU0VUX1JFU1AgJiYKKwkgICAgcnAtPmhkci50eXBlICE9IERTX1ZBUl9ERUxFVEVfUkVTUCkKKwkJcmV0dXJuOworCisJZHNfdmFyX3Jlc3BvbnNlID0gcnAtPnJlc3VsdDsKKwl3bWIoKTsKKwlkc192YXJfZG9vcmJlbGwgPSAxOworfQorCit2b2lkIGxkb21fc2V0X3Zhcihjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXN0cnVjdCBkc19pbmZvICpkcCA9IGRzX2luZm87CisJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3A7CisKKwljcCA9IGZpbmRfY2FwX2J5X3N0cmluZygidmFyLWNvbmZpZyIpOworCWlmIChjcC0+c3RhdGUgIT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpCisJCWNwID0gZmluZF9jYXBfYnlfc3RyaW5nKCJ2YXItY29uZmlnLWJhY2t1cCIpOworCisJaWYgKGNwLT5zdGF0ZSA9PSBDQVBfU1RBVEVfUkVHSVNURVJFRCkgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQkJCXN0cnVjdCBkc192YXJfc2V0X21zZwltc2c7CisJCQl9IGhlYWRlcjsKKwkJCWNoYXIJCQlhbGxbNTEyXTsKKwkJfSBwa3Q7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWNoYXIgICpiYXNlLCAqcDsKKwkJaW50IG1zZ19sZW4sIGxvb3BzOworCisJCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJCXBrdC5oZWFkZXIuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJCXBrdC5oZWFkZXIuZGF0YS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCQlwa3QuaGVhZGVyLm1zZy5oZHIudHlwZSA9IERTX1ZBUl9TRVRfUkVROworCQliYXNlID0gcCA9ICZwa3QuaGVhZGVyLm1zZy5uYW1lX2FuZF92YWx1ZVswXTsKKwkJc3RyY3B5KHAsIHZhcik7CisJCXAgKz0gc3RybGVuKHZhcikgKyAxOworCQlzdHJjcHkocCwgdmFsdWUpOworCQlwICs9IHN0cmxlbih2YWx1ZSkgKyAxOworCisJCW1zZ19sZW4gPSAoc2l6ZW9mKHN0cnVjdCBkc19kYXRhKSArCisJCQkgICBzaXplb2Yoc3RydWN0IGRzX3Zhcl9zZXRfbXNnKSArCisJCQkgICAocCAtIGJhc2UpKTsKKwkJbXNnX2xlbiA9IChtc2dfbGVuICsgMykgJiB+MzsKKwkJcGt0LmhlYWRlci5kYXRhLnRhZy5sZW4gPSBtc2dfbGVuIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKworCQltdXRleF9sb2NrKCZkc192YXJfbXV0ZXgpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJCWRzX3Zhcl9kb29yYmVsbCA9IDA7CisJCWRzX3Zhcl9yZXNwb25zZSA9IC0xOworCisJCV9fZHNfc2VuZChkcC0+bHAsICZwa3QsIG1zZ19sZW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwkJbG9vcHMgPSAxMDAwOworCQl3aGlsZSAoZHNfdmFyX2Rvb3JiZWxsID09IDApIHsKKwkJCWlmIChsb29wcy0tIDwgMCkKKwkJCQlicmVhazsKKwkJCWJhcnJpZXIoKTsKKwkJCXVkZWxheSgxMDApOworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZkc192YXJfbXV0ZXgpOworCisJCWlmIChkc192YXJfZG9vcmJlbGwgPT0gMCB8fAorCQkgICAgZHNfdmFyX3Jlc3BvbnNlICE9IERTX1ZBUl9TVUNDRVNTKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmFyLWNvbmZpZyBbJXM6JXNdICIKKwkJCSAgICAgICAiZmFpbGVkLCByZXNwb25zZSglZCkuXG4iLAorCQkJICAgICAgIHZhciwgdmFsdWUsCisJCQkgICAgICAgZHNfdmFyX3Jlc3BvbnNlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2YXItY29uZmlnIG5vdCByZWdpc3RlcmVkIHNvICIKKwkJICAgICAgICJjb3VsZCBub3Qgc2V0ICglcykgdmFyaWFibGUgdG8gKCVzKS5cbiIsCisJCSAgICAgICB2YXIsIHZhbHVlKTsKKwl9Cit9CisKK3ZvaWQgbGRvbV9yZWJvb3QoY29uc3QgY2hhciAqYm9vdF9jb21tYW5kKQoreworCS8qIERvbid0IGJvdGhlciB3aXRoIGFueSBvZiB0aGlzIGlmIHRoZSBib290X2NvbW1hbmQKKwkgKiBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoYm9vdF9jb21tYW5kICYmIHN0cmxlbihib290X2NvbW1hbmQpKSB7CisJCWNoYXIgZnVsbF9ib290X3N0clsyNTZdOworCisJCXN0cmNweShmdWxsX2Jvb3Rfc3RyLCAiYm9vdCAiKTsKKwkJc3RyY3B5KGZ1bGxfYm9vdF9zdHIgKyBzdHJsZW4oImJvb3QgIiksIGJvb3RfY29tbWFuZCk7CisKKwkJbGRvbV9zZXRfdmFyKCJyZWJvb3QtY29tbWFuZCIsIGZ1bGxfYm9vdF9zdHIpOworCX0KKwlzdW40dl9tYWNoX3NpcigpOworfQorCit2b2lkIGxkb21fcG93ZXJfb2ZmKHZvaWQpCit7CisJc3VuNHZfbWFjaF9leGl0KDApOworfQorCitzdGF0aWMgdm9pZCBkc19jb25uX3Jlc2V0KHN0cnVjdCBkc19pbmZvICpkcCkKK3sKKwlwcmludGsoS0VSTl9FUlIgUEZYICJkc19jb25uX3Jlc2V0KCkgZnJvbSAlcFxuIiwKKwkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KKworc3RhdGljIGludCByZWdpc3Rlcl9zZXJ2aWNlcyhzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRzX3N0YXRlcyk7IGkrKykgeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGRzX3JlZ19yZXEgcmVxOworCQkJdTggaWRfYnVmWzI1Nl07CisJCX0gcGJ1ZjsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSAmZHNfc3RhdGVzW2ldOworCQlpbnQgZXJyLCBtc2dfbGVuOworCQl1NjQgbmV3X2NvdW50OworCisJCWlmIChjcC0+c3RhdGUgPT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpCisJCQljb250aW51ZTsKKworCQluZXdfY291bnQgPSBzY2hlZF9jbG9jaygpICYgMHhmZmZmZmZmZjsKKwkJY3AtPmhhbmRsZSA9ICgodTY0KSBpIDw8IDMyKSB8IG5ld19jb3VudDsKKworCQltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfcmVnX3JlcSkgKworCQkJICAgc3RybGVuKGNwLT5zZXJ2aWNlX2lkKSk7CisKKwkJbWVtc2V0KCZwYnVmLCAwLCBzaXplb2YocGJ1ZikpOworCQlwYnVmLnJlcS50YWcudHlwZSA9IERTX1JFR19SRVE7CisJCXBidWYucmVxLnRhZy5sZW4gPSAobXNnX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZykpOworCQlwYnVmLnJlcS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCQlwYnVmLnJlcS5tYWpvciA9IDE7CisJCXBidWYucmVxLm1pbm9yID0gMDsKKwkJc3RyY3B5KHBidWYucmVxLnN2Y19pZCwgY3AtPnNlcnZpY2VfaWQpOworCisJCWVyciA9IF9fZHNfc2VuZChscCwgJnBidWYsIG1zZ19sZW4pOworCQlpZiAoZXJyID4gMCkKKwkJCWNwLT5zdGF0ZSA9IENBUF9TVEFURV9SRUdfU0VOVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfaGFuZHNoYWtlKHN0cnVjdCBkc19pbmZvICpkcCwgc3RydWN0IGRzX21zZ190YWcgKnBrdCkKK3sKKworCWlmIChkcC0+aHNfc3RhdGUgPT0gRFNfSFNfU1RBUlQpIHsKKwkJaWYgKHBrdC0+dHlwZSAhPSBEU19JTklUX0FDSykKKwkJCWdvdG8gY29ubl9yZXNldDsKKworCQlkcC0+aHNfc3RhdGUgPSBEU19IU19ET05FOworCisJCXJldHVybiByZWdpc3Rlcl9zZXJ2aWNlcyhkcCk7CisJfQorCisJaWYgKGRwLT5oc19zdGF0ZSAhPSBEU19IU19ET05FKQorCQlnb3RvIGNvbm5fcmVzZXQ7CisKKwlpZiAocGt0LT50eXBlID09IERTX1JFR19BQ0spIHsKKwkJc3RydWN0IGRzX3JlZ19hY2sgKmFwID0gKHN0cnVjdCBkc19yZWdfYWNrICopIHBrdDsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSBmaW5kX2NhcChhcC0+aGFuZGxlKTsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSRUcgQUNLIGZvciB1bmtub3duIGhhbmRsZSAlbHhcbiIsCisJCQkgICAgICAgYXAtPmhhbmRsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUmVnaXN0ZXJlZCAlcyBzZXJ2aWNlLlxuIiwKKwkJICAgICAgIGNwLT5zZXJ2aWNlX2lkKTsKKwkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQ7CisJfSBlbHNlIGlmIChwa3QtPnR5cGUgPT0gRFNfUkVHX05BQ0spIHsKKwkJc3RydWN0IGRzX3JlZ19uYWNrICpucCA9IChzdHJ1Y3QgZHNfcmVnX25hY2sgKikgcGt0OworCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCA9IGZpbmRfY2FwKG5wLT5oYW5kbGUpOworCisJCWlmICghY3ApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIlJFRyBOQUNLIGZvciAiCisJCQkgICAgICAgInVua25vd24gaGFuZGxlICVseFxuIiwKKwkJCSAgICAgICBucC0+aGFuZGxlKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgJXMgc2VydmljZVxuIiwKKwkJICAgICAgIGNwLT5zZXJ2aWNlX2lkKTsKKwkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1VOS05PV047CisJfQorCisJcmV0dXJuIDA7CisKK2Nvbm5fcmVzZXQ6CisJZHNfY29ubl9yZXNldChkcCk7CisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgdm9pZCBfX3NlbmRfZHNfbmFjayhzdHJ1Y3QgZHNfaW5mbyAqZHAsIHU2NCBoYW5kbGUpCit7CisJc3RydWN0IGRzX2RhdGFfbmFjayBuYWNrID0geworCQkudGFnID0geworCQkJLnR5cGUgPSBEU19OQUNLLAorCQkJLmxlbiA9IChzaXplb2Yoc3RydWN0IGRzX2RhdGFfbmFjaykgLQorCQkJCXNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZykpLAorCQl9LAorCQkuaGFuZGxlID0gaGFuZGxlLAorCQkucmVzdWx0ID0gRFNfSU5WX0hETCwKKwl9OworCisJX19kc19zZW5kKGRwLT5scCwgJm5hY2ssIHNpemVvZihuYWNrKSk7Cit9CisKK3N0YXRpYyBMSVNUX0hFQUQoZHNfd29ya19saXN0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChkc193YWl0KTsKKworc3RydWN0IGRzX3F1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCWludAkJCQlyZXFfbGVuOworCWludAkJCQlfX3BhZDsKKwl1NjQJCQkJcmVxWzBdOworfTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19kc193b3JrKHZvaWQpCit7CisJc3RydWN0IGRzX3F1ZXVlX2VudHJ5ICpxcCwgKnRtcDsKKwlzdGF0aWMgc3RydWN0IGRzX2luZm8gKmRwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKHRvZG8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZSgmZHNfd29ya19saXN0LCAmdG9kbyk7CisJSU5JVF9MSVNUX0hFQUQoJmRzX3dvcmtfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCisJZHAgPSBkc19pbmZvOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHFwLCB0bXAsICZ0b2RvLCBsaXN0KSB7CisJCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gKHN0cnVjdCBkc19kYXRhICopIHFwLT5yZXE7CisJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwID0gZmluZF9jYXAoZHBrdC0+aGFuZGxlKTsKKwkJaW50IHJlcV9sZW4gPSBxcC0+cmVxX2xlbjsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJEYXRhIGZvciB1bmtub3duIGhhbmRsZSAlbHVcbiIsCisJCQkgICAgICAgZHBrdC0+aGFuZGxlKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJCV9fc2VuZF9kc19uYWNrKGRwLCBkcGt0LT5oYW5kbGUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJY3AtPmRhdGEoZHAtPmxwLCBjcCwgZHBrdCwgcmVxX2xlbik7CisJCX0KKworCQlsaXN0X2RlbCgmcXAtPmxpc3QpOworCQlrZnJlZShxcCk7CisJfQorfQorCitzdGF0aWMgaW50IGRzX3RocmVhZCh2b2lkICpfX3VudXNlZCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXdoaWxlICgxKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmZHNfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChsaXN0X2VtcHR5KCZkc193b3JrX2xpc3QpKQorCQkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmRzX3dhaXQsICZ3YWl0KTsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJcHJvY2Vzc19kc193b3JrKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfZGF0YShzdHJ1Y3QgZHNfaW5mbyAqZHAsIHN0cnVjdCBkc19tc2dfdGFnICpwa3QsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSAoc3RydWN0IGRzX2RhdGEgKikgcGt0OworCXN0cnVjdCBkc19xdWV1ZV9lbnRyeSAqcXA7CisKKwlxcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkc19xdWV1ZV9lbnRyeSkgKyBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghcXApIHsKKwkJX19zZW5kX2RzX25hY2soZHAsIGRwa3QtPmhhbmRsZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZxcC0+cmVxLCBwa3QsIGxlbik7CisJCWxpc3RfYWRkX3RhaWwoJnFwLT5saXN0LCAmZHNfd29ya19saXN0KTsKKwkJd2FrZV91cCgmZHNfd2FpdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc191cChzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwlzdHJ1Y3QgZHNfdmVyX3JlcSByZXE7CisJaW50IGVycjsKKworCXJlcS50YWcudHlwZSA9IERTX0lOSVRfUkVROworCXJlcS50YWcubGVuID0gc2l6ZW9mKHJlcSkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXJlcS52ZXIubWFqb3IgPSAxOworCXJlcS52ZXIubWlub3IgPSAwOworCisJZXJyID0gX19kc19zZW5kKGxwLCAmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKGVyciA+IDApCisJCWRwLT5oc19zdGF0ZSA9IERTX0hTX1NUQVJUOworfQorCitzdGF0aWMgdm9pZCBkc19ldmVudCh2b2lkICphcmcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBhcmc7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCisJaWYgKGV2ZW50ID09IExEQ19FVkVOVF9VUCkgeworCQlkc191cChkcCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgZHNfbXNnX3RhZyAqdGFnOworCisJCWVyciA9IGxkY19yZWFkKGxwLCBkcC0+cmN2X2J1Ziwgc2l6ZW9mKCp0YWcpKTsKKworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJZHNfY29ubl9yZXNldChkcCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyID09IDApCisJCQlicmVhazsKKworCQl0YWcgPSBkcC0+cmN2X2J1ZjsKKwkJZXJyID0gbGRjX3JlYWQobHAsIHRhZyArIDEsIHRhZy0+bGVuKTsKKworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJZHNfY29ubl9yZXNldChkcCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyIDwgdGFnLT5sZW4pCisJCQlicmVhazsKKworCQlpZiAodGFnLT50eXBlIDwgRFNfREFUQSkKKwkJCWVyciA9IGRzX2hhbmRzaGFrZShkcCwgZHAtPnJjdl9idWYpOworCQllbHNlCisJCQllcnIgPSBkc19kYXRhKGRwLCBkcC0+cmN2X2J1ZiwKKwkJCQkgICAgICBzaXplb2YoKnRhZykgKyBlcnIpOworCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkc19wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgaW50IGRzX3ZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIGRzX2NmZyA9IHsKKwkJLmV2ZW50CQk9IGRzX2V2ZW50LAorCQkubXR1CQk9IDQwOTYsCisJCS5tb2RlCQk9IExEQ19NT0RFX1NUUkVBTSwKKwl9OworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJc3RydWN0IGRzX2luZm8gKmRwOworCWludCBlcnI7CisKKwlpZiAoZHNfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRwID0ga3phbGxvYyhzaXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWRwKQorCQlnb3RvIG91dF9lcnI7CisKKwlkcC0+cmN2X2J1ZiA9IGt6YWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcC0+cmN2X2J1ZikKKwkJZ290byBvdXRfZnJlZV9kcDsKKworCWRwLT5yY3ZfYnVmX2xlbiA9IDQwOTY7CisKKwlkc19jZmcudHhfaXJxID0gdmRldi0+dHhfaXJxOworCWRzX2NmZy5yeF9pcnEgPSB2ZGV2LT5yeF9pcnE7CisKKwlscCA9IGxkY19hbGxvYyh2ZGV2LT5jaGFubmVsX2lkLCAmZHNfY2ZnLCBkcCk7CisJaWYgKElTX0VSUihscCkpIHsKKwkJZXJyID0gUFRSX0VSUihscCk7CisJCWdvdG8gb3V0X2ZyZWVfcmN2X2J1ZjsKKwl9CisJZHAtPmxwID0gbHA7CisKKwllcnIgPSBsZGNfYmluZChscCwgIkRTIik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9sZGM7CisKKwlkc19pbmZvID0gZHA7CisKKwlzdGFydF9wb3dlcmQoKTsKKworCXJldHVybiBlcnI7CisKK291dF9mcmVlX2xkYzoKKwlsZGNfZnJlZShkcC0+bHApOworCitvdXRfZnJlZV9yY3ZfYnVmOgorCWtmcmVlKGRwLT5yY3ZfYnVmKTsKKworb3V0X2ZyZWVfZHA6CisJa2ZyZWUoZHApOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHNfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgZHNfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gImRvbWFpbi1zZXJ2aWNlcy1wb3J0IiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIGRzX2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSBkc19tYXRjaCwKKwkucHJvYmUJCT0gZHNfcHJvYmUsCisJLnJlbW92ZQkJPSBkc19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImRzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHNfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHNfc3RhdGVzKTsgaSsrKQorCQlkc19zdGF0ZXNbaV0uaGFuZGxlID0gKCh1NjQpaSA8PCAzMik7CisKKwlrdGhyZWFkX3J1bihkc190aHJlYWQsIE5VTEwsICJrbGRvbWQiKTsKKworCXJldHVybiB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZkc19kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwoZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZ0cmFtcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTA5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUwpAQCAtMCwwICsxLDEzOSBAQAorLyogaHZ0cmFtcC5TOiBIeXBlcnZpc29yIHN0YXJ0LWNwdSB0cmFtcG9saW5lIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vc2NyYXRjaHBhZC5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9odnRyYW1wLmg+CisjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYXNpLmg+CisKKwkudGV4dAorCS5hbGlnbgkJOAorCS5nbG9ibAkJaHZfY3B1X3N0YXJ0dXAsIGh2X2NwdV9zdGFydHVwX2VuZAorCisJLyogVGhpcyBjb2RlIGV4ZWN1dGVzIGRpcmVjdGx5IG91dCBvZiB0aGUgaHlwZXJ2aXNvcgorCSAqIHdpdGggcGh5c2ljYWwgYWRkcmVzc2luZyAodmE9PXBhKS4gICVvMCBjb250YWlucworCSAqIG91ciBjbGllbnQgYXJndW1lbnQgd2hpY2ggZm9yIExpbnV4IHBvaW50cyB0bworCSAqIGEgZGVzY3JpcHRvciBkYXRhIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZQorCSAqIE1NVSBlbnRyaWVzIHdlIG5lZWQgdG8gbG9hZCB1cC4KKwkgKgorCSAqIEFmdGVyIHdlIHNldCB0aGluZ3MgdXAgd2UgZW5hYmxlIHRoZSBNTVUgYW5kIGNhbGwKKwkgKiBpbnRvIHRoZSBrZXJuZWwuCisJICoKKwkgKiBGaXJzdCBzZXR1cCBiYXNpYyBwcml2aWxlZ2VkIGNwdSBzdGF0ZS4KKwkgKi8KK2h2X2NwdV9zdGFydHVwOgorCXdycHIJCSVnMCwgMCwgJWdsCisJd3JwcgkJJWcwLCAxNSwgJXBpbAorCXdycHIJCSVnMCwgMCwgJWNhbnJlc3RvcmUKKwl3cnByCQklZzAsIDAsICVvdGhlcndpbgorCXdycHIJCSVnMCwgNiwgJWNhbnNhdmUKKwl3cnByCQklZzAsIDYsICVjbGVhbndpbgorCXdycHIJCSVnMCwgMCwgJWN3cAorCXdycHIJCSVnMCwgMCwgJXdzdGF0ZQorCXdycHIJCSVnMCwgMCwgJXRsCisKKwlzZXRoaQkJJWhpKHNwYXJjNjRfdHRhYmxlX3RsMCksICVnMQorCXdycHIJCSVnMSwgJXRiYQorCisJbW92CQklbzAsICVsMAorCisJbGR1dwkJWyVsMCArIEhWVFJBTVBfREVTQ1JfQ1BVXSwgJWcxCisJbW92CQlTQ1JBVENIUEFEX0NQVUlELCAlZzIKKwlzdHhhCQklZzEsIFslZzJdIEFTSV9TQ1JBVENIUEFECisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0ZBVUxUX0lORk9fVkFdLCAlZzIKKwlzdHhhCQklZzIsIFslZzBdIEFTSV9TQ1JBVENIUEFECisKKwltb3YJCTAsICVsMQorCWxkdXcJCVslbDAgKyBIVlRSQU1QX0RFU0NSX05VTV9NQVBQSU5HU10sICVsMgorCWFkZAkJJWwwLCBIVlRSQU1QX0RFU0NSX01BUFMsICVsMworCisxOglsZHgJCVslbDMgKyBIVlRSQU1QX01BUFBJTkdfVkFERFJdLCAlbzAKKwljbHIJCSVvMQorCWxkeAkJWyVsMyArIEhWVFJBTVBfTUFQUElOR19UVEVdLCAlbzIKKwltb3YJCUhWX01NVV9JTU1VIHwgSFZfTU1VX0RNTVUsICVvMworCW1vdgkJSFZfRkFTVF9NTVVfTUFQX1BFUk1fQUREUiwgJW81CisJdGEJCUhWX0ZBU1RfVFJBUAorCisJYnJueixwbgkJJW8wLCA4MGYKKwkgbm9wCisKKwlhZGQJCSVsMSwgMSwgJWwxCisJY21wCQklbDEsICVsMgorCWJsdCxhLHB0CSV4Y2MsIDFiCisJIGFkZAkJJWwzLCBIVlRSQU1QX01BUFBJTkdfU0laRSwgJWwzCisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0ZBVUxUX0lORk9fUEFdLCAlbzAKKwltb3YJCUhWX0ZBU1RfTU1VX0ZBVUxUX0FSRUFfQ09ORiwgJW81CisJdGEJCUhWX0ZBU1RfVFJBUAorCisJYnJueixwbgkJJW8wLCA4MGYKKwkgbm9wCisKKwl3cnByCQklZzAsIChQU1RBVEVfUFJJViB8IFBTVEFURV9QRUYpLCAlcHN0YXRlCisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX1RIUkVBRF9SRUddLCAlbDYKKworCW1vdgkJMSwgJW8wCisJc2V0CQkxZiwgJW8xCisJbW92CQlIVl9GQVNUX01NVV9FTkFCTEUsICVvNQorCXRhCQlIVl9GQVNUX1RSQVAKKworCWJhLHB0CQkleGNjLCA4MGYKKwkgbm9wCisKKzE6CisJd3IJCSVnMCwgMCwgJWZwcnMKKwl3cgkJJWcwLCBBU0lfUCwgJWFzaQorCisJbW92CQlQUklNQVJZX0NPTlRFWFQsICVnNworCXN0eGEJCSVnMCwgWyVnN10gQVNJX01NVQorCW1lbWJhcgkJI1N5bmMKKworCW1vdgkJU0VDT05EQVJZX0NPTlRFWFQsICVnNworCXN0eGEJCSVnMCwgWyVnN10gQVNJX01NVQorCW1lbWJhcgkJI1N5bmMKKworCW1vdgkJJWw2LCAlZzYKKwlsZHgJCVslZzYgKyBUSV9UQVNLXSwgJWc0CisKKwltb3YJCTEsICVnNQorCXNsbHgJCSVnNSwgVEhSRUFEX1NISUZULCAlZzUKKwlzdWIJCSVnNSwgKFNUQUNLRlJBTUVfU1ogKyBTVEFDS19CSUFTKSwgJWc1CisJYWRkCQklZzYsICVnNSwgJXNwCisJbW92CQkwLCAlZnAKKworCWNhbGwJCWluaXRfaXJxd29ya19jdXJjcHUKKwkgbm9wCisJY2FsbAkJaGFyZF9zbXBfcHJvY2Vzc29yX2lkCisJIG5vcAorCisJbW92CQklbzAsICVvMQorCW1vdgkJMCwgJW8wCisJbW92CQkwLCAlbzIKKwljYWxsCQlzdW40dl9pbml0X21vbmRvX3F1ZXVlcworCSBtb3YJCTEsICVvMworCisJY2FsbAkJaW5pdF9jdXJfY3B1X3RyYXAKKwkgbW92CQklZzYsICVvMAorCisJd3JwcgkJJWcwLCAoUFNUQVRFX1BSSVYgfCBQU1RBVEVfUEVGIHwgUFNUQVRFX0lFKSwgJXBzdGF0ZQorCisJY2FsbAkJc21wX2NhbGxpbgorCSBub3AKKwljYWxsCQljcHVfaWRsZQorCSBtb3YJCTAsICVvMAorCWNhbGwJCWNwdV9wYW5pYworCSBub3AKKworODA6CWJhLHB0CQkleGNjLCA4MGIKKwkgbm9wCisKKwkuYWxpZ24JCTgKK2h2X2NwdV9zdGFydHVwX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCmluZGV4IDZiNjE2NWQzLi44Y2IzMzU4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKQEAgLTI5Myw2ICsyOTMsMTEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR1X3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlydF9pcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXN1bjR1X2lycV9lbmFibGUodmlydF9pcnEpOworfQorCiBzdGF0aWMgdm9pZCBzdW40dV9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlycV9oYW5kbGVyX2RhdGEgKmRhdGEgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJ0X2lycSk7CkBAIC0zMDksNiArMzE0LDEwIEBACiBzdGF0aWMgdm9pZCBzdW40dV9pcnFfZW5kKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKIHsKIAlzdHJ1Y3QgaXJxX2hhbmRsZXJfZGF0YSAqZGF0YSA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnRfaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIHZpcnRfaXJxOworCisJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKKwkJcmV0dXJuOwogCiAJaWYgKGxpa2VseShkYXRhKSkKIAkJdXBhX3dyaXRlcShJQ0xSX0lETEUsIGRhdGEtPmljbHIpOwpAQCAtMzQwLDYgKzM0OSwyNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc3VuNHZfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CisJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCisJaWYgKGxpa2VseShidWNrZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgY3B1aWQ7CisJCWludCBlcnI7CisKKwkJY3B1aWQgPSBpcnFfY2hvb3NlX2NwdSh2aXJ0X2lycSk7CisKKwkJZXJyID0gc3VuNHZfaW50cl9zZXR0YXJnZXQoaW5vLCBjcHVpZCk7CisJCWlmIChlcnIgIT0gSFZfRU9LKQorCQkJcHJpbnRrKCJzdW40dl9pbnRyX3NldHRhcmdldCgleCwlbHUpOiBlcnIoJWQpXG4iLAorCQkJICAgICAgIGlubywgY3B1aWQsIGVycik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzdW40dl9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CkBAIC0zNzMsNiArNDAwLDEwIEBACiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CiAJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgdmlydF9pcnE7CisKKwlpZiAodW5saWtlbHkoZGVzYy0+c3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCQlyZXR1cm47CiAKIAlpZiAobGlrZWx5KGJ1Y2tldCkpIHsKIAkJaW50IGVycjsKQEAgLTQxOCw2ICs0NDksMjggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR2X3ZpcnRfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CisJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCisJaWYgKGxpa2VseShidWNrZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgY3B1aWQsIGRldl9oYW5kbGUsIGRldl9pbm87CisJCWludCBlcnI7CisKKwkJY3B1aWQgPSBpcnFfY2hvb3NlX2NwdSh2aXJ0X2lycSk7CisKKwkJZGV2X2hhbmRsZSA9IGlubyAmIElNQVBfSUdOOworCQlkZXZfaW5vID0gaW5vICYgSU1BUF9JTk87CisKKwkJZXJyID0gc3VuNHZfdmludHJfc2V0X3RhcmdldChkZXZfaGFuZGxlLCBkZXZfaW5vLCBjcHVpZCk7CisJCWlmIChlcnIgIT0gSFZfRU9LKQorCQkJcHJpbnRrKCJzdW40dl92aW50cl9zZXRfdGFyZ2V0KCVseCwlbHgsJWx1KTogIgorCQkJICAgICAgICJlcnIoJWQpXG4iLAorCQkJICAgICAgIGRldl9oYW5kbGUsIGRldl9pbm8sIGNwdWlkLCBlcnIpOworCX0KK30KKwogc3RhdGljIHZvaWQgc3VuNHZfdmlycV9kaXNhYmxlKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gdmlydF9pcnFfdG9fYnVja2V0KHZpcnRfaXJxKTsKQEAgLTQ0Myw2ICs0OTYsMTAgQEAKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gdmlydF9pcnFfdG9fYnVja2V0KHZpcnRfaXJxKTsKIAl1bnNpZ25lZCBpbnQgaW5vID0gYnVja2V0IC0gJml2ZWN0b3JfdGFibGVbMF07CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyB2aXJ0X2lycTsKKworCWlmICh1bmxpa2VseShkZXNjLT5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCisJCXJldHVybjsKIAogCWlmIChsaWtlbHkoYnVja2V0KSkgewogCQl1bnNpZ25lZCBsb25nIGRldl9oYW5kbGUsIGRldl9pbm87CkBAIC00NzcsNiArNTM0LDcgQEAKIAkuZW5hYmxlCQk9IHN1bjR1X2lycV9lbmFibGUsCiAJLmRpc2FibGUJPSBzdW40dV9pcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR1X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR1X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHVfaXJxX2FjayA9IHsKQEAgLTQ4NSw2ICs1NDMsNyBAQAogCS5kaXNhYmxlCT0gc3VuNHVfaXJxX2Rpc2FibGUsCiAJLmFjawkJPSBydW5fcHJlX2hhbmRsZXIsCiAJLmVuZAkJPSBzdW40dV9pcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dV9zZXRfYWZmaW5pdHksCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bjR2X2lycSA9IHsKQEAgLTQ5Miw2ICs1NTEsNyBAQAogCS5lbmFibGUJCT0gc3VuNHZfaXJxX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHN1bjR2X2lycV9kaXNhYmxlLAogCS5lbmQJCT0gc3VuNHZfaXJxX2VuZCwKKwkuc2V0X2FmZmluaXR5CT0gc3VuNHZfc2V0X2FmZmluaXR5LAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW40dl9pcnFfYWNrID0gewpAQCAtNTAwLDYgKzU2MCw3IEBACiAJLmRpc2FibGUJPSBzdW40dl9pcnFfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAKICNpZmRlZiBDT05GSUdfUENJX01TSQpAQCAtNTExLDYgKzU3Miw3IEBACiAJLmRpc2FibGUJPSBzdW40dl9tc2lfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAjZW5kaWYKIApAQCAtNTE5LDYgKzU4MSw3IEBACiAJLmVuYWJsZQkJPSBzdW40dl92aXJxX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHN1bjR2X3ZpcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR2X3ZpcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHZfdmlycV9hY2sgPSB7CkBAIC01MjcsNiArNTkwLDcgQEAKIAkuZGlzYWJsZQk9IHN1bjR2X3ZpcnFfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X3ZpcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKIHZvaWQgaXJxX2luc3RhbGxfcHJlX2hhbmRsZXIoaW50IHZpcnRfaXJxLApAQCAtNzM5LDYgKzgwMywyNiBAQAogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgZml4dXBfaXJxcyh2b2lkKQoreworCXVuc2lnbmVkIGludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2lycV0ubG9jaywgZmxhZ3MpOworCQlpZiAoaXJxX2Rlc2NbaXJxXS5hY3Rpb24gJiYKKwkJICAgICEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfUEVSX0NQVSkpIHsKKwkJCWlmIChpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eSkKKwkJCQlpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eShpcnEsCisJCQkJCWlycV9kZXNjW2lycV0uYWZmaW5pdHkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2lycV0ubG9jaywgZmxhZ3MpOworCX0KK30KKyNlbmRpZgorCiBzdHJ1Y3Qgc3VuNV90aW1lciB7CiAJdTY0CWNvdW50MDsKIAl1NjQJbGltaXQwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9sZGMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMmJlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMKQEAgLTAsMCArMSwyMzczIEBACisvKiBsZGMuYzogTG9naWNhbCBEb21haW4gQ2hhbm5lbCBsaW5rLWxheWVyIHByb3RvY29sIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJsZGMiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW5lIDI1LCAyMDA3IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CisjZGVmaW5lIExEQ19QQUNLRVRfU0laRQkJNjQKKworLyogUGFja2V0IGhlYWRlciBsYXlvdXQgZm9yIHVucmVsaWFibGUgYW5kIHJlbGlhYmxlIG1vZGUgZnJhbWVzLgorICogV2hlbiBpbiBSQVcgbW9kZSwgcGFja2V0cyBhcmUgc2ltcGx5IHN0cmFpZ2h0IDY0LWJ5dGUgcGF5bG9hZHMKKyAqIHdpdGggbm8gaGVhZGVycy4KKyAqLworc3RydWN0IGxkY19wYWNrZXQgeworCXU4CQkJdHlwZTsKKyNkZWZpbmUgTERDX0NUUkwJCTB4MDEKKyNkZWZpbmUgTERDX0RBVEEJCTB4MDIKKyNkZWZpbmUgTERDX0VSUgkJCTB4MTAKKworCXU4CQkJc3R5cGU7CisjZGVmaW5lIExEQ19JTkZPCQkweDAxCisjZGVmaW5lIExEQ19BQ0sJCQkweDAyCisjZGVmaW5lIExEQ19OQUNLCQkweDA0CisKKwl1OAkJCWN0cmw7CisjZGVmaW5lIExEQ19WRVJTCQkweDAxIC8qIExpbmsgVmVyc2lvbgkJKi8KKyNkZWZpbmUgTERDX1JUUwkJCTB4MDIgLyogUmVxdWVzdCBUbyBTZW5kCQkqLworI2RlZmluZSBMRENfUlRSCQkJMHgwMyAvKiBSZWFkeSBUbyBSZWNlaXZlCSovCisjZGVmaW5lIExEQ19SRFgJCQkweDA0IC8qIFJlYWR5IGZvciBEYXRhIGVYY2hhbmdlCSovCisjZGVmaW5lIExEQ19DVFJMX01TSwkJMHgwZgorCisJdTgJCQllbnY7CisjZGVmaW5lIExEQ19MRU4JCQkweDNmCisjZGVmaW5lIExEQ19GUkFHX01BU0sJCTB4YzAKKyNkZWZpbmUgTERDX1NUQVJUCQkweDQwCisjZGVmaW5lIExEQ19TVE9QCQkweDgwCisKKwl1MzIJCQlzZXFpZDsKKworCXVuaW9uIHsKKwkJdTgJCXVfZGF0YVtMRENfUEFDS0VUX1NJWkUgLSA4XTsKKwkJc3RydWN0IHsKKwkJCXUzMglwYWQ7CisJCQl1MzIJYWNraWQ7CisJCQl1OAlyX2RhdGFbTERDX1BBQ0tFVF9TSVpFIC0gOCAtIDhdOworCQl9IHI7CisJfSB1OworfTsKKworc3RydWN0IGxkY192ZXJzaW9uIHsKKwl1MTYgbWFqb3I7CisJdTE2IG1pbm9yOworfTsKKworLyogT3JkZXJlZCBmcm9tIGxhcmdlc3QgbWFqb3IgdG8gbG93ZXN0LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyX2FycltdID0geworCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMCB9LAorfTsKKworI2RlZmluZSBMRENfREVGQVVMVF9NVFUJCQkoNCAqIExEQ19QQUNLRVRfU0laRSkKKyNkZWZpbmUgTERDX0RFRkFVTFRfTlVNX0VOVFJJRVMJCShQQUdFX1NJWkUgLyBMRENfUEFDS0VUX1NJWkUpCisKK3N0cnVjdCBsZGNfY2hhbm5lbDsKKworc3RydWN0IGxkY19tb2RlX29wcyB7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBsZGNfY2hhbm5lbCAqLCBjb25zdCB2b2lkICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqcmVhZCkoc3RydWN0IGxkY19jaGFubmVsICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIHJhd19vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyBub25yYXdfb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgc3RyZWFtX29wczsKKworaW50IGxkb21fZG9tYWluaW5nX2VuYWJsZWQ7CisKK3N0cnVjdCBsZGNfaW9tbXUgeworCS8qIFByb3RlY3RzIGFyZW5hIGFsbG9jL2ZyZWUuICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCXN0cnVjdCBpb21tdV9hcmVuYQkJYXJlbmE7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkJCSpwYWdlX3RhYmxlOworfTsKKworc3RydWN0IGxkY19jaGFubmVsIHsKKwkvKiBQcm90ZWN0cyBhbGwgb3BlcmF0aW9ucyB0aGF0IGRlcGVuZCB1cG9uIGNoYW5uZWwgc3RhdGUuICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCisJdW5zaWduZWQgbG9uZwkJCWlkOworCisJdTgJCQkJKm1zc2J1ZjsKKwl1MzIJCQkJbXNzYnVmX2xlbjsKKwl1MzIJCQkJbXNzYnVmX29mZjsKKworCXN0cnVjdCBsZGNfcGFja2V0CQkqdHhfYmFzZTsKKwl1bnNpZ25lZCBsb25nCQkJdHhfaGVhZDsKKwl1bnNpZ25lZCBsb25nCQkJdHhfdGFpbDsKKwl1bnNpZ25lZCBsb25nCQkJdHhfbnVtX2VudHJpZXM7CisJdW5zaWduZWQgbG9uZwkJCXR4X3JhOworCisJdW5zaWduZWQgbG9uZwkJCXR4X2Fja2VkOworCisJc3RydWN0IGxkY19wYWNrZXQJCSpyeF9iYXNlOworCXVuc2lnbmVkIGxvbmcJCQlyeF9oZWFkOworCXVuc2lnbmVkIGxvbmcJCQlyeF90YWlsOworCXVuc2lnbmVkIGxvbmcJCQlyeF9udW1fZW50cmllczsKKwl1bnNpZ25lZCBsb25nCQkJcnhfcmE7CisKKwl1MzIJCQkJcmN2X254dDsKKwl1MzIJCQkJc25kX254dDsKKworCXVuc2lnbmVkIGxvbmcJCQljaGFuX3N0YXRlOworCisJc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZwljZmc7CisJdm9pZAkJCQkqZXZlbnRfYXJnOworCisJY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcwkqbW9wczsKKworCXN0cnVjdCBsZGNfaW9tbXUJCWlvbW11OworCisJc3RydWN0IGxkY192ZXJzaW9uCQl2ZXI7CisKKwl1OAkJCQloc19zdGF0ZTsKKyNkZWZpbmUgTERDX0hTX0NMT1NFRAkJCTB4MDAKKyNkZWZpbmUgTERDX0hTX09QRU4JCQkweDAxCisjZGVmaW5lIExEQ19IU19HT1RWRVJTCQkJMHgwMgorI2RlZmluZSBMRENfSFNfU0VOVFJUUgkJCTB4MDMKKyNkZWZpbmUgTERDX0hTX0dPVFJUUgkJCTB4MDQKKyNkZWZpbmUgTERDX0hTX0NPTVBMRVRFCQkJMHgxMAorCisJdTgJCQkJZmxhZ3M7CisjZGVmaW5lIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTCQkweDAxCisjZGVmaW5lIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTCTB4MDIKKyNkZWZpbmUgTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTCTB4MDQKKyNkZWZpbmUgTERDX0ZMQUdfUkVTRVQJCQkweDEwCisKKwl1OAkJCQltc3M7CisJdTgJCQkJc3RhdGU7CisKKyNkZWZpbmUgTERDX0lSUV9OQU1FX01BWAkJMzIKKwljaGFyCQkJCXJ4X2lycV9uYW1lW0xEQ19JUlFfTkFNRV9NQVhdOworCWNoYXIJCQkJdHhfaXJxX25hbWVbTERDX0lSUV9OQU1FX01BWF07CisKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkJbWhfbGlzdDsKKworCXN0cnVjdCBobGlzdF9ub2RlCQlsaXN0OworfTsKKworI2RlZmluZSBsZGNkYmcoVFlQRSwgZiwgYS4uLikgXAorZG8gewlpZiAobHAtPmNmZy5kZWJ1ZyAmIExEQ19ERUJVR18jI1RZUEUpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklEWyVsdV0gIiBmLCBscC0+aWQsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVfdG9fc3RyKHU4IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIExEQ19TVEFURV9JTlZBTElEOgorCQlyZXR1cm4gIklOVkFMSUQiOworCWNhc2UgTERDX1NUQVRFX0lOSVQ6CisJCXJldHVybiAiSU5JVCI7CisJY2FzZSBMRENfU1RBVEVfQk9VTkQ6CisJCXJldHVybiAiQk9VTkQiOworCWNhc2UgTERDX1NUQVRFX1JFQURZOgorCQlyZXR1cm4gIlJFQURZIjsKKwljYXNlIExEQ19TVEFURV9DT05ORUNURUQ6CisJCXJldHVybiAiQ09OTkVDVEVEIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIjxVTktOT1dOPiI7CisJfQorfQorCitzdGF0aWMgdm9pZCBsZGNfc2V0X3N0YXRlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHU4IHN0YXRlKQoreworCWxkY2RiZyhTVEFURSwgIlNUQVRFICglcykgLS0+ICglcylcbiIsCisJICAgICAgIHN0YXRlX3RvX3N0cihscC0+c3RhdGUpLAorCSAgICAgICBzdGF0ZV90b19zdHIoc3RhdGUpKTsKKworCWxwLT5zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2FkdmFuY2UodW5zaWduZWQgbG9uZyBvZmYsIHVuc2lnbmVkIGxvbmcgbnVtX2VudHJpZXMpCit7CisJb2ZmICs9IExEQ19QQUNLRVRfU0laRTsKKwlpZiAob2ZmID09IChudW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRSkpCisJCW9mZiA9IDA7CisKKwlyZXR1cm4gb2ZmOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByeF9hZHZhbmNlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXJldHVybiBfX2FkdmFuY2Uob2ZmLCBscC0+cnhfbnVtX2VudHJpZXMpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0eF9hZHZhbmNlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXJldHVybiBfX2FkdmFuY2Uob2ZmLCBscC0+dHhfbnVtX2VudHJpZXMpOworfQorCitzdGF0aWMgc3RydWN0IGxkY19wYWNrZXQgKmhhbmRzaGFrZV9nZXRfdHhfcGFja2V0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCQkgIHVuc2lnbmVkIGxvbmcgKm5ld190YWlsKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgdDsKKworCXQgPSB0eF9hZHZhbmNlKGxwLCBscC0+dHhfdGFpbCk7CisJaWYgKHQgPT0gbHAtPnR4X2hlYWQpCisJCXJldHVybiBOVUxMOworCisJKm5ld190YWlsID0gdDsKKworCXAgPSBscC0+dHhfYmFzZTsKKwlyZXR1cm4gcCArIChscC0+dHhfdGFpbCAvIExEQ19QQUNLRVRfU0laRSk7Cit9CisKKy8qIFdoZW4gd2UgYXJlIGluIHJlbGlhYmxlIG9yIHN0cmVhbSBtb2RlLCBoYXZlIHRvIHRyYWNrIHRoZSBuZXh0IHBhY2tldAorICogd2UgaGF2ZW4ndCBnb3R0ZW4gYW4gQUNLIGZvciBpbiB0aGUgVFggcXVldWUgdXNpbmcgdHhfYWNrZWQuICBXZSBoYXZlCisgKiB0byBiZSBjYXJlZnVsIG5vdCB0byBzdG9tcCBvdmVyIHRoZSBxdWV1ZSBwYXN0IHRoYXQgcG9pbnQuICBEdXJpbmcKKyAqIHRoZSBoYW5kc2hha2UsIHdlIGRvbid0IGhhdmUgVFggZGF0YSBwYWNrZXRzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlCisgKiBhbmQgdGhhdCdzIHdoeSBoYW5kc2hha2VfZ2V0X3R4X3BhY2tldCgpIG5lZWQgbm90IGJlIG1pbmRmdWwgb2YKKyAqIGxwLT50eF9hY2tlZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVhZF9mb3JfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfU1RSRUFNKQorCQlyZXR1cm4gbHAtPnR4X2Fja2VkOworCXJldHVybiBscC0+dHhfaGVhZDsKK30KKworc3RhdGljIGludCB0eF9oYXNfc3BhY2VfZm9yKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbGltaXQsIHRhaWwsIG5ld190YWlsLCBkaWZmOworCXVuc2lnbmVkIGludCBtc3M7CisKKwlsaW1pdCA9IGhlYWRfZm9yX2RhdGEobHApOworCXRhaWwgPSBscC0+dHhfdGFpbDsKKwluZXdfdGFpbCA9IHR4X2FkdmFuY2UobHAsIHRhaWwpOworCWlmIChuZXdfdGFpbCA9PSBsaW1pdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGltaXQgPiBuZXdfdGFpbCkKKwkJZGlmZiA9IGxpbWl0IC0gbmV3X3RhaWw7CisJZWxzZQorCQlkaWZmID0gKGxpbWl0ICsKKwkJCSgobHAtPnR4X251bV9lbnRyaWVzICogTERDX1BBQ0tFVF9TSVpFKSAtIG5ld190YWlsKSk7CisJZGlmZiAvPSBMRENfUEFDS0VUX1NJWkU7CisJbXNzID0gbHAtPm1zczsKKworCWlmIChkaWZmICogbXNzIDwgc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpkYXRhX2dldF90eF9wYWNrZXQoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nICpuZXdfdGFpbCkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIGgsIHQ7CisKKwloID0gaGVhZF9mb3JfZGF0YShscCk7CisJdCA9IHR4X2FkdmFuY2UobHAsIGxwLT50eF90YWlsKTsKKwlpZiAodCA9PSBoKQorCQlyZXR1cm4gTlVMTDsKKworCSpuZXdfdGFpbCA9IHQ7CisKKwlwID0gbHAtPnR4X2Jhc2U7CisJcmV0dXJuIHAgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpOworfQorCitzdGF0aWMgaW50IHNldF90eF90YWlsKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgdGFpbCkKK3sKKwl1bnNpZ25lZCBsb25nIG9yaWdfdGFpbCA9IGxwLT50eF90YWlsOworCWludCBsaW1pdCA9IDEwMDA7CisKKwlscC0+dHhfdGFpbCA9IHRhaWw7CisJd2hpbGUgKGxpbWl0LS0gPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgZXJyOworCisJCWVyciA9IHN1bjR2X2xkY190eF9zZXRfcXRhaWwobHAtPmlkLCB0YWlsKTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZXJyICE9IEhWX0VXT1VMREJMT0NLKSB7CisJCQlscC0+dHhfdGFpbCA9IG9yaWdfdGFpbDsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKwlscC0+dHhfdGFpbCA9IG9yaWdfdGFpbDsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKiBUaGlzIGp1c3QgdXBkYXRlcyB0aGUgaGVhZCB2YWx1ZSBpbiB0aGUgaHlwZXJ2aXNvciB1c2luZworICogYSBwb2xsaW5nIGxvb3Agd2l0aCBhIHRpbWVvdXQuICBUaGUgY2FsbGVyIHRha2VzIGNhcmUgb2YKKyAqIHVwYXRpbmcgc29mdHdhcmUgc3RhdGUgcmVwcmVzZW50aW5nIHRoZSBoZWFkIGNoYW5nZSwgaWYgYW55LgorICovCitzdGF0aWMgaW50IF9fc2V0X3J4X2hlYWQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCWludCBsaW1pdCA9IDEwMDA7CisKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBlcnI7CisKKwkJZXJyID0gc3VuNHZfbGRjX3J4X3NldF9xaGVhZChscC0+aWQsIGhlYWQpOworCQlpZiAoIWVycikKKwkJCXJldHVybiAwOworCisJCWlmIChlcnIgIT0gSFZfRVdPVUxEQkxPQ0spCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3R4X3BhY2tldChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCwKKwkJCSAgdW5zaWduZWQgbG9uZyBuZXdfdGFpbCkKK3sKKwlCVUdfT04ocCAhPSAobHAtPnR4X2Jhc2UgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpKSk7CisKKwlyZXR1cm4gc2V0X3R4X3RhaWwobHAsIG5ld190YWlsKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpoYW5kc2hha2VfY29tcG9zZV9jdHJsKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCQkgdTggc3R5cGUsIHU4IGN0cmwsCisJCQkJCQkgdm9pZCAqZGF0YSwgaW50IGRsZW4sCisJCQkJCQkgdW5zaWduZWQgbG9uZyAqbmV3X3RhaWwpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnAgPSBoYW5kc2hha2VfZ2V0X3R4X3BhY2tldChscCwgbmV3X3RhaWwpOworCisJaWYgKHApIHsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCQlwLT50eXBlID0gTERDX0NUUkw7CisJCXAtPnN0eXBlID0gc3R5cGU7CisJCXAtPmN0cmwgPSBjdHJsOworCQlpZiAoZGF0YSkKKwkJCW1lbWNweShwLT51LnVfZGF0YSwgZGF0YSwgZGxlbik7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IHN0YXJ0X2hhbmRzaGFrZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmVyOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwl2ZXIgPSAmdmVyX2FyclswXTsKKworCWxkY2RiZyhIUywgIlNFTkQgVkVSIElORk8gbWFqWyV1XSBtaW5bJXVdXG4iLAorCSAgICAgICB2ZXItPm1ham9yLCB2ZXItPm1pbm9yKTsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1ZFUlMsCisJCQkJICAgdmVyLCBzaXplb2YoKnZlciksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJaW50IGVyciA9IHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJCWlmICghZXJyKQorCQkJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRVNFVDsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3ZlcnNpb25fbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICB1MTYgbWFqb3IsIHUxNiBtaW5vcikKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwl2ZXIubWFqb3IgPSBtYWpvcjsKKwl2ZXIubWlub3IgPSBtaW5vcjsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfTkFDSywgTERDX1ZFUlMsCisJCQkJICAgJnZlciwgc2l6ZW9mKHZlciksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJbGRjZGJnKEhTLCAiU0VORCBWRVIgTkFDSyBtYWpbJXVdIG1pblsldV1cbiIsCisJCSAgICAgICB2ZXIubWFqb3IsIHZlci5taW5vcik7CisKKwkJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uX2FjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgIHN0cnVjdCBsZGNfdmVyc2lvbiAqdnApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfQUNLLCBMRENfVkVSUywKKwkJCQkgICB2cCwgc2l6ZW9mKCp2cCksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJbGRjZGJnKEhTLCAiU0VORCBWRVIgQUNLIG1halsldV0gbWluWyV1XVxuIiwKKwkJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3J0cyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19SVFMsIE5VTEwsIDAsCisJCQkJICAgJm5ld190YWlsKTsKKwlpZiAocCkgeworCQlwLT5lbnYgPSBscC0+Y2ZnLm1vZGU7CisJCXAtPnNlcWlkID0gMDsKKwkJbHAtPnJjdl9ueHQgPSAwOworCisJCWxkY2RiZyhIUywgIlNFTkQgUlRTIGVudlsweCV4XSBzZXFpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfcnRyKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1JUUiwgTlVMTCwgMCwKKwkJCQkgICAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCXAtPmVudiA9IGxwLT5jZmcubW9kZTsKKwkJcC0+c2VxaWQgPSAwOworCisJCWxkY2RiZyhIUywgIlNFTkQgUlRSIGVudlsweCV4XSBzZXFpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfcmR4KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1JEWCwgTlVMTCwgMCwKKwkJCQkgICAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCXAtPmVudiA9IDA7CisJCXAtPnNlcWlkID0gKytscC0+c25kX254dDsKKwkJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwkJbGRjZGJnKEhTLCAiU0VORCBSRFggZW52WzB4JXhdIHNlcWlkWzB4JXhdIGFja2lkWzB4JXhdXG4iLAorCQkgICAgICAgcC0+ZW52LCBwLT5zZXFpZCwgcC0+dS5yLmFja2lkKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX2RhdGFfbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3BhY2tldCAqZGF0YV9wa3QpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKwlpbnQgZXJyOworCisJcCA9IGRhdGFfZ2V0X3R4X3BhY2tldChscCwgJm5ld190YWlsKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUJVU1k7CisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXAtPnR5cGUgPSBkYXRhX3BrdC0+dHlwZTsKKwlwLT5zdHlwZSA9IExEQ19OQUNLOworCXAtPmN0cmwgPSBkYXRhX3BrdC0+Y3RybCAmIExEQ19DVFJMX01TSzsKKwlwLT5zZXFpZCA9IGxwLT5zbmRfbnh0ICsgMTsKKwlwLT51LnIuYWNraWQgPSBscC0+cmN2X254dDsKKworCWxkY2RiZyhIUywgIlNFTkQgREFUQSBOQUNLIHR5cGVbMHgleF0gY3RsWzB4JXhdIHNlcVsweCV4XSBhY2tbMHgleF1cbiIsCisJICAgICAgIHAtPnR5cGUsIHAtPmN0cmwsIHAtPnNlcWlkLCBwLT51LnIuYWNraWQpOworCisJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwlpZiAoIWVycikKKwkJbHAtPnNuZF9ueHQrKzsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbGRjX2Fib3J0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwlsZGNkYmcoU1RBVEUsICJBQk9SVFxuIik7CisKKwkvKiBXZSByZXBvcnQgYnV0IGRvIG5vdCBhY3QgdXBvbiB0aGUgaHlwZXJ2aXNvciBlcnJvcnMgYmVjYXVzZQorCSAqIHRoZXJlIHJlYWxseSBpc24ndCBtdWNoIHdlIGNhbiBkbyBpZiB0aGV5IGZhaWwgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2Fib3J0OiAiCisJCSAgICAgICAic3VuNHZfbGRjX3R4X3Fjb25mKCVseCwlbHgsJWx4KSBmYWlsZWQsIGVycj0lbHVcbiIsCisJCSAgICAgICBscC0+aWQsIGxwLT50eF9yYSwgbHAtPnR4X251bV9lbnRyaWVzLCBodl9lcnIpOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+dHhfaGVhZCwKKwkJCQkJJmxwLT50eF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY190eF9nZXRfc3RhdGUoJWx4LC4uLikgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBodl9lcnIpOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY19yeF9xY29uZiglbHgsJWx4LCVseCkgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBscC0+cnhfcmEsIGxwLT5yeF9udW1fZW50cmllcywgaHZfZXJyKTsKKworCS8qIFJlZmV0Y2ggdGhlIFJYIHF1ZXVlIHN0YXRlIGFzIHdlbGwsIGJlY2F1c2Ugd2UgY291bGQgYmUgaW52b2tlZAorCSAqIGhlcmUgaW4gdGhlIHF1ZXVlIHByb2Nlc3NpbmcgY29udGV4dC4KKwkgKi8KKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKGh2X2VycikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2Fib3J0OiAiCisJCSAgICAgICAic3VuNHZfbGRjX3J4X2dldF9zdGF0ZSglbHgsLi4uKSBmYWlsZWQsIGVycj0lbHVcbiIsCisJCSAgICAgICBscC0+aWQsIGh2X2Vycik7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX3ZlcnNpb24gKmZpbmRfYnlfbWFqb3IodTE2IG1ham9yKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqcmV0ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZlcl9hcnIpOyBpKyspIHsKKwkJc3RydWN0IGxkY192ZXJzaW9uICp2ID0gJnZlcl9hcnJbaV07CisJCWlmICh2LT5tYWpvciA8PSBtYWpvcikgeworCQkJcmV0ID0gdjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc192ZXJfaW5mbyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZwKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmFwOworCWludCBlcnI7CisKKwlsZGNkYmcoSFMsICJHT1QgVkVSU0lPTiBJTkZPIG1ham9yWyV4XSBtaW5vclsleF1cbiIsCisJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCWlmIChscC0+aHNfc3RhdGUgPT0gTERDX0hTX0dPVFZFUlMpIHsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJCW1lbXNldCgmbHAtPnZlciwgMCwgc2l6ZW9mKGxwLT52ZXIpKTsKKwl9CisKKwl2YXAgPSBmaW5kX2J5X21ham9yKHZwLT5tYWpvcik7CisJaWYgKCF2YXApIHsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX25hY2sobHAsIDAsIDApOworCX0gZWxzZSBpZiAodmFwLT5tYWpvciAhPSB2cC0+bWFqb3IpIHsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX25hY2sobHAsIHZhcC0+bWFqb3IsIHZhcC0+bWlub3IpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsZGNfdmVyc2lvbiB2ZXIgPSAqdnA7CisJCWlmICh2ZXIubWlub3IgPiB2YXAtPm1pbm9yKQorCQkJdmVyLm1pbm9yID0gdmFwLT5taW5vcjsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX2FjayhscCwgJnZlcik7CisJCWlmICghZXJyKSB7CisJCQlscC0+dmVyID0gdmVyOworCQkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0dPVFZFUlM7CisJCX0KKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Zlcl9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlsZGNkYmcoSFMsICJHT1QgVkVSU0lPTiBBQ0sgbWFqb3JbJXhdIG1pbm9yWyV4XVxuIiwKKwkgICAgICAgdnAtPm1ham9yLCB2cC0+bWlub3IpOworCisJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfR09UVkVSUykgeworCQlpZiAobHAtPnZlci5tYWpvciAhPSB2cC0+bWFqb3IgfHwKKwkJICAgIGxwLT52ZXIubWlub3IgIT0gdnAtPm1pbm9yKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfSBlbHNlIHsKKwkJbHAtPnZlciA9ICp2cDsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0dPVFZFUlM7CisJfQorCWlmIChzZW5kX3J0cyhscCkpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZhcDsKKworCWlmICgodnAtPm1ham9yID09IDAgJiYgdnAtPm1pbm9yID09IDApIHx8CisJICAgICEodmFwID0gZmluZF9ieV9tYWpvcih2cC0+bWFqb3IpKSkgeworCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwkJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCQlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19WRVJTLAorCQkJCQkgICB2YXAsIHNpemVvZigqdmFwKSwKKwkJCQkJICAgJm5ld190YWlsKTsKKwkJaWYgKHApCisJCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwkJZWxzZQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyc2lvbihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJc3RydWN0IGxkY192ZXJzaW9uICp2cDsKKworCXZwID0gKHN0cnVjdCBsZGNfdmVyc2lvbiAqKSBwLT51LnVfZGF0YTsKKworCXN3aXRjaCAocC0+c3R5cGUpIHsKKwljYXNlIExEQ19JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfaW5mbyhscCwgdnApOworCisJY2FzZSBMRENfQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfYWNrKGxwLCB2cCk7CisKKwljYXNlIExEQ19OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfbmFjayhscCwgdnApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcnRzKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgICAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCkKK3sKKwlsZGNkYmcoSFMsICJHT1QgUlRTIHN0eXBlWyV4XSBzZXFpZFsleF0gZW52WyV4XVxuIiwKKwkgICAgICAgcC0+c3R5cGUsIHAtPnNlcWlkLCBwLT5lbnYpOworCisJaWYgKHAtPnN0eXBlICAgICAhPSBMRENfSU5GTwkgICB8fAorCSAgICBscC0+aHNfc3RhdGUgIT0gTERDX0hTX0dPVFZFUlMgfHwKKwkgICAgcC0+ZW52ICAgICAgICE9IGxwLT5jZmcubW9kZSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+c25kX254dCA9IHAtPnNlcWlkOworCWxwLT5yY3Zfbnh0ID0gcC0+c2VxaWQ7CisJbHAtPmhzX3N0YXRlID0gTERDX0hTX1NFTlRSVFI7CisJaWYgKHNlbmRfcnRyKGxwKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3J0cihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJUUiBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF1cbiIsCisJICAgICAgIHAtPnN0eXBlLCBwLT5zZXFpZCwgcC0+ZW52KTsKKworCWlmIChwLT5zdHlwZSAgICAgIT0gTERDX0lORk8gfHwKKwkgICAgcC0+ZW52ICAgICAgICE9IGxwLT5jZmcubW9kZSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+c25kX254dCA9IHAtPnNlcWlkOworCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKwlzZW5kX3JkeChscCk7CisKKwlyZXR1cm4gTERDX0VWRU5UX1VQOworfQorCitzdGF0aWMgaW50IHJ4X3NlcV9vayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1MzIgc2VxaWQpCit7CisJcmV0dXJuIGxwLT5yY3Zfbnh0ICsgMSA9PSBzZXFpZDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJEWCBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF0gYWNraWRbJXhdXG4iLAorCSAgICAgICBwLT5zdHlwZSwgcC0+c2VxaWQsIHAtPmVudiwgcC0+dS5yLmFja2lkKTsKKworCWlmIChwLT5zdHlwZSAhPSBMRENfSU5GTyB8fAorCSAgICAhKHJ4X3NlcV9vayhscCwgcC0+c2VxaWQpKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+cmN2X254dCA9IHAtPnNlcWlkOworCisJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NPTVBMRVRFOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9DT05ORUNURUQpOworCisJcmV0dXJuIExEQ19FVkVOVF9VUDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NvbnRyb2xfZnJhbWUoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJc3dpdGNoIChwLT5jdHJsKSB7CisJY2FzZSBMRENfVkVSUzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyc2lvbihscCwgcCk7CisKKwljYXNlIExEQ19SVFM6CisJCXJldHVybiBwcm9jZXNzX3J0cyhscCwgcCk7CisKKwljYXNlIExEQ19SVFI6CisJCXJldHVybiBwcm9jZXNzX3J0cihscCwgcCk7CisKKwljYXNlIExEQ19SRFg6CisJCXJldHVybiBwcm9jZXNzX3JkeChscCwgcCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19lcnJvcl9mcmFtZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCXJldHVybiBsZGNfYWJvcnQobHApOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZGF0YV9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqYWNrKQoreworCXVuc2lnbmVkIGxvbmcgaGVhZCA9IGxwLT50eF9hY2tlZDsKKwl1MzIgYWNraWQgPSBhY2stPnUuci5hY2tpZDsKKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBsZGNfcGFja2V0ICpwID0gbHAtPnR4X2Jhc2UgKyAoaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisKKwkJaGVhZCA9IHR4X2FkdmFuY2UobHAsIGhlYWQpOworCisJCWlmIChwLT5zZXFpZCA9PSBhY2tpZCkgeworCQkJbHAtPnR4X2Fja2VkID0gaGVhZDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChoZWFkID09IGxwLT50eF90YWlsKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZXZlbnRzKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBldmVudF9tYXNrKQoreworCWlmIChldmVudF9tYXNrICYgTERDX0VWRU5UX1JFU0VUKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9SRVNFVCk7CisJaWYgKGV2ZW50X21hc2sgJiBMRENfRVZFTlRfVVApCisJCWxwLT5jZmcuZXZlbnQobHAtPmV2ZW50X2FyZywgTERDX0VWRU5UX1VQKTsKKwlpZiAoZXZlbnRfbWFzayAmIExEQ19FVkVOVF9EQVRBX1JFQURZKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9EQVRBX1JFQURZKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxkY19yeChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIG9yaWdfc3RhdGUsIGh2X2VyciwgZmxhZ3M7CisJdW5zaWduZWQgaW50IGV2ZW50X21hc2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisKKwlsZGNkYmcoUlgsICJSWCBzdGF0ZVsweCUwMmx4OjB4JTAybHhdIGhlYWRbMHglMDRseF0gdGFpbFsweCUwNGx4XVxuIiwKKwkgICAgICAgb3JpZ19zdGF0ZSwgbHAtPmNoYW5fc3RhdGUsIGxwLT5yeF9oZWFkLCBscC0+cnhfdGFpbCk7CisKKwlldmVudF9tYXNrID0gMDsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfUkFXICYmCisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1VQKSB7CisJCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwkJbGRjX3NldF9zdGF0ZShscCwgTERDX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfVVA7CisKKwkJb3JpZ19zdGF0ZSA9IGxwLT5jaGFuX3N0YXRlOworCX0KKworCS8qIElmIHdlIGFyZSBpbiByZXNldCBzdGF0ZSwgZmx1c2ggdGhlIFJYIHF1ZXVlIGFuZCBpZ25vcmUKKwkgKiBldmVyeXRoaW5nLgorCSAqLworCWlmIChscC0+ZmxhZ3MgJiBMRENfRkxBR19SRVNFVCkgeworCQkodm9pZCkgX19zZXRfcnhfaGVhZChscCwgbHAtPnJ4X3RhaWwpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBPbmNlIHdlIGZpbmlzaCB0aGUgaGFuZHNoYWtlLCB3ZSBsZXQgdGhlIGxkY19yZWFkKCkKKwkgKiBwYXRocyBkbyBhbGwgb2YgdGhlIGNvbnRyb2wgZnJhbWUgYW5kIHN0YXRlIG1hbmFnZW1lbnQuCisJICogSnVzdCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4KKwkgKi8KKwlpZiAobHAtPmhzX3N0YXRlID09IExEQ19IU19DT01QTEVURSkgeworaGFuZHNoYWtlX2NvbXBsZXRlOgorCQlpZiAobHAtPmNoYW5fc3RhdGUgIT0gb3JpZ19zdGF0ZSkgeworCQkJdW5zaWduZWQgaW50IGV2ZW50ID0gTERDX0VWRU5UX1JFU0VUOworCisJCQlpZiAobHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfVVApCisJCQkJZXZlbnQgPSBMRENfRVZFTlRfVVA7CisKKwkJCWV2ZW50X21hc2sgfD0gZXZlbnQ7CisJCX0KKwkJaWYgKGxwLT5yeF9oZWFkICE9IGxwLT5yeF90YWlsKQorCQkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfREFUQV9SRUFEWTsKKworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobHAtPmNoYW5fc3RhdGUgIT0gb3JpZ19zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAobHAtPnJ4X2hlYWQgIT0gbHAtPnJ4X3RhaWwpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJCXVuc2lnbmVkIGxvbmcgbmV3OworCQlpbnQgZXJyOworCisJCXAgPSBscC0+cnhfYmFzZSArIChscC0+cnhfaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisKKwkJc3dpdGNoIChwLT50eXBlKSB7CisJCWNhc2UgTERDX0NUUkw6CisJCQllcnIgPSBwcm9jZXNzX2NvbnRyb2xfZnJhbWUobHAsIHApOworCQkJaWYgKGVyciA+IDApCisJCQkJZXZlbnRfbWFzayB8PSBlcnI7CisJCQlicmVhazsKKworCQljYXNlIExEQ19EQVRBOgorCQkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfREFUQV9SRUFEWTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKworCQljYXNlIExEQ19FUlI6CisJCQllcnIgPSBwcm9jZXNzX2Vycm9yX2ZyYW1lKGxwLCBwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllcnIgPSBsZGNfYWJvcnQobHApOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisJCW5ldyA9IGxwLT5yeF9oZWFkOworCQluZXcgKz0gTERDX1BBQ0tFVF9TSVpFOworCQlpZiAobmV3ID09IChscC0+cnhfbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkUpKQorCQkJbmV3ID0gMDsKKwkJbHAtPnJ4X2hlYWQgPSBuZXc7CisKKwkJZXJyID0gX19zZXRfcnhfaGVhZChscCwgbmV3KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCSh2b2lkKSBsZGNfYWJvcnQobHApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfQ09NUExFVEUpCisJCQlnb3RvIGhhbmRzaGFrZV9jb21wbGV0ZTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJc2VuZF9ldmVudHMobHAsIGV2ZW50X21hc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGRjX3R4KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGh2X2Vyciwgb3JpZ19zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfbWFzayA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT50eF9oZWFkLAorCQkJCQkmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisKKwlsZGNkYmcoVFgsICIgVFggc3RhdGVbMHglMDJseDoweCUwMmx4XSBoZWFkWzB4JTA0bHhdIHRhaWxbMHglMDRseF1cbiIsCisJICAgICAgIG9yaWdfc3RhdGUsIGxwLT5jaGFuX3N0YXRlLCBscC0+dHhfaGVhZCwgbHAtPnR4X3RhaWwpOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcgJiYKKwkgICAgbHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfVVApIHsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NPTVBMRVRFOworCQlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKworCQlldmVudF9tYXNrIHw9IExEQ19FVkVOVF9VUDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJc2VuZF9ldmVudHMobHAsIGV2ZW50X21hc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBYWFggbGRjX2FsbG9jKCkgYW5kIGxkY19mcmVlKCkgbmVlZHMgdG8gcnVuIHVuZGVyIGEgbXV0ZXggc28KKyAqIFhYWCB0aGF0IGFkZGl0aW9uIGFuZCByZW1vdmFsIGZyb20gdGhlIGxkY19jaGFubmVsX2xpc3QgaGFzCisgKiBYWFggYXRvbWljaXR5LCBvdGhlcndpc2UgdGhlIF9fbGRjX2NoYW5uZWxfZXhpc3RzKCkgY2hlY2sgaXMKKyAqIFhYWCB0b3RhbGx5IHBvaW50bGVzcyBhcyBhbm90aGVyIHRocmVhZCBjYW4gc2xpcCBpbnRvIGxkY19hbGxvYygpCisgKiBYWFggYW5kIGFkZCBhIGNoYW5uZWwgd2l0aCB0aGUgc2FtZSBJRC4gIFRoZXJlIGFsc28gbmVlZHMgdG8gYmUKKyAqIFhYWCBhIHNwaW5sb2NrIGZvciBsZGNfY2hhbm5lbF9saXN0LgorICovCitzdGF0aWMgSExJU1RfSEVBRChsZGNfY2hhbm5lbF9saXN0KTsKKworc3RhdGljIGludCBfX2xkY19jaGFubmVsX2V4aXN0cyh1bnNpZ25lZCBsb25nIGlkKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShscCwgbiwgJmxkY19jaGFubmVsX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGxwLT5pZCA9PSBpZCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY19xdWV1ZShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKipiYXNlLCB1bnNpZ25lZCBsb25nICpyYSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIG9yZGVyOworCXZvaWQgKnE7CisKKwlzaXplID0gbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkU7CisJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwlxID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CisJaWYgKCFxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkFsbG9jIG9mICVzIHF1ZXVlIGZhaWxlZCB3aXRoICIKKwkJICAgICAgICJzaXplPSVsdSBvcmRlcj0lbHVcbiIsIG5hbWUsIHNpemUsIG9yZGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHEsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwkqYmFzZSA9IHE7CisJKnJhID0gX19wYShxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgbnVtX2VudHJpZXMsIHN0cnVjdCBsZGNfcGFja2V0ICpxKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgb3JkZXI7CisKKwlpZiAoIXEpCisJCXJldHVybjsKKworCXNpemUgPSBudW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcSwgb3JkZXIpOworfQorCisvKiBYWFggTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS4uLiBYWFggKi8KKyNkZWZpbmUgTERDX0lPVEFCTEVfU0laRQkoOCAqIDEwMjQpCisKK3N0YXRpYyBpbnQgbGRjX2lvbW11X2luaXQoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwl1bnNpZ25lZCBsb25nIHN6LCBudW1fdHNiX2VudHJpZXMsIHRzYnNpemUsIG9yZGVyOworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqdGFibGU7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisJaW50IGVycjsKKworCW51bV90c2JfZW50cmllcyA9IExEQ19JT1RBQkxFX1NJWkU7CisJdHNic2l6ZSA9IG51bV90c2JfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOworCisJc3ogPSBudW1fdHNiX2VudHJpZXMgLyA4OworCXN6ID0gKHN6ICsgN1VMKSAmIH43VUw7CisJaW9tbXUtPmFyZW5hLm1hcCA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghaW9tbXUtPmFyZW5hLm1hcCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBbGxvYyBvZiBhcmVuYSBtYXAgZmFpbGVkLCBzej0lbHVcbiIsIHN6KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW9tbXUtPmFyZW5hLmxpbWl0ID0gbnVtX3RzYl9lbnRyaWVzOworCisJb3JkZXIgPSBnZXRfb3JkZXIodHNic2l6ZSk7CisKKwl0YWJsZSA9IChzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqKQorCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghdGFibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQWxsb2Mgb2YgTVRFIHRhYmxlIGZhaWxlZCwgIgorCQkgICAgICAgInNpemU9JWx1IG9yZGVyPSVsdVxuIiwgdHNic2l6ZSwgb3JkZXIpOworCQlnb3RvIG91dF9mcmVlX21hcDsKKwl9CisKKwltZW1zZXQodGFibGUsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwlpb21tdS0+cGFnZV90YWJsZSA9IHRhYmxlOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3NldF9tYXBfdGFibGUobHAtPmlkLCBfX3BhKHRhYmxlKSwKKwkJCQkJIG51bV90c2JfZW50cmllcyk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9mcmVlX3RhYmxlOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3RhYmxlOgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHRhYmxlLCBvcmRlcik7CisJaW9tbXUtPnBhZ2VfdGFibGUgPSBOVUxMOworCitvdXRfZnJlZV9tYXA6CisJa2ZyZWUoaW9tbXUtPmFyZW5hLm1hcCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IE5VTEw7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBsZGNfaW9tbXVfcmVsZWFzZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwl1bnNpZ25lZCBsb25nIG51bV90c2JfZW50cmllcywgdHNic2l6ZSwgb3JkZXI7CisKKwkodm9pZCkgc3VuNHZfbGRjX3NldF9tYXBfdGFibGUobHAtPmlkLCAwLCAwKTsKKworCW51bV90c2JfZW50cmllcyA9IGlvbW11LT5hcmVuYS5saW1pdDsKKwl0c2JzaXplID0gbnVtX3RzYl9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5KTsKKwlvcmRlciA9IGdldF9vcmRlcih0c2JzaXplKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGlvbW11LT5wYWdlX3RhYmxlLCBvcmRlcik7CisJaW9tbXUtPnBhZ2VfdGFibGUgPSBOVUxMOworCisJa2ZyZWUoaW9tbXUtPmFyZW5hLm1hcCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IE5VTEw7Cit9CisKK3N0cnVjdCBsZGNfY2hhbm5lbCAqbGRjX2FsbG9jKHVuc2lnbmVkIGxvbmcgaWQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnICpjZmdwLAorCQkJICAgICAgdm9pZCAqZXZlbnRfYXJnKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyAqbW9wczsKKwl1bnNpZ25lZCBsb25nIGR1bW15MSwgZHVtbXkyLCBodl9lcnI7CisJdTggbXNzLCAqbXNzYnVmOworCWludCBlcnI7CisKKwllcnIgPSAtRU5PREVWOworCWlmICghbGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWNmZ3ApCisJCWdvdG8gb3V0X2VycjsKKworCXN3aXRjaCAoY2ZncC0+bW9kZSkgeworCWNhc2UgTERDX01PREVfUkFXOgorCQltb3BzID0gJnJhd19vcHM7CisJCW1zcyA9IExEQ19QQUNLRVRfU0laRTsKKwkJYnJlYWs7CisKKwljYXNlIExEQ19NT0RFX1VOUkVMSUFCTEU6CisJCW1vcHMgPSAmbm9ucmF3X29wczsKKwkJbXNzID0gTERDX1BBQ0tFVF9TSVpFIC0gODsKKwkJYnJlYWs7CisKKwljYXNlIExEQ19NT0RFX1NUUkVBTToKKwkJbW9wcyA9ICZzdHJlYW1fb3BzOworCQltc3MgPSBMRENfUEFDS0VUX1NJWkUgLSA4IC0gODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKCFjZmdwLT5ldmVudCB8fCAhZXZlbnRfYXJnIHx8ICFjZmdwLT5yeF9pcnEgfHwgIWNmZ3AtPnR4X2lycSkKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3FpbmZvKGlkLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwllcnIgPSAtRU5PREVWOworCWlmIChodl9lcnIgPT0gSFZfRUNIQU5ORUwpCisJCWdvdG8gb3V0X2VycjsKKworCWVyciA9IC1FRVhJU1Q7CisJaWYgKF9fbGRjX2NoYW5uZWxfZXhpc3RzKGlkKSkKKwkJZ290byBvdXRfZXJyOworCisJbXNzYnVmID0gTlVMTDsKKworCWxwID0ga3phbGxvYyhzaXplb2YoKmxwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWxwKQorCQlnb3RvIG91dF9lcnI7CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJbHAtPmlkID0gaWQ7CisKKwllcnIgPSBsZGNfaW9tbXVfaW5pdChscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9sZGM7CisKKwlscC0+bW9wcyA9IG1vcHM7CisJbHAtPm1zcyA9IG1zczsKKworCWxwLT5jZmcgPSAqY2ZncDsKKwlpZiAoIWxwLT5jZmcubXR1KQorCQlscC0+Y2ZnLm10dSA9IExEQ19ERUZBVUxUX01UVTsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfU1RSRUFNKSB7CisJCW1zc2J1ZiA9IGt6YWxsb2MobHAtPmNmZy5tdHUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1zc2J1ZikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfaW9tbXU7CisJCX0KKwkJbHAtPm1zc2J1ZiA9IG1zc2J1ZjsKKwl9CisKKwlscC0+ZXZlbnRfYXJnID0gZXZlbnRfYXJnOworCisJLyogWFhYIGFsbG93IHNldHRpbmcgdmlhIGxkY19jaGFubmVsX2NvbmZpZyB0byBvdmVycmlkZSBkZWZhdWx0cworCSAqIFhYWCBvciB1c2Ugc29tZSBmb3JtdWxhIGJhc2VkIHVwb24gbXR1CisJICovCisJbHAtPnR4X251bV9lbnRyaWVzID0gTERDX0RFRkFVTFRfTlVNX0VOVFJJRVM7CisJbHAtPnJ4X251bV9lbnRyaWVzID0gTERDX0RFRkFVTFRfTlVNX0VOVFJJRVM7CisKKwllcnIgPSBhbGxvY19xdWV1ZSgiVFgiLCBscC0+dHhfbnVtX2VudHJpZXMsCisJCQkgICZscC0+dHhfYmFzZSwgJmxwLT50eF9yYSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9tc3NidWY7CisKKwllcnIgPSBhbGxvY19xdWV1ZSgiUlgiLCBscC0+cnhfbnVtX2VudHJpZXMsCisJCQkgICZscC0+cnhfYmFzZSwgJmxwLT5yeF9yYSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV90eHE7CisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVM7CisKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfQ0xPU0VEOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9JTklUKTsKKworCUlOSVRfSExJU1RfTk9ERSgmbHAtPmxpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZscC0+bGlzdCwgJmxkY19jaGFubmVsX2xpc3QpOworCisJSU5JVF9ITElTVF9IRUFEKCZscC0+bWhfbGlzdCk7CisKKwlyZXR1cm4gbHA7CisKK291dF9mcmVlX3R4cToKKwlmcmVlX3F1ZXVlKGxwLT50eF9udW1fZW50cmllcywgbHAtPnR4X2Jhc2UpOworCitvdXRfZnJlZV9tc3NidWY6CisJaWYgKG1zc2J1ZikKKwkJa2ZyZWUobXNzYnVmKTsKKworb3V0X2ZyZWVfaW9tbXU6CisJbGRjX2lvbW11X3JlbGVhc2UobHApOworCitvdXRfZnJlZV9sZGM6CisJa2ZyZWUobHApOworCitvdXRfZXJyOgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19hbGxvYyk7CisKK3ZvaWQgbGRjX2ZyZWUoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlpZiAobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTKSB7CisJCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisJCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisJfQorCisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTKSB7CisJCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCQlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwkJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUzsKKwl9CisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTKSB7CisJCWZyZWVfcXVldWUobHAtPnR4X251bV9lbnRyaWVzLCBscC0+dHhfYmFzZSk7CisJCWZyZWVfcXVldWUobHAtPnJ4X251bV9lbnRyaWVzLCBscC0+cnhfYmFzZSk7CisJCWxwLT5mbGFncyAmPSB+TERDX0ZMQUdfQUxMT0NFRF9RVUVVRVM7CisJfQorCisJaGxpc3RfZGVsKCZscC0+bGlzdCk7CisKKwlpZiAobHAtPm1zc2J1ZikKKwkJa2ZyZWUobHAtPm1zc2J1Zik7CisKKwlsZGNfaW9tbXVfcmVsZWFzZShscCk7CisKKwlrZnJlZShscCk7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19mcmVlKTsKKworLyogQmluZCB0aGUgY2hhbm5lbC4gIFRoaXMgcmVnaXN0ZXJzIHRoZSBMREMgcXVldWVzIHdpdGgKKyAqIHRoZSBoeXBlcnZpc29yIGFuZCBwdXRzIHRoZSBjaGFubmVsIGludG8gYSBwc2V1ZG8tbGlzdGVuaW5nCisgKiBzdGF0ZS4gIFRoaXMgZG9lcyBub3QgaW5pdGlhdGUgYSBoYW5kc2hha2UsIGxkY19jb25uZWN0KCkgZG9lcworICogdGhhdC4KKyAqLworaW50IGxkY19iaW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnIsIGZsYWdzOworCWludCBlcnIgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIW5hbWUpCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChscC0+c3RhdGUgIT0gTERDX1NUQVRFX0lOSVQpCisJCWdvdG8gb3V0X2VycjsKKworCXNucHJpbnRmKGxwLT5yeF9pcnFfbmFtZSwgTERDX0lSUV9OQU1FX01BWCwgIiVzIFJYIiwgbmFtZSk7CisJc25wcmludGYobHAtPnR4X2lycV9uYW1lLCBMRENfSVJRX05BTUVfTUFYLCAiJXMgVFgiLCBuYW1lKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGxwLT5jZmcucnhfaXJxLCBsZGNfcngsCisJCQkgIElSUUZfU0FNUExFX1JBTkRPTSB8IElSUUZfU0hBUkVELAorCQkJICBscC0+cnhfaXJxX25hbWUsIGxwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSByZXF1ZXN0X2lycShscC0+Y2ZnLnR4X2lycSwgbGRjX3R4LAorCQkJICBJUlFGX1NBTVBMRV9SQU5ET00gfCBJUlFGX1NIQVJFRCwKKwkJCSAgbHAtPnR4X2lycV9uYW1lLCBscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9yeF9pcnE7CisKKworCWxwLT5mbGFncyB8PSBMRENfRkxBR19SRUdJU1RFUkVEX0lSUVM7CisKKwllcnIgPSAtRU5PREVWOworCWh2X2VyciA9IHN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhfaXJxOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3Fjb25mKGxwLT5pZCwgbHAtPnR4X3JhLCBscC0+dHhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhfaXJxOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfdW5tYXBfdHg7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCBscC0+cnhfcmEsIGxwLT5yeF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfdW5tYXBfdHg7CisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVM7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT50eF9oZWFkLAorCQkJCQkmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJZXJyID0gLUVCVVNZOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X3VubWFwX3J4OworCisJbHAtPnR4X2Fja2VkID0gbHAtPnR4X2hlYWQ7CisKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfT1BFTjsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQk9VTkQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXBfcng6CisJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUzsKKwlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKworb3V0X3VubWFwX3R4OgorCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCitvdXRfZnJlZV90eF9pcnE6CisJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX0lSUVM7CisJZnJlZV9pcnEobHAtPmNmZy50eF9pcnEsIGxwKTsKKworb3V0X2ZyZWVfcnhfaXJxOgorCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisKK291dF9lcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19iaW5kKTsKKworaW50IGxkY19jb25uZWN0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIShscC0+ZmxhZ3MgJiBMRENfRkxBR19BTExPQ0VEX1FVRVVFUykgfHwKKwkgICAgIShscC0+ZmxhZ3MgJiBMRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUykgfHwKKwkgICAgbHAtPmhzX3N0YXRlICE9IExEQ19IU19PUEVOKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UKKwkJZXJyID0gc3RhcnRfaGFuZHNoYWtlKGxwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfY29ubmVjdCk7CisKK2ludCBsZGNfZGlzY29ubmVjdChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEobHAtPmZsYWdzICYgTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVMpIHx8CisJICAgICEobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJZXJyID0gLUVOT0RFVjsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9CT1VORCk7CisJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJbHAtPmZsYWdzIHw9IExEQ19GTEFHX1JFU0VUOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCXN1bjR2X2xkY19yeF9xY29uZihscC0+aWQsIDAsIDApOworCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisJZnJlZV9pcnEobHAtPmNmZy5yeF9pcnEsIGxwKTsKKwlscC0+ZmxhZ3MgJj0gfihMRENfRkxBR19SRUdJU1RFUkVEX0lSUVMgfAorCQkgICAgICAgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9JTklUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfZGlzY29ubmVjdCk7CisKK2ludCBsZGNfc3RhdGUoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlyZXR1cm4gbHAtPnN0YXRlOworfQorRVhQT1JUX1NZTUJPTChsZGNfc3RhdGUpOworCitzdGF0aWMgaW50IHdyaXRlX3JhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisJaW50IGVycjsKKworCWlmIChzaXplID4gTERDX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJcCA9IGRhdGFfZ2V0X3R4X3BhY2tldChscCwgJm5ld190YWlsKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUFHQUlOOworCisJbWVtY3B5KHAsIGJ1Ziwgc2l6ZSk7CisKKwllcnIgPSBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCWlmICghZXJyKQorCQllcnIgPSBzaXplOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZWFkX3JhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBuZXc7CisJaW50IGVycjsKKworCWlmIChzaXplIDwgTERDX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9nZXRfc3RhdGUobHAtPmlkLAorCQkJCQkmbHAtPnJ4X2hlYWQsCisJCQkJCSZscC0+cnhfdGFpbCwKKwkJCQkJJmxwLT5jaGFuX3N0YXRlKTsKKwlpZiAoaHZfZXJyKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmIChscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9ET1dOIHx8CisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCisJaWYgKGxwLT5yeF9oZWFkID09IGxwLT5yeF90YWlsKQorCQlyZXR1cm4gMDsKKworCXAgPSBscC0+cnhfYmFzZSArIChscC0+cnhfaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisJbWVtY3B5KGJ1ZiwgcCwgTERDX1BBQ0tFVF9TSVpFKTsKKworCW5ldyA9IHJ4X2FkdmFuY2UobHAsIGxwLT5yeF9oZWFkKTsKKwlscC0+cnhfaGVhZCA9IG5ldzsKKworCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIG5ldyk7CisJaWYgKGVyciA8IDApCisJCWVyciA9IC1FQ09OTlJFU0VUOworCWVsc2UKKwkJZXJyID0gTERDX1BBQ0tFVF9TSVpFOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgcmF3X29wcyA9IHsKKwkud3JpdGUJCT0Jd3JpdGVfcmF3LAorCS5yZWFkCQk9CXJlYWRfcmF3LAorfTsKKworc3RhdGljIGludCB3cml0ZV9ub25yYXcoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnIsIHRhaWw7CisJdW5zaWduZWQgaW50IGNvcGllZDsKKwl1MzIgc2VxOworCWludCBlcnI7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwgJmxwLT50eF9oZWFkLCAmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKHVubGlrZWx5KGh2X2VycikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAodW5saWtlbHkobHAtPmNoYW5fc3RhdGUgIT0gTERDX0NIQU5ORUxfVVApKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmICghdHhfaGFzX3NwYWNlX2ZvcihscCwgc2l6ZSkpCisJCXJldHVybiAtRUFHQUlOOworCisJc2VxID0gbHAtPnNuZF9ueHQ7CisJY29waWVkID0gMDsKKwl0YWlsID0gbHAtPnR4X3RhaWw7CisJd2hpbGUgKGNvcGllZCA8IHNpemUpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnAgPSBscC0+dHhfYmFzZSArICh0YWlsIC8gTERDX1BBQ0tFVF9TSVpFKTsKKwkJdTggKmRhdGEgPSAoKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9VTlJFTElBQkxFKSA/CisJCQkgICAgcC0+dS51X2RhdGEgOgorCQkJICAgIHAtPnUuci5yX2RhdGEpOworCQlpbnQgZGF0YV9sZW47CisKKwkJcC0+dHlwZSA9IExEQ19EQVRBOworCQlwLT5zdHlwZSA9IExEQ19JTkZPOworCQlwLT5jdHJsID0gMDsKKworCQlkYXRhX2xlbiA9IHNpemUgLSBjb3BpZWQ7CisJCWlmIChkYXRhX2xlbiA+IGxwLT5tc3MpCisJCQlkYXRhX2xlbiA9IGxwLT5tc3M7CisKKwkJQlVHX09OKGRhdGFfbGVuID4gTERDX0xFTik7CisKKwkJcC0+ZW52ID0gKGRhdGFfbGVuIHwKKwkJCSAgKGNvcGllZCA9PSAwID8gTERDX1NUQVJUIDogMCkgfAorCQkJICAoZGF0YV9sZW4gPT0gc2l6ZSAtIGNvcGllZCA/IExEQ19TVE9QIDogMCkpOworCisJCXAtPnNlcWlkID0gKytzZXE7CisKKwkJbGRjZGJnKERBVEEsICJTRU5UIERBVEEgWyUwMng6JTAyeDolMDJ4OiUwMng6JTA4eF1cbiIsCisJCSAgICAgICBwLT50eXBlLAorCQkgICAgICAgcC0+c3R5cGUsCisJCSAgICAgICBwLT5jdHJsLAorCQkgICAgICAgcC0+ZW52LAorCQkgICAgICAgcC0+c2VxaWQpOworCisJCW1lbWNweShkYXRhLCBidWYsIGRhdGFfbGVuKTsKKwkJYnVmICs9IGRhdGFfbGVuOworCQljb3BpZWQgKz0gZGF0YV9sZW47CisKKwkJdGFpbCA9IHR4X2FkdmFuY2UobHAsIHRhaWwpOworCX0KKworCWVyciA9IHNldF90eF90YWlsKGxwLCB0YWlsKTsKKwlpZiAoIWVycikgeworCQlscC0+c25kX254dCA9IHNlcTsKKwkJZXJyID0gc2l6ZTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJ4X2JhZF9zZXEoc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY19wYWNrZXQgKnAsCisJCSAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpmaXJzdF9mcmFnKQoreworCWludCBlcnI7CisKKwlpZiAoZmlyc3RfZnJhZykKKwkJbHAtPnJjdl9ueHQgPSBmaXJzdF9mcmFnLT5zZXFpZCAtIDE7CisKKwllcnIgPSBzZW5kX2RhdGFfbmFjayhscCwgcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIGxwLT5yeF90YWlsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXRhX2Fja19uYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCWlmIChwLT5zdHlwZSAmIExEQ19BQ0spIHsKKwkJaW50IGVyciA9IHByb2Nlc3NfZGF0YV9hY2sobHAsIHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHAtPnN0eXBlICYgTERDX05BQ0spCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZGF0YV93YWl0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgY3VyX2hlYWQpCit7CisJdW5zaWduZWQgbG9uZyBkdW1teTsKKwlpbnQgbGltaXQgPSAxMDAwOworCisJbGRjZGJnKERBVEEsICJEQVRBIFdBSVQgY3VyX2hlYWRbJWx4XSByeF9oZWFkWyVseF0gcnhfdGFpbFslbHhdXG4iLAorCSAgICAgICBjdXJfaGVhZCwgbHAtPnJ4X2hlYWQsIGxwLT5yeF90YWlsKTsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwkJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCQkmZHVtbXksCisJCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCQlpZiAoaHZfZXJyKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwkJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX0RPV04gfHwKKwkJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJCXJldHVybiAtRUNPTk5SRVNFVDsKKworCQlpZiAoY3VyX2hlYWQgIT0gbHAtPnJ4X3RhaWwpIHsKKwkJCWxkY2RiZyhEQVRBLCAiREFUQSBXQUlUIERPTkUgIgorCQkJICAgICAgICJoZWFkWyVseF0gdGFpbFslbHhdIGNoYW5fc3RhdGVbJWx4XVxuIiwKKwkJCSAgICAgICBkdW1teSwgbHAtPnJ4X3RhaWwsIGxwLT5jaGFuX3N0YXRlKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdWRlbGF5KDEpOworCX0KKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGludCByeF9zZXRfaGVhZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJaW50IGVyciA9IF9fc2V0X3J4X2hlYWQobHAsIGhlYWQpOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJbHAtPnJ4X2hlYWQgPSBoZWFkOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2RhdGFfYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKworCXAgPSBkYXRhX2dldF90eF9wYWNrZXQobHAsICZuZXdfdGFpbCk7CisJaWYgKGxpa2VseShwKSkgeworCQlpbnQgZXJyOworCisJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwkJcC0+dHlwZSA9IExEQ19EQVRBOworCQlwLT5zdHlwZSA9IExEQ19BQ0s7CisJCXAtPmN0cmwgPSAwOworCQlwLT5zZXFpZCA9IGxwLT5zbmRfbnh0ICsgMTsKKwkJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwkJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwkJaWYgKCFlcnIpCisJCQlscC0+c25kX254dCsrOworCX0KK30KKworc3RhdGljIGludCByZWFkX25vbnJhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpmaXJzdF9mcmFnOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBuZXc7CisJaW50IGVyciwgY29waWVkOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+cnhfaGVhZCwKKwkJCQkJJmxwLT5yeF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX0RPV04gfHwKKwkgICAgbHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfUkVTRVRUSU5HKQorCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisKKwlpZiAobHAtPnJ4X2hlYWQgPT0gbHAtPnJ4X3RhaWwpCisJCXJldHVybiAwOworCisJZmlyc3RfZnJhZyA9IE5VTEw7CisJY29waWVkID0gZXJyID0gMDsKKwluZXcgPSBscC0+cnhfaGVhZDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwkJaW50IHBrdF9sZW47CisKKwkJQlVHX09OKG5ldyA9PSBscC0+cnhfdGFpbCk7CisJCXAgPSBscC0+cnhfYmFzZSArIChuZXcgLyBMRENfUEFDS0VUX1NJWkUpOworCisJCWxkY2RiZyhSWCwgIlJYIHJlYWQgcGt0WyUwMng6JTAyeDolMDJ4OiUwMng6JTA4eDolMDh4XSAiCisJCSAgICAgICAicmN2X254dFslMDh4XVxuIiwKKwkJICAgICAgIHAtPnR5cGUsCisJCSAgICAgICBwLT5zdHlwZSwKKwkJICAgICAgIHAtPmN0cmwsCisJCSAgICAgICBwLT5lbnYsCisJCSAgICAgICBwLT5zZXFpZCwKKwkJICAgICAgIHAtPnUuci5hY2tpZCwKKwkJICAgICAgIGxwLT5yY3Zfbnh0KTsKKworCQlpZiAodW5saWtlbHkoIXJ4X3NlcV9vayhscCwgcC0+c2VxaWQpKSkgeworCQkJZXJyID0gcnhfYmFkX3NlcShscCwgcCwgZmlyc3RfZnJhZyk7CisJCQljb3BpZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocC0+dHlwZSAmIExEQ19DVFJMKSB7CisJCQllcnIgPSBwcm9jZXNzX2NvbnRyb2xfZnJhbWUobHAsIHApOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQllcnIgPSAwOworCQl9CisKKwkJbHAtPnJjdl9ueHQgPSBwLT5zZXFpZDsKKworCQlpZiAoIShwLT50eXBlICYgTERDX0RBVEEpKSB7CisJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCQkJZ290byBub19kYXRhOworCQl9CisJCWlmIChwLT5zdHlwZSAmIChMRENfQUNLIHwgTERDX05BQ0spKSB7CisJCQllcnIgPSBkYXRhX2Fja19uYWNrKGxwLCBwKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEocC0+c3R5cGUgJiBMRENfSU5GTykpIHsKKwkJCW5ldyA9IHJ4X2FkdmFuY2UobHAsIG5ldyk7CisJCQllcnIgPSByeF9zZXRfaGVhZChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCQlnb3RvIG5vX2RhdGE7CisJCX0KKworCQlwa3RfbGVuID0gcC0+ZW52ICYgTERDX0xFTjsKKworCQkvKiBFdmVyeSBpbml0aWFsIHBhY2tldCBzdGFydHMgd2l0aCB0aGUgU1RBUlQgYml0IHNldC4KKwkJICoKKwkJICogU2luZ2xldG9uIHBhY2tldHMgd2lsbCBoYXZlIGJvdGggU1RBUlQrU1RPUCBzZXQuCisJCSAqCisJCSAqIEZyYWdtZW50cyB3aWxsIGhhdmUgU1RBUlQgc2V0IGluIHRoZSBmaXJzdCBmcmFtZSwgU1RPUAorCQkgKiBzZXQgaW4gdGhlIGxhc3QgZnJhbWUsIGFuZCBuZWl0aGVyIGJpdCBzZXQgaW4gbWlkZGxlCisJCSAqIGZyYW1lcyBvZiB0aGUgcGFja2V0LgorCQkgKgorCQkgKiBUaGVyZWZvcmUgaWYgd2UgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBwYWNrZXQgYW5kCisJCSAqIHdlIGRvbid0IHNlZSBTVEFSVCwgb3Igd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBmcmFnbWVudGVkCisJCSAqIHBhY2tldCBhbmQgZG8gc2VlIFNUQVJULCB3ZSBhcmUgdW5zeW5jaHJvbml6ZWQgYW5kIHNob3VsZAorCQkgKiBmbHVzaCB0aGUgUlggcXVldWUuCisJCSAqLworCQlpZiAoKGZpcnN0X2ZyYWcgPT0gTlVMTCAmJiAhKHAtPmVudiAmIExEQ19TVEFSVCkpIHx8CisJCSAgICAoZmlyc3RfZnJhZyAhPSBOVUxMICYmICAocC0+ZW52ICYgTERDX1NUQVJUKSkpIHsKKwkJCWlmICghZmlyc3RfZnJhZykKKwkJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCisJCQllcnIgPSByeF9zZXRfaGVhZChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisKKwkJCWlmICghZmlyc3RfZnJhZykKKwkJCQlnb3RvIG5vX2RhdGE7CisJCX0KKwkJaWYgKCFmaXJzdF9mcmFnKQorCQkJZmlyc3RfZnJhZyA9IHA7CisKKwkJaWYgKHBrdF9sZW4gPiBzaXplIC0gY29waWVkKSB7CisJCQkvKiBVc2VyIGRpZG4ndCBnaXZlIHVzIGEgYmlnIGVub3VnaCBidWZmZXIsCisJCQkgKiB3aGF0IHRvIGRvPyAgVGhpcyBpcyBhIHByZXR0eSBzZXJpb3VzIGVycm9yLgorCQkJICoKKwkJCSAqIFNpbmNlIHdlIGhhdmVuJ3QgdXBkYXRlZCB0aGUgUlggcmluZyBoZWFkIHRvCisJCQkgKiBjb25zdW1lIGFueSBvZiB0aGUgcGFja2V0cywgc2lnbmFsIHRoZSBlcnJvcgorCQkJICogdG8gdGhlIHVzZXIgYW5kIGp1c3QgbGVhdmUgdGhlIFJYIHJpbmcgYWxvbmUuCisJCQkgKgorCQkJICogVGhpcyBzZWVtcyB0aGUgYmVzdCBiZWhhdmlvciBiZWNhdXNlIHRoaXMgYWxsb3dzCisJCQkgKiBhIHVzZXIgb2YgdGhlIExEQyBsYXllciB0byBzdGFydCB3aXRoIGEgc21hbGwKKwkJCSAqIFJYIGJ1ZmZlciBmb3IgbGRjX3JlYWQoKSBjYWxscyBhbmQgdXNlIC1FTVNHU0laRQorCQkJICogYXMgYSBjdWUgdG8gZW5sYXJnZSBpdCdzIHJlYWQgYnVmZmVyLgorCQkJICovCisJCQllcnIgPSAtRU1TR1NJWkU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9rLCB3ZSBhcmUgZ29ubmEgZWF0IHRoaXMgb25lLiAgKi8KKwkJbmV3ID0gcnhfYWR2YW5jZShscCwgbmV3KTsKKworCQltZW1jcHkoYnVmLAorCQkgICAgICAgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9VTlJFTElBQkxFID8KKwkJCXAtPnUudV9kYXRhIDogcC0+dS5yLnJfZGF0YSksIHBrdF9sZW4pOworCQlidWYgKz0gcGt0X2xlbjsKKwkJY29waWVkICs9IHBrdF9sZW47CisKKwkJaWYgKHAtPmVudiAmIExEQ19TVE9QKQorCQkJYnJlYWs7CisKK25vX2RhdGE6CisJCWlmIChuZXcgPT0gbHAtPnJ4X3RhaWwpIHsKKwkJCWVyciA9IHJ4X2RhdGFfd2FpdChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWVycikKKwkJZXJyID0gcnhfc2V0X2hlYWQobHAsIG5ldyk7CisKKwlpZiAoZXJyICYmIGZpcnN0X2ZyYWcpCisJCWxwLT5yY3Zfbnh0ID0gZmlyc3RfZnJhZy0+c2VxaWQgLSAxOworCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gY29waWVkOworCQlpZiAoZXJyID4gMCAmJiBscC0+Y2ZnLm1vZGUgIT0gTERDX01PREVfVU5SRUxJQUJMRSkKKwkJCXNlbmRfZGF0YV9hY2sobHApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIG5vbnJhd19vcHMgPSB7CisJLndyaXRlCQk9CXdyaXRlX25vbnJhdywKKwkucmVhZAkJPQlyZWFkX25vbnJhdywKK307CisKK3N0YXRpYyBpbnQgd3JpdGVfc3RyZWFtKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCXVuc2lnbmVkIGludCBzaXplKQoreworCWlmIChzaXplID4gbHAtPmNmZy5tdHUpCisJCXNpemUgPSBscC0+Y2ZnLm10dTsKKwlyZXR1cm4gd3JpdGVfbm9ucmF3KGxwLCBidWYsIHNpemUpOworfQorCitzdGF0aWMgaW50IHJlYWRfc3RyZWFtKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKCFscC0+bXNzYnVmX2xlbikgeworCQlpbnQgZXJyID0gcmVhZF9ub25yYXcobHAsIGxwLT5tc3NidWYsIGxwLT5jZmcubXR1KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCWxwLT5tc3NidWZfbGVuID0gZXJyOworCQlscC0+bXNzYnVmX29mZiA9IDA7CisJfQorCisJaWYgKHNpemUgPiBscC0+bXNzYnVmX2xlbikKKwkJc2l6ZSA9IGxwLT5tc3NidWZfbGVuOworCW1lbWNweShidWYsIGxwLT5tc3NidWYgKyBscC0+bXNzYnVmX29mZiwgc2l6ZSk7CisKKwlscC0+bXNzYnVmX29mZiArPSBzaXplOworCWxwLT5tc3NidWZfbGVuIC09IHNpemU7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgc3RyZWFtX29wcyA9IHsKKwkud3JpdGUJCT0Jd3JpdGVfc3RyZWFtLAorCS5yZWFkCQk9CXJlYWRfc3RyZWFtLAorfTsKKworaW50IGxkY193cml0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+aHNfc3RhdGUgIT0gTERDX0hTX0NPTVBMRVRFKQorCQllcnIgPSAtRU5PVENPTk47CisJZWxzZQorCQllcnIgPSBscC0+bW9wcy0+d3JpdGUobHAsIGJ1Ziwgc2l6ZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3dyaXRlKTsKKworaW50IGxkY19yZWFkKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzaXplKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUpCisJCWVyciA9IC1FTk9UQ09OTjsKKwllbHNlCisJCWVyciA9IGxwLT5tb3BzLT5yZWFkKGxwLCBidWYsIHNpemUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19yZWFkKTsKKworc3RhdGljIGxvbmcgYXJlbmFfYWxsb2Moc3RydWN0IGxkY19pb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQoreworCXN0cnVjdCBpb21tdV9hcmVuYSAqYXJlbmEgPSAmaW9tbXUtPmFyZW5hOworCXVuc2lnbmVkIGxvbmcgbiwgaSwgc3RhcnQsIGVuZCwgbGltaXQ7CisJaW50IHBhc3M7CisKKwlsaW1pdCA9IGFyZW5hLT5saW1pdDsKKwlzdGFydCA9IGFyZW5hLT5oaW50OworCXBhc3MgPSAwOworCithZ2FpbjoKKwluID0gZmluZF9uZXh0X3plcm9fYml0KGFyZW5hLT5tYXAsIGxpbWl0LCBzdGFydCk7CisJZW5kID0gbiArIG5wYWdlczsKKwlpZiAodW5saWtlbHkoZW5kID49IGxpbWl0KSkgeworCQlpZiAobGlrZWx5KHBhc3MgPCAxKSkgeworCQkJbGltaXQgPSBzdGFydDsKKwkJCXN0YXJ0ID0gMDsKKwkJCXBhc3MrKzsKKwkJCWdvdG8gYWdhaW47CisJCX0gZWxzZSB7CisJCQkvKiBTY2FubmVkIHRoZSB3aG9sZSB0aGluZywgZ2l2ZSB1cC4gKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWZvciAoaSA9IG47IGkgPCBlbmQ7IGkrKykgeworCQlpZiAodGVzdF9iaXQoaSwgYXJlbmEtPm1hcCkpIHsKKwkJCXN0YXJ0ID0gaSArIDE7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJZm9yIChpID0gbjsgaSA8IGVuZDsgaSsrKQorCQlfX3NldF9iaXQoaSwgYXJlbmEtPm1hcCk7CisKKwlhcmVuYS0+aGludCA9IGVuZDsKKworCXJldHVybiBuOworfQorCisjZGVmaW5lIENPT0tJRV9QR1NaX0NPREUJMHhmMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIENPT0tJRV9QR1NaX0NPREVfU0hJRlQJNjBVTEwKKworc3RhdGljIHU2NCBwYWdlc2l6ZV9jb2RlKHZvaWQpCit7CisJc3dpdGNoIChQQUdFX1NJWkUpIHsKKwlkZWZhdWx0OgorCWNhc2UgKDhVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDA7CisJY2FzZSAoNjRVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDE7CisJY2FzZSAoNTEyVUxMICogMTAyNFVMTCk6CisJCXJldHVybiAyOworCWNhc2UgKDRVTEwgKiAxMDI0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiAzOworCWNhc2UgKDMyVUxMICogMTAyNFVMTCAqIDEwMjRVTEwpOgorCQlyZXR1cm4gNDsKKwljYXNlICgyNTZVTEwgKiAxMDI0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiA1OworCX0KK30KKworc3RhdGljIHU2NCBtYWtlX2Nvb2tpZSh1NjQgaW5kZXgsIHU2NCBwZ3N6X2NvZGUsIHU2NCBwYWdlX29mZnNldCkKK3sKKwlyZXR1cm4gKChwZ3N6X2NvZGUgPDwgQ09PS0lFX1BHU1pfQ09ERV9TSElGVCkgfAorCQkoaW5kZXggPDwgUEFHRV9TSElGVCkgfAorCQlwYWdlX29mZnNldCk7Cit9CisKK3N0YXRpYyB1NjQgY29va2llX3RvX2luZGV4KHU2NCBjb29raWUsIHVuc2lnbmVkIGxvbmcgKnNoaWZ0KQoreworCXU2NCBzemNvZGUgPSBjb29raWUgPj4gQ09PS0lFX1BHU1pfQ09ERV9TSElGVDsKKworCWNvb2tpZSAmPSB+Q09PS0lFX1BHU1pfQ09ERTsKKworCSpzaGlmdCA9IHN6Y29kZSAqIDM7CisKKwlyZXR1cm4gKGNvb2tpZSA+PiAoMTNVTEwgKyAoc3pjb2RlICogM1VMTCkpKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5ICphbGxvY19ucGFnZXMoc3RydWN0IGxkY19pb21tdSAqaW9tbXUsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBucGFnZXMpCit7CisJbG9uZyBlbnRyeTsKKworCWVudHJ5ID0gYXJlbmFfYWxsb2MoaW9tbXUsIG5wYWdlcyk7CisJaWYgKHVubGlrZWx5KGVudHJ5IDwgMCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlvbW11LT5wYWdlX3RhYmxlICsgZW50cnk7Cit9CisKK3N0YXRpYyB1NjQgcGVybV90b19tdGUodW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXU2NCBtdGVfYmFzZTsKKworCW10ZV9iYXNlID0gcGFnZXNpemVfY29kZSgpOworCisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9TSEFET1cpIHsKKwkJaWYgKG1hcF9wZXJtICYgTERDX01BUF9SKQorCQkJbXRlX2Jhc2UgfD0gTERDX01URV9DT1BZX1I7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfQ09QWV9XOworCX0KKwlpZiAobWFwX3Blcm0gJiBMRENfTUFQX0RJUkVDVCkgeworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX1JFQUQ7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfV1JJVEU7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfWCkKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfRVhFQzsKKwl9CisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9JTykgeworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX0lPTU1VX1I7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfSU9NTVVfVzsKKwl9CisKKwlyZXR1cm4gbXRlX2Jhc2U7Cit9CisKK3N0YXRpYyBpbnQgcGFnZXNfaW5fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgbG9uZyBsZW4pCit7CisJaW50IGNvdW50ID0gMDsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBuZXcgPSAoYmFzZSArIFBBR0VfU0laRSkgJiBQQUdFX01BU0s7CisKKwkJbGVuIC09IChuZXcgLSBiYXNlKTsKKwkJYmFzZSA9IG5ldzsKKwkJY291bnQrKzsKKwl9IHdoaWxlIChsZW4gPiAwKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RydWN0IGNvb2tpZV9zdGF0ZSB7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkJCSpwYWdlX3RhYmxlOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCQkqY29va2llczsKKwl1NjQJCQkJbXRlX2Jhc2U7CisJdTY0CQkJCXByZXZfY29va2llOworCXUzMgkJCQlwdGVfaWR4OworCXUzMgkJCQluYzsKK307CisKK3N0YXRpYyB2b2lkIGZpbGxfY29va2llcyhzdHJ1Y3QgY29va2llX3N0YXRlICpzcCwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSB1bnNpZ25lZCBsb25nIG9mZiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJZG8geworCQl1bnNpZ25lZCBsb25nIHRsZW4sIG5ldyA9IHBhICsgUEFHRV9TSVpFOworCQl1NjQgdGhpc19jb29raWU7CisKKwkJc3AtPnBhZ2VfdGFibGVbc3AtPnB0ZV9pZHhdLm10ZSA9IHNwLT5tdGVfYmFzZSB8IHBhOworCisJCXRsZW4gPSBQQUdFX1NJWkU7CisJCWlmIChvZmYpCisJCQl0bGVuID0gUEFHRV9TSVpFIC0gb2ZmOworCQlpZiAodGxlbiA+IGxlbikKKwkJCXRsZW4gPSBsZW47CisKKwkJdGhpc19jb29raWUgPSBtYWtlX2Nvb2tpZShzcC0+cHRlX2lkeCwKKwkJCQkJICBwYWdlc2l6ZV9jb2RlKCksIG9mZik7CisKKwkJb2ZmID0gMDsKKworCQlpZiAodGhpc19jb29raWUgPT0gc3AtPnByZXZfY29va2llKSB7CisJCQlzcC0+Y29va2llc1tzcC0+bmMgLSAxXS5jb29raWVfc2l6ZSArPSB0bGVuOworCQl9IGVsc2UgeworCQkJc3AtPmNvb2tpZXNbc3AtPm5jXS5jb29raWVfYWRkciA9IHRoaXNfY29va2llOworCQkJc3AtPmNvb2tpZXNbc3AtPm5jXS5jb29raWVfc2l6ZSA9IHRsZW47CisJCQlzcC0+bmMrKzsKKwkJfQorCQlzcC0+cHJldl9jb29raWUgPSB0aGlzX2Nvb2tpZSArIHRsZW47CisKKwkJc3AtPnB0ZV9pZHgrKzsKKworCQlsZW4gLT0gdGxlbjsKKwkJcGEgPSBuZXc7CisJfSB3aGlsZSAobGVuID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgc2dfY291bnRfb25lKHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gcGFnZV90b19wZm4oc2ctPnBhZ2UpIDw8IFBBR0VfU0hJRlQ7CisJbG9uZyBsZW4gPSBzZy0+bGVuZ3RoOworCisJaWYgKChzZy0+b2Zmc2V0IHwgbGVuKSAmICg4VUwgLSAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gcGFnZXNfaW5fcmVnaW9uKGJhc2UgKyBzZy0+b2Zmc2V0LCBsZW4pOworfQorCitzdGF0aWMgaW50IHNnX2NvdW50X3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fc2cpCit7CisJaW50IGNvdW50OworCWludCBpOworCisJY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fc2c7IGkrKykgeworCQlpbnQgZXJyID0gc2dfY291bnRfb25lKHNnICsgaSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJY291bnQgKz0gZXJyOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworaW50IGxkY19tYXBfc2coc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG51bV9zZywKKwkgICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzLCBmbGFnczsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYmFzZTsKKwlzdHJ1Y3QgY29va2llX3N0YXRlIHN0YXRlOworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11OworCWludCBlcnI7CisKKwlpZiAobWFwX3Blcm0gJiB+TERDX01BUF9BTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gc2dfY291bnRfcGFnZXMoc2csIG51bV9zZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlucGFnZXMgPSBlcnI7CisJaWYgKGVyciA+IG5jb29raWVzKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaW9tbXUgPSAmbHAtPmlvbW11OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJYmFzZSA9IGFsbG9jX25wYWdlcyhpb21tdSwgbnBhZ2VzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFiYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlLnBhZ2VfdGFibGUgPSBpb21tdS0+cGFnZV90YWJsZTsKKwlzdGF0ZS5jb29raWVzID0gY29va2llczsKKwlzdGF0ZS5tdGVfYmFzZSA9IHBlcm1fdG9fbXRlKG1hcF9wZXJtKTsKKwlzdGF0ZS5wcmV2X2Nvb2tpZSA9IH4odTY0KTA7CisJc3RhdGUucHRlX2lkeCA9IChiYXNlIC0gaW9tbXUtPnBhZ2VfdGFibGUpOworCXN0YXRlLm5jID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2c7IGkrKykKKwkJZmlsbF9jb29raWVzKCZzdGF0ZSwgcGFnZV90b19wZm4oc2dbaV0ucGFnZSkgPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgc2dbaV0ub2Zmc2V0LCBzZ1tpXS5sZW5ndGgpOworCisJcmV0dXJuIHN0YXRlLm5jOworfQorRVhQT1JUX1NZTUJPTChsZGNfbWFwX3NnKTsKKworaW50IGxkY19tYXBfc2luZ2xlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkJICAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzLCBwYSwgZmxhZ3M7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkgKmJhc2U7CisJc3RydWN0IGNvb2tpZV9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgbGRjX2lvbW11ICppb21tdTsKKworCWlmICgobWFwX3Blcm0gJiB+TERDX01BUF9BTEwpIHx8IChuY29va2llcyA8IDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhID0gX19wYShidWYpOworCWlmICgocGEgfCBsZW4pICYgKDhVTCAtIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW5wYWdlcyA9IHBhZ2VzX2luX3JlZ2lvbihwYSwgbGVuKTsKKworCWlvbW11ID0gJmxwLT5pb21tdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWJhc2UgPSBhbGxvY19ucGFnZXMoaW9tbXUsIG5wYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCWlmICghYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0ZS5wYWdlX3RhYmxlID0gaW9tbXUtPnBhZ2VfdGFibGU7CisJc3RhdGUuY29va2llcyA9IGNvb2tpZXM7CisJc3RhdGUubXRlX2Jhc2UgPSBwZXJtX3RvX210ZShtYXBfcGVybSk7CisJc3RhdGUucHJldl9jb29raWUgPSB+KHU2NCkwOworCXN0YXRlLnB0ZV9pZHggPSAoYmFzZSAtIGlvbW11LT5wYWdlX3RhYmxlKTsKKwlzdGF0ZS5uYyA9IDA7CisJZmlsbF9jb29raWVzKCZzdGF0ZSwgKHBhICYgUEFHRV9NQVNLKSwgKHBhICYgflBBR0VfTUFTSyksIGxlbik7CisJQlVHX09OKHN0YXRlLm5jICE9IDEpOworCisJcmV0dXJuIHN0YXRlLm5jOworfQorRVhQT1JUX1NZTUJPTChsZGNfbWFwX3NpbmdsZSk7CisKK3N0YXRpYyB2b2lkIGZyZWVfbnBhZ2VzKHVuc2lnbmVkIGxvbmcgaWQsIHN0cnVjdCBsZGNfaW9tbXUgKmlvbW11LAorCQkJdTY0IGNvb2tpZSwgdTY0IHNpemUpCit7CisJc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSA9ICZpb21tdS0+YXJlbmE7CisJdW5zaWduZWQgbG9uZyBpLCBzaGlmdCwgaW5kZXgsIG5wYWdlczsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYmFzZTsKKworCW5wYWdlcyA9IFBBR0VfQUxJR04oKChjb29raWUgJiB+UEFHRV9NQVNLKSArIHNpemUpKSA+PiBQQUdFX1NISUZUOworCWluZGV4ID0gY29va2llX3RvX2luZGV4KGNvb2tpZSwgJnNoaWZ0KTsKKwliYXNlID0gaW9tbXUtPnBhZ2VfdGFibGUgKyBpbmRleDsKKworCUJVR19PTihpbmRleCA+IGFyZW5hLT5saW1pdCB8fAorCSAgICAgICAoaW5kZXggKyBucGFnZXMpID4gYXJlbmEtPmxpbWl0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgeworCQlpZiAoYmFzZS0+Y29va2llKQorCQkJc3VuNHZfbGRjX3Jldm9rZShpZCwgY29va2llICsgKGkgPDwgc2hpZnQpLAorCQkJCQkgYmFzZS0+Y29va2llKTsKKwkJYmFzZS0+bXRlID0gMDsKKwkJX19jbGVhcl9iaXQoaW5kZXggKyBpLCBhcmVuYS0+bWFwKTsKKwl9Cit9CisKK3ZvaWQgbGRjX3VubWFwKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCSAgICAgICBpbnQgbmNvb2tpZXMpCit7CisJc3RydWN0IGxkY19pb21tdSAqaW9tbXUgPSAmbHAtPmlvbW11OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmNvb2tpZXM7IGkrKykgeworCQl1NjQgYWRkciA9IGNvb2tpZXNbaV0uY29va2llX2FkZHI7CisJCXU2NCBzaXplID0gY29va2llc1tpXS5jb29raWVfc2l6ZTsKKworCQlmcmVlX25wYWdlcyhscC0+aWQsIGlvbW11LCBhZGRyLCBzaXplKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3VubWFwKTsKKworaW50IGxkY19jb3B5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGludCBjb3B5X2RpciwKKwkgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCXVuc2lnbmVkIGludCBvcmlnX2xlbjsKKwl1bnNpZ25lZCBsb25nIHJhOworCWludCBpOworCisJaWYgKGNvcHlfZGlyICE9IExEQ19DT1BZX0lOICYmIGNvcHlfZGlyICE9IExEQ19DT1BZX09VVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBCYWQgY29weV9kaXJbJWRdXG4iLAorCQkgICAgICAgbHAtPmlkLCBjb3B5X2Rpcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJhID0gX19wYShidWYpOworCWlmICgocmEgfCBsZW4gfCBvZmZzZXQpICYgKDhVTCAtIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19jb3B5OiBJRFslbHVdIFVuYWxpZ25lZCBidWZmZXIgIgorCQkgICAgICAgInJhWyVseF0gbGVuWyV4XSBvZmZzZXRbJWx4XVxuIiwKKwkJICAgICAgIGxwLT5pZCwgcmEsIGxlbiwgb2Zmc2V0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUgfHwKKwkgICAgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFU0VUKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBMaW5rIGRvd24gaHNfc3RhdGVbJXhdICIKKwkJICAgICAgICJmbGFnc1sleF1cbiIsIGxwLT5pZCwgbHAtPmhzX3N0YXRlLCBscC0+ZmxhZ3MpOworCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfQorCisJb3JpZ19sZW4gPSBsZW47CisJZm9yIChpID0gMDsgaSA8IG5jb29raWVzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBjb29raWVfcmFkZHIgPSBjb29raWVzW2ldLmNvb2tpZV9hZGRyOworCQl1bnNpZ25lZCBsb25nIHRoaXNfbGVuID0gY29va2llc1tpXS5jb29raWVfc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBhY3R1YWxfbGVuOworCisJCWlmICh1bmxpa2VseShvZmZzZXQpKSB7CisJCQl1bnNpZ25lZCBsb25nIHRoaXNfb2ZmID0gb2Zmc2V0OworCisJCQlpZiAodGhpc19vZmYgPiB0aGlzX2xlbikKKwkJCQl0aGlzX29mZiA9IHRoaXNfbGVuOworCisJCQlvZmZzZXQgLT0gdGhpc19vZmY7CisJCQl0aGlzX2xlbiAtPSB0aGlzX29mZjsKKwkJCWlmICghdGhpc19sZW4pCisJCQkJY29udGludWU7CisJCQljb29raWVfcmFkZHIgKz0gdGhpc19vZmY7CisJCX0KKworCQlpZiAodGhpc19sZW4gPiBsZW4pCisJCQl0aGlzX2xlbiA9IGxlbjsKKworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwkJCWh2X2VyciA9IHN1bjR2X2xkY19jb3B5KGxwLT5pZCwgY29weV9kaXIsCisJCQkJCQljb29raWVfcmFkZHIsIHJhLAorCQkJCQkJdGhpc19sZW4sICZhY3R1YWxfbGVuKTsKKwkJCWlmICh1bmxpa2VseShodl9lcnIpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2NvcHk6IElEWyVsdV0gIgorCQkJCSAgICAgICAiSFYgZXJyb3IgJWx1XG4iLAorCQkJCSAgICAgICBscC0+aWQsIGh2X2Vycik7CisJCQkJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUgfHwKKwkJCQkgICAgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFU0VUKSkKKwkJCQkJcmV0dXJuIC1FQ09OTlJFU0VUOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCWNvb2tpZV9yYWRkciArPSBhY3R1YWxfbGVuOworCQkJcmEgKz0gYWN0dWFsX2xlbjsKKwkJCWxlbiAtPSBhY3R1YWxfbGVuOworCQkJaWYgKGFjdHVhbF9sZW4gPT0gdGhpc19sZW4pCisJCQkJYnJlYWs7CisKKwkJCXRoaXNfbGVuIC09IGFjdHVhbF9sZW47CisJCX0KKworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCX0KKworCS8qIEl0IGlzIGNhbGxlciBwb2xpY3kgd2hhdCB0byBkbyBhYm91dCBzaG9ydCBjb3BpZXMuCisJICogRm9yIGV4YW1wbGUsIGEgbmV0d29ya2luZyBkcml2ZXIgY2FuIGRlY2xhcmUgdGhlCisJICogcGFja2V0IGEgcnVudCBhbmQgZHJvcCBpdC4KKwkgKi8KKworCXJldHVybiBvcmlnX2xlbiAtIGxlbjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX2NvcHkpOworCit2b2lkICpsZGNfYWxsb2NfZXhwX2RyaW5nKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBsZW4sCisJCQkgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgKm5jb29raWVzLAorCQkJICB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pCit7CisJdm9pZCAqYnVmOworCWludCBlcnI7CisKKwlpZiAobGVuICYgKDhVTCAtIDEpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSBsZGNfbWFwX3NpbmdsZShscCwgYnVmLCBsZW4sIGNvb2tpZXMsICpuY29va2llcywgbWFwX3Blcm0pOworCWlmIChlcnIgPCAwKSB7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCSpuY29va2llcyA9IGVycjsKKworCXJldHVybiBidWY7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19hbGxvY19leHBfZHJpbmcpOworCit2b2lkIGxkY19mcmVlX2V4cF9kcmluZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisJCQlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCWxkY191bm1hcChscCwgY29va2llcywgbmNvb2tpZXMpOworCWtmcmVlKGJ1Zik7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19mcmVlX2V4cF9kcmluZyk7CisKK3N0YXRpYyBpbnQgX19pbml0IGxkY19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtYWpvciwgbWlub3I7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJY29uc3QgdTY0ICp2OworCXU2NCBtcDsKKworCWhwID0gbWRlc2NfZ3JhYigpOworCWlmICghaHApCisJCXJldHVybiAtRU5PREVWOworCisJbXAgPSBtZGVzY19ub2RlX2J5X25hbWUoaHAsIE1ERVNDX05PREVfTlVMTCwgInBsYXRmb3JtIik7CisJaWYgKG1wID09IE1ERVNDX05PREVfTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRvbWFpbmluZy1lbmFibGVkIiwgTlVMTCk7CisJaWYgKCF2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1ham9yID0gMTsKKwltaW5vciA9IDA7CisJaWYgKHN1bjR2X2h2YXBpX3JlZ2lzdGVyKEhWX0dSUF9MRE9NLCBtYWpvciwgJm1pbm9yKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ291bGQgbm90IHJlZ2lzdGVyIExET00gaHZhcGkuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWlmICghKnYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRvbWFpbmluZyBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbGRvbV9kb21haW5pbmdfZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChsZGNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKaW5kZXggZjBlMTYwNDUuLmRlNTMxMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvbWRlc2MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKQEAgLTYsNiArNiw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL21kZXNjLmg+CkBAIC0yOSw3ICszMiw3IEBACiAJdTMyCW5vZGVfc3o7IC8qIG5vZGUgYmxvY2sgc2l6ZSAqLwogCXUzMgluYW1lX3N6OyAvKiBuYW1lIGJsb2NrIHNpemUgKi8KIAl1MzIJZGF0YV9zejsgLyogZGF0YSBibG9jayBzaXplICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOwogCiBzdHJ1Y3QgbWRlc2NfZWxlbSB7CiAJdTgJdGFnOwpAQCAtNTMsMzA2ICs1NiwzOTYgQEAKIAl9IGQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IG1kZXNjX2hkciAqbWFpbl9tZGVzYzsKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqYWxsbm9kZXM7CitzdHJ1Y3QgbWRlc2NfbWVtX29wcyB7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqKCphbGxvYykodW5zaWduZWQgaW50IG1kZXNjX3NpemUpOworCXZvaWQgKCpmcmVlKShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpoYW5kbGUpOworfTsKIAotc3RhdGljIHN0cnVjdCBtZGVzY19ub2RlICphbGxub2Rlc190YWlsOwotc3RhdGljIHVuc2lnbmVkIGludCB1bmlxdWVfaWQ7CitzdHJ1Y3QgbWRlc2NfaGFuZGxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IG1kZXNjX21lbV9vcHMJKm1vcHM7CisJdm9pZAkJCSpzZWxmX2Jhc2U7CisJYXRvbWljX3QJCXJlZmNudDsKKwl1bnNpZ25lZCBpbnQJCWhhbmRsZV9zaXplOworCXN0cnVjdCBtZGVzY19oZHIJbWRlc2M7Cit9OwogCi1zdGF0aWMgc3RydWN0IG1kZXNjX25vZGUgKiptZGVzY19oYXNoOwotc3RhdGljIHVuc2lnbmVkIGludCBtZGVzY19oYXNoX3NpemU7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vZGVfaGFzaGZuKHU2NCBub2RlKQorc3RhdGljIHZvaWQgbWRlc2NfaGFuZGxlX2luaXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemUsCisJCQkgICAgICB2b2lkICpiYXNlKQogewotCXJldHVybiAoKHVuc2lnbmVkIGludCkgKG5vZGUgXiAobm9kZSA+PiA4KSBeIChub2RlID4+IDE2KSkpCi0JCSYgKG1kZXNjX2hhc2hfc2l6ZSAtIDEpOworCUJVR19PTigoKHVuc2lnbmVkIGxvbmcpJmhwLT5tZGVzYykgJiAoMTZVTCAtIDEpKTsKKworCW1lbXNldChocCwgMCwgaGFuZGxlX3NpemUpOworCUlOSVRfTElTVF9IRUFEKCZocC0+bGlzdCk7CisJaHAtPnNlbGZfYmFzZSA9IGJhc2U7CisJYXRvbWljX3NldCgmaHAtPnJlZmNudCwgMSk7CisJaHAtPmhhbmRsZV9zaXplID0gaGFuZGxlX3NpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX25vZGUoc3RydWN0IG1kZXNjX25vZGUgKm1wKQorc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2Jvb3RtZW1fYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKipoZWFkID0gJm1kZXNjX2hhc2hbbm9kZV9oYXNoZm4obXAtPm5vZGUpXTsKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemUsIGFsbG9jX3NpemU7CiAKLQltcC0+aGFzaF9uZXh0ID0gKmhlYWQ7Ci0JKmhlYWQgPSBtcDsKKwloYW5kbGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IG1kZXNjX2hhbmRsZSkgLQorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZGVzY19oZHIpICsKKwkJICAgICAgIG1kZXNjX3NpemUpOworCWFsbG9jX3NpemUgPSBQQUdFX0FMSUdOKGhhbmRsZV9zaXplKTsKIAotCWlmIChhbGxub2Rlc190YWlsKSB7Ci0JCWFsbG5vZGVzX3RhaWwtPmFsbG5vZGVzX25leHQgPSBtcDsKLQkJYWxsbm9kZXNfdGFpbCA9IG1wOwotCX0gZWxzZSB7Ci0JCWFsbG5vZGVzID0gYWxsbm9kZXNfdGFpbCA9IG1wOworCWhwID0gX19hbGxvY19ib290bWVtKGFsbG9jX3NpemUsIFBBR0VfU0laRSwgMFVMKTsKKwlpZiAoaHApCisJCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgaHApOworCisJcmV0dXJuIGhwOworfQorCitzdGF0aWMgdm9pZCBtZGVzY19ib290bWVtX2ZyZWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCit7CisJdW5zaWduZWQgaW50IGFsbG9jX3NpemUsIGhhbmRsZV9zaXplID0gaHAtPmhhbmRsZV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCUJVR19PTihhdG9taWNfcmVhZCgmaHAtPnJlZmNudCkgIT0gMCk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZocC0+bGlzdCkpOworCisJYWxsb2Nfc2l6ZSA9IFBBR0VfQUxJR04oaGFuZGxlX3NpemUpOworCisJc3RhcnQgPSAodW5zaWduZWQgbG9uZykgaHA7CisJZW5kID0gc3RhcnQgKyBhbGxvY19zaXplOworCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCXN0cnVjdCBwYWdlICpwOworCisJCXAgPSB2aXJ0X3RvX3BhZ2Uoc3RhcnQpOworCQlDbGVhclBhZ2VSZXNlcnZlZChwKTsKKwkJX19mcmVlX3BhZ2UocCk7CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqZmluZF9ub2RlKHU2NCBub2RlKQorc3RhdGljIHN0cnVjdCBtZGVzY19tZW1fb3BzIGJvb3RtZW1fbWRlc2NfbWVtb3BzID0geworCS5hbGxvYyA9IG1kZXNjX2Jvb3RtZW1fYWxsb2MsCisJLmZyZWUgID0gbWRlc2NfYm9vdG1lbV9mcmVlLAorfTsKKworc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2ttYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wID0gbWRlc2NfaGFzaFtub2RlX2hhc2hmbihub2RlKV07CisJdW5zaWduZWQgaW50IGhhbmRsZV9zaXplOworCXZvaWQgKmJhc2U7CiAKLQl3aGlsZSAobXApIHsKLQkJaWYgKG1wLT5ub2RlID09IG5vZGUpCi0JCQlyZXR1cm4gbXA7CisJaGFuZGxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBtZGVzY19oYW5kbGUpIC0KKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWRlc2NfaGRyKSArCisJCSAgICAgICBtZGVzY19zaXplKTsKIAotCQltcCA9IG1wLT5oYXNoX25leHQ7CisJYmFzZSA9IGttYWxsb2MoaGFuZGxlX3NpemUgKyAxNSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJhc2UpIHsKKwkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwkJYWRkciA9IChhZGRyICsgMTVVTCkgJiB+MTVVTDsKKwkJaHAgPSAoc3RydWN0IG1kZXNjX2hhbmRsZSAqKSBhZGRyOworCisJCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgYmFzZSk7CisJCXJldHVybiBocDsKIAl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RydWN0IHByb3BlcnR5ICptZF9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBtZGVzY19ub2RlICptcCwKLQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICBpbnQgKmxlbnApCitzdGF0aWMgdm9pZCBtZGVzY19rZnJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCkKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKnBwOworCUJVR19PTihhdG9taWNfcmVhZCgmaHAtPnJlZmNudCkgIT0gMCk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZocC0+bGlzdCkpOwogCi0JZm9yIChwcCA9IG1wLT5wcm9wZXJ0aWVzOyBwcCAhPSAwOyBwcCA9IHBwLT5uZXh0KSB7Ci0JCWlmIChzdHJjYXNlY21wKHBwLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAobGVucCkKLQkJCQkqbGVucCA9IHBwLT5sZW5ndGg7Ci0JCQlicmVhazsKLQkJfQorCWtmcmVlKGhwLT5zZWxmX2Jhc2UpOworfQorCitzdGF0aWMgc3RydWN0IG1kZXNjX21lbV9vcHMga21hbGxvY19tZGVzY19tZW1vcHMgPSB7CisJLmFsbG9jID0gbWRlc2Nfa21hbGxvYywKKwkuZnJlZSAgPSBtZGVzY19rZnJlZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZGVzY19hbGxvYyh1bnNpZ25lZCBpbnQgbWRlc2Nfc2l6ZSwKKwkJCQkJc3RydWN0IG1kZXNjX21lbV9vcHMgKm1vcHMpCit7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAgPSBtb3BzLT5hbGxvYyhtZGVzY19zaXplKTsKKworCWlmIChocCkKKwkJaHAtPm1vcHMgPSBtb3BzOworCisJcmV0dXJuIGhwOworfQorCitzdGF0aWMgdm9pZCBtZGVzY19mcmVlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCWhwLT5tb3BzLT5mcmVlKGhwKTsKK30KKworc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKmN1cl9tZGVzYzsKK3N0YXRpYyBMSVNUX0hFQUQobWRlc2Nfem9tYmllX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhtZGVzY19sb2NrKTsKKworc3RydWN0IG1kZXNjX2hhbmRsZSAqbWRlc2NfZ3JhYih2b2lkKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCWhwID0gY3VyX21kZXNjOworCWlmIChocCkKKwkJYXRvbWljX2luYygmaHAtPnJlZmNudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGhwOworfQorRVhQT1JUX1NZTUJPTChtZGVzY19ncmFiKTsKKwordm9pZCBtZGVzY19yZWxlYXNlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZocC0+cmVmY250KSkgeworCQlsaXN0X2RlbF9pbml0KCZocC0+bGlzdCk7CisJCWhwLT5tb3BzLT5mcmVlKGhwKTsKIAl9Ci0JcmV0dXJuIHBwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXNjX2xvY2ssIGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0wobWRfZmluZF9wcm9wZXJ0eSk7CitFWFBPUlRfU1lNQk9MKG1kZXNjX3JlbGVhc2UpOwogCi0vKgotICogRmluZCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGZvciBhIGdpdmVuIG5vZGUKLSAqIGFuZCByZXR1cm4gdGhlIHZhbHVlLgotICovCi1jb25zdCB2b2lkICptZF9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IG1kZXNjX25vZGUgKm1wLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgIGludCAqbGVucCkKK3ZvaWQgbWRlc2NfdXBkYXRlKHZvaWQpCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcCA9IG1kX2ZpbmRfcHJvcGVydHkobXAsIG5hbWUsIGxlbnApOwotCXJldHVybiBwcCA/IHBwLT52YWx1ZSA6IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG1kX2dldF9wcm9wZXJ0eSk7CisJdW5zaWduZWQgbG9uZyBsZW4sIHJlYWxfbGVuLCBzdGF0dXM7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsICpvcmlnX2hwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLXN0cnVjdCBtZGVzY19ub2RlICptZF9maW5kX25vZGVfYnlfbmFtZShzdHJ1Y3QgbWRlc2Nfbm9kZSAqZnJvbSwKLQkJCQkJY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7CisJKHZvaWQpIHN1bjR2X21hY2hfZGVzYygwVUwsIDBVTCwgJmxlbik7CiAKLQltcCA9IGZyb20gPyBmcm9tLT5hbGxub2Rlc19uZXh0IDogYWxsbm9kZXM7Ci0JZm9yICg7IG1wICE9IE5VTEw7IG1wID0gbXAtPmFsbG5vZGVzX25leHQpIHsKLQkJaWYgKHN0cmNtcChtcC0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gbXA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1kX2ZpbmRfbm9kZV9ieV9uYW1lKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBtZGVzY19lYXJseV9hbGxvY2F0ZWQ7Ci0KLXN0YXRpYyB2b2lkICogX19pbml0IG1kZXNjX2Vhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2b2lkICpyZXQ7Ci0KLQlyZXQgPSBfX2FsbG9jX2Jvb3RtZW0oc2l6ZSwgU01QX0NBQ0hFX0JZVEVTLCAwVUwpOwotCWlmIChyZXQgPT0gTlVMTCkgewotCQlwcm9tX3ByaW50ZigiTURFU0M6IGFsbG9jIG9mICVsdSBieXRlcyBmYWlsZWQuXG4iLCBzaXplKTsKLQkJcHJvbV9oYWx0KCk7CisJaHAgPSBtZGVzY19hbGxvYyhsZW4sICZrbWFsbG9jX21kZXNjX21lbW9wcyk7CisJaWYgKCFocCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1EOiBtZGVzYyBhbGxvYyBmYWlsc1xuIik7CisJCXJldHVybjsKIAl9CiAKLQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQotCW1kZXNjX2Vhcmx5X2FsbG9jYXRlZCArPSBzaXplOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgY291bnRfYXJjcyhzdHJ1Y3QgbWRlc2NfZWxlbSAqZXApCi17Ci0JdW5zaWduZWQgaW50IHJldCA9IDA7Ci0KLQllcCsrOwotCXdoaWxlIChlcC0+dGFnICE9IE1EX05PREVfRU5EKSB7Ci0JCWlmIChlcC0+dGFnID09IE1EX1BST1BfQVJDKQotCQkJcmV0Kys7Ci0JCWVwKys7CisJc3RhdHVzID0gc3VuNHZfbWFjaF9kZXNjKF9fcGEoJmhwLT5tZGVzYyksIGxlbiwgJnJlYWxfbGVuKTsKKwlpZiAoc3RhdHVzICE9IEhWX0VPSyB8fCByZWFsX2xlbiA+IGxlbikgeworCQlwcmludGsoS0VSTl9FUlIgIk1EOiBtZGVzYyByZXJlYWQgZmFpbHMgd2l0aCAlbHVcbiIsCisJCSAgICAgICBzdGF0dXMpOworCQlhdG9taWNfZGVjKCZocC0+cmVmY250KTsKKwkJbWRlc2NfZnJlZShocCk7CisJCXJldHVybjsKIAl9Ci0JcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGVzY19sb2NrLCBmbGFncyk7CisJb3JpZ19ocCA9IGN1cl9tZGVzYzsKKwljdXJfbWRlc2MgPSBocDsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZvcmlnX2hwLT5yZWZjbnQpKQorCQltZGVzY19mcmVlKG9yaWdfaHApOworCWVsc2UKKwkJbGlzdF9hZGQoJm9yaWdfaHAtPmxpc3QsICZtZGVzY196b21iaWVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRlc2NfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbWRlc2Nfbm9kZV9hbGxvYyh1NjQgbm9kZSwgc3RydWN0IG1kZXNjX2VsZW0gKmVwLCBjb25zdCBjaGFyICpuYW1lcykKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2FyY3MgPSBjb3VudF9hcmNzKGVwKTsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7Ci0KLQltcCA9IG1kZXNjX2Vhcmx5X2FsbG9jKHNpemVvZigqbXApICsKLQkJCSAgICAgICAobnVtX2FyY3MgKiBzaXplb2Yoc3RydWN0IG1kZXNjX2FyYykpKTsKLQltcC0+bmFtZSA9IG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0OwotCW1wLT5ub2RlID0gbm9kZTsKLQltcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JbXAtPm51bV9hcmNzID0gbnVtX2FyY3M7Ci0KLQloYXNoX25vZGUobXApOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtZGVzY19lbGVtICpub2RlX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQorc3RhdGljIHN0cnVjdCBtZGVzY19lbGVtICpub2RlX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoc3RydWN0IG1kZXNjX2VsZW0gKikgKG1kZXNjICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqbmFtZV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyB2b2lkICpuYW1lX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoKHZvaWQgKikgbm9kZV9ibG9jayhtZGVzYykpICsgbWRlc2MtPm5vZGVfc3o7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqZGF0YV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyB2b2lkICpkYXRhX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoKHZvaWQgKikgbmFtZV9ibG9jayhtZGVzYykpICsgbWRlc2MtPm5hbWVfc3o7CiB9CiAKLS8qIEluIG9yZGVyIHRvIGF2b2lkIHJlY3Vyc2lvbiAodGhlIGdyYXBoIGNhbiBiZSB2ZXJ5IGRlZXApIHdlIHVzZSBhCi0gKiB0d28gcGFzcyBhbGdvcml0aG0uICBGaXJzdCB3ZSBhbGxvY2F0ZSBhbGwgdGhlIG5vZGVzIGFuZCBoYXNoIHRoZW0uCi0gKiBUaGVuIHdlIGl0ZXJhdGUgb3ZlciBlYWNoIG5vZGUsIGZpbGxpbmcgaW4gdGhlIGFyY3MgYW5kIHByb3BlcnRpZXMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBidWlsZF9hbGxfbm9kZXMoc3RydWN0IG1kZXNjX2hkciAqbWRlc2MpCit1NjQgbWRlc2Nfbm9kZV9ieV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkgICAgICAgdTY0IGZyb21fbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgbWRlc2NfZWxlbSAqc3RhcnQsICplcDsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7Ci0JY29uc3QgY2hhciAqbmFtZXM7Ci0Jdm9pZCAqZGF0YTsKLQl1NjQgbGFzdF9ub2RlOworCXN0cnVjdCBtZGVzY19lbGVtICplcCA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisJY29uc3QgY2hhciAqbmFtZXMgPSBuYW1lX2Jsb2NrKCZocC0+bWRlc2MpOworCXU2NCBsYXN0X25vZGUgPSBocC0+bWRlc2Mubm9kZV9zeiAvIDE2OworCXU2NCByZXQ7CiAKLQlzdGFydCA9IGVwID0gbm9kZV9ibG9jayhtZGVzYyk7Ci0JbGFzdF9ub2RlID0gbWRlc2MtPm5vZGVfc3ogLyAxNjsKKwlpZiAoZnJvbV9ub2RlID09IE1ERVNDX05PREVfTlVMTCkgeworCQlyZXQgPSBmcm9tX25vZGUgPSAwOworCX0gZWxzZSBpZiAoZnJvbV9ub2RlID49IGxhc3Rfbm9kZSkgeworCQlyZXR1cm4gTURFU0NfTk9ERV9OVUxMOworCX0gZWxzZSB7CisJCXJldCA9IGVwW2Zyb21fbm9kZV0uZC52YWw7CisJfQogCi0JbmFtZXMgPSBuYW1lX2Jsb2NrKG1kZXNjKTsKKwl3aGlsZSAocmV0IDwgbGFzdF9ub2RlKSB7CisJCWlmIChlcFtyZXRdLnRhZyAhPSBNRF9OT0RFKQorCQkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKwkJaWYgKCFzdHJjbXAobmFtZXMgKyBlcFtyZXRdLm5hbWVfb2Zmc2V0LCBuYW1lKSkKKwkJCWJyZWFrOworCQlyZXQgPSBlcFtyZXRdLmQudmFsOworCX0KKwlpZiAocmV0ID49IGxhc3Rfbm9kZSkKKwkJcmV0ID0gTURFU0NfTk9ERV9OVUxMOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25vZGVfYnlfbmFtZSk7CiAKLQl3aGlsZSAoMSkgewotCQl1NjQgbm9kZSA9IGVwIC0gc3RhcnQ7Citjb25zdCB2b2lkICptZGVzY19nZXRfcHJvcGVydHkoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBub2RlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCkKK3sKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CisJdm9pZCAqZGF0YSA9IGRhdGFfYmxvY2soJmhwLT5tZGVzYyk7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwOwogCi0JCWlmIChlcC0+dGFnID09IE1EX0xJU1RfRU5EKQorCWlmIChub2RlID09IE1ERVNDX05PREVfTlVMTCB8fCBub2RlID49IGxhc3Rfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwllcCA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYykgKyBub2RlOworCWVwKys7CisJZm9yICg7IGVwLT50YWcgIT0gTURfTk9ERV9FTkQ7IGVwKyspIHsKKwkJdm9pZCAqdmFsID0gTlVMTDsKKwkJaW50IGxlbiA9IDA7CisKKwkJc3dpdGNoIChlcC0+dGFnKSB7CisJCWNhc2UgTURfUFJPUF9WQUw6CisJCQl2YWwgPSAmZXAtPmQudmFsOworCQkJbGVuID0gODsKIAkJCWJyZWFrOwogCi0JCWlmIChlcC0+dGFnICE9IE1EX05PREUpIHsKLQkJCXByb21fcHJpbnRmKCJNREVTQzogSW5jb25zaXN0ZW50IGVsZW1lbnQgbGlzdC5cbiIpOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KKwkJY2FzZSBNRF9QUk9QX1NUUjoKKwkJY2FzZSBNRF9QUk9QX0RBVEE6CisJCQl2YWwgPSBkYXRhICsgZXAtPmQuZGF0YS5kYXRhX29mZnNldDsKKwkJCWxlbiA9IGVwLT5kLmRhdGEuZGF0YV9sZW47CisJCQlicmVhazsKIAotCQltZGVzY19ub2RlX2FsbG9jKG5vZGUsIGVwLCBuYW1lcyk7Ci0KLQkJaWYgKGVwLT5kLnZhbCA+PSBsYXN0X25vZGUpIHsKLQkJCXByaW50aygiTURFU0M6IFdhcm5pbmcsIGVhcmx5IGJyZWFrIG91dCBvZiBub2RlIHNjYW4uXG4iKTsKLQkJCXByaW50aygiTURFU0M6IE5leHQgbm9kZSBbJWx1XSBsYXN0X25vZGUgWyVsdV0uXG4iLAotCQkJICAgICAgIG5vZGUsIGxhc3Rfbm9kZSk7CisJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQorCQlpZiAoIXZhbCkKKwkJCWNvbnRpbnVlOwogCi0JCWVwID0gc3RhcnQgKyBlcC0+ZC52YWw7Ci0JfQotCi0JZGF0YSA9IGRhdGFfYmxvY2sobWRlc2MpOwotCWZvciAobXAgPSBhbGxub2RlczsgbXA7IG1wID0gbXAtPmFsbG5vZGVzX25leHQpIHsKLQkJc3RydWN0IG1kZXNjX2VsZW0gKmVwID0gc3RhcnQgKyBtcC0+bm9kZTsKLQkJc3RydWN0IHByb3BlcnR5ICoqbGluayA9ICZtcC0+cHJvcGVydGllczsKLQkJdW5zaWduZWQgaW50IHRoaXNfYXJjID0gMDsKLQotCQllcCsrOwotCQl3aGlsZSAoZXAtPnRhZyAhPSBNRF9OT0RFX0VORCkgewotCQkJc3dpdGNoIChlcC0+dGFnKSB7Ci0JCQljYXNlIE1EX1BST1BfQVJDOiB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKnRhcmdldDsKLQotCQkJCWlmICh0aGlzX2FyYyA+PSBtcC0+bnVtX2FyY3MpIHsKLQkJCQkJcHJvbV9wcmludGYoIk1ERVNDOiBBUkMgb3ZlcnJ1biBbJXU6JXVdXG4iLAotCQkJCQkJICAgIHRoaXNfYXJjLCBtcC0+bnVtX2FyY3MpOwotCQkJCQlwcm9tX2hhbHQoKTsKLQkJCQl9Ci0JCQkJdGFyZ2V0ID0gZmluZF9ub2RlKGVwLT5kLnZhbCk7Ci0JCQkJaWYgKCF0YXJnZXQpIHsKLQkJCQkJcHJpbnRrKCJNREVTQzogV2FybmluZywgYXJjIHBvaW50cyB0byAiCi0JCQkJCSAgICAgICAibWlzc2luZyBub2RlLCBpZ25vcmluZy5cbiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbXAtPmFyY3NbdGhpc19hcmNdLm5hbWUgPQotCQkJCQkobmFtZXMgKyBlcC0+bmFtZV9vZmZzZXQpOwotCQkJCW1wLT5hcmNzW3RoaXNfYXJjXS5hcmMgPSB0YXJnZXQ7Ci0JCQkJdGhpc19hcmMrKzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZSBNRF9QUk9QX1ZBTDoKLQkJCWNhc2UgTURfUFJPUF9TVFI6Ci0JCQljYXNlIE1EX1BST1BfREFUQTogewotCQkJCXN0cnVjdCBwcm9wZXJ0eSAqcCA9IG1kZXNjX2Vhcmx5X2FsbG9jKHNpemVvZigqcCkpOwotCi0JCQkJcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JCQkJcC0+bmFtZSA9IChjaGFyICopIG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0OwotCQkJCWlmIChlcC0+dGFnID09IE1EX1BST1BfVkFMKSB7Ci0JCQkJCXAtPnZhbHVlID0gJmVwLT5kLnZhbDsKLQkJCQkJcC0+bGVuZ3RoID0gODsKLQkJCQl9IGVsc2UgewotCQkJCQlwLT52YWx1ZSA9IGRhdGEgKyBlcC0+ZC5kYXRhLmRhdGFfb2Zmc2V0OwotCQkJCQlwLT5sZW5ndGggPSBlcC0+ZC5kYXRhLmRhdGFfbGVuOwotCQkJCX0KLQkJCQkqbGluayA9IHA7Ci0JCQkJbGluayA9ICZwLT5uZXh0OwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXNlIE1EX05PT1A6Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKCJNREVTQzogV2FybmluZywgaWdub3JpbmcgdW5rbm93biB0YWcgdHlwZSAlMDJ4XG4iLAotCQkJCSAgICAgICBlcC0+dGFnKTsKLQkJCX0KLQkJCWVwKys7CisJCWlmICghc3RyY21wKG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0LCBuYW1lKSkgeworCQkJaWYgKGxlbnApCisJCQkJKmxlbnAgPSBsZW47CisJCQlyZXR1cm4gdmFsOwogCQl9CiAJfQotfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBjb3VudF9ub2RlcyhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2NfZ2V0X3Byb3BlcnR5KTsKKwordTY0IG1kZXNjX25leHRfYXJjKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgZnJvbSwgY29uc3QgY2hhciAqYXJjX3R5cGUpCiB7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKmVwID0gbm9kZV9ibG9jayhtZGVzYyk7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKmVuZDsKLQl1bnNpZ25lZCBpbnQgY250ID0gMDsKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAsICpiYXNlID0gbm9kZV9ibG9jaygmaHAtPm1kZXNjKTsKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CiAKLQllbmQgPSAoKHZvaWQgKillcCkgKyBtZGVzYy0+bm9kZV9zejsKLQl3aGlsZSAoZXAgPCBlbmQpIHsKLQkJaWYgKGVwLT50YWcgPT0gTURfTk9ERSkKLQkJCWNudCsrOwotCQllcCsrOworCWlmIChmcm9tID09IE1ERVNDX05PREVfTlVMTCB8fCBmcm9tID49IGxhc3Rfbm9kZSkKKwkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKworCWVwID0gYmFzZSArIGZyb207CisKKwllcCsrOworCWZvciAoOyBlcC0+dGFnICE9IE1EX05PREVfRU5EOyBlcCsrKSB7CisJCWlmIChlcC0+dGFnICE9IE1EX1BST1BfQVJDKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChuYW1lcyArIGVwLT5uYW1lX29mZnNldCwgYXJjX3R5cGUpKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIGVwIC0gYmFzZTsKIAl9Ci0JcmV0dXJuIGNudDsKKworCXJldHVybiBNREVTQ19OT0RFX05VTEw7CiB9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25leHRfYXJjKTsKKwordTY0IG1kZXNjX2FyY190YXJnZXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBhcmMpCit7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwLCAqYmFzZSA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisKKwllcCA9IGJhc2UgKyBhcmM7CisKKwlyZXR1cm4gZXAtPmQudmFsOworfQorRVhQT1JUX1NZTUJPTChtZGVzY19hcmNfdGFyZ2V0KTsKKworY29uc3QgY2hhciAqbWRlc2Nfbm9kZV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbm9kZSkKK3sKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAsICpiYXNlID0gbm9kZV9ibG9jaygmaHAtPm1kZXNjKTsKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CisKKwlpZiAobm9kZSA9PSBNREVTQ19OT0RFX05VTEwgfHwgbm9kZSA+PSBsYXN0X25vZGUpCisJCXJldHVybiBOVUxMOworCisJZXAgPSBiYXNlICsgbm9kZTsKKwlpZiAoZXAtPnRhZyAhPSBNRF9OT0RFKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBuYW1lcyArIGVwLT5uYW1lX29mZnNldDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2Nfbm9kZV9uYW1lKTsKIAogc3RhdGljIHZvaWQgX19pbml0IHJlcG9ydF9wbGF0Zm9ybV9wcm9wZXJ0aWVzKHZvaWQpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKnBuID0gbWRfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBsYXRmb3JtIik7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAgPSBtZGVzY19ncmFiKCk7CisJdTY0IHBuID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJwbGF0Zm9ybSIpOwogCWNvbnN0IGNoYXIgKnM7CiAJY29uc3QgdTY0ICp2OwogCi0JaWYgKCFwbikgeworCWlmIChwbiA9PSBNREVTQ19OT0RFX05VTEwpIHsKIAkJcHJvbV9wcmludGYoIk5vIHBsYXRmb3JtIG5vZGUgaW4gbWFjaGluZS1kZXNjcmlwdGlvbi5cbiIpOwogCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlzID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAiYmFubmVyLW5hbWUiLCBOVUxMKTsKKwlzID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgImJhbm5lci1uYW1lIiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogYmFubmVyLW5hbWUgWyVzXVxuIiwgcyk7Ci0JcyA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIm5hbWUiLCBOVUxMKTsKKwlzID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm5hbWUiLCBOVUxMKTsKIAlwcmludGsoIlBMQVRGT1JNOiBuYW1lIFslc11cbiIsIHMpOwogCi0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgImhvc3RpZCIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAiaG9zdGlkIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IGhvc3RpZCBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgInNlcmlhbCMiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgInNlcmlhbCMiLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogc2VyaWFsIyBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgInN0aWNrLWZyZXF1ZW5jeSIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAic3RpY2stZnJlcXVlbmN5IiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogc3RpY2stZnJlcXVlbmN5IFslMDhseF1cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAibWFjLWFkZHJlc3MiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IG1hYy1hZGRyZXNzIFslbHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctcmVzb2x1dGlvbiBbJWx1IG1zXVxuIiwgKnYpOwotCXYgPSBtZF9nZXRfcHJvcGVydHkocG4sICJ3YXRjaGRvZy1tYXgtdGltZW91dCIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAid2F0Y2hkb2ctbWF4LXRpbWVvdXQiLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctbWF4LXRpbWVvdXQgWyVsdSBtc11cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAibWF4LWNwdXMiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1heC1jcHVzIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IG1heC1jcHVzIFslbHVdXG4iLCAqdik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJeworCQlpbnQgbWF4X2NwdSwgaTsKKworCQlpZiAodikgeworCQkJbWF4X2NwdSA9ICp2OworCQkJaWYgKG1heF9jcHUgPiBOUl9DUFVTKQorCQkJCW1heF9jcHUgPSBOUl9DUFVTOworCQl9IGVsc2UgeworCQkJbWF4X2NwdSA9IE5SX0NQVVM7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG1heF9jcHU7IGkrKykKKwkJCWNwdV9zZXQoaSwgY3B1X3Bvc3NpYmxlX21hcCk7CisJfQorI2VuZGlmCisKKwltZGVzY19yZWxlYXNlKGhwKTsKIH0KIAogc3RhdGljIGludCBpbmxpbmUgZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwgaW50IGxlbikKQEAgLTM2OSwxNSArNDYyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBmaWxsX2luX29uZV9jYWNoZShjcHVpbmZvX3NwYXJjICpjLCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXApCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZmlsbF9pbl9vbmVfY2FjaGUoY3B1aW5mb19zcGFyYyAqYywKKwkJCQkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsCisJCQkJCXU2NCBtcCkKIHsKLQljb25zdCB1NjQgKmxldmVsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAibGV2ZWwiLCBOVUxMKTsKLQljb25zdCB1NjQgKnNpemUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJzaXplIiwgTlVMTCk7Ci0JY29uc3QgdTY0ICpsaW5lX3NpemUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJsaW5lLXNpemUiLCBOVUxMKTsKKwljb25zdCB1NjQgKmxldmVsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImxldmVsIiwgTlVMTCk7CisJY29uc3QgdTY0ICpzaXplID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInNpemUiLCBOVUxMKTsKKwljb25zdCB1NjQgKmxpbmVfc2l6ZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJsaW5lLXNpemUiLCBOVUxMKTsKIAljb25zdCBjaGFyICp0eXBlOwogCWludCB0eXBlX2xlbjsKIAotCXR5cGUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJ0eXBlIiwgJnR5cGVfbGVuKTsKKwl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmdHlwZV9sZW4pOwogCiAJc3dpdGNoICgqbGV2ZWwpIHsKIAljYXNlIDE6CkBAIC00MDAsNDggKzQ5NSw0NSBAQAogCX0KIAogCWlmICgqbGV2ZWwgPT0gMSkgewotCQl1bnNpZ25lZCBpbnQgaTsKKwkJdTY0IGE7CiAKLQkJZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKKwkJbWRlc2NfZm9yX2VhY2hfYXJjKGEsIGhwLCBtcCwgTURFU0NfQVJDX1RZUEVfRldEKSB7CisJCQl1NjQgdGFyZ2V0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCQljb25zdCBjaGFyICpuYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0YXJnZXQpOwogCi0JCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJmd2QiKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFzdHJjbXAodC0+bmFtZSwgImNhY2hlIikpCi0JCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgdCk7CisJCQlpZiAoIXN0cmNtcChuYW1lLCAiY2FjaGUiKSkKKwkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBocCwgdGFyZ2V0KTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfY29yZV9pZHMoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBpbnQgY29yZV9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYXJrX2NvcmVfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgIGludCBjb3JlX2lkKQogewotCXVuc2lnbmVkIGludCBpOworCXU2NCBhOwogCi0JZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCXN0cnVjdCBtZGVzY19ub2RlICp0ID0gbXAtPmFyY3NbaV0uYXJjOworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0JBQ0spIHsKKwkJdTY0IHQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJY29uc3QgdTY0ICppZDsKIAotCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJiYWNrIikpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCAiY3B1IikpIHsKLQkJCWlkID0gbWRfZ2V0X3Byb3BlcnR5KHQsICJpZCIsIE5VTEwpOworCQluYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgImNwdSIpKSB7CisJCQlpZCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdCwgImlkIiwgTlVMTCk7CiAJCQlpZiAoKmlkIDwgTlJfQ1BVUykKIAkJCQljcHVfZGF0YSgqaWQpLmNvcmVfaWQgPSBjb3JlX2lkOwogCQl9IGVsc2UgewotCQkJdW5zaWduZWQgaW50IGo7CisJCQl1NjQgajsKIAotCQkJZm9yIChqID0gMDsgaiA8IHQtPm51bV9hcmNzOyBqKyspIHsKLQkJCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbiA9IHQtPmFyY3Nbal0uYXJjOworCQkJbWRlc2NfZm9yX2VhY2hfYXJjKGosIGhwLCB0LCBNREVTQ19BUkNfVFlQRV9CQUNLKSB7CisJCQkJdTY0IG4gPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBqKTsKKwkJCQljb25zdCBjaGFyICpuX25hbWU7CiAKLQkJCQlpZiAoc3RyY21wKHQtPmFyY3Nbal0ubmFtZSwgImJhY2siKSkKKwkJCQluX25hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIG4pOworCQkJCWlmIChzdHJjbXAobl9uYW1lLCAiY3B1IikpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJaWYgKHN0cmNtcChuLT5uYW1lLCAiY3B1IikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWQgPSBtZF9nZXRfcHJvcGVydHkobiwgImlkIiwgTlVMTCk7CisJCQkJaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG4sICJpZCIsIE5VTEwpOwogCQkJCWlmICgqaWQgPCBOUl9DUFVTKQogCQkJCQljcHVfZGF0YSgqaWQpLmNvcmVfaWQgPSBjb3JlX2lkOwogCQkJfQpAQCAtNDQ5LDc4ICs1NDEsODEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfY29yZV9pZHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXRfY29yZV9pZHMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwogCWludCBpZHg7CisJdTY0IG1wOwogCiAJaWR4ID0gMTsKLQltZF9mb3JfZWFjaF9ub2RlX2J5X25hbWUobXAsICJjYWNoZSIpIHsKLQkJY29uc3QgdTY0ICpsZXZlbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImxldmVsIiwgTlVMTCk7CisJbWRlc2NfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGhwLCBtcCwgImNhY2hlIikgeworCQljb25zdCB1NjQgKmxldmVsOwogCQljb25zdCBjaGFyICp0eXBlOwogCQlpbnQgbGVuOwogCisJCWxldmVsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImxldmVsIiwgTlVMTCk7CiAJCWlmICgqbGV2ZWwgIT0gMSkKIAkJCWNvbnRpbnVlOwogCi0JCXR5cGUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJ0eXBlIiwgJmxlbik7CisJCXR5cGUgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAidHlwZSIsICZsZW4pOwogCQlpZiAoIWZpbmRfaW5fcHJvcGxpc3QodHlwZSwgImluc3RuIiwgbGVuKSkKIAkJCWNvbnRpbnVlOwogCi0JCW1hcmtfY29yZV9pZHMobXAsIGlkeCk7CisJCW1hcmtfY29yZV9pZHMoaHAsIG1wLCBpZHgpOwogCiAJCWlkeCsrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfcHJvY19pZHMoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBpbnQgcHJvY19pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYXJrX3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgIGludCBwcm9jX2lkKQogewotCWludCBpOworCXU2NCBhOwogCi0JZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCXN0cnVjdCBtZGVzY19ub2RlICp0ID0gbXAtPmFyY3NbaV0uYXJjOworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0JBQ0spIHsKKwkJdTY0IHQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJY29uc3QgdTY0ICppZDsKIAotCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJiYWNrIikpCisJCW5hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIHQpOworCQlpZiAoc3RyY21wKG5hbWUsICJjcHUiKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzdHJjbXAodC0+bmFtZSwgImNwdSIpKQotCQkJY29udGludWU7Ci0KLQkJaWQgPSBtZF9nZXRfcHJvcGVydHkodCwgImlkIiwgTlVMTCk7CisJCWlkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0LCAiaWQiLCBOVUxMKTsKIAkJaWYgKCppZCA8IE5SX0NQVVMpCiAJCQljcHVfZGF0YSgqaWQpLnByb2NfaWQgPSBwcm9jX2lkOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IF9fc2V0X3Byb2NfaWRzKGNvbnN0IGNoYXIgKmV4ZWNfdW5pdF9uYW1lKQorc3RhdGljIHZvaWQgX19kZXZpbml0IF9fc2V0X3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkJCSAgICAgY29uc3QgY2hhciAqZXhlY191bml0X25hbWUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwogCWludCBpZHg7CisJdTY0IG1wOwogCiAJaWR4ID0gMDsKLQltZF9mb3JfZWFjaF9ub2RlX2J5X25hbWUobXAsIGV4ZWNfdW5pdF9uYW1lKSB7CisJbWRlc2NfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGhwLCBtcCwgZXhlY191bml0X25hbWUpIHsKIAkJY29uc3QgY2hhciAqdHlwZTsKIAkJaW50IGxlbjsKIAotCQl0eXBlID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAidHlwZSIsICZsZW4pOworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmbGVuKTsKIAkJaWYgKCFmaW5kX2luX3Byb3BsaXN0KHR5cGUsICJpbnQiLCBsZW4pICYmCiAJCSAgICAhZmluZF9pbl9wcm9wbGlzdCh0eXBlLCAiaW50ZWdlciIsIGxlbikpCiAJCQljb250aW51ZTsKIAotCQltYXJrX3Byb2NfaWRzKG1wLCBpZHgpOworCQltYXJrX3Byb2NfaWRzKGhwLCBtcCwgaWR4KTsKIAogCQlpZHgrKzsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfcHJvY19pZHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXRfcHJvY19pZHMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0JX19zZXRfcHJvY19pZHMoImV4ZWNfdW5pdCIpOwotCV9fc2V0X3Byb2NfaWRzKCJleGVjLXVuaXQiKTsKKwlfX3NldF9wcm9jX2lkcyhocCwgImV4ZWNfdW5pdCIpOworCV9fc2V0X3Byb2NfaWRzKGhwLCAiZXhlYy11bml0Iik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfb25lX21vbmRvX2JpdHMoY29uc3QgdTY0ICpwLCB1bnNpZ25lZCBpbnQgKm1hc2ssIHVuc2lnbmVkIGNoYXIgZGVmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9vbmVfbW9uZG9fYml0cyhjb25zdCB1NjQgKnAsIHVuc2lnbmVkIGludCAqbWFzaywKKwkJCQkJIHVuc2lnbmVkIGNoYXIgZGVmKQogewogCXU2NCB2YWw7CiAKQEAgLTUzOCwzNSArNjMzLDM3IEBACiAJKm1hc2sgPSAoKDFVIDw8IGRlZikgKiA2NFUpIC0gMVU7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfbW9uZG9fZGF0YShzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsIHN0cnVjdCB0cmFwX3Blcl9jcHUgKnRiKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9tb25kb19kYXRhKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgICBzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YikKIHsKIAljb25zdCB1NjQgKnZhbDsKIAotCXZhbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgInEtY3B1LW1vbmRvLSNiaXRzIiwgTlVMTCk7CisJdmFsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInEtY3B1LW1vbmRvLSNiaXRzIiwgTlVMTCk7CiAJZ2V0X29uZV9tb25kb19iaXRzKHZhbCwgJnRiLT5jcHVfbW9uZG9fcW1hc2ssIDcpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1kZXYtbW9uZG8tI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1kZXYtbW9uZG8tI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPmRldl9tb25kb19xbWFzaywgNyk7CiAKLQl2YWwgPSBtZF9nZXRfcHJvcGVydHkobXAsICJxLXJlc3VtYWJsZS0jYml0cyIsIE5VTEwpOworCXZhbCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJxLXJlc3VtYWJsZS0jYml0cyIsIE5VTEwpOwogCWdldF9vbmVfbW9uZG9fYml0cyh2YWwsICZ0Yi0+cmVzdW1fcW1hc2ssIDYpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1ub25yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1ub25yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPm5vbnJlc3VtX3FtYXNrLCAyKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEodm9pZCkKK3ZvaWQgX19kZXZpbml0IG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoY3B1bWFza190IG1hc2spCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwID0gbWRlc2NfZ3JhYigpOworCXU2NCBtcDsKIAogCW5jcHVzX3Byb2JlZCA9IDA7Ci0JbWRfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG1wLCAiY3B1IikgewotCQljb25zdCB1NjQgKmlkID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAiaWQiLCBOVUxMKTsKLQkJY29uc3QgdTY0ICpjZnJlcSA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCW1kZXNjX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShocCwgbXAsICJjcHUiKSB7CisJCWNvbnN0IHU2NCAqaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiaWQiLCBOVUxMKTsKKwkJY29uc3QgdTY0ICpjZnJlcSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGI7CiAJCWNwdWluZm9fc3BhcmMgKmM7Ci0JCXVuc2lnbmVkIGludCBpOwogCQlpbnQgY3B1aWQ7CisJCXU2NCBhOwogCiAJCW5jcHVzX3Byb2JlZCsrOwogCkBAIC01NzUsNiArNjcyLDggQEAKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmIChjcHVpZCA+PSBOUl9DUFVTKQogCQkJY29udGludWU7CisJCWlmICghY3B1X2lzc2V0KGNwdWlkLCBtYXNrKSkKKwkJCWNvbnRpbnVlOwogI2Vsc2UKIAkJLyogT24gdW5pcHJvY2Vzc29yIHdlIG9ubHkgd2FudCB0aGUgdmFsdWVzIGZvciB0aGUKIAkJICogcmVhbCBwaHlzaWNhbCBjcHUgdGhlIGtlcm5lbCBib290ZWQgb250bywgaG93ZXZlcgpAQCAtNTg5LDM1ICs2ODgsMzAgQEAKIAkJYy0+Y2xvY2tfdGljayA9ICpjZnJlcTsKIAogCQl0YiA9ICZ0cmFwX2Jsb2NrW2NwdWlkXTsKLQkJZ2V0X21vbmRvX2RhdGEobXAsIHRiKTsKKwkJZ2V0X21vbmRvX2RhdGEoaHAsIG1wLCB0Yik7CiAKLQkJZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKLQkJCXVuc2lnbmVkIGludCBqOworCQltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG1wLCBNREVTQ19BUkNfVFlQRV9GV0QpIHsKKwkJCXU2NCBqLCB0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCQljb25zdCBjaGFyICp0X25hbWU7CiAKLQkJCWlmIChzdHJjbXAobXAtPmFyY3NbaV0ubmFtZSwgImZ3ZCIpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCAiY2FjaGUiKSkgewotCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIHQpOworCQkJdF9uYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJCWlmICghc3RyY21wKHRfbmFtZSwgImNhY2hlIikpIHsKKwkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBocCwgdCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWZvciAoaiA9IDA7IGogPCB0LT5udW1fYXJjczsgaisrKSB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKm47CisJCQltZGVzY19mb3JfZWFjaF9hcmMoaiwgaHAsIHQsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQkJCXU2NCBuID0gbWRlc2NfYXJjX3RhcmdldChocCwgaik7CisJCQkJY29uc3QgY2hhciAqbl9uYW1lOwogCi0JCQkJbiA9IHQtPmFyY3Nbal0uYXJjOwotCQkJCWlmIChzdHJjbXAodC0+YXJjc1tqXS5uYW1lLCAiZndkIikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKCFzdHJjbXAobi0+bmFtZSwgImNhY2hlIikpCi0JCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIG4pOworCQkJCW5fbmFtZSA9IG1kZXNjX25vZGVfbmFtZShocCwgbik7CisJCQkJaWYgKCFzdHJjbXAobl9uYW1lLCAiY2FjaGUiKSkKKwkJCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgaHAsIG4pOwogCQkJfQogCQl9CiAKICNpZmRlZiBDT05GSUdfU01QCiAJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7Ci0JCWNwdV9zZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKICNlbmRpZgogCiAJCWMtPmNvcmVfaWQgPSAwOwpAQCAtNjI4LDQ1ICs3MjIsNDMgQEAKIAlzcGFyYzY0X211bHRpX2NvcmUgPSAxOwogI2VuZGlmCiAKLQlzZXRfY29yZV9pZHMoKTsKLQlzZXRfcHJvY19pZHMoKTsKKwlzZXRfY29yZV9pZHMoaHApOworCXNldF9wcm9jX2lkcyhocCk7CiAKIAlzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKIH0KIAogdm9pZCBfX2luaXQgc3VuNHZfbWRlc2NfaW5pdCh2b2lkKQogeworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOwogCXVuc2lnbmVkIGxvbmcgbGVuLCByZWFsX2xlbiwgc3RhdHVzOworCWNwdW1hc2tfdCBtYXNrOwogCiAJKHZvaWQpIHN1bjR2X21hY2hfZGVzYygwVUwsIDBVTCwgJmxlbik7CiAKIAlwcmludGsoIk1ERVNDOiBTaXplIGlzICVsdSBieXRlcy5cbiIsIGxlbik7CiAKLQltYWluX21kZXNjID0gbWRlc2NfZWFybHlfYWxsb2MobGVuKTsKKwlocCA9IG1kZXNjX2FsbG9jKGxlbiwgJmJvb3RtZW1fbWRlc2NfbWVtb3BzKTsKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlwcm9tX3ByaW50ZigiTURFU0M6IGFsbG9jIG9mICVsdSBieXRlcyBmYWlsZWQuXG4iLCBsZW4pOworCQlwcm9tX2hhbHQoKTsKKwl9CiAKLQlzdGF0dXMgPSBzdW40dl9tYWNoX2Rlc2MoX19wYShtYWluX21kZXNjKSwgbGVuLCAmcmVhbF9sZW4pOworCXN0YXR1cyA9IHN1bjR2X21hY2hfZGVzYyhfX3BhKCZocC0+bWRlc2MpLCBsZW4sICZyZWFsX2xlbik7CiAJaWYgKHN0YXR1cyAhPSBIVl9FT0sgfHwgcmVhbF9sZW4gPiBsZW4pIHsKIAkJcHJvbV9wcmludGYoInN1bjR2X21hY2hfZGVzYyBmYWlscywgZXJyKCVsdSksICIKIAkJCSAgICAibGVuKCVsdSksIHJlYWxfbGVuKCVsdSlcbiIsCiAJCQkgICAgc3RhdHVzLCBsZW4sIHJlYWxfbGVuKTsKKwkJbWRlc2NfZnJlZShocCk7CiAJCXByb21faGFsdCgpOwogCX0KIAotCWxlbiA9IGNvdW50X25vZGVzKG1haW5fbWRlc2MpOwotCXByaW50aygiTURFU0M6ICVsdSBub2Rlcy5cbiIsIGxlbik7Ci0KLQlsZW4gPSByb3VuZHVwX3Bvd19vZl90d28obGVuKTsKLQotCW1kZXNjX2hhc2ggPSBtZGVzY19lYXJseV9hbGxvYyhsZW4gKiBzaXplb2Yoc3RydWN0IG1kZXNjX25vZGUgKikpOwotCW1kZXNjX2hhc2hfc2l6ZSA9IGxlbjsKLQotCXByaW50aygiTURFU0M6IEhhc2ggc2l6ZSAlbHUgZW50cmllcy5cbiIsIGxlbik7Ci0KLQlidWlsZF9hbGxfbm9kZXMobWFpbl9tZGVzYyk7Ci0KLQlwcmludGsoIk1ERVNDOiBCdWlsdCBncmFwaCB3aXRoICV1IGJ5dGVzIG9mIG1lbW9yeS5cbiIsCi0JICAgICAgIG1kZXNjX2Vhcmx5X2FsbG9jYXRlZCk7CisJY3VyX21kZXNjID0gaHA7CiAKIAlyZXBvcnRfcGxhdGZvcm1fcHJvcGVydGllcygpOwotCW1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoKTsKKworCWNwdXNfc2V0YWxsKG1hc2spOworCW1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEobWFzayk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKaW5kZXggNWQ2YWRlYS4uOGRkNDI5NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYwpAQCAtMSw3ICsxLDYgQEAKLS8qICRJZDogcG93ZXIuYyx2IDEuMTAgMjAwMS8xMi8xMSAwMTo1NzoxNiBkYXZlbSBFeHAgJAotICogcG93ZXIuYzogUG93ZXIgbWFuYWdlbWVudCBkcml2ZXIuCisvKiBwb3dlci5jOiBQb3dlciBtYW5hZ2VtZW50IGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xOSw2ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Bvd2VyLmg+CiAjaW5jbHVkZSA8YXNtL3NzdGF0ZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CkBAIC0yOSwyNCArMjksMjYgQEAKICAqLwogaW50IHNjb25zX3B3cm9mZiA9IDE7IAogCi0jaWZkZWYgQ09ORklHX1BDSQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogc3RhdGljIHZvaWQgX19pb21lbSAqcG93ZXJfcmVnOwogCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocG93ZXJkX3dhaXQpOwogc3RhdGljIGludCBidXR0b25fcHJlc3NlZDsKIAotc3RhdGljIGlycXJldHVybl90IHBvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQordm9pZCB3YWtlX3VwX3Bvd2VyZCh2b2lkKQogewogCWlmIChidXR0b25fcHJlc3NlZCA9PSAwKSB7CiAJCWJ1dHRvbl9wcmVzc2VkID0gMTsKIAkJd2FrZV91cCgmcG93ZXJkX3dhaXQpOwogCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHBvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXdha2VfdXBfcG93ZXJkKCk7CiAKIAkvKiBGSVhNRTogQ2hlY2sgcmVnaXN0ZXJzIGZvciBzdGF0dXMuLi4gKi8KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiBleHRlcm4gdm9pZCBtYWNoaW5lX2hhbHQodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX2FsdF9wb3dlcl9vZmYodm9pZCk7CkBAIC01NiwxOSArNTgsMTggQEAKIHsKIAlzc3RhdGVfcG93ZXJvZmYoKTsKIAlpZiAoIXNlcmlhbF9jb25zb2xlIHx8IHNjb25zX3B3cm9mZikgewotI2lmZGVmIENPTkZJR19QQ0kKIAkJaWYgKHBvd2VyX3JlZykgewogCQkJLyogQm90aCByZWdpc3RlciBiaXRzIHNlZW0gdG8gaGF2ZSB0aGUKIAkJCSAqIHNhbWUgZWZmZWN0LCBzbyB1bnRpbCBJIGZpZ3VyZSBvdXQKIAkJCSAqIHdoYXQgdGhlIGRpZmZlcmVuY2UgaXMuLi4KIAkJCSAqLwogCQkJd3JpdGVsKEFVWElPX1BDSU9fQ1BXUl9PRkYgfCBBVVhJT19QQ0lPX1NQV1JfT0ZGLCBwb3dlcl9yZWcpOwotCQl9IGVsc2UKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisJCX0gZWxzZSB7CiAJCQlpZiAocG93ZXJvZmZfbWV0aG9kICE9IE5VTEwpIHsKIAkJCQlwb3dlcm9mZl9tZXRob2QoKTsKIAkJCQkvKiBub3QgcmVhY2hlZCAqLwogCQkJfQorCQl9CiAJfQogCW1hY2hpbmVfaGFsdCgpOwogfQpAQCAtNzYsNyArNzcsNiBAQAogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBtYWNoaW5lX3Bvd2VyX29mZjsKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgcG93ZXJkKHZvaWQgKl9fdW51c2VkKQogewogCXN0YXRpYyBjaGFyICplbnZwW10gPSB7ICJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS9zYmluOi91c3Ivc2JpbjovYmluOi91c3IvYmluIiwgTlVMTCB9OwpAQCAtODYsNyArODYsNyBAQAogCWRhZW1vbml6ZSgicG93ZXJkIik7CiAKIAlhZGRfd2FpdF9xdWV1ZSgmcG93ZXJkX3dhaXQsICZ3YWl0KTsKLWFnYWluOgorCiAJZm9yICg7OykgewogCQlzZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoYnV0dG9uX3ByZXNzZWQpCkBAIC0xMDAsMTYgKzEwMCwyOCBAQAogCS8qIE9rLCBkb3duIHdlIGdvLi4uICovCiAJYnV0dG9uX3ByZXNzZWQgPSAwOwogCWlmIChrZXJuZWxfZXhlY3ZlKCIvc2Jpbi9zaHV0ZG93biIsIGFyZ3YsIGVudnApIDwgMCkgewotCQlwcmludGsoInBvd2VyZDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7Ci0JCWFkZF93YWl0X3F1ZXVlKCZwb3dlcmRfd2FpdCwgJndhaXQpOwotCQlnb3RvIGFnYWluOworCQlwcmludGsoS0VSTl9FUlIgInBvd2VyZDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7CisJCW1hY2hpbmVfcG93ZXJfb2ZmKCk7CiAJfQogCXJldHVybiAwOwogfQogCitpbnQgc3RhcnRfcG93ZXJkKHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGtlcm5lbF90aHJlYWQocG93ZXJkLCBOVUxMLCBDTE9ORV9GUyk7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX0VSUiAicG93ZXI6IEZhaWxlZCB0byBzdGFydCBwb3dlciBkYWVtb24uXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gInBvd2VyOiBwb3dlcmQgcnVubmluZy5cbiIpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBfX2luaXQgaGFzX2J1dHRvbl9pbnRlcnJ1cHQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKLQlpZiAoaXJxID09IFBDSV9JUlFfTk9ORSkKKwlpZiAoaXJxID09IDB4ZmZmZmZmZmYpCiAJCXJldHVybiAwOwogCWlmICghb2ZfZmluZF9wcm9wZXJ0eShkcCwgImJ1dHRvbiIsIE5VTEwpKQogCQlyZXR1cm4gMDsKQEAgLTEzMCwxNyArMTQyLDE0IEBACiAJcG93ZXJvZmZfbWV0aG9kID0gbWFjaGluZV9oYWx0OyAgLyogYWJsZSB0byB1c2UgdGhlIHN0YW5kYXJkIGhhbHQgKi8KIAogCWlmIChoYXNfYnV0dG9uX2ludGVycnVwdChpcnEsIG9wLT5ub2RlKSkgewotCQlpZiAoa2VybmVsX3RocmVhZChwb3dlcmQsIE5VTEwsIENMT05FX0ZTKSA8IDApIHsKLQkJCXByaW50aygiRmFpbGVkIHRvIHN0YXJ0IHBvd2VyIGRhZW1vbi5cbiIpOworCQlpZiAoc3RhcnRfcG93ZXJkKCkgPCAwKQogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHJpbnRrKCJwb3dlcmQgcnVubmluZy5cbiIpOwogCiAJCWlmIChyZXF1ZXN0X2lycShpcnEsCiAJCQkJcG93ZXJfaGFuZGxlciwgMCwgInBvd2VyIiwgTlVMTCkgPCAwKQotCQkJcHJpbnRrKCJwb3dlcjogRXJyb3IsIGNhbm5vdCByZWdpc3RlciBJUlEgaGFuZGxlci5cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJwb3dlcjogQ2Fubm90IHNldHVwIElSUSBoYW5kbGVyLlxuIik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKCJub3QgdXNpbmcgcG93ZXJkLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInBvd2VyOiBOb3QgdXNpbmcgcG93ZXJkLlxuIik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjQsNCArMTczLDMgQEAKIAlvZl9yZWdpc3Rlcl9kcml2ZXIoJnBvd2VyX2RyaXZlciwgJm9mX2J1c190eXBlKTsKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBmNWY5N2UyLi45MzU1NzUwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDksNyArNTAsNyBAQAogCiAvKiAjZGVmaW5lIFZFUkJPU0VfU0hPV1JFR1MgKi8KIAotc3RhdGljIHZvaWQgc3BhcmM2NF95aWVsZCh2b2lkKQorc3RhdGljIHZvaWQgc3BhcmM2NF95aWVsZChpbnQgY3B1KQogewogCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKQogCQlyZXR1cm47CkBAIC01Nyw3ICs1OCw3IEBACiAJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCi0Jd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgeworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKIAkJdW5zaWduZWQgbG9uZyBwc3RhdGU7CiAKIAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLiAqLwpAQCAtNjgsNyArNjksNyBAQAogCQkJOiAiPSZyIiAocHN0YXRlKQogCQkJOiAiaSIgKFBTVEFURV9JRSkpOwogCi0JCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCWlmICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpCiAJCQlzdW40dl9jcHVfeWllbGQoKTsKIAogCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cy4gKi8KQEAgLTg2LDE1ICs4NywyNSBAQAogLyogVGhlIGlkbGUgbG9vcCBvbiBzcGFyYzY0LiAqLwogdm9pZCBjcHVfaWRsZSh2b2lkKQogeworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKIAlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAogCXdoaWxlKDEpIHsKIAkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygpOwotCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQkJc3BhcmM2NF95aWVsZCgpOworCisJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpCisJCQlzcGFyYzY0X3lpZWxkKGNwdSk7CisKIAkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOwogCiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCQlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkKKwkJCWNwdV9wbGF5X2RlYWQoKTsKKyNlbmRpZgorCiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKaW5kZXggNjEwMzZiMy4uNWQyMjAzMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTE4MDgsNyArMTgwOCw3IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7Ci0JCWNwdV9zZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwkJY3B1X3NldChjcHVpZCwgY3B1X3Bvc3NpYmxlX21hcCk7CiAjZW5kaWYKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwppbmRleCA3NDkwY2M2Li5hYWZkZTNkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCkBAIC00NDIsNyArNDQyLDYgQEAKIAkJICAgIkQkIHBhcml0eSB0bDFcdDogJXVcbiIKIAkJICAgIkkkIHBhcml0eSB0bDFcdDogJXVcbiIKICNpZm5kZWYgQ09ORklHX1NNUAotCQkgICAiQ3B1MEJvZ29cdDogJWx1LiUwMmx1XG4iCiAJCSAgICJDcHUwQ2xrVGNrXHQ6ICUwMTZseFxuIgogI2VuZGlmCiAJCSAgICwKQEAgLTQ1Nyw5ICs0NTYsNyBAQAogCQkgICBkY2FjaGVfcGFyaXR5X3RsMV9vY2N1cnJlZCwKIAkJICAgaWNhY2hlX3Bhcml0eV90bDFfb2NjdXJyZWQKICNpZm5kZWYgQ09ORklHX1NNUAotCQkgICAsIGNwdV9kYXRhKDApLnVkZWxheV92YWwvKDUwMDAwMC9IWiksCi0JCSAgIChjcHVfZGF0YSgwKS51ZGVsYXlfdmFsLyg1MDAwL0haKSkgJSAxMDAsCi0JCSAgIGNwdV9kYXRhKDApLmNsb2NrX3RpY2sKKwkJICAgLCBjcHVfZGF0YSgwKS5jbG9ja190aWNrCiAjZW5kaWYKIAkJKTsKICNpZmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwppbmRleCA0MGU0MGY5Li5iNDQ4ZDMzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKQEAgLTEsNiArMSw2IEBACiAvKiBzbXAuYzogU3BhcmM2NCBTTVAgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KKyNpbmNsdWRlIDxhc20vaHZ0cmFtcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgpAQCAtNDEsMjIgKzQzLDI2IEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KIAogZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpOwogCiBpbnQgc3BhcmM2NF9tdWx0aV9jb3JlIF9fcmVhZF9tb3N0bHk7CiAKLS8qIFBsZWFzZSBkb24ndCBtYWtlIHRoaXMgc3R1ZmYgaW5pdGRhdGEhISEgIC0tRGF2ZU0gKi8KLXVuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7Ci0KK2NwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9vbmxpbmVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwotY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OwogY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OworCitFWFBPUlRfU1lNQk9MKGNwdV9wb3NzaWJsZV9tYXApOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9zaWJsaW5nX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9jb3JlX21hcCk7CisKIHN0YXRpYyBjcHVtYXNrX3Qgc21wX2NvbW1lbmNlZF9tYXNrOwotc3RhdGljIGNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CiAKIHZvaWQgc21wX2luZm8oc3RydWN0IHNlcV9maWxlICptKQogewpAQCAtNzMsMTggKzc5LDE3IEBACiAJCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKQogCQlzZXFfcHJpbnRmKG0sCi0JCQkgICAiQ3B1JWRCb2dvXHQ6ICVsdS4lMDJsdVxuIgogCQkJICAgIkNwdSVkQ2xrVGNrXHQ6ICUwMTZseFxuIiwKLQkJCSAgIGksIGNwdV9kYXRhKGkpLnVkZWxheV92YWwgLyAoNTAwMDAwL0haKSwKLQkJCSAgIChjcHVfZGF0YShpKS51ZGVsYXlfdmFsIC8gKDUwMDAvSFopKSAlIDEwMCwKIAkJCSAgIGksIGNwdV9kYXRhKGkpLmNsb2NrX3RpY2spOwogfQogCitzdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CisKIGV4dGVybiB2b2lkIHNldHVwX3NwYXJjNjRfdGltZXIodm9pZCk7CiAKIHN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNhbGxpbl9mbGFnID0gMDsKIAotdm9pZCBfX2luaXQgc21wX2NhbGxpbih2b2lkKQordm9pZCBfX2RldmluaXQgc21wX2NhbGxpbih2b2lkKQogewogCWludCBjcHVpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCkBAIC0xMDIsOCArMTA3LDYgQEAKIAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCWNhbGlicmF0ZV9kZWxheSgpOwotCWNwdV9kYXRhKGNwdWlkKS51ZGVsYXlfdmFsID0gbG9vcHNfcGVyX2ppZmZ5OwogCWNhbGxpbl9mbGFnID0gMTsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygibWVtYmFyICNTeW5jXG5cdCIKIAkJCSAgICAgImZsdXNoICAlJWc2IiA6IDogOiAibWVtb3J5Iik7CkBAIC0xMjAsNyArMTIzLDkgQEAKIAl3aGlsZSAoIWNwdV9pc3NldChjcHVpZCwgc21wX2NvbW1lbmNlZF9tYXNrKSkKIAkJcm1iKCk7CiAKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CiAJY3B1X3NldChjcHVpZCwgY3B1X29ubGluZV9tYXApOworCXNwaW5fdW5sb2NrKCZjYWxsX2xvY2spOwogCiAJLyogaWRsZSB0aHJlYWQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBwcmVlbXB0IGRpc2FibGVkICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7CkBAIC0yNjgsNiArMjczLDY3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXRjX3N5bmNfbG9jaywgZmxhZ3MpOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfU1VOX0xET01TKSAmJiBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkKKy8qIFhYWCBQdXQgdGhpcyBpbiBzb21lIGNvbW1vbiBwbGFjZS4gWFhYICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBraW1hZ2VfYWRkcl90b19yYSh2b2lkICpwKQoreworCXVuc2lnbmVkIGxvbmcgdmFsID0gKHVuc2lnbmVkIGxvbmcpIHA7CisKKwlyZXR1cm4ga2Vybl9iYXNlICsgKHZhbCAtIEtFUk5CQVNFKTsKK30KKworc3RhdGljIHZvaWQgbGRvbV9zdGFydGNwdV9jcHVpZCh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIHRocmVhZF9yZWcpCit7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3BhcmM2NF90dGFibGVfdGwwOworCWV4dGVybiB1bnNpZ25lZCBsb25nIGtlcm5fbG9ja2VkX3R0ZV9kYXRhOworCWV4dGVybiBpbnQgYmlna2VybmVsOworCXN0cnVjdCBodnRyYW1wX2Rlc2NyICpoZGVzYzsKKwl1bnNpZ25lZCBsb25nIHRyYW1wb2xpbmVfcmE7CisJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGI7CisJdTY0IHR0ZV92YWRkciwgdHRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwloZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpoZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghaGRlc2MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsZG9tX3N0YXJ0Y3B1X2NwdWlkOiBDYW5ub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImh2dHJhbXBfZGVzY3IuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWhkZXNjLT5jcHUgPSBjcHU7CisJaGRlc2MtPm51bV9tYXBwaW5ncyA9IChiaWdrZXJuZWwgPyAyIDogMSk7CisKKwl0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CisJdGItPmhkZXNjID0gaGRlc2M7CisKKwloZGVzYy0+ZmF1bHRfaW5mb192YSA9ICh1bnNpZ25lZCBsb25nKSAmdGItPmZhdWx0X2luZm87CisJaGRlc2MtPmZhdWx0X2luZm9fcGEgPSBraW1hZ2VfYWRkcl90b19yYSgmdGItPmZhdWx0X2luZm8pOworCisJaGRlc2MtPnRocmVhZF9yZWcgPSB0aHJlYWRfcmVnOworCisJdHRlX3ZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIEtFUk5CQVNFOworCXR0ZV9kYXRhID0ga2Vybl9sb2NrZWRfdHRlX2RhdGE7CisKKwloZGVzYy0+bWFwc1swXS52YWRkciA9IHR0ZV92YWRkcjsKKwloZGVzYy0+bWFwc1swXS50dGUgICA9IHR0ZV9kYXRhOworCWlmIChiaWdrZXJuZWwpIHsKKwkJdHRlX3ZhZGRyICs9IDB4NDAwMDAwOworCQl0dGVfZGF0YSAgKz0gMHg0MDAwMDA7CisJCWhkZXNjLT5tYXBzWzFdLnZhZGRyID0gdHRlX3ZhZGRyOworCQloZGVzYy0+bWFwc1sxXS50dGUgICA9IHR0ZV9kYXRhOworCX0KKworCXRyYW1wb2xpbmVfcmEgPSBraW1hZ2VfYWRkcl90b19yYShodl9jcHVfc3RhcnR1cCk7CisKKwlodl9lcnIgPSBzdW40dl9jcHVfc3RhcnQoY3B1LCB0cmFtcG9saW5lX3JhLAorCQkJCSBraW1hZ2VfYWRkcl90b19yYSgmc3BhcmM2NF90dGFibGVfdGwwKSwKKwkJCQkgX19wYShoZGVzYykpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiAibGRvbV9zdGFydGNwdV9jcHVpZDogc3VuNHZfY3B1X3N0YXJ0KCkgIgorCQkgICAgICAgImdpdmVzIGVycm9yICVsdVxuIiwgaHZfZXJyKTsKK30KKyNlbmRpZgorCiBleHRlcm4gdm9pZCBzdW40dl9pbml0X21vbmRvX3F1ZXVlcyhpbnQgdXNlX2Jvb3RtZW0sIGludCBjcHUsIGludCBhbGxvYywgaW50IGxvYWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyYzY0X2NwdV9zdGFydHVwOwpAQCAtMjgwLDYgKzM0Niw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNtcF9ib290X29uZV9jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKKwlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CiAJdW5zaWduZWQgbG9uZyBlbnRyeSA9CiAJCSh1bnNpZ25lZCBsb25nKSgmc3BhcmM2NF9jcHVfc3RhcnR1cCk7CiAJdW5zaWduZWQgbG9uZyBjb29raWUgPQpAQCAtMjkwLDIwICszNTcsMjUgQEAKIAlwID0gZm9ya19pZGxlKGNwdSk7CiAJY2FsbGluX2ZsYWcgPSAwOwogCWNwdV9uZXdfdGhyZWFkID0gdGFza190aHJlYWRfaW5mbyhwKTsKLQljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKIAogCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CiAJCS8qIEFsbG9jIHRoZSBtb25kbyBxdWV1ZXMsIGNwdSB3aWxsIGxvYWQgdGhlbS4gICovCiAJCXN1bjR2X2luaXRfbW9uZG9fcXVldWVzKDAsIGNwdSwgMSwgMCk7CiAKLQkJcHJvbV9zdGFydGNwdV9jcHVpZChjcHUsIGVudHJ5LCBjb29raWUpOworI2lmIGRlZmluZWQoQ09ORklHX1NVTl9MRE9NUykgJiYgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCisJCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQkJbGRvbV9zdGFydGNwdV9jcHVpZChjcHUsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZykgY3B1X25ld190aHJlYWQpOworCQllbHNlCisjZW5kaWYKKwkJCXByb21fc3RhcnRjcHVfY3B1aWQoY3B1LCBlbnRyeSwgY29va2llKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb2ZfZmluZF9ub2RlX2J5X2NwdWlkKGNwdSk7CiAKIAkJcHJvbV9zdGFydGNwdShkcC0+bm9kZSwgZW50cnksIGNvb2tpZSk7CiAJfQogCi0JZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDUwMDAwMDA7IHRpbWVvdXQrKykgeworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCA1MDAwMDsgdGltZW91dCsrKSB7CiAJCWlmIChjYWxsaW5fZmxhZykKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMTAwKTsKQEAgLTMxMywxMSArMzg1LDE1IEBACiAJCXJldCA9IDA7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKCJQcm9jZXNzb3IgJWQgaXMgc3R1Y2suXG4iLCBjcHUpOwotCQljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbG91dF9tYXApOwogCQlyZXQgPSAtRU5PREVWOwogCX0KIAljcHVfbmV3X3RocmVhZCA9IE5VTEw7CiAKKwlpZiAodGItPmhkZXNjKSB7CisJCWtmcmVlKHRiLT5oZGVzYyk7CisJCXRiLT5oZGVzYyA9IE5VTEw7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzIwLDcgKzc5Niw2IEBACiAJaW50IHdhaXQ7CiB9OwogCi1zdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CiBzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKmNhbGxfZGF0YTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgeGNhbGxfY2FsbF9mdW5jdGlvbjsKQEAgLTExNTIsMzQgKzEyMjcsMTQgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi12b2lkIF9faW5pdCBzbXBfdGlja19pbml0KHZvaWQpCi17Ci0JYm9vdF9jcHVfaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLX0KLQogLyogL3Byb2MvcHJvZmlsZSB3cml0ZXMgY2FuIGNhbGwgdGhpcywgZG9uJ3QgX19pbml0IGl0IHBsZWFzZS4gKi8KIGludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLS8qIENvbnN0cmFpbiB0aGUgbnVtYmVyIG9mIGNwdXMgdG8gbWF4X2NwdXMuICAqLwogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7Ci0JaW50IGk7Ci0KLQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IG1heF9jcHVzKSB7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCQlpZiAoaSAhPSBib290X2NwdV9pZCkgewotCQkJCWNwdV9jbGVhcihpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0JCQkJY3B1X2NsZWFyKGksIGNwdV9wcmVzZW50X21hcCk7Ci0JCQkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPD0gbWF4X2NwdXMpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JY3B1X2RhdGEoYm9vdF9jcHVfaWQpLnVkZWxheV92YWwgPSBsb29wc19wZXJfamlmZnk7CiB9CiAKIHZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCkBAIC0xMTkwLDMwICsxMjQ1LDMyIEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGo7CiAKKwkJY3B1c19jbGVhcihjcHVfY29yZV9tYXBbaV0pOwogCQlpZiAoY3B1X2RhdGEoaSkuY29yZV9pZCA9PSAwKSB7CiAJCQljcHVfc2V0KGksIGNwdV9jb3JlX21hcFtpXSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKSB7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGopIHsKIAkJCWlmIChjcHVfZGF0YShpKS5jb3JlX2lkID09CiAJCQkgICAgY3B1X2RhdGEoaikuY29yZV9pZCkKIAkJCQljcHVfc2V0KGosIGNwdV9jb3JlX21hcFtpXSk7CiAJCX0KIAl9CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGo7CiAKKwkJY3B1c19jbGVhcihjcHVfc2libGluZ19tYXBbaV0pOwogCQlpZiAoY3B1X2RhdGEoaSkucHJvY19pZCA9PSAtMSkgewogCQkJY3B1X3NldChpLCBjcHVfc2libGluZ19tYXBbaV0pOwogCQkJY29udGludWU7CiAJCX0KIAotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaikgeworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShqKSB7CiAJCQlpZiAoY3B1X2RhdGEoaSkucHJvY19pZCA9PQogCQkJICAgIGNwdV9kYXRhKGopLnByb2NfaWQpCiAJCQkJY3B1X3NldChqLCBjcHVfc2libGluZ19tYXBbaV0pOwpAQCAtMTI0MiwxOCArMTI5OSwxMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgY3B1X3BsYXlfZGVhZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgYm9nb3N1bSA9IDA7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBsb25nIHBzdGF0ZTsKKworCWlkbGVfdGFza19leGl0KCk7CisKKwlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikgeworCQlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CisKKwkJc3VuNHZfY3B1X3Fjb25mKEhWX0NQVV9RVUVVRV9DUFVfTU9ORE8sCisJCQkJdGItPmNwdV9tb25kb19wYSwgMCk7CisJCXN1bjR2X2NwdV9xY29uZihIVl9DUFVfUVVFVUVfREVWSUNFX01PTkRPLAorCQkJCXRiLT5kZXZfbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX1JFU19FUlJPUiwKKwkJCQl0Yi0+cmVzdW1fbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX05PTlJFU19FUlJPUiwKKwkJCQl0Yi0+bm9ucmVzdW1fbW9uZG9fcGEsIDApOworCX0KKworCWNwdV9jbGVhcihjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7CisJbWVtYmFyX3NhZmUoIiNTeW5jIik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJyZHByCSUlcHN0YXRlLCAlMFxuXHQiCisJCSJ3cnByCSUwLCAlMSwgJSVwc3RhdGUiCisJCTogIj1yIiAocHN0YXRlKQorCQk6ICJpIiAoUFNUQVRFX0lFKSk7CisKKwl3aGlsZSAoMSkKKwkJYmFycmllcigpOworfQorCitpbnQgX19jcHVfZGlzYWJsZSh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3B1aW5mb19zcGFyYyAqYzsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKLQkJYm9nb3N1bSArPSBjcHVfZGF0YShpKS51ZGVsYXlfdmFsOwotCXByaW50aygiVG90YWwgb2YgJWxkIHByb2Nlc3NvcnMgYWN0aXZhdGVkICIKLQkgICAgICAgIiglbHUuJTAybHUgQm9nb01JUFMpLlxuIiwKLQkgICAgICAgKGxvbmcpIG51bV9vbmxpbmVfY3B1cygpLAotCSAgICAgICBib2dvc3VtLyg1MDAwMDAvSFopLAotCSAgICAgICAoYm9nb3N1bS8oNTAwMC9IWikpJTEwMCk7CisJZm9yX2VhY2hfY3B1X21hc2soaSwgY3B1X2NvcmVfbWFwW2NwdV0pCisJCWNwdV9jbGVhcihjcHUsIGNwdV9jb3JlX21hcFtpXSk7CisJY3B1c19jbGVhcihjcHVfY29yZV9tYXBbY3B1XSk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBjcHVfc2libGluZ19tYXBbY3B1XSkKKwkJY3B1X2NsZWFyKGNwdSwgY3B1X3NpYmxpbmdfbWFwW2ldKTsKKwljcHVzX2NsZWFyKGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKKworCWMgPSAmY3B1X2RhdGEoY3B1KTsKKworCWMtPmNvcmVfaWQgPSAwOworCWMtPnByb2NfaWQgPSAtMTsKKworCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CisJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CisKKwlzbXBfd21iKCk7CisKKwkvKiBNYWtlIHN1cmUgbm8gaW50ZXJydXB0cyBwb2ludCB0byB0aGlzIGNwdS4gICovCisJZml4dXBfaXJxcygpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCW1kZWxheSgxKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJc21wX3JtYigpOworCQlpZiAoIWNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCQlicmVhazsKKwkJbXNsZWVwKDEwMCk7CisJfQorCWlmIChjcHVfaXNzZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ1BVICV1IGRpZG4ndCBkaWUuLi5cbiIsIGNwdSk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5fTERPTVMpCisJCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCQlpbnQgbGltaXQgPSAxMDA7CisKKwkJZG8geworCQkJaHZfZXJyID0gc3VuNHZfY3B1X3N0b3AoY3B1KTsKKwkJCWlmIChodl9lcnIgPT0gSFZfRU9LKSB7CisJCQkJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoLS1saW1pdCA+IDApOworCQlpZiAobGltaXQgPD0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzdW40dl9jcHVfc3RvcCgpIGZhaWxzIGVycj0lbHVcbiIsCisJCQkgICAgICAgaHZfZXJyKTsKKwkJfQorI2VuZGlmCisJfQorfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQorewogfQogCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKaW5kZXggNmZhNzYxNi4uNzE5ZDY3NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKQEAgLTEsNyArMSw2IEBACi0vKiAkSWQ6IHNwYXJjNjRfa3N5bXMuYyx2IDEuMTIxIDIwMDIvMDIvMDkgMTk6NDk6MzEgZGF2ZW0gRXhwICQKLSAqIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jOiBTcGFyYzY0IHNwZWNpZmljIGtzeW1zIHN1cHBvcnQuCisvKiBhcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYzogU3BhcmM2NCBzcGVjaWZpYyBrc3ltcyBzdXBwb3J0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICogQ29weXJpZ2h0IChDKSAxOTk2IEVkZGllIEMuIERvc3QgKGVjZEBza3luZXQuYmUpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmFrdWIgSmVsaW5layAoampAdWx0cmEubGludXguY3opCiAgKi8KQEAgLTI4LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxuZXQvY29tcGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTEyNCwxMCArMTIyLDYgQEAKIEVYUE9SVF9TWU1CT0woX193cml0ZV91bmxvY2spOwogRVhQT1JUX1NZTUJPTChfX3dyaXRlX3RyeWxvY2spOwogCi0vKiBDUFUgb25saW5lIG1hcCBhbmQgYWN0aXZlIGNvdW50LiAgKi8KLUVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwotRVhQT1JUX1NZTUJPTChwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0KIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMzMwLDEyICszMjQsNiBAQAogRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKIEVYUE9SVF9TWU1CT0woc3RybmNtcCk7CiAKLS8qIERlbGF5IHJvdXRpbmVzLiAqLwotRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7Ci1FWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKLUVYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOwotRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKLQogdm9pZCBWSVNlbnRlcih2b2lkKTsKIC8qIFJBSUQgY29kZSBuZWVkcyB0aGlzICovCiBFWFBPUlRfU1lNQk9MKFZJU2VudGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYwppbmRleCBjZGIxNDc3Li41MjgxNmM3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c2ZzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNmcy5jCkBAIC0xOTMsNyArMTkzLDYgQEAKIH0KIAogU0hPV19DUFVEQVRBX1VMT05HX05BTUUoY2xvY2tfdGljaywgY2xvY2tfdGljayk7Ci1TSE9XX0NQVURBVEFfVUxPTkdfTkFNRSh1ZGVsYXlfdmFsLCB1ZGVsYXlfdmFsKTsKIFNIT1dfQ1BVREFUQV9VSU5UX05BTUUobDFfZGNhY2hlX3NpemUsIGRjYWNoZV9zaXplKTsKIFNIT1dfQ1BVREFUQV9VSU5UX05BTUUobDFfZGNhY2hlX2xpbmVfc2l6ZSwgZGNhY2hlX2xpbmVfc2l6ZSk7CiBTSE9XX0NQVURBVEFfVUlOVF9OQU1FKGwxX2ljYWNoZV9zaXplLCBpY2FjaGVfc2l6ZSk7CkBAIC0yMDMsNyArMjAyLDYgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGNwdV9jb3JlX2F0dHJzW10gPSB7CiAJX1NZU0RFVl9BVFRSKGNsb2NrX3RpY2ssICAgICAgICAgIDA0NDQsIHNob3dfY2xvY2tfdGljaywgTlVMTCksCi0JX1NZU0RFVl9BVFRSKHVkZWxheV92YWwsICAgICAgICAgIDA0NDQsIHNob3dfdWRlbGF5X3ZhbCwgTlVMTCksCiAJX1NZU0RFVl9BVFRSKGwxX2RjYWNoZV9zaXplLCAgICAgIDA0NDQsIHNob3dfbDFfZGNhY2hlX3NpemUsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9kY2FjaGVfbGluZV9zaXplLCAwNDQ0LCBzaG93X2wxX2RjYWNoZV9saW5lX3NpemUsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9pY2FjaGVfc2l6ZSwgICAgICAwNDQ0LCBzaG93X2wxX2ljYWNoZV9zaXplLCBOVUxMKSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKaW5kZXggYTMxYTA0My4uNjJlMzE2YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKQEAgLTg0OSw5ICs4NDksNiBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJdW5zaWduZWQgbG9uZyBjbG9jazsKLSNpZmRlZiBDT05GSUdfU01QCi0JZXh0ZXJuIHZvaWQgc21wX3RpY2tfaW5pdCh2b2lkKTsKLSNlbmRpZgogCiAJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSkgewpAQCAtODc0LDEwICs4NzEsNiBAQAogCQljbG9jayA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInN0aWNrLWZyZXF1ZW5jeSIsIDApOwogCX0KIAotI2lmZGVmIENPTkZJR19TTVAKLQlzbXBfdGlja19pbml0KCk7Ci0jZW5kaWYKLQogCXJldHVybiBjbG9jazsKIH0KIApAQCAtMTAzOCwxMCArMTAzMSwzMSBAQAogCXNwYXJjNjRfY2xvY2tldmVudC5tdWx0ID0gbXVsdDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgdGJfdGlja3NfcGVyX3VzZWMgX19yZWFkX21vc3RseTsKKwordm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKKworCWJjbG9jayA9IHRpY2tfb3BzLT5nZXRfdGljaygpOworCWRvIHsKKwkJbm93ID0gdGlja19vcHMtPmdldF90aWNrKCk7CisJfSB3aGlsZSAoKG5vdy1iY2xvY2spIDwgbG9vcHMpOworfQorRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKKwordm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwlfX2RlbGF5KHRiX3RpY2tzX3Blcl91c2VjICogdXNlY3MpOworfQorRVhQT1JUX1NZTUJPTCh1ZGVsYXkpOworCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNsb2NrID0gc3BhcmM2NF9pbml0X3RpbWVycygpOwogCisJdGJfdGlja3NfcGVyX3VzZWMgPSBjbG9jayAvIFVTRUNfUEVSX1NFQzsKKwogCXRpbWVyX3RpY2tzX3Blcl9uc2VjX3F1b3RpZW50ID0KIAkJY2xvY2tzb3VyY2VfaHoybXVsdChjbG9jaywgU1BBUkM2NF9OU0VDX1BFUl9DWUNfU0hJRlQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKaW5kZXggMDBhOWUzMi4uNmVmMmQyOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwpAQCAtMjIyNSw2ICsyMjI1LDcgQEAKIAlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIDAsIDI1NSwgU0lHU0VHVik7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImZsdXNodyIpOwogCV9fc2hvd19yZWdzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCWlmIChyZWdzLT50c3RhdGUgJiBUU1RBVEVfUFJJVikgewogCQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKikKIAkJCShyZWdzLT51X3JlZ3NbVVJFR19GUF0gKyBTVEFDS19CSUFTKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTY5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCkBAIC0wLDAgKzEsMzk1IEBACisvKiB2aW8uYzogVmlydHVhbCBJL08gY2hhbm5lbCBkZXZpY2VzIHByb2JpbmcgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgSUJNIENvcnAuCisgKiAgICAgRGF2ZSBFbmdlYnJldHNlbiBlbmdlYnJldEB1cy5pYm0uY29tCisgKiAgICAgU2FudGlhZ28gTGVvbiBzYW50aWxAdXMuaWJtLmNvbQorICogICAgIEhvbGxpcyBCbGFuY2hhcmQgPGhvbGxpc2JAdXMuaWJtLmNvbT4KKyAqICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKgorICogQWRhcHRlZCB0byBzcGFyYzY0IGJ5IERhdmlkIFMuIE1pbGxlciBkYXZlbUBkYXZlbWxvZnQubmV0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tZGVzYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKworc3RhdGljIGlubGluZSBpbnQgZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwKKwkJCQkgICBpbnQgbGVuKQoreworCXdoaWxlIChsZW4gPiAwKSB7CisJCWludCBsOworCisJCWlmICghc3RyY21wKGxpc3QsIG1hdGNoKSkKKwkJCXJldHVybiAxOworCQlsID0gc3RybGVuKGxpc3QpICsgMTsKKwkJbGlzdCArPSBsOworCQlsZW4gLT0gbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqdmlvX21hdGNoX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqbWF0Y2hlcywKKwljb25zdCBzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCWNvbnN0IGNoYXIgKnR5cGUsICpjb21wYXQ7CisJaW50IGxlbjsKKworCXR5cGUgPSBkZXYtPnR5cGU7CisJY29tcGF0ID0gZGV2LT5jb21wYXQ7CisJbGVuID0gZGV2LT5jb21wYXRfbGVuOworCisJd2hpbGUgKG1hdGNoZXMtPnR5cGVbMF0gfHwgbWF0Y2hlcy0+Y29tcGF0WzBdKSB7CisJCWludCBtYXRjaCA9IDE7CisJCWlmIChtYXRjaGVzLT50eXBlWzBdKQorCQkJbWF0Y2ggJj0gIXN0cmNtcChtYXRjaGVzLT50eXBlLCB0eXBlKTsKKworCQlpZiAobWF0Y2hlcy0+Y29tcGF0WzBdKSB7CisJCQltYXRjaCAmPSBsZW4gJiYKKwkJCQlmaW5kX2luX3Byb3BsaXN0KGNvbXBhdCwgbWF0Y2hlcy0+Y29tcGF0LCBsZW4pOworCQl9CisJCWlmIChtYXRjaCkKKwkJCXJldHVybiBtYXRjaGVzOworCQltYXRjaGVzKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHZpb19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9fZGV2ID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCB2aW9fZHJpdmVyICp2aW9fZHJ2ID0gdG9fdmlvX2RyaXZlcihkcnYpOworCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICptYXRjaGVzID0gdmlvX2Rydi0+aWRfdGFibGU7CisKKwlpZiAoIW1hdGNoZXMpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZpb19tYXRjaF9kZXZpY2UobWF0Y2hlcywgdmlvX2RldikgIT0gTlVMTDsKK30KKworc3RhdGljIGludCB2aW9fZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkOworCWludCBlcnJvciA9IC1FTk9ERVY7CisKKwlpZiAoZHJ2LT5wcm9iZSkgeworCQlpZCA9IHZpb19tYXRjaF9kZXZpY2UoZHJ2LT5pZF90YWJsZSwgdmRldik7CisJCWlmIChpZCkKKwkJCWVycm9yID0gZHJ2LT5wcm9iZSh2ZGV2LCBpZCk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHZpb19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoZHJ2LT5yZW1vdmUpCisJCXJldHVybiBkcnYtPnJlbW92ZSh2ZGV2KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBkZXZzcGVjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gdG9fdmlvX2RldihkZXYpOworCWNvbnN0IGNoYXIgKnN0ciA9ICJub25lIjsKKworCWlmICghc3RyY21wKHZkZXYtPnR5cGUsICJuZXR3b3JrIikpCisJCXN0ciA9ICJ2bmV0IjsKKwllbHNlIGlmICghc3RyY21wKHZkZXYtPnR5cGUsICJibG9jayIpKQorCQlzdHIgPSAidmRpc2siOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0cik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHR5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHZkZXYtPnR5cGUpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdmlvX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhkZXZzcGVjKSwKKwlfX0FUVFJfUk8odHlwZSksCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgdmlvX2J1c190eXBlID0geworCS5uYW1lCQk9ICJ2aW8iLAorCS5kZXZfYXR0cnMJPSB2aW9fZGV2X2F0dHJzLAorCS5tYXRjaAkJPSB2aW9fYnVzX21hdGNoLAorCS5wcm9iZQkJPSB2aW9fZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gdmlvX2RldmljZV9yZW1vdmUsCit9OworCitpbnQgdmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2KQoreworCXZpb2Rydi0+ZHJpdmVyLmJ1cyA9ICZ2aW9fYnVzX3R5cGU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIHZpb191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2KQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZpb191bnJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2aW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWtmcmVlKHRvX3Zpb19kZXYoZGV2KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3BjaW9icHBhdGhfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlkcCA9IHZkZXYtPmRwOworCisJcmV0dXJuIHNucHJpbnRmIChidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkcC0+ZnVsbF9uYW1lKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG9icHBhdGgsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKKwkJICAgc2hvd19wY2lvYnBwYXRoX2F0dHIsIE5VTEwpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKmNkZXZfbm9kZTsKKworc3RhdGljIHN0cnVjdCB2aW9fZGV2ICpyb290X3ZkZXY7CitzdGF0aWMgdTY0IGNkZXZfY2ZnX2hhbmRsZTsKKworc3RhdGljIHZvaWQgdmlvX2ZpbGxfY2hhbm5lbF9pbmZvKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICBzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwl1NjQgYTsKKworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQljb25zdCB1NjQgKmNoYW5faWQ7CisJCWNvbnN0IHU2NCAqaXJxOworCQl1NjQgdGFyZ2V0OworCisJCXRhcmdldCA9IG1kZXNjX2FyY190YXJnZXQoaHAsIGEpOworCisJCWlycSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdGFyZ2V0LCAidHgtaW5vIiwgTlVMTCk7CisJCWlmIChpcnEpCisJCQl2ZGV2LT50eF9pcnEgPSBzdW40dl9idWlsZF92aXJxKGNkZXZfY2ZnX2hhbmRsZSwgKmlycSk7CisKKwkJaXJxID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0YXJnZXQsICJyeC1pbm8iLCBOVUxMKTsKKwkJaWYgKGlycSkKKwkJCXZkZXYtPnJ4X2lycSA9IHN1bjR2X2J1aWxkX3ZpcnEoY2Rldl9jZmdfaGFuZGxlLCAqaXJxKTsKKworCQljaGFuX2lkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0YXJnZXQsICJpZCIsIE5VTEwpOworCQlpZiAoY2hhbl9pZCkKKwkJCXZkZXYtPmNoYW5uZWxfaWQgPSAqY2hhbl9pZDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldiAqdmlvX2NyZWF0ZV9vbmUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBtcCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJY29uc3QgY2hhciAqdHlwZSwgKmNvbXBhdDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworCWludCBlcnIsIHRsZW4sIGNsZW47CisKKwl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRldmljZS10eXBlIiwgJnRsZW4pOworCWlmICghdHlwZSkgeworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgIm5hbWUiLCAmdGxlbik7CisJCWlmICghdHlwZSkgeworCQkJdHlwZSA9IG1kZXNjX25vZGVfbmFtZShocCwgbXApOworCQkJdGxlbiA9IHN0cmxlbih0eXBlKSArIDE7CisJCX0KKwl9CisJaWYgKHRsZW4gPiBWSU9fTUFYX1RZUEVfTEVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBUeXBlIHN0cmluZyBbJXNdIGlzIHRvbyBsb25nLlxuIiwKKwkJICAgICAgIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljb21wYXQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiZGV2aWNlLXR5cGUiLCAmY2xlbik7CisJaWYgKCFjb21wYXQpIHsKKwkJY2xlbiA9IDA7CisJfSBlbHNlIGlmIChjbGVuID4gVklPX01BWF9DT01QQVRfTEVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb21wYXQgbGVuICVkIGZvciBbJXNdIGlzIHRvbyBsb25nLlxuIiwKKwkJICAgICAgIGNsZW4sIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl2ZGV2ID0ga3phbGxvYyhzaXplb2YoKnZkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWxkIG5vdCBhbGxvY2F0ZSB2aW9fZGV2XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdmRldi0+bXAgPSBtcDsKKwltZW1jcHkodmRldi0+dHlwZSwgdHlwZSwgdGxlbik7CisJaWYgKGNvbXBhdCkKKwkJbWVtY3B5KHZkZXYtPmNvbXBhdCwgY29tcGF0LCBjbGVuKTsKKwllbHNlCisJCW1lbXNldCh2ZGV2LT5jb21wYXQsIDAsIHNpemVvZih2ZGV2LT5jb21wYXQpKTsKKwl2ZGV2LT5jb21wYXRfbGVuID0gY2xlbjsKKworCXZkZXYtPmNoYW5uZWxfaWQgPSB+MFVMOworCXZkZXYtPnR4X2lycSA9IH4wOworCXZkZXYtPnJ4X2lycSA9IH4wOworCisJdmlvX2ZpbGxfY2hhbm5lbF9pbmZvKGhwLCBtcCwgdmRldik7CisKKwlzbnByaW50Zih2ZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVseCIsIG1wKTsKKwl2ZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OworCXZkZXYtPmRldi5idXMgPSAmdmlvX2J1c190eXBlOworCXZkZXYtPmRldi5yZWxlYXNlID0gdmlvX2Rldl9yZWxlYXNlOworCisJaWYgKHBhcmVudCA9PSBOVUxMKSB7CisJCWRwID0gY2Rldl9ub2RlOworCX0gZWxzZSBpZiAodG9fdmlvX2RldihwYXJlbnQpID09IHJvb3RfdmRldikgeworCQlkcCA9IG9mX2dldF9uZXh0X2NoaWxkKGNkZXZfbm9kZSwgTlVMTCk7CisJCXdoaWxlIChkcCkgeworCQkJaWYgKCFzdHJjbXAoZHAtPnR5cGUsIHR5cGUpKQorCQkJCWJyZWFrOworCisJCQlkcCA9IG9mX2dldF9uZXh0X2NoaWxkKGNkZXZfbm9kZSwgZHApOworCQl9CisJfSBlbHNlIHsKKwkJZHAgPSB0b192aW9fZGV2KHBhcmVudCktPmRwOworCX0KKwl2ZGV2LT5kcCA9IGRwOworCisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UgJXMsIGVycj0lZFxuIiwKKwkJICAgICAgIHZkZXYtPmRldi5idXNfaWQsIGVycik7CisJCWtmcmVlKHZkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHZkZXYtPmRwKQorCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LmtvYmosCisJCQkJCSZkZXZfYXR0cl9vYnBwYXRoLmF0dHIpOworCisJcmV0dXJuIHZkZXY7Cit9CisKK3N0YXRpYyB2b2lkIHdhbGtfdHJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG4sIHN0cnVjdCB2aW9fZGV2ICpwYXJlbnQpCit7CisJdTY0IGE7CisKKwltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG4sIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwkJdTY0IHRhcmdldDsKKworCQl0YXJnZXQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJdmRldiA9IHZpb19jcmVhdGVfb25lKGhwLCB0YXJnZXQsICZwYXJlbnQtPmRldik7CisJCWlmICh2ZGV2KQorCQkJd2Fsa190cmVlKGhwLCB0YXJnZXQsIHZkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2RldmljZXMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCByb290KQoreworCXU2NCBtcDsKKworCXJvb3RfdmRldiA9IHZpb19jcmVhdGVfb25lKGhwLCByb290LCBOVUxMKTsKKwlpZiAoIXJvb3RfdmRldikgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ291bHQgbm90IGNyZWF0ZSByb290IGRldmljZS5cbiIpOworCQlyZXR1cm47CisJfQorCisJd2Fsa190cmVlKGhwLCByb290LCByb290X3ZkZXYpOworCisJLyogRG9tYWluIHNlcnZpY2VzIGlzIG9kZCBhcyBpdCBkb2Vzbid0IHNpdCB1bmRlcm5lYXRoIHRoZQorCSAqIGNoYW5uZWwtZGV2aWNlcyBub2RlLCBzbyB3ZSBwbHVnIGl0IGluIG1hbnVhbGx5LgorCSAqLworCW1wID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJkb21haW4tc2VydmljZXMiKTsKKwlpZiAobXAgIT0gTURFU0NfTk9ERV9OVUxMKSB7CisJCXN0cnVjdCB2aW9fZGV2ICpwYXJlbnQgPSB2aW9fY3JlYXRlX29uZShocCwgbXAsCisJCQkJCQkJJnJvb3RfdmRldi0+ZGV2KTsKKworCQlpZiAocGFyZW50KQorCQkJd2Fsa190cmVlKGhwLCBtcCwgcGFyZW50KTsKKwl9Cit9CisKK2NvbnN0IGNoYXIgKmNoYW5uZWxfZGV2aWNlc19ub2RlID0gImNoYW5uZWwtZGV2aWNlcyI7Citjb25zdCBjaGFyICpjaGFubmVsX2RldmljZXNfY29tcGF0ID0gIlNVTlcsc3VuNHYtY2hhbm5lbC1kZXZpY2VzIjsKK2NvbnN0IGNoYXIgKmNmZ19oYW5kbGVfcHJvcCA9ICJjZmctaGFuZGxlIjsKKworc3RhdGljIGludCBfX2luaXQgdmlvX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwljb25zdCBjaGFyICpjb21wYXQ7CisJY29uc3QgdTY0ICpjZmdfaGFuZGxlOworCWludCBlcnIsIGxlbjsKKwl1NjQgcm9vdDsKKworCWVyciA9IGJ1c19yZWdpc3RlcigmdmlvX2J1c190eXBlKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb3VsZCBub3QgcmVnaXN0ZXIgYnVzIHR5cGUgZXJyPSVkXG4iLAorCQkgICAgICAgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKwlpZiAoIWhwKQorCQlyZXR1cm4gMDsKKworCXJvb3QgPSBtZGVzY19ub2RlX2J5X25hbWUoaHAsIE1ERVNDX05PREVfTlVMTCwgY2hhbm5lbF9kZXZpY2VzX25vZGUpOworCWlmIChyb290ID09IE1ERVNDX05PREVfTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJWSU86IE5vIGNoYW5uZWwtZGV2aWNlcyBNREVTQyBub2RlLlxuIik7CisJCW1kZXNjX3JlbGVhc2UoaHApOworCQlyZXR1cm4gMDsKKwl9CisKKwljZGV2X25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiY2hhbm5lbC1kZXZpY2VzIik7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWNkZXZfbm9kZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJWSU86IE5vIGNoYW5uZWwtZGV2aWNlcyBPQlAgbm9kZS5cbiIpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWNvbXBhdCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcm9vdCwgImNvbXBhdGlibGUiLCAmbGVuKTsKKwlpZiAoIWNvbXBhdCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ2hhbm5lbCBkZXZpY2VzIGxhY2tzIGNvbXBhdGlibGUgIgorCQkgICAgICAgInByb3BlcnR5XG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJaWYgKCFmaW5kX2luX3Byb3BsaXN0KGNvbXBhdCwgY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCwgbGVuKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ2hhbm5lbCBkZXZpY2VzIG5vZGUgbGFja3MgKCVzKSAiCisJCSAgICAgICAiY29tcGF0IGVudHJ5LlxuIiwgY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJY2ZnX2hhbmRsZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcm9vdCwgY2ZnX2hhbmRsZV9wcm9wLCBOVUxMKTsKKwlpZiAoIWNmZ19oYW5kbGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENoYW5uZWwgZGV2aWNlcyBsYWNrcyAlcyBwcm9wZXJ0eVxuIiwKKwkJICAgICAgIGNmZ19oYW5kbGVfcHJvcCk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJY2Rldl9jZmdfaGFuZGxlID0gKmNmZ19oYW5kbGU7CisKKwljcmVhdGVfZGV2aWNlcyhocCwgcm9vdCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitvdXRfcmVsZWFzZToKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitwb3N0Y29yZV9pbml0Y2FsbCh2aW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2MTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvaHMuYwpAQCAtMCwwICsxLDc5MiBAQAorLyogdmlvaHMuYzogTERPTSBWaXJ0dWFsIEkvTyBoYW5kc2hha2UgaGVscGVyIGxheWVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorCitpbnQgdmlvX2xkY19zZW5kKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGVyciwgbGltaXQgPSAxMDAwOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJZXJyID0gbGRjX3dyaXRlKHZpby0+bHAsIGRhdGEsIGxlbik7CisJCWlmICghZXJyIHx8IChlcnIgIT0gLUVBR0FJTikpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19sZGNfc2VuZCk7CisKK3N0YXRpYyBpbnQgc2VuZF9jdHJsKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCSAgICAgc3RydWN0IHZpb19tc2dfdGFnICp0YWcsIGludCBsZW4pCit7CisJdGFnLT5zaWQgPSB2aW9fc2VuZF9zaWQodmlvKTsKKwlyZXR1cm4gdmlvX2xkY19zZW5kKHZpbywgdGFnLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBpbml0X3RhZyhzdHJ1Y3QgdmlvX21zZ190YWcgKnRhZywgdTggdHlwZSwgdTggc3R5cGUsIHUxNiBzdHlwZV9lbnYpCit7CisJdGFnLT50eXBlID0gdHlwZTsKKwl0YWctPnN0eXBlID0gc3R5cGU7CisJdGFnLT5zdHlwZV9lbnYgPSBzdHlwZV9lbnY7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHUxNiBtYWpvciwgdTE2IG1pbm9yKQoreworCXN0cnVjdCB2aW9fdmVyX2luZm8gcGt0OworCisJdmlvLT5fbG9jYWxfc2lkID0gKHUzMikgc2NoZWRfY2xvY2soKTsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJaW5pdF90YWcoJnBrdC50YWcsIFZJT19UWVBFX0NUUkwsIFZJT19TVUJUWVBFX0lORk8sIFZJT19WRVJfSU5GTyk7CisJcGt0Lm1ham9yID0gbWFqb3I7CisJcGt0Lm1pbm9yID0gbWlub3I7CisJcGt0LmRldl9jbGFzcyA9IHZpby0+ZGV2X2NsYXNzOworCisJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIElORk8gbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgbWFqb3IsIG1pbm9yLCB2aW8tPmRldl9jbGFzcyk7CisKKwlyZXR1cm4gc2VuZF9jdHJsKHZpbywgJnBrdC50YWcsIHNpemVvZihwa3QpKTsKK30KKworc3RhdGljIGludCBzdGFydF9oYW5kc2hha2Uoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlpbnQgZXJyOworCisJdmlvZGJnKEhTLCAiU1RBUlQgSEFORFNIQUtFXG4iKTsKKworCXZpby0+aHNfc3RhdGUgPSBWSU9fSFNfSU5WQUxJRDsKKworCWVyciA9IHNlbmRfdmVyc2lvbih2aW8sCisJCQkgICB2aW8tPnZlcl90YWJsZVswXS5tYWpvciwKKwkJCSAgIHZpby0+dmVyX3RhYmxlWzBdLm1pbm9yKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCit2b2lkIHZpb19saW5rX3N0YXRlX2NoYW5nZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBpbnQgZXZlbnQpCit7CisJaWYgKGV2ZW50ID09IExEQ19FVkVOVF9VUCkgeworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisKKwkJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCQljYXNlIFZERVZfTkVUV09SSzoKKwkJY2FzZSBWREVWX05FVFdPUktfU1dJVENIOgorCQkJdmlvLT5kcl9zdGF0ZSA9IChWSU9fRFJfU1RBVEVfVFhSRVEgfAorCQkJCQkgVklPX0RSX1NUQVRFX1JYUkVRKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkRFVl9ESVNLOgorCQkJdmlvLT5kcl9zdGF0ZSA9IFZJT19EUl9TVEFURV9UWFJFUTsKKwkJCWJyZWFrOworCQljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCQl2aW8tPmRyX3N0YXRlID0gVklPX0RSX1NUQVRFX1JYUkVROworCQkJYnJlYWs7CisJCX0KKwkJc3RhcnRfaGFuZHNoYWtlKHZpbyk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2aW9fbGlua19zdGF0ZV9jaGFuZ2UpOworCitzdGF0aWMgaW50IGhhbmRzaGFrZV9mYWlsdXJlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisKKwkvKiBYWFggUHV0IHBvbGljeSBoZXJlLi4uICBQZXJoYXBzIHN0YXJ0IGEgdGltZXIgdG8gZmlyZQorCSAqIFhYWCBpbiAxMDAgbXMsIHdoaWNoIHdpbGwgYnJpbmcgdGhlIGxpbmsgdXAgYW5kIHJldHJ5CisJICogWFhYIHRoZSBoYW5kc2hha2UuCisJICovCisKKwl2aW9kYmcoSFMsICJIQU5EU0hBS0UgRkFJTFVSRVxuIik7CisKKwl2aW8tPmRyX3N0YXRlICY9IH4oVklPX0RSX1NUQVRFX1RYUkVHIHwKKwkJCSAgIFZJT19EUl9TVEFURV9SWFJFRyk7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1JYX1JJTkddOworCW1lbXNldChkciwgMCwgc2l6ZW9mKCpkcikpOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworCisJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19JTlZBTElEOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdW5rbm93bihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICpwa3QgPSBhcmc7CisKKwl2aW9kYmcoSFMsICJVTktOT1dOIENPTlRST0wgWyUwMng6JTAyeDolMDR4OiUwOHhdXG4iLAorCSAgICAgICBwa3QtPnR5cGUsIHBrdC0+c3R5cGUsIHBrdC0+c3R5cGVfZW52LCBwa3QtPnNpZCk7CisKKwlwcmludGsoS0VSTl9FUlIgInZpbzogSURbJWx1XSBSZXNldHRpbmcgY29ubmVjdGlvbi5cbiIsCisJICAgICAgIHZpby0+dmRldi0+Y2hhbm5lbF9pZCk7CisKKwlsZGNfZGlzY29ubmVjdCh2aW8tPmxwKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCBzZW5kX2RyZWcoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXVuaW9uIHsKKwkJc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciBwa3Q7CisJCWNoYXIgYWxsW3NpemVvZihzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyKSArCisJCQkgKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKgorCQkJICBkci0+bmNvb2tpZXMpXTsKKwl9IHU7CisJaW50IGk7CisKKwltZW1zZXQoJnUsIDAsIHNpemVvZih1KSk7CisJaW5pdF90YWcoJnUucGt0LnRhZywgVklPX1RZUEVfQ1RSTCwgVklPX1NVQlRZUEVfSU5GTywgVklPX0RSSU5HX1JFRyk7CisJdS5wa3QuZHJpbmdfaWRlbnQgPSAwOworCXUucGt0Lm51bV9kZXNjciA9IGRyLT5udW1fZW50cmllczsKKwl1LnBrdC5kZXNjcl9zaXplID0gZHItPmVudHJ5X3NpemU7CisJdS5wa3Qub3B0aW9ucyA9IFZJT19UWF9EUklORzsKKwl1LnBrdC5udW1fY29va2llcyA9IGRyLT5uY29va2llczsKKworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIElORk8gbmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdICIKKwkgICAgICAgIm5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgdS5wa3QubnVtX2Rlc2NyLCB1LnBrdC5kZXNjcl9zaXplLCB1LnBrdC5vcHRpb25zLAorCSAgICAgICB1LnBrdC5udW1fY29va2llcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHItPm5jb29raWVzOyBpKyspIHsKKwkJdS5wa3QuY29va2llc1tpXSA9IGRyLT5jb29raWVzW2ldOworCisJCXZpb2RiZyhIUywgIkRSSU5HIENPT0tJRSglZCkgWyUwMTZsbHg6JTAxNmxseF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdS5wa3QuY29va2llc1tpXS5jb29raWVfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHUucGt0LmNvb2tpZXNbaV0uY29va2llX3NpemUpOworCX0KKworCXJldHVybiBzZW5kX2N0cmwodmlvLCAmdS5wa3QudGFnLCBzaXplb2YodSkpOworfQorCitzdGF0aWMgaW50IHNlbmRfcmR4KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19yZHggcGt0OworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKworCWluaXRfdGFnKCZwa3QudGFnLCBWSU9fVFlQRV9DVFJMLCBWSU9fU1VCVFlQRV9JTkZPLCBWSU9fUkRYKTsKKworCXZpb2RiZyhIUywgIlNFTkQgUkRYIElORk9cbiIpOworCisJcmV0dXJuIHNlbmRfY3RybCh2aW8sICZwa3QudGFnLCBzaXplb2YocGt0KSk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJcmV0dXJuIHZpby0+b3BzLT5zZW5kX2F0dHIodmlvKTsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fdmVyc2lvbiAqZmluZF9ieV9tYWpvcihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJCQkgdTE2IG1ham9yKQoreworCXN0cnVjdCB2aW9fdmVyc2lvbiAqcmV0ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2aW8tPnZlcl90YWJsZV9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IHZpb192ZXJzaW9uICp2ID0gJnZpby0+dmVyX3RhYmxlW2ldOworCQlpZiAodi0+bWFqb3IgPD0gbWFqb3IpIHsKKwkJCXJldCA9IHY7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3RydWN0IHZpb192ZXJzaW9uICp2YXA7CisJaW50IGVycjsKKworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIElORk8gbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vciwgcGt0LT5kZXZfY2xhc3MpOworCisJaWYgKHZpby0+aHNfc3RhdGUgIT0gVklPX0hTX0lOVkFMSUQpIHsKKwkJLyogWFhYIFBlcmhhcHMgaW52b2tlIHN0YXJ0X2hhbmRzaGFrZT8gWFhYICovCisJCW1lbXNldCgmdmlvLT52ZXIsIDAsIHNpemVvZih2aW8tPnZlcikpOworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisJfQorCisJdmFwID0gZmluZF9ieV9tYWpvcih2aW8sIHBrdC0+bWFqb3IpOworCisJdmlvLT5fcGVlcl9zaWQgPSBwa3QtPnRhZy5zaWQ7CisKKwlpZiAoIXZhcCkgeworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCXBrdC0+bWFqb3IgPSAwOworCQlwa3QtPm1pbm9yID0gMDsKKwkJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIE5BQ0sgbWFqWzBdIG1pblswXVxuIik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwl9IGVsc2UgaWYgKHZhcC0+bWFqb3IgIT0gcGt0LT5tYWpvcikgeworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCXBrdC0+bWFqb3IgPSB2YXAtPm1ham9yOworCQlwa3QtPm1pbm9yID0gdmFwLT5taW5vcjsKKwkJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIE5BQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vcik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgdmlvX3ZlcnNpb24gdmVyID0geworCQkJLm1ham9yID0gcGt0LT5tYWpvciwKKwkJCS5taW5vciA9IHBrdC0+bWlub3IsCisJCX07CisJCWlmICh2ZXIubWlub3IgPiB2YXAtPm1pbm9yKQorCQkJdmVyLm1pbm9yID0gdmFwLT5taW5vcjsKKwkJcGt0LT5taW5vciA9IHZlci5taW5vcjsKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9BQ0s7CisJCXZpb2RiZyhIUywgIlNFTkQgVkVSU0lPTiBBQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vcik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCXZpby0+dmVyID0gdmVyOworCQkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19HT1RWRVJTOworCQl9CisJfQorCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2FjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgc3RydWN0IHZpb192ZXJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIEFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAorCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CisKKwlpZiAodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSB7CisJCWlmICh2aW8tPnZlci5tYWpvciAhPSBwa3QtPm1ham9yIHx8CisJCSAgICB2aW8tPnZlci5taW5vciAhPSBwa3QtPm1pbm9yKSB7CisJCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCQkodm9pZCkgc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBzaXplb2YoKnBrdCkpOworCQkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJCX0KKwl9IGVsc2UgeworCQl2aW8tPnZlci5tYWpvciA9IHBrdC0+bWFqb3I7CisJCXZpby0+dmVyLm1pbm9yID0gcGt0LT5taW5vcjsKKwkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19HT1RWRVJTOworCX0KKworCXN3aXRjaCAodmlvLT5kZXZfY2xhc3MpIHsKKwljYXNlIFZERVZfTkVUV09SSzoKKwljYXNlIFZERVZfRElTSzoKKwkJaWYgKHNlbmRfYXR0cih2aW8pIDwgMCkKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3RydWN0IHZpb192ZXJzaW9uICpudmVyOworCisJdmlvZGJnKEhTLCAiR09UIFZFUlNJT04gTkFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAorCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CisKKwlpZiAoKHBrdC0+bWFqb3IgPT0gMCAmJiBwa3QtPm1pbm9yID09IDApIHx8CisJICAgICEobnZlciA9IGZpbmRfYnlfbWFqb3IodmlvLCBwa3QtPm1ham9yKSkpCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJaWYgKHNlbmRfdmVyc2lvbih2aW8sIG52ZXItPm1ham9yLCBudmVyLT5taW5vcikgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fdmVyX2luZm8gKnBrdCkKK3sKKwlzd2l0Y2ggKHBrdC0+dGFnLnN0eXBlKSB7CisJY2FzZSBWSU9fU1VCVFlQRV9JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyX2Fjayh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX05BQ0s6CisJCXJldHVybiBwcm9jZXNzX3Zlcl9uYWNrKHZpbywgcGt0KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX07Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwllcnIgPSB2aW8tPm9wcy0+aGFuZGxlX2F0dHIodmlvLCBwa3QpOworCWlmIChlcnIgPCAwKSB7CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX0gZWxzZSB7CisJCXZpby0+aHNfc3RhdGUgfD0gVklPX0hTX0dPVF9BVFRSOworCisJCWlmICgodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSkgJiYKKwkJICAgICEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19TRU5UX0RSRUcpKSB7CisJCQlpZiAoc2VuZF9kcmVnKHZpbykgPCAwKQorCQkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJCQl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19TRU5UX0RSRUc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsX2RyaW5nc19yZWdpc3RlcmVkKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJaW50IG5lZWRfcngsIG5lZWRfdHg7CisKKwluZWVkX3J4ID0gKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRVEpOworCW5lZWRfdHggPSAodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSk7CisKKwlpZiAobmVlZF9yeCAmJgorCSAgICAhKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRUcpKQorCQlyZXR1cm4gMDsKKworCWlmIChuZWVkX3R4ICYmCisJICAgICEodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFRykpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19kcmVnX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCWludCBpLCBsZW47CisKKwl2aW9kYmcoSFMsICJHT1QgRFJJTkdfUkVHIElORk8gaWRlbnRbJWxseF0gIgorCSAgICAgICAibmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdIG5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCwKKwkgICAgICAgcGt0LT5udW1fZGVzY3IsIHBrdC0+ZGVzY3Jfc2l6ZSwgcGt0LT5vcHRpb25zLAorCSAgICAgICBwa3QtPm51bV9jb29raWVzKTsKKworCWlmICghKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRVEpKQorCQlnb3RvIHNlbmRfbmFjazsKKworCWlmICh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1JYUkVHKQorCQlnb3RvIHNlbmRfbmFjazsKKworCXZpby0+ZGVzY19idWYgPSBremFsbG9jKHBrdC0+ZGVzY3Jfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCF2aW8tPmRlc2NfYnVmKQorCQlnb3RvIHNlbmRfbmFjazsKKworCXZpby0+ZGVzY19idWZfbGVuID0gcGt0LT5kZXNjcl9zaXplOworCisJZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKKworCWRyLT5udW1fZW50cmllcyA9IHBrdC0+bnVtX2Rlc2NyOworCWRyLT5lbnRyeV9zaXplID0gcGt0LT5kZXNjcl9zaXplOworCWRyLT5uY29va2llcyA9IHBrdC0+bnVtX2Nvb2tpZXM7CisJZm9yIChpID0gMDsgaSA8IGRyLT5uY29va2llczsgaSsrKSB7CisJCWRyLT5jb29raWVzW2ldID0gcGt0LT5jb29raWVzW2ldOworCisJCXZpb2RiZyhIUywgIkRSSU5HIENPT0tJRSglZCkgWyUwMTZsbHg6JTAxNmxseF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICAgIHBrdC0+Y29va2llc1tpXS5jb29raWVfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBwa3QtPmNvb2tpZXNbaV0uY29va2llX3NpemUpOworCX0KKworCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfQUNLOworCXBrdC0+ZHJpbmdfaWRlbnQgPSArK2RyLT5pZGVudDsKKworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIEFDSyBpZGVudFslbGx4XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCk7CisKKwlsZW4gPSAoc2l6ZW9mKCpwa3QpICsKKwkgICAgICAgKGRyLT5uY29va2llcyAqIHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkpKTsKKwlpZiAoc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBsZW4pIDwgMCkKKwkJZ290byBzZW5kX25hY2s7CisKKwl2aW8tPmRyX3N0YXRlIHw9IFZJT19EUl9TVEFURV9SWFJFRzsKKworCXJldHVybiAwOworCitzZW5kX25hY2s6CisJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9OQUNLOworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIE5BQ0tcbiIpOworCSh2b2lkKSBzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSk7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWdfYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBBQ0sgaWRlbnRbJWxseF0gIgorCSAgICAgICAibmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdIG5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCwKKwkgICAgICAgcGt0LT5udW1fZGVzY3IsIHBrdC0+ZGVzY3Jfc2l6ZSwgcGt0LT5vcHRpb25zLAorCSAgICAgICBwa3QtPm51bV9jb29raWVzKTsKKworCWRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisKKwlpZiAoISh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1RYUkVRKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwlkci0+aWRlbnQgPSBwa3QtPmRyaW5nX2lkZW50OworCXZpby0+ZHJfc3RhdGUgfD0gVklPX0RSX1NUQVRFX1RYUkVHOworCisJaWYgKGFsbF9kcmluZ3NfcmVnaXN0ZXJlZCh2aW8pKSB7CisJCWlmIChzZW5kX3JkeCh2aW8pIDwgMCkKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX1NFTlRfUkRYOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWdfbmFjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgICBzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBOQUNLIGlkZW50WyVsbHhdICIKKwkgICAgICAgIm5kZXNjWyV1XSBkc3pbJXVdIG9wdFsweCV4XSBuY29va2llc1sldV1cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+ZHJpbmdfaWRlbnQsCisJICAgICAgIHBrdC0+bnVtX2Rlc2NyLCBwa3QtPmRlc2NyX3NpemUsIHBrdC0+b3B0aW9ucywKKwkgICAgICAgcGt0LT5udW1fY29va2llcyk7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWcoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCXN0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgKnBrdCkKK3sKKwlpZiAoISh2aW8tPmhzX3N0YXRlICYgVklPX0hTX0dPVFZFUlMpKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBwcm9jZXNzX2RyZWdfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfZHJlZ19hY2sodmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc19kcmVnX25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZHVucmVnKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgIHN0cnVjdCB2aW9fZHJpbmdfdW5yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisKKwl2aW9kYmcoSFMsICJHT1QgRFJJTkdfVU5SRUdcbiIpOworCisJaWYgKHBrdC0+ZHJpbmdfaWRlbnQgIT0gZHItPmlkZW50KQorCQlyZXR1cm4gMDsKKworCXZpby0+ZHJfc3RhdGUgJj0gflZJT19EUl9TVEFURV9SWFJFRzsKKworCW1lbXNldChkciwgMCwgc2l6ZW9mKCpkcikpOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZHhfaW5mbyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX3JkeCAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBSRFggSU5GT1xuIik7CisKKwlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0FDSzsKKwl2aW9kYmcoSFMsICJTRU5EIFJEWCBBQ0tcbiIpOworCWlmIChzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSkgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXZpby0+aHNfc3RhdGUgfD0gVklPX0hTX1NFTlRfUkRYX0FDSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeF9hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19yZHggKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgUkRYIEFDS1xuIik7CisKKwlpZiAoISh2aW8tPmhzX3N0YXRlICYgVklPX0hTX1NFTlRfUkRYKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19HT1RfUkRYX0FDSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeF9uYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIFJEWCBOQUNLXG4iKTsKKworCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcmR4KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJaWYgKCFhbGxfZHJpbmdzX3JlZ2lzdGVyZWQodmlvKSkKKwkJaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBwcm9jZXNzX3JkeF9pbmZvKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfQUNLOgorCQlyZXR1cm4gcHJvY2Vzc19yZHhfYWNrKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfTkFDSzoKKwkJcmV0dXJuIHByb2Nlc3NfcmR4X25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJfQorfQorCitpbnQgdmlvX2NvbnRyb2xfcGt0X2VuZ2luZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICpwa3QpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICp0YWcgPSBwa3Q7CisJdTggcHJldl9zdGF0ZSA9IHZpby0+aHNfc3RhdGU7CisJaW50IGVycjsKKworCXN3aXRjaCAodGFnLT5zdHlwZV9lbnYpIHsKKwljYXNlIFZJT19WRVJfSU5GTzoKKwkJZXJyID0gcHJvY2Vzc192ZXIodmlvLCBwa3QpOworCQlicmVhazsKKworCWNhc2UgVklPX0FUVFJfSU5GTzoKKwkJZXJyID0gcHJvY2Vzc19hdHRyKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19EUklOR19SRUc6CisJCWVyciA9IHByb2Nlc3NfZHJlZyh2aW8sIHBrdCk7CisJCWJyZWFrOworCisJY2FzZSBWSU9fRFJJTkdfVU5SRUc6CisJCWVyciA9IHByb2Nlc3NfZHVucmVnKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19SRFg6CisJCWVyciA9IHByb2Nlc3NfcmR4KHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSBwcm9jZXNzX3Vua25vd24odmlvLCBwa3QpOworCQlicmVhazsKKwl9CisJaWYgKCFlcnIgJiYKKwkgICAgdmlvLT5oc19zdGF0ZSAhPSBwcmV2X3N0YXRlICYmCisJICAgICh2aW8tPmhzX3N0YXRlICYgVklPX0hTX0NPTVBMRVRFKSkKKwkJdmlvLT5vcHMtPmhhbmRzaGFrZV9jb21wbGV0ZSh2aW8pOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wodmlvX2NvbnRyb2xfcGt0X2VuZ2luZSk7CisKK3ZvaWQgdmlvX2Nvbm5fcmVzZXQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKK30KK0VYUE9SVF9TWU1CT0wodmlvX2Nvbm5fcmVzZXQpOworCisvKiBUaGUgaXNzdWUgaXMgdGhhdCB0aGUgU29sYXJpcyB2aXJ0dWFsIGRpc2sgc2VydmVyIGp1c3QgbWlycm9ycyB0aGUKKyAqIFNJRCB2YWx1ZXMgaXQgZ2V0cyBmcm9tIHRoZSBjbGllbnQgcGVlci4gIFNvIHdlIHdvcmsgYXJvdW5kIHRoYXQKKyAqIGhlcmUgaW4gdmlvX3t2YWxpZGF0ZSxzZW5kfV9zaWQoKSBzbyB0aGF0IHRoZSBkcml2ZXJzIGRvbid0IG5lZWQKKyAqIHRvIGJlIGF3YXJlIG9mIHRoaXMgY3JhcC4KKyAqLworaW50IHZpb192YWxpZGF0ZV9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19tc2dfdGFnICp0cCkKK3sKKwl1MzIgc2lkOworCisJLyogQWx3YXlzIGxldCBWRVJTSU9OK0lORk8gcGFja2V0cyB0aHJvdWdoIHVuY2hlY2tlZCwgdGhleQorCSAqIGRlZmluZSB0aGUgbmV3IFNJRC4KKwkgKi8KKwlpZiAodHAtPnR5cGUgPT0gVklPX1RZUEVfQ1RSTCAmJgorCSAgICB0cC0+c3R5cGUgPT0gVklPX1NVQlRZUEVfSU5GTyAmJgorCSAgICB0cC0+c3R5cGVfZW52ID09IFZJT19WRVJfSU5GTykKKwkJcmV0dXJuIDA7CisKKwkvKiBPaywgbm93IGZpZ3VyZSBvdXQgd2hpY2ggU0lEIHRvIHVzZS4gICovCisJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJZGVmYXVsdDoKKwkJc2lkID0gdmlvLT5fcGVlcl9zaWQ7CisJCWJyZWFrOworCisJY2FzZSBWREVWX0RJU0s6CisJCXNpZCA9IHZpby0+X2xvY2FsX3NpZDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNpZCA9PSB0cC0+c2lkKQorCQlyZXR1cm4gMDsKKwl2aW9kYmcoREFUQSwgIkJBRCBTSUQgdGFnLT5zaWRbJTA4eF0gcGVlcl9zaWRbJTA4eF0gbG9jYWxfc2lkWyUwOHhdXG4iLAorCSAgICAgICB0cC0+c2lkLCB2aW8tPl9wZWVyX3NpZCwgdmlvLT5fbG9jYWxfc2lkKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0wodmlvX3ZhbGlkYXRlX3NpZCk7CisKK3UzMiB2aW9fc2VuZF9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzd2l0Y2ggKHZpby0+ZGV2X2NsYXNzKSB7CisJY2FzZSBWREVWX05FVFdPUks6CisJY2FzZSBWREVWX05FVFdPUktfU1dJVENIOgorCWNhc2UgVkRFVl9ESVNLOgorCWRlZmF1bHQ6CisJCXJldHVybiB2aW8tPl9sb2NhbF9zaWQ7CisKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCXJldHVybiB2aW8tPl9wZWVyX3NpZDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHZpb19zZW5kX3NpZCk7CisKK2V4dGVybiBpbnQgdmlvX2xkY19hbGxvYyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJIHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgKmJhc2VfY2ZnLAorCQkJIHZvaWQgKmV2ZW50X2FyZykKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIGNmZyA9ICpiYXNlX2NmZzsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwOworCisJY2ZnLnR4X2lycSA9IHZpby0+dmRldi0+dHhfaXJxOworCWNmZy5yeF9pcnEgPSB2aW8tPnZkZXYtPnJ4X2lycTsKKworCWxwID0gbGRjX2FsbG9jKHZpby0+dmRldi0+Y2hhbm5lbF9pZCwgJmNmZywgZXZlbnRfYXJnKTsKKwlpZiAoSVNfRVJSKGxwKSkKKwkJcmV0dXJuIFBUUl9FUlIobHApOworCisJdmlvLT5scCA9IGxwOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19sZGNfYWxsb2MpOworCit2b2lkIHZpb19sZGNfZnJlZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCWxkY19mcmVlKHZpby0+bHApOworCXZpby0+bHAgPSBOVUxMOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworfQorRVhQT1JUX1NZTUJPTCh2aW9fbGRjX2ZyZWUpOworCit2b2lkIHZpb19wb3J0X3VwKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyLCBzdGF0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCXN0YXRlID0gbGRjX3N0YXRlKHZpby0+bHApOworCisJZXJyID0gMDsKKwlpZiAoc3RhdGUgPT0gTERDX1NUQVRFX0lOSVQpIHsKKwkJZXJyID0gbGRjX2JpbmQodmlvLT5scCwgdmlvLT5uYW1lKTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQb3J0ICVsdSBiaW5kIGZhaWxlZCwgIgorCQkJICAgICAgICJlcnI9JWRcbiIsCisJCQkgICAgICAgdmlvLT5uYW1lLCB2aW8tPnZkZXYtPmNoYW5uZWxfaWQsIGVycik7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gbGRjX2Nvbm5lY3QodmlvLT5scCk7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUG9ydCAlbHUgY29ubmVjdCBmYWlsZWQsICIKKwkJCSAgICAgICAiZXJyPSVkXG4iLAorCQkJICAgICAgIHZpby0+bmFtZSwgdmlvLT52ZGV2LT5jaGFubmVsX2lkLCBlcnIpOworCX0KKwlpZiAoZXJyKSB7CisJCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKworCQlleHBpcmVzID0gcm91bmRfamlmZmllcyhleHBpcmVzKTsKKwkJbW9kX3RpbWVyKCZ2aW8tPnRpbWVyLCBleHBpcmVzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wodmlvX3BvcnRfdXApOworCitzdGF0aWMgdm9pZCB2aW9fcG9ydF90aW1lcih1bnNpZ25lZCBsb25nIF9hcmcpCit7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9IChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqKSBfYXJnOworCisJdmlvX3BvcnRfdXAodmlvKTsKK30KKworaW50IHZpb19kcml2ZXJfaW5pdChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJICAgIHU4IGRldl9jbGFzcywgc3RydWN0IHZpb192ZXJzaW9uICp2ZXJfdGFibGUsCisJCSAgICBpbnQgdmVyX3RhYmxlX3NpemUsIHN0cnVjdCB2aW9fZHJpdmVyX29wcyAqb3BzLAorCQkgICAgY2hhciAqbmFtZSkKK3sKKwlzd2l0Y2ggKGRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTSzoKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFvcHMtPnNlbmRfYXR0ciB8fAorCSAgICAhb3BzLT5oYW5kbGVfYXR0ciB8fAorCSAgICAhb3BzLT5oYW5kc2hha2VfY29tcGxldGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF2ZXJfdGFibGUgfHwgdmVyX3RhYmxlX3NpemUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaW5pdCgmdmlvLT5sb2NrKTsKKworCXZpby0+bmFtZSA9IG5hbWU7CisKKwl2aW8tPmRldl9jbGFzcyA9IGRldl9jbGFzczsKKwl2aW8tPnZkZXYgPSB2ZGV2OworCisJdmlvLT52ZXJfdGFibGUgPSB2ZXJfdGFibGU7CisJdmlvLT52ZXJfdGFibGVfZW50cmllcyA9IHZlcl90YWJsZV9zaXplOworCisJdmlvLT5vcHMgPSBvcHM7CisKKwlzZXR1cF90aW1lcigmdmlvLT50aW1lciwgdmlvX3BvcnRfdGltZXIsICh1bnNpZ25lZCBsb25nKSB2aW8pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19kcml2ZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlIGIvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZQppbmRleCA0YTcyNWQ4Li5jNGE2ZDZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDYgQEAKIAkgTkdtZW1jcHkubyBOR2NvcHlfZnJvbV91c2VyLm8gTkdjb3B5X3RvX3VzZXIubyBOR3BhdGNoLm8gXAogCSBOR3BhZ2UubyBOR2J6ZXJvLm8gXAogCSBjb3B5X2luX3VzZXIubyB1c2VyX2ZpeHVwLm8gbWVtbW92ZS5vIFwKLQkgbWNvdW50Lm8gaXBjc3VtLm8gcndzZW0ubyB4b3IubyBkZWxheS5vCisJIG1jb3VudC5vIGlwY3N1bS5vIHJ3c2VtLm8geG9yLm8KIAogb2JqLXkgKz0gaW9tYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jIGIvYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI3ZTU0Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9saWIvZGVsYXkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIGRlbGF5LmM6IERlbGF5IGxvb3BzIGZvciBzcGFyYzY0Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KLSAqCi0gKiBCYXNlZCBoZWF2aWx5IHVwb24geDg2IHZhcmlhbnQgd2hpY2ggaXM6Ci0gKglDb3B5cmlnaHQgKEMpIDE5OTMgTGludXMgVG9ydmFsZHMKLSAqCUNvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLQotdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCi17Ci0JdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKLQkKLQliY2xvY2sgPSB0aWNrX29wcy0+Z2V0X3RpY2soKTsKLQlkbyB7Ci0JCW5vdyA9IHRpY2tfb3BzLT5nZXRfdGljaygpOwotCX0gd2hpbGUgKChub3ctYmNsb2NrKSA8IGxvb3BzKTsKLX0KLQotLyogV2UgdXNlZCB0byBtdWx0aXBseSBieSBIWiBhZnRlciBzaGlmdGluZyBkb3duIGJ5IDMyIGJpdHMKLSAqIGJ1dCB0aGF0IHJ1bnMgaW50byBwcm9ibGVtcyBmb3IgaGlnaGVyIHZhbHVlcyBvZiBIWiBhbmQKLSAqIHNsb3cgY3B1cy4KLSAqLwotdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JbiAqPSA0OwotCi0JbiAqPSAoY3B1X2RhdGEocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkudWRlbGF5X3ZhbCAqIChIWi80KSk7Ci0JbiA+Pj0gMzI7Ci0KLQlfX2RlbGF5KG4gKyAxKTsKLX0KLQotdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JX19jb25zdF91ZGVsYXkobiAqIDB4MTBjN1VMKTsKLX0KLQotCi12b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbikKLXsKLQlfX2NvbnN0X3VkZWxheShuICogMHg1VUwpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jIGIvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jCmluZGV4IGYzZTBjMTQuLjMzYzViN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL21pc2MuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS9taXNjLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgogCiBpbnQgcHJvbV9zZXJ2aWNlX2V4aXN0cyhjb25zdCBjaGFyICpzZXJ2aWNlX25hbWUpCiB7CkBAIC0zNyw2ICszOCwxMCBAQAogLyogUmVzZXQgYW5kIHJlYm9vdCB0aGUgbWFjaGluZSB3aXRoIHRoZSBjb21tYW5kICdiY29tbWFuZCcuICovCiB2b2lkIHByb21fcmVib290KGNvbnN0IGNoYXIgKmJjb21tYW5kKQogeworI2lmZGVmIENPTkZJR19TVU5fTERPTVMKKwlpZiAobGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJbGRvbV9yZWJvb3QoYmNvbW1hbmQpOworI2VuZGlmCiAJcDEyNzVfY21kKCJib290IiwgUDEyNzVfQVJHKDAsIFAxMjc1X0FSR19JTl9TVFJJTkcpIHwKIAkJICBQMTI3NV9JTk9VVCgxLCAwKSwgYmNvbW1hbmQpOwogfQpAQCAtOTEsNiArOTYsMTAgQEAKICAqLwogdm9pZCBwcm9tX2hhbHQodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfU1VOX0xET01TCisJaWYgKGxkb21fZG9tYWluaW5nX2VuYWJsZWQpCisJCWxkb21fcG93ZXJfb2ZmKCk7CisjZW5kaWYKIGFnYWluOgogCXAxMjc1X2NtZCgiZXhpdCIsIFAxMjc1X0lOT1VUKDAsIDApKTsKIAlnb3RvIGFnYWluOyAvKiBQUk9NIGlzIG91dCB0byBnZXQgbWUgLURhdmVNICovCkBAIC05OCw2ICsxMDcsMTAgQEAKIAogdm9pZCBwcm9tX2hhbHRfcG93ZXJfb2ZmKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQlsZG9tX3Bvd2VyX29mZigpOworI2VuZGlmCiAJcDEyNzVfY21kKCJTVU5XLHBvd2VyLW9mZiIsIFAxMjc1X0lOT1VUKDAsIDApKTsKIAogCS8qIGlmIG5vdGhpbmcgZWxzZSBoZWxwcywgd2UganVzdCBoYWx0ICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jIGIvYXJjaC9zcGFyYzY0L3Byb20vcDEyNzUuYwppbmRleCAyYjMyYzQ4Li43ZmNjY2MwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jCisrKyBiL2FyY2gvc3BhcmM2NC9wcm9tL3AxMjc1LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogc3RydWN0IHsKIAlsb25nIHByb21fY2FsbGJhY2s7CQkJLyogMHgwMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jIGIvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jCmluZGV4IDUwMGYwNWUuLjE3YjdlY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL3RyZWUuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS90cmVlLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogLyogUmV0dXJuIHRoZSBjaGlsZCBvZiBub2RlICdub2RlJyBvciB6ZXJvIGlmIG5vIHRoaXMgbm9kZSBoYXMgbm8KICAqIGRpcmVjdCBkZXNjZW5kZW50LgpAQCAtMjYxLDkgKzI2MiwxNyBAQAogaW50CiBwcm9tX3NldHByb3AoaW50IG5vZGUsIGNvbnN0IGNoYXIgKnBuYW1lLCBjaGFyICp2YWx1ZSwgaW50IHNpemUpCiB7Ci0JaWYoc2l6ZSA9PSAwKSByZXR1cm4gMDsKLQlpZigocG5hbWUgPT0gMCkgfHwgKHZhbHVlID09IDApKSByZXR1cm4gMDsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoKHBuYW1lID09IDApIHx8ICh2YWx1ZSA9PSAwKSkKKwkJcmV0dXJuIDA7CiAJCisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKSB7CisJCWxkb21fc2V0X3ZhcihwbmFtZSwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKIAlyZXR1cm4gcDEyNzVfY21kICgic2V0cHJvcCIsIFAxMjc1X0FSRygxLFAxMjc1X0FSR19JTl9TVFJJTkcpfAogCQkJCQkgIFAxMjc1X0FSRygyLFAxMjc1X0FSR19JTl9CVUYpfAogCQkJCQkgIFAxMjc1X0lOT1VUKDQsIDEpLCAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZwppbmRleCAwOWMxYWNhLi5jODZmNWViIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC91bS9LY29uZmlnLmRlYnVnCkBAIC00Nyw0ICs0NywxMyBAQAogICAgICAgICBJZiB5b3UncmUgaW52b2x2ZWQgaW4gVU1MIGtlcm5lbCBkZXZlbG9wbWVudCBhbmQgd2FudCB0byB1c2UgZ2NvdiwKICAgICAgICAgc2F5IFkuICBJZiB5b3UncmUgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIERFQlVHX1NUQUNLX1VTQUdFCisJYm9vbCAiU3RhY2sgdXRpbGl6YXRpb24gaW5zdHJ1bWVudGF0aW9uIgorCWRlZmF1bHQgTgorCWhlbHAKKwkgIFRyYWNrIHRoZSBtYXhpbXVtIGtlcm5lbCBzdGFjayB1c2FnZSAtIHRoaXMgd2lsbCBsb29rIGF0IGVhY2gKKwkgIGtlcm5lbCBzdGFjayBhdCBwcm9jZXNzIGV4aXQgYW5kIGxvZyBpdCBpZiBpdCdzIHRoZSBkZWVwZXN0CisJICBzdGFjayBzZWVuIHNvIGZhci4KKworCSAgVGhpcyBvcHRpb24gd2lsbCBzbG93IGRvd24gcHJvY2VzcyBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gc29tZXdoYXQuCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3VtL2NvbmZpZy5yZWxlYXNlIGIvYXJjaC91bS9jb25maWcucmVsZWFzZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2OGJjYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2NvbmZpZy5yZWxlYXNlCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMKLUNPTkZJR19VU0VSTU9ERT15Ci0jIENPTkZJR19JU0EgaXMgbm90IHNldAotIyBDT05GSUdfU0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0kgaXMgbm90IHNldAotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLQotIwotIyBHZW5lcmFsIFNldHVwCi0jCi1DT05GSUdfU1RESU9fQ09OU09MRT15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0JJTkZNVF9BT1VUPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfTUlTQz15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX1VOSVg5OF9QVFlfQ09VTlQ9MjU2Ci1DT05GSUdfU1NMPXkKLUNPTkZJR19IT1NURlM9eQotQ09ORklHX01DT05TT0xFPXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci0jIENPTkZJR19IT1NUXzJHXzJHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VNTF9TTVAgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLUNPTkZJR19DT05fWkVST19DSEFOPSJmZDowLGZkOjEiCi1DT05GSUdfQ09OX0NIQU49Inh0ZXJtIgotQ09ORklHX1NTTF9DSEFOPSJwdHkiCi1DT05GSUdfTkVTVF9MRVZFTD0wCi1DT05GSUdfS0VSTkVMX0hBTEZfR0lHUz0xCi0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19LTU9EPXkKLQotIwotIyBEZXZpY2VzCi0jCi1DT05GSUdfQkxLX0RFVl9VQkQ9eQotIyBDT05GSUdfQkxLX0RFVl9VQkRfU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLUNPTkZJR19CTEtfREVWX05CRD15Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX01NQVBQRVIgaXMgbm90IHNldAotQ09ORklHX1VNTF9TT1VORD15Ci1DT05GSUdfU09VTkQ9eQotQ09ORklHX0hPU1RBVURJTz15Ci0jIENPTkZJR19VTUxfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfVFRZX0xPRyBpcyBub3Qgc2V0Ci1DT05GSUdfRkRfQ0hBTj15Ci0jIENPTkZJR19OVUxMX0NIQU4gaXMgbm90IHNldAotQ09ORklHX1BPUlRfQ0hBTj15Ci1DT05GSUdfUFRZX0NIQU49eQotQ09ORklHX1RUWV9DSEFOPXkKLUNPTkZJR19YVEVSTV9DSEFOPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1BBQ0tFVF9NTUFQPXkKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GSUxURVIgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FQ04gaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LSFRUUEQgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotCi0jCi0jICAKLSMKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19VTUxfTkVUPXkKLUNPTkZJR19VTUxfTkVUX0VUSEVSVEFQPXkKLUNPTkZJR19VTUxfTkVUX1RVTlRBUD15Ci1DT05GSUdfVU1MX05FVF9TTElQPXkKLUNPTkZJR19VTUxfTkVUX0RBRU1PTj15Ci1DT05GSUdfVU1MX05FVF9NQ0FTVD15Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVk9eQotQ09ORklHX0JPTkRJTkc9bQotQ09ORklHX0VRVUFMSVpFUj1tCi1DT05GSUdfVFVOPXkKLSMgQ09ORklHX0VUSEVSVEFQIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLSMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUklfU0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci1DT05GSUdfUExJUD1tCi1DT05GSUdfUFBQPW0KLUNPTkZJR19QUFBfTVVMVElMSU5LPXkKLSMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKLUNPTkZJR19QUFBfU1lOQ19UVFk9bQotQ09ORklHX1BQUF9ERUZMQVRFPW0KLUNPTkZJR19QUFBfQlNEQ09NUD1tCi1DT05GSUdfUFBQT0U9bQotQ09ORklHX1NMSVA9bQotQ09ORklHX1NMSVBfQ09NUFJFU1NFRD15Ci1DT05GSUdfU0xJUF9TTUFSVD15Ci0jIENPTkZJR19TTElQX01PREVfU0xJUDYgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1BDSSBpcyBub3Qgc2V0Ci1DT05GSUdfU0hBUEVSPW0KLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19RVU9UQT15Ci1DT05GSUdfQVVUT0ZTX0ZTPW0KLUNPTkZJR19BVVRPRlM0X0ZTPW0KLUNPTkZJR19SRUlTRVJGU19GUz1tCi0jIENPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19QUk9DX0lORk8gaXMgbm90IHNldAotQ09ORklHX0FERlNfRlM9bQotIyBDT05GSUdfQURGU19GU19SVyBpcyBub3Qgc2V0Ci1DT05GSUdfQUZGU19GUz1tCi1DT05GSUdfSEZTX0ZTPW0KLUNPTkZJR19CRlNfRlM9bQotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZBVF9GUz15Ci1DT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1VNU0RPU19GUz15Ci1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfRUZTX0ZTPW0KLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAotQ09ORklHX0NSQU1GUz1tCi1DT05GSUdfVE1QRlM9eQotQ09ORklHX1JBTUZTPW0KLUNPTkZJR19JU085NjYwX0ZTPXkKLSMgQ09ORklHX0pPTElFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAotQ09ORklHX01JTklYX0ZTPW0KLUNPTkZJR19WWEZTX0ZTPW0KLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19SVyBpcyBub3Qgc2V0Ci1DT05GSUdfSFBGU19GUz1tCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfREVWRlNfRlM9eQotQ09ORklHX0RFVkZTX01PVU5UPXkKLSMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZQVFNfRlM9eQotQ09ORklHX1FOWDRGU19GUz1tCi0jIENPTkZJR19RTlg0RlNfUlcgaXMgbm90IHNldAotQ09ORklHX1JPTUZTX0ZTPW0KLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19TWVNWX0ZTPW0KLUNPTkZJR19VREZfRlM9bQotQ09ORklHX1VGU19GUz1tCi0jIENPTkZJR19VRlNfRlNfV1JJVEUgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLSMgQ09ORklHX1JPT1RfTkZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEPXkKLUNPTkZJR19ORlNEX1YzPXkKLUNPTkZJR19TVU5SUEM9eQotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX0lPQ1RMX0xPQ0tJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfU1RST05HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX05GU19OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19PUzJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfU01BTExET1MgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfTkxTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX0VYVFJBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlNfRlMgaXMgbm90IHNldAotQ09ORklHX1pMSUJfRlNfSU5GTEFURT1tCi0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0jIENPTkZJR19TTUJfTkxTIGlzIG5vdCBzZXQKLUNPTkZJR19OTFM9eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX01EIGlzIG5vdCBzZXQKLSMgQ09ORklHX01EX0xJTkVBUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlEMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlEMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlENSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9NVUxUSVBBVEggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9MVk0gaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QVF9QUk9YWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUFJPRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQ09WIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZGVmY29uZmlnIGIvYXJjaC91bS9kZWZjb25maWcKaW5kZXggYTU0ZDBlZi4uYTI1Y2QyNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kZWZjb25maWcKKysrIGIvYXJjaC91bS9kZWZjb25maWcKQEAgLTE4OSw3ICsxODksNyBAQAogIyBDT05GSUdfTk9DT05GSUdfQ0hBTiBpcyBub3Qgc2V0CiBDT05GSUdfQ09OX1pFUk9fQ0hBTj0iZmQ6MCxmZDoxIgogQ09ORklHX0NPTl9DSEFOPSJ4dGVybSIKLUNPTkZJR19TU0xfQ0hBTj0icHR5IgorQ09ORklHX1NTTF9DSEFOPSJwdHMiCiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtNTI3LDMgKzUyNyw0IEBACiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0dQUk9GIGlzIG5vdCBzZXQKICMgQ09ORklHX0dDT1YgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCmluZGV4IDNhYTM1MTYuLjM2OGQzZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKQEAgLTIwMywyMiArMjAzLDM3IEBACiAJfQogfQogCi12b2lkIGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKQoraW50IGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVsZTsKIAlzdHJ1Y3QgY2hhbiAqY2hhbjsKKwlpbnQgZXJyOwogCiAJbGlzdF9mb3JfZWFjaChlbGUsICZsaW5lLT5jaGFuX2xpc3QpewogCQljaGFuID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCBjaGFuLCBsaXN0KTsKLQkJaWYob3Blbl9vbmVfY2hhbihjaGFuKSkKKwkJZXJyID0gb3Blbl9vbmVfY2hhbihjaGFuKTsKKwkJaWYgKGVycikgeworCQkJaWYgKGNoYW4tPnByaW1hcnkpCisJCQkJZ290byBvdXRfY2xvc2U7CisKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJaWYoY2hhbi0+ZW5hYmxlZCkKIAkJCWNvbnRpbnVlOwotCQlsaW5lX3NldHVwX2lycShjaGFuLT5mZCwgY2hhbi0+aW5wdXQsIGNoYW4tPm91dHB1dCwgbGluZSwKLQkJCSAgICAgICBjaGFuKTsKKwkJZXJyID0gbGluZV9zZXR1cF9pcnEoY2hhbi0+ZmQsIGNoYW4tPmlucHV0LCBjaGFuLT5vdXRwdXQsIGxpbmUsCisJCQkJICAgICBjaGFuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2Nsb3NlOworCiAJCWNoYW4tPmVuYWJsZWQgPSAxOwogCX0KKworCXJldHVybiAwOworCisgb3V0X2Nsb3NlOgorCWNsb3NlX2NoYW4oJmxpbmUtPmNoYW5fbGlzdCwgMCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyogSXRlbXMgYXJlIGFkZGVkIGluIElSUSBjb250ZXh0LCB3aGVuIGZyZWVfaXJxIGNhbid0IGJlIGNhbGxlZCwgYW5kCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKaW5kZXggMTNmMGJmOC4uNGQ0MzhmMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYwpAQCAtNTEsMTkgKzUxLDIxIEBACiAvKgogICogVU1MIFNJR1dJTkNIIGhhbmRsaW5nCiAgKgotICogVGhlIHBvaW50IG9mIHRoaXMgaXMgdG8gaGFuZGxlIFNJR1dJTkNIIG9uIGNvbnNvbGVzIHdoaWNoIGhhdmUgaG9zdCB0dHlzIGFuZAotICogcmVsYXkgdGhlbSBpbnNpZGUgVU1MIHRvIHdoYXRldmVyIG1pZ2h0IGJlIHJ1bm5pbmcgb24gdGhlIGNvbnNvbGUgYW5kIGNhcmVzCi0gKiBhYm91dCB0aGUgd2luZG93IHNpemUgKHNpbmNlIFNJR1dJTkNIIG5vdGlmaWVzIGFib3V0IHRlcm1pbmFsIHNpemUgY2hhbmdlcykuCisgKiBUaGUgcG9pbnQgb2YgdGhpcyBpcyB0byBoYW5kbGUgU0lHV0lOQ0ggb24gY29uc29sZXMgd2hpY2ggaGF2ZSBob3N0CisgKiB0dHlzIGFuZCByZWxheSB0aGVtIGluc2lkZSBVTUwgdG8gd2hhdGV2ZXIgbWlnaHQgYmUgcnVubmluZyBvbiB0aGUKKyAqIGNvbnNvbGUgYW5kIGNhcmVzIGFib3V0IHRoZSB3aW5kb3cgc2l6ZSAoc2luY2UgU0lHV0lOQ0ggbm90aWZpZXMKKyAqIGFib3V0IHRlcm1pbmFsIHNpemUgY2hhbmdlcykuCiAgKgotICogU28sIHdlIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgZm9yIGVhY2ggaG9zdCB0dHkgYXR0YWNoZWQgdG8gYSBVTUwgZGV2aWNlCi0gKiAoc2lkZS1pc3N1ZSAtIEknbSBhbm5veWVkIHRoYXQgb25lIHRocmVhZCBjYW4ndCBoYXZlIG11bHRpcGxlIGNvbnRyb2xsaW5nCi0gKiB0dHlzIGZvciBwdXJwb3NlZCBvZiBoYW5kbGluZyBTSUdXSU5DSCwgYnV0IEkgaW1hZ2luZSB0aGVyZSBhcmUgb3RoZXIgcmVhc29ucwotICogdGhhdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlKS4KKyAqIFNvLCB3ZSBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIGZvciBlYWNoIGhvc3QgdHR5IGF0dGFjaGVkIHRvIGEgVU1MCisgKiBkZXZpY2UgKHNpZGUtaXNzdWUgLSBJJ20gYW5ub3llZCB0aGF0IG9uZSB0aHJlYWQgY2FuJ3QgaGF2ZQorICogbXVsdGlwbGUgY29udHJvbGxpbmcgdHR5cyBmb3IgdGhlIHB1cnBvc2Ugb2YgaGFuZGxpbmcgU0lHV0lOQ0gsIGJ1dAorICogSSBpbWFnaW5lIHRoZXJlIGFyZSBvdGhlciByZWFzb25zIHRoYXQgZG9lc24ndCBtYWtlIGFueSBzZW5zZSkuCiAgKgotICogU0lHV0lOQ0ggY2FuJ3QgYmUgcmVjZWl2ZWQgc3luY2hyb25vdXNseSwgc28geW91IGhhdmUgdG8gc2V0IHVwIHRvIHJlY2VpdmUgaXQKLSAqIGFzIGEgc2lnbmFsLiAgVGhhdCBiZWluZyB0aGUgY2FzZSwgaWYgeW91IGFyZSBnb2luZyB0byB3YWl0IGZvciBpdCwgaXQgaXMKLSAqIGNvbnZlbmllbnQgdG8gc2l0IGluIHNpZ3N1c3BlbmQoKSBhbmQgd2FpdCBmb3IgdGhlIHNpZ25hbCB0byBib3VuY2UgeW91IG91dCBvZgotICogaXQgKHNlZSBiZWxvdyBmb3IgaG93IHdlIG1ha2Ugc3VyZSB0byBleGl0IG9ubHkgb24gU0lHV0lOQ0gpLgorICogU0lHV0lOQ0ggY2FuJ3QgYmUgcmVjZWl2ZWQgc3luY2hyb25vdXNseSwgc28geW91IGhhdmUgdG8gc2V0IHVwIHRvCisgKiByZWNlaXZlIGl0IGFzIGEgc2lnbmFsLiAgVGhhdCBiZWluZyB0aGUgY2FzZSwgaWYgeW91IGFyZSBnb2luZyB0bworICogd2FpdCBmb3IgaXQsIGl0IGlzIGNvbnZlbmllbnQgdG8gc2l0IGluIHNpZ3N1c3BlbmQoKSBhbmQgd2FpdCBmb3IKKyAqIHRoZSBzaWduYWwgdG8gYm91bmNlIHlvdSBvdXQgb2YgaXQgKHNlZSBiZWxvdyBmb3IgaG93IHdlIG1ha2Ugc3VyZQorICogdG8gZXhpdCBvbmx5IG9uIFNJR1dJTkNIKS4KICAqLwogCiBzdGF0aWMgdm9pZCB3aW5jaF9oYW5kbGVyKGludCBzaWcpCkBAIC0xMTIsNyArMTE0LDggQEAKIAogCWVyciA9IG9zX25ld190dHlfcGdycChwdHlfZmQsIG9zX2dldHBpZCgpKTsKIAlpZihlcnIgPCAwKXsKLQkJcHJpbnRrKCJ3aW5jaF90aHJlYWQgOiBuZXdfdHR5X3BncnAgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLWVycik7CisJCXByaW50aygid2luY2hfdGhyZWFkIDogbmV3X3R0eV9wZ3JwIGZhaWxlZCBvbiBmZCAlZCwgIgorCQkgICAgICAgImVyciA9ICVkXG4iLCBwdHlfZmQsIC1lcnIpOwogCQlleGl0KDEpOwogCX0KIApAQCAtMTI2LDggKzEyOSw5IEBACiAJCSAgICAgICAiZXJyID0gJWRcbiIsIC1jb3VudCk7CiAKIAl3aGlsZSgxKXsKLQkJLyogVGhpcyB3aWxsIGJlIGludGVycnVwdGVkIGJ5IFNJR1dJTkNIIG9ubHksIHNpbmNlIG90aGVyIHNpZ25hbHMKLQkJICogYXJlIGJsb2NrZWQuKi8KKwkJLyogVGhpcyB3aWxsIGJlIGludGVycnVwdGVkIGJ5IFNJR1dJTkNIIG9ubHksIHNpbmNlCisJCSAqIG90aGVyIHNpZ25hbHMgYXJlIGJsb2NrZWQuCisJCSAqLwogCQlzaWdzdXNwZW5kKCZzaWdzKTsKIAogCQljb3VudCA9IG9zX3dyaXRlX2ZpbGUocGlwZV9mZCwgJmMsIHNpemVvZihjKSk7CkBAIC0xMzcsMTAgKzE0MSwxMCBAQAogCX0KIH0KIAotc3RhdGljIGludCB3aW5jaF90cmFtcChpbnQgZmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCAqZmRfb3V0KQorc3RhdGljIGludCB3aW5jaF90cmFtcChpbnQgZmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCAqZmRfb3V0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQogewogCXN0cnVjdCB3aW5jaF9kYXRhIGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKIAlpbnQgZmRzWzJdLCBuLCBlcnI7CiAJY2hhciBjOwogCkBAIC0xNTMsOSArMTU3LDExIEBACiAJZGF0YSA9ICgoc3RydWN0IHdpbmNoX2RhdGEpIHsgLnB0eV9mZCAJCT0gZmQsCiAJCQkJICAgICAgLnBpcGVfZmQgCQk9IGZkc1sxXSB9ICk7CiAJLyogQ0xPTkVfRklMRVMgc28gdGhpcyB0aHJlYWQgZG9lc24ndCBob2xkIG9wZW4gZmlsZXMgd2hpY2ggYXJlIG9wZW4KLQkgKiBub3csIGJ1dCBsYXRlciBjbG9zZWQuICBUaGlzIGlzIGEgcHJvYmxlbSB3aXRoIC9kZXYvbmV0L3R1bi4KKwkgKiBub3csIGJ1dCBsYXRlciBjbG9zZWQgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiAgVGhpcyBpcyBhCisJICogcHJvYmxlbSB3aXRoIC9kZXYvbmV0L3R1biwgd2hpY2ggaWYgaGVsZCBvcGVuIGJ5IHRoaXMKKwkgKiB0aHJlYWQsIHByZXZlbnRzIHRoZSBUVU4vVEFQIGRldmljZSBmcm9tIGJlaW5nIHJldXNlZC4KIAkgKi8KLQllcnIgPSBydW5faGVscGVyX3RocmVhZCh3aW5jaF90aHJlYWQsICZkYXRhLCBDTE9ORV9GSUxFUywgJnN0YWNrLCAwKTsKKwllcnIgPSBydW5faGVscGVyX3RocmVhZCh3aW5jaF90aHJlYWQsICZkYXRhLCBDTE9ORV9GSUxFUywgc3RhY2tfb3V0KTsKIAlpZihlcnIgPCAwKXsKIAkJcHJpbnRrKCJmb3JrIG9mIHdpbmNoX3RocmVhZCBmYWlsZWQgLSBlcnJubyA9ICVkXG4iLCAtZXJyKTsKIAkJZ290byBvdXRfY2xvc2U7CkBAIC0xNzAsNyArMTc2LDEzIEBACiAgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXRfY2xvc2U7CiAJfQotCXJldHVybiBlcnIgOworCisJaWYgKG9zX3NldF9mZF9ibG9jaygqZmRfb3V0LCAwKSkgeworCQlwcmludGsoIndpbmNoX3RyYW1wOiBmYWlsZWQgdG8gc2V0IHRocmVhZF9mZCBub24tYmxvY2tpbmcuXG4iKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJcmV0dXJuIGVycjsKIAogIG91dF9jbG9zZToKIAlvc19jbG9zZV9maWxlKGZkc1sxXSk7CkBAIC0xODEsMjUgKzE5MywyNSBAQAogCiB2b2lkIHJlZ2lzdGVyX3dpbmNoKGludCBmZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlpbnQgcGlkLCB0aHJlYWQsIHRocmVhZF9mZCA9IC0xOwotCWludCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCWludCBwaWQsIHRocmVhZCwgY291bnQsIHRocmVhZF9mZCA9IC0xOwogCWNoYXIgYyA9IDE7CiAKIAlpZighaXNhdHR5KGZkKSkKIAkJcmV0dXJuOwogCiAJcGlkID0gdGNnZXRwZ3JwKGZkKTsKLQlpZighQ0hPT1NFX01PREVfUFJPQyhpc190cmFjZXJfd2luY2gsIGlzX3NrYXNfd2luY2gsIHBpZCwgZmQsCi0JCQkgICAgIHR0eSkgJiYgKHBpZCA9PSAtMSkpewotCQl0aHJlYWQgPSB3aW5jaF90cmFtcChmZCwgdHR5LCAmdGhyZWFkX2ZkKTsKLQkJaWYodGhyZWFkID4gMCl7Ci0JCQlyZWdpc3Rlcl93aW5jaF9pcnEodGhyZWFkX2ZkLCBmZCwgdGhyZWFkLCB0dHkpOworCWlmICghQ0hPT1NFX01PREVfUFJPQyhpc190cmFjZXJfd2luY2gsIGlzX3NrYXNfd2luY2gsIHBpZCwgZmQsIHR0eSkgJiYKKwkgICAgKHBpZCA9PSAtMSkpIHsKKwkJdGhyZWFkID0gd2luY2hfdHJhbXAoZmQsIHR0eSwgJnRocmVhZF9mZCwgJnN0YWNrKTsKKwkJaWYgKHRocmVhZCA8IDApCisJCQlyZXR1cm47CiAKLQkJCWNvdW50ID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZjLCBzaXplb2YoYykpOwotCQkJaWYoY291bnQgIT0gc2l6ZW9mKGMpKQotCQkJCXByaW50aygicmVnaXN0ZXJfd2luY2ggOiBmYWlsZWQgdG8gd3JpdGUgIgotCQkJCSAgICAgICAic3luY2hyb25pemF0aW9uIGJ5dGUsIGVyciA9ICVkXG4iLAotCQkJCQktY291bnQpOwotCQl9CisJCXJlZ2lzdGVyX3dpbmNoX2lycSh0aHJlYWRfZmQsIGZkLCB0aHJlYWQsIHR0eSwgc3RhY2spOworCisJCWNvdW50ID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZjLCBzaXplb2YoYykpOworCQlpZihjb3VudCAhPSBzaXplb2YoYykpCisJCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoIDogZmFpbGVkIHRvIHdyaXRlICIKKwkJCSAgICAgICAic3luY2hyb25pemF0aW9uIGJ5dGUsIGVyciA9ICVkXG4iLCAtY291bnQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmggYi9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCmluZGV4IDE1NDUzODQuLmNhOGM5ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKKysrIGIvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaApAQCAtOCw3ICs4LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkICpjb3dfbWFsbG9jKGludCBzaXplKQogewotCXJldHVybiB1bV9rbWFsbG9jKHNpemUpOworCXJldHVybiBrbWFsbG9jKHNpemUsIFVNX0dGUF9LRVJORUwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY293X2ZyZWUodm9pZCAqcHRyKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYwppbmRleCBiODY5ZTM4Li44ZDIwMDhmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYwpAQCAtMzUsNyArMzUsNyBAQAogewogCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuOwogCi0Jc3VuID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSk7CisJc3VuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoc3VuID09IE5VTEwpewogCQlwcmludGsoIm5ld19hZGRyOiBhbGxvY2F0aW9uIG9mIHNvY2thZGRyX3VuIGZhaWxlZFxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtODMsNyArODMsNyBAQAogCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKLQlzdW4gPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKTsKKwlzdW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihzdW4gPT0gTlVMTCl7CiAJCXByaW50aygibmV3X2FkZHI6IGFsbG9jYXRpb24gb2Ygc29ja2FkZHJfdW4gZmFpbGVkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9mZC5jIGIvYXJjaC91bS9kcml2ZXJzL2ZkLmMKaW5kZXggN2YwODNlYy4uMzljMDFmZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2ZkLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2ZkLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkJcHJpbnRrKCJmZF9pbml0IDogY291bGRuJ3QgcGFyc2UgZmlsZSBkZXNjcmlwdG9yICclcydcbiIsIHN0cik7CiAJCXJldHVybihOVUxMKTsKIAl9Ci0JZGF0YSA9IHVtX2ttYWxsb2Moc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoZGF0YSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CiAJKmRhdGEgPSAoKHN0cnVjdCBmZF9jaGFuKSB7IC5mZCAgCT0gbiwKIAkJCQkgICAgLnJhdyAgCT0gb3B0cy0+cmF3IH0pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCmluZGV4IDVlZWVjZjg5Li4xMTcxNzkwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ191c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCkBAIC02OCw3ICs2OCw3IEBACiAJCWFyZ3MgPSBwaWRfYXJnczsKIAl9CiAKLQlwaWQgPSBydW5faGVscGVyKHByZV9leGVjLCAmZGF0YSwgYXJncywgTlVMTCk7CisJcGlkID0gcnVuX2hlbHBlcihwcmVfZXhlYywgJmRhdGEsIGFyZ3MpOwogCiAJb3NfY2xvc2VfZmlsZShvdXRfZmRzWzBdKTsKIAlvc19jbG9zZV9maWxlKGluX2Zkc1sxXSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCA0YmQ0MGJiLi4zZTBiNjhlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTQ1NCw3ICs0NTQsMTAgQEAKIAl0dHktPmRyaXZlcl9kYXRhID0gbGluZTsKIAlsaW5lLT50dHkgPSB0dHk7CiAKLQllbmFibGVfY2hhbihsaW5lKTsKKwllcnIgPSBlbmFibGVfY2hhbihsaW5lKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJSU5JVF9ERUxBWUVEX1dPUksoJmxpbmUtPnRhc2ssIGxpbmVfdGltZXJfY2IpOwogCiAJaWYoIWxpbmUtPnNpZ2lvKXsKQEAgLTc0Niw4ICs3NDksMjQgQEAKIAlpbnQgdHR5X2ZkOwogCWludCBwaWQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOwogfTsKIAorc3RhdGljIHZvaWQgZnJlZV93aW5jaChzdHJ1Y3Qgd2luY2ggKndpbmNoLCBpbnQgZnJlZV9pcnFfb2spCit7CisJbGlzdF9kZWwoJndpbmNoLT5saXN0KTsKKworCWlmICh3aW5jaC0+cGlkICE9IC0xKQorCQlvc19raWxsX3Byb2Nlc3Mod2luY2gtPnBpZCwgMSk7CisJaWYgKHdpbmNoLT5mZCAhPSAtMSkKKwkJb3NfY2xvc2VfZmlsZSh3aW5jaC0+ZmQpOworCWlmICh3aW5jaC0+c3RhY2sgIT0gMCkKKwkJZnJlZV9zdGFjayh3aW5jaC0+c3RhY2ssIDApOworCWlmIChmcmVlX2lycV9vaykKKwkJZnJlZV9pcnEoV0lOQ0hfSVJRLCB3aW5jaCk7CisJa2ZyZWUod2luY2gpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3Qgd2luY2hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHdpbmNoICp3aW5jaCA9IGRhdGE7CkBAIC03NjQsMTIgKzc4MywxMyBAQAogCQkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgLWVycik7CiAJCQkJcHJpbnRrKCJmZCAlZCBpcyBsb3NpbmcgU0lHV0lOQ0ggc3VwcG9ydFxuIiwKIAkJCQkgICAgICAgd2luY2gtPnR0eV9mZCk7CisJCQkJZnJlZV93aW5jaCh3aW5jaCwgMCk7CiAJCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQkJfQogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0JdHR5ICA9IHdpbmNoLT50dHk7CisJdHR5ID0gd2luY2gtPnR0eTsKIAlpZiAodHR5ICE9IE5VTEwpIHsKIAkJbGluZSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJCWNoYW5fd2luZG93X3NpemUoJmxpbmUtPmNoYW5fbGlzdCwgJnR0eS0+d2luc2l6ZS53c19yb3csCkBAIC03ODIsNDMgKzgwMiw0NCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotdm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQordm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJdW5zaWduZWQgbG9uZyBzdGFjaykKIHsKIAlzdHJ1Y3Qgd2luY2ggKndpbmNoOwogCiAJd2luY2ggPSBrbWFsbG9jKHNpemVvZigqd2luY2gpLCBHRlBfS0VSTkVMKTsKIAlpZiAod2luY2ggPT0gTlVMTCkgewogCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoX2lycSAtIGttYWxsb2MgZmFpbGVkXG4iKTsKLQkJcmV0dXJuOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJKndpbmNoID0gKChzdHJ1Y3Qgd2luY2gpIHsgLmxpc3QgIAk9IExJU1RfSEVBRF9JTklUKHdpbmNoLT5saXN0KSwKIAkJCQkgICAuZmQgIAk9IGZkLAogCQkJCSAgIC50dHlfZmQgCT0gdHR5X2ZkLAogCQkJCSAgIC5waWQgIAk9IHBpZCwKLQkJCQkgICAudHR5IAk9IHR0eSB9KTsKKwkJCQkgICAudHR5IAk9IHR0eSwKKwkJCQkgICAuc3RhY2sJPSBzdGFjayB9KTsKKworCWlmICh1bV9yZXF1ZXN0X2lycShXSU5DSF9JUlEsIGZkLCBJUlFfUkVBRCwgd2luY2hfaW50ZXJydXB0LAorCQkJICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAorCQkJICAgIndpbmNoIiwgd2luY2gpIDwgMCkgeworCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoX2lycSAtIGZhaWxlZCB0byByZWdpc3RlciBJUlFcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KIAogCXNwaW5fbG9jaygmd2luY2hfaGFuZGxlcl9sb2NrKTsKIAlsaXN0X2FkZCgmd2luY2gtPmxpc3QsICZ3aW5jaF9oYW5kbGVycyk7CiAJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAKLQlpZih1bV9yZXF1ZXN0X2lycShXSU5DSF9JUlEsIGZkLCBJUlFfUkVBRCwgd2luY2hfaW50ZXJydXB0LAotCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00sCi0JCQkgICJ3aW5jaCIsIHdpbmNoKSA8IDApCi0JCXByaW50aygicmVnaXN0ZXJfd2luY2hfaXJxIC0gZmFpbGVkIHRvIHJlZ2lzdGVyIElSUVxuIik7Ci19CisJcmV0dXJuOwogCi1zdGF0aWMgdm9pZCBmcmVlX3dpbmNoKHN0cnVjdCB3aW5jaCAqd2luY2gpCi17Ci0JbGlzdF9kZWwoJndpbmNoLT5saXN0KTsKLQotCWlmKHdpbmNoLT5waWQgIT0gLTEpCi0JCW9zX2tpbGxfcHJvY2Vzcyh3aW5jaC0+cGlkLCAxKTsKLQlpZih3aW5jaC0+ZmQgIT0gLTEpCi0JCW9zX2Nsb3NlX2ZpbGUod2luY2gtPmZkKTsKLQotCWZyZWVfaXJxKFdJTkNIX0lSUSwgd2luY2gpOworIG91dF9mcmVlOgogCWtmcmVlKHdpbmNoKTsKKyBjbGVhbnVwOgorCW9zX2tpbGxfcHJvY2VzcyhwaWQsIDEpOworCW9zX2Nsb3NlX2ZpbGUoZmQpOworCWlmIChzdGFjayAhPSAwKQorCQlmcmVlX3N0YWNrKHN0YWNrLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl93aW5jaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtODMxLDcgKzg1Miw3IEBACiAJbGlzdF9mb3JfZWFjaChlbGUsICZ3aW5jaF9oYW5kbGVycyl7CiAJCXdpbmNoID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCB3aW5jaCwgbGlzdCk7CiAgICAgICAgICAgICAgICAgaWYod2luY2gtPnR0eSA9PSB0dHkpewotCQkJZnJlZV93aW5jaCh3aW5jaCk7CisJCQlmcmVlX3dpbmNoKHdpbmNoLCAxKTsKIAkJCWJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODQ3LDcgKzg2OCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUoZWxlLCBuZXh0LCAmd2luY2hfaGFuZGxlcnMpewogCQl3aW5jaCA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3Qgd2luY2gsIGxpc3QpOwotCQlmcmVlX3dpbmNoKHdpbmNoKTsKKwkJZnJlZV93aW5jaCh3aW5jaCwgMSk7CiAJfQogCiAJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYwppbmRleCBkMzE5ZGIxLi4yMzZhM2RmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKQEAgLTMwLDcgKzMwLDcgQEAKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKIAotCXNpbiA9IHVtX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCXNpbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksIFVNX0dGUF9LRVJORUwpOwogCWlmKHNpbiA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZXdfYWRkcjogYWxsb2NhdGlvbiBvZiBzb2NrYWRkcl9pbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCmluZGV4IDYyZTVhZDYuLmYzMWU3MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwpAQCAtODYsOCArODYsOSBAQAogCWludCBsZW47CiAKIAlyZXEtPm9yaWdpbmxlbiA9IHNpemVvZihyZXEtPm9yaWdpbik7Ci0JcmVxLT5sZW4gPSByZWN2ZnJvbShmZCwgJnJlcS0+cmVxdWVzdCwgc2l6ZW9mKHJlcS0+cmVxdWVzdCksIDAsCi0JCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSByZXEtPm9yaWdpbiwgJnJlcS0+b3JpZ2lubGVuKTsKKwlyZXEtPmxlbiA9IHJlY3Zmcm9tKGZkLCAmcmVxLT5yZXF1ZXN0LCBzaXplb2YocmVxLT5yZXF1ZXN0KSwKKwkJCSAgICBNU0dfRE9OVFdBSVQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgcmVxLT5vcmlnaW4sCisJCQkgICAgJnJlcS0+b3JpZ2lubGVuKTsKIAlpZiAocmVxLT5sZW4gPCAwKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYwppbmRleCAzNTAzY2ZmLi5kYTk0NmUzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJfQogCXBlX2RhdGEuY2xvc2VfbWUgPSBmZHNbMF07CiAJcGVfZGF0YS5zdGRvdXQgPSBmZHNbMV07Ci0JcGlkID0gcnVuX2hlbHBlcihjaGFuZ2VfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2LCBOVUxMKTsKKwlwaWQgPSBydW5faGVscGVyKGNoYW5nZV9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3YpOwogCiAJaWYgKHBpZCA+IDApCS8qIEF2b2lkIGhhbmcgYXMgd2Ugd29uJ3QgZ2V0IGRhdGEgaW4gZmFpbHVyZSBjYXNlLiAqLwogCQlyZWFkX291dHB1dChmZHNbMF0sIG91dHB1dCwgb3V0cHV0X2xlbik7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAkJbmV0bWFza1syXSwgbmV0bWFza1szXSk7CiAKIAlvdXRwdXRfbGVuID0gVU1fS0VSTl9QQUdFX1NJWkU7Ci0Jb3V0cHV0ID0gdW1fa21hbGxvYyhvdXRwdXRfbGVuKTsKKwlvdXRwdXQgPSBrbWFsbG9jKG91dHB1dF9sZW4sIFVNX0dGUF9LRVJORUwpOwogCWlmKG91dHB1dCA9PSBOVUxMKQogCQlwcmludGsoImNoYW5nZSA6IGZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCmluZGV4IDQ4M2FhMTUuLjEzMTY0NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKLQkJcHJpLT5jb21waWxlZCA9IHVtX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ3JhbSkpOworCQlwcmktPmNvbXBpbGVkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJwZl9wcm9ncmFtKSwgVU1fR0ZQX0tFUk5FTCk7CiAJCWlmKHByaS0+Y29tcGlsZWQgPT0gTlVMTCl7CiAJCQlwcmludGsoVU1fS0VSTl9FUlIgInBjYXBfb3BlbiA6IGttYWxsb2MgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCmluZGV4IDNmNjM1N2QuLmM3OTliMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlpZihrZXJuX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gdW1fa21hbGxvYyhzaXplb2YoKmRhdGEpKTsKKwlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihkYXRhID09IE5VTEwpCiAJCWdvdG8gZXJyOwogCkBAIC0xODgsNyArMTg4LDcgQEAKIAkJeyAuc29ja19mZCAgCQk9IG5ldywKIAkJICAucGlwZV9mZCAJCT0gc29ja2V0WzFdIH0pOwogCi0JZXJyID0gcnVuX2hlbHBlcihwb3J0X3ByZV9leGVjLCAmZGF0YSwgYXJndiwgTlVMTCk7CisJZXJyID0gcnVuX2hlbHBlcihwb3J0X3ByZV9leGVjLCAmZGF0YSwgYXJndik7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfc2h1dGRvd247CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wdHkuYyBiL2FyY2gvdW0vZHJpdmVycy9wdHkuYwppbmRleCBkZjQ5NzZjLi4xZTNmZDYxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3B0eS5jCkBAIC0xLDUgKzEsNSBAQAogLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIApAQCAtNywxMiArNywxNCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RydWN0IHB0eV9jaGFuIHsKQEAgLTI3LDEyICsyOSwxNCBAQAogewogCXN0cnVjdCBwdHlfY2hhbiAqZGF0YTsKIAotCWRhdGEgPSB1bV9rbWFsbG9jKHNpemVvZigqZGF0YSkpOwotCWlmKGRhdGEgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIFVNX0dGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCiAJKmRhdGEgPSAoKHN0cnVjdCBwdHlfY2hhbikgeyAuYW5ub3VuY2UgIAk9IG9wdHMtPmFubm91bmNlLCAKIAkJCQkgICAgIC5kZXYgIAkJPSBkZXZpY2UsCiAJCQkJICAgICAucmF3ICAJCT0gb3B0cy0+cmF3IH0pOwotCXJldHVybihkYXRhKTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogc3RhdGljIGludCBwdHNfb3BlbihpbnQgaW5wdXQsIGludCBvdXRwdXQsIGludCBwcmltYXJ5LCB2b2lkICpkLApAQCAtNDMsMzEgKzQ3LDM1IEBACiAJaW50IGZkLCBlcnI7CiAKIAlmZCA9IGdldF9wdHkoKTsKLQlpZihmZCA8IDApeworCWlmIChmZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoIm9wZW5fcHRzIDogRmFpbGVkIHRvIG9wZW4gcHRzXG4iKTsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJvcGVuX3B0cyA6IEZhaWxlZCB0byBvcGVuIHB0c1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmKGRhdGEtPnJhdyl7CisKKwlpZiAoZGF0YS0+cmF3KSB7CiAJCUNBVENIX0VJTlRSKGVyciA9IHRjZ2V0YXR0cihmZCwgJmRhdGEtPnR0KSk7Ci0JCWlmKGVycikKLQkJCXJldHVybihlcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQllcnIgPSByYXcoZmQpOwotCQlpZihlcnIpCi0JCQlyZXR1cm4oZXJyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJZGV2ID0gcHRzbmFtZShmZCk7CiAJc3ByaW50ZihkYXRhLT5kZXZfbmFtZSwgIiVzIiwgZGV2KTsKIAkqZGV2X291dCA9IGRhdGEtPmRldl9uYW1lOworCiAJaWYgKGRhdGEtPmFubm91bmNlKQogCQkoKmRhdGEtPmFubm91bmNlKShkZXYsIGRhdGEtPmRldik7Ci0JcmV0dXJuKGZkKTsKKworCXJldHVybiBmZDsKIH0KIAogc3RhdGljIGludCBnZXRtYXN0ZXIoY2hhciAqbGluZSkKIHsKKwlzdHJ1Y3Qgc3RhdCBidWY7CiAJY2hhciAqcHR5LCAqYmFuaywgKmNwOwogCWludCBtYXN0ZXIsIGVycjsKIApAQCAtNzUsMjQgKzgzLDI5IEBACiAJZm9yIChiYW5rID0gInBxcnMiOyAqYmFuazsgYmFuaysrKSB7CiAJCWxpbmVbc3RybGVuKCIvZGV2L3B0eSIpXSA9ICpiYW5rOwogCQkqcHR5ID0gJzAnOwotCQlpZiAob3Nfc3RhdF9maWxlKGxpbmUsIE5VTEwpIDwgMCkKKwkJLyogRGlkIHdlIGhpdCB0aGUgZW5kID8gKi8KKwkJaWYgKChzdGF0KGxpbmUsICZidWYpIDwgMCkgJiYgKGVycm5vID09IEVOT0VOVCkpCiAJCQlicmVhazsKKwogCQlmb3IgKGNwID0gIjAxMjM0NTY3ODlhYmNkZWYiOyAqY3A7IGNwKyspIHsKIAkJCSpwdHkgPSAqY3A7Ci0JCQltYXN0ZXIgPSBvc19vcGVuX2ZpbGUobGluZSwgb2ZfcmR3cihPUEVORkxBR1MoKSksIDApOworCQkJbWFzdGVyID0gb3BlbihsaW5lLCBPX1JEV1IpOwogCQkJaWYgKG1hc3RlciA+PSAwKSB7CiAJCQkJY2hhciAqdHAgPSAmbGluZVtzdHJsZW4oIi9kZXYvIildOwogCiAJCQkJLyogdmVyaWZ5IHNsYXZlIHNpZGUgaXMgdXNhYmxlICovCiAJCQkJKnRwID0gJ3QnOwotCQkJCWVyciA9IG9zX2FjY2VzcyhsaW5lLCBPU19BQ0NfUldfT0spOworCQkJCWVyciA9IGFjY2VzcyhsaW5lLCBSX09LIHwgV19PSyk7CiAJCQkJKnRwID0gJ3AnOwotCQkJCWlmKGVyciA9PSAwKSByZXR1cm4obWFzdGVyKTsKLQkJCQkodm9pZCkgb3NfY2xvc2VfZmlsZShtYXN0ZXIpOworCQkJCWlmKCFlcnIpCisJCQkJCXJldHVybiBtYXN0ZXI7CisJCQkJY2xvc2UobWFzdGVyKTsKIAkJCX0KIAkJfQogCX0KLQlyZXR1cm4oLTEpOworCisJcHJpbnRrKFVNX0tFUk5fRVJSICJnZXRtYXN0ZXIgLSBubyB1c2FibGUgaG9zdCBwdHkgZGV2aWNlc1xuIik7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIHN0YXRpYyBpbnQgcHR5X29wZW4oaW50IGlucHV0LCBpbnQgb3V0cHV0LCBpbnQgcHJpbWFyeSwgdm9pZCAqZCwKQEAgLTEwMywyMCArMTE2LDIyIEBACiAJY2hhciBkZXZbc2l6ZW9mKCIvZGV2L3B0eXh4XDAiKV0gPSAiL2Rldi9wdHl4eCI7CiAKIAlmZCA9IGdldG1hc3RlcihkZXYpOwotCWlmKGZkIDwgMCkKLQkJcmV0dXJuKC1lcnJubyk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOwogCiAJaWYoZGF0YS0+cmF3KXsKIAkJZXJyID0gcmF3KGZkKTsKLQkJaWYoZXJyKQotCQkJcmV0dXJuKGVycik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAkKLQlpZihkYXRhLT5hbm5vdW5jZSkgKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOworCWlmIChkYXRhLT5hbm5vdW5jZSkKKwkJKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOwogCiAJc3ByaW50ZihkYXRhLT5kZXZfbmFtZSwgIiVzIiwgZGV2KTsKIAkqZGV2X291dCA9IGRhdGEtPmRldl9uYW1lOwotCXJldHVybihmZCk7CisKKwlyZXR1cm4gZmQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBjaGFuX29wcyBwdHlfb3BzID0gewpAQCAtMTQ0LDE0ICsxNTksMyBAQAogCS5mcmVlCQk9IGdlbmVyaWNfZnJlZSwKIAkud2luY2gJCT0gMCwKIH07Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKaW5kZXggNzhmMGU1MS4uYzBiNzNjMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwpAQCAtODUsMTMgKzg1LDEzIEBACiAJcGVfZGF0YS5zdGRpbiA9IGZkOwogCXBlX2RhdGEuc3Rkb3V0ID0gZmRzWzFdOwogCXBlX2RhdGEuY2xvc2VfbWUgPSBmZHNbMF07Ci0JZXJyID0gcnVuX2hlbHBlcihzbGlwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndiwgTlVMTCk7CisJZXJyID0gcnVuX2hlbHBlcihzbGlwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndik7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfY2xvc2U7CiAJcGlkID0gZXJyOwogCiAJb3V0cHV0X2xlbiA9IFVNX0tFUk5fUEFHRV9TSVpFOwotCW91dHB1dCA9IHVtX2ttYWxsb2Mob3V0cHV0X2xlbik7CisJb3V0cHV0ID0ga21hbGxvYyhvdXRwdXRfbGVuLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCl7CiAJCXByaW50aygic2xpcF90cmFtcCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIAkJb3Nfa2lsbF9wcm9jZXNzKHBpZCwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYwppbmRleCAzOWY4ODlmLi4wZTQ2MmY2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF91c2VyLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogCXBlX2RhdGEuc3RkaW4gPSBmZDsKIAlwZV9kYXRhLnN0ZG91dCA9IGZkOwotCXBpZCA9IHJ1bl9oZWxwZXIoc2xpcnBfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2LCBOVUxMKTsKKwlwaWQgPSBydW5faGVscGVyKHNsaXJwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndik7CiAKIAlyZXR1cm4ocGlkKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zc2wuYyBiL2FyY2gvdW0vZHJpdmVycy9zc2wuYwppbmRleCBmZDA5YWQ5Li44NzVkNjBkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NzbC5jCkBAIC00Miw4ICs0Miw2IEBACiAJLmFubm91bmNlIAk9IHNzbF9hbm5vdW5jZSwKIAkueHRlcm1fdGl0bGUJPSAiU2VyaWFsIExpbmUgIyVkIiwKIAkucmF3CQk9IDEsCi0JLnRyYW1wX3N0YWNrIAk9IDAsCi0JLmluX2tlcm5lbCAJPSAxLAogfTsKIAogc3RhdGljIGludCBzc2xfY29uZmlnKGNoYXIgKnN0ciwgY2hhciAqKmVycm9yX291dCk7CkBAIC05OSw3ICs5NywxMyBAQAogCiBzdGF0aWMgaW50IHNzbF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXJldHVybiBsaW5lX29wZW4oc2VyaWFsX2xpbmVzLCB0dHkpOworCWludCBlcnIgPSBsaW5lX29wZW4oc2VyaWFsX2xpbmVzLCB0dHkpOworCisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gb3BlbiBzZXJpYWwgbGluZSAlZCwgZXJyID0gJWRcbiIsCisJCSAgICAgICB0dHktPmluZGV4LCBlcnIpOworCisJcmV0dXJuIGVycjsKIH0KIAogI2lmIDAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMgYi9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCmluZGV4IDJiYjQxOTMuLjY1NjAzNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYwpAQCAtNDYsOCArNDYsNiBAQAogCS5hbm5vdW5jZSAJPSBzdGRpb19hbm5vdW5jZSwKIAkueHRlcm1fdGl0bGUJPSAiVmlydHVhbCBDb25zb2xlICMlZCIsCiAJLnJhdwkJPSAxLAotCS50cmFtcF9zdGFjayAJPSAwLAotCS5pbl9rZXJuZWwgCT0gMSwKIH07CiAKIHN0YXRpYyBpbnQgY29uX2NvbmZpZyhjaGFyICpzdHIsIGNoYXIgKiplcnJvcl9vdXQpOwpAQCAtMTAxLDcgKzk5LDEyIEBACiAKIHN0YXRpYyBpbnQgY29uX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JcmV0dXJuIGxpbmVfb3Blbih2dHMsIHR0eSk7CisJaW50IGVyciA9IGxpbmVfb3Blbih2dHMsIHR0eSk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gb3BlbiBjb25zb2xlICVkLCBlcnIgPSAlZFxuIiwKKwkJICAgICAgIHR0eS0+aW5kZXgsIGVycik7CisKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBTZXQgaW4gYW4gaW5pdGNhbGwsIGNoZWNrZWQgaW4gYW4gZXhpdGNhbGwgKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy90dHkuYyBiL2FyY2gvdW0vZHJpdmVycy90dHkuYwppbmRleCBjMDdkMGQ1Li5hOWY4N2UxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3R0eS5jCkBAIC0yOSw3ICsyOSw3IEBACiAJfQogCXN0cisrOwogCi0JZGF0YSA9IHVtX2ttYWxsb2Moc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAkqZGF0YSA9ICgoc3RydWN0IHR0eV9jaGFuKSB7IC5kZXYgCT0gc3RyLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwppbmRleCAyZTA5ZjE2Li5mYzI3ZjZjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwpAQCAtNzEyLDYgKzcxMiw4IEBACiAJdWJkX2Rldi0+cXVldWUtPnF1ZXVlZGF0YSA9IHViZF9kZXY7CiAKIAlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHViZF9kZXYtPnF1ZXVlLCBNQVhfU0cpOworCWlmKHViZF9kZXYtPmNvdy5maWxlICE9IE5VTEwpCisJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyh1YmRfZGV2LT5xdWV1ZSwgOCAqIHNpemVvZihsb25nKSk7CiAJZXJyID0gdWJkX2Rpc2tfcmVnaXN0ZXIoTUFKT1JfTlIsIHViZF9kZXYtPnNpemUsIG4sICZ1YmRfZ2VuZGlza1tuXSk7CiAJaWYoZXJyKXsKIAkJKmVycm9yX291dCA9ICJGYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIjsKQEAgLTEwODMsNyArMTA4NSw3IEBACiB7CiAJc3RydWN0IGlvX3RocmVhZF9yZXEgKmlvX3JlcTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwotCWludCBuOworCWludCBuLCBsYXN0X3NlY3RvcnM7CiAKIAl3aGlsZSgxKXsKIAkJc3RydWN0IHViZCAqZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtMTA5OSw5ICsxMTAxLDExIEBACiAJCX0KIAogCQlyZXEgPSBkZXYtPnJlcXVlc3Q7CisJCWxhc3Rfc2VjdG9ycyA9IDA7CiAJCXdoaWxlKGRldi0+c3RhcnRfc2cgPCBkZXYtPmVuZF9zZyl7CiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gJmRldi0+c2dbZGV2LT5zdGFydF9zZ107CiAKKwkJCXJlcS0+c2VjdG9yICs9IGxhc3Rfc2VjdG9yczsKIAkJCWlvX3JlcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxKSwKIAkJCQkJIEdGUF9BVE9NSUMpOwogCQkJaWYoaW9fcmVxID09IE5VTEwpewpAQCAtMTExMyw2ICsxMTE3LDcgQEAKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVxLT5zZWN0b3IgPDwgOSwKIAkJCQkJc2ctPm9mZnNldCwgc2ctPmxlbmd0aCwgc2ctPnBhZ2UpOwogCisJCQlsYXN0X3NlY3RvcnMgPSBzZy0+bGVuZ3RoID4+IDk7CiAJCQluID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZpb19yZXEsCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxICopKTsKIAkJCWlmKG4gIT0gc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxICopKXsKQEAgLTExMjQsNyArMTEyOSw2IEBACiAJCQkJcmV0dXJuOwogCQkJfQogCi0JCQlyZXEtPnNlY3RvciArPSBzZy0+bGVuZ3RoID4+IDk7CiAJCQlkZXYtPnN0YXJ0X3NnKys7CiAJCX0KIAkJZGV2LT5lbmRfc2cgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYwppbmRleCA0NzA3YjNmLi40MWQyNTRiIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYwpAQCAtNDMsNiArNDMsMTIgQEAKIAlrZXJuZWxfZmQgPSBmZHNbMF07CiAJKmZkX291dCA9IGZkc1sxXTsKIAorCWVyciA9IG9zX3NldF9mZF9ibG9jaygqZmRfb3V0LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50aygic3RhcnRfaW9fdGhyZWFkIC0gZmFpbGVkIHRvIHNldCBub25ibG9ja2luZyBJL08uXG4iKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCiAJcGlkID0gY2xvbmUoaW9fdGhyZWFkLCAodm9pZCAqKSBzcCwgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsCiAJCSAgICBOVUxMKTsKIAlpZihwaWQgPCAwKXsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy94dGVybS5jIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKaW5kZXggNTcxYzJiMy4uZmQ4MTdlNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKQEAgLTEsMjIgKzEsMjAgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCi0jaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAiaW5pdC5oIgorI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ4dGVybS5oIgorI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAKIHN0cnVjdCB4dGVybV9jaGFuIHsKIAlpbnQgcGlkOwpAQCAtMjUsMjUgKzIzLDIxIEBACiAJaW50IGRldmljZTsKIAlpbnQgcmF3OwogCXN0cnVjdCB0ZXJtaW9zIHR0OwotCXVuc2lnbmVkIGxvbmcgc3RhY2s7Ci0JaW50IGRpcmVjdF9yY3Y7CiB9OwogCi0vKiBOb3Qgc3RhdGljIGJlY2F1c2UgaXQncyBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIHR0IG1vZGUgZ2RiIGNvZGUgKi8KLXZvaWQgKnh0ZXJtX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQorc3RhdGljIHZvaWQgKnh0ZXJtX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQogewogCXN0cnVjdCB4dGVybV9jaGFuICpkYXRhOwogCiAJZGF0YSA9IG1hbGxvYyhzaXplb2YoKmRhdGEpKTsKLQlpZihkYXRhID09IE5VTEwpIHJldHVybihOVUxMKTsKLQkqZGF0YSA9ICgoc3RydWN0IHh0ZXJtX2NoYW4pIHsgLnBpZCAJCT0gLTEsIAorCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCSpkYXRhID0gKChzdHJ1Y3QgeHRlcm1fY2hhbikgeyAucGlkIAkJPSAtMSwKIAkJCQkgICAgICAgLmhlbHBlcl9waWQgCT0gLTEsCi0JCQkJICAgICAgIC5kZXZpY2UgCQk9IGRldmljZSwgCisJCQkJICAgICAgIC5kZXZpY2UgCQk9IGRldmljZSwKIAkJCQkgICAgICAgLnRpdGxlIAkJPSBvcHRzLT54dGVybV90aXRsZSwKLQkJCQkgICAgICAgLnJhdyAgCQk9IG9wdHMtPnJhdywKLQkJCQkgICAgICAgLnN0YWNrIAkJPSBvcHRzLT50cmFtcF9zdGFjaywKLQkJCQkgICAgICAgLmRpcmVjdF9yY3YgCT0gIW9wdHMtPmluX2tlcm5lbCB9ICk7Ci0JcmV0dXJuKGRhdGEpOworCQkJCSAgICAgICAucmF3ICAJCT0gb3B0cy0+cmF3IH0gKTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogLyogT25seSBjaGFuZ2VkIGJ5IHh0ZXJtX3NldHVwLCB3aGljaCBpcyBhIHNldHVwICovCkBAIC01NywxNiArNTEsMjIgQEAKIAl0ZXJtaW5hbF9lbXVsYXRvciA9IGxpbmU7CiAKIAlsaW5lID0gc3RyY2hyKGxpbmUsICcsJyk7Ci0JaWYobGluZSA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKGxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKIAkqbGluZSsrID0gJ1wwJzsKLQlpZigqbGluZSkgdGl0bGVfc3dpdGNoID0gbGluZTsKKwlpZiAoKmxpbmUpCisJCXRpdGxlX3N3aXRjaCA9IGxpbmU7CiAKIAlsaW5lID0gc3RyY2hyKGxpbmUsICcsJyk7Ci0JaWYobGluZSA9PSBOVUxMKSByZXR1cm4oMCk7Ci0JKmxpbmUrKyA9ICdcMCc7Ci0JaWYoKmxpbmUpIGV4ZWNfc3dpdGNoID0gbGluZTsKKwlpZiAobGluZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAotCXJldHVybigwKTsKKwkqbGluZSsrID0gJ1wwJzsKKwlpZiAoKmxpbmUpCisJCWV4ZWNfc3dpdGNoID0gbGluZTsKKworCXJldHVybiAwOwogfQogCiBfX3VtbF9zZXR1cCgieHRlcm09IiwgeHRlcm1fc2V0dXAsCkBAIC04MiwxMDcgKzgyLDEyOCBAQAogIiAgICBhcmUgJ3h0ZXJtPWdub21lLXRlcm1pbmFsLC10LC14Jy5cblxuIgogKTsKIAotLyogWFhYIFRoaXMgYmFkbHkgbmVlZHMgc29tZSBjbGVhbmluZyB1cCBpbiB0aGUgZXJyb3IgcGF0aHMKLSAqIE5vdCBzdGF0aWMgYmVjYXVzZSBpdCdzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgdHQgbW9kZSBnZGIgY29kZQotICovCi1pbnQgeHRlcm1fb3BlbihpbnQgaW5wdXQsIGludCBvdXRwdXQsIGludCBwcmltYXJ5LCB2b2lkICpkLAorc3RhdGljIGludCB4dGVybV9vcGVuKGludCBpbnB1dCwgaW50IG91dHB1dCwgaW50IHByaW1hcnksIHZvaWQgKmQsCiAJCSAgICAgIGNoYXIgKipkZXZfb3V0KQogewogCXN0cnVjdCB4dGVybV9jaGFuICpkYXRhID0gZDsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOwogCWludCBwaWQsIGZkLCBuZXcsIGVycjsKIAljaGFyIHRpdGxlWzI1Nl0sIGZpbGVbXSA9ICIvdG1wL3h0ZXJtLXBpcGVYWFhYWFgiOwotCWNoYXIgKmFyZ3ZbXSA9IHsgdGVybWluYWxfZW11bGF0b3IsIHRpdGxlX3N3aXRjaCwgdGl0bGUsIGV4ZWNfc3dpdGNoLCAKKwljaGFyICphcmd2W10gPSB7IHRlcm1pbmFsX2VtdWxhdG9yLCB0aXRsZV9zd2l0Y2gsIHRpdGxlLCBleGVjX3N3aXRjaCwKIAkJCSAiL3Vzci9saWIvdW1sL3BvcnQtaGVscGVyIiwgIi11bWwtc29ja2V0IiwKIAkJCSBmaWxlLCBOVUxMIH07CiAKLQlpZihvc19hY2Nlc3MoYXJndls0XSwgT1NfQUNDX1hfT0spIDwgMCkKKwlpZiAoYWNjZXNzKGFyZ3ZbNF0sIFhfT0spIDwgMCkKIAkJYXJndls0XSA9ICJwb3J0LWhlbHBlciI7CiAKIAkvKiBDaGVjayB0aGF0IERJU1BMQVkgaXMgc2V0LCB0aGlzIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSB4dGVybQogCSAqIHdpbGwgd29yayBidXQgdy9vIGl0IHdlIGNhbiBiZSBwcmV0dHkgc3VyZSBpdCB3b24ndC4gKi8KLQlpZiAoIWdldGVudigiRElTUExBWSIpKSB7Ci0JCXByaW50aygieHRlcm1fb3BlbjogJERJU1BMQVkgbm90IHNldC5cbiIpOworCWlmIChnZXRlbnYoIkRJU1BMQVkiKSA9PSBOVUxMKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbjogJERJU1BMQVkgbm90IHNldC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwkvKgorCSAqIFRoaXMgYnVzaW5lc3Mgb2YgZ2V0dGluZyBhIGRlc2NyaXB0b3IgdG8gYSB0ZW1wIGZpbGUsCisJICogZGVsZXRpbmcgdGhlIGZpbGUgYW5kIGNsb3NpbmcgdGhlIGRlc2NyaXB0b3IgaXMganVzdCB0byBnZXQKKwkgKiBhIGtub3duLXVudXNlZCBuYW1lIGZvciB0aGUgVW5peCBzb2NrZXQgdGhhdCB3ZSByZWFsbHkKKwkgKiB3YW50LgorCSAqLwogCWZkID0gbWtzdGVtcChmaWxlKTsKLQlpZihmZCA8IDApeworCWlmIChmZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoInh0ZXJtX29wZW4gOiBta3N0ZW1wIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiBta3N0ZW1wIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKwkJICAgICAgIGVycm5vKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZih1bmxpbmsoZmlsZSkpeworCWlmICh1bmxpbmsoZmlsZSkpIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoInh0ZXJtX29wZW4gOiB1bmxpbmsgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IHVubGluayBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCSAgICAgICBlcnJubyk7CiAJCXJldHVybiBlcnI7CiAJfQotCW9zX2Nsb3NlX2ZpbGUoZmQpOworCWNsb3NlKGZkKTsKIAogCWZkID0gb3NfY3JlYXRlX3VuaXhfc29ja2V0KGZpbGUsIHNpemVvZihmaWxlKSwgMSk7Ci0JaWYoZmQgPCAwKXsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogY3JlYXRlX3VuaXhfc29ja2V0IGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgCi0JCSAgICAgICAtZmQpOwotCQlyZXR1cm4oZmQpOworCWlmIChmZCA8IDApIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogY3JlYXRlX3VuaXhfc29ja2V0IGZhaWxlZCwgIgorCQkgICAgICAgImVycm5vID0gJWRcbiIsIC1mZCk7CisJCXJldHVybiBmZDsKIAl9CiAKIAlzcHJpbnRmKHRpdGxlLCBkYXRhLT50aXRsZSwgZGF0YS0+ZGV2aWNlKTsKLQlzdGFjayA9IGRhdGEtPnN0YWNrOwotCXBpZCA9IHJ1bl9oZWxwZXIoTlVMTCwgTlVMTCwgYXJndiwgJnN0YWNrKTsKLQlpZihwaWQgPCAwKXsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogcnVuX2hlbHBlciBmYWlsZWQsIGVycm5vID0gJWRcbiIsIC1waWQpOwotCQlyZXR1cm4ocGlkKTsKKwlwaWQgPSBydW5faGVscGVyKE5VTEwsIE5VTEwsIGFyZ3YpOworCWlmIChwaWQgPCAwKSB7CisJCWVyciA9IHBpZDsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogcnVuX2hlbHBlciBmYWlsZWQsICIKKwkJICAgICAgICJlcnJubyA9ICVkXG4iLCAtZXJyKTsKKwkJZ290byBvdXRfY2xvc2UxOwogCX0KIAotCWlmIChkYXRhLT5kaXJlY3RfcmN2KSB7Ci0JCW5ldyA9IG9zX3Jjdl9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOwotCX0gZWxzZSB7Ci0JCWVyciA9IG9zX3NldF9mZF9ibG9jayhmZCwgMCk7Ci0JCWlmKGVyciA8IDApewotCQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogZmFpbGVkIHRvIHNldCBkZXNjcmlwdG9yICIKLQkJCSAgICAgICAibm9uLWJsb2NraW5nLCBlcnIgPSAlZFxuIiwgLWVycik7Ci0JCQlyZXR1cm4oZXJyKTsKLQkJfQotCQluZXcgPSB4dGVybV9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOworCWVyciA9IG9zX3NldF9mZF9ibG9jayhmZCwgMCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogZmFpbGVkIHRvIHNldCBkZXNjcmlwdG9yICIKKwkJICAgICAgICJub24tYmxvY2tpbmcsIGVyciA9ICVkXG4iLCAtZXJyKTsKKwkJZ290byBvdXRfa2lsbDsKIAl9Ci0JaWYobmV3IDwgMCl7Ci0JCXByaW50aygieHRlcm1fb3BlbiA6IG9zX3Jjdl9mZCBmYWlsZWQsIGVyciA9ICVkXG4iLCAtbmV3KTsKLQkJZ290byBvdXQ7CisKKwluZXcgPSB4dGVybV9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOworCWlmIChuZXcgPCAwKSB7CisJCWVyciA9IG5ldzsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogb3NfcmN2X2ZkIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCSAgICAgICAtZXJyKTsKKwkJZ290byBvdXRfa2lsbDsKKwl9CisKKwllcnIgPSBvc19zZXRfZmRfYmxvY2sobmV3LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IGZhaWxlZCB0byBzZXQgeHRlcm0gIgorCQkgICAgICAgImRlc2NyaXB0b3Igbm9uLWJsb2NraW5nLCBlcnIgPSAlZFxuIiwgLWVycik7CisJCWdvdG8gb3V0X2Nsb3NlMjsKIAl9CiAKIAlDQVRDSF9FSU5UUihlcnIgPSB0Y2dldGF0dHIobmV3LCAmZGF0YS0+dHQpKTsKLQlpZihlcnIpeworCWlmIChlcnIpIHsKIAkJbmV3ID0gZXJyOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfY2xvc2UyOwogCX0KIAotCWlmKGRhdGEtPnJhdyl7CisJaWYgKGRhdGEtPnJhdykgewogCQllcnIgPSByYXcobmV3KTsKLQkJaWYoZXJyKXsKKwkJaWYgKGVycikgewogCQkJbmV3ID0gZXJyOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9jbG9zZTI7CiAJCX0KIAl9CiAKKwl1bmxpbmsoZmlsZSk7CiAJZGF0YS0+cGlkID0gcGlkOwogCSpkZXZfb3V0ID0gTlVMTDsKLSBvdXQ6Ci0JdW5saW5rKGZpbGUpOwotCXJldHVybihuZXcpOworCisJcmV0dXJuIG5ldzsKKworIG91dF9jbG9zZTI6CisJY2xvc2UobmV3KTsKKyBvdXRfa2lsbDoKKwlvc19raWxsX3Byb2Nlc3MocGlkLCAxKTsKKyBvdXRfY2xvc2UxOgorCWNsb3NlKGZkKTsKKworCXJldHVybiBlcnI7CiB9CiAKLS8qIE5vdCBzdGF0aWMgYmVjYXVzZSBpdCdzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgdHQgbW9kZSBnZGIgY29kZSAqLwotdm9pZCB4dGVybV9jbG9zZShpbnQgZmQsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCB4dGVybV9jbG9zZShpbnQgZmQsIHZvaWQgKmQpCiB7CiAJc3RydWN0IHh0ZXJtX2NoYW4gKmRhdGEgPSBkOwogCQotCWlmKGRhdGEtPnBpZCAhPSAtMSkgCisJaWYgKGRhdGEtPnBpZCAhPSAtMSkKIAkJb3Nfa2lsbF9wcm9jZXNzKGRhdGEtPnBpZCwgMSk7CiAJZGF0YS0+cGlkID0gLTE7Ci0JaWYoZGF0YS0+aGVscGVyX3BpZCAhPSAtMSkgCisKKwlpZiAoZGF0YS0+aGVscGVyX3BpZCAhPSAtMSkKIAkJb3Nfa2lsbF9wcm9jZXNzKGRhdGEtPmhlbHBlcl9waWQsIDApOwogCWRhdGEtPmhlbHBlcl9waWQgPSAtMTsKKwogCW9zX2Nsb3NlX2ZpbGUoZmQpOwogfQogCkBAIC0yMDMsMTQgKzIyNCwzIEBACiAJLmZyZWUJCT0geHRlcm1fZnJlZSwKIAkud2luY2gJCT0gMSwKIH07Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMveHRlcm1fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtX2tlcm4uYwppbmRleCBhNGNlNzA1Li5iNjQ2YmNjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMveHRlcm1fa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy94dGVybV9rZXJuLmMKQEAgLTEsMTggKzEsMTQgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlICJsaW51eC9lcnJuby5oIgotI2luY2x1ZGUgImxpbnV4L3NsYWIuaCIKLSNpbmNsdWRlICJsaW51eC9zaWduYWwuaCIKLSNpbmNsdWRlICJsaW51eC9pbnRlcnJ1cHQuaCIKLSNpbmNsdWRlICJhc20vaXJxLmgiCi0jaW5jbHVkZSAiaXJxX3VzZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlICJpcnFfa2Vybi5oIgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCi0jaW5jbHVkZSAieHRlcm0uaCIKIAogc3RydWN0IHh0ZXJtX3dhaXQgewogCXN0cnVjdCBjb21wbGV0aW9uIHJlYWR5OwpAQCAtMjcsMTIgKzIzLDEzIEBACiAJaW50IGZkOwogCiAJZmQgPSBvc19yY3ZfZmQoeHRlcm0tPmZkLCAmeHRlcm0tPnBpZCk7Ci0JaWYoZmQgPT0gLUVBR0FJTikKLQkJcmV0dXJuKElSUV9OT05FKTsKKwlpZiAoZmQgPT0gLUVBR0FJTikKKwkJcmV0dXJuIElSUV9OT05FOwogCiAJeHRlcm0tPm5ld19mZCA9IGZkOwogCWNvbXBsZXRlKCZ4dGVybS0+cmVhZHkpOwotCXJldHVybihJUlFfSEFORExFRCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIGludCB4dGVybV9mZChpbnQgc29ja2V0LCBpbnQgKnBpZF9vdXQpCkBAIC00MSwyMiArMzgsMjEgQEAKIAlpbnQgZXJyLCByZXQ7CiAKIAlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZihkYXRhID09IE5VTEwpeworCWlmIChkYXRhID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ4dGVybV9mZCA6IGZhaWxlZCB0byBhbGxvY2F0ZSB4dGVybV93YWl0XG4iKTsKLQkJcmV0dXJuKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAkvKiBUaGlzIGlzIGEgbG9ja2VkIHNlbWFwaG9yZS4uLiAqLwotCSpkYXRhID0gKChzdHJ1Y3QgeHRlcm1fd2FpdCkgCi0JCXsgLmZkIAkJPSBzb2NrZXQsCi0JCSAgLnBpZCAJCT0gLTEsCi0JCSAgLm5ld19mZCAJPSAtMSB9KTsKKwkqZGF0YSA9ICgoc3RydWN0IHh0ZXJtX3dhaXQpIHsgLmZkIAkJPSBzb2NrZXQsCisJCQkJICAgICAgIC5waWQgCQk9IC0xLAorCQkJCSAgICAgICAubmV3X2ZkCSAJPSAtMSB9KTsKIAlpbml0X2NvbXBsZXRpb24oJmRhdGEtPnJlYWR5KTsKIAotCWVyciA9IHVtX3JlcXVlc3RfaXJxKFhURVJNX0lSUSwgc29ja2V0LCBJUlFfUkVBRCwgeHRlcm1faW50ZXJydXB0LCAKKwllcnIgPSB1bV9yZXF1ZXN0X2lycShYVEVSTV9JUlEsIHNvY2tldCwgSVJRX1JFQUQsIHh0ZXJtX2ludGVycnVwdCwKIAkJCSAgICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAogCQkJICAgICAieHRlcm0iLCBkYXRhKTsKLQlpZiAoZXJyKXsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieHRlcm1fZmQgOiBmYWlsZWQgdG8gZ2V0IElSUSBmb3IgeHRlcm0sICIKIAkJICAgICAgICJlcnIgPSAlZFxuIiwgIGVycik7CiAJCXJldCA9IGVycjsKQEAgLTc2LDE2ICs3Miw1IEBACiAgb3V0OgogCWtmcmVlKGRhdGEpOwogCi0JcmV0dXJuKHJldCk7CisJcmV0dXJuIHJldDsKIH0KLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaAppbmRleCBjNGI0MWJiLi42MjRiNTEwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oCkBAIC00MCw3ICs0MCw3IEBACiBleHRlcm4gdm9pZCBkZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgcmVhY3RpdmF0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgaXJxKTsKIGV4dGVybiB2b2lkIGNoYW5fZW5hYmxlX3dpbmNoKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLWV4dGVybiB2b2lkIGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKTsKK2V4dGVybiBpbnQgZW5hYmxlX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUpOwogZXh0ZXJuIHZvaWQgY2xvc2VfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGRlbGF5X2ZyZWVfaXJxKTsKIGV4dGVybiBpbnQgY2hhbl93aW5kb3dfc2l6ZShzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgCiAJCQkgICAgIHVuc2lnbmVkIHNob3J0ICpyb3dzX291dCwgCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmgKaW5kZXggMzhmMTZkOC4uNWEyMjYzZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX3VzZXIuaApAQCAtMTIsOCArMTIsNiBAQAogCXZvaWQgKCpjb25zdCBhbm5vdW5jZSkoY2hhciAqZGV2X25hbWUsIGludCBkZXYpOwogCWNoYXIgKnh0ZXJtX3RpdGxlOwogCWNvbnN0IGludCByYXc7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyB0cmFtcF9zdGFjazsKLQljb25zdCBpbnQgaW5fa2VybmVsOwogfTsKIAogZW51bSBjaGFuX2luaXRfcHJpIHsgSU5JVF9TVEFUSUMsIElOSVRfQUxMLCBJTklUX09ORSB9OwpAQCAtNDQsNyArNDIsOCBAQAogCiBzdHJ1Y3QgdHR5X3N0cnVjdDsKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX3dpbmNoKGludCBmZCwgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfd2luY2hfaXJxKGludCBmZCwgaW50IHR0eV9mZCwgaW50IHBpZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLAorCQkJICAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGxvbmcgc3RhY2spOwogCiAjZGVmaW5lIF9fY2hhbm5lbF9oZWxwKGZuLCBwcmVmaXgpIFwKIF9fdW1sX2hlbHAoZm4sIHByZWZpeCAiWzAtOV0qPTxjaGFubmVsIGRlc2NyaXB0aW9uPlxuIiBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCmluZGV4IDczNzZlZTQuLjZlZWUzNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCkBAIC0yNyw2ICsyNyw5IEBACiAKIERFRklORShVTV9OUl9DUFVTLCBOUl9DUFVTKTsKIAorREVGSU5FKFVNX0dGUF9LRVJORUwsIEdGUF9LRVJORUwpOworREVGSU5FKFVNX0dGUF9BVE9NSUMsIEdGUF9BVE9NSUMpOworCiAvKiBGb3IgY3J5cHRvIGFzc2VtYmxlciBjb2RlLiAqLwogREVGSU5FKGNyeXB0b190Zm1fY3R4X29mZnNldCwgb2Zmc2V0b2Yoc3RydWN0IGNyeXB0b190Zm0sIF9fY3J0X2N0eCkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvb3MuaCBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCmluZGV4IDRkOWZiMjYuLjkzMGIyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCkBAIC0yMzksMTEgKzIzOSw5IEBACiAvKiBleGVjdnAuYyAqLwogZXh0ZXJuIGludCBleGVjdnBfbm9hbGxvYyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSk7CiAvKiBoZWxwZXIuYyAqLwotZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2LAotCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOworZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2KTsKIGV4dGVybiBpbnQgcnVuX2hlbHBlcl90aHJlYWQoaW50ICgqcHJvYykodm9pZCAqKSwgdm9pZCAqYXJnLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCwKLQkJCSAgICAgaW50IHN0YWNrX29yZGVyKTsKKwkJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOwogZXh0ZXJuIGludCBoZWxwZXJfd2FpdChpbnQgcGlkKTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmggYi9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmgKaW5kZXggZTZkN2M1YS4uMGFkMTdjYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91bV9tYWxsb2MuaApAQCAtNiwxMSArNiwxNyBAQAogI2lmbmRlZiBfX1VNX01BTExPQ19IX18KICNkZWZpbmUgX19VTV9NQUxMT0NfSF9fCiAKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jKGludCBzaXplKTsKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jX2F0b21pYyhpbnQgc2l6ZSk7CisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKKworZXh0ZXJuIHZvaWQgKl9fa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCiBleHRlcm4gdm9pZCBrZnJlZShjb25zdCB2b2lkICpwdHIpOwogCi1leHRlcm4gdm9pZCAqdW1fdm1hbGxvYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAqdm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgdmZyZWUodm9pZCAqcHRyKTsKIAogI2VuZGlmIC8qIF9fVU1fTUFMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaXJxLmMgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwppbmRleCBkYmEwNGQ4Li45ODcwZmViIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgImlycV9rZXJuLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJzaWdpby5oIgotI2luY2x1ZGUgInVtX21hbGxvYy5oIgogI2luY2x1ZGUgIm1pc2NfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwppbmRleCA4ZDJjNTQ5Li5iZmE1MmYyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSAibW9kZS5oIgogI2luY2x1ZGUgIm1vZGVfa2Vybi5oIgogI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCi0jaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIC8qIFRoaXMgaXMgYSBwZXItY3B1IGFycmF5LiAgQSBwcm9jZXNzb3Igb25seSBtb2RpZmllcyBpdHMgZW50cnkgYW5kIGl0IG9ubHkKICAqIGNhcmVzIGFib3V0IGl0cyBlbnRyeSwgc28gaXQncyBPSyBpZiBhbm90aGVyIHByb2Nlc3NvciBpcyBtb2RpZnlpbmcgaXRzCkBAIC0yNjIsMjEgKzI2MSw2IEBACiB7CiB9CiAKLXZvaWQgKnVtX2ttYWxsb2MoaW50IHNpemUpCi17Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci19Ci0KLXZvaWQgKnVtX2ttYWxsb2NfYXRvbWljKGludCBzaXplKQotewotCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotfQotCi12b2lkICp1bV92bWFsbG9jKGludCBzaXplKQotewotCXJldHVybiB2bWFsbG9jKHNpemUpOwotfQotCiBpbnQgX19jYW50X3NsZWVwKHZvaWQpIHsKIAlyZXR1cm4gaW5fYXRvbWljKCkgfHwgaXJxc19kaXNhYmxlZCgpIHx8IGluX2ludGVycnVwdCgpOwogCS8qIElzIGluX2ludGVycnVwdCgpIHJlYWxseSBuZWVkZWQ/ICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCmluZGV4IDYyNzc0MmQuLjY5MTZjODggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCkBAIC01MiwxNyArNTIsOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQlyZXQgPSAtRUlPOwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgcCk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAgICAgICAgIGNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC03MiwxMSArNjQsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAtRUlPOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIAotCQkJCSAgICAgIDEpICE9IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAwOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2Fpby5jIGIvYXJjaC91bS9vcy1MaW51eC9haW8uYwppbmRleCA5YmY5NDRmLi5iMTI2ZGY0IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKQEAgLTE3Nyw2ICsxNzcsNyBAQAogc3RhdGljIGludCBhaW9fcmVxX2ZkX3IgPSAtMTsKIHN0YXRpYyBpbnQgYWlvX3JlcV9mZF93ID0gLTE7CiBzdGF0aWMgaW50IGFpb19waWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFpb19zdGFjazsKIAogc3RhdGljIGludCBub3RfYWlvX3RocmVhZCh2b2lkICphcmcpCiB7CkBAIC0yMTIsNyArMjEzLDYgQEAKIAogc3RhdGljIGludCBpbml0X2Fpb18yNCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJaW50IGZkc1syXSwgZXJyOwogCiAJZXJyID0gb3NfcGlwZShmZHMsIDEsIDEpOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCWdvdG8gb3V0X2Nsb3NlX3BpcGU7CiAKIAllcnIgPSBydW5faGVscGVyX3RocmVhZChub3RfYWlvX3RocmVhZCwgTlVMTCwKLQkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJnN0YWNrLCAwKTsKKwkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJmFpb19zdGFjayk7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfY2xvc2VfcGlwZTsKIApAQCAtMjUyLDcgKzI1Miw2IEBACiAjZGVmaW5lIERFRkFVTFRfMjRfQUlPIDAKIHN0YXRpYyBpbnQgaW5pdF9haW9fMjYodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOwogCWludCBlcnI7CiAKIAlpZihpb19zZXR1cCgyNTYsICZjdHgpKXsKQEAgLTI2Myw3ICsyNjIsNyBAQAogCX0KIAogCWVyciA9IHJ1bl9oZWxwZXJfdGhyZWFkKGFpb190aHJlYWQsIE5VTEwsCi0JCQkJQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZzdGFjaywgMCk7CisJCQkJQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZhaW9fc3RhY2spOwogCWlmKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTM2NSw4ICszNjQsMTAgQEAKIAogc3RhdGljIHZvaWQgZXhpdF9haW8odm9pZCkKIHsKLQlpZihhaW9fcGlkICE9IC0xKQorCWlmIChhaW9fcGlkICE9IC0xKSB7CiAJCW9zX2tpbGxfcHJvY2VzcyhhaW9fcGlkLCAxKTsKKwkJZnJlZV9zdGFjayhhaW9fc3RhY2ssIDApOworCX0KIH0KIAogX191bWxfZXhpdGNhbGwoZXhpdF9haW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKaW5kZXggYWNiYTMwMS4uNjFkMzk1MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCkBAIC01NCw3ICs1NCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKFVNX0tFUk5fUEFHRV9TSVpFKTsKKwlvdXRwdXQgPSBrbWFsbG9jKFVNX0tFUk5fUEFHRV9TSVpFLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCkKIAkJcHJpbnRrKCJldGFwX2NoYW5nZSA6IEZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIAlyZWFkX291dHB1dChmZCwgb3V0cHV0LCBVTV9LRVJOX1BBR0VfU0laRSk7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAlwZV9kYXRhLmNvbnRyb2xfcmVtb3RlID0gY29udHJvbF9yZW1vdGU7CiAJcGVfZGF0YS5jb250cm9sX21lID0gY29udHJvbF9tZTsKIAlwZV9kYXRhLmRhdGFfbWUgPSBkYXRhX21lOwotCXBpZCA9IHJ1bl9oZWxwZXIoZXRhcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3MsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIoZXRhcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3MpOwogCiAJaWYocGlkIDwgMCkKIAkJZXJyID0gcGlkOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJZXJyID0gZXRhcF90cmFtcChwcmktPmRldl9uYW1lLCBwcmktPmdhdGVfYWRkciwgY29udHJvbF9mZHNbMF0sIAogCQkJIGNvbnRyb2xfZmRzWzFdLCBkYXRhX2Zkc1swXSwgZGF0YV9mZHNbMV0pOwogCW91dHB1dF9sZW4gPSBVTV9LRVJOX1BBR0VfU0laRTsKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKG91dHB1dF9sZW4pOworCW91dHB1dCA9IGttYWxsb2Mob3V0cHV0X2xlbiwgVU1fR0ZQX0tFUk5FTCk7CiAJcmVhZF9vdXRwdXQoY29udHJvbF9mZHNbMF0sIG91dHB1dCwgb3V0cHV0X2xlbik7CiAKIAlpZihvdXRwdXQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKaW5kZXggMTFhOTc3OS4uZjg0OGI0ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlkYXRhLnN0ZG91dCA9IHJlbW90ZTsKIAlkYXRhLmNsb3NlX21lID0gbWU7CiAKLQlwaWQgPSBydW5faGVscGVyKHR1bnRhcF9wcmVfZXhlYywgJmRhdGEsIGFyZ3YsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIodHVudGFwX3ByZV9leGVjLCAmZGF0YSwgYXJndik7CiAKIAlpZihwaWQgPCAwKQogCQlyZXR1cm4gLXBpZDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCmluZGV4IDk3YmVkMTYuLmQ4MWFmN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYwpAQCAtNDQsMTcgKzQ0LDEzIEBACiAvKiBSZXR1cm5zIGVpdGhlciB0aGUgcGlkIG9mIHRoZSBjaGlsZCBwcm9jZXNzIHdlIHJ1biBvciAtRSogb24gZmFpbHVyZS4KICAqIFhYWCBUaGUgYWxsb2Nfc3RhY2sgaGVyZSBicmVha3MgaWYgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIHRyYWNpbmcgdGhyZWFkLCBzbwogICogd2UgbmVlZCB0byByZWNlaXZlIGEgcHJlYWxsb2NhdGVkIHN0YWNrIChhIGxvY2FsIGJ1ZmZlciBpcyBvaykuICovCi1pbnQgcnVuX2hlbHBlcih2b2lkICgqcHJlX2V4ZWMpKHZvaWQgKiksIHZvaWQgKnByZV9kYXRhLCBjaGFyICoqYXJndiwKLQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQoraW50IHJ1bl9oZWxwZXIodm9pZCAoKnByZV9leGVjKSh2b2lkICopLCB2b2lkICpwcmVfZGF0YSwgY2hhciAqKmFyZ3YpCiB7CiAJc3RydWN0IGhlbHBlcl9kYXRhIGRhdGE7CiAJdW5zaWduZWQgbG9uZyBzdGFjaywgc3A7CiAJaW50IHBpZCwgZmRzWzJdLCByZXQsIG47CiAKLQlpZiAoKHN0YWNrX291dCAhPSBOVUxMKSAmJiAoKnN0YWNrX291dCAhPSAwKSkKLQkJc3RhY2sgPSAqc3RhY2tfb3V0OwotCWVsc2UKLQkJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CisJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CiAJaWYgKHN0YWNrID09IDApCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC03Niw4ICs3Miw4IEBACiAJZGF0YS5wcmVfZGF0YSA9IHByZV9kYXRhOwogCWRhdGEuYXJndiA9IGFyZ3Y7CiAJZGF0YS5mZCA9IGZkc1sxXTsKLQlkYXRhLmJ1ZiA9IF9fY2FudF9zbGVlcCgpID8gdW1fa21hbGxvY19hdG9taWMoUEFUSF9NQVgpIDoKLQkJCQkJdW1fa21hbGxvYyhQQVRIX01BWCk7CisJZGF0YS5idWYgPSBfX2NhbnRfc2xlZXAoKSA/IGttYWxsb2MoUEFUSF9NQVgsIFVNX0dGUF9BVE9NSUMpIDoKKwkJCQkJa21hbGxvYyhQQVRIX01BWCwgVU1fR0ZQX0tFUk5FTCk7CiAJcGlkID0gY2xvbmUoaGVscGVyX2NoaWxkLCAodm9pZCAqKSBzcCwgQ0xPTkVfVk0gfCBTSUdDSExELCAmZGF0YSk7CiAJaWYgKHBpZCA8IDApIHsKIAkJcmV0ID0gLWVycm5vOwpAQCAtMTEzLDIyICsxMDksMjEgQEAKIAkJY2xvc2UoZmRzWzFdKTsKIAljbG9zZShmZHNbMF0pOwogb3V0X2ZyZWU6Ci0JaWYgKChzdGFja19vdXQgPT0gTlVMTCkgfHwgKCpzdGFja19vdXQgPT0gMCkpCi0JCWZyZWVfc3RhY2soc3RhY2ssIDApOworCWZyZWVfc3RhY2soc3RhY2ssIDApOwogCXJldHVybiByZXQ7CiB9CiAKIGludCBydW5faGVscGVyX3RocmVhZChpbnQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGludCBmbGFncywKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0LCBpbnQgc3RhY2tfb3JkZXIpCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCkKIHsKIAl1bnNpZ25lZCBsb25nIHN0YWNrLCBzcDsKIAlpbnQgcGlkLCBzdGF0dXMsIGVycjsKIAotCXN0YWNrID0gYWxsb2Nfc3RhY2soc3RhY2tfb3JkZXIsIF9fY2FudF9zbGVlcCgpKTsKKwlzdGFjayA9IGFsbG9jX3N0YWNrKDAsIF9fY2FudF9zbGVlcCgpKTsKIAlpZiAoc3RhY2sgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcCA9IHN0YWNrICsgKFVNX0tFUk5fUEFHRV9TSVpFIDw8IHN0YWNrX29yZGVyKSAtIHNpemVvZih2b2lkICopOworCXNwID0gc3RhY2sgKyBVTV9LRVJOX1BBR0VfU0laRSAtIHNpemVvZih2b2lkICopOwogCXBpZCA9IGNsb25lKHByb2MsICh2b2lkICopIHNwLCBmbGFncyB8IFNJR0NITEQsIGFyZyk7CiAJaWYgKHBpZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwpAQCAtMTQ3LDcgKzE0Miw3IEBACiAJCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkpCiAJCQlwcmludGsoInJ1bl9oZWxwZXJfdGhyZWFkIC0gdGhyZWFkIHJldHVybmVkIHN0YXR1cyAiCiAJCQkgICAgICAgIjB4JXhcbiIsIHN0YXR1cyk7Ci0JCWZyZWVfc3RhY2soc3RhY2ssIHN0YWNrX29yZGVyKTsKKwkJZnJlZV9zdGFjayhzdGFjaywgMCk7CiAJfSBlbHNlCiAJCSpzdGFja19vdXQgPSBzdGFjazsKIAlyZXR1cm4gcGlkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9tYWluLmMgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwppbmRleCBmYjUxMGQ0Li5lODVmNDk5IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwpAQCAtMjM1LDggKzIzNSw4IEBACiAJCXJldHVybiBfX3JlYWxfbWFsbG9jKHNpemUpOwogCWVsc2UgaWYoc2l6ZSA8PSBVTV9LRVJOX1BBR0VfU0laRSkKIAkJLyogZmluZGluZyBjb250aWd1b3VzIHBhZ2VzIGNhbiBiZSBoYXJkKi8KLQkJcmV0ID0gdW1fa21hbGxvYyhzaXplKTsKLQllbHNlIHJldCA9IHVtX3ZtYWxsb2Moc2l6ZSk7CisJCXJldCA9IGttYWxsb2Moc2l6ZSwgVU1fR0ZQX0tFUk5FTCk7CisJZWxzZSByZXQgPSB2bWFsbG9jKHNpemUpOwogCiAJLyogZ2xpYmMgcGVvcGxlIGluc2lzdCB0aGF0IGlmIG1hbGxvYyBmYWlscywgZXJybm8gc2hvdWxkIGJlCiAJICogc2V0IGJ5IG1hbGxvYyBhcyB3ZWxsLiBTbyB3ZSBkby4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYyBiL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYwppbmRleCA4ZDRlMGM2Li5kYzAzZTljIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBleGl0Y2FsbC4KICAqLwogc3RhdGljIGludCB3cml0ZV9zaWdpb19waWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX3NpZ2lvX3N0YWNrOwogCiAvKiBUaGVzZSBhcnJheXMgYXJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgc2lnaW8gdGhyZWFkIGlzIHN0YXJ0ZWQsIGFuZAogICogdGhlIGRlc2NyaXB0b3JzIGNsb3NlZCBhZnRlciBpdCBpcyBraWxsZWQuICBTbywgaXQgY2FuJ3Qgc2VlIHRoZW0gY2hhbmdlLgpAQCAtMTA0LDcgKzEwNSw3IEBACiAJaWYobiA8PSBwb2xscy0+c2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQluZXcgPSB1bV9rbWFsbG9jX2F0b21pYyhuICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwluZXcgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IHBvbGxmZCksIFVNX0dGUF9BVE9NSUMpOwogCWlmKG5ldyA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZWVkX3BvbGwgOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHBvbGxmZHNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE0NCw4ICsxNDUsMTAgQEAKIAlyZXR1cm47CiAgZmFpbDoKIAkvKiBDcml0aWNhbCBzZWN0aW9uIHN0YXJ0ICovCi0JaWYod3JpdGVfc2lnaW9fcGlkICE9IC0xKQorCWlmICh3cml0ZV9zaWdpb19waWQgIT0gLTEpIHsKIAkJb3Nfa2lsbF9wcm9jZXNzKHdyaXRlX3NpZ2lvX3BpZCwgMSk7CisJCWZyZWVfc3RhY2sod3JpdGVfc2lnaW9fc3RhY2ssIDApOworCX0KIAl3cml0ZV9zaWdpb19waWQgPSAtMTsKIAljbG9zZShzaWdpb19wcml2YXRlWzBdKTsKIAljbG9zZShzaWdpb19wcml2YXRlWzFdKTsKQEAgLTIzMCw3ICsyMzMsNyBAQAogewogCXN0cnVjdCBwb2xsZmQgKnA7CiAKLQlwID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYgKHAgPT0gTlVMTCkgewogCQlwcmludGsoInNldHVwX2luaXRpYWxfcG9sbCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBwb2xsXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNDMsNyArMjQ2LDYgQEAKIAogc3RhdGljIHZvaWQgd3JpdGVfc2lnaW9fd29ya2Fyb3VuZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJc3RydWN0IHBvbGxmZCAqcDsKIAlpbnQgZXJyOwogCWludCBsX3dyaXRlX3NpZ2lvX2Zkc1syXTsKQEAgLTI5Myw3ICsyOTUsOCBAQAogCW1lbWNweShzaWdpb19wcml2YXRlLCBsX3NpZ2lvX3ByaXZhdGUsIHNpemVvZihsX3NpZ2lvX3ByaXZhdGUpKTsKIAogCXdyaXRlX3NpZ2lvX3BpZCA9IHJ1bl9oZWxwZXJfdGhyZWFkKHdyaXRlX3NpZ2lvX3RocmVhZCwgTlVMTCwKLQkJCQkJICAgIENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0sICZzdGFjaywgMCk7CisJCQkJCSAgICBDTE9ORV9GSUxFUyB8IENMT05FX1ZNLAorCQkJCQkgICAgJndyaXRlX3NpZ2lvX3N0YWNrKTsKIAogCWlmICh3cml0ZV9zaWdpb19waWQgPCAwKQogCQlnb3RvIG91dF9jbGVhcjsKQEAgLTM1NiwxMCArMzU5LDEyIEBACiAKIHN0YXRpYyB2b2lkIHNpZ2lvX2NsZWFudXAodm9pZCkKIHsKLQlpZih3cml0ZV9zaWdpb19waWQgIT0gLTEpewotCQlvc19raWxsX3Byb2Nlc3Mod3JpdGVfc2lnaW9fcGlkLCAxKTsKLQkJd3JpdGVfc2lnaW9fcGlkID0gLTE7Ci0JfQorCWlmICh3cml0ZV9zaWdpb19waWQgPT0gLTEpCisJCXJldHVybjsKKworCW9zX2tpbGxfcHJvY2Vzcyh3cml0ZV9zaWdpb19waWQsIDEpOworCWZyZWVfc3RhY2sod3JpdGVfc2lnaW9fc3RhY2ssIDApOworCXdyaXRlX3NpZ2lvX3BpZCA9IC0xOwogfQogCiBfX3VtbF9leGl0Y2FsbChzaWdpb19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCmluZGV4IDQ2YzAwY2MuLmJhOWFmOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYwpAQCAtNDEsNyArNDEsNyBAQAogCWlmKHBpZCAhPSBvc19nZXRwZ3JwKCkpCiAJCXJldHVybigwKTsKIAotCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCBkYXRhKTsKKwlyZWdpc3Rlcl93aW5jaF9pcnEoLTEsIGZkLCAtMSwgZGF0YSwgMCk7CiAJcmV0dXJuKDEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jIGIvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYwppbmRleCAzZjMzMTY1Li40MTliMmQ1IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMKQEAgLTUsNyArNSw4IEBACiAgKiBzbyBJICptdXN0KiBkZWNsYXJlIGdvb2QgcHJvdG90eXBlcyBmb3IgdGhlbSBhbmQgdGhlbiBFWFBPUlQgdGhlbS4KICAqIFRoZSBrZXJuZWwgY29kZSB1c2VzIHRoZSBtYWNybyBkZWZpbmVkIGJ5IGluY2x1ZGUvbGludXgvc3RyaW5nLmgsCiAgKiBzbyBJIHVuZGVmIG1hY3JvczsgdGhlIHVzZXJzcGFjZSBjb2RlIGRvZXMgbm90IGluY2x1ZGUgdGhhdCBhbmQgSQotICogYWRkIGFuIEVYUE9SVCBmb3IgdGhlIGdsaWJjIG9uZS4qLworICogYWRkIGFuIEVYUE9SVCBmb3IgdGhlIGdsaWJjIG9uZS4KKyAqLwogCiAjdW5kZWYgc3RybGVuCiAjdW5kZWYgc3Ryc3RyCkBAIC02MSwxMiArNjIsMTggQEAKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX194c3RhdCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKF9fbHhzdGF0KTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX19seHN0YXQ2NCk7CitFWFBPUlRfU1lNQk9MX1BST1RPKF9fZnhzdGF0NjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhsc2Vlayk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKGxzZWVrNjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhjaG93bik7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZjaG93bik7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHRydW5jYXRlKTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8oZnRydW5jYXRlNjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyh1dGltZSk7CitFWFBPUlRfU1lNQk9MX1BST1RPKHV0aW1lcyk7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZ1dGltZXMpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhjaG1vZCk7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZjaG1vZCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHJlbmFtZSk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKF9feG1rbm9kKTsKIApAQCAtMTAyLDE0ICsxMDksMyBAQAogCiBleHRlcm4gbG9uZyBfX2d1YXJkIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIEVYUE9SVF9TWU1CT0woX19ndWFyZCk7Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhOWIwOTM0Li5hNDU4YWM5IDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTExNywyNCArMTE3LDE2IEBACiAJaW50IHJ2YWw7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKLQkJdW5zaWduZWQgbG9uZyB2YWwsIGNvcGllZDsKKwkJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdmFsLCBzaXplb2YodmFsKSwgMCk7Ci0JCXJ2YWwgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih2YWwpKQotCQkJYnJlYWs7Ci0JCXJ2YWwgPSBwdXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopZGF0YSk7CisJCXJ2YWwgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJ2YWwgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCSAgICA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcnZhbCA9IC1FSU87CisJCXJ2YWwgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJLyogUmVhZC93cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBBRERSIGluIHRoZSByZWdpc3RlcnMuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvS2NvbmZpZyBiL2FyY2gveDg2XzY0L0tjb25maWcKaW5kZXggOGJkZDI1YS4uMTRiZjhjZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvS2NvbmZpZworKysgYi9hcmNoL3g4Nl82NC9LY29uZmlnCkBAIC03NzQsOCArNzc0LDggQEAKIHNvdXJjZSAiYXJjaC94ODZfNjQvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggNDc1NjVjMy4uNzgyZGVhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCkBAIC01MjYsNyArNTI2LDcgQEAKIAkucXVhZCBzeXNfaW5pdF9tb2R1bGUKIAkucXVhZCBzeXNfZGVsZXRlX21vZHVsZQogCS5xdWFkIHF1aWV0X25pX3N5c2NhbGwJCS8qIDEzMCAgZ2V0X2tlcm5lbF9zeW1zICovCi0JLnF1YWQgc3lzX3F1b3RhY3RsCisJLnF1YWQgc3lzMzJfcXVvdGFjdGwKIAkucXVhZCBzeXNfZ2V0cGdpZAogCS5xdWFkIHN5c19mY2hkaXIKIAkucXVhZCBxdWlldF9uaV9zeXNjYWxsCS8qIGJkZmx1c2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TCmluZGV4IDFmYWI0ODcuLjk0MWM4NGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQuUwpAQCAtNzMsNyArNzMsMTEgQEAKIAlhZGRxCSVyYnAsIGluaXRfbGV2ZWw0X3BndCArICg1MTEqOCkoJXJpcCkKIAogCWFkZHEJJXJicCwgbGV2ZWwzX2lkZW50X3BndCArIDAoJXJpcCkKKwogCWFkZHEJJXJicCwgbGV2ZWwzX2tlcm5lbF9wZ3QgKyAoNTEwKjgpKCVyaXApCisJYWRkcQklcmJwLCBsZXZlbDNfa2VybmVsX3BndCArICg1MTEqOCkoJXJpcCkKKworCWFkZHEJJXJicCwgbGV2ZWwyX2ZpeG1hcF9wZ3QgKyAoNTA2KjgpKCVyaXApCiAKIAkvKiBBZGQgYW4gSWRlbnRpdHkgbWFwcGluZyBpZiBJIGFtIGFib3ZlIDFHICovCiAJbGVhcQlfdGV4dCglcmlwKSwgJXJkaQpAQCAtMzE0LDcgKzMxOCwxNiBAQAogCS5maWxsCTUxMCw4LDAKIAkvKiAoMl40OC0oMioxMDI0KjEwMjQqMTAyNCktKCgyXjM5KSo1MTEpKS8oMl4zMCkgPSA1MTAgKi8KIAkucXVhZAlsZXZlbDJfa2VybmVsX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9LRVJOUEdfVEFCTEUKLQkuZmlsbAkxLDgsMAorCS5xdWFkCWxldmVsMl9maXhtYXBfcGd0IC0gX19TVEFSVF9LRVJORUxfbWFwICsgX1BBR0VfVEFCTEUKKworTkVYVF9QQUdFKGxldmVsMl9maXhtYXBfcGd0KQorCS5maWxsCTUwNiw4LDAKKwkucXVhZAlsZXZlbDFfZml4bWFwX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9QQUdFX1RBQkxFCisJLyogOE1CIHJlc2VydmVkIGZvciB2c3lzY2FsbHMgKyBhIDJNQiBob2xlID0gNCArIDEgZW50cmllcyAqLworCS5maWxsCTUsOCwwCisKK05FWFRfUEFHRShsZXZlbDFfZml4bWFwX3BndCkKKwkuZmlsbAk1MTIsOCwwCiAKIE5FWFRfUEFHRShsZXZlbDJfaWRlbnRfcGd0KQogCS8qIFNpbmNlIEkgZWFzaWx5IGNhbiwgbWFwIHRoZSBmaXJzdCAxRy4KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwppbmRleCA5MzFjNjRiLi5lZGJiYzU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShsb2NhbF90LCBhbGVydF9jb3VudGVyKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIG5taV90b3VjaCk7CiAKLXZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nICh2b2lkKQordm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2codm9pZCkKIHsKIAlpZiAobm1pX3dhdGNoZG9nID4gMCkgewogCQl1bnNpZ25lZCBjcHU7CkBAIC0zMDYsOCArMzA2LDEwIEBACiAJCSAqIGRvIGl0IG91cnNlbHZlcyBiZWNhdXNlIHRoZSBhbGVydCBjb3VudCBpbmNyZWFzZSBpcyBub3QKIAkJICogYXRvbWljLgogCQkgKi8KLQkJZm9yX2VhY2hfcHJlc2VudF9jcHUgKGNwdSkKLQkJCXBlcl9jcHUobm1pX3RvdWNoLCBjcHUpID0gMTsKKwkJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCQlpZiAocGVyX2NwdShubWlfdG91Y2gsIGNwdSkgIT0gMSkKKwkJCQlwZXJfY3B1KG5taV90b3VjaCwgY3B1KSA9IDE7CisJCX0KIAl9CiAKICAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDk0MDkxMTcuLmZhNjc3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTMxMywxNyArMzEzLDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMzY3LDEwICszNTksNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGFhYzFjMGIuLjc0Y2JlYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCkBAIC0zMzAsNiArMzMwLDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CisJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJcHJpbnRrX2FkZHJlc3MoYWRkcik7CiB9CiAKQEAgLTUxOCw2ICs1MTksNyBAQAogCXByaW50aygiXG4iKTsKIAlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIGVyciwgY3VycmVudC0+dGhyZWFkLnRyYXBfbm8sIFNJR1NFR1YpOwogCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCS8qIEV4ZWN1dGl2ZSBzdW1tYXJ5IGluIGNhc2UgdGhlIG9vcHMgc2Nyb2xsZWQgYXdheSAqLwogCXByaW50ayhLRVJOX0FMRVJUICJSSVAgIik7CiAJcHJpbnRrX2FkZHJlc3MocmVncy0+cmlwKTsgCkBAIC01MzEsNyArNTMzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gb29wc19iZWdpbigpOwogCiAJaWYgKCF1c2VyX21vZGUocmVncykpCi0JCXJlcG9ydF9idWcocmVncy0+cmlwKTsKKwkJcmVwb3J0X2J1ZyhyZWdzLT5yaXAsIHJlZ3MpOwogCiAJX19kaWUoc3RyLCByZWdzLCBlcnIpOwogCW9vcHNfZW5kKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYwppbmRleCAxNDEwNGZmLi4wNmExM2Q5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCkBAIC01MCwxOCArNTAsOCBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJZ290byBvdXQ7Ci0JfQogCiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICAqLwogCkBAIC0xMzgsMTAgKzEyOCw3IEBACiAKIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKQotCQkgICAgPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJZ290byBvdXQ7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwppbmRleCA2OTNhYjI2Li5jNWU2MmY5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwpAQCAtNDgyLDYgKzQ4Miw3IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCXNob3dfc3RhY2soTlVMTCwgKHVuc2lnbmVkIGxvbmcqKXJlZ3MtPmFyZWdbMV0pOwogCisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWVfbG9jayk7CiAKIAlpZiAoaW5faW50ZXJydXB0KCkpCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCAyODU5MzUxLi42NTk3YjYwIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCisrKyBiL2Jsb2NrL0tjb25maWcKQEAgLTUxLDQgKzUxLDEyIEBACiAKIGVuZGlmICMgQkxPQ0sKIAorY29uZmlnIEJMS19ERVZfQlNHCisJYm9vbCAiQmxvY2sgbGF5ZXIgU0cgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChTQ1NJPXkpICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTYXlpbmcgWSBoZXJlIHdpbGwgZW5hYmxlIGdlbmVyaWMgU0cgKFNDU0kgZ2VuZXJpYykgdjQKKwlzdXBwb3J0IGZvciBhbnkgYmxvY2sgZGV2aWNlLgorCiBzb3VyY2UgYmxvY2svS2NvbmZpZy5pb3NjaGVkCmRpZmYgLS1naXQgYS9ibG9jay9NYWtlZmlsZSBiL2Jsb2NrL01ha2VmaWxlCmluZGV4IDRiODRkMGQuLjk1OWZlZWIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL01ha2VmaWxlCisrKyBiL2Jsb2NrL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBvYmotJChDT05GSUdfQkxPQ0spIDo9IGVsZXZhdG9yLm8gbGxfcndfYmxrLm8gaW9jdGwubyBnZW5oZC5vIHNjc2lfaW9jdGwubwogCitvYmotJChDT05GSUdfQkxLX0RFVl9CU0cpCSs9IGJzZy5vCiBvYmotJChDT05GSUdfSU9TQ0hFRF9OT09QKQkrPSBub29wLWlvc2NoZWQubwogb2JqLSQoQ09ORklHX0lPU0NIRURfQVMpCSs9IGFzLWlvc2NoZWQubwogb2JqLSQoQ09ORklHX0lPU0NIRURfREVBRExJTkUpCSs9IGRlYWRsaW5lLWlvc2NoZWQubwpkaWZmIC0tZ2l0IGEvYmxvY2svYXMtaW9zY2hlZC5jIGIvYmxvY2svYXMtaW9zY2hlZC5jCmluZGV4IDEwOWU5MWIuLjNlMzE2ZGQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2FzLWlvc2NoZWQuYworKysgYi9ibG9jay9hcy1pb3NjaGVkLmMKQEAgLTEzMjIsMTAgKzEzMjIsOSBAQAogewogCXN0cnVjdCBhc19kYXRhICphZDsKIAotCWFkID0ga21hbGxvY19ub2RlKHNpemVvZigqYWQpLCBHRlBfS0VSTkVMLCBxLT5ub2RlKTsKKwlhZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmFkKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOwogCWlmICghYWQpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChhZCwgMCwgc2l6ZW9mKCphZCkpOwogCiAJYWQtPnEgPSBxOyAvKiBJZGVudGlmeSB3aGF0IHF1ZXVlIHRoZSBkYXRhIGJlbG9uZ3MgdG8gKi8KIApkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLmMgYi9ibG9jay9ic2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzY5MzNmCi0tLSAvZGV2L251bGwKKysrIGIvYmxvY2svYnNnLmMKQEAgLTAsMCArMSwxMTE0IEBACisvKgorICogYnNnLmMgLSBibG9jayBsYXllciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2cgdjMgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplbnMgQXhib2UgPGF4Ym9lQHN1c2UuZGU+IFNVU0UgTGFicworICogQ29weXJpZ2h0IChDKSAyMDA0IFBldGVyIE0uIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIHZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAqICBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisvKgorICogVE9ETworICoJLSBTaG91bGQgdGhpcyBnZXQgbWVyZ2VkLCBibG9jay9zY3NpX2lvY3RsLmMgd2lsbCBiZSBtaWdyYXRlZCBpbnRvCisgKgkgIHRoaXMgZmlsZS4gVG8ga2VlcCBtYWludGVuYW5jZSBkb3duLCBpdCdzIGVhc2llciB0byBoYXZlIHRoZW0KKyAqCSAgc2VwZXJhdGVkIHJpZ2h0IG5vdy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvYnNnLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZHJpdmVyLmg+CisjaW5jbHVkZSA8c2NzaS9zZy5oPgorCitzdGF0aWMgY2hhciBic2dfdmVyc2lvbltdID0gImJsb2NrIGxheWVyIHNnIChic2cpIDAuNCI7CisKK3N0cnVjdCBic2dfZGV2aWNlIHsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c3lfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRvbmVfbGlzdDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZXZfbGlzdDsKKwlhdG9taWNfdCByZWZfY291bnQ7CisJaW50IG1pbm9yOworCWludCBxdWV1ZWRfY21kczsKKwlpbnQgZG9uZV9jbWRzOworCXdhaXRfcXVldWVfaGVhZF90IHdxX2RvbmU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FfZnJlZTsKKwljaGFyIG5hbWVbQlVTX0lEX1NJWkVdOworCWludCBtYXhfcXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKK307CisKK2VudW0geworCUJTR19GX0JMT0NLCQk9IDEsCisJQlNHX0ZfV1JJVEVfUEVSTQk9IDIsCit9OworCisjZGVmaW5lIEJTR19ERUZBVUxUX0NNRFMJNjQKKyNkZWZpbmUgQlNHX01BWF9ERVZTCQkzMjc2OAorCisjdW5kZWYgQlNHX0RFQlVHCisKKyNpZmRlZiBCU0dfREVCVUcKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYXJncykKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgbGlzdF9lbnRyeV9iYyhlbnRyeSkJbGlzdF9lbnRyeSgoZW50cnkpLCBzdHJ1Y3QgYnNnX2NvbW1hbmQsIGxpc3QpCisKKy8qCisgKiBqdXN0IGZvciB0ZXN0aW5nCisgKi8KKyNkZWZpbmUgQlNHX01BSk9SCSgyNDApCisKK3N0YXRpYyBERUZJTkVfTVVURVgoYnNnX211dGV4KTsKK3N0YXRpYyBpbnQgYnNnX2RldmljZV9uciwgYnNnX21pbm9yX2lkeDsKKworI2RlZmluZSBCU0dfTElTVF9TSVpFCSg4KQorI2RlZmluZSBic2dfbGlzdF9pZHgobWlub3IpCSgobWlub3IpICYgKEJTR19MSVNUX1NJWkUgLSAxKSkKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBic2dfZGV2aWNlX2xpc3RbQlNHX0xJU1RfU0laRV07CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmJzZ19jbGFzczsKK3N0YXRpYyBMSVNUX0hFQUQoYnNnX2NsYXNzX2xpc3QpOworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJzZ19jbWRfY2FjaGVwOworCisvKgorICogb3VyIGludGVybmFsIGNvbW1hbmQgdHlwZQorICovCitzdHJ1Y3QgYnNnX2NvbW1hbmQgeworCXN0cnVjdCBic2dfZGV2aWNlICpiZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCXN0cnVjdCBiaW8gKmJpbzsKKwlzdHJ1Y3QgYmlvICpiaWRpX2JpbzsKKwlpbnQgZXJyOworCXN0cnVjdCBzZ19pb192NCBoZHI7CisJc3RydWN0IHNnX2lvX3Y0IF9fdXNlciAqdWhkcjsKKwljaGFyIHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07Cit9OworCitzdGF0aWMgdm9pZCBic2dfZnJlZV9jb21tYW5kKHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gYmMtPmJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYnNnX2NtZF9jYWNoZXAsIGJjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+bG9jaywgZmxhZ3MpOworCWJkLT5xdWV1ZWRfY21kcy0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZiZC0+d3FfZnJlZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJzZ19hbGxvY19jb21tYW5kKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjID0gRVJSX1BUUigtRUlOVkFMKTsKKworCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKworCWlmIChiZC0+cXVldWVkX2NtZHMgPj0gYmQtPm1heF9xdWV1ZSkKKwkJZ290byBvdXQ7CisKKwliZC0+cXVldWVkX2NtZHMrKzsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKworCWJjID0ga21lbV9jYWNoZV9hbGxvYyhic2dfY21kX2NhY2hlcCwgR0ZQX1VTRVIpOworCWlmICh1bmxpa2VseSghYmMpKSB7CisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJYmQtPnF1ZXVlZF9jbWRzLS07CisJCWJjID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KGJjLCAwLCBzaXplb2YoKmJjKSk7CisJYmMtPmJkID0gYmQ7CisJSU5JVF9MSVNUX0hFQUQoJmJjLT5saXN0KTsKKwlkcHJpbnRrKCIlczogcmV0dXJuaW5nIGZyZWUgY21kICVwXG4iLCBiZC0+bmFtZSwgYmMpOworCXJldHVybiBiYzsKK291dDoKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwlyZXR1cm4gYmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYnNnX2RlbF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJYmQtPmRvbmVfY21kcy0tOworCWxpc3RfZGVsKCZiYy0+bGlzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYnNnX2FkZF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJYmQtPmRvbmVfY21kcysrOworCWxpc3RfYWRkX3RhaWwoJmJjLT5saXN0LCAmYmQtPmRvbmVfbGlzdCk7CisJd2FrZV91cCgmYmQtPndxX2RvbmUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBic2dfaW9fc2NoZWR1bGUoc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBpbnQgc3RhdGUpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlCVUdfT04oYmQtPmRvbmVfY21kcyA+IGJkLT5xdWV1ZWRfY21kcyk7CisKKwkvKgorCSAqIC1FTk9TUEMgb3IgLUVOT0RBVEE/ICBJJ20gZ29pbmcgZm9yIC1FTk9EQVRBLCBtZWFuaW5nICJJIGhhdmUgbm8KKwkgKiB3b3JrIHRvIGRvIiwgZXZlbiB0aG91Z2ggd2UgcmV0dXJuIC1FTk9TUEMgYWZ0ZXIgdGhpcyBzYW1lIHRlc3QKKwkgKiBkdXJpbmcgYnNnX3dyaXRlKCkgLS0gdGhlcmUsIGl0IG1lYW5zIG91ciBidWZmZXIgY2FuJ3QgaGF2ZSBtb3JlCisJICogYnNnX2NvbW1hbmRzIGFkZGVkIHRvIGl0LCB0aHVzIGhhcyBubyBzcGFjZSBsZWZ0LgorCSAqLworCWlmIChiZC0+ZG9uZV9jbWRzID09IGJkLT5xdWV1ZWRfY21kcykgeworCQlyZXQgPSAtRU5PREFUQTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKCF0ZXN0X2JpdChCU0dfRl9CTE9DSywgJmJkLT5mbGFncykpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcHJlcGFyZV90b193YWl0KCZiZC0+d3FfZG9uZSwgJndhaXQsIHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwlpb19zY2hlZHVsZSgpOworCWZpbmlzaF93YWl0KCZiZC0+d3FfZG9uZSwgJndhaXQpOworCisJaWYgKChzdGF0ZSA9PSBUQVNLX0lOVEVSUlVQVElCTEUpICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisKKwlyZXR1cm4gcmV0OwordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmxrX2ZpbGxfc2d2NF9oZHJfcnEocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkJc3RydWN0IHNnX2lvX3Y0ICpoZHIsIGludCBoYXNfd3JpdGVfcGVybSkKK3sKKwltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOyAvKiBBVEFQSSBoYXRlcyBnYXJiYWdlIGFmdGVyIENEQiAqLworCisJaWYgKGNvcHlfZnJvbV91c2VyKHJxLT5jbWQsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpaGRyLT5yZXF1ZXN0LAorCQkJICAgaGRyLT5yZXF1ZXN0X2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGhkci0+c3VicHJvdG9jb2wgPT0gQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX0NNRCkgeworCQlpZiAoYmxrX3ZlcmlmeV9jb21tYW5kKHJxLT5jbWQsIGhhc193cml0ZV9wZXJtKSkKKwkJCXJldHVybiAtRVBFUk07CisJfSBlbHNlIGlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQorCSAqLworCXJxLT5jbWRfbGVuID0gaGRyLT5yZXF1ZXN0X2xlbjsKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKKworCXJxLT50aW1lb3V0ID0gKGhkci0+dGltZW91dCAqIEhaKSAvIDEwMDA7CisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBxLT5zZ190aW1lb3V0OworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfU0dfVElNRU9VVDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgaWYgc2dfaW9fdjQgZnJvbSB1c2VyIGlzIGFsbG93ZWQgYW5kIHZhbGlkCisgKi8KK3N0YXRpYyBpbnQKK2JzZ192YWxpZGF0ZV9zZ3Y0X2hkcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBzZ19pb192NCAqaGRyLCBpbnQgKnJ3KQoreworCWludCByZXQgPSAwOworCisJaWYgKGhkci0+Z3VhcmQgIT0gJ1EnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaGRyLT5yZXF1ZXN0X2xlbiA+IEJMS19NQVhfQ0RCKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaGRyLT5kb3V0X3hmZXJfbGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpIHx8CisJICAgIGhkci0+ZGluX3hmZXJfbGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpKQorCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAoaGRyLT5wcm90b2NvbCkgeworCWNhc2UgQlNHX1BST1RPQ09MX1NDU0k6CisJCXN3aXRjaCAoaGRyLT5zdWJwcm90b2NvbCkgeworCQljYXNlIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9DTUQ6CisJCWNhc2UgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX1RSQU5TUE9SVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCSpydyA9IGhkci0+ZG91dF94ZmVyX2xlbiA/IFdSSVRFIDogUkVBRDsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbWFwIHNnX2lvX3Y0IHRvIGEgcmVxdWVzdC4KKyAqLworc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoKK2JzZ19tYXBfaGRyKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgc3RydWN0IHNnX2lvX3Y0ICpoZHIpCit7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gYmQtPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0ICpycSwgKm5leHRfcnEgPSBOVUxMOworCWludCByZXQsIHJ3ID0gMDsgLyogc2h1dCB1cCBnY2MgKi8KKwl1bnNpZ25lZCBpbnQgZHhmZXJfbGVuOworCXZvaWQgKmR4ZmVycCA9IE5VTEw7CisKKwlkcHJpbnRrKCJtYXAgaGRyICVsbHgvJXUgJWxseC8ldVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgaGRyLT5kb3V0X3hmZXJwLAorCQloZHItPmRvdXRfeGZlcl9sZW4sICh1bnNpZ25lZCBsb25nIGxvbmcpIGhkci0+ZGluX3hmZXJwLAorCQloZHItPmRpbl94ZmVyX2xlbik7CisKKwlyZXQgPSBic2dfdmFsaWRhdGVfc2d2NF9oZHIocSwgaGRyLCAmcncpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwkvKgorCSAqIG1hcCBzY2F0dGVyLWdhdGhlciBlbGVtZW50cyBzZXBlcmF0ZWx5IGFuZCBzdHJpbmcgdGhlbSB0byByZXF1ZXN0CisJICovCisJcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgcncsIEdGUF9LRVJORUwpOworCWlmICghcnEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXJldCA9IGJsa19maWxsX3NndjRfaGRyX3JxKHEsIHJxLCBoZHIsIHRlc3RfYml0KEJTR19GX1dSSVRFX1BFUk0sCisJCQkJCQkgICAgICAgJmJkLT5mbGFncykpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKHJ3ID09IFdSSVRFICYmIGhkci0+ZGluX3hmZXJfbGVuKSB7CisJCWlmICghdGVzdF9iaXQoUVVFVUVfRkxBR19CSURJLCAmcS0+cXVldWVfZmxhZ3MpKSB7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbmV4dF9ycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXh0X3JxKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcnEtPm5leHRfcnEgPSBuZXh0X3JxOworCisJCWR4ZmVycCA9ICh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPmRpbl94ZmVycDsKKwkJcmV0ID0gIGJsa19ycV9tYXBfdXNlcihxLCBuZXh0X3JxLCBkeGZlcnAsIGhkci0+ZGluX3hmZXJfbGVuKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChoZHItPmRvdXRfeGZlcl9sZW4pIHsKKwkJZHhmZXJfbGVuID0gaGRyLT5kb3V0X3hmZXJfbGVuOworCQlkeGZlcnAgPSAodm9pZCopKHVuc2lnbmVkIGxvbmcpaGRyLT5kb3V0X3hmZXJwOworCX0gZWxzZSBpZiAoaGRyLT5kaW5feGZlcl9sZW4pIHsKKwkJZHhmZXJfbGVuID0gaGRyLT5kaW5feGZlcl9sZW47CisJCWR4ZmVycCA9ICh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPmRpbl94ZmVycDsKKwl9IGVsc2UKKwkJZHhmZXJfbGVuID0gMDsKKworCWlmIChkeGZlcl9sZW4pIHsKKwkJcmV0ID0gYmxrX3JxX21hcF91c2VyKHEsIHJxLCBkeGZlcnAsIGR4ZmVyX2xlbik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisJcmV0dXJuIHJxOworb3V0OgorCWJsa19wdXRfcmVxdWVzdChycSk7CisJaWYgKG5leHRfcnEpIHsKKwkJYmxrX3JxX3VubWFwX3VzZXIobmV4dF9ycS0+YmlvKTsKKwkJYmxrX3B1dF9yZXF1ZXN0KG5leHRfcnEpOworCX0KKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCisvKgorICogYXN5bmMgY29tcGxldGlvbiBjYWxsLWJhY2sgZnJvbSB0aGUgYmxvY2sgbGF5ZXIsIHdoZW4gc2NzaS9pZGUvd2hhdGV2ZXIKKyAqIGNhbGxzIGVuZF90aGF0X3JlcXVlc3RfbGFzdCgpIG9uIGEgcmVxdWVzdAorICovCitzdGF0aWMgdm9pZCBic2dfcnFfZW5kX2lvKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlKQoreworCXN0cnVjdCBic2dfY29tbWFuZCAqYmMgPSBycS0+ZW5kX2lvX2RhdGE7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gYmMtPmJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKCIlczogZmluaXNoZWQgcnEgJXAgYmMgJXAsIGJpbyAlcCBzdGF0ICVkXG4iLAorCQliZC0+bmFtZSwgcnEsIGJjLCBiYy0+YmlvLCB1cHRvZGF0ZSk7CisKKwliYy0+aGRyLmR1cmF0aW9uID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gYmMtPmhkci5kdXJhdGlvbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmYmMtPmxpc3QpOworCWJzZ19hZGRfZG9uZV9jbWQoYmQsIGJjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogZG8gZmluYWwgc2V0dXAgb2YgYSAnYmMnIGFuZCBzdWJtaXQgdGhlIG1hdGNoaW5nICdycScgdG8gdGhlIGJsb2NrCisgKiBsYXllciBmb3IgaW8KKyAqLworc3RhdGljIHZvaWQgYnNnX2FkZF9jb21tYW5kKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgcmVxdWVzdF9xdWV1ZV90ICpxLAorCQkJICAgIHN0cnVjdCBic2dfY29tbWFuZCAqYmMsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlycS0+c2Vuc2UgPSBiYy0+c2Vuc2U7CisJcnEtPnNlbnNlX2xlbiA9IDA7CisKKwkvKgorCSAqIGFkZCBiYyBjb21tYW5kIHRvIGJ1c3kgcXVldWUgYW5kIHN1Ym1pdCBycSBmb3IgaW8KKwkgKi8KKwliYy0+cnEgPSBycTsKKwliYy0+YmlvID0gcnEtPmJpbzsKKwlpZiAocnEtPm5leHRfcnEpCisJCWJjLT5iaWRpX2JpbyA9IHJxLT5uZXh0X3JxLT5iaW87CisJYmMtPmhkci5kdXJhdGlvbiA9IGppZmZpZXM7CisJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOworCWxpc3RfYWRkX3RhaWwoJmJjLT5saXN0LCAmYmQtPmJ1c3lfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlkcHJpbnRrKCIlczogcXVldWVpbmcgcnEgJXAsIGJjICVwXG4iLCBiZC0+bmFtZSwgcnEsIGJjKTsKKworCXJxLT5lbmRfaW9fZGF0YSA9IGJjOworCWJsa19leGVjdXRlX3JxX25vd2FpdChxLCBOVUxMLCBycSwgMSwgYnNnX3JxX2VuZF9pbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJzZ19jb21tYW5kICpic2dfbmV4dF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYyA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisJaWYgKGJkLT5kb25lX2NtZHMpIHsKKwkJYmMgPSBsaXN0X2VudHJ5X2JjKGJkLT5kb25lX2xpc3QubmV4dCk7CisJCWJzZ19kZWxfZG9uZV9jbWQoYmQsIGJjKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlyZXR1cm4gYmM7Cit9CisKKy8qCisgKiBHZXQgYSBmaW5pc2hlZCBjb21tYW5kIGZyb20gdGhlIGRvbmUgbGlzdAorICovCitzdGF0aWMgc3RydWN0IGJzZ19jb21tYW5kICpic2dfZ2V0X2RvbmVfY21kKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjOworCWludCByZXQ7CisKKwlkbyB7CisJCWJjID0gYnNnX25leHRfZG9uZV9jbWQoYmQpOworCQlpZiAoYmMpCisJCQlicmVhazsKKworCQlpZiAoIXRlc3RfYml0KEJTR19GX0JMT0NLLCAmYmQtPmZsYWdzKSkgeworCQkJYmMgPSBFUlJfUFRSKC1FQUdBSU4pOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmQtPndxX2RvbmUsIGJkLT5kb25lX2NtZHMpOworCQlpZiAocmV0KSB7CisJCQliYyA9IEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlkcHJpbnRrKCIlczogcmV0dXJuaW5nIGRvbmUgJXBcbiIsIGJkLT5uYW1lLCBiYyk7CisKKwlyZXR1cm4gYmM7Cit9CisKK3N0YXRpYyBpbnQgYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IHNnX2lvX3Y0ICpoZHIsCisJCQkJICAgIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqYmlkaV9iaW8pCit7CisJaW50IHJldCA9IDA7CisKKwlkcHJpbnRrKCJycSAlcCBiaW8gJXAgJXVcbiIsIHJxLCBiaW8sIHJxLT5lcnJvcnMpOworCS8qCisJICogZmlsbCBpbiBhbGwgdGhlIG91dHB1dCBtZW1iZXJzCisJICovCisJaGRyLT5kZXZpY2Vfc3RhdHVzID0gc3RhdHVzX2J5dGUocnEtPmVycm9ycyk7CisJaGRyLT50cmFuc3BvcnRfc3RhdHVzID0gaG9zdF9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+ZHJpdmVyX3N0YXR1cyA9IGRyaXZlcl9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+aW5mbyA9IDA7CisJaWYgKGhkci0+ZGV2aWNlX3N0YXR1cyB8fCBoZHItPnRyYW5zcG9ydF9zdGF0dXMgfHwgaGRyLT5kcml2ZXJfc3RhdHVzKQorCQloZHItPmluZm8gfD0gU0dfSU5GT19DSEVDSzsKKwloZHItPmRpbl9yZXNpZCA9IHJxLT5kYXRhX2xlbjsKKwloZHItPnJlc3BvbnNlX2xlbiA9IDA7CisKKwlpZiAocnEtPnNlbnNlX2xlbiAmJiBoZHItPnJlc3BvbnNlKSB7CisJCWludCBsZW4gPSBtaW4oKHVuc2lnbmVkIGludCkgaGRyLT5tYXhfcmVzcG9uc2VfbGVuLAorCQkJICAgICAgcnEtPnNlbnNlX2xlbik7CisKKwkJcmV0ID0gY29weV90b191c2VyKCh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPnJlc3BvbnNlLAorCQkJCSAgIHJxLT5zZW5zZSwgbGVuKTsKKwkJaWYgKCFyZXQpCisJCQloZHItPnJlc3BvbnNlX2xlbiA9IGxlbjsKKwkJZWxzZQorCQkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlpZiAocnEtPm5leHRfcnEpIHsKKwkJYmxrX3JxX3VubWFwX3VzZXIoYmlkaV9iaW8pOworCQlibGtfcHV0X3JlcXVlc3QocnEtPm5leHRfcnEpOworCX0KKworCWJsa19ycV91bm1hcF91c2VyKGJpbyk7CisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnNnX2NvbXBsZXRlX2FsbF9jb21tYW5kcyhzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYzsKKwlpbnQgcmV0LCB0cmV0OworCisJZHByaW50aygiJXM6IGVudGVyZWRcbiIsIGJkLT5uYW1lKTsKKworCXNldF9iaXQoQlNHX0ZfQkxPQ0ssICZiZC0+ZmxhZ3MpOworCisJLyoKKwkgKiB3YWl0IGZvciBhbGwgY29tbWFuZHMgdG8gY29tcGxldGUKKwkgKi8KKwlyZXQgPSAwOworCWRvIHsKKwkJcmV0ID0gYnNnX2lvX3NjaGVkdWxlKGJkLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCS8qCisJCSAqIGxvb2sgZm9yIC1FTk9EQVRBIHNwZWNpZmljYWxseSAtLSB3ZSdsbCBzb21ldGltZXMgZ2V0CisJCSAqIC1FUkVTVEFSVFNZUyB3aGVuIHdlJ3ZlIHRha2VuIGEgc2lnbmFsLCBidXQgd2UgY2FuJ3QKKwkJICogcmV0dXJuIHVudGlsIHdlJ3JlIGRvbmUgZnJlZWluZyB0aGUgcXVldWUsIHNvIGlnbm9yZQorCQkgKiBpdC4gIFRoZSBzaWduYWwgd2lsbCBnZXQgaGFuZGxlZCB3aGVuIHdlJ3JlIGRvbmUgZnJlZWluZworCQkgKiB0aGUgYnNnX2RldmljZS4KKwkJICovCisJfSB3aGlsZSAocmV0ICE9IC1FTk9EQVRBKTsKKworCS8qCisJICogZGlzY2FyZCBkb25lIGNvbW1hbmRzCisJICovCisJcmV0ID0gMDsKKwlkbyB7CisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJaWYgKCFiZC0+cXVldWVkX2NtZHMpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwkJYmMgPSBic2dfZ2V0X2RvbmVfY21kKGJkKTsKKwkJaWYgKElTX0VSUihiYykpCisJCQlicmVhazsKKworCQl0cmV0ID0gYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKGJjLT5ycSwgJmJjLT5oZHIsIGJjLT5iaW8sCisJCQkJCQliYy0+YmlkaV9iaW8pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHRyZXQ7CisKKwkJYnNnX2ZyZWVfY29tbWFuZChiYyk7CisJfSB3aGlsZSAoMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAorX19ic2dfcmVhZChjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIHN0cnVjdCBic2dfZGV2aWNlICpiZCwKKwkgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgc3NpemVfdCAqYnl0ZXNfcmVhZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjOworCWludCBucl9jb21tYW5kcywgcmV0OworCisJaWYgKGNvdW50ICUgc2l6ZW9mKHN0cnVjdCBzZ19pb192NCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gMDsKKwlucl9jb21tYW5kcyA9IGNvdW50IC8gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJd2hpbGUgKG5yX2NvbW1hbmRzKSB7CisJCWJjID0gYnNnX2dldF9kb25lX2NtZChiZCk7CisJCWlmIChJU19FUlIoYmMpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGJjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogdGhpcyBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gY29weSBkYXRhIGJhY2sKKwkJICogYWZ0ZXIgY29tcGxldGluZyB0aGUgcmVxdWVzdC4gc28gZG8gdGhhdCBoZXJlLAorCQkgKiBic2dfY29tcGxldGVfd29yaygpIGNhbm5vdCBkbyB0aGF0IGZvciB1cworCQkgKi8KKwkJcmV0ID0gYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKGJjLT5ycSwgJmJjLT5oZHIsIGJjLT5iaW8sCisJCQkJCSAgICAgICBiYy0+YmlkaV9iaW8pOworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAoY2hhciAqKSAmYmMtPmhkciwgc2l6ZW9mKGJjLT5oZHIpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisKKwkJYnNnX2ZyZWVfY29tbWFuZChiYyk7CisKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KTsKKwkJKmJ5dGVzX3JlYWQgKz0gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJCW5yX2NvbW1hbmRzLS07CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJzZ19zZXRfYmxvY2soc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWNsZWFyX2JpdChCU0dfRl9CTE9DSywgJmJkLT5mbGFncyk7CisJZWxzZQorCQlzZXRfYml0KEJTR19GX0JMT0NLLCAmYmQtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJzZ19zZXRfd3JpdGVfcGVybShzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJc2V0X2JpdChCU0dfRl9XUklURV9QRVJNLCAmYmQtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChCU0dfRl9XUklURV9QRVJNLCAmYmQtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXJyX2Jsb2NrX2VycihpbnQgcmV0KQoreworCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9TUEMgJiYgcmV0ICE9IC1FTk9EQVRBICYmIHJldCAhPSAtRUFHQUlOKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorYnNnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCXNzaXplX3QgYnl0ZXNfcmVhZDsKKworCWRwcmludGsoIiVzOiByZWFkICVaZCBieXRlc1xuIiwgYmQtPm5hbWUsIGNvdW50KTsKKworCWJzZ19zZXRfYmxvY2soYmQsIGZpbGUpOworCWJ5dGVzX3JlYWQgPSAwOworCXJldCA9IF9fYnNnX3JlYWQoYnVmLCBjb3VudCwgYmQsIE5VTEwsICZieXRlc19yZWFkKTsKKwkqcHBvcyA9IGJ5dGVzX3JlYWQ7CisKKwlpZiAoIWJ5dGVzX3JlYWQgfHwgKGJ5dGVzX3JlYWQgJiYgZXJyX2Jsb2NrX2VycihyZXQpKSkKKwkJYnl0ZXNfcmVhZCA9IHJldDsKKworCXJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgc3NpemVfdCBfX2JzZ193cml0ZShzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIHNzaXplX3QgKmJ5dGVzX3JlYWQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYzsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaW50IHJldCwgbnJfY29tbWFuZHM7CisKKwlpZiAoY291bnQgJSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucl9jb21tYW5kcyA9IGNvdW50IC8gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJcnEgPSBOVUxMOworCWJjID0gTlVMTDsKKwlyZXQgPSAwOworCXdoaWxlIChucl9jb21tYW5kcykgeworCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZC0+cXVldWU7CisKKwkJYmMgPSBic2dfYWxsb2NfY29tbWFuZChiZCk7CisJCWlmIChJU19FUlIoYmMpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGJjKTsKKwkJCWJjID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJYmMtPnVoZHIgPSAoc3RydWN0IHNnX2lvX3Y0IF9fdXNlciAqKSBidWY7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYmMtPmhkciwgYnVmLCBzaXplb2YoYmMtPmhkcikpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBnZXQgYSByZXF1ZXN0LCBmaWxsIGluIHRoZSBibGFua3MsIGFuZCBhZGQgdG8gcmVxdWVzdCBxdWV1ZQorCQkgKi8KKwkJcnEgPSBic2dfbWFwX2hkcihiZCwgJmJjLT5oZHIpOworCQlpZiAoSVNfRVJSKHJxKSkgeworCQkJcmV0ID0gUFRSX0VSUihycSk7CisJCQlycSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCisJCWJzZ19hZGRfY29tbWFuZChiZCwgcSwgYmMsIHJxKTsKKwkJYmMgPSBOVUxMOworCQlycSA9IE5VTEw7CisJCW5yX2NvbW1hbmRzLS07CisJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KTsKKwkJKmJ5dGVzX3JlYWQgKz0gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJfQorCisJaWYgKGJjKQorCQlic2dfZnJlZV9jb21tYW5kKGJjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citic2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IGJ5dGVzX3JlYWQ7CisJaW50IHJldDsKKworCWRwcmludGsoIiVzOiB3cml0ZSAlWmQgYnl0ZXNcbiIsIGJkLT5uYW1lLCBjb3VudCk7CisKKwlic2dfc2V0X2Jsb2NrKGJkLCBmaWxlKTsKKwlic2dfc2V0X3dyaXRlX3Blcm0oYmQsIGZpbGUpOworCisJYnl0ZXNfcmVhZCA9IDA7CisJcmV0ID0gX19ic2dfd3JpdGUoYmQsIGJ1ZiwgY291bnQsICZieXRlc19yZWFkKTsKKwkqcHBvcyA9IGJ5dGVzX3JlYWQ7CisKKwkvKgorCSAqIHJldHVybiBieXRlcyB3cml0dGVuIG9uIG5vbi1mYXRhbCBlcnJvcnMKKwkgKi8KKwlpZiAoIWJ5dGVzX3JlYWQgfHwgKGJ5dGVzX3JlYWQgJiYgZXJyX2Jsb2NrX2VycihyZXQpKSkKKwkJYnl0ZXNfcmVhZCA9IHJldDsKKworCWRwcmludGsoIiVzOiByZXR1cm5pbmcgJVpkXG4iLCBiZC0+bmFtZSwgYnl0ZXNfcmVhZCk7CisJcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2RldmljZSAqYnNnX2FsbG9jX2RldmljZSh2b2lkKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZDsKKworCWJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJzZ19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWJkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaW5pdCgmYmQtPmxvY2spOworCisJYmQtPm1heF9xdWV1ZSA9IEJTR19ERUZBVUxUX0NNRFM7CisKKwlJTklUX0xJU1RfSEVBRCgmYmQtPmJ1c3lfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJkLT5kb25lX2xpc3QpOworCUlOSVRfSExJU1RfTk9ERSgmYmQtPmRldl9saXN0KTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJkLT53cV9mcmVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiZC0+d3FfZG9uZSk7CisJcmV0dXJuIGJkOworfQorCitzdGF0aWMgaW50IGJzZ19wdXRfZGV2aWNlKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmJkLT5yZWZfY291bnQpKQorCQlnb3RvIG91dDsKKworCWRwcmludGsoIiVzOiB0ZWFyaW5nIGRvd25cbiIsIGJkLT5uYW1lKTsKKworCS8qCisJICogY2xvc2UgY2FuIGFsd2F5cyBibG9jaworCSAqLworCXNldF9iaXQoQlNHX0ZfQkxPQ0ssICZiZC0+ZmxhZ3MpOworCisJLyoKKwkgKiBjb3JyZWN0IGVycm9yIGRldGVjdGlvbiBiYWRkaWVzIGhlcmUgYWdhaW4uIGl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5CisJICogb2YgdGhlIGFwcCB0byBwcm9wZXJseSByZWFwIGNvbW1hbmRzIGJlZm9yZSBjbG9zZSgpIGlmIGl0IHdhbnRzCisJICogZm9vbC1wcm9vZiBlcnJvciBkZXRlY3Rpb24KKwkgKi8KKwlyZXQgPSBic2dfY29tcGxldGVfYWxsX2NvbW1hbmRzKGJkKTsKKworCWJsa19wdXRfcXVldWUoYmQtPnF1ZXVlKTsKKwlobGlzdF9kZWwoJmJkLT5kZXZfbGlzdCk7CisJa2ZyZWUoYmQpOworb3V0OgorCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGJzZ19kZXZpY2UgKmJzZ19hZGRfZGV2aWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcnEsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBOVUxMOworI2lmZGVmIEJTR19ERUJVRworCXVuc2lnbmVkIGNoYXIgYnVmWzMyXTsKKyNlbmRpZgorCisJYmQgPSBic2dfYWxsb2NfZGV2aWNlKCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwliZC0+cXVldWUgPSBycTsKKwlrb2JqZWN0X2dldCgmcnEtPmtvYmopOworCWJzZ19zZXRfYmxvY2soYmQsIGZpbGUpOworCisJYXRvbWljX3NldCgmYmQtPnJlZl9jb3VudCwgMSk7CisJYmQtPm1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwltdXRleF9sb2NrKCZic2dfbXV0ZXgpOworCWhsaXN0X2FkZF9oZWFkKCZiZC0+ZGV2X2xpc3QsICZic2dfZGV2aWNlX2xpc3RbYnNnX2xpc3RfaWR4KGJkLT5taW5vcildKTsKKworCXN0cm5jcHkoYmQtPm5hbWUsIHJxLT5ic2dfZGV2LmNsYXNzX2Rldi0+Y2xhc3NfaWQsIHNpemVvZihiZC0+bmFtZSkgLSAxKTsKKwlkcHJpbnRrKCJib3VuZCB0byA8JXM+LCBtYXggcXVldWUgJWRcbiIsCisJCWZvcm1hdF9kZXZfdChidWYsIGlub2RlLT5pX3JkZXYpLCBiZC0+bWF4X3F1ZXVlKTsKKworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gYmQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2RldmljZSAqX19ic2dfZ2V0X2RldmljZShpbnQgbWlub3IpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QgPSAmYnNnX2RldmljZV9saXN0W2JzZ19saXN0X2lkeChtaW5vcildOworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCisJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKKworCWhsaXN0X2Zvcl9lYWNoKGVudHJ5LCBsaXN0KSB7CisJCWJkID0gaGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBic2dfZGV2aWNlLCBkZXZfbGlzdCk7CisJCWlmIChiZC0+bWlub3IgPT0gbWlub3IpIHsKKwkJCWF0b21pY19pbmMoJmJkLT5yZWZfY291bnQpOworCQkJYnJlYWs7CisJCX0KKworCQliZCA9IE5VTEw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZic2dfbXV0ZXgpOworCXJldHVybiBiZDsKK30KKworc3RhdGljIHN0cnVjdCBic2dfZGV2aWNlICpic2dfZ2V0X2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBfX2JzZ19nZXRfZGV2aWNlKGltaW5vcihpbm9kZSkpOworCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2QsICpfX2JjZDsKKworCWlmIChiZCkKKwkJcmV0dXJuIGJkOworCisJLyoKKwkgKiBmaW5kIHRoZSBjbGFzcyBkZXZpY2UKKwkgKi8KKwliY2QgPSBOVUxMOworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2JjZCwgJmJzZ19jbGFzc19saXN0LCBsaXN0KSB7CisJCWlmIChfX2JjZC0+bWlub3IgPT0gaW1pbm9yKGlub2RlKSkgeworCQkJYmNkID0gX19iY2Q7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CisKKwlpZiAoIWJjZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlyZXR1cm4gYnNnX2FkZF9kZXZpY2UoaW5vZGUsIGJjZC0+cXVldWUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGJzZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGJzZ19nZXRfZGV2aWNlKGlub2RlLCBmaWxlKTsKKworCWlmIChJU19FUlIoYmQpKQorCQlyZXR1cm4gUFRSX0VSUihiZCk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBiZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBic2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJldHVybiBic2dfcHV0X2RldmljZShiZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnNnX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmYmQtPndxX2RvbmUsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmYmQtPndxX2ZyZWUsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOworCWlmICghbGlzdF9lbXB0eSgmYmQtPmRvbmVfbGlzdCkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoYmQtPnF1ZXVlZF9jbWRzID49IGJkLT5tYXhfcXVldWUpCisJCW1hc2sgfD0gUE9MTE9VVDsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50Citic2dfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IF9fdXNlciAqdWFyZyA9IChpbnQgX191c2VyICopIGFyZzsKKworCWlmICghYmQpCisJCXJldHVybiAtRU5YSU87CisKKwlzd2l0Y2ggKGNtZCkgeworCQkvKgorCQkgKiBvdXIgb3duIGlvY3RscworCQkgKi8KKwljYXNlIFNHX0dFVF9DT01NQU5EX1E6CisJCXJldHVybiBwdXRfdXNlcihiZC0+bWF4X3F1ZXVlLCB1YXJnKTsKKwljYXNlIFNHX1NFVF9DT01NQU5EX1E6IHsKKwkJaW50IHF1ZXVlOworCisJCWlmIChnZXRfdXNlcihxdWV1ZSwgdWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHF1ZXVlIDwgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJYmQtPm1heF9xdWV1ZSA9IHF1ZXVlOworCQlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTQ1NJL3NnIGlvY3RscworCSAqLworCWNhc2UgU0dfR0VUX1ZFUlNJT05fTlVNOgorCWNhc2UgU0NTSV9JT0NUTF9HRVRfSURMVU46CisJY2FzZSBTQ1NJX0lPQ1RMX0dFVF9CVVNfTlVNQkVSOgorCWNhc2UgU0dfU0VUX1RJTUVPVVQ6CisJY2FzZSBTR19HRVRfVElNRU9VVDoKKwljYXNlIFNHX0dFVF9SRVNFUlZFRF9TSVpFOgorCWNhc2UgU0dfU0VUX1JFU0VSVkVEX1NJWkU6CisJY2FzZSBTR19FTVVMQVRFRF9IT1NUOgorCWNhc2UgU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQ6IHsKKwkJdm9pZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlsZSwgYmQtPnF1ZXVlLCBOVUxMLCBjbWQsIHVhcmcpOworCX0KKwljYXNlIFNHX0lPOiB7CisJCXN0cnVjdCByZXF1ZXN0ICpycTsKKwkJc3RydWN0IGJpbyAqYmlvLCAqYmlkaV9iaW8gPSBOVUxMOworCQlzdHJ1Y3Qgc2dfaW9fdjQgaGRyOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCB1YXJnLCBzaXplb2YoaGRyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlycSA9IGJzZ19tYXBfaGRyKGJkLCAmaGRyKTsKKwkJaWYgKElTX0VSUihycSkpCisJCQlyZXR1cm4gUFRSX0VSUihycSk7CisKKwkJYmlvID0gcnEtPmJpbzsKKwkJaWYgKHJxLT5uZXh0X3JxKQorCQkJYmlkaV9iaW8gPSBycS0+bmV4dF9ycS0+YmlvOworCQlibGtfZXhlY3V0ZV9ycShiZC0+cXVldWUsIE5VTEwsIHJxLCAwKTsKKwkJYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKHJxLCAmaGRyLCBiaW8sIGJpZGlfYmlvKTsKKworCQlpZiAoY29weV90b191c2VyKHVhcmcsICZoZHIsIHNpemVvZihoZHIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIGJsb2NrIGRldmljZSBpb2N0bHMKKwkgKi8KKwlkZWZhdWx0OgorI2lmIDAKKwkJcmV0dXJuIGlvY3RsX2J5X2JkZXYoYmQtPmJkZXYsIGNtZCwgYXJnKTsKKyNlbHNlCisJCXJldHVybiAtRU5PVFRZOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBic2dfZm9wcyA9IHsKKwkucmVhZAkJPQlic2dfcmVhZCwKKwkud3JpdGUJCT0JYnNnX3dyaXRlLAorCS5wb2xsCQk9CWJzZ19wb2xsLAorCS5vcGVuCQk9CWJzZ19vcGVuLAorCS5yZWxlYXNlCT0JYnNnX3JlbGVhc2UsCisJLmlvY3RsCQk9CWJzZ19pb2N0bCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCit2b2lkIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2QgPSAmcS0+YnNnX2RldjsKKworCWlmICghYmNkLT5jbGFzc19kZXYpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnEtPmtvYmosICJic2ciKTsKKwljbGFzc19kZXZpY2VfZGVzdHJveShic2dfY2xhc3MsIE1LREVWKEJTR19NQUpPUiwgYmNkLT5taW5vcikpOworCWJjZC0+Y2xhc3NfZGV2ID0gTlVMTDsKKwlsaXN0X2RlbF9pbml0KCZiY2QtPmxpc3QpOworCWJzZ19kZXZpY2VfbnItLTsKKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChic2dfdW5yZWdpc3Rlcl9xdWV1ZSk7CisKK2ludCBic2dfcmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgKmJjZCwgKl9fYmNkOworCWRldl90IGRldjsKKwlpbnQgcmV0ID0gLUVNRklMRTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSBOVUxMOworCisJLyoKKwkgKiB3ZSBuZWVkIGEgcHJvcGVyIHRyYW5zcG9ydCB0byBzZW5kIGNvbW1hbmRzLCBub3QgYSBzdGFja2VkIGRldmljZQorCSAqLworCWlmICghcS0+cmVxdWVzdF9mbikKKwkJcmV0dXJuIDA7CisKKwliY2QgPSAmcS0+YnNnX2RldjsKKwltZW1zZXQoYmNkLCAwLCBzaXplb2YoKmJjZCkpOworCUlOSVRfTElTVF9IRUFEKCZiY2QtPmxpc3QpOworCisJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKKwlpZiAoYnNnX2RldmljZV9uciA9PSBCU0dfTUFYX0RFVlMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJic2c6IHRvbyBtYW55IGJzZyBkZXZpY2VzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCityZXRyeToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9fYmNkLCAmYnNnX2NsYXNzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKF9fYmNkLT5taW5vciA9PSBic2dfbWlub3JfaWR4KSB7CisJCQlic2dfbWlub3JfaWR4Kys7CisJCQlpZiAoYnNnX21pbm9yX2lkeCA9PSBCU0dfTUFYX0RFVlMpCisJCQkJYnNnX21pbm9yX2lkeCA9IDA7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCisJYmNkLT5taW5vciA9IGJzZ19taW5vcl9pZHgrKzsKKwlpZiAoYnNnX21pbm9yX2lkeCA9PSBCU0dfTUFYX0RFVlMpCisJCWJzZ19taW5vcl9pZHggPSAwOworCisJYmNkLT5xdWV1ZSA9IHE7CisJZGV2ID0gTUtERVYoQlNHX01BSk9SLCBiY2QtPm1pbm9yKTsKKwljbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKGJzZ19jbGFzcywgTlVMTCwgZGV2LCBiY2QtPmRldiwgIiVzIiwgbmFtZSk7CisJaWYgKElTX0VSUihjbGFzc19kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIoY2xhc3NfZGV2KTsKKwkJZ290byBlcnI7CisJfQorCWJjZC0+Y2xhc3NfZGV2ID0gY2xhc3NfZGV2OworCisJaWYgKHEtPmtvYmouc2QpIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJnEtPmtvYmosICZiY2QtPmNsYXNzX2Rldi0+a29iaiwgImJzZyIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmYmNkLT5saXN0LCAmYnNnX2NsYXNzX2xpc3QpOworCWJzZ19kZXZpY2VfbnIrKzsKKworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAoY2xhc3NfZGV2KQorCQljbGFzc19kZXZpY2VfZGVzdHJveShic2dfY2xhc3MsIE1LREVWKEJTR19NQUpPUiwgYmNkLT5taW5vcikpOworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnNnX3JlZ2lzdGVyX3F1ZXVlKTsKKworc3RhdGljIGludCBic2dfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsX2Rldiwgc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xfaW50ZikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gdG9fc2NzaV9kZXZpY2UoY2xfZGV2LT5kZXYpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSA9IHNkcC0+cmVxdWVzdF9xdWV1ZTsKKworCWlmIChycS0+a29iai5wYXJlbnQpCisJCXJldCA9IGJzZ19yZWdpc3Rlcl9xdWV1ZShycSwga29iamVjdF9uYW1lKHJxLT5rb2JqLnBhcmVudCkpOworCWVsc2UKKwkJcmV0ID0gYnNnX3JlZ2lzdGVyX3F1ZXVlKHJxLCBrb2JqZWN0X25hbWUoJnNkcC0+c2Rldl9nZW5kZXYua29iaikpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJzZ19yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xfZGV2LCBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbF9pbnRmKQoreworCWJzZ191bnJlZ2lzdGVyX3F1ZXVlKHRvX3Njc2lfZGV2aWNlKGNsX2Rldi0+ZGV2KS0+cmVxdWVzdF9xdWV1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlIGJzZ19pbnRmID0geworCS5hZGQJPSBic2dfYWRkLAorCS5yZW1vdmUJPSBic2dfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBjZGV2IGJzZ19jZGV2ID0geworCS5rb2JqICAgPSB7Lm5hbWUgPSAiYnNnIiwgfSwKKwkub3duZXIgID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBic2dfaW5pdCh2b2lkKQoreworCWludCByZXQsIGk7CisKKwlic2dfY21kX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJic2dfY21kIiwKKwkJCQlzaXplb2Yoc3RydWN0IGJzZ19jb21tYW5kKSwgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKCFic2dfY21kX2NhY2hlcCkgeworCQlwcmludGsoS0VSTl9FUlIgImJzZzogZmFpbGVkIGNyZWF0aW5nIHNsYWIgY2FjaGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQlNHX0xJU1RfU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJmJzZ19kZXZpY2VfbGlzdFtpXSk7CisKKwlic2dfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJic2ciKTsKKwlpZiAoSVNfRVJSKGJzZ19jbGFzcykpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJcmV0dXJuIFBUUl9FUlIoYnNnX2NsYXNzKTsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKEJTR19NQUpPUiwgMCksIEJTR19NQVhfREVWUywgImJzZyIpOworCWlmIChyZXQpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNkZXZfaW5pdCgmYnNnX2NkZXYsICZic2dfZm9wcyk7CisJcmV0ID0gY2Rldl9hZGQoJmJzZ19jZGV2LCBNS0RFVihCU0dfTUFKT1IsIDApLCBCU0dfTUFYX0RFVlMpOworCWlmIChyZXQpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoQlNHX01BSk9SLCAwKSwgQlNHX01BWF9ERVZTKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzY3NpX3JlZ2lzdGVyX2ludGVyZmFjZSgmYnNnX2ludGYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJic2c6IGZhaWxlZCByZWdpc3RlciBzY3NpIGludGVyZmFjZSAlZFxuIiwgcmV0KTsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQl1bnJlZ2lzdGVyX2NocmRldihCU0dfTUFKT1IsICJic2ciKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyBsb2FkZWRcbiIsIGJzZ192ZXJzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiSmVucyBBeGJvZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbG9jayBsYXllciBTR1NJIGdlbmVyaWMgKHNnKSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworZGV2aWNlX2luaXRjYWxsKGJzZ19pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IGUwYWE0ZGEuLjk3NTVhM2MgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMTI1MSw5ICsxMjUxLDkgQEAKIHsKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAotCWNpYyA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfaW9jX3Bvb2wsIGdmcF9tYXNrLCBjZnFkLT5xdWV1ZS0+bm9kZSk7CisJY2ljID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNmcV9pb2NfcG9vbCwgZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQkJCQkJCWNmcWQtPnF1ZXVlLT5ub2RlKTsKIAlpZiAoY2ljKSB7Ci0JCW1lbXNldChjaWMsIDAsIHNpemVvZigqY2ljKSk7CiAJCWNpYy0+bGFzdF9lbmRfcmVxdWVzdCA9IGppZmZpZXM7CiAJCUlOSVRfTElTVF9IRUFEKCZjaWMtPnF1ZXVlX2xpc3QpOwogCQljaWMtPmR0b3IgPSBjZnFfZnJlZV9pb19jb250ZXh0OwpAQCAtMTM3NiwxNyArMTM3NiwxOSBAQAogCQkJICogZnJlZSBtZW1vcnkuCiAJCQkgKi8KIAkJCXNwaW5fdW5sb2NrX2lycShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jayk7Ci0JCQluZXdfY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwgZ2ZwX21hc2t8X19HRlBfTk9GQUlMLCBjZnFkLT5xdWV1ZS0+bm9kZSk7CisJCQluZXdfY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwKKwkJCQkJZ2ZwX21hc2sgfCBfX0dGUF9OT0ZBSUwgfCBfX0dGUF9aRVJPLAorCQkJCQljZnFkLT5xdWV1ZS0+bm9kZSk7CiAJCQlzcGluX2xvY2tfaXJxKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0gZWxzZSB7Ci0JCQljZnFxID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNmcV9wb29sLCBnZnBfbWFzaywgY2ZxZC0+cXVldWUtPm5vZGUpOworCQkJY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwKKwkJCQkJZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQkJCQljZnFkLT5xdWV1ZS0+bm9kZSk7CiAJCQlpZiAoIWNmcXEpCiAJCQkJZ290byBvdXQ7CiAJCX0KIAotCQltZW1zZXQoY2ZxcSwgMCwgc2l6ZW9mKCpjZnFxKSk7Ci0KIAkJUkJfQ0xFQVJfTk9ERSgmY2ZxcS0+cmJfbm9kZSk7CiAJCUlOSVRfTElTVF9IRUFEKCZjZnFxLT5maWZvKTsKIApAQCAtMjA3OSwxMiArMjA4MSwxMCBAQAogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZDsKIAotCWNmcWQgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpjZnFkKSwgR0ZQX0tFUk5FTCwgcS0+bm9kZSk7CisJY2ZxZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmNmcWQpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgcS0+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+ZGV2X3ByaXZhdGU7CkBAIC0xMzU3LDEyICsxMzU1LDEyIEBACiAJfQogfQogCi12b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3ZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaTgxMF9yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKIH0KIAotaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaTgxMF9kbWFfcXVpZXNjZW50KGRldik7CiAJcmV0dXJuIDA7CkBAIC0xMzk5LDcgKzEzOTcsNyBAQAogICogXHJldHVybnMKICAqIEEgdmFsdWUgb2YgMSBpcyBhbHdheXMgcmV0dXJlZCB0byBpbmRpY3RhdGUgZXZlcnkgaTgxMCBpcyBBR1AuCiAgKi8KLWludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oCmluZGV4IDJkZWI5MjUuLjYxNDk3N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJtLmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogCXVuc2lnbmVkIGludCBkaXJ0eTsKIAogCXVuc2lnbmVkIGludCBuYm94OwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tJODEwX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbSTgxMF9OUl9TQVJFQV9DTElQUkVDVFNdOwogCiAJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKIAkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCmluZGV4IGU2ZGY0OWYuLjY0ODgzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKQEAgLTc3LDggKzc3LDggQEAKIH0gZHJtX2k4MTBfcmluZ19idWZmZXJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MTBfcHJpdmF0ZSB7Ci0JZHJtX21hcF90ICpzYXJlYV9tYXA7Ci0JZHJtX21hcF90ICptbWlvX21hcDsKKwlzdHJ1Y3QgZHJtX21hcCAqc2FyZWFfbWFwOworCXN0cnVjdCBkcm1fbWFwICptbWlvX21hcDsKIAogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXY7CiAJZHJtX2k4MTBfcmluZ19idWZmZXJfdCByaW5nOwpAQCAtODgsNyArODgsNyBAQAogCiAJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CiAKLQlkcm1fYnVmX3QgKm1tYXBfYnVmZmVyOworCXN0cnVjdCBkcm1fYnVmICptbWFwX2J1ZmZlcjsKIAogCXUzMiBmcm9udF9kaTEsIGJhY2tfZGkxLCB6aTE7CiAKQEAgLTExNSwxNSArMTE1LDE1IEBACiB9IGRybV9pODEwX3ByaXZhdGVfdDsKIAogCQkJCS8qIGk4MTBfZG1hLmMgKi8KLWV4dGVybiBpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgaTgxMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBpODEwX2lvY3Rsc1tdOwogZXh0ZXJuIGludCBpODEwX21heF9pb2N0bDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYwppbmRleCAzMzE0YTlmLi5kYzIwYzFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCkBAIC00NywxNiArNDcsMTYgQEAKICNkZWZpbmUgSTgzMF9CVUZfVU5NQVBQRUQgMAogI2RlZmluZSBJODMwX0JVRl9NQVBQRUQgICAxCiAKLXN0YXRpYyBkcm1fYnVmX3QgKmk4MzBfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqaTgzMF9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAlpbnQgdXNlZDsKIAogCS8qIExpbmVhciBzZWFyY2ggbWlnaHQgbm90IGJlIHRoZSBiZXN0IHNvbHV0aW9uICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCQkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KIAkJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfRlJFRSwKQEAgLTcyLDcgKzcyLDcgQEAKICAqIHlldCwgdGhlIGhhcmR3YXJlIHVwZGF0ZXMgaW4gdXNlIGZvciB1cyBvbmNlIGl0cyBvbiB0aGUgcmluZyBidWZmZXIuCiAgKi8KIAotc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlpbnQgdXNlZDsKQEAgLTg5LDEwICs4OSwxMCBAQAogCiBzdGF0aWMgaW50IGk4MzBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC0xMjIsMTAgKzEyMiwxMCBAQAogCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAogfTsKIAotc3RhdGljIGludCBpODMwX21hcF9idWZmZXIoZHJtX2J1Zl90ICogYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICogYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wczsKQEAgLTE1Niw3ICsxNTYsNyBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfdW5tYXBfYnVmZmVyKGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgzMF91bm1hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWludCByZXRjb2RlID0gMDsKQEAgLTE3NiwxMCArMTc2LDEwIEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9kbWFfZ2V0X2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9pODMwX2RtYV90ICogZCwKK3N0YXRpYyBpbnQgaTgzMF9kbWFfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MzBfZG1hX3QgKiBkLAogCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJaW50IHJldGNvZGUgPSAwOwogCkBAIC0yMDYsOSArMjA2LDkgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODMwX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgzMF9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCiAJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQpAQCAtMjM4LDcgKzIzOCw3IEBACiAJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJCQlpZiAoYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsICYmIGJ1Zi0+dG90YWwpCiAJCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoJmJ1Zl9wcml2LT5tYXAsIGRldik7CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk4MzBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKK2ludCBpODMwX3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yODEsNyArMjgxLDcgQEAKIAlyZXR1cm4gaXRlcnM7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtMjk2LDkgKzI5Niw5IEBACiAJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk4MzBfQk9YX1JJTkdfRU1QVFk7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2k4MzBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MzBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgbXlfaWR4ID0gMzY7CiAJdTMyICpod19zdGF0dXMgPSAodTMyICopIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UgKyBteV9pZHgpOwogCWludCBpOwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlidWZfcHJpdi0+aW5fdXNlID0gaHdfc3RhdHVzKys7CkBAIC0zMzAsMTYgKzMzMCwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG1hX2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpODMwX2RtYV9pbml0aWFsaXplKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgICAgIGRybV9pODMwX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJICAgICAgIGRybV9pODMwX2luaXRfdCAqIGluaXQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAKIAltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1faTgzMF9wcml2YXRlX3QpKTsKIAotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwICYmCiAJCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgogCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLKSB7CkBAIC00NTUsOCArNDU0LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9kbWFfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAJZHJtX2k4MzBfaW5pdF90IGluaXQ7CiAJaW50IHJldGNvZGUgPSAwOwpAQCAtNDkwLDcgKzQ4OSw3IEBACiAvKiBNb3N0IGVmZmljaWVudCB3YXkgdG8gdmVyaWZ5IHN0YXRlIGZvciB0aGUgaTgzMCBpcyBhcyBpdCBpcwogICogZW1pdHRlZC4gIE5vbi1jb25mb3JtYW50IHN0YXRlIGlzIHNpbGVudGx5IGRyb3BwZWQuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBFbWl0Q29udGV4dFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgzMEVtaXRDb250ZXh0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgaiA9IDA7CkBAIC01MzUsNyArNTM0LDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgaiA9IDA7CkBAIC01NjksNyArNTY4LDcgQEAKIAkJcHJpbnRrKCJyZWplY3RlZCBwYWNrZXQgJXhcbiIsIGNvZGVbMF0pOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFRleEJsZW5kVmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhCbGVuZFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgdW5zaWduZWQgaW50ICpjb2RlLCB1bnNpZ25lZCBpbnQgbnVtKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNTk0LDcgKzU5Myw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0VGV4UGFsZXR0ZShkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCBpODMwRW1pdFRleFBhbGV0dGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgICAgICAgdW5zaWduZWQgaW50ICpwYWxldHRlLCBpbnQgbnVtYmVyLCBpbnQgaXNfc2hhcmVkKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNjIxLDcgKzYyMCw3IEBACiAKIC8qIE5lZWQgdG8gZG8gc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nIHdoZW4gc2V0dGluZyB0aGUgZGVzdCBidWZmZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBFbWl0RGVzdFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgzMEVtaXREZXN0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdG1wOwpAQCAtNjgyLDcgKzY4MSw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0U3RpcHBsZVZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgzMEVtaXRTdGlwcGxlVmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTY5Myw3ICs2OTIsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFN0YXRlKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBFbWl0U3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtNzk2LDcgKzc5NSw3IEBACiAgKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGZ1bmN0aW9ucwogICovCiAKLXN0YXRpYyB2b2lkIGk4MzBfZmlsbF9ib3goZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgzMF9maWxsX2JveChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCByLCBpbnQgZywgaW50IGIpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04MzQsNyArODMzLDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF9jcF9wZXJmb3JtYW5jZV9ib3hlcyhkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC04NzksNyArODc4LDcgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGZsYWdzLAorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBmbGFncywKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfenZhbCwKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2RlcHRobWFzaykKQEAgLTg4Nyw3ICs4ODYsNyBAQAogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJaW50IGNwcCA9IGRldl9wcml2LT5jcHA7CiAJaW50IGk7CkBAIC05NzQsMTIgKzk3MywxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJaW50IGNwcCA9IGRldl9wcml2LT5jcHA7CiAJaW50IGk7CkBAIC0xMDQ0LDcgKzEwNDMsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMTA4NywxMyArMTA4NiwxMyBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgICAgZHJtX2J1Zl90ICogYnVmLCBpbnQgZGlzY2FyZCwgaW50IHVzZWQpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX2NsaXBfcmVjdF90ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YnVzX2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHJlc3MgLSBkZXYtPmFncC0+YmFzZTsKQEAgLTExOTksNyArMTE5OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMTIxNiwxMCArMTIxNSwxMCBAQAogCWk4MzBfd2FpdF9yaW5nKGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9mbHVzaF9xdWV1ZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZmx1c2hfcXVldWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaSwgcmV0ID0gMDsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtMTIzMyw3ICsxMjMyLDcgQEAKIAlpODMwX3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4LCBfX0ZVTkNUSU9OX18pOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlpbnQgdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfSEFSRFdBUkUsCkBAIC0xMjQ5LDkgKzEyNDgsOSBAQAogfQogCiAvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgKi8KLXN0YXRpYyB2b2lkIGk4MzBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBpODMwX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAogCWlmICghZG1hKQpAQCAtMTI2NCw3ICsxMjYzLDcgQEAKIAlpODMwX2ZsdXNoX3F1ZXVlKGRldik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdikgewpAQCAtMTI4Miw4ICsxMjgxLDggQEAKIHN0YXRpYyBpbnQgaTgzMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKQEAgLTEyOTQsOSArMTI5Myw5IEBACiBzdGF0aWMgaW50IGk4MzBfZG1hX3ZlcnRleChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MzBfc2FyZWFfdCAqKQpAQCAtMTMyOCw4ICsxMzI3LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9jbGVhcl9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9jbGVhcl90IGNsZWFyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyCkBAIC0xMzUyLDggKzEzNTEsOCBAQAogc3RhdGljIGludCBpODMwX3N3YXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCURSTV9ERUJVRygiaTgzMF9zd2FwX2J1ZnNcbiIpOwogCkBAIC0xMzY1LDcgKzEzNjQsNyBAQAogCiAvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgogICovCi1zdGF0aWMgdm9pZCBpODMwX2RvX2luaXRfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9kb19pbml0X3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMzc1LDcgKzEzNzQsNyBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG9fY2xlYW51cF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZG9fY2xlYW51cF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTM5MCw4ICsxMzg5LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9mbGlwX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTQwOCw4ICsxNDA3LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9nZXRhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopCkBAIC0xNDIyLDggKzE0MjEsOCBAQAogc3RhdGljIGludCBpODMwX2dldGJ1ZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJaW50IHJldGNvZGUgPSAwOwogCWRybV9pODMwX2RtYV90IGQ7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE0NDQsNyArMTQ0Myw3IEBACiAJRFJNX0RFQlVHKCJpODMwX2RtYTogJWQgcmV0dXJuaW5nICVkLCBncmFudGVkID0gJWRcbiIsCiAJCSAgY3VycmVudC0+cGlkLCByZXRjb2RlLCBkLmdyYW50ZWQpOwogCi0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2RtYV90IF9fdXNlciAqKSBhcmcsICZkLCBzaXplb2YoZCkpKQorCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGFyZywgJmQsIHNpemVvZihkKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KWh3X3N0YXR1c1s1XTsKIApAQCAtMTQ2Nyw4ICsxNDY2LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9nZXRwYXJhbShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX2dldHBhcmFtX3QgcGFyYW07CiAJaW50IHZhbHVlOwpAQCAtMTUwMSw4ICsxNTAwLDggQEAKIHN0YXRpYyBpbnQgaTgzMF9zZXRwYXJhbShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NldHBhcmFtX3QgcGFyYW07CiAKQEAgLTE1MjYsNyArMTUyNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpODMwX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IGk4MzBfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAkvKiBpODMwIGhhcyA0IG1vcmUgY291bnRlcnMgKi8KIAlkZXYtPmNvdW50ZXJzICs9IDQ7CkBAIC0xNTM4LDEyICsxNTM3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWk4MzBfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE1NTMsMTIgKzE1NTIsMTIgQEAKIAl9CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpODMwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOwogfQogCi1pbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpODMwX2RtYV9xdWllc2NlbnQoZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTE1OTQsNyArMTU5Myw3IEBACiAgKiBccmV0dXJucwogICogQSB2YWx1ZSBvZiAxIGlzIGFsd2F5cyByZXR1cmVkIHRvIGluZGljdGF0ZSBldmVyeSBpOHh4IGlzIEFHUC4KICAqLwotaW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmgKaW5kZXggNjZkZDc1MC4uOTY4YTZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaApAQCAtMTkxLDcgKzE5MSw3IEBACiAJdW5zaWduZWQgaW50IGRpcnR5OwogCiAJdW5zaWduZWQgaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IGJveGVzW0k4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tJODMwX05SX1NBUkVBX0NMSVBSRUNUU107CiAKIAkvKiBNYWludGFpbiBhbiBMUlUgb2YgY29udGlndW91cyByZWdpb25zIG9mIHRleHR1cmUgc3BhY2UuICBJZgogCSAqIHlvdSB0aGluayB5b3Ugb3duIGEgcmVnaW9uIG9mIHRleHR1cmUgbWVtb3J5LCBhbmQgaXQgaGFzIGFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKaW5kZXggZTkxZjk0YS4uZGRkYTY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApAQCAtODQsOCArODQsOCBAQAogfSBkcm1faTgzMF9yaW5nX2J1ZmZlcl90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9wcml2YXRlIHsKLQlkcm1fbWFwX3QgKnNhcmVhX21hcDsKLQlkcm1fbWFwX3QgKm1taW9fbWFwOworCXN0cnVjdCBkcm1fbWFwICpzYXJlYV9tYXA7CisJc3RydWN0IGRybV9tYXAgKm1taW9fbWFwOwogCiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdjsKIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90IHJpbmc7CkBAIC05NSw3ICs5NSw3IEBACiAKIAlkbWFfYWRkcl90IGRtYV9zdGF0dXNfcGFnZTsKIAotCWRybV9idWZfdCAqbW1hcF9idWZmZXI7CisJc3RydWN0IGRybV9idWYgKm1tYXBfYnVmZmVyOwogCiAJdTMyIGZyb250X2RpMSwgYmFja19kaTEsIHppMTsKIApAQCAtMTMyLDE2ICsxMzIsMTYgQEAKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKIGV4dGVybiBpcnFyZXR1cm5fdCBpODMwX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGludCBpODMwX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKICNkZWZpbmUgSTgzMF9SRUFEKHJlZykgICAgICAgICAgRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZykKICNkZWZpbmUgSTgzMF9XUklURShyZWcsdmFsKSAgICAgRFJNX1dSSVRFMzIoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcsIHZhbCkKQEAgLTE4MCw3ICsxODAsNyBAQAogCUk4MzBfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CQkJXAogfSB3aGlsZSgwKQogCi1leHRlcm4gaW50IGk4MzBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CitleHRlcm4gaW50IGk4MzBfd2FpdF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKIAogI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQogI2RlZmluZSBHRlhfT1BfQlJFQUtQT0lOVF9JTlRFUlJVUFQJKCgwPDwyOSl8KDE8PDIzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYwppbmRleCA1ODQxZjc2Li5hMWI1YzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCkBAIC0zNSw3ICszNSw3IEBACiAKIGlycXJldHVybl90IGk4MzBfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTE2IHRlbXA7CiAKQEAgLTUzLDcgKzUzLDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZW1pdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC03MCw3ICs3MCw3IEBACiAJcmV0dXJuIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+aXJxX2VtaXR0ZWQpOwogfQogCi1zdGF0aWMgaW50IGk4MzBfd2FpdF9pcnEoZHJtX2RldmljZV90ICogZGV2LCBpbnQgaXJxX25yKQorc3RhdGljIGludCBpODMwX3dhaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgaXJxX25yKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwpAQCAtMTE3LDggKzExNyw4IEBACiBpbnQgaTgzMF9pcnFfZW1pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX2lycV9lbWl0X3QgZW1pdDsKIAlpbnQgcmVzdWx0OwpAQCAtMTQ5LDggKzE0OSw4IEBACiBpbnQgaTgzMF9pcnFfd2FpdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX2lycV93YWl0X3QgaXJxd2FpdDsKIApAQCAtMTY4LDcgKzE2OCw3IEBACiAKIC8qIGRybV9kbWEuaCBob29rcwogKi8KLXZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xODAsMTQgKzE4MCwxNCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldl9wcml2LT5pcnFfcXVldWUpOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJSTgzMF9XUklURTE2KEk4MzBSRUdfSU5UX0VOQUJMRV9SLCAweDIpOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaWYgKCFkZXZfcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwppbmRleCBlYTUyNzQwYS4uMzM1OWNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwpAQCAtNDcsNyArNDcsNyBAQAogICogdGhlIGhlYWQgcG9pbnRlciBjaGFuZ2VzLCBzbyB0aGF0IEVCVVNZIG9ubHkgaGFwcGVucyBpZiB0aGUgcmluZwogICogYWN0dWFsbHkgc3RhbGxzIGZvciAoZWcpIDMgc2Vjb25kcy4KICAqLwotaW50IGk5MTVfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKK2ludCBpOTE1X3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC03Myw3ICs3Myw3IEBACiAJcmV0dXJuIERSTV9FUlIoRUJVU1kpOwogfQogCi12b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC04OCw3ICs4OCw3IEBACiAJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk5MTVfQk9YX1JJTkdfRU1QVFk7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCiAJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQpAQCAtMTI2LDEzICsxMjYsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpOTE1X2luaXRpYWxpemUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgICBkcm1faTkxNV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCSAgIGRybV9pOTE1X2luaXRfdCAqIGluaXQpCiB7CiAJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k5MTVfcHJpdmF0ZV90KSk7CiAKLQlEUk1fR0VUU0FSRUEoKTsKKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBzYXJlYSFcbiIpOwogCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKQEAgLTIxMSw3ICsyMTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZG1hX3Jlc3VtZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfZG1hX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0zNTcsNyArMzU3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGk5MTVfZW1pdF9jbWRzKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IF9fdXNlciAqIGJ1ZmZlciwgaW50IGR3b3JkcykKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2NtZHMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBfX3VzZXIgKiBidWZmZXIsIGludCBkd29yZHMpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CkBAIC0zOTYsMTIgKzM5NiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZW1pdF9ib3goZHJtX2RldmljZV90ICogZGV2LAotCQkJIGRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKiBib3hlcywKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2JveChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKiBib3hlcywKIAkJCSBpbnQgaSwgaW50IERSMSwgaW50IERSNCkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgYm94OworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveDsKIAlSSU5HX0xPQ0FMUzsKIAogCWlmIChEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZib3gsICZib3hlc1tpXSwgc2l6ZW9mKGJveCkpKSB7CkBAIC00MzksNyArNDM5LDcgQEAKICAqIGVtaXQuIEZvciBub3csIGRvIGl0IGluIGJvdGggcGxhY2VzOgogICovCiAKLXN0YXRpYyB2b2lkIGk5MTVfZW1pdF9icmVhZGNydW1iKGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIHZvaWQgaTkxNV9lbWl0X2JyZWFkY3J1bWIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9jbWRidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgZHJtX2k5MTVfY21kYnVmZmVyX3QgKiBjbWQpCiB7CiAJaW50IG5ib3ggPSBjbWQtPm51bV9jbGlwcmVjdHM7CkBAIC00ODksMTEgKzQ4OSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfYmF0Y2hidWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCAqIGJhdGNoKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzID0gYmF0Y2gtPmNsaXByZWN0czsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmJveGVzID0gYmF0Y2gtPmNsaXByZWN0czsKIAlpbnQgbmJveCA9IGJhdGNoLT5udW1fY2xpcHJlY3RzOwogCWludCBpID0gMCwgY291bnQ7CiAJUklOR19MT0NBTFM7CkBAIC01MzUsNyArNTM1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC01ODMsNyArNTgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC02MjUsNyArNjI1LDcgQEAKIAogCWlmIChiYXRjaC5udW1fY2xpcHJlY3RzICYmIERSTV9WRVJJRllBUkVBX1JFQUQoYmF0Y2guY2xpcHJlY3RzLAogCQkJCQkJICAgICAgIGJhdGNoLm51bV9jbGlwcmVjdHMgKgotCQkJCQkJICAgICAgIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkKKwkJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpKSkKIAkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAogCXJldCA9IGk5MTVfZGlzcGF0Y2hfYmF0Y2hidWZmZXIoZGV2LCAmYmF0Y2gpOwpAQCAtNjU1LDcgKzY1NSw3IEBACiAJaWYgKGNtZGJ1Zi5udW1fY2xpcHJlY3RzICYmCiAJICAgIERSTV9WRVJJRllBUkVBX1JFQUQoY21kYnVmLmNsaXByZWN0cywKIAkJCQljbWRidWYubnVtX2NsaXByZWN0cyAqCi0JCQkJc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKSB7CisJCQkJc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSkpIHsKIAkJRFJNX0VSUk9SKCJGYXVsdCBhY2Nlc3NpbmcgY2xpcHJlY3RzXG4iKTsKIAkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAl9CkBAIC03OTIsNyArNzkyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk5MTVfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCS8qIGk5MTUgaGFzIDQgbW9yZSBjb3VudGVycyAqLwogCWRldi0+Y291bnRlcnMgKz0gNDsKQEAgLTgwNCw3ICs4MDQsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTgxMyw3ICs4MTMsNyBAQAogCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTg1NCw3ICs4NTQsNyBAQAogICogXHJldHVybnMKICAqIEEgdmFsdWUgb2YgMSBpcyBhbHdheXMgcmV0dXJlZCB0byBpbmRpY3RhdGUgZXZlcnkgaTl4NSBpcyBBR1AuCiAgKi8KLWludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCmluZGV4IDdiN2I2OGIuLjA1YzY2Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKQEAgLTY0LDcgKzY0LDcgQEAKIH0gZHJtX2k5MTVfaW5pdF90OwogCiB0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfc2FyZWEgewotCWRybV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtJOTE1X05SX1RFWF9SRUdJT05TICsgMV07CisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleExpc3RbSTkxNV9OUl9URVhfUkVHSU9OUyArIDFdOwogCWludCBsYXN0X3VwbG9hZDsJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCiAJaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLwogCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KQEAgLTE3MCw3ICsxNzAsNyBAQAogCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KIAlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KIAlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLwogfSBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90OwogCiAvKiBBcyBhYm92ZSwgYnV0IHBhc3MgYSBwb2ludGVyIHRvIHVzZXJzcGFjZSBidWZmZXIgd2hpY2ggY2FuIGJlCkBAIC0xODIsNyArMTgyLDcgQEAKIAlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCiAJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCiAJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KIH0gZHJtX2k5MTVfY21kYnVmZmVyX3Q7CiAKIC8qIFVzZXJzcGFjZSBjYW4gcmVxdWVzdCAmIHdhaXQgb24gaXJxJ3M6CkBAIC0yNTksNyArMjU5LDcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfdmJsYW5rX3N3YXAgewogCWRybV9kcmF3YWJsZV90IGRyYXdhYmxlOwotCWRybV92Ymxhbmtfc2VxX3R5cGVfdCBzZXF0eXBlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSBzZXF0eXBlOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIH0gZHJtX2k5MTVfdmJsYW5rX3N3YXBfdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCmluZGV4IDg1ZTMyM2EuLmZkOTE4NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKQEAgLTEyMCwxMSArMTIwLDExIEBACiBleHRlcm4gaW50IGk5MTVfbWF4X2lvY3RsOwogCiAJCQkJLyogaTkxNV9kbWEuYyAqLwotZXh0ZXJuIHZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGludCBpOTE1X2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7Ci1leHRlcm4gaW50IGk5MTVfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiBpbnQgaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gbG9uZyBpOTE1X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIApAQCAtMTMyLDEyICsxMzIsMTIgQEAKIGV4dGVybiBpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfaXJxX3dhaXQoRFJNX0lPQ1RMX0FSR1MpOwogCi1leHRlcm4gaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKLWV4dGVybiBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQyKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0MihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGludCBpOTE1X3ZibGFua19waXBlX3NldChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3BpcGVfZ2V0KERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgaTkxNV92Ymxhbmtfc3dhcChEUk1fSU9DVExfQVJHUyk7CkBAIC0xNDgsNyArMTQ4LDcgQEAKIGV4dGVybiBpbnQgaTkxNV9tZW1faW5pdF9oZWFwKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgaTkxNV9tZW1fZGVzdHJveV9oZWFwKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiB2b2lkIGk5MTVfbWVtX3Rha2Vkb3duKHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwKTsKLWV4dGVybiB2b2lkIGk5MTVfbWVtX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIHZvaWQgaTkxNV9tZW1fcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgICAgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKTsKIAogI2RlZmluZSBJOTE1X1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgKHJlZykpCkBAIC0xODgsNyArMTg4LDcgQEAKIAlJOTE1X1dSSVRFKExQX1JJTkcgKyBSSU5HX1RBSUwsIG91dHJpbmcpOwkJCVwKIH0gd2hpbGUoMCkKIAotZXh0ZXJuIGludCBpOTE1X3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpOworZXh0ZXJuIGludCBpOTE1X3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CiAKICNkZWZpbmUgR0ZYX09QX1VTRVJfSU5URVJSVVBUIAkJKCgwPDwyOSl8KDI8PDIzKSkKICNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKaW5kZXggYjkyMDYyYS4uNGI0YjJjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwpAQCAtNDIsNyArNDIsNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgSFcgbG9jayBoZWxkLgogICovCi1zdGF0aWMgdm9pZCBpOTE1X3ZibGFua190YXNrbGV0KGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIHZvaWQgaTkxNV92YmxhbmtfdGFza2xldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKQEAgLTUwLDcgKzUwLDcgQEAKIAlpbnQgbmhpdHMsIG5yZWN0cywgc2xpY2VbMl0sIHVwcGVyWzJdLCBsb3dlclsyXSwgaTsKIAl1bnNpZ25lZCBjb3VudGVyWzJdID0geyBhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQpLAogCQkJCWF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZDIpIH07Ci0JZHJtX2RyYXdhYmxlX2luZm9fdCAqZHJ3OworCXN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyAqZHJ3OwogCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAl1MzIgY3BwID0gZGV2X3ByaXYtPmNwcDsKIAl1MzIgY21kID0gKGNwcCA9PSA0KSA/IChYWV9TUkNfQ09QWV9CTFRfQ01EIHwKQEAgLTk1LDcgKzk1LDcgQEAKIAkJbGlzdF9mb3JfZWFjaChoaXQsICZoaXRzKSB7CiAJCQlkcm1faTkxNV92Ymxfc3dhcF90ICpzd2FwX2NtcCA9CiAJCQkJbGlzdF9lbnRyeShoaXQsIGRybV9pOTE1X3ZibF9zd2FwX3QsIGhlYWQpOwotCQkJZHJtX2RyYXdhYmxlX2luZm9fdCAqZHJ3X2NtcCA9CisJCQlzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmRyd19jbXAgPQogCQkJCWRybV9nZXRfZHJhd2FibGVfaW5mbyhkZXYsIHN3YXBfY21wLT5kcndfaWQpOwogCiAJCQlpZiAoZHJ3X2NtcCAmJgpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCWxpc3RfZm9yX2VhY2goaGl0LCAmaGl0cykgewogCQkJZHJtX2k5MTVfdmJsX3N3YXBfdCAqc3dhcF9oaXQgPQogCQkJCWxpc3RfZW50cnkoaGl0LCBkcm1faTkxNV92Ymxfc3dhcF90LCBoZWFkKTsKLQkJCWRybV9jbGlwX3JlY3RfdCAqcmVjdDsKKwkJCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpyZWN0OwogCQkJaW50IG51bV9yZWN0cywgcGlwZTsKIAkJCXVuc2lnbmVkIHNob3J0IHRvcCwgYm90dG9tOwogCkBAIC0yMTEsNyArMjExLDcgQEAKIAogaXJxcmV0dXJuX3QgaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MTYgdGVtcDsKIApAQCAtMjU3LDcgKzI1Nyw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2VtaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJcmV0dXJuIGRldl9wcml2LT5jb3VudGVyOwogfQogCi1zdGF0aWMgaW50IGk5MTVfd2FpdF9pcnEoZHJtX2RldmljZV90ICogZGV2LCBpbnQgaXJxX25yKQorc3RhdGljIGludCBpOTE1X3dhaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgaXJxX25yKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldCA9IDA7CkBAIC0zMDksNyArMzA5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGk5MTVfZHJpdmVyX3ZibGFua19kb193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlLAorc3RhdGljIGludCBpOTE1X2RyaXZlcl92YmxhbmtfZG9fd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlLAogCQkJCSAgICAgIGF0b21pY190ICpjb3VudGVyKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzMxLDEyICszMzEsMTIgQEAKIH0KIAogCi1pbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAlyZXR1cm4gaTkxNV9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoZGV2LCBzZXF1ZW5jZSwgJmRldi0+dmJsX3JlY2VpdmVkKTsKIH0KIAotaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0Mihkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK2ludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdDIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAlyZXR1cm4gaTkxNV9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoZGV2LCBzZXF1ZW5jZSwgJmRldi0+dmJsX3JlY2VpdmVkMik7CiB9CkBAIC0zODksNyArMzg5LDcgQEAKIAlyZXR1cm4gaTkxNV93YWl0X2lycShkZXYsIGlycXdhaXQuaXJxX3NlcSk7CiB9CiAKLXN0YXRpYyB2b2lkIGk5MTVfZW5hYmxlX2ludGVycnVwdCAoZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgdm9pZCBpOTE1X2VuYWJsZV9pbnRlcnJ1cHQgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MTYgZmxhZzsKQEAgLTU2OSw3ICs1NjksNyBAQAogCiAvKiBkcm1fZG1hLmggaG9va3MKICovCi12b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNTc4LDcgKzU3OCw3IEBACiAJSTkxNV9XUklURTE2KEk5MTVSRUdfSU5UX0VOQUJMRV9SLCAweDApOwogfQogCi12b2lkIGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC01OTIsNyArNTkyLDcgQEAKIAlEUk1fSU5JVF9XQUlUUVVFVUUoJmRldl9wcml2LT5pcnFfcXVldWUpOwogfQogCi12b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTE2IHRlbXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKaW5kZXggNTJjNjczMi4uNTBiNGJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwpAQCAtNDMsMTEgKzQzLDExIEBACiAgKiBibG9jayB0byBhbGxvY2F0ZSwgYW5kIHRoZSByaW5nIGlzIGRyYWluZWQgcHJpb3IgdG8gYWxsb2NhdGlvbnMgLS0KICAqIGluIG90aGVyIHdvcmRzIGFsbG9jYXRpb24gaXMgZXhwZW5zaXZlLgogICovCi1zdGF0aWMgdm9pZCBtYXJrX2Jsb2NrKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IG1lbV9ibG9jayAqcCwgaW50IGluX3VzZSkKK3N0YXRpYyB2b2lkIG1hcmtfYmxvY2soc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBtZW1fYmxvY2sgKnAsIGludCBpbl91c2UpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k5MTVfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV90ZXhfcmVnaW9uX3QgKmxpc3Q7CisJc3RydWN0IGRybV90ZXhfcmVnaW9uICpsaXN0OwogCXVuc2lnbmVkIHNoaWZ0LCBucjsKIAl1bnNpZ25lZCBzdGFydDsKIAl1bnNpZ25lZCBlbmQ7CkBAIC0yMDgsNyArMjA4LDcgQEAKIAogLyogRnJlZSBhbGwgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzaW5nIGZpbGUuCiAgKi8KLXZvaWQgaTkxNV9tZW1fcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCkKK3ZvaWQgaTkxNV9tZW1fcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKQogewogCXN0cnVjdCBtZW1fYmxvY2sgKnA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKaW5kZXggYzJhNGJhYy4uOWM3M2E2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogI2RlZmluZSBNSU5JTUFMX0NMRUFOVVAgMAogI2RlZmluZSBGVUxMX0NMRUFOVVAgMQotc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoZHJtX2RldmljZV90ICpkZXYsIGludCBmdWxsX2NsZWFudXApOworc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGZ1bGxfY2xlYW51cCk7CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEVuZ2luZSBjb250cm9sCkBAIC0yMjQsNyArMjI0LDcgQEAKICNkZWZpbmUgTUdBX0JVRkZFUl9GUkVFCQkwCiAKICNpZiBNR0FfRlJFRUxJU1RfREVCVUcKLXN0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9wcmludChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcHJpbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OwpAQCAtMjQ1LDEwICsyNDUsMTAgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IG1nYV9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBpbnQgbWdhX2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX21nYV9mcmVlbGlzdF90ICplbnRyeTsKIAlpbnQgaTsKQEAgLTI5MSw3ICsyOTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CkBAIC0zMTEsMTAgKzMxMSwxMCBAQAogI2lmIDAKIC8qIEZJWE1FOiBTdGlsbCBuZWVkZWQ/CiAgKi8KLXN0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9yZXNldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJaW50IGk7CiAKQEAgLTMyNiw3ICszMjYsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBkcm1fYnVmX3QgKm1nYV9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHN0cnVjdCBkcm1fYnVmICptZ2FfZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9mcmVlbGlzdF90ICpuZXh0OwpAQCAtMzU5LDcgKzM1OSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBtZ2FfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQoraW50IG1nYV9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CkBAIC0zOTMsNyArMzkzLDcgQEAKICAqIERNQSBpbml0aWFsaXphdGlvbiwgY2xlYW51cAogICovCiAKLWludCBtZ2FfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IG1nYV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAKQEAgLTQzNCw3ICs0MzQsNyBAQAogICoKICAqIFxzYSBtZ2FfZG9fZG1hX2Jvb3RzdHJhcCwgbWdhX2RvX3BjaV9kbWFfYm9vdHN0cmFwCiAgKi8KLXN0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqY29uc3QgZGV2X3ByaXYgPQpAQCAtNDQ1LDExICs0NDUsMTEgQEAKIAljb25zdCB1bnNpZ25lZCBzZWNvbmRhcnlfc2l6ZSA9IGRtYV9icy0+c2Vjb25kYXJ5X2Jpbl9jb3VudAogCSAgICAqIGRtYV9icy0+c2Vjb25kYXJ5X2Jpbl9zaXplOwogCWNvbnN0IHVuc2lnbmVkIGFncF9zaXplID0gKGRtYV9icy0+YWdwX3NpemUgPDwgMjApOwotCWRybV9idWZfZGVzY190IHJlcTsKLQlkcm1fYWdwX21vZGVfdCBtb2RlOwotCWRybV9hZ3BfaW5mb190IGluZm87Ci0JZHJtX2FncF9idWZmZXJfdCBhZ3BfcmVxOwotCWRybV9hZ3BfYmluZGluZ190IGJpbmRfcmVxOworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgcmVxOworCXN0cnVjdCBkcm1fYWdwX21vZGUgbW9kZTsKKwlzdHJ1Y3QgZHJtX2FncF9pbmZvIGluZm87CisJc3RydWN0IGRybV9hZ3BfYnVmZmVyIGFncF9yZXE7CisJc3RydWN0IGRybV9hZ3BfYmluZGluZyBiaW5kX3JlcTsKIAogCS8qIEFjcXVpcmUgQUdQLiAqLwogCWVyciA9IGRybV9hZ3BfYWNxdWlyZShkZXYpOwpAQCAtNTQ4LDEwICs1NDgsMTAgQEAKIAl9CiAKIAl7Ci0JCWRybV9tYXBfbGlzdF90ICpfZW50cnk7CisJCXN0cnVjdCBkcm1fbWFwX2xpc3QgKl9lbnRyeTsKIAkJdW5zaWduZWQgbG9uZyBhZ3BfdG9rZW4gPSAwOwogCQkKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJCWlmIChfZW50cnktPm1hcCA9PSBkZXYtPmFncF9idWZmZXJfbWFwKQogCQkJCWFncF90b2tlbiA9IF9lbnRyeS0+dXNlcl90b2tlbjsKIAkJfQpAQCAtNTg4LDcgKzU4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAjZWxzZQotc3RhdGljIGludCBtZ2FfZG9fYWdwX2RtYV9ib290c3RyYXAoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBtZ2FfZG9fYWdwX2RtYV9ib290c3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgIGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICogZG1hX2JzKQogewogCXJldHVybiAtRUlOVkFMOwpAQCAtNjA5LDcgKzYwOSw3IEBACiAgKgogICogXHNhIG1nYV9kb19kbWFfYm9vdHN0cmFwLCBtZ2FfZG9fYWdwX2RtYV9ib290c3RyYXAKICAqLwotc3RhdGljIGludCBtZ2FfZG9fcGNpX2RtYV9ib290c3RyYXAoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBtZ2FfZG9fcGNpX2RtYV9ib290c3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgIGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICogZG1hX2JzKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpjb25zdCBkZXZfcHJpdiA9CkBAIC02MTgsNyArNjE4LDcgQEAKIAl1bnNpZ25lZCBpbnQgcHJpbWFyeV9zaXplOwogCXVuc2lnbmVkIGludCBiaW5fY291bnQ7CiAJaW50IGVycjsKLQlkcm1fYnVmX2Rlc2NfdCByZXE7CisJc3RydWN0IGRybV9idWZfZGVzYyByZXE7CiAKIAlpZiAoZGV2LT5kbWEgPT0gTlVMTCkgewogCQlEUk1fRVJST1IoImRldi0+ZG1hIGlzIE5VTExcbiIpOwpAQCAtNjk5LDcgKzY5OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWdhX2RvX2RtYV9ib290c3RyYXAoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBtZ2FfZG9fZG1hX2Jvb3RzdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQlkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKIHsKIAljb25zdCBpbnQgaXNfYWdwID0gKGRtYV9icy0+YWdwX21vZGUgIT0gMCkgJiYgZHJtX2RldmljZV9pc19hZ3AoZGV2KTsKQEAgLTc5Myw3ICs3OTMsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbWdhX2RvX2luaXRfZG1hKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX21nYV9pbml0X3QgKiBpbml0KQorc3RhdGljIGludCBtZ2FfZG9faW5pdF9kbWEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tZ2FfaW5pdF90ICogaW5pdCkKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAJaW50IHJldDsKQEAgLTgyMyw4ICs4MjMsNyBAQAogCWRldl9wcml2LT50ZXh0dXJlX29mZnNldCA9IGluaXQtPnRleHR1cmVfb2Zmc2V0WzBdOwogCWRldl9wcml2LT50ZXh0dXJlX3NpemUgPSBpbml0LT50ZXh0dXJlX3NpemVbMF07CiAKLQlEUk1fR0VUU0FSRUEoKTsKLQorCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIGZpbmQgc2FyZWEhXG4iKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKQEAgLTkzNCw3ICs5MzMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZ1bGxfY2xlYW51cCkKK3N0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBmdWxsX2NsZWFudXApCiB7CiAJaW50IGVyciA9IDA7CiAJRFJNX0RFQlVHKCJcbiIpOwpAQCAtOTYzLDggKzk2Miw4IEBACiAJCWlmIChkZXZfcHJpdi0+dXNlZF9uZXdfZG1hX2luaXQpIHsKICNpZiBfX09TX0hBU19BR1AKIAkJCWlmIChkZXZfcHJpdi0+YWdwX2hhbmRsZSAhPSAwKSB7Ci0JCQkJZHJtX2FncF9iaW5kaW5nX3QgdW5iaW5kX3JlcTsKLQkJCQlkcm1fYWdwX2J1ZmZlcl90IGZyZWVfcmVxOworCQkJCXN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgdW5iaW5kX3JlcTsKKwkJCQlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgZnJlZV9yZXE7CiAKIAkJCQl1bmJpbmRfcmVxLmhhbmRsZSA9IGRldl9wcml2LT5hZ3BfaGFuZGxlOwogCQkJCWRybV9hZ3BfdW5iaW5kKGRldiwgJnVuYmluZF9yZXEpOwpAQCAtMTA0MSwxMSArMTA0MCwxMSBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2xvY2tfdCBsb2NrOworCXN0cnVjdCBkcm1fbG9jayBsb2NrOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobG9jaywgKGRybV9sb2NrX3QgX191c2VyICopIGRhdGEsCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGxvY2ssIChzdHJ1Y3QgZHJtX2xvY2sgX191c2VyICopIGRhdGEsCiAJCQkJIHNpemVvZihsb2NrKSk7CiAKIAlEUk1fREVCVUcoIiVzJXMlc1xuIiwKQEAgLTEwODcsOSArMTA4Niw5IEBACiAgKiBETUEgYnVmZmVyIG1hbmFnZW1lbnQKICAqLwogCi1zdGF0aWMgaW50IG1nYV9kbWFfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9kbWFfdCAqIGQpCitzdGF0aWMgaW50IG1nYV9kbWFfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9kbWEgKiBkKQogewotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSBkLT5ncmFudGVkX2NvdW50OyBpIDwgZC0+cmVxdWVzdF9jb3VudDsgaSsrKSB7CkBAIC0xMTE0LDEwICsxMTEzLDEwIEBACiBpbnQgbWdhX2RtYV9idWZmZXJzKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZG1hX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKLQlkcm1fZG1hX3QgZDsKKwlzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCXN0cnVjdCBkcm1fZG1hIGQ7CiAJaW50IHJldCA9IDA7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKQEAgLTExNTYsNyArMTE1NSw3IEBACiAvKioKICAqIENhbGxlZCBqdXN0IGJlZm9yZSB0aGUgbW9kdWxlIGlzIHVubG9hZGVkLgogICovCi1pbnQgbWdhX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICogZGV2KQoraW50IG1nYV9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9mcmVlKGRldi0+ZGV2X3ByaXZhdGUsIHNpemVvZihkcm1fbWdhX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKIAlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKQEAgLTExNjcsMTIgKzExNjYsMTIgQEAKIC8qKgogICogQ2FsbGVkIHdoZW4gdGhlIGxhc3Qgb3BlbmVyIG9mIHRoZSBkZXZpY2UgaXMgY2xvc2VkLgogICovCi12b2lkIG1nYV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgbWdhX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJbWdhX2RvX2NsZWFudXBfZG1hKGRldiwgRlVMTF9DTEVBTlVQKTsKIH0KIAotaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJcmV0dXJuIG1nYV9kb193YWl0X2Zvcl9pZGxlKGRldl9wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJtLmgKaW5kZXggNDRkMTI5My4uOTQ0YjUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJtLmgKQEAgLTE4MSw3ICsxODEsNyBAQAogCiAJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgogCSAqLwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAl1bnNpZ25lZCBpbnQgbmJveDsKIAogCS8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgM2QgZHJhd2FibGUuICBUaGUKQEAgLTIwMiw3ICsyMDIsNyBAQAogCXVuc2lnbmVkIGludCBleHBvcnRlZF9uYmFjazsKIAlpbnQgZXhwb3J0ZWRfYmFja194LCBleHBvcnRlZF9mcm9udF94LCBleHBvcnRlZF93OwogCWludCBleHBvcnRlZF9iYWNrX3ksIGV4cG9ydGVkX2Zyb250X3ksIGV4cG9ydGVkX2g7Ci0JZHJtX2NsaXBfcmVjdF90IGV4cG9ydGVkX2JveGVzW01HQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGV4cG9ydGVkX2JveGVzW01HQV9OUl9TQVJFQV9DTElQUkVDVFNdOwogCiAJLyogQ291bnRlcnMgZm9yIGFnaW5nIHRleHR1cmVzIGFuZCBmb3IgY2xpZW50LXNpZGUgdGhyb3R0bGluZy4KIAkgKi8KQEAgLTIxNiw3ICsyMTYsNyBAQAogCiAJLyogTFJVIGxpc3RzIGZvciB0ZXh0dXJlIG1lbW9yeSBpbiBhZ3Agc3BhY2UgYW5kIG9uIHRoZSBjYXJkLgogCSAqLwotCWRybV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtNR0FfTlJfVEVYX0hFQVBTXVtNR0FfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4TGlzdFtNR0FfTlJfVEVYX0hFQVBTXVtNR0FfTlJfVEVYX1JFR0lPTlMgKyAxXTsKIAl1bnNpZ25lZCBpbnQgdGV4QWdlW01HQV9OUl9URVhfSEVBUFNdOwogCiAJLyogTWVjaGFuaXNtIHRvIHZhbGlkYXRlIGNhcmQgc3RhdGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCmluZGV4IGJlNDlkYmIuLjU1NzI5MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCkBAIC0zNiw3ICszNiw3IEBACiAKICNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCiAKLXN0YXRpYyBpbnQgbWdhX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CitzdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAltZ2FfUENJX0lEUwpAQCAtMTE4LDcgKzExOCw3IEBACiAgKiBccmV0dXJucwogICogSWYgdGhlIGRldmljZSBpcyBhIFBDSSBHNDUwLCB6ZXJvIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIDIgaXMgcmV0dXJuZWQuCiAgKi8KLXN0YXRpYyBpbnQgbWdhX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgbWdhX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWNvbnN0IHN0cnVjdCBwY2lfZGV2ICpjb25zdCBwZGV2ID0gZGV2LT5wZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCmluZGV4IDZiMGM1MzEuLjQ5MjUzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCkBAIC02NSw3ICs2NSw3IEBACiAJc3RydWN0IGRybV9tZ2FfZnJlZWxpc3QgKm5leHQ7CiAJc3RydWN0IGRybV9tZ2FfZnJlZWxpc3QgKnByZXY7CiAJZHJtX21nYV9hZ2VfdCBhZ2U7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIH0gZHJtX21nYV9mcmVlbGlzdF90OwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xNTcsMTAgKzE1NywxMCBAQAogZXh0ZXJuIGludCBtZ2FfZG1hX2ZsdXNoKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgbWdhX2RtYV9yZXNldChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IG1nYV9kbWFfYnVmZmVycyhEUk1fSU9DVExfQVJHUyk7Ci1leHRlcm4gaW50IG1nYV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gaW50IG1nYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKIGV4dGVybiBpbnQgbWdhX2RvX3dhaXRfZm9yX2lkbGUoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV93cmFwX3N0YXJ0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV93cmFwX2VuZChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIAotZXh0ZXJuIGludCBtZ2FfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKTsKK2V4dGVybiBpbnQgbWdhX2ZyZWVsaXN0X3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpOwogCiAJCQkJLyogbWdhX3dhcnAuYyAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCBtZ2Ffd2FycF9taWNyb2NvZGVfc2l6ZShjb25zdCBkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKQEAgLTE3NiwxMiArMTc2LDEyIEBACiBleHRlcm4gaW50IG1nYV93YXJwX2luaXQoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiAKIAkJCQkvKiBtZ2FfaXJxLmMgKi8KLWV4dGVybiBpbnQgbWdhX2RyaXZlcl9mZW5jZV93YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7Ci1leHRlcm4gaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl9mZW5jZV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiBleHRlcm4gaXJxcmV0dXJuX3QgbWdhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGxvbmcgbWdhX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCmluZGV4IGViOTY0NDAuLjkzMDJjYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCkBAIC0zNyw3ICszNyw3IEBACiAKIGlycXJldHVybl90IG1nYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHN0YXR1czsKIAlpbnQgaGFuZGxlZCA9IDA7CkBAIC03OCw3ICs3OCw3IEBACiAJcmV0dXJuIElSUV9OT05FOwogfQogCi1pbnQgbWdhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgbWdhX2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKIAlpbnQgcmV0ID0gMDsKQEAgLTk2LDcgKzk2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbWdhX2RyaXZlcl9mZW5jZV93YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK2ludCBtZ2FfZHJpdmVyX2ZlbmNlX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgaW50IGN1cl9mZW5jZTsKQEAgLTExNSw3ICsxMTUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEyNSw3ICsxMjUsNyBAQAogCU1HQV9XUklURShNR0FfSUNMRUFSLCB+MCk7CiB9CiAKLXZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTM1LDcgKzEzNSw3IEBACiAJTUdBX1dSSVRFKE1HQV9JRU4sIE1HQV9WTElORUlFTiB8IE1HQV9TT0ZUUkFQRU4pOwogfQogCi12b2lkIG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpZiAoIWRldl9wcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMKaW5kZXggMjgzN2U2Ni4uZDQ0OGIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIAogc3RhdGljIHZvaWQgbWdhX2VtaXRfY2xpcF9yZWN0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICAgZHJtX2NsaXBfcmVjdF90ICogYm94KQorCQkJICAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogYm94KQogewogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwpAQCAtNDgwLDEyICs0ODAsMTIgQEAKICAqCiAgKi8KIAotc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9jbGVhcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9tZ2FfY2xlYXJfdCAqIGNsZWFyKQorc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX21nYV9jbGVhcl90ICogY2xlYXIpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAlpbnQgaTsKIAlETUFfTE9DQUxTOwpAQCAtNTAwLDcgKzUwMCw3IEBACiAJQURWQU5DRV9ETUEoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKLQkJZHJtX2NsaXBfcmVjdF90ICpib3ggPSAmcGJveFtpXTsKKwkJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveCA9ICZwYm94W2ldOwogCQl1MzIgaGVpZ2h0ID0gYm94LT55MiAtIGJveC0+eTE7CiAKIAkJRFJNX0RFQlVHKCIgICBmcm9tPSVkLCVkIHRvPSVkLCVkXG4iLApAQCAtNTY4LDEyICs1NjgsMTIgQEAKIAlGTFVTSF9ETUEoKTsKIH0KIAotc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9zd2FwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwogCWludCBpOwogCURNQV9MT0NBTFM7CkBAIC01OTgsNyArNTk4LDcgQEAKIAkJICBNR0FfUExOV1QsIDB4ZmZmZmZmZmYsIE1HQV9EV0dDVEwsIE1HQV9EV0dDVExfQ09QWSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7Ci0JCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gJnBib3hbaV07CisJCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3ggPSAmcGJveFtpXTsKIAkJdTMyIGhlaWdodCA9IGJveC0+eTIgLSBib3gtPnkxOwogCQl1MzIgc3RhcnQgPSBib3gtPnkxICogZGV2X3ByaXYtPmZyb250X3BpdGNoOwogCkBAIC02MjIsNyArNjIyLDcgQEAKIAlEUk1fREVCVUcoIiVzLi4uIGRvbmUuXG4iLCBfX0ZVTkNUSU9OX18pOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX3ZlcnRleChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtNjY5LDcgKzY2OSw3IEBACiAJRkxVU0hfRE1BKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfaW5kaWNlcyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZiwKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfaW5kaWNlcyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBlbmQpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTcxOCw3ICs3MTgsNyBAQAogLyogVGhpcyBjb3BpZXMgYSA2NCBieXRlIGFsaWduZWQgYWdwIHJlZ2lvbiB0byB0aGUgZnJhbWJ1ZmZlciB3aXRoIGEKICAqIHN0YW5kYXJkIGJsaXQsIHRoZSBpb2N0bCBuZWVkcyB0byBkbyBjaGVja2luZy4KICAqLwotc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9pbG9hZChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZiwKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfaWxvYWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmLAogCQkJCSAgIHVuc2lnbmVkIGludCBkc3RvcmcsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTc2NiwxMiArNzY2LDEyIEBACiAJRkxVU0hfRE1BKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfYmxpdChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9tZ2FfYmxpdF90ICogYmxpdCkKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX21nYV9ibGl0X3QgKiBibGl0KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CiAJdTMyIHNjYW5kaXIgPSAwLCBpOwogCURNQV9MT0NBTFM7CkBAIC04ODAsOCArODgwLDggQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX21nYV92ZXJ0ZXhfdCB2ZXJ0ZXg7CiAKQEAgLTkyMCw4ICs5MjAsOCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlkcm1fbWdhX2luZGljZXNfdCBpbmRpY2VzOwogCkBAIC05NTksOSArOTU5LDkgQEAKIHN0YXRpYyBpbnQgbWdhX2RtYV9pbG9hZChEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX21nYV9pbG9hZF90IGlsb2FkOwogCURSTV9ERUJVRygiXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYwppbmRleCAxMDE0NjAyLi5iMTYzZWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCkBAIC04MSw3ICs4MSw3IEBACiAJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAogfTsKIAotc3RhdGljIGludCBSMTI4X1JFQURfUExMKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGFkZHIpCitzdGF0aWMgaW50IFIxMjhfUkVBRF9QTEwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBhZGRyKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0yNzEsNyArMjcxLDcgQEAKIAogLyogUmVzZXQgdGhlIGVuZ2luZS4gIFRoaXMgd2lsbCBzdG9wIHRoZSBDQ0UgaWYgaXQgaXMgcnVubmluZy4KICAqLwotc3RhdGljIGludCByMTI4X2RvX2VuZ2luZV9yZXNldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHIxMjhfZG9fZW5naW5lX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBjbG9ja19jbnRsX2luZGV4LCBtY2xrX2NudGwsIGdlbl9yZXNldF9jbnRsOwpAQCAtMzA4LDcgKzMwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2luaXRfcmluZ19idWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgcjEyOF9jY2VfaW5pdF9yaW5nX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgICBkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKIAl1MzIgcmluZ19zdGFydDsKQEAgLTM0Nyw3ICszNDcsNyBAQAogCVIxMjhfV1JJVEUoUjEyOF9CVVNfQ05UTCwgdG1wKTsKIH0KIAotc3RhdGljIGludCByMTI4X2RvX2luaXRfY2NlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3IxMjhfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgcjEyOF9kb19pbml0X2NjZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3IxMjhfaW5pdF90ICogaW5pdCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2OwogCkBAIC00NTYsOCArNDU2LDcgQEAKIAlkZXZfcHJpdi0+c3Bhbl9waXRjaF9vZmZzZXRfYyA9ICgoKGRldl9wcml2LT5kZXB0aF9waXRjaCAvIDgpIDw8IDIxKSB8CiAJCQkJCSAoZGV2X3ByaXYtPnNwYW5fb2Zmc2V0ID4+IDUpKTsKIAotCURSTV9HRVRTQVJFQSgpOwotCisJZGV2X3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7CiAJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOwogCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKQEAgLTU4NSw3ICs1ODQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcjEyOF9kb19jbGVhbnVwX2NjZShkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgcjEyOF9kb19jbGVhbnVwX2NjZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAogCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bApAQCAtNzcwLDExICs3NjksMTEgQEAKICNkZWZpbmUgUjEyOF9CVUZGRVJfRlJFRQkwCiAKICNpZiAwCi1zdGF0aWMgaW50IHIxMjhfZnJlZWxpc3RfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHIxMjhfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX3IxMjhfZnJlZWxpc3RfdCAqZW50cnk7CiAJaW50IGk7CkBAIC04MTYsMTIgKzgxNSwxMiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBkcm1fYnVmX3QgKnIxMjhfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqcjEyOF9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBpLCB0OwogCiAJLyogRklYTUU6IE9wdGltaXplIC0tIHVzZSBmcmVlbGlzdCBjb2RlICovCkBAIC04NTQsMTMgKzg1MywxMyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByMTI4X2ZyZWVsaXN0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCQlidWZfcHJpdi0+YWdlID0gMDsKIAl9CkBAIC04ODcsMTAgKzg4NiwxMCBAQAogCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2RtYV90ICogZCkKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9kbWEgKiBkKQogewogCWludCBpOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAKIAlmb3IgKGkgPSBkLT5ncmFudGVkX2NvdW50OyBpIDwgZC0+cmVxdWVzdF9jb3VudDsgaSsrKSB7CiAJCWJ1ZiA9IHIxMjhfZnJlZWxpc3RfZ2V0KGRldik7CkBAIC05MTQsMTAgKzkxMywxMCBAQAogaW50IHIxMjhfY2NlX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCByZXQgPSAwOwotCWRybV9kbWFfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOwotCWRybV9kbWFfdCBkOworCXN0cnVjdCBkcm1fZG1hIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJc3RydWN0IGRybV9kbWEgZDsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmgKaW5kZXggNmU4YWYzMS4uZTk0YTM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaApAQCAtMTUzLDcgKzE1Myw3IEBACiAKIAkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCiAJICovCi0JZHJtX2NsaXBfcmVjdF90IGJveGVzW1IxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tSMTI4X05SX1NBUkVBX0NMSVBSRUNUU107CiAJdW5zaWduZWQgaW50IG5ib3g7CiAKIAkvKiBDb3VudGVycyBmb3IgY2xpZW50LXNpZGUgdGhyb3R0bGluZyBvZiByZW5kZXJpbmcgY2xpZW50cy4KQEAgLTE2MSw3ICsxNjEsNyBAQAogCXVuc2lnbmVkIGludCBsYXN0X2ZyYW1lOwogCXVuc2lnbmVkIGludCBsYXN0X2Rpc3BhdGNoOwogCi0JZHJtX3RleF9yZWdpb25fdCB0ZXhfbGlzdFtSMTI4X05SX1RFWF9IRUFQU11bUjEyOF9OUl9URVhfUkVHSU9OUyArIDFdOworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhfbGlzdFtSMTI4X05SX1RFWF9IRUFQU11bUjEyOF9OUl9URVhfUkVHSU9OUyArIDFdOwogCXVuc2lnbmVkIGludCB0ZXhfYWdlW1IxMjhfTlJfVEVYX0hFQVBTXTsKIAlpbnQgY3R4X293bmVyOwogCWludCBwZkFsbG93UGFnZUZsaXA7CS8qIG51bWJlciBvZiAzZCB3aW5kb3dzICgwLDEsMiBvciBtb3JlKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCmluZGV4IDkwODY4MzUuLjcyMjQ5ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKQEAgLTU3LDcgKzU3LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZnJlZWxpc3QgewogCXVuc2lnbmVkIGludCBhZ2U7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlzdHJ1Y3QgZHJtX3IxMjhfZnJlZWxpc3QgKm5leHQ7CiAJc3RydWN0IGRybV9yMTI4X2ZyZWVsaXN0ICpwcmV2OwogfSBkcm1fcjEyOF9mcmVlbGlzdF90OwpAQCAtMTE4LDcgKzExOCw3IEBACiAJZHJtX2xvY2FsX21hcF90ICpjY2VfcmluZzsKIAlkcm1fbG9jYWxfbWFwX3QgKnJpbmdfcnB0cjsKIAlkcm1fbG9jYWxfbWFwX3QgKmFncF90ZXh0dXJlczsKLQlkcm1fYXRpX3BjaWdhcnRfaW5mbyBnYXJ0X2luZm87CisJc3RydWN0IGRybV9hdGlfcGNpZ2FydF9pbmZvIGdhcnRfaW5mbzsKIH0gZHJtX3IxMjhfcHJpdmF0ZV90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9idWZfcHJpdiB7CkBAIC0xNDIsMjEgKzE0MiwyMSBAQAogZXh0ZXJuIGludCByMTI4X2Z1bGxzY3JlZW4oRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCByMTI4X2NjZV9idWZmZXJzKERSTV9JT0NUTF9BUkdTKTsKIAotZXh0ZXJuIHZvaWQgcjEyOF9mcmVlbGlzdF9yZXNldChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9mcmVlbGlzdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKIGV4dGVybiBpbnQgcjEyOF93YWl0X3JpbmcoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBuKTsKIAogZXh0ZXJuIGludCByMTI4X2RvX2NjZV9pZGxlKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KTsKLWV4dGVybiBpbnQgcjEyOF9kb19jbGVhbnVwX2NjZShkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCByMTI4X2RvX2NsZWFudXBfY2NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAotZXh0ZXJuIGludCByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiAKIGV4dGVybiBpcnFyZXR1cm5fdCByMTI4X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCk7CiAKIGV4dGVybiBsb25nIHIxMjhfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jCmluZGV4IDg3ZjhjYTIuLmM3NmZkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogaXJxcmV0dXJuX3QgcjEyOF9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcjEyOF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgc3RhdHVzOwogCkBAIC01NCw3ICs1NCw3IEBACiAJcmV0dXJuIElSUV9OT05FOwogfQogCi1pbnQgcjEyOF9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IHIxMjhfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOwogCWludCByZXQgPSAwOwpAQCAtNzIsNyArNzIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yMTI4X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC04Miw3ICs4Miw3IEBACiAJUjEyOF9XUklURShSMTI4X0dFTl9JTlRfU1RBVFVTLCBSMTI4X0NSVENfVkJMQU5LX0lOVF9BSyk7CiB9CiAKLXZvaWQgcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3IxMjhfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTkwLDcgKzkwLDcgQEAKIAlSMTI4X1dSSVRFKFIxMjhfR0VOX0lOVF9DTlRMLCBSMTI4X0NSVENfVkJMQU5LX0lOVF9FTik7CiB9CiAKLXZvaWQgcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcjEyOF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpZiAoIWRldl9wcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwppbmRleCAxN2IxMWU3Li43YjMzNGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwpAQCAtMzgsNyArMzgsNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIHIxMjhfZW1pdF9jbGlwX3JlY3RzKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCSBkcm1fY2xpcF9yZWN0X3QgKiBib3hlcywgaW50IGNvdW50KQorCQkJCSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIGJveGVzLCBpbnQgY291bnQpCiB7CiAJdTMyIGF1eF9zY19jbnRsID0gMHgwMDAwMDAwMDsKIAlSSU5HX0xPQ0FMUzsKQEAgLTM1MiwxMyArMzUyLDEzIEBACiAJCSAoZmxhZ3MgJiBSMTI4X1JFUVVJUkVfUVVJRVNDRU5DRSkgPyAicXVpZXNjZW5jZSwgIiA6ICIiKTsKIH0KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgIGRybV9yMTI4X2NsZWFyX3QgKiBjbGVhcikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gY2xlYXItPmZsYWdzOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwpAQCAtNDU4LDEyICs0NTgsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IGk7CiAJUklOR19MT0NBTFM7CiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTUyNCw3ICs1MjQsNyBAQAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9mbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC01NjcsNyArNTY3LDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CkBAIC02MzcsOCArNjM3LDggQEAKIAlzYXJlYV9wcml2LT5uYm94ID0gMDsKIH0KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaXJlY3QoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgICAgICBkcm1fYnVmX3QgKiBidWYsIGludCBzdGFydCwgaW50IGVuZCkKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2luZGlyZWN0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTY5Miw4ICs2OTIsOCBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKys7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2luZGljZXMoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgICAgIGRybV9idWZfdCAqIGJ1ZiwKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2luZGljZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICAgc3RydWN0IGRybV9idWYgKiBidWYsCiAJCQkJICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY291bnQpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC03NzcsMTEgKzc3NywxMSBAQAogfQogCiBzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX2JsaXQoRFJNRklMRSBmaWxwLAotCQkJCSAgZHJtX2RldmljZV90ICogZGV2LCBkcm1fcjEyOF9ibGl0X3QgKiBibGl0KQorCQkJCSAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9yMTI4X2JsaXRfdCAqIGJsaXQpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCXUzMiAqZGF0YTsKIAlpbnQgZHdvcmRfc2hpZnQsIGR3b3JkczsKQEAgLTg4Nyw3ICs4ODcsNyBAQAogICogaGF2ZSBoYXJkd2FyZSBzdGVuY2lsIHN1cHBvcnQuCiAgKi8KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF93cml0ZV9zcGFuKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfc3BhbihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJZHJtX3IxMjhfZGVwdGhfdCAqIGRlcHRoKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtOTgzLDcgKzk4Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfcGl4ZWxzKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfcGl4ZWxzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgIGRybV9yMTI4X2RlcHRoX3QgKiBkZXB0aCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExMDUsNyArMTEwNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfcmVhZF9zcGFuKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfcmVhZF9zcGFuKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgICBkcm1fcjEyOF9kZXB0aF90ICogZGVwdGgpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMTQ4LDcgKzExNDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfcGl4ZWxzKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfcmVhZF9waXhlbHMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSBkcm1fcjEyOF9kZXB0aF90ICogZGVwdGgpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMjIwLDcgKzEyMjAsNyBAQAogICogUG9seWdvbiBzdGlwcGxlCiAgKi8KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfc3RpcHBsZShkcm1fZGV2aWNlX3QgKiBkZXYsIHUzMiAqIHN0aXBwbGUpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zdGlwcGxlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1MzIgKiBzdGlwcGxlKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwpAQCAtMTI2OSw3ICsxMjY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2RvX2luaXRfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByMTI4X2RvX2luaXRfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJRFJNX0RFQlVHKCJcbiIpOwpAQCAtMTI4OCw3ICsxMjg4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2RvX2NsZWFudXBfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByMTI4X2RvX2NsZWFudXBfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJRFJNX0RFQlVHKCJcbiIpOwpAQCAtMTM1NCw4ICsxMzU0LDggQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlkcm1fcjEyOF92ZXJ0ZXhfdCB2ZXJ0ZXg7CiAKQEAgLTE0MTMsOCArMTQxMyw4IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX3IxMjhfaW5kaWNlc190IGVsdHM7CiAJaW50IGNvdW50OwpAQCAtMTQ4Myw3ICsxNDgzLDcgQEAKIHN0YXRpYyBpbnQgcjEyOF9jY2VfYmxpdChEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfYmxpdF90IGJsaXQ7CiAJaW50IHJldDsKQEAgLTE1NzEsOCArMTU3MSw4IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX3IxMjhfaW5kaXJlY3RfdCBpbmRpcmVjdDsKICNpZiAwCkBAIC0xNjc1LDcgKzE2NzUsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHIxMjhfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTY4NSw3ICsxNjg1LDcgQEAKIAl9CiB9CiAKLXZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXIxMjhfZG9fY2xlYW51cF9jY2UoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYwppbmRleCAwMzJhMDIyLi40ZTVhY2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCkBAIC01NSw3ICs1NSw3IEBACiBzdGF0aWMgaW50IHIzMDBfZW1pdF9jbGlwcmVjdHMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAogCQkJICAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLCBpbnQgbikKIHsKLQlkcm1fY2xpcF9yZWN0X3QgYm94OworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveDsKIAlpbnQgbnI7CiAJaW50IGk7CiAJUklOR19MT0NBTFM7CkBAIC0xNDgsMTUgKzE0OCwxNiBAQAogCiAJLyogdGhlc2UgbWF0Y2ggY21kdWNzKCkgY29tbWFuZCBpbiByMzAwX2RyaXZlci9yMzAwL3IzMDBfY21kYnVmLmMgKi8KIAlBRERfUkFOR0UoUjMwMF9TRV9WUE9SVF9YU0NBTEUsIDYpOwotCUFERF9SQU5HRSgweDIwODAsIDEpOworCUFERF9SQU5HRShSMzAwX1ZBUF9DTlRMLCAxKTsKIAlBRERfUkFOR0UoUjMwMF9TRV9WVEVfQ05UTCwgMik7CiAJQUREX1JBTkdFKDB4MjEzNCwgMik7Ci0JQUREX1JBTkdFKDB4MjE0MCwgMSk7CisJQUREX1JBTkdFKFIzMDBfVkFQX0NOVExfU1RBVFVTLCAxKTsKIAlBRERfUkFOR0UoUjMwMF9WQVBfSU5QVVRfQ05UTF8wLCAyKTsKIAlBRERfUkFOR0UoMHgyMURDLCAxKTsKLQlBRERfUkFOR0UoMHgyMjFDLCAxKTsKLQlBRERfUkFOR0UoMHgyMjIwLCA0KTsKLQlBRERfUkFOR0UoMHgyMjg4LCAxKTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfVU5LTk9XTl8yMjFDLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfQ0xJUF9YXzAsIDQpOworCUFERF9SQU5HRShSMzAwX1ZBUF9QVlNfV0FJVElETEUsIDEpOworCUFERF9SQU5HRShSMzAwX1ZBUF9VTktOT1dOXzIyODgsIDEpOwogCUFERF9SQU5HRShSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wLCAyKTsKIAlBRERfUkFOR0UoUjMwMF9WQVBfUFZTX0NOVExfMSwgMyk7CiAJQUREX1JBTkdFKFIzMDBfR0JfRU5BQkxFLCAxKTsKQEAgLTE2OCwxMyArMTY5LDEzIEBACiAJQUREX1JBTkdFKFIzMDBfUkVfUE9JTlRTSVpFLCAxKTsKIAlBRERfUkFOR0UoMHg0MjMwLCAzKTsKIAlBRERfUkFOR0UoUjMwMF9SRV9MSU5FX0NOVCwgMSk7Ci0JQUREX1JBTkdFKDB4NDIzOCwgMSk7CisJQUREX1JBTkdFKFIzMDBfUkVfVU5LNDIzOCwgMSk7CiAJQUREX1JBTkdFKDB4NDI2MCwgMyk7Ci0JQUREX1JBTkdFKDB4NDI3NCwgNCk7Ci0JQUREX1JBTkdFKDB4NDI4OCwgNSk7Ci0JQUREX1JBTkdFKDB4NDJBMCwgMSk7CisJQUREX1JBTkdFKFIzMDBfUkVfU0hBREUsIDQpOworCUFERF9SQU5HRShSMzAwX1JFX1BPTFlHT05fTU9ERSwgNSk7CisJQUREX1JBTkdFKFIzMDBfUkVfWkJJQVNfQ05UTCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfUkVfWkJJQVNfVF9GQUNUT1IsIDQpOwotCUFERF9SQU5HRSgweDQyQjQsIDEpOworCUFERF9SQU5HRShSMzAwX1JFX09DQ0xVU0lPTl9DTlRMLCAxKTsKIAlBRERfUkFOR0UoUjMwMF9SRV9DVUxMX0NOVEwsIDEpOwogCUFERF9SQU5HRSgweDQyQzAsIDIpOwogCUFERF9SQU5HRShSMzAwX1JTX0NOVExfMCwgMik7CkBAIC0xOTAsMjIgKzE5MSwyMiBAQAogCUFERF9SQU5HRShSMzAwX1BGU19JTlNUUjFfMCwgNjQpOwogCUFERF9SQU5HRShSMzAwX1BGU19JTlNUUjJfMCwgNjQpOwogCUFERF9SQU5HRShSMzAwX1BGU19JTlNUUjNfMCwgNjQpOwotCUFERF9SQU5HRSgweDRCQzAsIDEpOwotCUFERF9SQU5HRSgweDRCQzgsIDMpOworCUFERF9SQU5HRShSMzAwX1JFX0ZPR19TVEFURSwgMSk7CisJQUREX1JBTkdFKFIzMDBfRk9HX0NPTE9SX1IsIDMpOwogCUFERF9SQU5HRShSMzAwX1BQX0FMUEhBX1RFU1QsIDIpOwogCUFERF9SQU5HRSgweDRCRDgsIDEpOwogCUFERF9SQU5HRShSMzAwX1BGU19QQVJBTV8wX1gsIDY0KTsKIAlBRERfUkFOR0UoMHg0RTAwLCAxKTsKIAlBRERfUkFOR0UoUjMwMF9SQjNEX0NCTEVORCwgMik7CiAJQUREX1JBTkdFKFIzMDBfUkIzRF9DT0xPUk1BU0ssIDEpOwotCUFERF9SQU5HRSgweDRFMTAsIDMpOworCUFERF9SQU5HRShSMzAwX1JCM0RfQkxFTkRfQ09MT1IsIDMpOwogCUFERF9SQU5HRV9NQVJLKFIzMDBfUkIzRF9DT0xPUk9GRlNFVDAsIDEsIE1BUktfQ0hFQ0tfT0ZGU0VUKTsJLyogY2hlY2sgb2Zmc2V0ICovCiAJQUREX1JBTkdFKFIzMDBfUkIzRF9DT0xPUlBJVENIMCwgMSk7CiAJQUREX1JBTkdFKDB4NEU1MCwgOSk7CiAJQUREX1JBTkdFKDB4NEU4OCwgMSk7CiAJQUREX1JBTkdFKDB4NEVBMCwgMik7CiAJQUREX1JBTkdFKFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzAsIDMpOwotCUFERF9SQU5HRSgweDRGMTAsIDQpOworCUFERF9SQU5HRShSMzAwX1JCM0RfWlNURU5DSUxfRk9STUFULCA0KTsKIAlBRERfUkFOR0VfTUFSSyhSMzAwX1JCM0RfREVQVEhPRkZTRVQsIDEsIE1BUktfQ0hFQ0tfT0ZGU0VUKTsJLyogY2hlY2sgb2Zmc2V0ICovCiAJQUREX1JBTkdFKFIzMDBfUkIzRF9ERVBUSFBJVENILCAxKTsKIAlBRERfUkFOR0UoMHg0RjI4LCAxKTsKQEAgLTIyNCw3ICsyMjUsNyBAQAogCUFERF9SQU5HRShSMzAwX1RYX0JPUkRFUl9DT0xPUl8wLCAxNik7CiAKIAkvKiBTcG9yYWRpYyByZWdpc3RlcnMgdXNlZCBhcyBwcmltaXRpdmVzIGFyZSBlbWl0dGVkICovCi0JQUREX1JBTkdFKDB4NGYxOCwgMSk7CisJQUREX1JBTkdFKFIzMDBfUkIzRF9aQ0FDSEVfQ1RMU1RBVCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFULCAxKTsKIAlBRERfUkFOR0UoUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8wLCA4KTsKIAlBRERfUkFOR0UoUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8wLCA4KTsKQEAgLTY5Miw5ICs2OTMsOSBAQAogCiAJQkVHSU5fUklORyg2KTsKIAlPVVRfUklORyhDUF9QQUNLRVQwKFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFULCAwKSk7Ci0JT1VUX1JJTkcoMHhhKTsKLQlPVVRfUklORyhDUF9QQUNLRVQwKDB4NGYxOCwgMCkpOwotCU9VVF9SSU5HKDB4Myk7CisJT1VUX1JJTkcoUjMwMF9SQjNEX0RTVENBQ0hFX1VOS05PV05fMEEpOworCU9VVF9SSU5HKENQX1BBQ0tFVDAoUjMwMF9SQjNEX1pDQUNIRV9DVExTVEFULCAwKSk7CisJT1VUX1JJTkcoUjMwMF9SQjNEX1pDQUNIRV9VTktOT1dOXzAzKTsKIAlPVVRfUklORyhDUF9QQUNLRVQzKFJBREVPTl9DUF9OT1AsIDApKTsKIAlPVVRfUklORygweDApOwogCUFEVkFOQ0VfUklORygpOwpAQCAtNzA1LDcgKzcwNiw3IEBACiAgKiBUaGUgYWN0dWFsIGFnZSBlbWl0IGlzIGRvbmUgYnkgcjMwMF9kb19jcF9jbWRidWYsIHdoaWNoIGlzIHdoeSB5b3UgbXVzdAogICogYmUgY2FyZWZ1bCBhYm91dCBob3cgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgKi8KLXN0YXRpYyB2b2lkIHIzMDBfZGlzY2FyZF9idWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgdm9pZCByMzAwX2Rpc2NhcmRfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtNzY2LDggKzc2Nyw4IEBACiAJfQogCQogCUJFR0lOX1JJTkcoMik7Ci0JT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0NSQVRDSF9SRUcwICsgaGVhZGVyLnNjcmF0Y2gucmVnICogNCwgMCkpOwotCU9VVF9SSU5HKGRldl9wcml2LT5zY3JhdGNoX2FnZXNbaGVhZGVyLnNjcmF0Y2gucmVnXSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TQ1JBVENIX1JFRzAgKyBoZWFkZXIuc2NyYXRjaC5yZWcgKiA0LCAwICkgKTsKKwlPVVRfUklORyggZGV2X3ByaXYtPnNjcmF0Y2hfYWdlc1toZWFkZXIuc2NyYXRjaC5yZWddICk7CiAJQURWQU5DRV9SSU5HKCk7CiAJCiAJcmV0dXJuIDA7CkBAIC03NzgsMTQgKzc3OSwxNCBAQAogICogY29tbWFuZHMgb24gdGhlIERNQSByaW5nIGJ1ZmZlci4KICAqIENhbGxlZCBieSB0aGUgaW9jdGwgaGFuZGxlciBmdW5jdGlvbiByYWRlb25fY3BfY21kYnVmLgogICovCi1pbnQgcjMwMF9kb19jcF9jbWRidWYoZHJtX2RldmljZV90ICpkZXYsCitpbnQgcjMwMF9kb19jcF9jbWRidWYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJICAgICAgRFJNRklMRSBmaWxwLAotCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2LAogCQkgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWYgPSBOVUxMOwogCWludCBlbWl0X2Rpc3BhdGNoX2FnZSA9IDA7CiAJaW50IHJldCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaCBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaAppbmRleCBlY2RhNzYwLi4zYWU1N2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oCkBAIC00NywxMiArNDcsMTIgQEAKICMJZGVmaW5lIFIzMDBfTUNfTUlTQ19fTUNfR0xPQldfRlVMTF9MQVRfU0hJRlQJMjgKIAogLyoKLVRoaXMgZmlsZSBjb250YWlucyByZWdpc3RlcnMgYW5kIGNvbnN0YW50cyBmb3IgdGhlIFIzMDAuIFRoZXkgaGF2ZSBiZWVuCi1mb3VuZCBtb3N0bHkgYnkgZXhhbWluaW5nIGNvbW1hbmQgYnVmZmVycyBjYXB0dXJlZCB1c2luZyBnbHh0ZXN0LCBhcyB3ZWxsCi1hcyBieSBleHRyYXBvbGF0aW5nIHNvbWUga25vd24gcmVnaXN0ZXJzIGFuZCBjb25zdGFudHMgZnJvbSB0aGUgUjIwMC4KLQotSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHRoZXkgYXJlIGNvcnJlY3QgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UgaW4gY29tbWVudHMuCi0qLworICogVGhpcyBmaWxlIGNvbnRhaW5zIHJlZ2lzdGVycyBhbmQgY29uc3RhbnRzIGZvciB0aGUgUjMwMC4gVGhleSBoYXZlIGJlZW4KKyAqIGZvdW5kIG1vc3RseSBieSBleGFtaW5pbmcgY29tbWFuZCBidWZmZXJzIGNhcHR1cmVkIHVzaW5nIGdseHRlc3QsIGFzIHdlbGwKKyAqIGFzIGJ5IGV4dHJhcG9sYXRpbmcgc29tZSBrbm93biByZWdpc3RlcnMgYW5kIGNvbnN0YW50cyBmcm9tIHRoZSBSMjAwLgorICogSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHRoZXkgYXJlIGNvcnJlY3QgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UKKyAqIGluIGNvbW1lbnRzLgorICovCiAKICNkZWZpbmUgUjMwMF9TRV9WUE9SVF9YU0NBTEUgICAgICAgICAgICAgICAgMHgxRDk4CiAjZGVmaW5lIFIzMDBfU0VfVlBPUlRfWE9GRlNFVCAgICAgICAgICAgICAgIDB4MUQ5QwpAQCAtNjEsNDkgKzYxLDYwIEBACiAjZGVmaW5lIFIzMDBfU0VfVlBPUlRfWlNDQUxFICAgICAgICAgICAgICAgIDB4MURBOAogI2RlZmluZSBSMzAwX1NFX1ZQT1JUX1pPRkZTRVQgICAgICAgICAgICAgICAweDFEQUMKIAotLyogVGhpcyByZWdpc3RlciBpcyB3cml0dGVuIGRpcmVjdGx5IGFuZCBhbHNvIHN0YXJ0cyBkYXRhIHNlY3Rpb24gaW4gbWFueSAzZCBDUF9QQUNLRVQzJ3MgKi8KKworLyoKKyAqIFZlcnRleCBBcnJheSBQcm9jZXNzaW5nIChWQVApIENvbnRyb2wKKyAqIFN0b2xlbiBmcm9tIHIyMDAgY29kZSBmcm9tIENocmlzdG9waCBCcmlsbCAoSXQncyBhIGd1ZXNzISkKKyAqLworI2RlZmluZSBSMzAwX1ZBUF9DTlRMCTB4MjA4MAorCisvKiBUaGlzIHJlZ2lzdGVyIGlzIHdyaXR0ZW4gZGlyZWN0bHkgYW5kIGFsc28gc3RhcnRzIGRhdGEgc2VjdGlvbgorICogaW4gbWFueSAzZCBDUF9QQUNLRVQzJ3MKKyAqLwogI2RlZmluZSBSMzAwX1ZBUF9WRl9DTlRMCTB4MjA4NAorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UWVBFX19TSElGVCAgICAgICAgICAgICAgMAorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fTk9ORSAgICAgICAgICAgICAgICAgICAgICgwPDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUE9JTlRTICAgICAgICAgICAgICAgICAgICgxPDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fTElORVMgICAgICAgICAgICAgICAgICAgICgyPDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fTElORV9TVFJJUCAgICAgICAgICAgICAgICgzPDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFJJQU5HTEVTICAgICAgICAgICAgICAgICg0PDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFJJQU5HTEVfRkFOICAgICAgICAgICAgICg1PDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICg2PDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fTElORV9MT09QICAgICAgICAgICAgICAgICgxMjw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1FVQURTICAgICAgICAgICAgICAgICAgICAoMTM8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9RVUFEX1NUUklQICAgICAgICAgICAgICAgKDE0PDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUE9MWUdPTiAgICAgICAgICAgICAgICAgICgxNTw8MCkKIAotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UWVBFX19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMAotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fTk9ORQkJCQkgKDA8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9QT0lOVFMJCQkJICgxPDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fTElORVMJCQkJICgyPDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fTElORV9TVFJJUAkJCSAoMzw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFUwkJCSAoNDw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFX0ZBTgkJCSAoNTw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFX1NUUklQCQkJICg2PDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fTElORV9MT09QCQkJICgxMjw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1FVQURTCQkJIAkgKDEzPDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUVVBRF9TVFJJUAkJCSAoMTQ8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9QT0xZR09OCQkJIAkgKDE1PDwwKQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX19TSElGVCAgICAgICAgICAgICAgNAorCS8qIFN0YXRlIGJhc2VkIC0gZGlyZWN0IHdyaXRlcyB0byByZWdpc3RlcnMgdHJpZ2dlciB2ZXJ0ZXgKKyAgICAgICAgICAgZ2VuZXJhdGlvbiAqLworIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1NUQVRFX0JBU0VEICAgICAgICAgKDA8PDQpCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfSU5ESUNFUyAgICAgICAgICAgICAoMTw8NCkKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19WRVJURVhfTElTVCAgICAgICAgICgyPDw0KQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1ZFUlRFWF9FTUJFRERFRCAgICAgKDM8PDQpCiAKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDQKLQkvKiBTdGF0ZSBiYXNlZCAtIGRpcmVjdCB3cml0ZXMgdG8gcmVnaXN0ZXJzIHRyaWdnZXIgdmVydGV4IGdlbmVyYXRpb24gKi8KLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19TVEFURV9CQVNFRCAgICAgICAgICAgICAgICAgICAgICAoMDw8NCkKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19JTkRJQ0VTICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NCkKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19WRVJURVhfTElTVCAgICAgICAgICAgICAgICAgICAgICAoMjw8NCkKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19WRVJURVhfRU1CRURERUQgICAgICAgICAgICAgICAgICAoMzw8NCkKKwkvKiBJIGRvbid0IHRoaW5rIEkgc2F3IHRoZXNlIHRocmVlIHVzZWQuLiAqLworIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fQ09MT1JfT1JERVJfX1NISUZUICAgICAgICAgICAgNgorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fVENMX09VVFBVVF9DVExfRU5BX19TSElGVCAgICAgOQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJPR19TVFJFQU1fRU5BX19TSElGVCAgICAgICAgMTAKIAotCQkvKiBJIGRvbid0IHRoaW5rIEkgc2F3IHRoZXNlIHRocmVlIHVzZWQuLiAqLwotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fQ09MT1JfT1JERVJfX1NISUZUICAgICAgICAgICAgICAgICAgICAgNgotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fVENMX09VVFBVVF9DVExfRU5BX19TSElGVCAgICAgICAgICAgICAgOQotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJPR19TVFJFQU1fRU5BX19TSElGVCAgICAgICAgICAgICAgICAgMTAKLQotCQkvKiBpbmRleCBzaXplIC0gd2hlbiBub3Qgc2V0IHRoZSBpbmRpY2VzIGFyZSBhc3N1bWVkIHRvIGJlIDE2IGJpdCAqLwotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fSU5ERVhfU0laRV8zMmJpdCAgICAgICAgICAgICAgICAgICAgICAoMTw8MTEpCi0JCS8qIG51bWJlciBvZiB2ZXJ0aWNlcyAqLwotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fTlVNX1ZFUlRJQ0VTX19TSElGVCAgICAgICAgICAgICAgICAgICAgMTYKKwkvKiBpbmRleCBzaXplIC0gd2hlbiBub3Qgc2V0IHRoZSBpbmRpY2VzIGFyZSBhc3N1bWVkIHRvIGJlIDE2IGJpdCAqLworIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fSU5ERVhfU0laRV8zMmJpdCAgICAgICAgICAgICAgKDE8PDExKQorCS8qIG51bWJlciBvZiB2ZXJ0aWNlcyAqLworIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fTlVNX1ZFUlRJQ0VTX19TSElGVCAgICAgICAgICAgMTYKIAogLyogQkVHSU46IFdpbGQgZ3Vlc3NlcyAqLwogI2RlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wICAgICAgICAgICAweDIwOTAKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX1BPU19QUkVTRU5UICAgICAoMTw8MCkKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SX1BSRVNFTlQgICAoMTw8MSkKLSMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SXzFfUFJFU0VOVCAoMTw8MikJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SXzJfUFJFU0VOVCAoMTw8MykJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SXzNfUFJFU0VOVCAoMTw8NCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX1BUX1NJWkVfUFJFU0VOVCAoMTw8MTYpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8xX1BSRVNFTlQgKDE8PDIpICAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMl9QUkVTRU5UICgxPDwzKSAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SXzNfUFJFU0VOVCAoMTw8NCkgIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QVF9TSVpFX1BSRVNFTlQgKDE8PDE2KSAvKiBHVUVTUyAqLwogCiAjZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzEgICAgICAgICAgIDB4MjA5NAorCS8qIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBpcyAzIGJpdHMgd2lkZSwgc3BlY2lmaWVzIG51bWJlcgorCSAgIG9mIGNvbXBvbmVudHMgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF8wX0NPTVBfQ05UX1NISUZUIDAKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF8xX0NPTVBfQ05UX1NISUZUIDMKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF8yX0NPTVBfQ05UX1NISUZUIDYKQEAgLTExMiw3ICsxMjMsNyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzVfQ09NUF9DTlRfU0hJRlQgMTUKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF82X0NPTVBfQ05UX1NISUZUIDE4CiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfN19DT01QX0NOVF9TSElGVCAyMQotLyogRU5EICovCisvKiBFTkQ6IFdpbGQgZ3Vlc3NlcyAqLwogCiAjZGVmaW5lIFIzMDBfU0VfVlRFX0NOVEwgICAgICAgICAgICAgICAgICAweDIwYjAKICMJZGVmaW5lICAgICBSMzAwX1ZQT1JUX1hfU0NBTEVfRU5BICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKQEAgLTEyOCw0MyArMTM5LDU0IEBACiAjCWRlZmluZSAgICAgUjMwMF9WVFhfU1RfREVOT1JNQUxJWkVEICAgICAgICAgICAgICAweDAwMDAxMDAwCiAKIC8qIEJFR0lOOiBWZXJ0ZXggZGF0YSBhc3NlbWJseSAtIGxvdHMgb2YgdW5jZXJ0YWludGllcyAqLwotLyogZ2FwICovCi0vKiBXaGVyZSBkbyB3ZSBnZXQgb3VyIHZlcnRleCBkYXRhPwotLy8KLS8vIFZlcnRleCBkYXRhIGVpdGhlciBjb21lcyBlaXRoZXIgZnJvbSBpbW1lZGlhdGUgbW9kZSByZWdpc3RlcnMgb3IgZnJvbQotLy8gdmVydGV4IGFycmF5cy4KLS8vIFRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gbWl4ZWQgbW9kZSAodGhvdWdoIHdlIGNhbiBmb3JjZSB0aGUgcGl0Y2ggb2YKLS8vIHZlcnRleCBhcnJheXMgdG8gMCwgZWZmZWN0aXZlbHkgcmV1c2luZyB0aGUgc2FtZSBlbGVtZW50IG92ZXIgYW5kIG92ZXIKLS8vIGFnYWluKS4KLS8vCi0vLyBJbW1lZGlhdGUgbW9kZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBJTlBVVF9DTlRMIHJlZ2lzdGVycy4gSSBhbSBub3Qgc3VyZQotLy8gaWYgdGhlc2UgcmVnaXN0ZXJzIGluZmx1ZW5jZSB2ZXJ0ZXggYXJyYXkgcHJvY2Vzc2luZy4KLS8vCi0vLyBWZXJ0ZXggYXJyYXlzIGFyZSBjb250cm9sbGVkIHZpYSB0aGUgM0RfTE9BRF9WQlBOVFIgcGFja2V0My4KLS8vCi0vLyBJbiBib3RoIGNhc2VzLCB2ZXJ0ZXggYXR0cmlidXRlcyBhcmUgdGhlbiBwYXNzZWQgdGhyb3VnaCBJTlBVVF9ST1VURS4KIAotLy8gQmVnaW5uaW5nIHdpdGggSU5QVVRfUk9VVEVfMF8wIGlzIGEgbGlzdCBvZiBXT1JEcyB0aGF0IHJvdXRlIHZlcnRleCBkYXRhCi0vLyBpbnRvIHRoZSB2ZXJ0ZXggcHJvY2Vzc29yJ3MgaW5wdXQgcmVnaXN0ZXJzLgotLy8gVGhlIGZpcnN0IHdvcmQgcm91dGVzIHRoZSBmaXJzdCBpbnB1dCwgdGhlIHNlY29uZCB3b3JkIHRoZSBzZWNvbmQsIGV0Yy4KLS8vIFRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGlzIHJvdXRlZCBpbnRvIHRoZSByZWdpc3RlciB3aXRoIHRoZSBnaXZlbiBpbmRleC4KLS8vIFRoZSBsaXN0IGlzIGVuZGVkIGJ5IGEgd29yZCB3aXRoIElOUFVUX1JPVVRFX0VORCBzZXQuCi0vLwotLy8gQWx3YXlzIHNldCBDT01QT05FTlRTXzQgaW4gaW1tZWRpYXRlIG1vZGUuICovCisvKiBnYXAgKi8KKworI2RlZmluZSBSMzAwX1ZBUF9DTlRMX1NUQVRVUyAgICAgICAgICAgICAgMHgyMTQwCisjCWRlZmluZSBSMzAwX1ZDX05PX1NXQVAgICAgICAgICAgICAgICAgICAoMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9WQ18xNkJJVF9TV0FQICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVkNfMzJCSVRfU1dBUCAgICAgICAgICAgICAgICgyIDw8IDApCisjCWRlZmluZSBSMzAwX1ZBUF9UQ0xfQllQQVNTCQkoMSA8PCA4KQorCisvKiBnYXAgKi8KKworLyogV2hlcmUgZG8gd2UgZ2V0IG91ciB2ZXJ0ZXggZGF0YT8KKyAqCisgKiBWZXJ0ZXggZGF0YSBlaXRoZXIgY29tZXMgZWl0aGVyIGZyb20gaW1tZWRpYXRlIG1vZGUgcmVnaXN0ZXJzIG9yIGZyb20KKyAqIHZlcnRleCBhcnJheXMuCisgKiBUaGVyZSBhcHBlYXJzIHRvIGJlIG5vIG1peGVkIG1vZGUgKHRob3VnaCB3ZSBjYW4gZm9yY2UgdGhlIHBpdGNoIG9mCisgKiB2ZXJ0ZXggYXJyYXlzIHRvIDAsIGVmZmVjdGl2ZWx5IHJldXNpbmcgdGhlIHNhbWUgZWxlbWVudCBvdmVyIGFuZCBvdmVyCisgKiBhZ2FpbikuCisgKgorICogSW1tZWRpYXRlIG1vZGUgaXMgY29udHJvbGxlZCBieSB0aGUgSU5QVVRfQ05UTCByZWdpc3RlcnMuIEkgYW0gbm90IHN1cmUKKyAqIGlmIHRoZXNlIHJlZ2lzdGVycyBpbmZsdWVuY2UgdmVydGV4IGFycmF5IHByb2Nlc3NpbmcuCisgKgorICogVmVydGV4IGFycmF5cyBhcmUgY29udHJvbGxlZCB2aWEgdGhlIDNEX0xPQURfVkJQTlRSIHBhY2tldDMuCisgKgorICogSW4gYm90aCBjYXNlcywgdmVydGV4IGF0dHJpYnV0ZXMgYXJlIHRoZW4gcGFzc2VkIHRocm91Z2ggSU5QVVRfUk9VVEUuCisgKgorICogQmVnaW5uaW5nIHdpdGggSU5QVVRfUk9VVEVfMF8wIGlzIGEgbGlzdCBvZiBXT1JEcyB0aGF0IHJvdXRlIHZlcnRleCBkYXRhCisgKiBpbnRvIHRoZSB2ZXJ0ZXggcHJvY2Vzc29yJ3MgaW5wdXQgcmVnaXN0ZXJzLgorICogVGhlIGZpcnN0IHdvcmQgcm91dGVzIHRoZSBmaXJzdCBpbnB1dCwgdGhlIHNlY29uZCB3b3JkIHRoZSBzZWNvbmQsIGV0Yy4KKyAqIFRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGlzIHJvdXRlZCBpbnRvIHRoZSByZWdpc3RlciB3aXRoIHRoZSBnaXZlbiBpbmRleC4KKyAqIFRoZSBsaXN0IGlzIGVuZGVkIGJ5IGEgd29yZCB3aXRoIElOUFVUX1JPVVRFX0VORCBzZXQuCisgKgorICogQWx3YXlzIHNldCBDT01QT05FTlRTXzQgaW4gaW1tZWRpYXRlIG1vZGUuCisgKi8KIAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzAgICAgICAgICAgICAweDIxNTAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU18xICAgICAoMCA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTXzIgICAgICgxIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfMyAgICAgKDIgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU180ICAgICAoMyA8PCAwKQotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTX1JHQkEgICg0IDw8IDApCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfUkdCQSAgKDQgPDwgMCkgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFX0lEWF9TSElGVCAgICA4Ci0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV9JRFhfTUFTSyAgICAgKDMxIDw8IDgpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV9JRFhfTUFTSyAgICAgKDMxIDw8IDgpIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV9FTkQgICAgICAgICAgKDEgPDwgMTMpCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0lNTUVESUFURV9NT0RFICAgKDAgPDwgMTQpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0ZMT0FUICAgICAgICAgICAgKDEgPDwgMTQpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1VOU0lHTkVEX0JZVEUgICAgKDIgPDwgMTQpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0ZMT0FUX0NPTE9SICAgICAgKDMgPDwgMTQpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0lNTUVESUFURV9NT0RFICAgKDAgPDwgMTQpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0ZMT0FUICAgICAgICAgICAgKDEgPDwgMTQpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1VOU0lHTkVEX0JZVEUgICAgKDIgPDwgMTQpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0ZMT0FUX0NPTE9SICAgICAgKDMgPDwgMTQpIC8qIEdVRVNTICovCiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMSAgICAgICAgICAgIDB4MjE1NAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzIgICAgICAgICAgICAweDIxNTgKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8zICAgICAgICAgICAgMHgyMTVDCkBAIC0xNzQsMTAgKzE5NiwxMiBAQAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzcgICAgICAgICAgICAweDIxNkMKIAogLyogZ2FwICovCisKIC8qIE5vdGVzOgotLy8gIC0gYWx3YXlzIHNldCB1cCB0byBwcm9kdWNlIGF0IGxlYXN0IHR3byBhdHRyaWJ1dGVzOgotLy8gICAgaWYgdmVydGV4IHByb2dyYW0gdXNlcyBvbmx5IHBvc2l0aW9uLCBmZ2xyeCB3aWxsIHNldCBub3JtYWwsIHRvbwotLy8gIC0gSU5QVVRfQ05UTF8wX0NPTE9SIGFuZCBJTlBVVF9DTlRMX0NPTE9SIGJpdHMgYXJlIGFsd2F5cyBlcXVhbCAqLworICogIC0gYWx3YXlzIHNldCB1cCB0byBwcm9kdWNlIGF0IGxlYXN0IHR3byBhdHRyaWJ1dGVzOgorICogICAgaWYgdmVydGV4IHByb2dyYW0gdXNlcyBvbmx5IHBvc2l0aW9uLCBmZ2xyeCB3aWxsIHNldCBub3JtYWwsIHRvbworICogIC0gSU5QVVRfQ05UTF8wX0NPTE9SIGFuZCBJTlBVVF9DTlRMX0NPTE9SIGJpdHMgYXJlIGFsd2F5cyBlcXVhbC4KKyAqLwogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9DTlRMXzAgICAgICAgICAgICAgICAweDIxODAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF8wX0NPTE9SICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX0NOVExfMSAgICAgICAgICAgICAgIDB4MjE4NApAQCAtMTg2LDIwICsyMTAsMjIgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9DT0xPUiAgICAgICAgICAgICAweDAwMDAwMDA0CiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMwICAgICAgICAgICAgICAgMHgwMDAwMDQwMAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMSAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzIgICAgICAgICAgICAgICAweDAwMDAxMDAwCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMzICAgICAgICAgICAgICAgMHgwMDAwMjAwMAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzUgICAgICAgICAgICAgICAweDAwMDA4MDAwCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM2ICAgICAgICAgICAgICAgMHgwMDAxMDAwMAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNyAgICAgICAgICAgICAgIDB4MDAwMjAwMDAJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzIgICAgICAgICAgICAgICAweDAwMDAxMDAwIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMzICAgICAgICAgICAgICAgMHgwMDAwMjAwMCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzUgICAgICAgICAgICAgICAweDAwMDA4MDAwIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM2ICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNyAgICAgICAgICAgICAgIDB4MDAwMjAwMDAgLyogR1VFU1MgKi8KIAogLyogZ2FwICovCisKIC8qIFdvcmRzIHBhcmFsbGVsIHRvIElOUFVUX1JPVVRFXzA7IEFsbCB3b3JkcyB0aGF0IGFyZSBhY3RpdmUgaW4gSU5QVVRfUk9VVEVfMAotLy8gYXJlIHNldCB0byBhIHN3aXp6bGluZyBiaXQgcGF0dGVybiwgb3RoZXIgd29yZHMgYXJlIDAuCi0vLwotLy8gSW4gaW1tZWRpYXRlIG1vZGUsIHRoZSBwYXR0ZXJuIGlzIGFsd2F5cyBzZXQgdG8geHl6dy4gSW4gdmVydGV4IGFycmF5Ci0vLyBtb2RlLCB0aGUgc3dpenpsaW5nIHBhdHRlcm4gaXMgZS5nLiB1c2VkIHRvIHNldCB6dyBjb21wb25lbnRzIGluIHRleHR1cmUKLS8vIGNvb3JkaW5hdGVzIHdpdGggb25seSB0d2VvIGNvbXBvbmVudHMuICovCisgKiBhcmUgc2V0IHRvIGEgc3dpenpsaW5nIGJpdCBwYXR0ZXJuLCBvdGhlciB3b3JkcyBhcmUgMC4KKyAqCisgKiBJbiBpbW1lZGlhdGUgbW9kZSwgdGhlIHBhdHRlcm4gaXMgYWx3YXlzIHNldCB0byB4eXp3LiBJbiB2ZXJ0ZXggYXJyYXkKKyAqIG1vZGUsIHRoZSBzd2l6emxpbmcgcGF0dGVybiBpcyBlLmcuIHVzZWQgdG8gc2V0IHp3IGNvbXBvbmVudHMgaW4gdGV4dHVyZQorICogY29vcmRpbmF0ZXMgd2l0aCBvbmx5IHR3ZW8gY29tcG9uZW50cy4KKyAqLwogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzAgICAgICAgICAgICAweDIxRTAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX1ggICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfWSAgICAxCkBAIC0yMDgsMTEgKzIzNCwxMSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfWkVSTyA0CiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9PTkUgIDUKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX01BU0sgNwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9YX1NISUZUICAgICAgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWV9TSElGVCAgICAgICAgICAzCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1pfU0hJRlQgICAgICAgICAgNgotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9XX1NISUZUICAgICAgICAgIDkKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRU5BQkxFICAgICAgICAgICAoMTUgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1hfU0hJRlQgICAgIDAKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWV9TSElGVCAgICAgMworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9aX1NISUZUICAgICA2CisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1dfU0hJRlQgICAgIDkKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRU5BQkxFICAgICAgKDE1IDw8IDEyKQogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzEgICAgICAgICAgICAweDIxRTQKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8yICAgICAgICAgICAgMHgyMUU4CiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMyAgICAgICAgICAgIDB4MjFFQwpAQCAtMjIxLDc5ICsyNDcsMTA3IEBACiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfNiAgICAgICAgICAgIDB4MjFGOAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzcgICAgICAgICAgICAweDIxRkMKIAotLyogRU5EICovCisvKiBFTkQ6IFZlcnRleCBkYXRhIGFzc2VtYmx5ICovCiAKIC8qIGdhcCAqLwotLyogQkVHSU46IFVwbG9hZCB2ZXJ0ZXggcHJvZ3JhbSBhbmQgZGF0YQotLy8gVGhlIHByb2dyYW1tYWJsZSB2ZXJ0ZXggc2hhZGVyIHVuaXQgaGFzIGEgbWVtb3J5IGJhbmsgb2YgdW5rbm93biBzaXplCi0vLyB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIGluIDE2IGJ5dGUgdW5pdHMgYnkgd3JpdGluZyB0aGUgYWRkcmVzcyBpbnRvCi0vLyBVUExPQURfQUREUkVTUywgZm9sbG93ZWQgYnkgZGF0YSBpbiBVUExPQURfREFUQSAobXVsdGlwbGVzIG9mIDQgRFdPUkRzKS4KLS8vCi0vLyBQb2ludGVycyBpbnRvIHRoZSBtZW1vcnkgYmFuayBhcmUgYWx3YXlzIGluIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KLS8vCi0vLyBUaGUgbWVtb3J5IGJhbmsgaXMgZGl2aWRlZCBpbnRvIGFyZWFzIHdpdGggZml4ZWQgbWVhbmluZy4KLS8vCi0vLyBTdGFydGluZyBhdCBhZGRyZXNzIFVQTE9BRF9QUk9HUkFNOiBWZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbnMuCi0vLyBOYXRpdmUgbGltaXRzIHJlcG9ydGVkIGJ5IGRyaXZlcnMgZnJvbSBBVEkgc3VnZ2VzdCBzaXplIDI1NiAoaS5lLiA0S0IpLAotLy8gd2hlcmVhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGtub3duIGFkZHJlc3NlcyBzdWdnZXN0cyBzaXplIDUxMi4KLS8vCi0vLyBTdGFydGluZyBhdCBhZGRyZXNzIFVQTE9BRF9QQVJBTUVURVJTOiBWZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzLgotLy8gTmF0aXZlIHJlcG9ydGVkIGxpbWl0cyBhbmQgdGhlIFZQSSBsYXlvdXQgc3VnZ2VzdCBzaXplIDI1Niwgd2hlcmVhcwotLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIGtub3duIGFkZHJlc3NlcyBzdWdnZXN0cyBzaXplIDUxMi4KLS8vCi0vLyBBdCBhZGRyZXNzIFVQTE9BRF9QT0lOVFNJWkUgaXMgYSB2ZWN0b3IgKDAsIDAsIHBzLCAwKSwgd2hlcmUgcHMgaXMgdGhlCi0vLyBmbG9hdGluZyBwb2ludCBwb2ludHNpemUuIFRoZSBleGFjdCBwdXJwb3NlIG9mIHRoaXMgc3RhdGUgaXMgdW5jZXJ0YWluLAotLy8gYXMgdGhlcmUgaXMgYWxzbyB0aGUgUjMwMF9SRV9QT0lOVFNJWkUgcmVnaXN0ZXIuCi0vLwotLy8gTXVsdGlwbGUgdmVydGV4IHByb2dyYW1zIGFuZCBwYXJhbWV0ZXIgc2V0cyBjYW4gYmUgbG9hZGVkIGF0IG9uY2UsCi0vLyB3aGljaCBjb3VsZCBleHBsYWluIHRoZSBzaXplIGRpc2NyZXBhbmN5LiAqLworCisvKiBCRUdJTjogVXBsb2FkIHZlcnRleCBwcm9ncmFtIGFuZCBkYXRhICovCisKKy8qCisgKiBUaGUgcHJvZ3JhbW1hYmxlIHZlcnRleCBzaGFkZXIgdW5pdCBoYXMgYSBtZW1vcnkgYmFuayBvZiB1bmtub3duIHNpemUKKyAqIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gaW4gMTYgYnl0ZSB1bml0cyBieSB3cml0aW5nIHRoZSBhZGRyZXNzIGludG8KKyAqIFVQTE9BRF9BRERSRVNTLCBmb2xsb3dlZCBieSBkYXRhIGluIFVQTE9BRF9EQVRBIChtdWx0aXBsZXMgb2YgNCBEV09SRHMpLgorICoKKyAqIFBvaW50ZXJzIGludG8gdGhlIG1lbW9yeSBiYW5rIGFyZSBhbHdheXMgaW4gbXVsdGlwbGVzIG9mIDE2IGJ5dGVzLgorICoKKyAqIFRoZSBtZW1vcnkgYmFuayBpcyBkaXZpZGVkIGludG8gYXJlYXMgd2l0aCBmaXhlZCBtZWFuaW5nLgorICoKKyAqIFN0YXJ0aW5nIGF0IGFkZHJlc3MgVVBMT0FEX1BST0dSQU06IFZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9ucy4KKyAqIE5hdGl2ZSBsaW1pdHMgcmVwb3J0ZWQgYnkgZHJpdmVycyBmcm9tIEFUSSBzdWdnZXN0IHNpemUgMjU2IChpLmUuIDRLQiksCisgKiB3aGVyZWFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4ga25vd24gYWRkcmVzc2VzIHN1Z2dlc3RzIHNpemUgNTEyLgorICoKKyAqIFN0YXJ0aW5nIGF0IGFkZHJlc3MgVVBMT0FEX1BBUkFNRVRFUlM6IFZlcnRleCBwcm9ncmFtIHBhcmFtZXRlcnMuCisgKiBOYXRpdmUgcmVwb3J0ZWQgbGltaXRzIGFuZCB0aGUgVlBJIGxheW91dCBzdWdnZXN0IHNpemUgMjU2LCB3aGVyZWFzCisgKiBkaWZmZXJlbmNlIGJldHdlZW4ga25vd24gYWRkcmVzc2VzIHN1Z2dlc3RzIHNpemUgNTEyLgorICoKKyAqIEF0IGFkZHJlc3MgVVBMT0FEX1BPSU5UU0laRSBpcyBhIHZlY3RvciAoMCwgMCwgcHMsIDApLCB3aGVyZSBwcyBpcyB0aGUKKyAqIGZsb2F0aW5nIHBvaW50IHBvaW50c2l6ZS4gVGhlIGV4YWN0IHB1cnBvc2Ugb2YgdGhpcyBzdGF0ZSBpcyB1bmNlcnRhaW4sCisgKiBhcyB0aGVyZSBpcyBhbHNvIHRoZSBSMzAwX1JFX1BPSU5UU0laRSByZWdpc3Rlci4KKyAqCisgKiBNdWx0aXBsZSB2ZXJ0ZXggcHJvZ3JhbXMgYW5kIHBhcmFtZXRlciBzZXRzIGNhbiBiZSBsb2FkZWQgYXQgb25jZSwKKyAqIHdoaWNoIGNvdWxkIGV4cGxhaW4gdGhlIHNpemUgZGlzY3JlcGFuY3kuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfUFZTX1VQTE9BRF9BRERSRVNTICAgICAgICAgMHgyMjAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfUFJPR1JBTSAgICAgICAgICAgMHgwMDAwMDAwMAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfVVBMT0FEX1BBUkFNRVRFUlMgICAgICAgIDB4MDAwMDAyMDAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX1VQTE9BRF9QT0lOVFNJWkUgICAgICAgICAweDAwMDAwNDA2Ci0vKiBnYXAgKi8KLSNkZWZpbmUgUjMwMF9WQVBfUFZTX1VQTE9BRF9EQVRBICAgICAgICAgICAgMHgyMjA4Ci0vKiBFTkQgKi8KIAogLyogZ2FwICovCisKKyNkZWZpbmUgUjMwMF9WQVBfUFZTX1VQTE9BRF9EQVRBICAgICAgICAgICAgMHgyMjA4CisKKy8qIEVORDogVXBsb2FkIHZlcnRleCBwcm9ncmFtIGFuZCBkYXRhICovCisKKy8qIGdhcCAqLworCiAvKiBJIGRvIG5vdCBrbm93IHRoZSBwdXJwb3NlIG9mIHRoaXMgcmVnaXN0ZXIuIEhvd2V2ZXIsIEkgZG8ga25vdyB0aGF0Ci0vLyBpdCBpcyBzZXQgdG8gMjIxQ19DTEVBUiBmb3IgY2xlYXIgb3BlcmF0aW9ucyBhbmQgdG8gMjIxQ19OT1JNQUwKLS8vIGZvciBub3JtYWwgcmVuZGVyaW5nLiAqLworICogaXQgaXMgc2V0IHRvIDIyMUNfQ0xFQVIgZm9yIGNsZWFyIG9wZXJhdGlvbnMgYW5kIHRvIDIyMUNfTk9STUFMCisgKiBmb3Igbm9ybWFsIHJlbmRlcmluZy4KKyAqLwogI2RlZmluZSBSMzAwX1ZBUF9VTktOT1dOXzIyMUMgICAgICAgICAgICAgICAweDIyMUMKICMgICAgICAgZGVmaW5lIFIzMDBfMjIxQ19OT1JNQUwgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCiAjICAgICAgIGRlZmluZSBSMzAwXzIyMUNfQ0xFQVIgICAgICAgICAgICAgICAgICAgMHgwMDAxQzAwMAogCisvKiBUaGVzZSBzZWVtIHRvIGJlIHBlci1waXhlbCBhbmQgcGVyLXZlcnRleCBYIGFuZCBZIGNsaXBwaW5nIHBsYW5lcy4gVGhlIGZpcnN0CisgKiBwbGFuZSBpcyBwZXItcGl4ZWwgYW5kIHRoZSBzZWNvbmQgcGxhbmUgaXMgcGVyLXZlcnRleC4KKyAqCisgKiBUaGlzIHdhcyBkZXRlcm1pbmVkIGJ5IGV4cGVyaW1lbnRhdGlvbiBhbG9uZSBidXQgSSBiZWxpZXZlIGl0IGlzIGNvcnJlY3QuCisgKgorICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBjYWxsZWQgWF9RVUFEMF8xX0ZMIHRvIFhfUVVBRDBfNF9GTCBieSBnbHh0ZXN0LgorICovCisjZGVmaW5lIFIzMDBfVkFQX0NMSVBfWF8wICAgICAgICAgICAgICAgICAgIDB4MjIyMAorI2RlZmluZSBSMzAwX1ZBUF9DTElQX1hfMSAgICAgICAgICAgICAgICAgICAweDIyMjQKKyNkZWZpbmUgUjMwMF9WQVBfQ0xJUF9ZXzAgICAgICAgICAgICAgICAgICAgMHgyMjI4CisjZGVmaW5lIFIzMDBfVkFQX0NMSVBfWV8xICAgICAgICAgICAgICAgICAgIDB4MjIzMAorCiAvKiBnYXAgKi8KKwogLyogU29tZXRpbWVzLCBFTkRfT0ZfUEtUIGFuZCAweDIyODQ9MCBhcmUgdGhlIG9ubHkgY29tbWFuZHMgc2VudCBiZXR3ZWVuCi0vLyByZW5kZXJpbmcgY29tbWFuZHMgYW5kIG92ZXJ3cml0aW5nIHZlcnRleCBwcm9ncmFtIHBhcmFtZXRlcnMuCi0vLyBUaGVyZWZvcmUsIEkgc3VzcGVjdCB3cml0aW5nIHplcm8gdG8gMHgyMjg0IHN5bmNocm9uaXplcyB0aGUgZW5naW5lIGFuZAotLy8gYXZvaWRzIGJ1Z3MgY2F1c2VkIGJ5IHN0aWxsIHJ1bm5pbmcgc2hhZGVycyByZWFkaW5nIGJhZCBkYXRhIGZyb20gbWVtb3J5LiAqLwotI2RlZmluZSBSMzAwX1ZBUF9QVlNfV0FJVElETEUgICAgICAgICAgICAgICAweDIyODQJLyogR1VFU1MgKi8KKyAqIHJlbmRlcmluZyBjb21tYW5kcyBhbmQgb3ZlcndyaXRpbmcgdmVydGV4IHByb2dyYW0gcGFyYW1ldGVycy4KKyAqIFRoZXJlZm9yZSwgSSBzdXNwZWN0IHdyaXRpbmcgemVybyB0byAweDIyODQgc3luY2hyb25pemVzIHRoZSBlbmdpbmUgYW5kCisgKiBhdm9pZHMgYnVncyBjYXVzZWQgYnkgc3RpbGwgcnVubmluZyBzaGFkZXJzIHJlYWRpbmcgYmFkIGRhdGEgZnJvbSBtZW1vcnkuCisgKi8KKyNkZWZpbmUgUjMwMF9WQVBfUFZTX1dBSVRJRExFICAgICAgICAgICAgICAgMHgyMjg0IC8qIEdVRVNTICovCiAKIC8qIEFic29sdXRlbHkgbm8gY2x1ZSB3aGF0IHRoaXMgcmVnaXN0ZXIgaXMgYWJvdXQuICovCiAjZGVmaW5lIFIzMDBfVkFQX1VOS05PV05fMjI4OCAgICAgICAgICAgICAgIDB4MjI4OAotIyAgICAgICBkZWZpbmUgUjMwMF8yMjg4X1IzMDAgICAgICAgICAgICAgICAgICAgIDB4MDA3NTAwMDAJLyogLS0gbmggKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfMjI4OF9SVjM1MCAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCS8qIC0tIFZsYWRpbWlyICovCisjICAgICAgIGRlZmluZSBSMzAwXzIyODhfUjMwMCAgICAgICAgICAgICAgICAgICAgMHgwMDc1MDAwMCAvKiAtLSBuaCAqLworIyAgICAgICBkZWZpbmUgUjMwMF8yMjg4X1JWMzUwICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYgLyogLS0gVmxhZGltaXIgKi8KIAogLyogZ2FwICovCisKIC8qIEFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9uIGFyZWEgb2YgdGhlCi0vLyBtZW1vcnkgYmFuay4gUFJPR1JBTV9FTkQgcG9pbnRzIHRvIHRoZSBsYXN0IGluc3RydWN0aW9uIG9mIHRoZSBhY3RpdmUKLS8vIHByb2dyYW0KLS8vCi0vLyBUaGUgbWVhbmluZyBvZiB0aGUgdHdvIFVOS05PV04gZmllbGRzIGlzIG9idmlvdXNseSBub3Qga25vd24uIEhvd2V2ZXIsCi0vLyBleHBlcmltZW50cyBzbyBmYXIgaGF2ZSBzaG93biB0aGF0IGJvdGggKm11c3QqIHBvaW50IHRvIGFuIGluc3RydWN0aW9uCi0vLyBpbnNpZGUgdGhlIHZlcnRleCBwcm9ncmFtLCBvdGhlcndpc2UgdGhlIEdQVSBsb2NrcyB1cC4KLS8vIGZnbHJ4IHVzdWFsbHkgc2V0cyBDTlRMXzNfVU5LTk9XTiB0byB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIGFuZAotLy8gQ05UTF8xX1VOS05PV04gcG9pbnRzIHRvIGluc3RydWN0aW9uIHdoZXJlIGxhc3Qgd3JpdGUgdG8gcG9zaXRpb24gdGFrZXMgcGxhY2UuCi0vLyBNb3N0IGxpa2VseSB0aGlzIGlzIHVzZWQgdG8gaWdub3JlIHJlc3Qgb2YgdGhlIHByb2dyYW0gaW4gY2FzZXMgd2hlcmUgZ3JvdXAgb2YgdmVydHMgYXJlbnQgdmlzaWJsZS4KLS8vIEZvciBzb21lIHJlYXNvbiB0aGlzICJzZWN0aW9uIiBpcyBzb21ldGltZXMgYWNjZXB0ZWQgb3RoZXIgaW5zdHJ1Y3Rpb24gdGhhdCBoYXZlCi0vLyBubyByZWxhdGlvbnNoaXAgd2l0aCBwb3NpdGlvbiBjYWxjdWxhdGlvbnMuCi0qLworICogbWVtb3J5IGJhbmsuIFBST0dSQU1fRU5EIHBvaW50cyB0byB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiB0aGUgYWN0aXZlCisgKiBwcm9ncmFtCisgKgorICogVGhlIG1lYW5pbmcgb2YgdGhlIHR3byBVTktOT1dOIGZpZWxkcyBpcyBvYnZpb3VzbHkgbm90IGtub3duLiBIb3dldmVyLAorICogZXhwZXJpbWVudHMgc28gZmFyIGhhdmUgc2hvd24gdGhhdCBib3RoICptdXN0KiBwb2ludCB0byBhbiBpbnN0cnVjdGlvbgorICogaW5zaWRlIHRoZSB2ZXJ0ZXggcHJvZ3JhbSwgb3RoZXJ3aXNlIHRoZSBHUFUgbG9ja3MgdXAuCisgKgorICogZmdscnggdXN1YWxseSBzZXRzIENOVExfM19VTktOT1dOIHRvIHRoZSBlbmQgb2YgdGhlIHByb2dyYW0gYW5kCisgKiBSMzAwX1BWU19DTlRMXzFfUE9TX0VORF9TSElGVCBwb2ludHMgdG8gaW5zdHJ1Y3Rpb24gd2hlcmUgbGFzdCB3cml0ZSB0bworICogcG9zaXRpb24gdGFrZXMgcGxhY2UuCisgKgorICogTW9zdCBsaWtlbHkgdGhpcyBpcyB1c2VkIHRvIGlnbm9yZSByZXN0IG9mIHRoZSBwcm9ncmFtIGluIGNhc2VzCisgKiB3aGVyZSBncm91cCBvZiB2ZXJ0cyBhcmVudCB2aXNpYmxlLiBGb3Igc29tZSByZWFzb24gdGhpcyAic2VjdGlvbiIKKyAqIGlzIHNvbWV0aW1lcyBhY2NlcHRlZCBvdGhlciBpbnN0cnVjdGlvbiB0aGF0IGhhdmUgbm8gcmVsYXRpb25zaGlwIHdpdGgKKyAqIHBvc2l0aW9uIGNhbGN1bGF0aW9ucy4KKyAqLwogI2RlZmluZSBSMzAwX1ZBUF9QVlNfQ05UTF8xICAgICAgICAgICAgICAgICAweDIyRDAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QUk9HUkFNX1NUQVJUX1NISUZUICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8xX1BPU19FTkRfU0hJRlQgICAgICAgICAxMAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8xX1BST0dSQU1fRU5EX1NISUZUICAgICAyMAotLyogQWRkcmVzc2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgdmVydGV4IHByb2dyYW0gcGFyYW1ldGVycyBhcmVhLiAqLworLyogQWRkcmVzc2VzIGFyZSByZWxhdGl2ZSB0aGUgdGhlIHZlcnRleCBwcm9ncmFtIHBhcmFtZXRlcnMgYXJlYS4gKi8KICNkZWZpbmUgUjMwMF9WQVBfUFZTX0NOVExfMiAgICAgICAgICAgICAgICAgMHgyMkQ0CiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzJfUEFSQU1fT0ZGU0VUX1NISUZUIDAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMl9QQVJBTV9DT1VOVF9TSElGVCAgMTYKQEAgLTMwMiwyMyArMzU2LDI2IEBACiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzNfUFJPR1JBTV9VTktOT1dOMl9TSElGVCAwCiAKIC8qIFRoZSBlbnRpcmUgcmFuZ2UgZnJvbSAweDIzMDAgdG8gMHgyQUMgaW5jbHVzaXZlIHNlZW1zIHRvIGJlIHVzZWQgZm9yCi0vLyBpbW1lZGlhdGUgdmVydGljZXMgKi8KKyAqIGltbWVkaWF0ZSB2ZXJ0aWNlcworICovCiAjZGVmaW5lIFIzMDBfVkFQX1ZUWF9DT0xPUl9SICAgICAgICAgICAgICAgIDB4MjQ2NAogI2RlZmluZSBSMzAwX1ZBUF9WVFhfQ09MT1JfRyAgICAgICAgICAgICAgICAweDI0NjgKICNkZWZpbmUgUjMwMF9WQVBfVlRYX0NPTE9SX0IgICAgICAgICAgICAgICAgMHgyNDZDCi0jZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9YXzEgICAgICAgICAgICAgIDB4MjQ5MAkvKiB1c2VkIGZvciBnbFZlcnRleDIqKCkgKi8KKyNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1hfMSAgICAgICAgICAgICAgMHgyNDkwIC8qIHVzZWQgZm9yIGdsVmVydGV4MiooKSAqLwogI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWV8xICAgICAgICAgICAgICAweDI0OTQKLSNkZWZpbmUgUjMwMF9WQVBfVlRYX0NPTE9SX1BLRCAgICAgICAgICAgICAgMHgyNDlDCS8qIFJHQkEgKi8KLSNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1hfMiAgICAgICAgICAgICAgMHgyNEEwCS8qIHVzZWQgZm9yIGdsVmVydGV4MyooKSAqLworI2RlZmluZSBSMzAwX1ZBUF9WVFhfQ09MT1JfUEtEICAgICAgICAgICAgICAweDI0OUMgLyogUkdCQSAqLworI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWF8yICAgICAgICAgICAgICAweDI0QTAgLyogdXNlZCBmb3IgZ2xWZXJ0ZXgzKigpICovCiAjZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9ZXzIgICAgICAgICAgICAgIDB4MjRBNAogI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWl8yICAgICAgICAgICAgICAweDI0QTgKLSNkZWZpbmUgUjMwMF9WQVBfVlRYX0VORF9PRl9QS1QgICAgICAgICAgICAgMHgyNEFDCS8qIHdyaXRlIDAgdG8gaW5kaWNhdGUgZW5kIG9mIHBhY2tldD8gKi8KKy8qIHdyaXRlIDAgdG8gaW5kaWNhdGUgZW5kIG9mIHBhY2tldD8gKi8KKyNkZWZpbmUgUjMwMF9WQVBfVlRYX0VORF9PRl9QS1QgICAgICAgICAgICAgMHgyNEFDCiAKIC8qIGdhcCAqLwogCiAvKiBUaGVzZSBhcmUgdmFsdWVzIGZyb20gcjMwMF9yZWcvcjMwMF9yZWcuaCAtIHRoZXkgYXJlIGtub3duIHRvIGJlIGNvcnJlY3QKLSAgIGFuZCBhcmUgaGVyZSBzbyB3ZSBjYW4gdXNlIG9uZSByZWdpc3RlciBmaWxlIGluc3RlYWQgb2Ygc2V2ZXJhbAotICAgLSBWbGFkaW1pciAqLworICogYW5kIGFyZSBoZXJlIHNvIHdlIGNhbiB1c2Ugb25lIHJlZ2lzdGVyIGZpbGUgaW5zdGVhZCBvZiBzZXZlcmFsCisgKiAtIFZsYWRpbWlyCisgKi8KICNkZWZpbmUgUjMwMF9HQl9WQVBfUkFTVEVSX1ZUWF9GTVRfMAkweDQwMDAKICMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzBfX1BPU19QUkVTRU5UCSgxPDwwKQogIwlkZWZpbmUgUjMwMF9HQl9WQVBfUkFTVEVSX1ZUWF9GTVRfMF9fQ09MT1JfMF9QUkVTRU5UCSgxPDwxKQpAQCAtMzQxLDE0ICszOTgsMTYgQEAKICMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzFfX1RFWF83X0NPTVBfQ05UX1NISUZUCTIxCiAKIC8qIFVOSzMwIHNlZW1zIHRvIGVuYWJsZXMgcG9pbnQgdG8gcXVhZCB0cmFuc2Zvcm1hdGlvbiBvbiB0ZXh0dXJlcwotICAgKG9yIHNvbWV0aGluZyBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhhdCkuCi0gICBUaGlzIGJpdCBpcyByYXRoZXIgZmF0YWwgYXQgdGhlIHRpbWUgYmVpbmcgZHVlIHRvIGxhY2tpbmdzIGF0IHBpeGVsIHNoYWRlciBzaWRlICovCisgKiAob3Igc29tZXRoaW5nIGNsb3NlbHkgcmVsYXRlZCB0byB0aGF0KS4KKyAqIFRoaXMgYml0IGlzIHJhdGhlciBmYXRhbCBhdCB0aGUgdGltZSBiZWluZyBkdWUgdG8gbGFja2luZ3MgYXQgcGl4ZWwKKyAqIHNoYWRlciBzaWRlCisgKi8KICNkZWZpbmUgUjMwMF9HQl9FTkFCTEUJMHg0MDA4CiAjCWRlZmluZSBSMzAwX0dCX1BPSU5UX1NUVUZGX0VOQUJMRQkoMTw8MCkKICMJZGVmaW5lIFIzMDBfR0JfTElORV9TVFVGRl9FTkFCTEUJKDE8PDEpCiAjCWRlZmluZSBSMzAwX0dCX1RSSUFOR0xFX1NUVUZGX0VOQUJMRQkoMTw8MikKICMJZGVmaW5lIFIzMDBfR0JfU1RFTkNJTF9BVVRPX0VOQUJMRQkoMTw8NCkKLSMJZGVmaW5lIFIzMDBfR0JfVU5LMzAJCQkoMTw8MzApCisjCWRlZmluZSBSMzAwX0dCX1VOSzMxCQkJKDE8PDMxKQogCS8qIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBpcyAyIGJpdHMgd2lkZSAqLwogI2RlZmluZSBSMzAwX0dCX1RFWF9SRVBMSUNBVEUJMAogI2RlZmluZSBSMzAwX0dCX1RFWF9TVAkJMQpAQCAtMzgzLDExICs0NDIsMTMgQEAKICMJZGVmaW5lIFIzMDBfR0JfTVNQT1MxX19NU19ZNV9TSElGVAkyMAogIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzFfX01TQkQxCQkyNAogCisKICNkZWZpbmUgUjMwMF9HQl9USUxFX0NPTkZJRwkweDQwMTgKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9FTkFCTEUJKDE8PDApCiAjCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SVjMwMAkwCiAjCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SMzAwCSgzPDwxKQogIwlkZWZpbmUgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUjQyMAkoNzw8MSkKKyMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1JWNDEwCSgzPDwxKQogIwlkZWZpbmUgUjMwMF9HQl9USUxFX1NJWkVfOAkJMAogIwlkZWZpbmUgUjMwMF9HQl9USUxFX1NJWkVfMTYJCSgxPDw0KQogIwlkZWZpbmUgUjMwMF9HQl9USUxFX1NJWkVfMzIJCSgyPDw0KQpAQCAtNDQyLDE3ICs1MDMsMTggQEAKICMJZGVmaW5lIFIzMDBfR0JfV19TRUxFQ1RfMQkJKDE8PDQpCiAKICNkZWZpbmUgUjMwMF9HQl9BQV9DT05GSUcJCTB4NDAyMAorIwlkZWZpbmUgUjMwMF9BQV9ESVNBQkxFCQkJMHgwMAogIwlkZWZpbmUgUjMwMF9BQV9FTkFCTEUJCQkweDAxCiAjCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfMgkJMAogIwlkZWZpbmUgUjMwMF9BQV9TVUJTQU1QTEVTXzMJCSgxPDwxKQogIwlkZWZpbmUgUjMwMF9BQV9TVUJTQU1QTEVTXzQJCSgyPDwxKQogIwlkZWZpbmUgUjMwMF9BQV9TVUJTQU1QTEVTXzYJCSgzPDwxKQogCi0vKiBFTkQgKi8KLQogLyogZ2FwICovCisKIC8qIFplcm8gdG8gZmx1c2ggY2FjaGVzLiAqLwogI2RlZmluZSBSMzAwX1RYX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAweDQxMDAKKyNkZWZpbmUgUjMwMF9UWF9GTFVTSCAgICAgICAgICAgICAgICAgICAgICAgMHgwCiAKIC8qIFRoZSB1cHBlciBlbmFibGUgYml0cyBhcmUgZ3Vlc3NlZCwgYmFzZWQgb24gZmdscnggcmVwb3J0ZWQgbGltaXRzLiAqLwogI2RlZmluZSBSMzAwX1RYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDQxMDQKQEAgLTQ3NCwyNCArNTM2LDI1IEBACiAjICAgICAgIGRlZmluZSBSMzAwX1RYX0VOQUJMRV8xNSAgICAgICAgICAgICAgICAgKDEgPDwgMTUpCiAKIC8qIFRoZSBwb2ludHNpemUgaXMgZ2l2ZW4gaW4gbXVsdGlwbGVzIG9mIDYuIFRoZSBwb2ludHNpemUgY2FuIGJlCi0vLyBlbm9ybW91czogQ2xlYXIoKSByZW5kZXJzIGEgc2luZ2xlIHBvaW50IHRoYXQgZmlsbHMgdGhlIGVudGlyZQotLy8gZnJhbWVidWZmZXIuICovCisgKiBlbm9ybW91czogQ2xlYXIoKSByZW5kZXJzIGEgc2luZ2xlIHBvaW50IHRoYXQgZmlsbHMgdGhlIGVudGlyZQorICogZnJhbWVidWZmZXIuCisgKi8KICNkZWZpbmUgUjMwMF9SRV9QT0lOVFNJWkUgICAgICAgICAgICAgICAgICAgMHg0MjFDCiAjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9ZX1NISUZUICAgICAgICAgICAgMAotIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWV9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1lfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDApIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9YX1NISUZUICAgICAgICAgICAgMTYKLSMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1hfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDE2KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWF9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMTYpIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9NQVggICAgICAgICAgICAgKFIzMDBfUE9JTlRTSVpFX1lfTUFTSyAvIDYpCiAKIC8qIFRoZSBsaW5lIHdpZHRoIGlzIGdpdmVuIGluIG11bHRpcGxlcyBvZiA2LgotICAgSW4gZGVmYXVsdCBtb2RlIGxpbmVzIGFyZSBjbGFzc2lmaWVkIGFzIHZlcnRpY2FsIGxpbmVzLgotICAgSE86IGhvcml6b250YWwKLSAgIFZFOiB2ZXJ0aWNhbCBvciBob3Jpem9udGFsCi0gICBITyAmIFZFOiBubyBjbGFzc2lmaWNhdGlvbgotKi8KKyAqIEluIGRlZmF1bHQgbW9kZSBsaW5lcyBhcmUgY2xhc3NpZmllZCBhcyB2ZXJ0aWNhbCBsaW5lcy4KKyAqIEhPOiBob3Jpem9udGFsCisgKiBWRTogdmVydGljYWwgb3IgaG9yaXpvbnRhbAorICogSE8gJiBWRTogbm8gY2xhc3NpZmljYXRpb24KKyAqLwogI2RlZmluZSBSMzAwX1JFX0xJTkVfQ05UICAgICAgICAgICAgICAgICAgICAgIDB4NDIzNAogIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FU0laRV9TSElGVCAgICAgICAgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfTElORVNJWkVfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDApCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0xJTkVTSVpFX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAwKSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FU0laRV9NQVggICAgICAgICAgICAgKFIzMDBfTElORVNJWkVfTUFTSyAvIDYpCiAjICAgICAgIGRlZmluZSBSMzAwX0xJTkVfQ05UX0hPICAgICAgICAgICAgICAgKDEgPDwgMTYpCiAjICAgICAgIGRlZmluZSBSMzAwX0xJTkVfQ05UX1ZFICAgICAgICAgICAgICAgKDEgPDwgMTcpCkBAIC00OTksNiArNTYyLDkgQEAKIC8qIFNvbWUgc29ydCBvZiBzY2FsZSBvciBjbGFtcCB2YWx1ZSBmb3IgdGV4Y29vcmRsZXNzIHRleHR1cmVzLiAqLwogI2RlZmluZSBSMzAwX1JFX1VOSzQyMzggICAgICAgICAgICAgICAgICAgICAgIDB4NDIzOAogCisvKiBTb21ldGhpbmcgc2hhZGUgcmVsYXRlZCAqLworI2RlZmluZSBSMzAwX1JFX1NIQURFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDI3NAorCiAjZGVmaW5lIFIzMDBfUkVfU0hBREVfTU9ERUwgICAgICAgICAgICAgICAgICAgMHg0Mjc4CiAjCWRlZmluZSBSMzAwX1JFX1NIQURFX01PREVMX1NNT09USCAgICAgMHgzYWFhYQogIwlkZWZpbmUgUjMwMF9SRV9TSEFERV9NT0RFTF9GTEFUICAgICAgIDB4Mzk1OTUKQEAgLTUxMywyNCArNTc5LDMxIEBACiAjCWRlZmluZSBSMzAwX1BNX0JBQ0tfTElORSAgICAgICAgICAgICAgKDEgPDwgNykKICMJZGVmaW5lIFIzMDBfUE1fQkFDS19GSUxMICAgICAgICAgICAgICAoMSA8PCA4KQogCisvKiBGb2cgcGFyYW1ldGVycyAqLworI2RlZmluZSBSMzAwX1JFX0ZPR19TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDB4NDI5NAorI2RlZmluZSBSMzAwX1JFX0ZPR19TVEFSVCAgICAgICAgICAgICAgICAgICAgIDB4NDI5OAorCiAvKiBOb3Qgc3VyZSB3aHkgdGhlcmUgYXJlIGR1cGxpY2F0ZSBvZiBmYWN0b3IgYW5kIGNvbnN0YW50IHZhbHVlcy4KLSAgIE15IGJlc3QgZ3Vlc3Mgc28gZmFyIGlzIHRoYXQgdGhlcmUgYXJlIHNlcGVyYXRlIHpiaWFzZXMgZm9yIHRlc3QgYW5kIHdyaXRlLgotICAgT3JkZXJpbmcgbWlnaHQgYmUgd3JvbmcuCi0gICBTb21lIG9mIHRoZSB0ZXN0cyBpbmRpY2F0ZSB0aGF0IGZnbCBoYXMgYSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiB6YmlhcwotICAgdmlhIHBpeGVsIHNoYWRlcnMuICovCisgKiBNeSBiZXN0IGd1ZXNzIHNvIGZhciBpcyB0aGF0IHRoZXJlIGFyZSBzZXBlcmF0ZSB6Ymlhc2VzIGZvciB0ZXN0IGFuZCB3cml0ZS4KKyAqIE9yZGVyaW5nIG1pZ2h0IGJlIHdyb25nLgorICogU29tZSBvZiB0aGUgdGVzdHMgaW5kaWNhdGUgdGhhdCBmZ2wgaGFzIGEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgemJpYXMKKyAqIHZpYSBwaXhlbCBzaGFkZXJzLgorICovCisjZGVmaW5lIFIzMDBfUkVfWkJJQVNfQ05UTCAgICAgICAgICAgICAgICAgICAgMHg0MkEwIC8qIEdVRVNTICovCiAjZGVmaW5lIFIzMDBfUkVfWkJJQVNfVF9GQUNUT1IgICAgICAgICAgICAgICAgMHg0MkE0CiAjZGVmaW5lIFIzMDBfUkVfWkJJQVNfVF9DT05TVEFOVCAgICAgICAgICAgICAgMHg0MkE4CiAjZGVmaW5lIFIzMDBfUkVfWkJJQVNfV19GQUNUT1IgICAgICAgICAgICAgICAgMHg0MkFDCiAjZGVmaW5lIFIzMDBfUkVfWkJJQVNfV19DT05TVEFOVCAgICAgICAgICAgICAgMHg0MkIwCiAKIC8qIFRoaXMgcmVnaXN0ZXIgbmVlZHMgdG8gYmUgc2V0IHRvICgxPDwxKSBmb3IgUlYzNTAgdG8gY29ycmVjdGx5Ci0gICBwZXJmb3JtIGRlcHRoIHRlc3QgKHNlZSAtLXZiLXRyaWFuZ2xlcyBpbiByMzAwX2RlbW8pCi0gICBEb24ndCBrbm93IGFib3V0IG90aGVyIGNoaXBzLiAtIFZsYWRpbWlyCi0gICBUaGlzIGlzIHNldCB0byAzIHdoZW4gR0xfUE9MWUdPTl9PRkZTRVRfRklMTCBpcyBvbi4KLSAgIE15IGd1ZXNzIGlzIHRoYXQgdGhlcmUgYXJlIHR3byBiaXRzIGZvciBlYWNoIHpiaWFzIHByaW1pdGl2ZSAoRklMTCwgTElORSwgUE9JTlQpLgotICAgT25lIHRvIGVuYWJsZSBkZXB0aCB0ZXN0IGFuZCBvbmUgZm9yIGRlcHRoIHdyaXRlLgotICAgWWV0IHRoaXMgZG9lc250IGV4cGxhaW4gd2h5IGRlcHRoIHdyaXRlcyB3b3JrIC4uLgotICAgICovCisgKiBwZXJmb3JtIGRlcHRoIHRlc3QgKHNlZSAtLXZiLXRyaWFuZ2xlcyBpbiByMzAwX2RlbW8pCisgKiBEb24ndCBrbm93IGFib3V0IG90aGVyIGNoaXBzLiAtIFZsYWRpbWlyCisgKiBUaGlzIGlzIHNldCB0byAzIHdoZW4gR0xfUE9MWUdPTl9PRkZTRVRfRklMTCBpcyBvbi4KKyAqIE15IGd1ZXNzIGlzIHRoYXQgdGhlcmUgYXJlIHR3byBiaXRzIGZvciBlYWNoIHpiaWFzIHByaW1pdGl2ZQorICogKEZJTEwsIExJTkUsIFBPSU5UKS4KKyAqICBPbmUgdG8gZW5hYmxlIGRlcHRoIHRlc3QgYW5kIG9uZSBmb3IgZGVwdGggd3JpdGUuCisgKiBZZXQgdGhpcyBkb2VzbnQgZXhwbGFpbiB3aHkgZGVwdGggd3JpdGVzIHdvcmsgLi4uCisgKi8KICNkZWZpbmUgUjMwMF9SRV9PQ0NMVVNJT05fQ05UTAkJICAgIDB4NDJCNAogIwlkZWZpbmUgUjMwMF9PQ0NMVVNJT05fT04JCSgxPDwxKQogCkBAIC01NDAsMzAgKzYxMywzOCBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9GUk9OVF9GQUNFX0NDVyAgICAgICAgICAgICAgICgwIDw8IDIpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZST05UX0ZBQ0VfQ1cgICAgICAgICAgICAgICAgKDEgPDwgMikKIAotLyogQkVHSU46IFJhc3Rlcml6YXRpb24gLyBJbnRlcnBvbGF0b3JzIC0gbWFueSBndWVzc2VzCi0vLyAwX1VOS05PV05fMTggaGFzIGFsd2F5cyBiZWVuIHNldCBleGNlcHQgZm9yIGNsZWFyIG9wZXJhdGlvbnMuCi0vLyBUQ19DTlQgaXMgdGhlIG51bWJlciBvZiBpbmNvbWluZyB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyAoaS5lLiBpdCBkZXBlbmRzCi0vLyBvbiB0aGUgdmVydGV4IHByb2dyYW0sICpub3QqIHRoZSBmcmFnbWVudCBwcm9ncmFtKSAqLworCisvKiBCRUdJTjogUmFzdGVyaXphdGlvbiAvIEludGVycG9sYXRvcnMgLSBtYW55IGd1ZXNzZXMgKi8KKworLyogMF9VTktOT1dOXzE4IGhhcyBhbHdheXMgYmVlbiBzZXQgZXhjZXB0IGZvciBjbGVhciBvcGVyYXRpb25zLgorICogVENfQ05UIGlzIHRoZSBudW1iZXIgb2YgaW5jb21pbmcgdGV4dHVyZSBjb29yZGluYXRlIHNldHMgKGkuZS4gaXQgZGVwZW5kcworICogb24gdGhlIHZlcnRleCBwcm9ncmFtLCAqbm90KiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSkKKyAqLwogI2RlZmluZSBSMzAwX1JTX0NOVExfMCAgICAgICAgICAgICAgICAgICAgICAweDQzMDAKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfQ05UTF9UQ19DTlRfU0hJRlQgICAgICAgICAyCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX0NOVExfVENfQ05UX01BU0sgICAgICAgICAgKDcgPDwgMikKLSMJCWRlZmluZSBSMzAwX1JTX0NOVExfQ0lfQ05UX1NISUZUICAgICAgICAgNwkvKiBudW1iZXIgb2YgY29sb3IgaW50ZXJwb2xhdG9ycyB1c2VkICovCisJLyogbnVtYmVyIG9mIGNvbG9yIGludGVycG9sYXRvcnMgdXNlZCAqLworIwlkZWZpbmUgUjMwMF9SU19DTlRMX0NJX0NOVF9TSElGVCAgICAgICAgIDcKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfQ05UTF8wX1VOS05PV05fMTggICAgICAgICAoMSA8PCAxOCkKLS8qIEd1ZXNzOiBSU19DTlRMXzEgaG9sZHMgdGhlIGluZGV4IG9mIHRoZSBoaWdoZXN0IHVzZWQgUlNfUk9VVEVfbiByZWdpc3Rlci4gKi8KKwkvKiBHdWVzczogUlNfQ05UTF8xIGhvbGRzIHRoZSBpbmRleCBvZiB0aGUgaGlnaGVzdCB1c2VkIFJTX1JPVVRFX24KKwkgICByZWdpc3Rlci4gKi8KICNkZWZpbmUgUjMwMF9SU19DTlRMXzEgICAgICAgICAgICAgICAgICAgICAgMHg0MzA0CiAKIC8qIGdhcCAqLworCiAvKiBPbmx5IHVzZWQgZm9yIHRleHR1cmUgY29vcmRpbmF0ZXMuCi0vLyBVc2UgdGhlIHNvdXJjZSBmaWVsZCB0byByb3V0ZSB0ZXh0dXJlIGNvb3JkaW5hdGUgaW5wdXQgZnJvbSB0aGUgdmVydGV4IHByb2dyYW0KLS8vIHRvIHRoZSBkZXNpcmVkIGludGVycG9sYXRvci4gTm90ZSB0aGF0IHRoZSBzb3VyY2UgZmllbGQgaXMgcmVsYXRpdmUgdG8gdGhlCi0vLyBvdXRwdXRzIHRoZSB2ZXJ0ZXggcHJvZ3JhbSAqYWN0dWFsbHkqIHdyaXRlcy4gSWYgYSB2ZXJ0ZXggcHJvZ3JhbSBvbmx5IHdyaXRlcwotLy8gdGV4Y29vcmRbMV0sIHRoaXMgd2lsbCBiZSBzb3VyY2UgaW5kZXggMC4KLS8vIFNldCBJTlRFUlBfVVNFRCBvbiBhbGwgaW50ZXJwb2xhdG9ycyB0aGF0IHByb2R1Y2UgZGF0YSB1c2VkIGJ5IHRoZQotLy8gZnJhZ21lbnQgcHJvZ3JhbS4gSU5URVJQX1VTRUQgbG9va3MgbGlrZSBhIHN3aXp6bGluZyBtYXNrLCBidXQKLS8vIEkgaGF2ZW4ndCBzZWVuIGl0IHVzZWQgdGhhdCB3YXkuCi0vLwotLy8gTm90ZTogVGhlIF9VTktOT1dOIGNvbnN0YW50cyBhcmUgYWx3YXlzIHNldCBpbiB0aGVpciByZXNwZWN0aXZlIHJlZ2lzdGVyLgotLy8gSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgbmVjZXNzYXJ5LiAqLworICogVXNlIHRoZSBzb3VyY2UgZmllbGQgdG8gcm91dGUgdGV4dHVyZSBjb29yZGluYXRlIGlucHV0IGZyb20gdGhlCisgKiB2ZXJ0ZXggcHJvZ3JhbSB0byB0aGUgZGVzaXJlZCBpbnRlcnBvbGF0b3IuIE5vdGUgdGhhdCB0aGUgc291cmNlCisgKiBmaWVsZCBpcyByZWxhdGl2ZSB0byB0aGUgb3V0cHV0cyB0aGUgdmVydGV4IHByb2dyYW0gKmFjdHVhbGx5KgorICogd3JpdGVzLiBJZiBhIHZlcnRleCBwcm9ncmFtIG9ubHkgd3JpdGVzIHRleGNvb3JkWzFdLCB0aGlzIHdpbGwKKyAqIGJlIHNvdXJjZSBpbmRleCAwLgorICogU2V0IElOVEVSUF9VU0VEIG9uIGFsbCBpbnRlcnBvbGF0b3JzIHRoYXQgcHJvZHVjZSBkYXRhIHVzZWQgYnkKKyAqIHRoZSBmcmFnbWVudCBwcm9ncmFtLiBJTlRFUlBfVVNFRCBsb29rcyBsaWtlIGEgc3dpenpsaW5nIG1hc2ssCisgKiBidXQgSSBoYXZlbid0IHNlZW4gaXQgdXNlZCB0aGF0IHdheS4KKyAqCisgKiBOb3RlOiBUaGUgX1VOS05PV04gY29uc3RhbnRzIGFyZSBhbHdheXMgc2V0IGluIHRoZWlyIHJlc3BlY3RpdmUKKyAqIHJlZ2lzdGVyLiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBuZWNlc3NhcnkuCisgKi8KICNkZWZpbmUgUjMwMF9SU19JTlRFUlBfMCAgICAgICAgICAgICAgICAgICAgMHg0MzEwCiAjZGVmaW5lIFIzMDBfUlNfSU5URVJQXzEgICAgICAgICAgICAgICAgICAgIDB4NDMxNAogIyAgICAgICBkZWZpbmUgUjMwMF9SU19JTlRFUlBfMV9VTktOT1dOICAgICAgICAgIDB4NDAKQEAgLTU4MCw1NCArNjYxLDYzIEBACiAjICAgICAgIGRlZmluZSBSMzAwX1JTX0lOVEVSUF9VU0VEICAgICAgICAgICAgICAgMHgwMEQxMDAwMAogCiAvKiBUaGVzZSBEV09SRHMgY29udHJvbCBob3cgdmVydGV4IGRhdGEgaXMgcm91dGVkIGludG8gZnJhZ21lbnQgcHJvZ3JhbQotLy8gcmVnaXN0ZXJzLCBhZnRlciBpbnRlcnBvbGF0b3JzLiAqLworICogcmVnaXN0ZXJzLCBhZnRlciBpbnRlcnBvbGF0b3JzLgorICovCiAjZGVmaW5lIFIzMDBfUlNfUk9VVEVfMCAgICAgICAgICAgICAgICAgICAgIDB4NDMzMAogI2RlZmluZSBSMzAwX1JTX1JPVVRFXzEgICAgICAgICAgICAgICAgICAgICAweDQzMzQKICNkZWZpbmUgUjMwMF9SU19ST1VURV8yICAgICAgICAgICAgICAgICAgICAgMHg0MzM4Ci0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfMyAgICAgICAgICAgICAgICAgICAgIDB4NDMzQwkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzQgICAgICAgICAgICAgICAgICAgICAweDQzNDAJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SU19ST1VURV81ICAgICAgICAgICAgICAgICAgICAgMHg0MzQ0CS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfNiAgICAgICAgICAgICAgICAgICAgIDB4NDM0OAkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzcgICAgICAgICAgICAgICAgICAgICAweDQzNEMJLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SU19ST1VURV8zICAgICAgICAgICAgICAgICAgICAgMHg0MzNDIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfNCAgICAgICAgICAgICAgICAgICAgIDB4NDM0MCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzUgICAgICAgICAgICAgICAgICAgICAweDQzNDQgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SU19ST1VURV82ICAgICAgICAgICAgICAgICAgICAgMHg0MzQ4IC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfNyAgICAgICAgICAgICAgICAgICAgIDB4NDM0QyAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzAgICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8xICAgICAxCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfMiAgICAgMgogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzMgICAgIDMKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF80ICAgICA0Ci0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNSAgICAgNQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzYgICAgIDYJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF83ICAgICA3CS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0VOQUJMRSAgICAgICAgICAgICAgKDEgPDwgMykJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF81ICAgICA1IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNiAgICAgNiAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzcgICAgIDcgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfRU5BQkxFICAgICAgICAgICAgICAoMSA8PCAzKSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9ERVNUX1NISUZUICAgICAgICAgIDYKLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfREVTVF9NQVNLICAgICAgICAgICAoMzEgPDwgNikJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfREVTVF9NQVNLICAgICAgICAgICAoMzEgPDwgNikgLyogR1VFU1MgKi8KIAogLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgY29sb3I6IFdoZW4gdGhlIGZyYWdtZW50IHByb2dyYW0gdXNlcyBjb2xvciwKLS8vIHRoZSBST1VURV8wX0NPTE9SIGJpdCBpcyBzZXQgYW5kIFJPVVRFXzBfQ09MT1JfREVTVCBjb250YWlucyB0aGUKLS8vIGNvbG9yIHJlZ2lzdGVyIGluZGV4LiAqLworICogdGhlIFJPVVRFXzBfQ09MT1IgYml0IGlzIHNldCBhbmQgUk9VVEVfMF9DT0xPUl9ERVNUIGNvbnRhaW5zIHRoZQorICogY29sb3IgcmVnaXN0ZXIgaW5kZXguCisgKgorICogQXBwZXJlbnRseSB5b3UgbWF5IHNldCB0aGUgUjMwMF9SU19ST1VURV8wX0NPTE9SIGJpdCwgYnV0IG5vdCBwcm92aWRlIGFueQorICogUjMwMF9SU19ST1VURV8wX0NPTE9SX0RFU1QgdmFsdWU7IHRoaXMgc2V0dXAgaXMgdXNlZCBmb3IgY2xlYXJpbmcgdGhlIHN0YXRlLgorICogU2VlIHIzMDBfaW9jdGwuYzpyMzAwRW1pdENsZWFyU3RhdGUuIEknbSBub3Qgc3VyZSBpZiB0aGlzIHNldHVwIGlzIHN0cmljdGx5CisgKiBjb3JyZWN0IG9yIG5vdC4gLSBPbGl2ZXIuCisgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfMF9DT0xPUiAgICAgICAgICAgICAoMSA8PCAxNCkKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUX1NISUZUICAxNwotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV8wX0NPTE9SX0RFU1RfTUFTSyAgICgzMSA8PCAxNykJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUX01BU0sgICAoMzEgPDwgMTcpIC8qIEdVRVNTICovCiAvKiBBcyBhYm92ZSwgYnV0IGZvciBzZWNvbmRhcnkgY29sb3IgKi8KICMJCWRlZmluZSBSMzAwX1JTX1JPVVRFXzFfQ09MT1IxICAgICAgICAgICAgKDEgPDwgMTQpCiAjCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX0NPTE9SMV9ERVNUX1NISUZUIDE3CiAjCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX0NPTE9SMV9ERVNUX01BU0sgICgzMSA8PCAxNykKICMJCWRlZmluZSBSMzAwX1JTX1JPVVRFXzFfVU5LTk9XTjExICAgICAgICAgKDEgPDwgMTEpCi0vKiBFTkQgKi8KKy8qIEVORDogUmFzdGVyaXphdGlvbiAvIEludGVycG9sYXRvcnMgLSBtYW55IGd1ZXNzZXMgKi8KIAotLyogQkVHSU46IFNjaXNzb3JzIGFuZCBjbGlwcmVjdHMKLS8vIFRoZXJlIGFyZSBmb3VyIGNsaXBwaW5nIHJlY3RhbmdsZXMuIFRoZWlyIGNvcm5lciBjb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlLgotLy8gRXZlcnkgcGl4ZWwgaXMgYXNzaWduZWQgYSBudW1iZXIgZnJvbSAwIGFuZCAxNSBieSBzZXR0aW5nIGJpdHMgMC0zIGRlcGVuZGluZwotLy8gb24gd2hldGhlciB0aGUgcGl4ZWwgaXMgaW5zaWRlIGNsaXByZWN0cyAwLTMsIHJlc3BlY3RpdmVseS4gRm9yIGV4YW1wbGUsCi0vLyBpZiBhIHBpeGVsIGlzIGluc2lkZSBjbGlwcmVjdHMgMCBhbmQgMSwgYnV0IG91dHNpZGUgMiBhbmQgMywgaXQgaXMgYXNzaWduZWQKLS8vIHRoZSBudW1iZXIgMyAoYmluYXJ5IDAwMTEpLgotLy8gSWZmIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4ZWwncyBudW1iZXIgaW4gUkVfQ0xJUFJFQ1RfQ05UTCBpcyBzZXQsCi0vLyB0aGUgcGl4ZWwgaXMgcmFzdGVyaXplZC4KLS8vCi0vLyBJbiBhZGRpdGlvbiB0byB0aGlzLCB0aGVyZSBpcyBhIHNjaXNzb3JzIHJlY3RhbmdsZS4gT25seSBwaXhlbHMgaW5zaWRlIHRoZQotLy8gc2Npc3NvcnMgcmVjdGFuZ2xlIGFyZSBkcmF3bi4gKGNvb3JkaW5hdGVzIGFyZSBpbmNsdXNpdmUpCi0vLwotLy8gRm9yIHNvbWUgcmVhc29uLCB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZWJ1ZmZlciBpcyBhdCAoMTQ0MCwgMTQ0MCkKLS8vIGZvciB0aGUgcHVycG9zZSBvZiBjbGlwcGluZyBhbmQgc2Npc3NvcnMuICovCisvKiBCRUdJTjogU2Npc3NvcnMgYW5kIGNsaXByZWN0cyAqLworCisvKiBUaGVyZSBhcmUgZm91ciBjbGlwcGluZyByZWN0YW5nbGVzLiBUaGVpciBjb3JuZXIgY29vcmRpbmF0ZXMgYXJlIGluY2x1c2l2ZS4KKyAqIEV2ZXJ5IHBpeGVsIGlzIGFzc2lnbmVkIGEgbnVtYmVyIGZyb20gMCBhbmQgMTUgYnkgc2V0dGluZyBiaXRzIDAtMyBkZXBlbmRpbmcKKyAqIG9uIHdoZXRoZXIgdGhlIHBpeGVsIGlzIGluc2lkZSBjbGlwcmVjdHMgMC0zLCByZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLAorICogaWYgYSBwaXhlbCBpcyBpbnNpZGUgY2xpcHJlY3RzIDAgYW5kIDEsIGJ1dCBvdXRzaWRlIDIgYW5kIDMsIGl0IGlzIGFzc2lnbmVkCisgKiB0aGUgbnVtYmVyIDMgKGJpbmFyeSAwMDExKS4KKyAqIElmZiB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsJ3MgbnVtYmVyIGluIFJFX0NMSVBSRUNUX0NOVEwgaXMgc2V0LAorICogdGhlIHBpeGVsIGlzIHJhc3Rlcml6ZWQuCisgKgorICogSW4gYWRkaXRpb24gdG8gdGhpcywgdGhlcmUgaXMgYSBzY2lzc29ycyByZWN0YW5nbGUuIE9ubHkgcGl4ZWxzIGluc2lkZSB0aGUKKyAqIHNjaXNzb3JzIHJlY3RhbmdsZSBhcmUgZHJhd24uIChjb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlKQorICoKKyAqIEZvciBzb21lIHJlYXNvbiwgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWVidWZmZXIgaXMgYXQgKDE0NDAsIDE0NDApCisgKiBmb3IgdGhlIHB1cnBvc2Ugb2YgY2xpcHBpbmcgYW5kIHNjaXNzb3JzLgorICovCiAjZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfVExfMCAgICAgICAgICAgICAgIDB4NDNCMAogI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX0JSXzAgICAgICAgICAgICAgICAweDQzQjQKICNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9UTF8xICAgICAgICAgICAgICAgMHg0M0I4CkBAIC02NjEsNiArNzUxLDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfQ0xJUF8zMjEwICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkKIAogLyogZ2FwICovCisKICNkZWZpbmUgUjMwMF9SRV9TQ0lTU09SU19UTCAgICAgICAgICAgICAgICAgMHg0M0UwCiAjZGVmaW5lIFIzMDBfUkVfU0NJU1NPUlNfQlIgICAgICAgICAgICAgICAgIDB4NDNFNAogIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19PRkZTRVQgICAgICAgICAgICAgIDE0NDAKQEAgLTY2OCwxMiArNzU5LDE1IEBACiAjICAgICAgIGRlZmluZSBSMzAwX1NDSVNTT1JTX1hfTUFTSyAgICAgICAgICAgICAgKDB4MUZGRiA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19ZX1NISUZUICAgICAgICAgICAgIDEzCiAjICAgICAgIGRlZmluZSBSMzAwX1NDSVNTT1JTX1lfTUFTSyAgICAgICAgICAgICAgKDB4MUZGRiA8PCAxMykKLS8qIEVORCAqLworLyogRU5EOiBTY2lzc29ycyBhbmQgY2xpcHJlY3RzICovCiAKLS8qIEJFR0lOOiBUZXh0dXJlIHNwZWNpZmljYXRpb24KLS8vIFRoZSB0ZXh0dXJlIHNwZWNpZmljYXRpb24gZHdvcmRzIGFyZSBncm91cGVkIGJ5IG1lYW5pbmcgYW5kIG5vdCBieSB0ZXh0dXJlIHVuaXQuCi0vLyBUaGlzIG1lYW5zIHRoYXQgZS5nLiB0aGUgb2Zmc2V0IGZvciB0ZXh0dXJlIGltYWdlIHVuaXQgTiBpcyBmb3VuZCBpbiByZWdpc3RlcgotLy8gVFhfT0ZGU0VUXzAgKyAoNCpOKSAqLworLyogQkVHSU46IFRleHR1cmUgc3BlY2lmaWNhdGlvbiAqLworCisvKgorICogVGhlIHRleHR1cmUgc3BlY2lmaWNhdGlvbiBkd29yZHMgYXJlIGdyb3VwZWQgYnkgbWVhbmluZyBhbmQgbm90IGJ5IHRleHR1cmUKKyAqIHVuaXQuIFRoaXMgbWVhbnMgdGhhdCBlLmcuIHRoZSBvZmZzZXQgZm9yIHRleHR1cmUgaW1hZ2UgdW5pdCBOIGlzIGZvdW5kIGluCisgKiByZWdpc3RlciBUWF9PRkZTRVRfMCArICg0Kk4pCisgKi8KICNkZWZpbmUgUjMwMF9UWF9GSUxURVJfMCAgICAgICAgICAgICAgICAgICAgMHg0NDAwCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSVJST1JFRCAgICAgICAgICAgICAgICAgIDEKQEAgLTY5NywxMyArNzkxLDE0IEBACiAjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfTElORUFSX01JUF9MSU5FQVIgICAgICAgICAoMTAgPDwgIDExKQogCiAvKiBOT1RFOiBORUFSRVNUIGRvZXNudCBzZWVtIHRvIGV4aXN0LgotICAgSW0gbm90IHNldGluZyBNQUdfRklMVEVSX01BU0sgYW5kICgzIDw8IDExKSBvbiBmb3IgYWxsCi0gICBhbmlzb3Ryb3B5IG1vZGVzIGJlY2F1c2UgdGhhdCB3b3VsZCB2b2lkIHNlbGVjdGVkIG1hZyBmaWx0ZXIgKi8KLSMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUICAgICAgICAgICAgICgoMCA8PCAxMykgLyp8UjMwMF9UWF9NQUdfRklMVEVSX01BU0t8KDM8PDExKSovKQotIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX0xJTkVBUiAgICAgICAgICAgICAgKCgwIDw8IDEzKSAvKnxSMzAwX1RYX01BR19GSUxURVJfTUFTS3woMzw8MTEpKi8pCi0jCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVF9NSVBfTkVBUkVTVCAoKDEgPDwgMTMpIC8qfFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLfCgzPDwxMSkqLykKLSMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUX01JUF9MSU5FQVIgICgoMiA8PCAxMykgLyp8UjMwMF9UWF9NQUdfRklMVEVSX01BU0t8KDM8PDExKSovKQotIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX01BU0sgICAgICAgICAgICggKDE1IDw8IDExKSB8ICgzIDw8IDEzKSApCisgKiBJbSBub3Qgc2V0aW5nIE1BR19GSUxURVJfTUFTSyBhbmQgKDMgPDwgMTEpIG9uIGZvciBhbGwKKyAqIGFuaXNvdHJvcHkgbW9kZXMgYmVjYXVzZSB0aGF0IHdvdWxkIHZvaWQgc2VsZWN0ZWQgbWFnIGZpbHRlcgorICovCisjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVCAgICAgICAgICAgICAoMCA8PCAxMykKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19MSU5FQVIgICAgICAgICAgICAgICgwIDw8IDEzKQorIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1RfTUlQX05FQVJFU1QgKDEgPDwgMTMpCisjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVF9NSVBfTElORUFSICAoMiA8PCAxMykKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NQVNLICAgKCAoMTUgPDwgMTEpIHwgKDMgPDwgMTMpICkKICMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzFfVE9fMSAgKDAgPDwgMjEpCiAjCWRlZmluZSBSMzAwX1RYX01BWF9BTklTT18yX1RPXzEgICgyIDw8IDIxKQogIwlkZWZpbmUgUjMwMF9UWF9NQVhfQU5JU09fNF9UT18xICAoNCA8PCAyMSkKQEAgLTczNCwxMCArODI5LDEwIEBACiAjICAgICAgIGRlZmluZSBSMzAwX1RYX0hFSUdIVE1BU0tfU0hJRlQgICAgICAgICAgMTEKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfSEVJR0hUTUFTS19NQVNLICAgICAgICAgICAoMjA0NyA8PCAxMSkKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfVU5LMjMgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMykKLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9TSElGVCAgICAgICAgICAgICAgICAyNgkvKiBsYXJnZXN0IG9mIHdpZHRoLCBoZWlnaHQgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9NQVNLICAgICAgICAgICAgICAgICAoMTUgPDwgMjYpCi0jICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfUFJPSkVDVEVEICAgICAgICAgICAgICAgICAgICAgKDE8PDMwKQotIyAgICAgICBkZWZpbmUgUjMwMF9UWF9TSVpFX1RYUElUQ0hfRU4gICAgICAgICAgICAgICAgICAgICAoMTw8MzEpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX01BWF9NSVBfTEVWRUxfU0hJRlQgICAgICAgMjYKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUFYX01JUF9MRVZFTF9NQVNLICAgICAgICAoMHhmIDw8IDI2KQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9TSVpFX1BST0pFQ1RFRCAgICAgICAgICAgICgxPDwzMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9UWFBJVENIX0VOICAgICAgICAgICAoMTw8MzEpCiAjZGVmaW5lIFIzMDBfVFhfRk9STUFUXzAgICAgICAgICAgICAgICAgICAgIDB4NDRDMAogCS8qIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZm9ybWF0IHdvcmQgYnkgV2xhZGltaXIgdmFuIGRlciBMYWFuICovCiAJLyogVGhlIFgsIFksIFogYW5kIFcgcmVmZXIgdG8gdGhlIGxheW91dCBvZiB0aGUgY29tcG9uZW50cy4KQEAgLTc2MSwxMSArODU2LDExIEBACiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EWFQxCSAgICAJICAgIDB4RgogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRFhUMwkgICAgCSAgICAweDEwCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EWFQ1CSAgICAJICAgIDB4MTEKLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0QzRE1GVF9DeFY4VTgJICAgIDB4MTIJLyogbm8gc3dpenpsZSAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQThSOEc4QjgJICAgIAkgICAgMHgxMwkvKiBubyBzd2l6emxlICovCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9COEc4X0I4RzgJICAgIAkgICAgMHgxNAkvKiBubyBzd2l6emxlICovCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9HOFI4X0c4QjgJICAgIAkgICAgMHgxNQkvKiBubyBzd2l6emxlICovCi0JCQkJCQkgIC8qIDB4MTYgLSBzb21lIDE2IGJpdCBncmVlbiBmb3JtYXQuLiA/PyAqLworIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRDNETUZUX0N4VjhVOAkgICAgMHgxMiAgICAgLyogbm8gc3dpenpsZSAqLworIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQThSOEc4QjgJICAgIAkgICAgMHgxMyAgICAgLyogbm8gc3dpenpsZSAqLworIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQjhHOF9COEc4CSAgICAJICAgIDB4MTQgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0c4UjhfRzhCOAkgICAgCSAgICAweDE1ICAgICAvKiBubyBzd2l6emxlICovCisJLyogMHgxNiAtIHNvbWUgMTYgYml0IGdyZWVuIGZvcm1hdC4uID8/ICovCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9VTksyNQkJICAgKDEgPDwgMjUpIC8qIG5vIHN3aXp6bGUgKi8KICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NVQklDX01BUAkJICAgKDEgPDwgMjYpCiAKQEAgLTc5MywyMyArODg4LDI2IEBACiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9XCQkzCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9aRVJPCTQKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX09ORQk1Ci0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVVRfWgk2CS8qIDIuMCpaLCBldmVyeXRoaW5nIGFib3ZlIDEuMCBpcyBzZXQgdG8gMC4wICovCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVVRfVwk3CS8qIDIuMCpXLCBldmVyeXRoaW5nIGFib3ZlIDEuMCBpcyBzZXQgdG8gMC4wICovCisJLyogMi4wKlosIGV2ZXJ5dGhpbmcgYWJvdmUgMS4wIGlzIHNldCB0byAwLjAgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NVVF9aCTYKKwkvKiAyLjAqVywgZXZlcnl0aGluZyBhYm92ZSAxLjAgaXMgc2V0IHRvIDAuMCAqLworIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ1VUX1cJNwogCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9CX1NISUZUCTE4CiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9HX1NISUZUCTE1CiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9SX1NISUZUCTEyCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9BX1NISUZUCTkKIAkvKiBDb252ZW5pZW5jZSBtYWNybyB0byB0YWtlIGNhcmUgb2YgbGF5b3V0IGFuZCBzd2l6emxpbmcgKi8KLSMJZGVmaW5lIFIzMDBfRUFTWV9UWF9GT1JNQVQoQiwgRywgUiwgQSwgRk1UKQkoXAotCSAgKChSMzAwX1RYX0ZPUk1BVF8jI0IpPDxSMzAwX1RYX0ZPUk1BVF9CX1NISUZUKSBcCi0JfCAoKFIzMDBfVFhfRk9STUFUXyMjRyk8PFIzMDBfVFhfRk9STUFUX0dfU0hJRlQpIFwKLQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNSKTw8UjMwMF9UWF9GT1JNQVRfUl9TSElGVCkgXAotCXwgKChSMzAwX1RYX0ZPUk1BVF8jI0EpPDxSMzAwX1RYX0ZPUk1BVF9BX1NISUZUKSBcCi0JfCAoUjMwMF9UWF9GT1JNQVRfIyNGTVQpIFwKLQkgICkKLQkvKiBUaGVzZSBjYW4gYmUgT1JlZCB3aXRoIHJlc3VsdCBvZiBSMzAwX0VBU1lfVFhfRk9STUFUKCkgKi8KLQkvKiBXZSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoZXkgZG8uIFRha2UgdmFsdWVzIGZyb20gYSBjb25zdGFudCBjb2xvciA/ICovCisjCWRlZmluZSBSMzAwX0VBU1lfVFhfRk9STUFUKEIsIEcsIFIsIEEsIEZNVCkJKAkJXAorCQkoKFIzMDBfVFhfRk9STUFUXyMjQik8PFIzMDBfVFhfRk9STUFUX0JfU0hJRlQpCQlcCisJCXwgKChSMzAwX1RYX0ZPUk1BVF8jI0cpPDxSMzAwX1RYX0ZPUk1BVF9HX1NISUZUKQlcCisJCXwgKChSMzAwX1RYX0ZPUk1BVF8jI1IpPDxSMzAwX1RYX0ZPUk1BVF9SX1NISUZUKQlcCisJCXwgKChSMzAwX1RYX0ZPUk1BVF8jI0EpPDxSMzAwX1RYX0ZPUk1BVF9BX1NISUZUKQlcCisJCXwgKFIzMDBfVFhfRk9STUFUXyMjRk1UKQkJCQlcCisJCSkKKwkvKiBUaGVzZSBjYW4gYmUgT1JlZCB3aXRoIHJlc3VsdCBvZiBSMzAwX0VBU1lfVFhfRk9STUFUKCkKKwkgICBXZSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoZXkgZG8uIFRha2UgdmFsdWVzIGZyb20gYQorICAgICAgICAgICBjb25zdGFudCBjb2xvciA/ICovCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DT05TVF9YCQkoMTw8NSkKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NPTlNUX1kJCSgyPDw1KQogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ09OU1RfWgkJKDQ8PDUpCkBAIC04MTksNyArOTE3LDcgQEAKIAogI2RlZmluZSBSMzAwX1RYX1BJVENIXzAJCQkgICAgMHg0NTAwIC8qIG9idmlvdXMgbWlzc2luZyBpbiBnYXAgKi8KICNkZWZpbmUgUjMwMF9UWF9PRkZTRVRfMCAgICAgICAgICAgICAgICAgICAgMHg0NTQwCi0vKiBCRUdJTjogR3Vlc3MgZnJvbSBSMjAwICovCisJLyogQkVHSU46IEd1ZXNzIGZyb20gUjIwMCAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fRU5ESUFOX05PX1NXQVAgICAgICAgICAgICgwIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19FTkRJQU5fQllURV9TV0FQICAgICAgICAgKDEgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX0VORElBTl9XT1JEX1NXQVAgICAgICAgICAoMiA8PCAwKQpAQCAtODI4LDUzICs5MjYsNjEgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX01JQ1JPX1RJTEUgICAgICAgICAgICAgICAoMSA8PCAzKQogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fT0ZGU0VUX01BU0sgICAgICAgICAgICAgIDB4ZmZmZmZmZTAKICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX09GRlNFVF9TSElGVCAgICAgICAgICAgICA1Ci0vKiBFTkQgKi8KLSNkZWZpbmUgUjMwMF9UWF9DSFJPTUFfS0VZXzAgICAgICAgICAgICAgICAgICAgICAgMHg0NTgwIC8qIDMyIGJpdCBjaHJvbWEga2V5ICovCi0jZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzAgICAgICAgICAgICAgIDB4NDVDMCAvL2ZmMDBmZjAwID09IHsgMCwgMS4wLCAwLCAxLjAgfQorCS8qIEVORDogR3Vlc3MgZnJvbSBSMjAwICovCiAKLS8qIEVORCAqLworLyogMzIgYml0IGNocm9tYSBrZXkgKi8KKyNkZWZpbmUgUjMwMF9UWF9DSFJPTUFfS0VZXzAgICAgICAgICAgICAgICAgICAgICAgMHg0NTgwCisvKiBmZjAwZmYwMCA9PSB7IDAsIDEuMCwgMCwgMS4wIH0gKi8KKyNkZWZpbmUgUjMwMF9UWF9CT1JERVJfQ09MT1JfMCAgICAgICAgICAgICAgMHg0NUMwCiAKLS8qIEJFR0lOOiBGcmFnbWVudCBwcm9ncmFtIGluc3RydWN0aW9uIHNldAotLy8gRnJhZ21lbnQgcHJvZ3JhbXMgYXJlIHdyaXR0ZW4gZGlyZWN0bHkgaW50byByZWdpc3RlciBzcGFjZS4KLS8vIFRoZXJlIGFyZSBzZXBhcmF0ZSBpbnN0cnVjdGlvbiBzdHJlYW1zIGZvciB0ZXh0dXJlIGluc3RydWN0aW9ucyBhbmQgQUxVCi0vLyBpbnN0cnVjdGlvbnMuCi0vLyBJbiBvcmRlciB0byBzeW5jaHJvbml6ZSB0aGVzZSBzdHJlYW1zLCB0aGUgcHJvZ3JhbSBpcyBkaXZpZGVkIGludG8gdXAKLS8vIHRvIDQgbm9kZXMuIEVhY2ggbm9kZSBiZWdpbnMgd2l0aCBhIG51bWJlciBvZiBURVggb3BlcmF0aW9ucywgZm9sbG93ZWQKLS8vIGJ5IGEgbnVtYmVyIG9mIEFMVSBvcGVyYXRpb25zLgotLy8gVGhlIGZpcnN0IG5vZGUgY2FuIGhhdmUgemVybyBURVggb3BzLCBhbGwgc3Vic2VxdWVudCBub2RlcyBtdXN0IGhhdmUgYXQgbGVhc3QKLS8vIG9uZSBURVggb3BzLgotLy8gQWxsIG5vZGVzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgQUxVIG9wLgotLy8KLS8vIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBub2RlIGlzIHN0b3JlZCBpbiBQRlNfQ05UTF8wOiBBIHZhbHVlIG9mIDAgbWVhbnMKLS8vIDEgbm9kZSwgYSB2YWx1ZSBvZiAzIG1lYW5zIDQgbm9kZXMuCi0vLyBUaGUgdG90YWwgYW1vdW50IG9mIGluc3RydWN0aW9ucyBpcyBkZWZpbmVkIGluIFBGU19DTlRMXzIuIFRoZSBvZmZzZXRzIGFyZQotLy8gb2Zmc2V0cyBpbnRvIHRoZSByZXNwZWN0aXZlIGluc3RydWN0aW9uIHN0cmVhbXMsIHdoaWxlICpfRU5EIHBvaW50cyB0byB0aGUKLS8vIGxhc3QgaW5zdHJ1Y3Rpb24gcmVsYXRpdmUgdG8gdGhpcyBvZmZzZXQuICovCisvKiBFTkQ6IFRleHR1cmUgc3BlY2lmaWNhdGlvbiAqLworCisvKiBCRUdJTjogRnJhZ21lbnQgcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQgKi8KKworLyogRnJhZ21lbnQgcHJvZ3JhbXMgYXJlIHdyaXR0ZW4gZGlyZWN0bHkgaW50byByZWdpc3RlciBzcGFjZS4KKyAqIFRoZXJlIGFyZSBzZXBhcmF0ZSBpbnN0cnVjdGlvbiBzdHJlYW1zIGZvciB0ZXh0dXJlIGluc3RydWN0aW9ucyBhbmQgQUxVCisgKiBpbnN0cnVjdGlvbnMuCisgKiBJbiBvcmRlciB0byBzeW5jaHJvbml6ZSB0aGVzZSBzdHJlYW1zLCB0aGUgcHJvZ3JhbSBpcyBkaXZpZGVkIGludG8gdXAKKyAqIHRvIDQgbm9kZXMuIEVhY2ggbm9kZSBiZWdpbnMgd2l0aCBhIG51bWJlciBvZiBURVggb3BlcmF0aW9ucywgZm9sbG93ZWQKKyAqIGJ5IGEgbnVtYmVyIG9mIEFMVSBvcGVyYXRpb25zLgorICogVGhlIGZpcnN0IG5vZGUgY2FuIGhhdmUgemVybyBURVggb3BzLCBhbGwgc3Vic2VxdWVudCBub2RlcyBtdXN0IGhhdmUgYXQKKyAqIGxlYXN0CisgKiBvbmUgVEVYIG9wcy4KKyAqIEFsbCBub2RlcyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIEFMVSBvcC4KKyAqCisgKiBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9kZSBpcyBzdG9yZWQgaW4gUEZTX0NOVExfMDogQSB2YWx1ZSBvZiAwIG1lYW5zCisgKiAxIG5vZGUsIGEgdmFsdWUgb2YgMyBtZWFucyA0IG5vZGVzLgorICogVGhlIHRvdGFsIGFtb3VudCBvZiBpbnN0cnVjdGlvbnMgaXMgZGVmaW5lZCBpbiBQRlNfQ05UTF8yLiBUaGUgb2Zmc2V0cyBhcmUKKyAqIG9mZnNldHMgaW50byB0aGUgcmVzcGVjdGl2ZSBpbnN0cnVjdGlvbiBzdHJlYW1zLCB3aGlsZSAqX0VORCBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGluc3RydWN0aW9uIHJlbGF0aXZlIHRvIHRoaXMgb2Zmc2V0LgorICovCiAjZGVmaW5lIFIzMDBfUEZTX0NOVExfMCAgICAgICAgICAgICAgICAgICAgIDB4NDYwMAogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9MQVNUX05PREVTX1NISUZUICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfTEFTVF9OT0RFU19NQVNLICAgICAoMyA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9GSVJTVF9OT0RFX0hBU19URVggICgxIDw8IDMpCiAjZGVmaW5lIFIzMDBfUEZTX0NOVExfMSAgICAgICAgICAgICAgICAgICAgIDB4NDYwNAogLyogVGhlcmUgaXMgYW4gdW5zaGlmdGVkIHZhbHVlIGhlcmUgd2hpY2ggaGFzIHNvIGZhciBhbHdheXMgYmVlbiBlcXVhbCB0byB0aGUKLS8vIGluZGV4IG9mIHRoZSBoaWdoZXN0IHVzZWQgdGVtcG9yYXJ5IHJlZ2lzdGVyLiAqLworICogaW5kZXggb2YgdGhlIGhpZ2hlc3QgdXNlZCB0ZW1wb3JhcnkgcmVnaXN0ZXIuCisgKi8KICNkZWZpbmUgUjMwMF9QRlNfQ05UTF8yICAgICAgICAgICAgICAgICAgICAgMHg0NjA4CiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9PRkZTRVRfU0hJRlQgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9BTFVfT0ZGU0VUX01BU0sgICAgICg2MyA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9BTFVfRU5EX1NISUZUICAgICAgIDYKLSMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX0VORF9NQVNLICAgICAgICAoNjMgPDwgMCkKKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX0VORF9NQVNLICAgICAgICAoNjMgPDwgNikKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX09GRlNFVF9TSElGVCAgICAxMgotIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9URVhfT0ZGU0VUX01BU0sgICAgICgzMSA8PCAxMikJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX09GRlNFVF9NQVNLICAgICAoMzEgPDwgMTIpIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9FTkRfU0hJRlQgICAgICAgMTgKLSMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX0VORF9NQVNLICAgICAgICAoMzEgPDwgMTgpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9FTkRfTUFTSyAgICAgICAgKDMxIDw8IDE4KSAvKiBHVUVTUyAqLwogCiAvKiBnYXAgKi8KKwogLyogTm9kZXMgYXJlIHN0b3JlZCBiYWNrd2FyZHMuIFRoZSBsYXN0IGFjdGl2ZSBub2RlIGlzIGFsd2F5cyBzdG9yZWQgaW4KLS8vIFBGU19OT0RFXzMuCi0vLyBFeGFtcGxlOiBJbiBhIDItbm9kZSBwcm9ncmFtLCBOT0RFXzAgYW5kIE5PREVfMSBhcmUgc2V0IHRvIDAuIFRoZQotLy8gZmlyc3Qgbm9kZSBpcyBzdG9yZWQgaW4gTk9ERV8yLCB0aGUgc2Vjb25kIG5vZGUgaXMgc3RvcmVkIGluIE5PREVfMy4KLS8vCi0vLyBPZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgbWFzdGVyIG9mZnNldCBmcm9tIFBGU19DTlRMXzIuCi0vLyBMQVNUX05PREUgaXMgc2V0IGZvciB0aGUgbGFzdCBub2RlLCBhbmQgb25seSBmb3IgdGhlIGxhc3Qgbm9kZS4gKi8KKyAqIFBGU19OT0RFXzMuCisgKiBFeGFtcGxlOiBJbiBhIDItbm9kZSBwcm9ncmFtLCBOT0RFXzAgYW5kIE5PREVfMSBhcmUgc2V0IHRvIDAuIFRoZQorICogZmlyc3Qgbm9kZSBpcyBzdG9yZWQgaW4gTk9ERV8yLCB0aGUgc2Vjb25kIG5vZGUgaXMgc3RvcmVkIGluIE5PREVfMy4KKyAqCisgKiBPZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgbWFzdGVyIG9mZnNldCBmcm9tIFBGU19DTlRMXzIuCisgKi8KICNkZWZpbmUgUjMwMF9QRlNfTk9ERV8wICAgICAgICAgICAgICAgICAgICAgMHg0NjEwCiAjZGVmaW5lIFIzMDBfUEZTX05PREVfMSAgICAgICAgICAgICAgICAgICAgIDB4NDYxNAogI2RlZmluZSBSMzAwX1BGU19OT0RFXzIgICAgICAgICAgICAgICAgICAgICAweDQ2MTgKQEAgLTg4Nyw5MSArOTkzLDk4IEBACiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX1RFWF9PRkZTRVRfTUFTSyAgICAgKDMxIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfRU5EX1NISUZUICAgICAgIDE3CiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX1RFWF9FTkRfTUFTSyAgICAgICAgKDMxIDw8IDE3KQotLyojICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX0xBU1RfTk9ERSAgICAgICAgICAgKDEgPDwgMjIpICovCiAjCQlkZWZpbmUgUjMwMF9QRlNfTk9ERV9PVVRQVVRfQ09MT1IgICAgICAgICgxIDw8IDIyKQogIwkJZGVmaW5lIFIzMDBfUEZTX05PREVfT1VUUFVUX0RFUFRIICAgICAgICAoMSA8PCAyMykKIAogLyogVEVYCi0vLyBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGV4dHVyZSBpbnN0cnVjdGlvbnMgY2Fubm90IHdyaXRlIGludG8gb3V0cHV0Ci0vLyByZWdpc3RlcnMgZGlyZWN0bHkuIEEgc3Vic2VxdWVudCBBTFUgaW5zdHJ1Y3Rpb24gaXMgYWx3YXlzIG5lY2Vzc2FyeSwKLS8vIGV2ZW4gaWYgaXQncyBqdXN0IE1BRCBvMCwgcjAsIDEsIDAgKi8KKyAqIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0ZXh0dXJlIGluc3RydWN0aW9ucyBjYW5ub3Qgd3JpdGUgaW50byBvdXRwdXQKKyAqIHJlZ2lzdGVycyBkaXJlY3RseS4gQSBzdWJzZXF1ZW50IEFMVSBpbnN0cnVjdGlvbiBpcyBhbHdheXMgbmVjZXNzYXJ5LAorICogZXZlbiBpZiBpdCdzIGp1c3QgTUFEIG8wLCByMCwgMSwgMAorICovCiAjZGVmaW5lIFIzMDBfUEZTX1RFWElfMCAgICAgICAgICAgICAgICAgICAgIDB4NDYyMAotIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9TUkNfU0hJRlQgICAgICAgICAgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfU1JDX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfU1JDX0NPTlNUICAgICAgICAgICAgICAoMSA8PCA1KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9EU1RfU0hJRlQgICAgICAgICAgICAgIDYKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfRFNUX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgNikKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfSU1BR0VfU0hJRlQgICAgICAgICAgICAxMQotIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9JTUFHRV9NQVNLICAgICAgICAgICAgICgxNSA8PCAxMSkJLyogR1VFU1MgYmFzZWQgb24gbGF5b3V0IGFuZCBuYXRpdmUgbGltaXRzICovCisjCWRlZmluZSBSMzAwX0ZQSVRYX1NSQ19TSElGVCAgICAgICAgICAgICAgMAorIwlkZWZpbmUgUjMwMF9GUElUWF9TUkNfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCAwKQorCS8qIEdVRVNTICovCisjCWRlZmluZSBSMzAwX0ZQSVRYX1NSQ19DT05TVCAgICAgICAgICAgICAgKDEgPDwgNSkKKyMJZGVmaW5lIFIzMDBfRlBJVFhfRFNUX1NISUZUICAgICAgICAgICAgICA2CisjCWRlZmluZSBSMzAwX0ZQSVRYX0RTVF9NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDYpCisjCWRlZmluZSBSMzAwX0ZQSVRYX0lNQUdFX1NISUZUICAgICAgICAgICAgMTEKKwkvKiBHVUVTUyBiYXNlZCBvbiBsYXlvdXQgYW5kIG5hdGl2ZSBsaW1pdHMgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfSU1BR0VfTUFTSyAgICAgICAgICAgICAoMTUgPDwgMTEpCiAvKiBVbnN1cmUgaWYgdGhlc2UgYXJlIG9wY29kZXMsIG9yIHNvbWUga2luZCBvZiBiaXRmaWVsZCwgYnV0IHRoaXMgaXMgaG93CiAgKiB0aGV5IHdlcmUgc2V0IHdoZW4gSSBjaGVja2VkCiAgKi8KLSMJCWRlZmluZSBSMzAwX0ZQSVRYX09QQ09ERV9TSElGVAkJCTE1Ci0jCQkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVEVYCQkJMQotIwkJCWRlZmluZSBSMzAwX0ZQSVRYX09QX0tJTAkJCTIKLSMJCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9UWFAJCQkzCi0jCQkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVFhCCQkJNAorIwlkZWZpbmUgUjMwMF9GUElUWF9PUENPREVfU0hJRlQJCTE1CisjCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9URVgJMQorIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfS0lMCTIKKyMJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RYUAkzCisjCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9UWEIJNAorIwlkZWZpbmUgUjMwMF9GUElUWF9PUENPREVfTUFTSyAgICAgICAgICAgKDcgPDwgMTUpCiAKIC8qIEFMVQotLy8gVGhlIEFMVSBpbnN0cnVjdGlvbnMgcmVnaXN0ZXIgYmxvY2tzIGFyZSBlbnVtZXJhdGVkIGFjY29yZGluZyB0byB0aGUgb3JkZXIKLS8vIGluIHdoaWNoIGZnbHJ4LiBJIGFzc3VtZSB0aGVyZSBpcyBzcGFjZSBmb3IgNjQgaW5zdHJ1Y3Rpb25zLCBzaW5jZQotLy8gZWFjaCBibG9jayBoYXMgc3BhY2UgZm9yIGEgbWF4aW11bSBvZiA2NCBEV09SRHMsIGFuZCB0aGlzIG1hdGNoZXMgcmVwb3J0ZWQKLS8vIG5hdGl2ZSBsaW1pdHMuCi0vLwotLy8gVGhlIGJhc2ljIGZ1bmN0aW9uYWwgYmxvY2sgc2VlbXMgdG8gYmUgb25lIE1BRCBmb3IgZWFjaCBjb2xvciBhbmQgYWxwaGEsCi0vLyBhbmQgYW4gYWRkZXIgdGhhdCBhZGRzIGFsbCBjb21wb25lbnRzIGFmdGVyIHRoZSBNVUwuCi0vLyAgLSBBREQsIE1VTCwgTUFEIGV0Yy46IHVzZSBNQUQgd2l0aCBhcHByb3ByaWF0ZSBuZXV0cmFsIG9wZXJhbmRzCi0vLyAgLSBEUDQ6IFVzZSBPVVRDX0RQNCwgT1VUQV9EUDQKLS8vICAtIERQMzogVXNlIE9VVENfRFAzLCBPVVRBX0RQNCwgYXBwcm9wcmlhdGUgYWxwaGEgb3BlcmFuZHMKLS8vICAtIERQSDogVXNlIE9VVENfRFA0LCBPVVRBX0RQNCwgYXBwcm9wcmlhdGUgYWxwaGEgb3BlcmFuZHMKLS8vICAtIENNUDogSWYgQVJHMiA8IDAsIHJldHVybiBBUkcxLCBlbHNlIHJldHVybiBBUkcwCi0vLyAgLSBGTFI6IHVzZSBGUkMrTUFECi0vLyAgLSBYUEQ6IHVzZSBNQUQrTUFECi0vLyAgLSBTR0UsIFNMVDogdXNlIE1BRCtDTVAKLS8vICAtIFJTUTogdXNlIEFCUyBtb2RpZmllciBmb3IgYXJndW1lbnQKLS8vICAtIFVzZSBPVVRDX1JFUExfQUxQSEEgdG8gd3JpdGUgcmVzdWx0cyBvZiBhbiBhbHBoYS1vbmx5IG9wZXJhdGlvbiAoZS5nLiBSQ1ApCi0vLyAgICBpbnRvIGNvbG9yIHJlZ2lzdGVyCi0vLyAgLSBhcHBhcmVudGx5LCB0aGVyZSdzIG5vIHF1aWNrIERTVCBvcGVyYXRpb24KLS8vICAtIGZnbHJ4IHNldCBGUEkyX1VOS05PV05fMzEgb24gYSAiTUFEIGZyYWdtZW50LmNvbG9yLCB0bXAwLCB0bXAxLCB0bXAyIgotLy8gIC0gZmdscnggc2V0IEZQSTJfVU5LTk9XTl8zMSBvbiBhICJNQVggcjIsIHIxLCBjMCIKLS8vICAtIGZnbHJ4IG9uY2Ugc2V0IEZQSTBfVU5LTk9XTl8zMSBvbiBhICJGUkMgcjEsIHIxIgotLy8KLS8vIE9wZXJhbmQgc2VsZWN0aW9uCi0vLyBGaXJzdCBzdGFnZSBzZWxlY3RzIHRocmVlIHNvdXJjZXMgZnJvbSB0aGUgYXZhaWxhYmxlIHJlZ2lzdGVycyBhbmQKLS8vIGNvbnN0YW50IHBhcmFtZXRlcnMuIFRoaXMgaXMgZGVmaW5lZCBpbiBJTlNUUjEgKGNvbG9yKSBhbmQgSU5TVFIzIChhbHBoYSkuCi0vLyBmZ2xyeCBzb3J0cyB0aGUgdGhyZWUgc291cmNlIGZpZWxkczogUmVnaXN0ZXJzIGJlZm9yZSBjb25zdGFudHMsCi0vLyBsb3dlciBpbmRpY2VzIGJlZm9yZSBoaWdoZXIgaW5kaWNlczsgSSBkbyBub3Qga25vdyB3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5LgotLy8gZmdscnggZmlsbHMgdW51c2VkIHNvdXJjZXMgd2l0aCAicmVhZCBjb25zdGFudCAwIgotLy8gQWNjb3JkaW5nIHRvIHNwZWNzLCB5b3UgY2Fubm90IHNlbGVjdCBtb3JlIHRoYW4gdHdvIGRpZmZlcmVudCBjb25zdGFudHMuCi0vLwotLy8gU2Vjb25kIHN0YWdlIHNlbGVjdHMgdGhlIG9wZXJhbmRzIGZyb20gdGhlIHNvdXJjZXMuIFRoaXMgaXMgZGVmaW5lZCBpbgotLy8gSU5TVFIwIChjb2xvcikgYW5kIElOU1RSMiAoYWxwaGEpLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSBzcGVjaWFsIGNvbnN0YW50cwotLy8gemVybyBhbmQgb25lLgotLy8gU3dpenpsaW5nIGFuZCBuZWdhdGlvbiBoYXBwZW5zIGluIHRoaXMgc3RhZ2UsIGFzIHdlbGwuCi0vLwotLy8gSW1wb3J0YW50OiBDb2xvciBhbmQgYWxwaGEgc2VlbSB0byBiZSBtb3N0bHkgc2VwYXJhdGUsIGkuZS4gdGhlaXIgc291cmNlcwotLy8gc2VsZWN0aW9uIGFwcGVhcnMgdG8gYmUgZnVsbHkgaW5kZXBlbmRlbnQgKHRoZSByZWdpc3RlciBzdG9yYWdlIGlzIHByb2JhYmx5Ci0vLyBwaHlzaWNhbGx5IHNwbGl0IGludG8gYSBjb2xvciBhbmQgYW4gYWxwaGEgc2VjdGlvbikuCi0vLyBIb3dldmVyIChiZWNhdXNlIG9mIHRoZSBhcHBhcmVudCBwaHlzaWNhbCBzcGxpdCksIHRoZXJlIGlzIHNvbWUgaW50ZXJhY3Rpb24KLS8vIFdSVCBzd2l6emxpbmcuIElmLCBmb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gbG9hZCBhbiBSIGNvbXBvbmVudCBpbnRvIGFuCi0vLyBBbHBoYSBvcGVyYW5kLCB0aGlzIFIgY29tcG9uZW50IGlzIHRha2VuIGZyb20gYSAqY29sb3IqIHNvdXJjZSwgbm90IGZyb20KLS8vIGFuIGFscGhhIHNvdXJjZS4gVGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgZG9lc24ndCBldmVuIGhhdmUgdG8gYXBwZWFyIGluCi0vLyB0aGUgYWxwaGEgc291cmNlcyBsaXN0LiAoSSBob3BlIHRoaXMgYWxsbCBtYWtlcyBzZW5zZSB0byB5b3UpCi0vLwotLy8gRGVzdGluYXRpb24gc2VsZWN0aW9uCi0vLyBUaGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaW5kZXggaXMgaW4gRlBJMSAoY29sb3IpIGFuZCBGUEkzIChhbHBoYSkgdG9nZXRoZXIKLS8vIHdpdGggZW5hYmxlIGJpdHMuCi0vLyBUaGVyZSBhcmUgc2VwYXJhdGUgZW5hYmxlIGJpdHMgZm9yIHdyaXRpbmcgaW50byB0ZW1wb3JhcnkgcmVnaXN0ZXJzCi0vLyAoRFNUQ19SRUdfKiAvRFNUQV9SRUcpIGFuZCBhbmQgcHJvZ3JhbSBvdXRwdXQgcmVnaXN0ZXJzIChEU1RDX09VVFBVVF8qIC9EU1RBX09VVFBVVCkuCi0vLyBZb3UgY2FuIHdyaXRlIHRvIGJvdGggYXQgb25jZSwgb3Igbm90IHdyaXRlIGF0IGFsbCAodGhlIHNhbWUgaW5kZXgKLS8vIG11c3QgYmUgdXNlZCBmb3IgYm90aCkuCi0vLwotLy8gTm90ZTogVGhlcmUgaXMgYSBzcGVjaWFsIGZvcm0gZm9yIExSUAotLy8gIC0gQXJndW1lbnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgaW4gQVJCX2ZyYWdtZW50X3Byb2dyYW0uCi0vLyAgLSBPcGVyYXRpb24gaXMgTUFECi0vLyAgLSBBUkcxIGlzIHNldCB0byBBUkdDX1NSQzFDX0xSUC9BUkdDX1NSQzFBX0xSUAotLy8gIC0gU2V0IEZQSTAvRlBJMl9TUEVDSUFMX0xSUAotLy8gQXJiaXRyYXJ5IExSUCAoaW5jbHVkaW5nIHN1cHBvcnQgZm9yIHN3aXp6bGluZykgcmVxdWlyZXMgdmFuaWxsYSBNQUQrTUFEICovCisgKiBUaGUgQUxVIGluc3RydWN0aW9ucyByZWdpc3RlciBibG9ja3MgYXJlIGVudW1lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlcgorICogaW4gd2hpY2ggZmdscnguIEkgYXNzdW1lIHRoZXJlIGlzIHNwYWNlIGZvciA2NCBpbnN0cnVjdGlvbnMsIHNpbmNlCisgKiBlYWNoIGJsb2NrIGhhcyBzcGFjZSBmb3IgYSBtYXhpbXVtIG9mIDY0IERXT1JEcywgYW5kIHRoaXMgbWF0Y2hlcyByZXBvcnRlZAorICogbmF0aXZlIGxpbWl0cy4KKyAqCisgKiBUaGUgYmFzaWMgZnVuY3Rpb25hbCBibG9jayBzZWVtcyB0byBiZSBvbmUgTUFEIGZvciBlYWNoIGNvbG9yIGFuZCBhbHBoYSwKKyAqIGFuZCBhbiBhZGRlciB0aGF0IGFkZHMgYWxsIGNvbXBvbmVudHMgYWZ0ZXIgdGhlIE1VTC4KKyAqICAtIEFERCwgTVVMLCBNQUQgZXRjLjogdXNlIE1BRCB3aXRoIGFwcHJvcHJpYXRlIG5ldXRyYWwgb3BlcmFuZHMKKyAqICAtIERQNDogVXNlIE9VVENfRFA0LCBPVVRBX0RQNAorICogIC0gRFAzOiBVc2UgT1VUQ19EUDMsIE9VVEFfRFA0LCBhcHByb3ByaWF0ZSBhbHBoYSBvcGVyYW5kcworICogIC0gRFBIOiBVc2UgT1VUQ19EUDQsIE9VVEFfRFA0LCBhcHByb3ByaWF0ZSBhbHBoYSBvcGVyYW5kcworICogIC0gQ01QSDogSWYgQVJHMiA+IDAuNSwgcmV0dXJuIEFSRzAsIGVsc2UgcmV0dXJuIEFSRzEKKyAqICAtIENNUDogSWYgQVJHMiA8IDAsIHJldHVybiBBUkcxLCBlbHNlIHJldHVybiBBUkcwCisgKiAgLSBGTFI6IHVzZSBGUkMrTUFECisgKiAgLSBYUEQ6IHVzZSBNQUQrTUFECisgKiAgLSBTR0UsIFNMVDogdXNlIE1BRCtDTVAKKyAqICAtIFJTUTogdXNlIEFCUyBtb2RpZmllciBmb3IgYXJndW1lbnQKKyAqICAtIFVzZSBPVVRDX1JFUExfQUxQSEEgdG8gd3JpdGUgcmVzdWx0cyBvZiBhbiBhbHBoYS1vbmx5IG9wZXJhdGlvbgorICogICAgKGUuZy4gUkNQKSBpbnRvIGNvbG9yIHJlZ2lzdGVyCisgKiAgLSBhcHBhcmVudGx5LCB0aGVyZSdzIG5vIHF1aWNrIERTVCBvcGVyYXRpb24KKyAqICAtIGZnbHJ4IHNldCBGUEkyX1VOS05PV05fMzEgb24gYSAiTUFEIGZyYWdtZW50LmNvbG9yLCB0bXAwLCB0bXAxLCB0bXAyIgorICogIC0gZmdscnggc2V0IEZQSTJfVU5LTk9XTl8zMSBvbiBhICJNQVggcjIsIHIxLCBjMCIKKyAqICAtIGZnbHJ4IG9uY2Ugc2V0IEZQSTBfVU5LTk9XTl8zMSBvbiBhICJGUkMgcjEsIHIxIgorICoKKyAqIE9wZXJhbmQgc2VsZWN0aW9uCisgKiBGaXJzdCBzdGFnZSBzZWxlY3RzIHRocmVlIHNvdXJjZXMgZnJvbSB0aGUgYXZhaWxhYmxlIHJlZ2lzdGVycyBhbmQKKyAqIGNvbnN0YW50IHBhcmFtZXRlcnMuIFRoaXMgaXMgZGVmaW5lZCBpbiBJTlNUUjEgKGNvbG9yKSBhbmQgSU5TVFIzIChhbHBoYSkuCisgKiBmZ2xyeCBzb3J0cyB0aGUgdGhyZWUgc291cmNlIGZpZWxkczogUmVnaXN0ZXJzIGJlZm9yZSBjb25zdGFudHMsCisgKiBsb3dlciBpbmRpY2VzIGJlZm9yZSBoaWdoZXIgaW5kaWNlczsgSSBkbyBub3Qga25vdyB3aGV0aGVyIHRoaXMgaXMKKyAqIG5lY2Vzc2FyeS4KKyAqCisgKiBmZ2xyeCBmaWxscyB1bnVzZWQgc291cmNlcyB3aXRoICJyZWFkIGNvbnN0YW50IDAiCisgKiBBY2NvcmRpbmcgdG8gc3BlY3MsIHlvdSBjYW5ub3Qgc2VsZWN0IG1vcmUgdGhhbiB0d28gZGlmZmVyZW50IGNvbnN0YW50cy4KKyAqCisgKiBTZWNvbmQgc3RhZ2Ugc2VsZWN0cyB0aGUgb3BlcmFuZHMgZnJvbSB0aGUgc291cmNlcy4gVGhpcyBpcyBkZWZpbmVkIGluCisgKiBJTlNUUjAgKGNvbG9yKSBhbmQgSU5TVFIyIChhbHBoYSkuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIHNwZWNpYWwgY29uc3RhbnRzCisgKiB6ZXJvIGFuZCBvbmUuCisgKiBTd2l6emxpbmcgYW5kIG5lZ2F0aW9uIGhhcHBlbnMgaW4gdGhpcyBzdGFnZSwgYXMgd2VsbC4KKyAqCisgKiBJbXBvcnRhbnQ6IENvbG9yIGFuZCBhbHBoYSBzZWVtIHRvIGJlIG1vc3RseSBzZXBhcmF0ZSwgaS5lLiB0aGVpciBzb3VyY2VzCisgKiBzZWxlY3Rpb24gYXBwZWFycyB0byBiZSBmdWxseSBpbmRlcGVuZGVudCAodGhlIHJlZ2lzdGVyIHN0b3JhZ2UgaXMgcHJvYmFibHkKKyAqIHBoeXNpY2FsbHkgc3BsaXQgaW50byBhIGNvbG9yIGFuZCBhbiBhbHBoYSBzZWN0aW9uKS4KKyAqIEhvd2V2ZXIgKGJlY2F1c2Ugb2YgdGhlIGFwcGFyZW50IHBoeXNpY2FsIHNwbGl0KSwgdGhlcmUgaXMgc29tZSBpbnRlcmFjdGlvbgorICogV1JUIHN3aXp6bGluZy4gSWYsIGZvciBleGFtcGxlLCB5b3Ugd2FudCB0byBsb2FkIGFuIFIgY29tcG9uZW50IGludG8gYW4KKyAqIEFscGhhIG9wZXJhbmQsIHRoaXMgUiBjb21wb25lbnQgaXMgdGFrZW4gZnJvbSBhICpjb2xvciogc291cmNlLCBub3QgZnJvbQorICogYW4gYWxwaGEgc291cmNlLiBUaGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBkb2Vzbid0IGV2ZW4gaGF2ZSB0byBhcHBlYXIgaW4KKyAqIHRoZSBhbHBoYSBzb3VyY2VzIGxpc3QuIChJIGhvcGUgdGhpcyBhbGwgbWFrZXMgc2Vuc2UgdG8geW91KQorICoKKyAqIERlc3RpbmF0aW9uIHNlbGVjdGlvbgorICogVGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGluZGV4IGlzIGluIEZQSTEgKGNvbG9yKSBhbmQgRlBJMyAoYWxwaGEpCisgKiB0b2dldGhlciB3aXRoIGVuYWJsZSBiaXRzLgorICogVGhlcmUgYXJlIHNlcGFyYXRlIGVuYWJsZSBiaXRzIGZvciB3cml0aW5nIGludG8gdGVtcG9yYXJ5IHJlZ2lzdGVycworICogKERTVENfUkVHXyogL0RTVEFfUkVHKSBhbmQgYW5kIHByb2dyYW0gb3V0cHV0IHJlZ2lzdGVycyAoRFNUQ19PVVRQVVRfKgorICogL0RTVEFfT1VUUFVUKS4gWW91IGNhbiB3cml0ZSB0byBib3RoIGF0IG9uY2UsIG9yIG5vdCB3cml0ZSBhdCBhbGwgKHRoZQorICogc2FtZSBpbmRleCBtdXN0IGJlIHVzZWQgZm9yIGJvdGgpLgorICoKKyAqIE5vdGU6IFRoZXJlIGlzIGEgc3BlY2lhbCBmb3JtIGZvciBMUlAKKyAqICAtIEFyZ3VtZW50IG9yZGVyIGlzIHRoZSBzYW1lIGFzIGluIEFSQl9mcmFnbWVudF9wcm9ncmFtLgorICogIC0gT3BlcmF0aW9uIGlzIE1BRAorICogIC0gQVJHMSBpcyBzZXQgdG8gQVJHQ19TUkMxQ19MUlAvQVJHQ19TUkMxQV9MUlAKKyAqICAtIFNldCBGUEkwL0ZQSTJfU1BFQ0lBTF9MUlAKKyAqIEFyYml0cmFyeSBMUlAgKGluY2x1ZGluZyBzdXBwb3J0IGZvciBzd2l6emxpbmcpIHJlcXVpcmVzIHZhbmlsbGEgTUFEK01BRAorICovCiAjZGVmaW5lIFIzMDBfUEZTX0lOU1RSMV8wICAgICAgICAgICAgICAgICAgIDB4NDZDMAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzBDX1NISUZUICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMwQ19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkKQEAgLTk4Miw2ICsxMDk1LDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMyQ19TSElGVCAgICAgICAgICAgICAxMgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzJDX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMyQ19DT05TVCAgICAgICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDNmZmZmCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfRFNUQ19TSElGVCAgICAgICAgICAgICAgMTgKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9EU1RDX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMTgpCiAjCQlkZWZpbmUgUjMwMF9GUEkxX0RTVENfUkVHX01BU0tfU0hJRlQgICAgIDIzCkBAIC0xMDAzLDYgKzExMTcsNyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzJBX1NISUZUICAgICAgICAgICAgIDEyCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfU1JDMkFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzJBX0NPTlNUICAgICAgICAgICAgICgxIDw8IDE3KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQ19NQVNLICAgICAgICAgICAgICAgIDB4MDAwM2ZmZmYKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19EU1RBX1NISUZUICAgICAgICAgICAgICAxOAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX0RTVEFfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCAxOCkKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19EU1RBX1JFRyAgICAgICAgICAgICAgICAoMSA8PCAyMykKQEAgLTEwMjgsNyArMTE0Myw4IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19MUlAgICAgICAgICAgMTUKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1pFUk8gICAgICAgICAgICAgICAyMAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfT05FICAgICAgICAgICAgICAgIDIxCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19IQUxGICAgICAgICAgICAgICAgMjIJLyogR1VFU1MgKi8KKwkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfSEFMRiAgICAgICAgICAgICAgIDIyCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMwQ19ZWlggICAgICAgICAgMjMKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFDX1laWCAgICAgICAgICAyNAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMkNfWVpYICAgICAgICAgIDI1CkBAIC0xMDU3LDYgKzExNzMsNyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfRFA0ICAgICAgICAgICAgICAgICgyIDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfTUlOICAgICAgICAgICAgICAgICg0IDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfTUFYICAgICAgICAgICAgICAgICg1IDw8IDIzKQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfQ01QSCAgICAgICAgICAgICAgICg3IDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfQ01QICAgICAgICAgICAgICAgICg4IDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfRlJDICAgICAgICAgICAgICAgICg5IDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX09VVENfUkVQTF9BTFBIQSAgICAgICAgICgxMCA8PCAyMykKQEAgLTEwNzksMjAgKzExOTYsMjMgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1NSQzFBX0xSUCAgICAgICAgICAxNQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfWkVSTyAgICAgICAgICAgICAgIDE2CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9PTkUgICAgICAgICAgICAgICAgMTcKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX0hBTEYgICAgICAgICAgICAgICAxOAkvKiBHVUVTUyAqLwotCisJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX0hBTEYgICAgICAgICAgICAgICAxOAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX1NISUZUICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcwQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcwQV9ORUcgICAgICAgICAgICAgICAoMSA8PCA1KQotIwkJZGVmaW5lIFIzMDBfRlBJMl9BUkcwQV9BQlMJCQkJICgxIDw8IDYpCS8qIEdVRVNTICovCisJLyogR1VFU1MgKi8KKyMJZGVmaW5lIFIzMDBfRlBJMl9BUkcwQV9BQlMJCSAoMSA8PCA2KQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX1NISUZUICAgICAgICAgICAgIDcKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcxQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgNykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcxQV9ORUcgICAgICAgICAgICAgICAoMSA8PCAxMikKLSMJCWRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfQUJTCQkJCSAoMSA8PCAxMykJLyogR1VFU1MgKi8KKwkvKiBHVUVTUyAqLworIwlkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX0FCUwkJICgxIDw8IDEzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzJBX1NISUZUICAgICAgICAgICAgIDE0CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDE0KQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzJBX05FRyAgICAgICAgICAgICAgICgxIDw8IDE5KQotIwkJZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9BQlMJCQkJICgxIDw8IDIwKQkvKiBHVUVTUyAqLworCS8qIEdVRVNTICovCisjCWRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfQUJTCQkgKDEgPDwgMjApCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfU1BFQ0lBTF9MUlAgICAgICAgICAgICAgKDEgPDwgMjEpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9NQUQgICAgICAgICAgICAgICAgKDAgPDwgMjMpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9EUDQgICAgICAgICAgICAgICAgKDEgPDwgMjMpCkBAIC0xMTA2LDkgKzEyMjYsMTkgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX1JTUSAgICAgICAgICAgICAgICAoMTEgPDwgMjMpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9TQVQgICAgICAgICAgICAgICAgKDEgPDwgMzApCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfVU5LTk9XTl8zMSAgICAgICAgICAgICAgKDEgPDwgMzEpCi0vKiBFTkQgKi8KKy8qIEVORDogRnJhZ21lbnQgcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQgKi8KIAotLyogZ2FwICovCisvKiBGb2cgc3RhdGUgYW5kIGNvbG9yICovCisjZGVmaW5lIFIzMDBfUkVfRk9HX1NUQVRFICAgICAgICAgICAgICAgICAgIDB4NEJDMAorIyAgICAgICBkZWZpbmUgUjMwMF9GT0dfRU5BQkxFICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjCWRlZmluZSBSMzAwX0ZPR19NT0RFX0xJTkVBUiAgICAgICAgICAgICAgKDAgPDwgMSkKKyMJZGVmaW5lIFIzMDBfRk9HX01PREVfRVhQICAgICAgICAgICAgICAgICAoMSA8PCAxKQorIwlkZWZpbmUgUjMwMF9GT0dfTU9ERV9FWFAyICAgICAgICAgICAgICAgICgyIDw8IDEpCisjCWRlZmluZSBSMzAwX0ZPR19NT0RFX01BU0sgICAgICAgICAgICAgICAgKDMgPDwgMSkKKyNkZWZpbmUgUjMwMF9GT0dfQ09MT1JfUiAgICAgICAgICAgICAgICAgICAgMHg0QkM4CisjZGVmaW5lIFIzMDBfRk9HX0NPTE9SX0cgICAgICAgICAgICAgICAgICAgIDB4NEJDQworI2RlZmluZSBSMzAwX0ZPR19DT0xPUl9CICAgICAgICAgICAgICAgICAgICAweDRCRDAKKwogI2RlZmluZSBSMzAwX1BQX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAweDRCRDQKICMgICAgICAgZGVmaW5lIFIzMDBfUkVGX0FMUEhBX01BU0sgICAgICAgICAgICAgICAweDAwMDAwMGZmCiAjICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfRkFJTCAgICAgICAgICAgICAgKDAgPDwgOCkKQEAgLTExMjMsNiArMTI1Myw3IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0FMUEhBX1RFU1RfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTEpCiAKIC8qIGdhcCAqLworCiAvKiBGcmFnbWVudCBwcm9ncmFtIHBhcmFtZXRlcnMgaW4gNy4xNiBmbG9hdGluZyBwb2ludCAqLwogI2RlZmluZSBSMzAwX1BGU19QQVJBTV8wX1ggICAgICAgICAgICAgICAgICAweDRDMDAKICNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMF9ZICAgICAgICAgICAgICAgICAgMHg0QzA0CkBAIC0xMTM1LDQ1ICsxMjY2LDQ4IEBACiAjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzMxX1cgICAgICAgICAgICAgICAgIDB4NERGQwogCiAvKiBOb3RlczoKLS8vIC0gQUZBSUsgZmdscnggYWx3YXlzIHNldHMgQkxFTkRfVU5LTk9XTiB3aGVuIGJsZW5kaW5nIGlzIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uCi0vLyAtIEFGQUlLIGZnbHJ4IGFsd2F5cyBzZXRzIEJMRU5EX05PX1NFUEFSQVRFIHdoZW4gQ0JMRU5EIGFuZCBBQkxFTkQgYXJlIHNldCB0byB0aGUgc2FtZQotLy8gICBmdW5jdGlvbiAoYm90aCByZWdpc3RlcnMgYXJlIGFsd2F5cyBzZXQgdXAgY29tcGxldGVseSBpbiBhbnkgY2FzZSkKLS8vIC0gTW9zdCBibGVuZCBmbGFncyBhcmUgc2ltcGx5IGNvcGllZCBmcm9tIFIyMDAgYW5kIG5vdCB0ZXN0ZWQgeWV0ICovCisgKiAtIEFGQUlLIGZnbHJ4IGFsd2F5cyBzZXRzIEJMRU5EX1VOS05PV04gd2hlbiBibGVuZGluZyBpcyB1c2VkIGluCisgKiAgIHRoZSBhcHBsaWNhdGlvbgorICogLSBBRkFJSyBmZ2xyeCBhbHdheXMgc2V0cyBCTEVORF9OT19TRVBBUkFURSB3aGVuIENCTEVORCBhbmQgQUJMRU5ECisgKiAgICBhcmUgc2V0IHRvIHRoZSBzYW1lCisgKiAgIGZ1bmN0aW9uIChib3RoIHJlZ2lzdGVycyBhcmUgYWx3YXlzIHNldCB1cCBjb21wbGV0ZWx5IGluIGFueSBjYXNlKQorICogLSBNb3N0IGJsZW5kIGZsYWdzIGFyZSBzaW1wbHkgY29waWVkIGZyb20gUjIwMCBhbmQgbm90IHRlc3RlZCB5ZXQKKyAqLwogI2RlZmluZSBSMzAwX1JCM0RfQ0JMRU5EICAgICAgICAgICAgICAgICAgICAweDRFMDQKICNkZWZpbmUgUjMwMF9SQjNEX0FCTEVORCAgICAgICAgICAgICAgICAgICAgMHg0RTA4Ci0gLyogdGhlIGZvbGxvd2luZyBvbmx5IGFwcGVhciBpbiBDQkxFTkQgKi8KKy8qIHRoZSBmb2xsb3dpbmcgb25seSBhcHBlYXIgaW4gQ0JMRU5EICovCiAjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX1VOS05PV04gICAgICAgICAgICAgICAgICAgICgzIDw8IDEpCiAjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX05PX1NFUEFSQVRFICAgICAgICAgICAgICAgICgxIDw8IDMpCi0gLyogdGhlIGZvbGxvd2luZyBhcmUgc2hhcmVkIGJldHdlZW4gQ0JMRU5EIGFuZCBBQkxFTkQgKi8KKy8qIHRoZSBmb2xsb3dpbmcgYXJlIHNoYXJlZCBiZXR3ZWVuIENCTEVORCBhbmQgQUJMRU5EICovCiAjICAgICAgIGRlZmluZSBSMzAwX0ZDTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICgzICA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fQUREX0NMQU1QICAgICAgICAgICAgICAgKDAgIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9BRERfTk9DTEFNUCAgICAgICAgICAgICAoMSAgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX1NVQl9DTEFNUCAgICAgICAgICAgICAgICgyICA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fU1VCX05PQ0xBTVAgICAgICAgICAgICAgKDMgIDw8IDEyKQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfWkVSTyAgICAgICAgICAgICAgICAoMzIgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9PTkUgICAgICAgICAgICAgICAgICgzMyA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX1NSQ19DT0xPUiAgICAgICAgICAgKDM0IDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19DT0xPUiAoMzUgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9EU1RfQ09MT1IgICAgICAgICAgICgzNiA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQ09MT1IgKDM3IDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfU1JDX0FMUEhBICAgICAgICAgICAoMzggPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0FMUEhBICgzOSA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX0RTVF9BTFBIQSAgICAgICAgICAgKDQwIDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9BTFBIQSAoNDEgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9TUkNfQUxQSEFfU0FUVVJBVEUgICg0MiA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX01BU0sgICAgICAgICAgICAgICAgICAgKDYzIDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfWkVSTyAgICAgICAgICAgICAgICAoMzIgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9PTkUgICAgICAgICAgICAgICAgICgzMyA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX1NSQ19DT0xPUiAgICAgICAgICAgKDM0IDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19DT0xPUiAoMzUgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9EU1RfQ09MT1IgICAgICAgICAgICgzNiA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQ09MT1IgKDM3IDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfU1JDX0FMUEhBICAgICAgICAgICAoMzggPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0FMUEhBICgzOSA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX0RTVF9BTFBIQSAgICAgICAgICAgKDQwIDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9BTFBIQSAoNDEgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9NQVNLICAgICAgICAgICAgICAgICAgICg2MyA8PCAyNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fTUlOICAgICAgICAgICAgICAgICAgICAgKDQgIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9NQVggICAgICAgICAgICAgICAgICAgICAoNSAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX1JTVUJfQ0xBTVAgICAgICAgICAgICAgICg2ICA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fUlNVQl9OT0NMQU1QICAgICAgICAgICAgKDcgIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9aRVJPICAgICAgICAgICAgICAgICAgICAoMzIpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORSAgICAgICAgICAgICAgICAgICAgICgzMykKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgKDM0KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAoMzUpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICgzNikKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9DT0xPUiAgICAgKDM3KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAoMzgpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICgzOSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfRFNUX0FMUEhBICAgICAgICAgICAgICAgKDQwKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAoNDEpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICg0MikKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfQ09OU1RfQ09MT1IgICAgICAgICAgICAgKDQzKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkVfTUlOVVNfQ09OU1RfQ09MT1IgICAoNDQpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX0NPTlNUX0FMUEhBICAgICAgICAgICAgICg0NSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX0NPTlNUX0FMUEhBICAgKDQ2KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAoNjMpCisjICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9TSElGVCAgICAgICAgICAgICAgICAgICgxNikKKyMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX1NISUZUICAgICAgICAgICAgICAgICAgKDI0KQorI2RlZmluZSBSMzAwX1JCM0RfQkxFTkRfQ09MT1IgICAgICAgICAgICAgICAweDRFMTAKICNkZWZpbmUgUjMwMF9SQjNEX0NPTE9STUFTSyAgICAgICAgICAgICAgICAgMHg0RTBDCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTE9STUFTSzBfQiAgICAgICAgICAgICAgICAgKDE8PDApCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTE9STUFTSzBfRyAgICAgICAgICAgICAgICAgKDE8PDEpCkBAIC0xMTgxLDQxICsxMzE1LDQ5IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0NPTE9STUFTSzBfQSAgICAgICAgICAgICAgICAgKDE8PDMpCiAKIC8qIGdhcCAqLworCiAjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDAgICAgICAgICAgICAgIDB4NEUyOAotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk9GRlNFVF9NQVNLICAgICAgICAgICAgIDB4RkZGRkZGRjAJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMSAgICAgICAgICAgICAgMHg0RTJDCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDIgICAgICAgICAgICAgIDB4NEUzMAkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQzICAgICAgICAgICAgICAweDRFMzQJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JPRkZTRVRfTUFTSyAgICAgICAgICAgICAweEZGRkZGRkYwIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDEgICAgICAgICAgICAgIDB4NEUyQyAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQyICAgICAgICAgICAgICAweDRFMzAgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMyAgICAgICAgICAgICAgMHg0RTM0IC8qIEdVRVNTICovCisKIC8qIGdhcCAqLworCiAvKiBCaXQgMTY6IExhcmdlciB0aWxlcwotLy8gQml0IDE3OiA0eDIgdGlsZXMKLS8vIEJpdCAxODogRXh0cmVtZWx5IHdlaXJkIHRpbGUgbGlrZSwgYnV0IHNvbWUgcGl4ZWxzIGR1cGxpY2F0ZWQ/ICovCisgKiBCaXQgMTc6IDR4MiB0aWxlcworICogQml0IDE4OiBFeHRyZW1lbHkgd2VpcmQgdGlsZSBsaWtlLCBidXQgc29tZSBwaXhlbHMgZHVwbGljYXRlZD8KKyAqLwogI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDAgICAgICAgICAgICAgICAweDRFMzgKLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JQSVRDSF9NQVNLICAgICAgICAgICAgICAweDAwMDAxRkY4CS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX1RJTEVfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTYpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX01JQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTcpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9OT19TV0FQICAgICAgICAgKDAgPDwgMTgpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9XT1JEX1NXQVAgICAgICAgKDEgPDwgMTgpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SUElUQ0hfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMUZGOCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9USUxFX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDE2KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9NSUNST1RJTEVfRU5BQkxFICAgICAgICgxIDw8IDE3KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fTk9fU1dBUCAgICAgICAgICgwIDw8IDE4KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fV09SRF9TV0FQICAgICAgICgxIDw8IDE4KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fRFdPUkRfU1dBUCAgICAgICgyIDw8IDE4KSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9GT1JNQVRfUkdCNTY1ICAgICAgICAgICgyIDw8IDIyKQogIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9GT1JNQVRfQVJHQjg4ODggICAgICAgICgzIDw8IDIyKQotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDEgICAgICAgICAgICAgICAweDRFM0MJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gyICAgICAgICAgICAgICAgMHg0RTQwCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMyAgICAgICAgICAgICAgIDB4NEU0NAkvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDEgICAgICAgICAgICAgICAweDRFM0MgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gyICAgICAgICAgICAgICAgMHg0RTQwIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMyAgICAgICAgICAgICAgIDB4NEU0NCAvKiBHVUVTUyAqLwogCiAvKiBnYXAgKi8KKwogLyogR3Vlc3MgYnkgVmxhZGltaXIuCi0vLyBTZXQgdG8gMEEgYmVmb3JlIDNEIG9wZXJhdGlvbnMsIHNldCB0byAwMiBhZnRlcndhcmRzLiAqLworICogU2V0IHRvIDBBIGJlZm9yZSAzRCBvcGVyYXRpb25zLCBzZXQgdG8gMDIgYWZ0ZXJ3YXJkcy4KKyAqLwogI2RlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVCAgICAgICAgICAweDRFNEMKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV8wMiAgICAgICAgICAgICAweDAwMDAwMDAyCi0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfMEEgICAgICAgICAgICAgMHgwMDAwMDAwQQorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFX1VOS05PV05fMDIgICAgICAgICAgICAgMHgwMDAwMDAwMgorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFX1VOS05PV05fMEEgICAgICAgICAgICAgMHgwMDAwMDAwQQogCiAvKiBnYXAgKi8KLS8qIFRoZXJlIHNlZW1zIHRvIGJlIG5vICJ3cml0ZSBvbmx5IiBzZXR0aW5nLCBzbyB1c2UgWi10ZXN0ID0gQUxXQVlTIGZvciB0aGlzLiAqLwotLyogQml0ICgxPDw4KSBpcyB0aGUgInRlc3QiIGJpdC4gc28gcGxhaW4gd3JpdGUgaXMgNiAgLSB2ZCAqLworLyogVGhlcmUgc2VlbXMgdG8gYmUgbm8gIndyaXRlIG9ubHkiIHNldHRpbmcsIHNvIHVzZSBaLXRlc3QgPSBBTFdBWVMKKyAqIGZvciB0aGlzLgorICogQml0ICgxPDw4KSBpcyB0aGUgInRlc3QiIGJpdC4gc28gcGxhaW4gd3JpdGUgaXMgNiAgLSB2ZAorICovCiAjZGVmaW5lIFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzAgICAgICAgICAgICAgICAgICAgMHg0RjAwCi0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9ESVNBQkxFRF8xICAgICAgICAgICAgMHgwMDAwMDAxMAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfRElTQUJMRURfMiAgICAgICAgICAgIDB4MDAwMDAwMTQJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX0RJU0FCTEVEXzEgICAgICAgICAgICAweDAwMDAwMDEwCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9ESVNBQkxFRF8yICAgICAgICAgICAgMHgwMDAwMDAxNAogIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfVEVTVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKICMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1RFU1RfQU5EX1dSSVRFICAgICAgICAweDAwMDAwMDE2CiAjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9XUklURV9PTkxZICAgICAgICAJIDB4MDAwMDAwMDYKQEAgLTEyMjYsNyArMTM2OCw3IEBACiAjCWRlZmluZSBSMzAwX1JCM0RfU1RFTkNJTF9FTkFCTEUJCSAweDAwMDAwMDAxCiAKICNkZWZpbmUgUjMwMF9SQjNEX1pTVEVOQ0lMX0NOVExfMSAgICAgICAgICAgICAgICAgICAweDRGMDQKLQkJLyogZnVuY3Rpb25zICovCisJLyogZnVuY3Rpb25zICovCiAjCWRlZmluZSBSMzAwX1pTX05FVkVSCQkJMAogIwlkZWZpbmUgUjMwMF9aU19MRVNTCQkJMQogIwlkZWZpbmUgUjMwMF9aU19MRVFVQUwJCQkyCkBAIC0xMjM2LDcgKzEzNzgsNyBAQAogIwlkZWZpbmUgUjMwMF9aU19OT1RFUVVBTAkJCTYKICMJZGVmaW5lIFIzMDBfWlNfQUxXQVlTCQkJNwogIyAgICAgICBkZWZpbmUgUjMwMF9aU19NQVNLICAgICAgICAgICAgICAgICAgICAgNwotCQkvKiBvcGVyYXRpb25zICovCisJLyogb3BlcmF0aW9ucyAqLwogIwlkZWZpbmUgUjMwMF9aU19LRUVQCQkJMAogIwlkZWZpbmUgUjMwMF9aU19aRVJPCQkJMQogIwlkZWZpbmUgUjMwMF9aU19SRVBMQUNFCQkJMgpAQCAtMTI0NSw5ICsxMzg3LDggQEAKICMJZGVmaW5lIFIzMDBfWlNfSU5WRVJUCQkJNQogIwlkZWZpbmUgUjMwMF9aU19JTkNSX1dSQVAJCTYKICMJZGVmaW5lIFIzMDBfWlNfREVDUl9XUkFQCQk3Ci0KLSAgICAgICAvKiBmcm9udCBhbmQgYmFjayByZWZlciB0byBvcGVyYXRpb25zIGRvbmUgZm9yIGZyb250Ci0gICAgICAgICAgYW5kIGJhY2sgZmFjZXMsIGkuZS4gc2VwYXJhdGUgc3RlbmNpbCBmdW5jdGlvbiBzdXBwb3J0ICovCisJLyogZnJvbnQgYW5kIGJhY2sgcmVmZXIgdG8gb3BlcmF0aW9ucyBkb25lIGZvciBmcm9udAorCSAgIGFuZCBiYWNrIGZhY2VzLCBpLmUuIHNlcGFyYXRlIHN0ZW5jaWwgZnVuY3Rpb24gc3VwcG9ydCAqLwogIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9ERVBUSF9GVU5DX1NISUZUCQkwCiAjCWRlZmluZSBSMzAwX1JCM0RfWlMxX0ZST05UX0ZVTkNfU0hJRlQJCTMKICMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfRlJPTlRfRkFJTF9PUF9TSElGVAk2CkBAIC0xMjY5LDQ1ICsxNDEwLDY0IEBACiAjZGVmaW5lIFIzMDBfUkIzRF9aU1RFTkNJTF9GT1JNQVQgICAgICAgICAgICAgICAgICAgMHg0RjEwCiAjCWRlZmluZSBSMzAwX0RFUFRIX0ZPUk1BVF8xNkJJVF9JTlRfWiAgICAgKDAgPDwgMCkKICMJZGVmaW5lIFIzMDBfREVQVEhfRk9STUFUXzI0QklUX0lOVF9aICAgICAoMiA8PCAwKQorCS8qIDE2IGJpdCBmb3JtYXQgb3Igc29tZSBhZGl0aW9uYWwgYml0ID8gKi8KKyMJZGVmaW5lIFIzMDBfREVQVEhfRk9STUFUX1VOSzMyICAgICAgICAgICgzMiA8PCAwKQorCisjZGVmaW5lIFIzMDBfUkIzRF9FQVJMWV9aICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0RjE0CisjCWRlZmluZSBSMzAwX0VBUkxZX1pfRElTQUJMRSAgICAgICAgICAgICAgKDAgPDwgMCkKKyMJZGVmaW5lIFIzMDBfRUFSTFlfWl9FTkFCTEUgICAgICAgICAgICAgICAoMSA8PCAwKQogCiAvKiBnYXAgKi8KKworI2RlZmluZSBSMzAwX1JCM0RfWkNBQ0hFX0NUTFNUQVQgICAgICAgICAgICAweDRGMTggLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aQ0FDSEVfVU5LTk9XTl8wMSAgMHgxCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWkNBQ0hFX1VOS05PV05fMDMgIDB4MworCisvKiBnYXAgKi8KKwogI2RlZmluZSBSMzAwX1JCM0RfREVQVEhPRkZTRVQgICAgICAgICAgICAgICAweDRGMjAKICNkZWZpbmUgUjMwMF9SQjNEX0RFUFRIUElUQ0ggICAgICAgICAgICAgICAgMHg0RjI0Ci0jICAgICAgIGRlZmluZSBSMzAwX0RFUFRIUElUQ0hfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMUZGOAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9USUxFX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDE2KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9NSUNST1RJTEVfRU5BQkxFICAgICAgICgxIDw8IDE3KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fTk9fU1dBUCAgICAgICAgICgwIDw8IDE4KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fV09SRF9TV0FQICAgICAgICgxIDw8IDE4KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fRFdPUkRfU1dBUCAgICAgICgyIDw8IDE4KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSFBJVENIX01BU0sgICAgICAgICAgICAgIDB4MDAwMDFGRjggLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfVElMRV9FTkFCTEUgICAgICAgICAgICAoMSA8PCAxNikgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfTUlDUk9USUxFX0VOQUJMRSAgICAgICAoMSA8PCAxNykgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX05PX1NXQVAgICAgICAgICAoMCA8PCAxOCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAoMSA8PCAxOCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX0RXT1JEX1NXQVAgICAgICAoMiA8PCAxOCkgLyogR1VFU1MgKi8KIAotLyogQkVHSU46IFZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9uIHNldAotLy8gRXZlcnkgaW5zdHJ1Y3Rpb24gaXMgZm91ciBkd29yZHMgbG9uZzoKLS8vICBEV09SRCAwOiBvdXRwdXQgYW5kIG9wY29kZQotLy8gIERXT1JEIDE6IGZpcnN0IGFyZ3VtZW50Ci0vLyAgRFdPUkQgMjogc2Vjb25kIGFyZ3VtZW50Ci0vLyAgRFdPUkQgMzogdGhpcmQgYXJndW1lbnQKLS8vCi0vLyBOb3RlczoKLS8vICAtIEFCUyByLCBhIGlzIGltcGxlbWVudGVkIGFzIE1BWCByLCBhLCAtYQotLy8gIC0gTU9WIGlzIGltcGxlbWVudGVkIGFzIEFERCB0byB6ZXJvCi0vLyAgLSBYUEQgaXMgaW1wbGVtZW50ZWQgYXMgTVVMICsgTUFECi0vLyAgLSBGTFIgaXMgaW1wbGVtZW50ZWQgYXMgRlJDICsgQURECi0vLyAgLSBhcHBhcmVudGx5LCBmZ2xyeCB0cmllcyB0byBzY2hlZHVsZSBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGVyZSBpcyBhdCBsZWFzdAotLy8gICAgb25lIGluc3RydWN0aW9uIGJldHdlZW4gdGhlIHdyaXRlIHRvIGEgdGVtcG9yYXJ5IGFuZCB0aGUgZmlyc3QgcmVhZAotLy8gICAgZnJvbSBzYWlkIHRlbXBvcmFyeTsgaG93ZXZlciwgdmlvbGF0aW9ucyBvZiB0aGlzIHNjaGVkdWxpbmcgYXJlIGFsbG93ZWQKLS8vICAtIHJlZ2lzdGVyIGluZGljZXMgc2VlbSB0byBiZSB1bnJlbGF0ZWQgd2l0aCBPcGVuR0wgYWxpYXNpbmcgdG8gY29udmVudGlvbmFsIHN0YXRlCi0vLyAgLSBvbmx5IG9uZSBhdHRyaWJ1dGUgYW5kIG9uZSBwYXJhbWV0ZXIgY2FuIGJlIGxvYWRlZCBhdCBhIHRpbWU7IGhvd2V2ZXIsIHRoZQotLy8gICAgc2FtZSBhdHRyaWJ1dGUvcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGZvciBtb3JlIHRoYW4gb25lIGFyZ3VtZW50Ci0vLyAgLSB0aGUgc2Vjb25kIHNvZnR3YXJlIGFyZ3VtZW50IGZvciBQT1cgaXMgdGhlIHRoaXJkIGhhcmR3YXJlIGFyZ3VtZW50IChubyBpZGVhIHdoeSkKLS8vICAtIE1BRCB3aXRoIG9ubHkgdGVtcG9yYXJpZXMgYXMgaW5wdXQgc2VlbXMgdG8gdXNlIFZQSV9PVVRfU0VMRUNUX01BRF8yCi0vLwotLy8gVGhlcmUgaXMgc29tZSBtYWdpYyBzdXJyb3VuZGluZyBMSVQ6Ci0vLyAgVGhlIHNpbmdsZSBhcmd1bWVudCBpcyByZXBsaWNhdGVkIGFjcm9zcyBhbGwgdGhyZWUgaW5wdXRzLCBidXQgc3dpenpsZWQ6Ci0vLyAgIEZpcnN0IGFyZ3VtZW50OiB4eXp5Ci0vLyAgIFNlY29uZCBhcmd1bWVudDogeHl6eAotLy8gICBUaGlyZCBhcmd1bWVudDogeHl6dwotLy8gIFdoZW5ldmVyIHRoZSByZXN1bHQgaXMgdXNlZCBsYXRlciBpbiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSwgZmdscnggZm9yY2VzIHggYW5kIHcKLS8vICB0byBiZSAxLjAgaW4gdGhlIGlucHV0IHNlbGVjdGlvbjsgSSBkb24ndCBrbm93IHdoZXRoZXIgdGhpcyBpcyBzdHJpY3RseSBuZWNlc3NhcnkgKi8KKy8qIEJFR0lOOiBWZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQgKi8KKworLyogRXZlcnkgaW5zdHJ1Y3Rpb24gaXMgZm91ciBkd29yZHMgbG9uZzoKKyAqICBEV09SRCAwOiBvdXRwdXQgYW5kIG9wY29kZQorICogIERXT1JEIDE6IGZpcnN0IGFyZ3VtZW50CisgKiAgRFdPUkQgMjogc2Vjb25kIGFyZ3VtZW50CisgKiAgRFdPUkQgMzogdGhpcmQgYXJndW1lbnQKKyAqCisgKiBOb3RlczoKKyAqICAtIEFCUyByLCBhIGlzIGltcGxlbWVudGVkIGFzIE1BWCByLCBhLCAtYQorICogIC0gTU9WIGlzIGltcGxlbWVudGVkIGFzIEFERCB0byB6ZXJvCisgKiAgLSBYUEQgaXMgaW1wbGVtZW50ZWQgYXMgTVVMICsgTUFECisgKiAgLSBGTFIgaXMgaW1wbGVtZW50ZWQgYXMgRlJDICsgQURECisgKiAgLSBhcHBhcmVudGx5LCBmZ2xyeCB0cmllcyB0byBzY2hlZHVsZSBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGVyZSBpcyBhdAorICogICAgbGVhc3Qgb25lIGluc3RydWN0aW9uIGJldHdlZW4gdGhlIHdyaXRlIHRvIGEgdGVtcG9yYXJ5IGFuZCB0aGUgZmlyc3QKKyAqICAgIHJlYWQgZnJvbSBzYWlkIHRlbXBvcmFyeTsgaG93ZXZlciwgdmlvbGF0aW9ucyBvZiB0aGlzIHNjaGVkdWxpbmcgYXJlCisgKiAgICBhbGxvd2VkCisgKiAgLSByZWdpc3RlciBpbmRpY2VzIHNlZW0gdG8gYmUgdW5yZWxhdGVkIHdpdGggT3BlbkdMIGFsaWFzaW5nIHRvCisgKiAgICBjb252ZW50aW9uYWwgc3RhdGUKKyAqICAtIG9ubHkgb25lIGF0dHJpYnV0ZSBhbmQgb25lIHBhcmFtZXRlciBjYW4gYmUgbG9hZGVkIGF0IGEgdGltZTsgaG93ZXZlciwKKyAqICAgIHRoZSBzYW1lIGF0dHJpYnV0ZS9wYXJhbWV0ZXIgY2FuIGJlIHVzZWQgZm9yIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQKKyAqICAtIHRoZSBzZWNvbmQgc29mdHdhcmUgYXJndW1lbnQgZm9yIFBPVyBpcyB0aGUgdGhpcmQgaGFyZHdhcmUgYXJndW1lbnQKKyAqICAgIChubyBpZGVhIHdoeSkKKyAqICAtIE1BRCB3aXRoIG9ubHkgdGVtcG9yYXJpZXMgYXMgaW5wdXQgc2VlbXMgdG8gdXNlIFZQSV9PVVRfU0VMRUNUX01BRF8yCisgKgorICogVGhlcmUgaXMgc29tZSBtYWdpYyBzdXJyb3VuZGluZyBMSVQ6CisgKiAgIFRoZSBzaW5nbGUgYXJndW1lbnQgaXMgcmVwbGljYXRlZCBhY3Jvc3MgYWxsIHRocmVlIGlucHV0cywgYnV0IHN3aXp6bGVkOgorICogICAgIEZpcnN0IGFyZ3VtZW50OiB4eXp5CisgKiAgICAgU2Vjb25kIGFyZ3VtZW50OiB4eXp4CisgKiAgICAgVGhpcmQgYXJndW1lbnQ6IHh5encKKyAqICAgV2hlbmV2ZXIgdGhlIHJlc3VsdCBpcyB1c2VkIGxhdGVyIGluIHRoZSBmcmFnbWVudCBwcm9ncmFtLCBmZ2xyeCBmb3JjZXMKKyAqICAgeCBhbmQgdyB0byBiZSAxLjAgaW4gdGhlIGlucHV0IHNlbGVjdGlvbjsgSSBkb24ndCBrbm93IHdoZXRoZXIgdGhpcyBpcworICogICBzdHJpY3RseSBuZWNlc3NhcnkKKyAqLwogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfRE9UICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX01VTCAgICAgICAgICAgICAgICAgICAgICgyIDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9BREQgICAgICAgICAgICAgICAgICAgICAoMyA8PCAwKQpAQCAtMTMxOCwyNiArMTQ3OCwzMyBAQAogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTUlOICAgICAgICAgICAgICAgICAgICAgKDggPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1NHRSAgICAgICAgICAgICAgICAgICAgICg5IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9TTFQgICAgICAgICAgICAgICAgICAgICAoMTAgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzEyICAgICAgICAgICAgICAgICAgICgxMiA8PCAwKQkvKiBVc2VkIGluIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgdmVjdG9yKHNjYWxhciwgdmVjdG9yKSAqLworCS8qIFVzZWQgaW4gR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCB2ZWN0b3Ioc2NhbGFyLCB2ZWN0b3IpICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMiAgICAgICAgICAgICAgICAgICAoMTIgPDwgMCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0FSTCAgICAgICAgICAgICAgICAgICAgICgxMyA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfRVhQICAgICAgICAgICAgICAgICAgICAgKDY1IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9MT0cgICAgICAgICAgICAgICAgICAgICAoNjYgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzY3ICAgICAgICAgICAgICAgICAgICg2NyA8PCAwKQkvKiBVc2VkIGluIGZvZyBjb21wdXRhdGlvbnMsIHNjYWxhcihzY2FsYXIpICovCisJLyogVXNlZCBpbiBmb2cgY29tcHV0YXRpb25zLCBzY2FsYXIoc2NhbGFyKSAqLworI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LNjcgICAgICAgICAgICAgICAgICAgKDY3IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9MSVQgICAgICAgICAgICAgICAgICAgICAoNjggPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1BPVyAgICAgICAgICAgICAgICAgICAgICg2OSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfUkNQICAgICAgICAgICAgICAgICAgICAgKDcwIDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9SU1EgICAgICAgICAgICAgICAgICAgICAoNzIgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzczICAgICAgICAgICAgICAgICAgICg3MyA8PCAwKQkvKiBVc2VkIGluIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgc2NhbGFyKHNjYWxhcikgKi8KKwkvKiBVc2VkIGluIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgc2NhbGFyKHNjYWxhcikgKi8KKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzczICAgICAgICAgICAgICAgICAgICg3MyA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfRVgyICAgICAgICAgICAgICAgICAgICAgKDc1IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9MRzIgICAgICAgICAgICAgICAgICAgICAoNzYgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX01BRF8yICAgICAgICAgICAgICAgICAgICgxMjggPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzEyOSAgICAgICAgICAgICAgICAgICgxMjkgPDwgMCkJLyogYWxsIHRlbXBzLCB2ZWN0b3Ioc2NhbGFyLCB2ZWN0b3IsIHZlY3RvcikgKi8KKwkvKiBhbGwgdGVtcHMsIHZlY3RvcihzY2FsYXIsIHZlY3RvciwgdmVjdG9yKSAqLworI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LMTI5ICAgICAgICAgICAgICAgICAgKDEyOSA8PCAwKQogCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfQ0xBU1NfVEVNUE9SQVJZICAgICAgICAoMCA8PCA4KQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX0FERFIgICAgICAgICAgICAgKDEgPDwgOCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19DTEFTU19SRVNVTFQgICAgICAgICAgICgyIDw8IDgpCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfQ0xBU1NfTUFTSyAgICAgICAgICAgICAoMzEgPDwgOCkKIAogI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0lOREVYX1NISUZUICAgICAgICAgICAgMTMKLSNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19JTkRFWF9NQVNLICAgICAgICAgICAgICgzMSA8PCAxMykJLyogR1VFU1MgYmFzZWQgb24gZmdscnggbmF0aXZlIGxpbWl0cyAqLworCS8qIEdVRVNTIGJhc2VkIG9uIGZnbHJ4IG5hdGl2ZSBsaW1pdHMgKi8KKyNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19JTkRFWF9NQVNLICAgICAgICAgICAgICgzMSA8PCAxMykKIAogI2RlZmluZSBSMzAwX1ZQSV9PVVRfV1JJVEVfWCAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9XUklURV9ZICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMSkKQEAgLTEzNDgsMTQgKzE1MTUsMTYgQEAKICNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX0FUVFJJQlVURSAgICAgICAgICgxIDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19QQVJBTUVURVIgICAgICAgICAoMiA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfTk9ORSAgICAgICAgICAgICAgKDkgPDwgMCkKLSNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQkvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCiAKICNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0lOREVYX1NISUZUICAgICAgICAgICAgIDUKLSNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0lOREVYX01BU0sgICAgICAgICAgICAgICgyNTUgPDwgNSkJLyogR1VFU1MgYmFzZWQgb24gZmdscnggbmF0aXZlIGxpbWl0cyAqLworCS8qIEdVRVNTIGJhc2VkIG9uIGZnbHJ4IG5hdGl2ZSBsaW1pdHMgKi8KKyNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0lOREVYX01BU0sgICAgICAgICAgICAgICgyNTUgPDwgNSkKIAogLyogVGhlIFIzMDAgY2FuIHNlbGVjdCBjb21wb25lbnRzIGZyb20gdGhlIGlucHV0IHJlZ2lzdGVyIGFyYml0cmFyaWx5LgotLy8gVXNlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLCBzaGlmdGVkIGJ5IHRoZSBjb21wb25lbnQgc2hpZnQgeW91Ci0vLyB3YW50IHRvIHNlbGVjdCAqLworICogVXNlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLCBzaGlmdGVkIGJ5IHRoZSBjb21wb25lbnQgc2hpZnQgeW91CisgKiB3YW50IHRvIHNlbGVjdAorICovCiAjZGVmaW5lIFIzMDBfVlBJX0lOX1NFTEVDVF9YICAgIDAKICNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX1kgICAgMQogI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfWiAgICAyCkBAIC0xMzczLDExICsxNTQyLDExIEBACiAjZGVmaW5lIFIzMDBfVlBJX0lOX05FR19ZICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNikKICNkZWZpbmUgUjMwMF9WUElfSU5fTkVHX1ogICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI3KQogI2RlZmluZSBSMzAwX1ZQSV9JTl9ORUdfVyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjgpCi0vKiBFTkQgKi8KKy8qIEVORDogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0ICovCiAKLS8vQkVHSU46IFBhY2tldCAzIGNvbW1hbmRzCisvKiBCRUdJTjogUGFja2V0IDMgY29tbWFuZHMgKi8KIAotLy8gQSBwcmltaXRpdmUgZW1pc3Npb24gZHdvcmQuCisvKiBBIHByaW1pdGl2ZSBlbWlzc2lvbiBkd29yZC4gKi8KICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICgwIDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1BPSU5UICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9MSU5FICAgICAgICAgICAgICAgICAgICAgKDIgPDwgMCkKQEAgLTEzODksNyArMTU1OCw4IEBACiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1JFQ1RfTElTVCAgICAgICAgICAgICAgICAoOCA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV8zVlJUX1BPSU5UX0xJU1QgICAgICAgICAgKDkgPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QgICAgICAgICAgICgxMCA8PCAwKQotI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9QT0lOVF9TUFJJVEVTICAgICAgICAgICAgKDExIDw8IDApCS8vIEdVRVNTIChiYXNlZCBvbiByMjAwKQorCS8qIEdVRVNTIChiYXNlZCBvbiByMjAwKSAqLworI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9QT0lOVF9TUFJJVEVTICAgICAgICAgICAgKDExIDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAoMTIgPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUVVBRFMgICAgICAgICAgICAgICAgICAgICgxMyA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9RVUFEX1NUUklQICAgICAgICAgICAgICAgKDE0IDw8IDApCkBAIC0xMzk5LDM3ICsxNTY5LDU4IEBACiAjZGVmaW5lIFIzMDBfUFJJTV9XQUxLX0xJU1QgICAgICAgICAgICAgICAgICAgICAoMiA8PCA0KQogI2RlZmluZSBSMzAwX1BSSU1fV0FMS19SSU5HICAgICAgICAgICAgICAgICAgICAgKDMgPDwgNCkKICNkZWZpbmUgUjMwMF9QUklNX1dBTEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICgzIDw8IDQpCi0jZGVmaW5lIFIzMDBfUFJJTV9DT0xPUl9PUkRFUl9CR1JBICAgICAgICAgICAgICAoMCA8PCA2KQkvLyBHVUVTUyAoYmFzZWQgb24gcjIwMCkKLSNkZWZpbmUgUjMwMF9QUklNX0NPTE9SX09SREVSX1JHQkEgICAgICAgICAgICAgICgxIDw8IDYpCS8vIEdVRVNTCisJLyogR1VFU1MgKGJhc2VkIG9uIHIyMDApICovCisjZGVmaW5lIFIzMDBfUFJJTV9DT0xPUl9PUkRFUl9CR1JBICAgICAgICAgICAgICAoMCA8PCA2KQorI2RlZmluZSBSMzAwX1BSSU1fQ09MT1JfT1JERVJfUkdCQSAgICAgICAgICAgICAgKDEgPDwgNikKICNkZWZpbmUgUjMwMF9QUklNX05VTV9WRVJUSUNFU19TSElGVCAgICAgICAgICAgIDE2CisjZGVmaW5lIFIzMDBfUFJJTV9OVU1fVkVSVElDRVNfTUFTSyAgICAgICAgICAgICAweGZmZmYKIAotLy8gRHJhdyBhIHByaW1pdGl2ZSBmcm9tIHZlcnRleCBkYXRhIGluIGFycmF5cyBsb2FkZWQgdmlhIDNEX0xPQURfVkJQTlRSLgotLy8gVHdvIHBhcmFtZXRlciBkd29yZHM6Ci0vLyAwLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGFwcGVhcnMgdG8gYmUgYWx3YXlzIDAKLS8vIDEuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgc3RhbmRhcmQgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgorLyogRHJhdyBhIHByaW1pdGl2ZSBmcm9tIHZlcnRleCBkYXRhIGluIGFycmF5cyBsb2FkZWQgdmlhIDNEX0xPQURfVkJQTlRSLgorICogVHdvIHBhcmFtZXRlciBkd29yZHM6CisgKiAwLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGFwcGVhcnMgdG8gYmUgYWx3YXlzIDAKKyAqIDEuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGEgc3RhbmRhcmQgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgorICovCiAjZGVmaW5lIFIzMDBfUEFDS0VUM18zRF9EUkFXX1ZCVUYgICAgICAgICAgIDB4MDAwMDI4MDAKIAotLy8gU3BlY2lmeSB0aGUgZnVsbCBzZXQgb2YgdmVydGV4IGFycmF5cyBhcyAoYWRkcmVzcywgc3RyaWRlKS4KLS8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiB2ZXJ0ZXggYXJyYXlzIHNwZWNpZmllZC4KLS8vIFRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGxpc3Qgb2YgYmxvY2tzLCB3aGVyZQotLy8gZWFjaCBibG9jayBpcyB0aHJlZSBkd29yZHMgbG9uZyBhbmQgc3BlY2lmaWVzIHR3byBhcnJheXMuCi0vLyBUaGUgZmlyc3QgZHdvcmQgb2YgYSBibG9jayBpcyBzcGxpdCBpbnRvIHR3byB3b3JkcywgdGhlIGxvd2VyIHNpZ25pZmljYW50Ci0vLyB3b3JkIHJlZmVycyB0byB0aGUgZmlyc3QgYXJyYXksIHRoZSBtb3JlIHNpZ25pZmljYW50IHdvcmQgdG8gdGhlIHNlY29uZAotLy8gYXJyYXkgaW4gdGhlIGJsb2NrLgotLy8gVGhlIGxvdyBieXRlIG9mIGVhY2ggd29yZCBjb250YWlucyB0aGUgc2l6ZSBvZiBhbiBhcnJheSBlbnRyeSBpbiBkd29yZHMsCi0vLyB0aGUgaGlnaCBieXRlIGNvbnRhaW5zIHRoZSBzdHJpZGUgb2YgdGhlIGFycmF5LgotLy8gVGhlIHNlY29uZCBkd29yZCBvZiBhIGJsb2NrIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBhcnJheSwKLS8vIHRoZSB0aGlyZCBkd29yZCBvZiBhIGJsb2NrIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgYXJyYXkuCi0vLyBOb3RlIHRoYXQgaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhcnJheXMgaXMgb2RkLCB0aGUgdGhpcmQgZHdvcmQgb2YKLS8vIHRoZSBsYXN0IGJsb2NrIGlzIG9taXR0ZWQuCisvKiBTcGVjaWZ5IHRoZSBmdWxsIHNldCBvZiB2ZXJ0ZXggYXJyYXlzIGFzIChhZGRyZXNzLCBzdHJpZGUpLgorICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbnVtYmVyIG9mIHZlcnRleCBhcnJheXMgc3BlY2lmaWVkLgorICogVGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgaXMgYSB2YXJpYWJsZSBsZW5ndGggbGlzdCBvZiBibG9ja3MsIHdoZXJlCisgKiBlYWNoIGJsb2NrIGlzIHRocmVlIGR3b3JkcyBsb25nIGFuZCBzcGVjaWZpZXMgdHdvIGFycmF5cy4KKyAqIFRoZSBmaXJzdCBkd29yZCBvZiBhIGJsb2NrIGlzIHNwbGl0IGludG8gdHdvIHdvcmRzLCB0aGUgbG93ZXIgc2lnbmlmaWNhbnQKKyAqIHdvcmQgcmVmZXJzIHRvIHRoZSBmaXJzdCBhcnJheSwgdGhlIG1vcmUgc2lnbmlmaWNhbnQgd29yZCB0byB0aGUgc2Vjb25kCisgKiBhcnJheSBpbiB0aGUgYmxvY2suCisgKiBUaGUgbG93IGJ5dGUgb2YgZWFjaCB3b3JkIGNvbnRhaW5zIHRoZSBzaXplIG9mIGFuIGFycmF5IGVudHJ5IGluIGR3b3JkcywKKyAqIHRoZSBoaWdoIGJ5dGUgY29udGFpbnMgdGhlIHN0cmlkZSBvZiB0aGUgYXJyYXkuCisgKiBUaGUgc2Vjb25kIGR3b3JkIG9mIGEgYmxvY2sgY29udGFpbnMgdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGFycmF5LAorICogdGhlIHRoaXJkIGR3b3JkIG9mIGEgYmxvY2sgY29udGFpbnMgdGhlIHBvaW50ZXIgdG8gdGhlIHNlY29uZCBhcnJheS4KKyAqIE5vdGUgdGhhdCBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIGFycmF5cyBpcyBvZGQsIHRoZSB0aGlyZCBkd29yZCBvZgorICogdGhlIGxhc3QgYmxvY2sgaXMgb21pdHRlZC4KKyAqLwogI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfTE9BRF9WQlBOVFIgICAgICAgICAweDAwMDAyRjAwCiAKICNkZWZpbmUgUjMwMF9QQUNLRVQzX0lORFhfQlVGRkVSICAgICAgICAgICAgMHgwMDAwMzMwMAogIyAgICBkZWZpbmUgUjMwMF9FQl9VTksxX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDI0CiAjICAgIGRlZmluZSBSMzAwX0VCX1VOSzEgICAgICAgICAgICAgICAgICAgICgweDgwPDwyNCkKICMgICAgZGVmaW5lIFIzMDBfRUJfVU5LMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgxMAorI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19WQlVGXzIgICAgICAgICAweDAwMDAzNDAwCiAjZGVmaW5lIFIzMDBfUEFDS0VUM18zRF9EUkFXX0lORFhfMiAgICAgICAgIDB4MDAwMDM2MDAKIAotLy9FTkQKKy8qIEVORDogUGFja2V0IDMgY29tbWFuZHMgKi8KIAotI2VuZGlmCQkJCS8qIF9SMzAwX1JFR19IICovCisKKy8qIENvbG9yIGZvcm1hdHMgZm9yIDJkIHBhY2tldHMKKyAqLworI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9DSTgJMgorI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9BUkdCMTU1NQkzCisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX1JHQjU2NQk0CisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX0FSR0I4ODg4CTYKKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfUkdCMzMyCTcKKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfUkdCOAk5CisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX0FSR0I0NDQ0CTE1CisKKy8qCisgKiBDUCB0eXBlLTMgcGFja2V0cworICovCisjZGVmaW5lIFIzMDBfQ1BfQ01EX0JJVEJMVF9NVUxUSQkweEMwMDA5QjAwCisKKyNlbmRpZiAvKiBfUjMwMF9SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKaW5kZXggNjgzMzgzODkuLmFmNTc5MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjZGVmaW5lIFJBREVPTl9GSUZPX0RFQlVHCTAKIAotc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9jcChkcm1fZGV2aWNlX3QgKiBkZXYpOworc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9jcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKIC8qIENQIG1pY3JvY29kZSAoZnJvbSBBVEkpICovCiBzdGF0aWMgY29uc3QgdTMyIFIyMDBfY3BfbWljcm9jb2RlW11bMl0gPSB7CkBAIC04MTYsNyArODE2LDcgQEAKIAl7MDAwMDAwMDAwMCwgMDAwMDAwMDAwMH0sCiB9OwogCi1zdGF0aWMgaW50IFJBREVPTl9SRUFEX1BMTChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBhZGRyKQorc3RhdGljIGludCBSQURFT05fUkVBRF9QTEwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBhZGRyKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEwNjYsNyArMTA2Niw3IEBACiAKIC8qIFJlc2V0IHRoZSBlbmdpbmUuICBUaGlzIHdpbGwgc3RvcCB0aGUgQ1AgaWYgaXQgaXMgcnVubmluZy4KICAqLwotc3RhdGljIGludCByYWRlb25fZG9fZW5naW5lX3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2VuZ2luZV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBjbG9ja19jbnRsX2luZGV4LCBtY2xrX2NudGwsIHJiYm1fc29mdF9yZXNldDsKQEAgLTExMjIsNyArMTEyMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9pbml0X3JpbmdfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgICBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2KQogewogCXUzMiByaW5nX3N0YXJ0LCBjdXJfcmVhZF9wdHI7CkBAIC0xMTc0LDcgKzExNzQsNyBAQAogCX0gZWxzZQogI2VuZGlmCiAJewotCQlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKKwkJc3RydWN0IGRybV9zZ19tZW0gKmVudHJ5ID0gZGV2LT5zZzsKIAkJdW5zaWduZWQgbG9uZyB0bXBfb2ZzLCBwYWdlX29mczsKIAogCQl0bXBfb2ZzID0gZGV2X3ByaXYtPnJpbmdfcnB0ci0+b2Zmc2V0IC0KQEAgLTEzODQsNyArMTM4NCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X2NwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3JhZGVvbl9pbml0X3QgKiBpbml0KQorc3RhdGljIGludCByYWRlb25fZG9faW5pdF9jcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3JhZGVvbl9pbml0X3QgKiBpbml0KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTE0MjAsNiArMTQyMCwxMCBAQAogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAorCS8qIEVuYWJsZSB2Ymxhbmsgb24gQ1JUQzEgZm9yIG9sZGVyIFggc2VydmVycworCSAqLworCWRldl9wcml2LT52YmxhbmtfY3J0YyA9IERSTV9SQURFT05fVkJMQU5LX0NSVEMxOworCiAJc3dpdGNoKGluaXQtPmZ1bmMpIHsKIAljYXNlIFJBREVPTl9JTklUX1IyMDBfQ1A6CiAJCWRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9IFVDT0RFX1IyMDA7CkBAIC0xNTAxLDEzICsxNTA1LDEzIEBACiAJCQkJCSBSQURFT05fUk9VTkRfTU9ERV9UUlVOQyB8CiAJCQkJCSBSQURFT05fUk9VTkRfUFJFQ184VEhfUElYKTsKIAotCURSTV9HRVRTQVJFQSgpOwogCiAJZGV2X3ByaXYtPnJpbmdfb2Zmc2V0ID0gaW5pdC0+cmluZ19vZmZzZXQ7CiAJZGV2X3ByaXYtPnJpbmdfcnB0cl9vZmZzZXQgPSBpbml0LT5yaW5nX3JwdHJfb2Zmc2V0OwogCWRldl9wcml2LT5idWZmZXJzX29mZnNldCA9IGluaXQtPmJ1ZmZlcnNfb2Zmc2V0OwogCWRldl9wcml2LT5nYXJ0X3RleHR1cmVzX29mZnNldCA9IGluaXQtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0OwogCisJZGV2X3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7CiAJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOwogCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOwpAQCAtMTczMSw3ICsxNzM1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9jcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHJhZGVvbl9kb19jbGVhbnVwX2NwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJRFJNX0RFQlVHKCJcbiIpOwpAQCAtMTc4Nyw3ICsxNzkxLDcgQEAKICAqCiAgKiBDaGFybCBQLiBCb3RoYSA8aHR0cDovL2NwYm90aGEubmV0PgogICovCi1zdGF0aWMgaW50IHJhZGVvbl9kb19yZXN1bWVfY3AoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByYWRlb25fZG9fcmVzdW1lX2NwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTE5MTQsNyArMTkxOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcmFkZW9uX2RvX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByYWRlb25fZG9fcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpLCByZXQ7CkBAIC0yMDQyLDEyICsyMDQ2LDEyIEBACiAgKiB0aGV5IGNhbid0IGdldCB0aGUgbG9jay4KICAqLwogCi1kcm1fYnVmX3QgKnJhZGVvbl9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RydWN0IGRybV9idWYgKnJhZGVvbl9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlpbnQgaSwgdDsKIAlpbnQgc3RhcnQ7CiAKQEAgLTIwODIsMTIgKzIwODYsMTIgQEAKIH0KIAogI2lmIDAKLWRybV9idWZfdCAqcmFkZW9uX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdHJ1Y3QgZHJtX2J1ZiAqcmFkZW9uX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdjsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBpLCB0OwogCWludCBzdGFydDsKIAl1MzIgZG9uZV9hZ2UgPSBEUk1fUkVBRDMyKGRldl9wcml2LT5yaW5nX3JwdHIsIFJBREVPTl9TQ1JBVENIT0ZGKDEpKTsKQEAgLTIxMTYsMTUgKzIxMjAsMTUgQEAKIH0KICNlbmRpZgogCi12b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CiAKIAlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAkJYnVmX3ByaXYtPmFnZSA9IDA7CiAJfQpAQCAtMjE2NiwxMSArMjE3MCwxMSBAQAogCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKIH0KIAotc3RhdGljIGludCByYWRlb25fY3BfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJIGRybV9kbWFfdCAqIGQpCitzdGF0aWMgaW50IHJhZGVvbl9jcF9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSBzdHJ1Y3QgZHJtX2RtYSAqIGQpCiB7CiAJaW50IGk7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAogCWZvciAoaSA9IGQtPmdyYW50ZWRfY291bnQ7IGkgPCBkLT5yZXF1ZXN0X2NvdW50OyBpKyspIHsKIAkJYnVmID0gcmFkZW9uX2ZyZWVsaXN0X2dldChkZXYpOwpAQCAtMjE5NCwxMCArMjE5OCwxMCBAQAogaW50IHJhZGVvbl9jcF9idWZmZXJzKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgcmV0ID0gMDsKLQlkcm1fZG1hX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKLQlkcm1fZG1hX3QgZDsKKwlzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCXN0cnVjdCBkcm1fZG1hIGQ7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaAppbmRleCA2NmM0YjZmLi41YThlMjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaApAQCAtNDE3LDcgKzQxNyw3IEBACiAKIAkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCiAJICovCi0JZHJtX2NsaXBfcmVjdF90IGJveGVzW1JBREVPTl9OUl9TQVJFQV9DTElQUkVDVFNdOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW1JBREVPTl9OUl9TQVJFQV9DTElQUkVDVFNdOwogCXVuc2lnbmVkIGludCBuYm94OwogCiAJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCkBAIC00MjYsNyArNDI2LDcgQEAKIAl1bnNpZ25lZCBpbnQgbGFzdF9kaXNwYXRjaDsKIAl1bnNpZ25lZCBpbnQgbGFzdF9jbGVhcjsKIAotCWRybV90ZXhfcmVnaW9uX3QgdGV4X2xpc3RbUkFERU9OX05SX1RFWF9IRUFQU11bUkFERU9OX05SX1RFWF9SRUdJT05TICsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4X2xpc3RbUkFERU9OX05SX1RFWF9IRUFQU11bUkFERU9OX05SX1RFWF9SRUdJT05TICsKIAkJCQkJCSAgICAgICAxXTsKIAl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSQURFT05fTlJfVEVYX0hFQVBTXTsKIAlpbnQgY3R4X293bmVyOwpAQCAtNjA0LDcgKzYwNCw3IEBACiAJaW50IGJ1ZnN6OwogCWNoYXIgX191c2VyICpidWY7CiAJaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpib3hlczsKIH0gZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdGV4X2ltYWdlIHsKQEAgLTY1NSw2ICs2NTUsNyBAQAogI2RlZmluZSBSQURFT05fUEFSQU1fR0FSVF9URVhfSEFORExFICAgICAgIDEwCiAjZGVmaW5lIFJBREVPTl9QQVJBTV9TQ1JBVENIX09GRlNFVCAgICAgICAgMTEKICNkZWZpbmUgUkFERU9OX1BBUkFNX0NBUkRfVFlQRSAgICAgICAgICAgICAxMgorI2RlZmluZSBSQURFT05fUEFSQU1fVkJMQU5LX0NSVEMgICAgICAgICAgIDEzICAgLyogVkJMQU5LIENSVEMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9nZXRwYXJhbSB7CiAJaW50IHBhcmFtOwpAQCAtNzA4LDcgKzcwOSw3IEBACiAjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9QQ0lHQVJUX0xPQ0FUSU9OIDMJLyogUENJIEdhcnQgTG9jYXRpb24gKi8KICNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX05FV19NRU1NQVAgNAkJLyogVXNlIG5ldyBtZW1vcnkgbWFwICovCiAjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9QQ0lHQVJUX1RBQkxFX1NJWkUgNSAgICAvKiBQQ0kgR0FSVCBUYWJsZSBTaXplICovCi0KKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1ZCTEFOS19DUlRDIDYgICAgICAgICAgIC8qIFZCTEFOSyBDUlRDICovCiAvKiAxLjE0OiBDbGllbnRzIGNhbiBhbGxvY2F0ZS9mcmVlIGEgc3VyZmFjZQogICovCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2MgewpAQCAtNzIxLDQgKzcyMiw3IEBACiAJdW5zaWduZWQgaW50IGFkZHJlc3M7CiB9IGRybV9yYWRlb25fc3VyZmFjZV9mcmVlX3Q7CiAKKyNkZWZpbmUJRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEgCTEKKyNkZWZpbmUJRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIgCTIKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCmluZGV4IDJlYjY1MmUuLjM0OWFjM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCkBAIC02MCw3ICs2MCw3IEBACiAJLmRyaXZlcl9mZWF0dXJlcyA9CiAJICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX1BDSV9ETUEgfCBEUklWRVJfU0cgfAogCSAgICBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSVJRX1NIQVJFRCB8Ci0JICAgIERSSVZFUl9JUlFfVkJMLAorCSAgICBEUklWRVJfSVJRX1ZCTCB8IERSSVZFUl9JUlFfVkJMMiwKIAkuZGV2X3ByaXZfc2l6ZSA9IHNpemVvZihkcm1fcmFkZW9uX2J1Zl9wcml2X3QpLAogCS5sb2FkID0gcmFkZW9uX2RyaXZlcl9sb2FkLAogCS5maXJzdG9wZW4gPSByYWRlb25fZHJpdmVyX2ZpcnN0b3BlbiwKQEAgLTcwLDYgKzcwLDcgQEAKIAkubGFzdGNsb3NlID0gcmFkZW9uX2RyaXZlcl9sYXN0Y2xvc2UsCiAJLnVubG9hZCA9IHJhZGVvbl9kcml2ZXJfdW5sb2FkLAogCS52Ymxhbmtfd2FpdCA9IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQsCisJLnZibGFua193YWl0MiA9IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQyLAogCS5kcmlfbGlicmFyeV9uYW1lID0gZHJpX2xpYnJhcnlfbmFtZSwKIAkuaXJxX3ByZWluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsLAogCS5pcnFfcG9zdGluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKaW5kZXggNTRmNDllZi4uM2IzZDkzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKQEAgLTk3LDkgKzk3LDEwIEBACiAgKiAgICAgICBuZXcgcGFja2V0IHR5cGUpCiAgKiAxLjI2LSBBZGQgc3VwcG9ydCBmb3IgdmFyaWFibGUgc2l6ZSBQQ0koRSkgZ2FydCBhcGVydHVyZQogICogMS4yNy0gQWRkIHN1cHBvcnQgZm9yIElHUCBHQVJUCisgKiAxLjI4LSBBZGQgc3VwcG9ydCBmb3IgVkJMIG9uIENSVEMyCiAgKi8KICNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCi0jZGVmaW5lIERSSVZFUl9NSU5PUgkJMjcKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkyOAogI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCiAKIC8qCkBAIC0xNTQsNyArMTU1LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9mcmVlbGlzdCB7CiAJdW5zaWduZWQgaW50IGFnZTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCXN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0ICpuZXh0OwogCXN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0ICpwcmV2OwogfSBkcm1fcmFkZW9uX2ZyZWVsaXN0X3Q7CkBAIC0yNzcsMTMgKzI3OCwxNiBAQAogCS8qIFNXIGludGVycnVwdCAqLwogCXdhaXRfcXVldWVfaGVhZF90IHN3aV9xdWV1ZTsKIAlhdG9taWNfdCBzd2lfZW1pdHRlZDsKKwlpbnQgdmJsYW5rX2NydGM7CisJdWludDMyX3QgaXJxX2VuYWJsZV9yZWc7CisJaW50IGlycV9lbmFibGVkOwogCiAJc3RydWN0IHJhZGVvbl9zdXJmYWNlIHN1cmZhY2VzW1JBREVPTl9NQVhfU1VSRkFDRVNdOwogCXN0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlIHZpcnRfc3VyZmFjZXNbMiAqIFJBREVPTl9NQVhfU1VSRkFDRVNdOwogCiAJdW5zaWduZWQgbG9uZyBwY2lnYXJ0X29mZnNldDsKIAl1bnNpZ25lZCBpbnQgcGNpZ2FydF9vZmZzZXRfc2V0OwotCWRybV9hdGlfcGNpZ2FydF9pbmZvIGdhcnRfaW5mbzsKKwlzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gZ2FydF9pbmZvOwogCiAJdTMyIHNjcmF0Y2hfYWdlc1s1XTsKIApAQCAtMjk5LDcgKzMwMyw3IEBACiAJaW50IGJ1ZnN6OwogCWNoYXIgKmJ1ZjsKIAlpbnQgbmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmJveGVzOwogfSBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3Q7CiAKIGV4dGVybiBpbnQgcmFkZW9uX25vX3diOwpAQCAtMzMyLDggKzMzNiw4IEBACiBleHRlcm4gaW50IHJhZGVvbl9mdWxsc2NyZWVuKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgcmFkZW9uX2NwX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpOwogCi1leHRlcm4gdm9pZCByYWRlb25fZnJlZWxpc3RfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBkcm1fYnVmX3QgKnJhZGVvbl9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gc3RydWN0IGRybV9idWYgKnJhZGVvbl9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBleHRlcm4gaW50IHJhZGVvbl93YWl0X3JpbmcoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IG4pOwogCkBAIC0zNTMsMjkgKzM1NywzMyBAQAogZXh0ZXJuIGludCByYWRlb25faXJxX2VtaXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCByYWRlb25faXJxX3dhaXQoRFJNX0lPQ1RMX0FSR1MpOwogCi1leHRlcm4gdm9pZCByYWRlb25fZG9fcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiB2b2lkIHJhZGVvbl9kb19yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX3ZibGFua193YWl0MihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIGV4dGVybiBpcnFyZXR1cm5fdCByYWRlb25fZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IHJhZGVvbl92YmxhbmtfY3J0Y19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHJhZGVvbl92YmxhbmtfY3J0Y19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50NjRfdCB2YWx1ZSk7CiAKIGV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9maXJzdG9wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfcG9zdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHApOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9vcGVuKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX29wZW4oc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdik7CiBleHRlcm4gbG9uZyByYWRlb25fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKIAogLyogcjMwMF9jbWRidWYuYyAqLwogZXh0ZXJuIHZvaWQgcjMwMF9pbml0X3JlZ19mbGFncyh2b2lkKTsKIAotZXh0ZXJuIGludCByMzAwX2RvX2NwX2NtZGJ1Zihkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCwKLQkJCSAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKK2V4dGVybiBpbnQgcjMwMF9kb19jcF9jbWRidWYoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCwKKwkJCSAgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYpOwogCiAvKiBGbGFncyBmb3Igc3RhdHMuYm94ZXMKQEAgLTQ5NiwxMiArNTA0LDE1IEBACiAKICNkZWZpbmUgUkFERU9OX0dFTl9JTlRfQ05UTAkJMHgwMDQwCiAjCWRlZmluZSBSQURFT05fQ1JUQ19WQkxBTktfTUFTSwkJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9DUlRDMl9WQkxBTktfTUFTSwkJKDEgPDwgOSkKICMJZGVmaW5lIFJBREVPTl9HVUlfSURMRV9JTlRfRU5BQkxFCSgxIDw8IDE5KQogIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9FTkFCTEUJCSgxIDw8IDI1KQogCiAjZGVmaW5lIFJBREVPTl9HRU5fSU5UX1NUQVRVUwkJMHgwMDQ0CiAjCWRlZmluZSBSQURFT05fQ1JUQ19WQkxBTktfU1RBVAkJKDEgPDwgMCkKICMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUX0FDSyAgIAkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUCQkoMSA8PCA5KQorIwlkZWZpbmUgUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUX0FDSyAgIAkoMSA8PCA5KQogIwlkZWZpbmUgUkFERU9OX0dVSV9JRExFX0lOVF9URVNUX0FDSyAgICAgKDEgPDwgMTkpCiAjCWRlZmluZSBSQURFT05fU1dfSU5UX1RFU1QJCSgxIDw8IDI1KQogIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9URVNUX0FDSyAgIAkoMSA8PCAyNSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMKaW5kZXggM2ZmMGJhYS4uYWQ4YTBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAogaXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgc3RhdDsKQEAgLTczLDE4ICs3MywzNSBAQAogCSAqIG91dHNpZGUgdGhlIERSTQogCSAqLwogCXN0YXQgPSByYWRlb25fYWNrbm93bGVkZ2VfaXJxcyhkZXZfcHJpdiwgKFJBREVPTl9TV19JTlRfVEVTVF9BQ0sgfAotCQkJCQkJICBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkpOworCQkJCQkJICBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCB8CisJCQkJCQkgIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkpOwogCWlmICghc3RhdCkKIAkJcmV0dXJuIElSUV9OT05FOwogCisJc3RhdCAmPSBkZXZfcHJpdi0+aXJxX2VuYWJsZV9yZWc7CisKIAkvKiBTVyBpbnRlcnJ1cHQgKi8KIAlpZiAoc3RhdCAmIFJBREVPTl9TV19JTlRfVEVTVCkgewogCQlEUk1fV0FLRVVQKCZkZXZfcHJpdi0+c3dpX3F1ZXVlKTsKIAl9CiAKIAkvKiBWQkxBTksgaW50ZXJydXB0ICovCi0JaWYgKHN0YXQgJiBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkgewotCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJaWYgKHN0YXQgJiAoUkFERU9OX0NSVENfVkJMQU5LX1NUQVR8UkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUKSkgeworCQlpbnQgdmJsYW5rX2NydGMgPSBkZXZfcHJpdi0+dmJsYW5rX2NydGM7CisKKwkJaWYgKCh2YmxhbmtfY3J0YyAmCisJCSAgICAgKERSTV9SQURFT05fVkJMQU5LX0NSVEMxIHwgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIpKSA9PQorCQkgICAgKERSTV9SQURFT05fVkJMQU5LX0NSVEMxIHwgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIpKSB7CisJCQlpZiAoc3RhdCAmIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKQorCQkJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwkJCWlmIChzdGF0ICYgUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUKQorCQkJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkMik7CisJCX0gZWxzZSBpZiAoKChzdGF0ICYgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpICYmCisJCQkgICAodmJsYW5rX2NydGMgJiBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSkpIHx8CisJCQkgICAoKHN0YXQgJiBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQpICYmCisJCQkgICAgKHZibGFua19jcnRjICYgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIpKSkKKwkJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwogCQlEUk1fV0FLRVVQKCZkZXYtPnZibF9xdWV1ZSk7CiAJCWRybV92Ymxfc2VuZF9zaWduYWxzKGRldik7CiAJfQpAQCAtOTIsNyArMTA5LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgaW50IHJldDsKQEAgLTExMCw3ICsxMjcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IHN3aV9ucikKK3N0YXRpYyBpbnQgcmFkZW9uX3dhaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgc3dpX25yKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTI3LDE5ICsxNDQsMzAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgcmFkZW9uX2RyaXZlcl92YmxhbmtfZG9fd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSwKKwkJCQkgaW50IGNydGMpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0KIAkgICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CiAJaW50IHJldCA9IDA7Ci0KKwlpbnQgYWNrID0gMDsKKwlhdG9taWNfdCAqY291bnRlcjsKIAlpZiAoIWRldl9wcml2KSB7CiAJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0JcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYsIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKTsKKwlpZiAoY3J0YyA9PSBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSkgeworCQljb3VudGVyID0gJmRldi0+dmJsX3JlY2VpdmVkOworCQlhY2sgfD0gUkFERU9OX0NSVENfVkJMQU5LX1NUQVQ7CisJfSBlbHNlIGlmIChjcnRjID09IERSTV9SQURFT05fVkJMQU5LX0NSVEMyKSB7CisJCWNvdW50ZXIgPSAmZGV2LT52YmxfcmVjZWl2ZWQyOworCQlhY2sgfD0gUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUOworCX0gZWxzZQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYsIGFjayk7CiAKIAlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CiAKQEAgLTE0OCw3ICsxNzYsNyBAQAogCSAqIHVzaW5nIHZlcnRpY2FsIGJsYW5rcy4uLgogCSAqLwogCURSTV9XQUlUX09OKHJldCwgZGV2LT52YmxfcXVldWUsIDMgKiBEUk1fSFosCi0JCSAgICAoKChjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKSkKKwkJICAgICgoKGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZChjb3VudGVyKSkKIAkJICAgICAgLSAqc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkpOwogCiAJKnNlcXVlbmNlID0gY3VyX3ZibGFuazsKQEAgLTE1Niw2ICsxODQsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCXJldHVybiByYWRlb25fZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsIERSTV9SQURFT05fVkJMQU5LX0NSVEMxKTsKK30KKworaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJcmV0dXJuIHJhZGVvbl9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoZGV2LCBzZXF1ZW5jZSwgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIpOworfQorCiAvKiBOZWVkcyB0aGUgbG9jayBhcyBpdCB0b3VjaGVzIHRoZSByaW5nLgogICovCiBpbnQgcmFkZW9uX2lycV9lbWl0KERSTV9JT0NUTF9BUkdTKQpAQCAtMjA0LDkgKzI0MiwyNCBAQAogCXJldHVybiByYWRlb25fd2FpdF9pcnEoZGV2LCBpcnF3YWl0LmlycV9zZXEpOwogfQogCitzdGF0aWMgdm9pZCByYWRlb25fZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJZGV2X3ByaXYtPmlycV9lbmFibGVfcmVnID0gUkFERU9OX1NXX0lOVF9FTkFCTEU7CisJaWYgKGRldl9wcml2LT52YmxhbmtfY3J0YyAmIERSTV9SQURFT05fVkJMQU5LX0NSVEMxKQorCQlkZXZfcHJpdi0+aXJxX2VuYWJsZV9yZWcgfD0gUkFERU9OX0NSVENfVkJMQU5LX01BU0s7CisKKwlpZiAoZGV2X3ByaXYtPnZibGFua19jcnRjICYgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIpCisJCWRldl9wcml2LT5pcnFfZW5hYmxlX3JlZyB8PSBSQURFT05fQ1JUQzJfVkJMQU5LX01BU0s7CisKKwlSQURFT05fV1JJVEUoUkFERU9OX0dFTl9JTlRfQ05UTCwgZGV2X3ByaXYtPmlycV9lbmFibGVfcmVnKTsKKwlkZXZfcHJpdi0+aXJxX2VuYWJsZWQgPSAxOworfQorCiAvKiBkcm1fZG1hLmggaG9va3MKICovCi12b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjE2LDEwICsyNjksMTEgQEAKIAogCS8qIENsZWFyIGJpdHMgaWYgdGhleSdyZSBhbHJlYWR5IGhpZ2ggKi8KIAlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyhkZXZfcHJpdiwgKFJBREVPTl9TV19JTlRfVEVTVF9BQ0sgfAotCQkJCQkgICBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkpOworCQkJCQkgICBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCB8CisJCQkJCSAgIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkpOwogfQogCi12b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0KIAkgICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yMjcsMTggKzI4MSw0OCBAQAogCWF0b21pY19zZXQoJmRldl9wcml2LT5zd2lfZW1pdHRlZCwgMCk7CiAJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+c3dpX3F1ZXVlKTsKIAotCS8qIFR1cm4gb24gU1cgYW5kIFZCTCBpbnRzICovCi0JUkFERU9OX1dSSVRFKFJBREVPTl9HRU5fSU5UX0NOVEwsCi0JCSAgICAgUkFERU9OX0NSVENfVkJMQU5LX01BU0sgfCBSQURFT05fU1dfSU5UX0VOQUJMRSk7CisJcmFkZW9uX2VuYWJsZV9pbnRlcnJ1cHQoZGV2KTsKIH0KIAotdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0KIAkgICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaWYgKCFkZXZfcHJpdikKIAkJcmV0dXJuOwogCisJZGV2X3ByaXYtPmlycV9lbmFibGVkID0gMDsKKwogCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLwogCVJBREVPTl9XUklURShSQURFT05fR0VOX0lOVF9DTlRMLCAwKTsKIH0KKworCitpbnQgcmFkZW9uX3ZibGFua19jcnRjX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBmbGFnOworCXUzMiB2YWx1ZTsKKworCWZsYWcgPSBSQURFT05fUkVBRChSQURFT05fR0VOX0lOVF9DTlRMKTsKKwl2YWx1ZSA9IDA7CisKKwlpZiAoZmxhZyAmIFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLKQorCQl2YWx1ZSB8PSBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMTsKKworCWlmIChmbGFnICYgUkFERU9OX0NSVEMyX1ZCTEFOS19NQVNLKQorCQl2YWx1ZSB8PSBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMjsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK2ludCByYWRlb25fdmJsYW5rX2NydGNfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludDY0X3QgdmFsdWUpCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKHZhbHVlICYgfihEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSB8IERSTV9SQURFT05fVkJMQU5LX0NSVEMyKSkgeworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIGludmFsaWQgY3J0YyAweCV4XG4iLCAodW5zaWduZWQgaW50KXZhbHVlKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2X3ByaXYtPnZibGFua19jcnRjID0gKHVuc2lnbmVkIGludCl2YWx1ZTsKKwlyYWRlb25fZW5hYmxlX2ludGVycnVwdChkZXYpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKaW5kZXggOThjNWYxZC4uM2RkZjg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCkBAIC0zOSw3ICszOSw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqCiAJCQkJCQkgICAgZGV2X3ByaXYsCi0JCQkJCQkgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkJCQkgICAgdTMyICpvZmZzZXQpCiB7CiAJdTY0IG9mZiA9ICpvZmZzZXQ7CkBAIC05MCw3ICs5MCw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldHMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgogCQkJCQkJICAgICBkZXZfcHJpdiwKLQkJCQkJCSAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJCQkJICAgICBpbnQgaWQsIHUzMiAqZGF0YSkKIHsKIAlzd2l0Y2ggKGlkKSB7CkBAIC0yNjQsNyArMjY0LDcgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0Myhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqCiAJCQkJCQkgICAgIGRldl9wcml2LAotCQkJCQkJICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2LAogCQkJCQkJICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKgogCQkJCQkJICAgICBjbWRidWYsCiAJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqY21kc3opCkBAIC00MjEsNyArNDIxLDcgQEAKICAqLwogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJhZGVvbl9lbWl0X2NsaXBfcmVjdChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCQkgICAgIGRybV9jbGlwX3JlY3RfdCAqIGJveCkKKwkJCQkJICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIGJveCkKIHsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtNDM5LDcgKzQzOSw3IEBACiAvKiBFbWl0IDEuMSBzdGF0ZQogICovCiBzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3N0YXRlKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCSAgICAgZHJtX3JhZGVvbl9jb250ZXh0X3JlZ3NfdCAqIGN0eCwKIAkJCSAgICAgZHJtX3JhZGVvbl90ZXh0dXJlX3JlZ3NfdCAqIHRleCwKIAkJCSAgICAgdW5zaWduZWQgaW50IGRpcnR5KQpAQCAtNjA4LDcgKzYwOCw3IEBACiAvKiBFbWl0IDEuMiBzdGF0ZQogICovCiBzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3N0YXRlMihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCSAgICAgIGRybV9yYWRlb25fc3RhdGVfdCAqIHN0YXRlKQogewogCVJJTkdfTE9DQUxTOwpAQCAtODQ0LDcgKzg0NCw3IEBACiAgKiBDUCBjb21tYW5kIGRpc3BhdGNoIGZ1bmN0aW9ucwogICovCiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICBkcm1fcmFkZW9uX2NsZWFyX3QgKiBjbGVhciwKIAkJCQkgICAgIGRybV9yYWRlb25fY2xlYXJfcmVjdF90ICogZGVwdGhfYm94ZXMpCiB7CkBAIC04NTIsNyArODUyLDcgQEAKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3QgKmRlcHRoX2NsZWFyID0gJmRldl9wcml2LT5kZXB0aF9jbGVhcjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjbGVhci0+ZmxhZ3M7CiAJdTMyIHJiM2RfY250bCA9IDAsIHJiM2Rfc3RlbmNpbHJlZm1hc2sgPSAwOwogCWludCBpOwpAQCAtMTMzNSwxMiArMTMzNSwxMiBAQAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTE0MTIsMTAgKzE0MTIsMTAgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fc2FyZWFfdCAqc2FyZWEgPSAoZHJtX3NhcmVhX3QgKikgZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGU7CisJc3RydWN0IGRybV9zYXJlYSAqc2FyZWEgPSAoc3RydWN0IGRybV9zYXJlYSAqKSBkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZTsKIAlpbnQgb2Zmc2V0ID0gKGRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID09IDEpCiAJICAgID8gZGV2X3ByaXYtPmZyb250X29mZnNldCA6IGRldl9wcml2LT5iYWNrX29mZnNldDsKIAlSSU5HX0xPQ0FMUzsKQEAgLTE0OTEsOCArMTQ5MSw4IEBACiAJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKIH0gZHJtX3JhZGVvbl90Y2xfcHJpbV90OwogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgICBkcm1fYnVmX3QgKiBidWYsCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkcm1fYnVmICogYnVmLAogCQkJCSAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqIHByaW0pCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE1MzcsNyArMTUzNyw3IEBACiAJfSB3aGlsZSAoaSA8IG5ib3gpOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CkBAIC0xNTU0LDggKzE1NTQsOCBAQAogCWJ1Zi0+dXNlZCA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJCWRybV9idWZfdCAqIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCQlzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC0xNTg4LDggKzE1ODgsOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgICAgICBkcm1fYnVmX3QgKiBlbHRfYnVmLAorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fYnVmICogZWx0X2J1ZiwKIAkJCQkgICAgICAgZHJtX3JhZGVvbl90Y2xfcHJpbV90ICogcHJpbSkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTY0NywxMyArMTY0NywxMyBAQAogI2RlZmluZSBSQURFT05fTUFYX1RFWFRVUkVfU0laRSBSQURFT05fQlVGRkVSX1NJWkUKIAogc3RhdGljIGludCByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZShEUk1GSUxFIGZpbHAsCi0JCQkJICAgICAgZHJtX2RldmljZV90ICogZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgIGRybV9yYWRlb25fdGV4dHVyZV90ICogdGV4LAogCQkJCSAgICAgIGRybV9yYWRlb25fdGV4X2ltYWdlX3QgKiBpbWFnZSkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCXUzMiBmb3JtYXQ7CiAJdTMyICpidWZmZXI7CiAJY29uc3QgdTggX191c2VyICpkYXRhOwpAQCAtMTg4MSw3ICsxODgxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoZHJtX2RldmljZV90ICogZGV2LCB1MzIgKiBzdGlwcGxlKQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHUzMiAqIHN0aXBwbGUpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKQEAgLTIxMzQsNyArMjEzNCw3IEBACiAKIC8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CiAgKi8KLXN0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByYWRlb25fZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMjIwNiwxMCArMjIwNiwxMCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25fdmVydGV4X3QgdmVydGV4OwogCWRybV9yYWRlb25fdGNsX3ByaW1fdCBwcmltOwogCkBAIC0yMjg5LDEwICsyMjg5LDEwIEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdjsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3JhZGVvbl9pbmRpY2VzX3QgZWx0czsKIAlkcm1fcmFkZW9uX3RjbF9wcmltX3QgcHJpbTsKIAlpbnQgY291bnQ7CkBAIC0yNDM4LDggKzI0MzgsOCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3JhZGVvbl9pbmRpcmVjdF90IGluZGlyZWN0OwogCVJJTkdfTE9DQUxTOwogCkBAIC0yNTA3LDEwICsyNTA3LDEwIEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdjsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgdmVydGV4OwogCWludCBpOwogCXVuc2lnbmVkIGNoYXIgbGFzdHN0YXRlOwpAQCAtMjYwMyw3ICsyNjAzLDcgQEAKIH0KIAogc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXRzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkgICAgICAgZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAogCQkJICAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQogewpAQCAtMjcyOCw4ICsyNzI4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCSAgICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCSAgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjc1NCwxNiArMjc1NCwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3QoZHJtX2RldmljZV90ICpkZXYsCi0JCQkJCWRybV9maWxlX3QgKmZpbHBfcHJpdiwKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0M19jbGlwcmVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdiwKIAkJCQkJZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYsCiAJCQkJCWludCBvcmlnX25ib3gpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgYm94OworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveDsKIAl1bnNpZ25lZCBpbnQgY21kc3o7CiAJaW50IHJldDsKLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlcyA9IGNtZGJ1Zi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpib3hlcyA9IGNtZGJ1Zi0+Ym94ZXM7CiAJaW50IGkgPSAwOwogCVJJTkdfTE9DQUxTOwogCkBAIC0yODE2LDcgKzI4MTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9lbWl0X3dhaXQoZHJtX2RldmljZV90ICogZGV2LCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBmbGFncykKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMjg0OSw5ICsyODQ5LDkgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqZmlscF9wcml2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWYgPSBOVUxMOwogCWludCBpZHg7CiAJZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90IGNtZGJ1ZjsKIAlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXI7CkBAIC0zMDg1LDYgKzMwODUsOSBAQAogCQllbHNlCiAJCQl2YWx1ZSA9IFJBREVPTl9DQVJEX1BDSTsKIAkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fVkJMQU5LX0NSVEM6CisJCXZhbHVlID0gcmFkZW9uX3ZibGFua19jcnRjX2dldChkZXYpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fREVCVUcoIkludmFsaWQgcGFyYW1ldGVyICVkXG4iLCBwYXJhbS5wYXJhbSk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CkBAIC0zMTAyLDcgKzMxMDUsNyBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CiAJZHJtX3JhZGVvbl9zZXRwYXJhbV90IHNwOwogCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CiAKQEAgLTMxNDEsNiArMzE0NCw5IEBACiAJCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnRhYmxlX3NpemUgPCBSQURFT05fUENJR0FSVF9UQUJMRV9TSVpFKQogCQkJZGV2X3ByaXYtPmdhcnRfaW5mby50YWJsZV9zaXplID0gUkFERU9OX1BDSUdBUlRfVEFCTEVfU0laRTsKIAkJYnJlYWs7CisJY2FzZSBSQURFT05fU0VUUEFSQU1fVkJMQU5LX0NSVEM6CisJCXJldHVybiByYWRlb25fdmJsYW5rX2NydGNfc2V0KGRldiwgc3AudmFsdWUpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fREVCVUcoIkludmFsaWQgcGFyYW1ldGVyICVkXG4iLCBzcC5wYXJhbSk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CkBAIC0zMTU2LDcgKzMxNjIsNyBAQAogICoKICAqIERSTSBpbmZyYXN0cnVjdHVyZSB0YWtlcyBjYXJlIG9mIHJlY2xhaW1pbmcgZG1hIGJ1ZmZlcnMuCiAgKi8KLXZvaWQgcmFkZW9uX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgcmFkZW9uX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMxNjcsNyArMzE3Myw3IEBACiAJfQogfQogCi12b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzE4MCw3ICszMTg2LDcgQEAKIAlyYWRlb25fZG9fcmVsZWFzZShkZXYpOwogfQogCi1pbnQgcmFkZW9uX2RyaXZlcl9vcGVuKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdikKK2ludCByYWRlb25fZHJpdmVyX29wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2OwpAQCAtMzIwMiw3ICszMjA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByYWRlb25fZHJpdmVyX3Bvc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfcG9zdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2KQogewogCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXYgPQogCSAgICBmaWxwX3ByaXYtPmRyaXZlcl9wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYwppbmRleCBiOTRmYWI1Li4xOGM3MjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYwpAQCAtMzIsNyArMzIsNyBAQAogI2RlZmluZSBTQVZBR0VfRVZFTlRfVVNFQ19USU1FT1VUCTUwMDAwMDAJLyogNXMgKi8KICNkZWZpbmUgU0FWQUdFX0ZSRUVMSVNUX0RFQlVHCQkwCiAKLXN0YXRpYyBpbnQgc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRybV9kZXZpY2VfdCAqZGV2KTsKK3N0YXRpYyBpbnQgc2F2YWdlX2RvX2NsZWFudXBfYmNpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgaW50CiBzYXZhZ2VfYmNpX3dhaXRfZmlmb19zaGFkb3coZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdW5zaWduZWQgaW50IG4pCkBAIC0yMDMsMTEgKzIwMywxMSBAQAogLyoKICAqIEZyZWVsaXN0IG1hbmFnZW1lbnQKICAqLwotc3RhdGljIGludCBzYXZhZ2VfZnJlZWxpc3RfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHNhdmFnZV9mcmVlbGlzdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqZW50cnk7CiAJaW50IGk7CiAJRFJNX0RFQlVHKCJjb3VudD0lZFxuIiwgZG1hLT5idWZfY291bnQpOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBkcm1fYnVmX3QgKnNhdmFnZV9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHN0cnVjdCBkcm1fYnVmICpzYXZhZ2VfZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3NhdmFnZV9idWZfcHJpdl90ICp0YWlsID0gZGV2X3ByaXYtPnRhaWwucHJldjsKQEAgLTI2OSw3ICsyNjksNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIHNhdmFnZV9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCit2b2lkIHNhdmFnZV9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3NhdmFnZV9idWZfcHJpdl90ICplbnRyeSA9IGJ1Zi0+ZGV2X3ByaXZhdGUsICpwcmV2LCAqbmV4dDsKQEAgLTUzNSw3ICs1MzUsNyBAQAogCWRldl9wcml2LT5maXJzdF9kbWFfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X2RtYV9wYWdlID0gMDsKIH0KIAotaW50IHNhdmFnZV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQoraW50IHNhdmFnZV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2OwogCkBAIC01NTgsNyArNTU4LDcgQEAKICAqIGluIGRybV9hZGRtYXAuIFRoZXJlZm9yZSB3ZSBhZGQgdGhlbSBtYW51YWxseSBiZWZvcmUgdGhlIG1hcHMgYXJlCiAgKiBpbml0aWFsaXplZCwgYW5kIHRlYXIgdGhlbSBkb3duIG9uIGxhc3QgY2xvc2UuCiAgKi8KLWludCBzYXZhZ2VfZHJpdmVyX2ZpcnN0b3Blbihkcm1fZGV2aWNlX3QgKmRldikKK2ludCBzYXZhZ2VfZHJpdmVyX2ZpcnN0b3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBtbWlvX2Jhc2UsIGZiX2Jhc2UsIGZiX3NpemUsIGFwZXJ0dXJlX2Jhc2U7CkBAIC02NTUsNyArNjU1LDcgQEAKIC8qCiAgKiBEZWxldGUgTVRSUnMgYW5kIGZyZWUgZGV2aWNlLXByaXZhdGUgZGF0YS4KICAqLwotdm9pZCBzYXZhZ2VfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldikKK3ZvaWQgc2F2YWdlX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwpAQCAtNjY3LDcgKzY2Nyw3IEBACiAJCQkJIGRldl9wcml2LT5tdHJyW2ldLnNpemUsIERSTV9NVFJSX1dDKTsKIH0KIAotaW50IHNhdmFnZV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KQoraW50IHNhdmFnZV9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNjc2LDcgKzY3Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2F2YWdlX2RvX2luaXRfYmNpKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3NhdmFnZV9pbml0X3QgKiBpbml0KQorc3RhdGljIGludCBzYXZhZ2VfZG9faW5pdF9iY2koc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9zYXZhZ2VfaW5pdF90ICogaW5pdCkKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC03MTEsNyArNzExLDcgQEAKIAlkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgPSBpbml0LT50ZXh0dXJlX29mZnNldDsKIAlkZXZfcHJpdi0+dGV4dHVyZV9zaXplID0gaW5pdC0+dGV4dHVyZV9zaXplOwogCi0JRFJNX0dFVFNBUkVBKCk7CisJZGV2X3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7CiAJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOwogCQlzYXZhZ2VfZG9fY2xlYW51cF9iY2koZGV2KTsKQEAgLTg5OCw3ICs4OTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhdmFnZV9kb19jbGVhbnVwX2JjaShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHNhdmFnZV9kb19jbGVhbnVwX2JjaShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMDA3LDkgKzEwMDcsOSBAQAogICogRE1BIGJ1ZmZlciBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdGljIGludCBzYXZhZ2VfYmNpX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICpkZXYsIGRybV9kbWFfdCAqZCkKK3N0YXRpYyBpbnQgc2F2YWdlX2JjaV9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZG1hICpkKQogewotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSBkLT5ncmFudGVkX2NvdW50OyBpIDwgZC0+cmVxdWVzdF9jb3VudDsgaSsrKSB7CkBAIC0xMDM0LDEzICsxMDM0LDEzIEBACiBpbnQgc2F2YWdlX2JjaV9idWZmZXJzKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2RtYV90IGQ7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RtYSBkOwogCWludCByZXQgPSAwOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZCwgKGRybV9kbWFfdCBfX3VzZXIgKikgZGF0YSwgc2l6ZW9mKGQpKTsKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZCwgKHN0cnVjdCBkcm1fZG1hIF9fdXNlciAqKSBkYXRhLCBzaXplb2YoZCkpOwogCiAJLyogUGxlYXNlIGRvbid0IHNlbmQgdXMgYnVmZmVycy4KIAkgKi8KQEAgLTEwNjQsMTQgKzEwNjQsMTQgQEAKIAkJcmV0ID0gc2F2YWdlX2JjaV9nZXRfYnVmZmVycyhmaWxwLCBkZXYsICZkKTsKIAl9CiAKLQlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fZG1hX3QgX191c2VyICopIGRhdGEsIGQsIHNpemVvZihkKSk7CisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgoc3RydWN0IGRybV9kbWEgX191c2VyICopIGRhdGEsIGQsIHNpemVvZihkKSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBEUk1GSUxFIGZpbHApCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwogCkBAIC0xMDg1LDcgKzEwODUsNyBAQAogCS8qaTgzMF9mbHVzaF9xdWV1ZShkZXYpOyAqLwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdiAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcm0uaAppbmRleCBlMTE0OGU4Li44YTU3NmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcm0uaApAQCAtNDcsNyArNDcsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgX2RybV9zYXZhZ2Vfc2FyZWEgewogCS8qIExSVSBsaXN0cyBmb3IgdGV4dHVyZSBtZW1vcnkgaW4gYWdwIHNwYWNlIGFuZCBvbiB0aGUgY2FyZC4KIAkgKi8KLQlkcm1fdGV4X3JlZ2lvbl90IHRleExpc3RbU0FWQUdFX05SX1RFWF9IRUFQU11bU0FWQUdFX05SX1RFWF9SRUdJT05TICsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4TGlzdFtTQVZBR0VfTlJfVEVYX0hFQVBTXVtTQVZBR0VfTlJfVEVYX1JFR0lPTlMgKwogCQkJCQkJICAgICAgMV07CiAJdW5zaWduZWQgaW50IHRleEFnZVtTQVZBR0VfTlJfVEVYX0hFQVBTXTsKIApAQCAtMTEzLDcgKzExMyw3IEBACiAJdW5zaWduZWQgaW50IHZiX3NpemU7CS8qIHNpemUgb2YgY2xpZW50IHZlcnRleCBidWZmZXIgaW4gYnl0ZXMgKi8KIAl1bnNpZ25lZCBpbnQgdmJfc3RyaWRlOwkvKiBzdHJpZGUgb2YgdmVydGljZXMgaW4gMzJiaXQgd29yZHMgKi8KIAkvKiBib3hlcyBpbiBjbGllbnQncyBhZGRyZXNzIHNwYWNlICovCi0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94X2FkZHI7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpib3hfYWRkcjsKIAl1bnNpZ25lZCBpbnQgbmJveDsJLyogbnVtYmVyIG9mIGNsaXBwaW5nIGJveGVzICovCiB9IGRybV9zYXZhZ2VfY21kYnVmX3Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJ2LmgKaW5kZXggOGYwNGIzZC4uNWZkNTRkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJ2LmgKQEAgLTU4LDcgKzU4LDcgQEAKIAlzdHJ1Y3QgZHJtX3NhdmFnZV9idWZfcHJpdiAqbmV4dDsKIAlzdHJ1Y3QgZHJtX3NhdmFnZV9idWZfcHJpdiAqcHJldjsKIAlkcm1fc2F2YWdlX2FnZV90IGFnZTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogfSBkcm1fc2F2YWdlX2J1Zl9wcml2X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGRybV9zYXZhZ2VfZG1hX3BhZ2UgewpAQCAtMTkyLDcgKzE5Miw3IEBACiAJLyogRXJyLCB0aGVyZSBpcyBhIG1hY3JvIHdhaXRfZXZlbnQgaW4gaW5jbHVkZS9saW51eC93YWl0LmguCiAJICogQXZvaWQgdW53YW50ZWQgbWFjcm8gZXhwYW5zaW9uLiAqLwogCXZvaWQgKCplbWl0X2NsaXBfcmVjdCkgKHN0cnVjdCBkcm1fc2F2YWdlX3ByaXZhdGUgKiBkZXZfcHJpdiwKLQkJCQljb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKKwkJCQljb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIHBib3gpOwogCXZvaWQgKCpkbWFfZmx1c2gpIChzdHJ1Y3QgZHJtX3NhdmFnZV9wcml2YXRlICogZGV2X3ByaXYpOwogfSBkcm1fc2F2YWdlX3ByaXZhdGVfdDsKIApAQCAtMjAzLDIyICsyMDMsMjIgQEAKIC8qIEJDSSBmdW5jdGlvbnMgKi8KIGV4dGVybiB1aW50MTZfdCBzYXZhZ2VfYmNpX2VtaXRfZXZlbnQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgc2F2YWdlX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1Zik7CitleHRlcm4gdm9pZCBzYXZhZ2VfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1Zik7CiBleHRlcm4gdm9pZCBzYXZhZ2VfZG1hX3Jlc2V0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogZXh0ZXJuIHZvaWQgc2F2YWdlX2RtYV93YWl0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVuc2lnbmVkIGludCBwYWdlKTsKIGV4dGVybiB1aW50MzJfdCAqc2F2YWdlX2RtYV9hbGxvYyhkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSAgdW5zaWduZWQgaW50IG4pOwotZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCk7Ci1leHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfZmlyc3RvcGVuKGRybV9kZXZpY2VfdCAqZGV2KTsKLWV4dGVybiB2b2lkIHNhdmFnZV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqZGV2KTsKLWV4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICpkZXYpOwotZXh0ZXJuIHZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOworZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX2ZpcnN0b3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHNhdmFnZV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCk7CiAKIC8qIHN0YXRlIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3MzZChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCSAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpOworCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogcGJveCk7CiBleHRlcm4gdm9pZCBzYXZhZ2VfZW1pdF9jbGlwX3JlY3RfczQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpOworCQkJCSAgICAgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBwYm94KTsKIAogI2RlZmluZSBTQVZBR0VfRkJfU0laRV9TMwkweDAxMDAwMDAwCS8qICAxNk1CICovCiAjZGVmaW5lIFNBVkFHRV9GQl9TSVpFX1M0CTB4MDIwMDAwMDAJLyogIDMyTUIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCmluZGV4IDFjYTFlOWMuLjc3NDk3ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgInNhdmFnZV9kcnYuaCIKIAogdm9pZCBzYXZhZ2VfZW1pdF9jbGlwX3JlY3RfczNkKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICogcGJveCkKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIHBib3gpCiB7CiAJdWludDMyX3Qgc2NzdGFydCA9IGRldl9wcml2LT5zdGF0ZS5zM2QubmV3X3Njc3RhcnQ7CiAJdWludDMyX3Qgc2NlbmQgPSBkZXZfcHJpdi0+c3RhdGUuczNkLm5ld19zY2VuZDsKQEAgLTUzLDcgKzUzLDcgQEAKIH0KIAogdm9pZCBzYXZhZ2VfZW1pdF9jbGlwX3JlY3RfczQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIHBib3gpCiB7CiAJdWludDMyX3QgZHJhd2N0cmwwID0gZGV2X3ByaXYtPnN0YXRlLnM0Lm5ld19kcmF3Y3RybDA7CiAJdWludDMyX3QgZHJhd2N0cmwxID0gZGV2X3ByaXYtPnN0YXRlLnM0Lm5ld19kcmF3Y3RybDE7CkBAIC0yNzcsNyArMjc3LDcgQEAKIAogc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfZG1hX3ByaW0oZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgICAgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKiBjbWRfaGVhZGVyLAotCQkJCSAgICBjb25zdCBkcm1fYnVmX3QgKiBkbWFidWYpCisJCQkJICAgIGNvbnN0IHN0cnVjdCBkcm1fYnVmICogZG1hYnVmKQogewogCXVuc2lnbmVkIGNoYXIgcmVvcmRlciA9IDA7CiAJdW5zaWduZWQgaW50IHByaW0gPSBjbWRfaGVhZGVyLT5wcmltLnByaW07CkBAIC01MzYsNyArNTM2LDcgQEAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX2RtYV9pZHgoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgICBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqIGNtZF9oZWFkZXIsCiAJCQkJICAgY29uc3QgdWludDE2X3QgKmlkeCwKLQkJCQkgICBjb25zdCBkcm1fYnVmX3QgKiBkbWFidWYpCisJCQkJICAgY29uc3Qgc3RydWN0IGRybV9idWYgKiBkbWFidWYpCiB7CiAJdW5zaWduZWQgY2hhciByZW9yZGVyID0gMDsKIAl1bnNpZ25lZCBpbnQgcHJpbSA9IGNtZF9oZWFkZXItPmlkeC5wcmltOwpAQCAtNzkyLDcgKzc5Miw3IEBACiAJCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICogY21kX2hlYWRlciwKIAkJCQkgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmRhdGEsCiAJCQkJIHVuc2lnbmVkIGludCBuYm94LAotCQkJCSBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKmJveGVzKQorCQkJCSBjb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ZXMpCiB7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gY21kX2hlYWRlci0+Y2xlYXIwLmZsYWdzOwogCXVuc2lnbmVkIGludCBjbGVhcl9jbWQ7CkBAIC04NjEsNyArODYxLDcgQEAKIH0KIAogc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfc3dhcChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCXVuc2lnbmVkIGludCBuYm94LCBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKmJveGVzKQorCQkJCXVuc2lnbmVkIGludCBuYm94LCBjb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ZXMpCiB7CiAJdW5zaWduZWQgaW50IHN3YXBfY21kOwogCXVuc2lnbmVkIGludCBpOwpAQCAtODkyLDExICs4OTIsMTEgQEAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX2RyYXcoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQljb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqc3RhcnQsCiAJCQkJY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmVuZCwKLQkJCQljb25zdCBkcm1fYnVmX3QgKiBkbWFidWYsCisJCQkJY29uc3Qgc3RydWN0IGRybV9idWYgKiBkbWFidWYsCiAJCQkJY29uc3QgdW5zaWduZWQgaW50ICp2dHhidWYsCiAJCQkJdW5zaWduZWQgaW50IHZiX3NpemUsIHVuc2lnbmVkIGludCB2Yl9zdHJpZGUsCiAJCQkJdW5zaWduZWQgaW50IG5ib3gsCi0JCQkJY29uc3QgZHJtX2NsaXBfcmVjdF90ICpib3hlcykKKwkJCQljb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ZXMpCiB7CiAJdW5zaWduZWQgaW50IGksIGo7CiAJaW50IHJldDsKQEAgLTk1NywxMyArOTU3LDEzIEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqZG1hYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmRtYWJ1ZjsKIAlkcm1fc2F2YWdlX2NtZGJ1Zl90IGNtZGJ1ZjsKIAlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqa2NtZF9hZGRyID0gTlVMTDsKIAlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqZmlyc3RfZHJhd19jbWQ7CiAJdW5zaWduZWQgaW50ICprdmJfYWRkciA9IE5VTEw7Ci0JZHJtX2NsaXBfcmVjdF90ICprYm94X2FkZHIgPSBOVUxMOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICprYm94X2FkZHIgPSBOVUxMOwogCXVuc2lnbmVkIGludCBpLCBqOwogCWludCByZXQgPSAwOwogCkBAIC0xMDE5LDcgKzEwMTksNyBAQAogCQljbWRidWYudmJfYWRkciA9IGt2Yl9hZGRyOwogCX0KIAlpZiAoY21kYnVmLm5ib3gpIHsKLQkJa2JveF9hZGRyID0gZHJtX2FsbG9jKGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksCisJCWtib3hfYWRkciA9IGRybV9hbGxvYyhjbWRidWYubmJveCAqIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCksCiAJCQkJICAgICAgIERSTV9NRU1fRFJJVkVSKTsKIAkJaWYgKGtib3hfYWRkciA9PSBOVUxMKSB7CiAJCQlyZXQgPSBEUk1fRVJSKEVOT01FTSk7CkBAIC0xMDI3LDcgKzEwMjcsNyBAQAogCQl9CiAKIAkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrYm94X2FkZHIsIGNtZGJ1Zi5ib3hfYWRkciwKLQkJCQkgICAgICAgY21kYnVmLm5ib3ggKiBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSkpIHsKKwkJCQkgICAgICAgY21kYnVmLm5ib3ggKiBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpKSkgewogCQkJcmV0ID0gRFJNX0VSUihFRkFVTFQpOwogCQkJZ290byBkb25lOwogCQl9CkBAIC0xMTU4LDcgKzExNTgsNyBAQAogCS8qIElmIHdlIGRpZG4ndCBuZWVkIHRvIGFsbG9jYXRlIHRoZW0sIHRoZXNlJ2xsIGJlIE5VTEwgKi8KIAlkcm1fZnJlZShrY21kX2FkZHIsIGNtZGJ1Zi5zaXplICogOCwgRFJNX01FTV9EUklWRVIpOwogCWRybV9mcmVlKGt2Yl9hZGRyLCBjbWRidWYudmJfc2l6ZSwgRFJNX01FTV9EUklWRVIpOwotCWRybV9mcmVlKGtib3hfYWRkciwgY21kYnVmLm5ib3ggKiBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwKKwlkcm1fZnJlZShrYm94X2FkZHIsIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSwKIAkJIERSTV9NRU1fRFJJVkVSKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCmluZGV4IDY5MGUwYWYuLjE5MTJmNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCkBAIC0zNSw3ICszNSw3IEBACiAJc2lzZHJ2X1BDSV9JRFMKIH07CiAKLXN0YXRpYyBpbnQgc2lzX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCitzdGF0aWMgaW50IHNpc19kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCiB7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2OwogCWludCByZXQ7CkBAIC01NCw3ICs1NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzaXNfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyBpbnQgc2lzX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oCmluZGV4IDcwZDRlZGUuLjU2MzBkZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oCkBAIC00Niw2ICs0Niw3IEBACiAKICNpbmNsdWRlICJkcm1fc21hbi5oIgogCisKICNkZWZpbmUgU0lTX0JBU0UgKGRldl9wcml2LT5tbWlvKQogI2RlZmluZSBTSVNfUkVBRChyZWcpICAgICAgICAgRFJNX1JFQUQzMihTSVNfQkFTRSwgcmVnKTsKICNkZWZpbmUgU0lTX1dSSVRFKHJlZywgdmFsKSAgIERSTV9XUklURTMyKFNJU19CQVNFLCByZWcsIHZhbCk7CkBAIC01Myw3ICs1NCw3IEBACiB0eXBlZGVmIHN0cnVjdCBkcm1fc2lzX3ByaXZhdGUgewogCWRybV9sb2NhbF9tYXBfdCAqbW1pbzsKIAl1bnNpZ25lZCBpbnQgaWRsZV9mYXVsdDsKLQlkcm1fc21hbl90IHNtYW47CisJc3RydWN0IGRybV9zbWFuIHNtYW47CiAJdW5zaWduZWQgaW50IGNoaXBzZXQ7CiAJaW50IHZyYW1faW5pdGlhbGl6ZWQ7CiAJaW50IGFncF9pbml0aWFsaXplZDsKQEAgLTYxLDkgKzYyLDkgQEAKIAl1bnNpZ25lZCBsb25nIGFncF9vZmZzZXQ7CiB9IGRybV9zaXNfcHJpdmF0ZV90OwogCi1leHRlcm4gaW50IHNpc19pZGxlKGRybV9kZXZpY2VfdCAqZGV2KTsKLWV4dGVybiB2b2lkIHNpc19yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gdm9pZCBzaXNfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiBpbnQgc2lzX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBzaXNfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gdm9pZCBzaXNfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBzaXNfaW9jdGxzW107CiBleHRlcm4gaW50IHNpc19tYXhfaW9jdGw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYwppbmRleCBkMjZmNWRiLi40NDFiYmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAjaWYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQogCXsKLQkJZHJtX3NtYW5fbW1fdCBzbWFuX21tOworCQlzdHJ1Y3QgZHJtX3NtYW5fbW0gc21hbl9tbTsKIAkJc21hbl9tbS5wcml2YXRlID0gKHZvaWQgKikweEZGRkZGRkZGOwogCQlzbWFuX21tLmFsbG9jYXRlID0gc2lzX3NtYW5fbW1fYWxsb2NhdGU7CiAJCXNtYW5fbW0uZnJlZSA9IHNpc19zbWFuX21tX2ZyZWU7CkBAIC0xMjMsMTQgKzEyMywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNpc19kcm1fYWxsb2MoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogcHJpdiwKK3N0YXRpYyBpbnQgc2lzX2RybV9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKiBwcml2LAogCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSwgaW50IHBvb2wpCiB7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fc2lzX21lbV90IF9fdXNlciAqYXJncCA9IChkcm1fc2lzX21lbV90IF9fdXNlciAqKSBkYXRhOwogCWRybV9zaXNfbWVtX3QgbWVtOwogCWludCByZXR2YWwgPSAwOwotCWRybV9tZW1ibG9ja19pdGVtX3QgKml0ZW07CisJc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICppdGVtOwogCiAJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbSwgYXJncCwgc2l6ZW9mKG1lbSkpOwogCkBAIC0yMjksMTIgKzIyOSwxMiBAQAogCXJldHVybiBzaXNfZHJtX2FsbG9jKGRldiwgcHJpdiwgZGF0YSwgQUdQX1RZUEUpOwogfQogCi1zdGF0aWMgZHJtX2xvY2FsX21hcF90ICpzaXNfcmVnX2luaXQoZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgZHJtX2xvY2FsX21hcF90ICpzaXNfcmVnX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlkcm1fbWFwX2xpc3RfdCAqZW50cnk7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqZW50cnk7CiAJZHJtX2xvY2FsX21hcF90ICptYXA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQltYXAgPSBlbnRyeS0+bWFwOwogCQlpZiAoIW1hcCkKIAkJCWNvbnRpbnVlOwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBzaXNfaWRsZShkcm1fZGV2aWNlX3QgKmRldikKK2ludCBzaXNfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgaWRsZV9yZWc7CkBAIC0zMTQsMTAgKzMxNCwxMCBAQAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogfQogCi12b2lkIHNpc19yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIHNpc19yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChkcm1fc21hbl9vd25lcl9jbGVhbigmZGV2X3ByaXYtPnNtYW4sICh1bnNpZ25lZCBsb25nKXByaXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jCmluZGV4IDEzYTljNWMuLjdmZjJiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIAlyZXR1cm4gKHVpbnQzMl90ICopIChkZXZfcHJpdi0+ZG1hX3B0ciArIGRldl9wcml2LT5kbWFfbG93KTsKIH0KIAotaW50IHZpYV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgdmlhX2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CkBAIC0xNjksNyArMTY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2aWFfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHZpYV9pbml0aWFsaXplKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICBkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJICBkcm1fdmlhX2RtYV9pbml0X3QgKiBpbml0KQogewpAQCAtMjYyLDcgKzI2Miw3IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgdmlhX2Rpc3BhdGNoX2NtZGJ1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV92aWFfY21kYnVmZmVyX3QgKiBjbWQpCitzdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV92aWFfY21kYnVmZmVyX3QgKiBjbWQpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2OwogCXVpbnQzMl90ICp2YjsKQEAgLTMxNiw3ICszMTYsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK2ludCB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMzU2LDcgKzM1Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlhX2Rpc3BhdGNoX3BjaV9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCB2aWFfZGlzcGF0Y2hfcGNpX2NtZGJ1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgICBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMKaW5kZXggMjg4MWEwNi4uZmRiODYwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAgKi8KIAogc3RhdGljIHZvaWQKLXZpYV9maXJlX2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYsIGRybV92aWFfc2dfaW5mb190ICp2c2csIGludCBlbmdpbmUpCit2aWFfZmlyZV9kbWFibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV92aWFfc2dfaW5mb190ICp2c2csIGludCBlbmdpbmUpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMjg5LDcgKzI4OSw3IEBACiB9CiAJCQkKIHN0YXRpYyB2b2lkCi12aWFfYWJvcnRfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldiwgaW50IGVuZ2luZSkKK3ZpYV9hYm9ydF9kbWFibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMjk3LDcgKzI5Nyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi12aWFfZG1hYmxpdF9lbmdpbmVfb2ZmKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lKQordmlhX2RtYWJsaXRfZW5naW5lX29mZihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTMxNCw3ICszMTQsNyBAQAogICovCiAJCQogdm9pZAotdmlhX2RtYWJsaXRfaGFuZGxlcihkcm1fZGV2aWNlX3QgKmRldiwgaW50IGVuZ2luZSwgaW50IGZyb21faXJxKQordmlhX2RtYWJsaXRfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lLCBpbnQgZnJvbV9pcnEpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxID0gZGV2X3ByaXYtPmJsaXRfcXVldWVzICsgZW5naW5lOwpAQCAtNDMzLDcgKzQzMyw3IEBACiAgKi8KIAogc3RhdGljIGludAotdmlhX2RtYWJsaXRfc3luYyhkcm1fZGV2aWNlX3QgKmRldiwgdWludDMyX3QgaGFuZGxlLCBpbnQgZW5naW5lKSAKK3ZpYV9kbWFibGl0X3N5bmMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaGFuZGxlLCBpbnQgZW5naW5lKSAKIHsKIAogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CkBAIC00NjYsNyArNDY2LDcgQEAKIHZpYV9kbWFibGl0X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxID0gKGRybV92aWFfYmxpdHFfdCAqKSBkYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gYmxpdHEtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxpdHEtPmRldjsKIAlpbnQgZW5naW5lID0gKGludCkKIAkJKGJsaXRxIC0gKChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGUpLT5ibGl0X3F1ZXVlcyk7CiAJCQpAQCAtNTAyLDcgKzUwMiw3IEBACiB2aWFfZG1hYmxpdF93b3JrcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWRybV92aWFfYmxpdHFfdCAqYmxpdHEgPSBjb250YWluZXJfb2Yod29yaywgZHJtX3ZpYV9ibGl0cV90LCB3cSk7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBibGl0cS0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBibGl0cS0+ZGV2OwogCXVuc2lnbmVkIGxvbmcgaXJxc2F2ZTsKIAlkcm1fdmlhX3NnX2luZm9fdCAqY3VyX3NnOwogCWludCBjdXJfcmVsZWFzZWQ7CkBAIC01NDUsNyArNTQ1LDcgQEAKIAogCiB2b2lkCi12aWFfaW5pdF9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2KQordmlhX2luaXRfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWludCBpLGo7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTU4Miw3ICs1ODIsNyBAQAogCQkKIAogc3RhdGljIGludAotdmlhX2J1aWxkX3NnX2luZm8oZHJtX2RldmljZV90ICpkZXYsIGRybV92aWFfc2dfaW5mb190ICp2c2csIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQordmlhX2J1aWxkX3NnX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgZHJtX3ZpYV9kbWFibGl0X3QgKnhmZXIpCiB7CiAJaW50IGRyYXcgPSB4ZmVyLT50b19mYjsKIAlpbnQgcmV0ID0gMDsKQEAgLTczMCw3ICs3MzAsNyBAQAogCiAKIHN0YXRpYyBpbnQgCi12aWFfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3ZpYV9kbWFibGl0X3QgKnhmZXIpCSAKK3ZpYV9kbWFibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQkgCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fdmlhX3NnX2luZm9fdCAqdnNnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5oCmluZGV4IGY0MDM2Y2QuLjZmNmE1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmgKQEAgLTU5LDcgKzU5LDcgQEAKIH0gZHJtX3ZpYV9zZ19pbmZvX3Q7CiAKIHR5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2JsaXRxIHsKLQlkcm1fZGV2aWNlX3QgKmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCXVpbnQzMl90IGN1cl9ibGl0X2hhbmRsZTsKIAl1aW50MzJfdCBkb25lX2JsaXRfaGFuZGxlOwogCXVuc2lnbmVkIHNlcnZpY2VkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaAppbmRleCBlNGVlOTdkLi44ZjUzYzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaApAQCAtNDAsNyArNDAsNyBAQAogI2RlZmluZSBWSUFfTlJfWFZNQ19MT0NLUyAgICAgICAgICAgICAgIDUKICNkZWZpbmUgVklBX01BWF9DQUNIRUxJTkVfU0laRSAgICAgICAgICA2NAogI2RlZmluZSBYVk1DTE9DS1BUUihzYVByaXYsbG9ja05vKQkJCQkJXAotCSgodm9sYXRpbGUgZHJtX2h3X2xvY2tfdCAqKSgoKCgodW5zaWduZWQgbG9uZykgKHNhUHJpdiktPlh2TUNMb2NrQXJlYSkgKyBcCisJKCh2b2xhdGlsZSBzdHJ1Y3QgZHJtX2h3X2xvY2sgKikoKCgoKHVuc2lnbmVkIGxvbmcpIChzYVByaXYpLT5Ydk1DTG9ja0FyZWEpICsgXAogCQkJCSAgICAgIChWSUFfTUFYX0NBQ0hFTElORV9TSVpFIC0gMSkpICYJXAogCQkJCSAgICAgfihWSUFfTUFYX0NBQ0hFTElORV9TSVpFIC0gMSkpICsJXAogCQkJCSAgICBWSUFfTUFYX0NBQ0hFTElORV9TSVpFKihsb2NrTm8pKSkKQEAgLTE4Miw3ICsxODIsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfc2FyZWEgewogCXVuc2lnbmVkIGludCBkaXJ0eTsKIAl1bnNpZ25lZCBpbnQgbmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbVklBX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbVklBX05SX1NBUkVBX0NMSVBSRUNUU107CiAJZHJtX3ZpYV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtWSUFfTlJfVEVYX1JFR0lPTlMgKyAxXTsKIAlpbnQgdGV4QWdlOwkJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCiAJaW50IGN0eE93bmVyOwkJLyogbGFzdCBjb250ZXh0IHRvIHVwbG9hZCBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaAppbmRleCBiNDZjYThlLi41NzY3MTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaApAQCAtODcsNyArODcsNyBAQAogCXVpbnQzMl90IGlycV9wZW5kaW5nX21hc2s7CiAJaW50ICppcnFfbWFwOwogCXVuc2lnbmVkIGludCBpZGxlX2ZhdWx0OwotCWRybV9zbWFuX3Qgc21hbjsKKwlzdHJ1Y3QgZHJtX3NtYW4gc21hbjsKIAlpbnQgdnJhbV9pbml0aWFsaXplZDsKIAlpbnQgYWdwX2luaXRpYWxpemVkOwogCXVuc2lnbmVkIGxvbmcgdnJhbV9vZmZzZXQ7CkBAIC0xMjMsMzEgKzEyMywzMSBAQAogZXh0ZXJuIGludCB2aWFfZG1hX2JsaXRfc3luYyggRFJNX0lPQ1RMX0FSR1MgKTsKIGV4dGVybiBpbnQgdmlhX2RtYV9ibGl0KCBEUk1fSU9DVExfQVJHUyApOwogCi1leHRlcm4gaW50IHZpYV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KTsKLWV4dGVybiBpbnQgdmlhX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KTsKK2V4dGVybiBpbnQgdmlhX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLWV4dGVybiBpbnQgdmlhX2luaXRfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjb250ZXh0KTsKLWV4dGVybiBpbnQgdmlhX2ZpbmFsX2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2LCBpbnQgY29udGV4dCk7CitleHRlcm4gaW50IHZpYV9pbml0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQgdmlhX2ZpbmFsX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBjb250ZXh0KTsKIAotZXh0ZXJuIGludCB2aWFfZG9fY2xlYW51cF9tYXAoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgdmlhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCB2aWFfZG9fY2xlYW51cF9tYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIAogZXh0ZXJuIGlycXJldHVybl90IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAotZXh0ZXJuIGludCB2aWFfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgdmlhX2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiB2b2lkIHZpYV9pbml0X2NvbW1hbmRfdmVyaWZpZXIodm9pZCk7Ci1leHRlcm4gaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIHZvaWQgdmlhX2luaXRfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiBleHRlcm4gdm9pZCB2aWFfY2xlYW51cF9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIHZpYV9yZWxlYXNlX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBjb250ZXh0KTsKIAotZXh0ZXJuIHZvaWQgdmlhX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiB2b2lkIHZpYV9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgdmlhX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIHZvaWQgdmlhX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAotZXh0ZXJuIHZvaWQgdmlhX2RtYWJsaXRfaGFuZGxlcihkcm1fZGV2aWNlX3QgKmRldiwgaW50IGVuZ2luZSwgaW50IGZyb21faXJxKTsKLWV4dGVybiB2b2lkIHZpYV9pbml0X2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgdmlhX2RtYWJsaXRfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lLCBpbnQgZnJvbV9pcnEpOworZXh0ZXJuIHZvaWQgdmlhX2luaXRfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jCmluZGV4IDFhYzU5NDEuLjhkYzk5YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jCkBAIC05OCw3ICs5OCw3IEBACiAKIGlycXJldHVybl90IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXR1czsKIAlpbnQgaGFuZGxlZCA9IDA7CkBAIC0xNjMsNyArMTYzLDcgQEAKIAl9CiB9CiAKLWludCB2aWFfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK2ludCB2aWFfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOwpAQCAtMTkxLDcgKzE5MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXZpYV9kcml2ZXJfaXJxX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgaXJxLCBpbnQgZm9yY2Vfc2VxdWVuY2UsCit2aWFfZHJpdmVyX2lycV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgaXJxLCBpbnQgZm9yY2Vfc2VxdWVuY2UsCiAJCSAgICB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAgKiBkcm1fZG1hLmggaG9va3MKICAqLwogCi12b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBzdGF0dXM7CkBAIC0yOTMsNyArMjkzLDcgQEAKIAl9CiB9CiAKLXZvaWQgdmlhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCB2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgc3RhdHVzOwpAQCAtMzEyLDcgKzMxMiw3IEBACiAJfQogfQogCi12b2lkIHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYwppbmRleCA0ZTNmYzA3Li43ZmI5ZDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYwpAQCAtMjUsMTMgKzI1LDEzIEBACiAjaW5jbHVkZSAidmlhX2RybS5oIgogI2luY2x1ZGUgInZpYV9kcnYuaCIKIAotc3RhdGljIGludCB2aWFfZG9faW5pdF9tYXAoZHJtX2RldmljZV90ICogZGV2LCBkcm1fdmlhX2luaXRfdCAqIGluaXQpCitzdGF0aWMgaW50IHZpYV9kb19pbml0X21hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3ZpYV9pbml0X3QgKiBpbml0KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JRFJNX0dFVFNBUkVBKCk7CisJZGV2X3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7CiAJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOwogCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKQEAgLTY4LDcgKzY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZpYV9kb19jbGVhbnVwX21hcChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgdmlhX2RvX2NsZWFudXBfbWFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXZpYV9kbWFfY2xlYW51cChkZXYpOwogCkBAIC05NSw3ICs5NSw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLWludCB2aWFfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCkKK2ludCB2aWFfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlpbnQgcmV0ID0gMDsKQEAgLTExNSw3ICsxMTUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB2aWFfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldikKK2ludCB2aWFfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jCmluZGV4IDJmY2YwNTcuLjg1ZDU2YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAKIAlkcm1fdmlhX21lbV90IG1lbTsKIAlpbnQgcmV0dmFsID0gMDsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICppdGVtOworCXN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqaXRlbTsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIHRtcFNpemU7CiAKQEAgLTE4OCwxMCArMTg4LDEwIEBACiB9CiAKIAotdm9pZCB2aWFfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCB2aWFfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAoZHJtX3NtYW5fb3duZXJfY2xlYW4oJmRldl9wcml2LT5zbWFuLCAodW5zaWduZWQgbG9uZylwcml2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMKaW5kZXggMmU3ZTA4MC4uODMyZDQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jCkBAIC0yNTIsMTAgKzI1Miw5IEBACiBzdGF0aWMgX19pbmxpbmVfXyBkcm1fbG9jYWxfbWFwX3QgKnZpYV9kcm1fbG9va3VwX2FncF9tYXAoZHJtX3ZpYV9zdGF0ZV90ICpzZXEsCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCQkJICAgIGRybV9kZXZpY2VfdCAqIGRldikKKwkJCQkJCSAgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OwogCWRybV9sb2NhbF9tYXBfdCAqbWFwID0gc2VxLT5tYXBfY2FjaGU7CiAKIAlpZiAobWFwICYmIG1hcC0+b2Zmc2V0IDw9IG9mZnNldApAQCAtMjYzLDggKzI2Miw3IEBACiAJCXJldHVybiBtYXA7CiAJfQogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCXJfbGlzdCA9IChkcm1fbWFwX2xpc3RfdCAqKSBsaXN0OworCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCW1hcCA9IHJfbGlzdC0+bWFwOwogCQlpZiAoIW1hcCkKIAkJCWNvbnRpbnVlOwpAQCAtOTY0LDcgKzk2Miw3IEBACiAKIGludAogdmlhX3ZlcmlmeV9jb21tYW5kX3N0cmVhbShjb25zdCB1aW50MzJfdCAqIGJ1ZiwgdW5zaWduZWQgaW50IHNpemUsCi0JCQkgIGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGFncCkKKwkJCSAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBhZ3ApCiB7CiAKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEwMzksNyArMTAzNyw3IEBACiB9CiAKIGludAotdmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRybV9kZXZpY2VfdCAqIGRldiwgY29uc3QgdWludDMyX3QgKiBidWYsCit2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLAogCQkJIHVuc2lnbmVkIGludCBzaXplKQogewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaAppbmRleCBiNzdmNTlkLi4yOGI1MDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlkcm1fdmlhX3NlcXVlbmNlX3QgdW5maW5pc2hlZDsKIAlpbnQgYWdwX3RleHR1cmU7CiAJaW50IG11bHRpdGV4OwotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJZHJtX2xvY2FsX21hcF90ICptYXBfY2FjaGU7CiAJdWludDMyX3QgdmVydGV4X2NvdW50OwogCWludCBhZ3A7CkBAIC01NSw4ICs1NSw4IEBACiB9IGRybV92aWFfc3RhdGVfdDsKIAogZXh0ZXJuIGludCB2aWFfdmVyaWZ5X2NvbW1hbmRfc3RyZWFtKGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkgICAgIGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGFncCk7Ci1leHRlcm4gaW50IHZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShkcm1fZGV2aWNlX3QgKmRldiwgY29uc3QgdWludDMyX3QgKmJ1ZiwKKwkJCQkgICAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgYWdwKTsKK2V4dGVybiBpbnQgdmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNvbnN0IHVpbnQzMl90ICpidWYsCiAJCQkJICAgIHVuc2lnbmVkIGludCBzaXplKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXNwLmMgYi9kcml2ZXJzL2NoYXIvZXNwLmMKaW5kZXggZDFiZmJhYS4uNzRjZDUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VzcC5jCisrKyBiL2RyaXZlcnMvY2hhci9lc3AuYwpAQCAtMTEyMSw4ICsxMTIxLDYgQEAKIAkvKgogCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZwogCSAqLwotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCi0KIAlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfRFI7CiAJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKIAkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOwpAQCAtMTkyMCwxMSArMTkxOCw2IEBACiAJc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoICAgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkgICAgJiYgKCAgIFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgCi0JCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCi0JCXJldHVybjsKLQogCWNoYW5nZV9zcGVlZChpbmZvKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jCmluZGV4IDhlYTAyNzUuLjhmYWNmM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jCkBAIC00MywxNiArNDMsNiBAQAogCiAjZGVmaW5lIGZ1bmNfZW50ZXIoKSBnc19kcHJpbnRrIChHU19ERUJVR19GTE9XLCAiZ3M6IGVudGVyICVzXG4iLCBfX0ZVTkNUSU9OX18pCiAjZGVmaW5lIGZ1bmNfZXhpdCgpICBnc19kcHJpbnRrIChHU19ERUJVR19GTE9XLCAiZ3M6IGV4aXQgICVzXG4iLCBfX0ZVTkNUSU9OX18pCi0jZGVmaW5lIE5FV19XUklURV9MT0NLSU5HIDEKLSNpZiBORVdfV1JJVEVfTE9DS0lORwotI2RlZmluZSBERUNMICAgICAgLyogTm90aGluZyAqLwotI2RlZmluZSBMT0NLSVQgICAgbXV0ZXhfbG9jaygmIHBvcnQtPnBvcnRfd3JpdGVfbXV0ZXgpOwotI2RlZmluZSBSRUxFQVNFSVQgbXV0ZXhfdW5sb2NrKCZwb3J0LT5wb3J0X3dyaXRlX211dGV4KTsKLSNlbHNlCi0jZGVmaW5lIERFQ0wgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotI2RlZmluZSBMT0NLSVQgICAgc2F2ZV9mbGFncyAoZmxhZ3MpO2NsaSAoKQotI2RlZmluZSBSRUxFQVNFSVQgcmVzdG9yZV9mbGFncyAoZmxhZ3MpCi0jZW5kaWYKIAogI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMQogCkBAIC02Miw3ICs1Miw2IEBACiB2b2lkIGdzX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQogewogCXN0cnVjdCBnc19wb3J0ICpwb3J0OwotCURFQ0wKIAogCWZ1bmNfZW50ZXIgKCk7IAogCkBAIC03NSwxMSArNjQsMTEgQEAKIAlpZiAoISAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHJldHVybjsKIAogCS8qIFRha2UgYSBsb2NrIG9uIHRoZSBzZXJpYWwgdHJhbm1pdCBidWZmZXIhICovCi0JTE9DS0lUOworCW11dGV4X2xvY2soJiBwb3J0LT5wb3J0X3dyaXRlX211dGV4KTsKIAogCWlmIChwb3J0LT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkgewogCQkvKiBTb3JyeSwgYnVmZmVyIGlzIGZ1bGwsIGRyb3AgY2hhcmFjdGVyLiBVcGRhdGUgc3RhdGlzdGljcz8/Pz8gLS0gUkVXICovCi0JCVJFTEVBU0VJVDsKKwkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5wb3J0X3dyaXRlX211dGV4KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODcsMTMgKzc2LDExIEBACiAJcG9ydC0+eG1pdF9oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUgLSAxOwogCXBvcnQtPnhtaXRfY250Kys7ICAvKiBDaGFyYWN0ZXJzIGluIGJ1ZmZlciAqLwogCi0JUkVMRUFTRUlUOworCW11dGV4X3VubG9jaygmcG9ydC0+cG9ydF93cml0ZV9tdXRleCk7CiAJZnVuY19leGl0ICgpOwogfQogCiAKLSNpZmRlZiBORVdfV1JJVEVfTE9DS0lORwotCiAvKgogPiBQcm9ibGVtcyB0byB0YWtlIGludG8gYWNjb3VudCBhcmU6CiA+ICAgICAgIC0xLSBJbnRlcnJ1cHRzIHRoYXQgZW1wdHkgcGFydCBvZiB0aGUgYnVmZmVyLgpAQCAtMTY2LDkwICsxNTMsNiBAQAogCWZ1bmNfZXhpdCAoKTsKIAlyZXR1cm4gdG90YWw7CiB9Ci0jZWxzZQotLyoKLT4gUHJvYmxlbXMgdG8gdGFrZSBpbnRvIGFjY291bnQgYXJlOgotPiAgICAgICAtMS0gSW50ZXJydXB0cyB0aGF0IGVtcHR5IHBhcnQgb2YgdGhlIGJ1ZmZlci4KLT4gICAgICAgLTItIHBhZ2UgZmF1bHRzIG9uIHRoZSBhY2Nlc3MgdG8gdXNlcnNwYWNlLiAKLT4gICAgICAgLTMtIE90aGVyIHByb2Nlc3NlcyB0aGF0IGFyZSBhbHNvIHRyeWluZyB0byBkbyBhICJ3cml0ZSIuIAotKi8KLQotaW50IGdzX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKLQlpbnQgYywgdG90YWwgPSAwOwotCWludCB0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlmdW5jX2VudGVyICgpOwotCi0JLyogVGhlIHN0YW5kYXJkIHNlcmlhbCBkcml2ZXIgcmV0dXJucyAwIGluIHRoaXMgY2FzZS4gCi0JICAgVGhhdCBzb3VuZHMgdG8gbWUgYXMgIk5vIGVycm9yLCBJIGp1c3QgZGlkbid0IGdldCB0byB3cml0aW5nIGFueQotCSAgIGJ5dGVzLiBGZWVsIGZyZWUgdG8gdHJ5IGFnYWluLiIgCi0JICAgVGhlICJvZmZpY2lhbCIgd2F5IHRvIHdyaXRlIG4gYnl0ZXMgZnJvbSBidWYgaXM6Ci0KLQkJIGZvciAobndyaXR0ZW4gPSAwO253cml0dGVuIDwgbjtud3JpdHRlbiArPSBydikgewotCQkJIHJ2ID0gd3JpdGUgKGZkLCBidWYrbndyaXR0ZW4sIG4tbndyaXR0ZW4pOwotCQkJIGlmIChydiA8IDApIGJyZWFrOyAvLyBFcnJvcjogYmFpbCBvdXQuIC8vCi0JCSB9IAotCi0JICAgd2hpY2ggd2lsbCBsb29wIGVuZGxlc3NseSBpbiB0aGlzIGNhc2UuIFRoZSBtYW51YWwgcGFnZSBmb3Igd3JpdGUKLQkgICBhZ3JlZXMgd2l0aCBtZS4gSW4gcHJhY3Rpc2UgYWxtb3N0IGV2ZXJ5Ym9keSB3cml0ZXMgCi0JICAgIndyaXRlIChmZCwgYnVmLG4pOyIgYnV0IHNvbWUgcGVvcGxlIG1pZ2h0IGhhdmUgaGFkIHRvIGRlYWwgd2l0aCAKLQkgICBpbmNvbXBsZXRlIHdyaXRlcyBpbiB0aGUgcGFzdCBhbmQgY29ycmVjdGx5IGltcGxlbWVudGVkIGl0IGJ5IG5vdy4uLiAKLQkgKi8KLQotCWlmICghdHR5KSByZXR1cm4gLUVJTzsKLQotCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghcG9ydCB8fCAhcG9ydC0+eG1pdF9idWYpCi0JCXJldHVybiAtRUlPOwotCi0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0Jd2hpbGUgKDEpIHsKLQkJY2xpKCk7Ci0JCWMgPSBjb3VudDsKLQotCQkvKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB3ZSAiT1dOIiB0aGUgImhlYWQiLiBOb29uZSBlbHNlIGNhbiAKLQkJICAgY2hhbmdlIHRoZSAiaGVhZCI6IHdlIG93biB0aGUgcG9ydF93cml0ZV9tdXRleC4gKi8KLQkJLyogRG9uJ3Qgb3ZlcnJ1biB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KLQkJdCA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2hlYWQ7Ci0JCWlmICh0IDwgYykgYyA9IHQ7Ci0KLQkJLyogVGhpcyBpcyBzYWZlIGJlY2F1c2UgdGhlIHhtaXRfY250IGNhbiBvbmx5IGRlY3JlYXNlLiBUaGlzIAotCQkgICB3b3VsZCBpbmNyZWFzZSAidCIsIHNvIHdlIG1pZ2h0IGNvcHkgdG9vIGxpdHRsZSBjaGFycy4gKi8KLQkJLyogRG9uJ3QgY29weSBwYXN0IHRoZSAiaGVhZCIgb2YgdGhlIGJ1ZmZlciAqLwotCQl0ID0gU0VSSUFMX1hNSVRfU0laRSAtIDEgLSBwb3J0LT54bWl0X2NudDsKLQkJaWYgKHQgPCBjKSBjID0gdDsKLQotCQkvKiBDYW4ndCBjb3B5IG1vcmU/IGJyZWFrIG91dCEgKi8KLQkJaWYgKGMgPD0gMCkgewotCQkJbG9jYWxfcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0JCQlicmVhazsKLQkJfQotCQltZW1jcHkocG9ydC0+eG1pdF9idWYgKyBwb3J0LT54bWl0X2hlYWQsIGJ1ZiwgYyk7Ci0JCXBvcnQtPnhtaXRfaGVhZCA9ICgocG9ydC0+eG1pdF9oZWFkICsgYykgJgotCQkgICAgICAgICAgICAgICAgICAgKFNFUklBTF9YTUlUX1NJWkUtMSkpOwotCQlwb3J0LT54bWl0X2NudCArPSBjOwotCQlsb2NhbF9yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQkJYnVmICs9IGM7Ci0JCWNvdW50IC09IGM7Ci0JCXRvdGFsICs9IGM7Ci0JfQotCi0JaWYgKHBvcnQtPnhtaXRfY250ICYmIAotCSAgICAhdHR5LT5zdG9wcGVkICYmIAotCSAgICAhdHR5LT5od19zdG9wcGVkICYmCi0JICAgICEocG9ydC0+ZmxhZ3MgJiBHU19UWF9JTlRFTikpIHsKLQkJcG9ydC0+ZmxhZ3MgfD0gR1NfVFhfSU5URU47Ci0JCXBvcnQtPnJkLT5lbmFibGVfdHhfaW50ZXJydXB0cyAocG9ydCk7Ci0JfQotCWZ1bmNfZXhpdCAoKTsKLQlyZXR1cm4gdG90YWw7Ci19Ci0KLSNlbmRpZgogCiAKIApAQCAtNzM3LDIzICs2NDAsNiBAQAogCQlnc19kcHJpbnRrIChHU19ERUJVR19URVJNSU9TLCAidGVybWlvcyBzdHJ1Y3R1cmUgKCVwKTpcbiIsIHRpb3NwKTsKIAl9CiAKLQkvKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiB0aGF0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHVtYiBjYXJkcyAqLwotCS8qIFNtYXJ0IGNhcmRzIHJlcXVpcmUga25vd2xlZGdlIG9mIGlmbGFncyBhbmQgb2ZsYWdzIHRvbzogdGhhdCAKLQkgICBtaWdodCBjaGFuZ2UgaGFyZHdhcmUgY29va2luZyBtb2RlLi4uLiAqLwotCWlmIChvbGRfdGVybWlvcykgewotCQlpZiggICAodGlvc3AtPmNfaWZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfaWZsYWcpCi0JCSAgICYmICh0aW9zcC0+Y19vZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19vZmxhZykKLQkJICAgJiYgKHRpb3NwLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCQkgICAmJiAodGlvc3AtPmNfbGZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfbGZsYWcpCi0JCSAgICYmICh0aW9zcC0+Y19saW5lICA9PSBvbGRfdGVybWlvcy0+Y19saW5lKQotCQkgICAmJiAobWVtY21wKHRpb3NwLT5jX2NjLCBvbGRfdGVybWlvcy0+Y19jYywgTkNDKSA9PSAwKSkgewotCQkJZ3NfZHByaW50ayhHU19ERUJVR19URVJNSU9TLCAiZ3Nfc2V0X3Rlcm1pb3M6IG9wdGltaXplZCBhd2F5XG4iKTsKLQkJCXJldHVybiAvKiAwICovOwotCQl9Ci0JfSBlbHNlIAotCQlnc19kcHJpbnRrKEdTX0RFQlVHX1RFUk1JT1MsICJnc19zZXRfdGVybWlvczogbm8gb2xkX3Rlcm1pb3M6ICIKLQkJICAgICAgICAgICAibm8gb3B0aW1pemF0aW9uXG4iKTsKLQogCWlmKG9sZF90ZXJtaW9zICYmIChnc19kZWJ1ZyAmIEdTX0RFQlVHX1RFUk1JT1MpKSB7CiAJCWlmKHRpb3NwLT5jX2lmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2lmbGFnKSAgcHJpbnRrKCJjX2lmbGFnIGNoYW5nZWRcbiIpOwogCQlpZih0aW9zcC0+Y19vZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19vZmxhZykgIHByaW50aygiY19vZmxhZyBjaGFuZ2VkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9nZW5ydGMuYyBiL2RyaXZlcnMvY2hhci9nZW5ydGMuYwppbmRleCA5ZTFmYzAyLi42OWYwYTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZ2VucnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jCkBAIC0xNzMsNyArMTczLDYgQEAKIHN0YXRpYyBzc2l6ZV90IGdlbl9ydGNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXVuc2lnbmVkIGxvbmcgZGF0YTsKIAlzc2l6ZV90IHJldHZhbDsKIApAQCAtMTgzLDE4ICsxODIsMTAgQEAKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgJiYgIWdlbl9ydGNfaXJxX2RhdGEpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JYWRkX3dhaXRfcXVldWUoJmdlbl9ydGNfd2FpdCwgJndhaXQpOwotCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQotCXdoaWxlICgxKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWRhdGEgPSB4Y2hnKCZnZW5fcnRjX2lycV9kYXRhLCAwKTsKLQkJaWYgKGRhdGEpCi0JCQlicmVhazsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJZ290byBvdXQ7Ci0JCXNjaGVkdWxlKCk7Ci0JfQorCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShnZW5fcnRjX3dhaXQsCisJCQkoZGF0YSA9IHhjaGcoJmdlbl9ydGNfaXJxX2RhdGEsIDApKSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CiAKIAkvKiBmaXJzdCB0ZXN0IGFsbG93cyBvcHRpbWl6ZXIgdG8gbnVrZSB0aGlzIGNhc2UgZm9yIDMyLWJpdCBtYWNoaW5lcyAqLwogCWlmIChzaXplb2YgKGludCkgIT0gc2l6ZW9mIChsb25nKSAmJiBjb3VudCA9PSBzaXplb2YgKHVuc2lnbmVkIGludCkpIHsKQEAgLTIwNiwxMCArMTk3LDcgQEAKIAkJcmV0dmFsID0gcHV0X3VzZXIoZGF0YSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYnVmKSA/OgogCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwogCX0KLSBvdXQ6Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZnZW5fcnRjX3dhaXQsICZ3YWl0KTsKLQorb3V0OgogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKaW5kZXggMzIyYmM1Zi4uODNjMTE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKQEAgLTY3NCwxMSArNjc0LDEyIEBACiAgKiBjYWxsaW5nIGh2Y19wb2xsKCkgd2hvIGRldGVybWluZXMgd2hldGhlciBhIGNvbnNvbGUgYWRhcHRlciBzdXBwb3J0CiAgKiBpbnRlcnJ1cHRzLgogICovCi1pbnQga2h2Y2Qodm9pZCAqdW51c2VkKQorc3RhdGljIGludCBraHZjZCh2b2lkICp1bnVzZWQpCiB7CiAJaW50IHBvbGxfbWFzazsKIAlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCWRvIHsKIAkJcG9sbF9tYXNrID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vaW50ZWwtcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2ludGVsLXJuZy5jCmluZGV4IDRhZTk4MTEuLjc1M2Y0NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vaW50ZWwtcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pbnRlbC1ybmcuYwpAQCAtMjk2LDEyICsyOTYsMTAgQEAKIAkgICAgIChCSU9TX0NOVExfTE9DS19FTkFCTEVfTUFTS3xCSU9TX0NOVExfV1JJVEVfRU5BQkxFX01BU0spKQogCSAgICA9PSBCSU9TX0NOVExfTE9DS19FTkFCTEVfTUFTSykgewogCQlzdGF0aWMgX19pbml0ZGF0YSAvKmNvbnN0Ki8gY2hhciB3YXJuaW5nW10gPQotCQkJS0VSTl9XQVJOSU5HIFBGWCAiRmlybXdhcmUgc3BhY2UgaXMgbG9ja2VkIHJlYWQtb25seS4gIgotCQkJS0VSTl9XQVJOSU5HIFBGWCAiSWYgeW91IGNhbid0IG9yXG4gZG9uJ3Qgd2FudCB0byAiCi0JCQlLRVJOX1dBUk5JTkcgUEZYICJkaXNhYmxlIHRoaXMgaW4gZmlybXdhcmUgc2V0dXAsIGFuZCAiCi0JCQlLRVJOX1dBUk5JTkcgUEZYICJpZlxuIHlvdSBhcmUgY2VydGFpbiB0aGF0IHlvdXIgIgotCQkJS0VSTl9XQVJOSU5HIFBGWCAic3lzdGVtIGhhcyBhIGZ1bmN0aW9uYWxcbiBSTkcsIHRyeSIKLQkJCUtFUk5fV0FSTklORyBQRlggInVzaW5nIHRoZSAnbm9fZndoX2RldGVjdCcgb3B0aW9uLlxuIjsKKwkJCUtFUk5fV0FSTklORyBQRlggIkZpcm13YXJlIHNwYWNlIGlzIGxvY2tlZCByZWFkLW9ubHkuIElmIHlvdSBjYW4ndCBvclxuIgorCQkJS0VSTl9XQVJOSU5HIFBGWCAiZG9uJ3Qgd2FudCB0byBkaXNhYmxlIHRoaXMgaW4gZmlybXdhcmUgc2V0dXAsIGFuZCBpZlxuIgorCQkJS0VSTl9XQVJOSU5HIFBGWCAieW91IGFyZSBjZXJ0YWluIHRoYXQgeW91ciBzeXN0ZW0gaGFzIGEgZnVuY3Rpb25hbFxuIgorCQkJS0VSTl9XQVJOSU5HIFBGWCAiUk5HLCB0cnkgdXNpbmcgdGhlICdub19md2hfZGV0ZWN0JyBvcHRpb24uXG4iOwogCiAJCWlmIChub19md2hfZGV0ZWN0KQogCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuYyBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jCmluZGV4IGRkNzYxYTEuLjYxZWYwMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jCkBAIC00Myw4ICs0Myw2IEBACiBzdGF0aWMgdm9pZCBpaVdyaXRlTWFza0lJKGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIpOwogc3RhdGljIHZvaWQgaWlXcml0ZU1hc2tJSUVYKGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIpOwogCi1zdGF0aWMgdm9pZCBpaTJEZWxheVRpbWVyKHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBpaTJEZWxheVdha2V1cCh1bnNpZ25lZCBsb25nIGlkKTsKIHN0YXRpYyB2b2lkIGlpMk5vcCh2b2lkKTsKIAogLy8qKioqKioqKioqKioqKioKQEAgLTU1LDggKzUzLDYgQEAKIAogc3RhdGljIGludCBpaURlbGF5ZWQ7CS8vIFNldCB3aGVuIHRoZSBpaVJlc2V0RGVsYXkgZnVuY3Rpb24gaXMKIAkJCQkJCQkvLyBjYWxsZWQuIENsZWFyZWQgd2hlbiBBTlkgYm9hcmQgaXMgcmVzZXQuCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgKiBwRGVsYXlUaW1lcjsgICAvLyBVc2VkIGJ5IGlpRGVsYXlUaW1lcgotc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHBEZWxheVdhaXQ7ICAgIC8vIFVzZWQgYnkgaWlEZWxheVRpbWVyCiBzdGF0aWMgcndsb2NrX3QgRGxfc3BpbmxvY2s7CiAKIC8vKioqKioqKioKQEAgLTg2LDkgKzgyLDYgQEAKIHN0YXRpYyB2b2lkCiBpaUVsbGlzSW5pdCh2b2lkKQogewotCXBEZWxheVRpbWVyID0ga21hbGxvYyAoIHNpemVvZiAoc3RydWN0IHRpbWVyX2xpc3QpLCBHRlBfS0VSTkVMICk7Ci0JaW5pdF90aW1lcihwRGVsYXlUaW1lcik7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcERlbGF5V2FpdCk7CiAJTE9DS19JTklUKCZEbF9zcGlubG9jayk7CiB9CiAKQEAgLTEwNiw3ICs5OSw2IEBACiBzdGF0aWMgdm9pZAogaWlFbGxpc0NsZWFudXAodm9pZCkKIHsKLQlrZnJlZShwRGVsYXlUaW1lcik7CiB9CiAKIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01NjAsMTkgKzU1Miw2IEBACiAJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7CiB9CiAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRGVsYXkgUm91dGluZXMKLS8vCi0vLyBpaURlbGF5SU8KLS8vIGlpTm9wCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotc3RhdGljIHZvaWQKLWlpMkRlbGF5V2FrZXVwKHVuc2lnbmVkIGxvbmcgaWQpCi17Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlICggJnBEZWxheVdhaXQgKTsKLX0KLQogLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIC8vIEZ1bmN0aW9uOiAgIGlpMkRlbGF5VGltZXIobXNlY29uZHMpCiAvLyBQYXJhbWV0ZXJzOiBtc2Vjb25kcyAtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkKQEAgLTU5NCwyOCArNTczLDcgQEAKIHN0YXRpYyB2b2lkCiBpaTJEZWxheVRpbWVyKHVuc2lnbmVkIGludCBtc2Vjb25kcykKIHsKLQl3YWl0X3F1ZXVlX3Qgd2FpdDsKLQotCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKLQotCWluaXRfdGltZXIgKCBwRGVsYXlUaW1lciApOwotCi0JYWRkX3dhaXRfcXVldWUoJnBEZWxheVdhaXQsICZ3YWl0KTsKLQotCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKLQotCXBEZWxheVRpbWVyLT5leHBpcmVzICA9IGppZmZpZXMgKyAoIG1zZWNvbmRzICsgOSApIC8gMTA7Ci0JcERlbGF5VGltZXItPmZ1bmN0aW9uID0gaWkyRGVsYXlXYWtldXA7Ci0JcERlbGF5VGltZXItPmRhdGEgICAgID0gMDsKLQotCWFkZF90aW1lciAoIHBEZWxheVRpbWVyICk7Ci0KLQlzY2hlZHVsZSgpOwotCi0Jc2V0X2N1cnJlbnRfc3RhdGUoIFRBU0tfUlVOTklORyApOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZwRGVsYXlXYWl0LCAmd2FpdCk7Ci0KLQlkZWxfdGltZXIgKCBwRGVsYXlUaW1lciApOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKG1zZWNvbmRzKTsKIH0KIAogI2lmIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnCmluZGV4IGI4OTRmNjcuLjBiYWE4ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZwpAQCAtMiwxMSArMiw5IEBACiAjIElQTUkgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiSVBNSSIKLQlkZXBlbmRzIG9uIEhBU19JT01FTQotCi1jb25maWcgSVBNSV9IQU5ETEVSCittZW51Y29uZmlnIElQTUlfSEFORExFUgogICAgICAgIHRyaXN0YXRlICdJUE1JIHRvcC1sZXZlbCBtZXNzYWdlIGhhbmRsZXInCisgICAgICAgZGVwZW5kcyBvbiBIQVNfSU9NRU0KICAgICAgICBoZWxwCiAgICAgICAgICBUaGlzIGVuYWJsZXMgdGhlIGNlbnRyYWwgSVBNSSBtZXNzYWdlIGhhbmRsZXIsIHJlcXVpcmVkIGZvciBJUE1JCiAJIHRvIHdvcmsuCkBAIC0xOCw5ICsxNiwxMCBAQAogCiAJIElmIHVuc3VyZSwgc2F5IE4uCiAKK2lmIElQTUlfSEFORExFUgorCiBjb25maWcgSVBNSV9QQU5JQ19FVkVOVAogICAgICAgIGJvb2wgJ0dlbmVyYXRlIGEgcGFuaWMgZXZlbnQgdG8gYWxsIEJNQ3Mgb24gYSBwYW5pYycKLSAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgogICAgICAgIGhlbHAKICAgICAgICAgIFdoZW4gYSBwYW5pYyBvY2N1cnMsIHRoaXMgd2lsbCBjYXVzZSB0aGUgSVBNSSBtZXNzYWdlIGhhbmRsZXIgdG8KIAkgZ2VuZXJhdGUgYW4gSVBNSSBldmVudCBkZXNjcmliaW5nIHRoZSBwYW5pYyB0byBlYWNoIGludGVyZmFjZQpAQCAtNDAsMTQgKzM5LDEyIEBACiAKIGNvbmZpZyBJUE1JX0RFVklDRV9JTlRFUkZBQ0UKICAgICAgICB0cmlzdGF0ZSAnRGV2aWNlIGludGVyZmFjZSBmb3IgSVBNSScKLSAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgogICAgICAgIGhlbHAKICAgICAgICAgIFRoaXMgcHJvdmlkZXMgYW4gSU9DVEwgaW50ZXJmYWNlIHRvIHRoZSBJUE1JIG1lc3NhZ2UgaGFuZGxlciBzbwogCSB1c2VybGFuZCBwcm9jZXNzZXMgbWF5IHVzZSBJUE1JLiAgSXQgc3VwcG9ydHMgcG9sbCgpIGFuZCBzZWxlY3QoKS4KIAogY29uZmlnIElQTUlfU0kKICAgICAgICB0cmlzdGF0ZSAnSVBNSSBTeXN0ZW0gSW50ZXJmYWNlIGhhbmRsZXInCi0gICAgICAgZGVwZW5kcyBvbiBJUE1JX0hBTkRMRVIKICAgICAgICBoZWxwCiAgICAgICAgICBQcm92aWRlcyBhIGRyaXZlciBmb3IgU3lzdGVtIEludGVyZmFjZXMgKEtDUywgU01JQywgQlQpLgogCSBDdXJyZW50bHksIG9ubHkgS0NTIGFuZCBTTUlDIGFyZSBzdXBwb3J0ZWQuICBJZgpAQCAtNTUsMTUgKzUyLDEzIEBACiAKIGNvbmZpZyBJUE1JX1dBVENIRE9HCiAgICAgICAgdHJpc3RhdGUgJ0lQTUkgV2F0Y2hkb2cgVGltZXInCi0gICAgICAgZGVwZW5kcyBvbiBJUE1JX0hBTkRMRVIKICAgICAgICBoZWxwCiAgICAgICAgICBUaGlzIGVuYWJsZXMgdGhlIElQTUkgd2F0Y2hkb2cgdGltZXIuCiAKIGNvbmZpZyBJUE1JX1BPV0VST0ZGCiAgICAgICAgdHJpc3RhdGUgJ0lQTUkgUG93ZXJvZmYnCi0gICAgICAgZGVwZW5kcyBvbiBJUE1JX0hBTkRMRVIKICAgICAgICBoZWxwCiAgICAgICAgICBUaGlzIGVuYWJsZXMgYSBmdW5jdGlvbiB0byBwb3dlciBvZmYgdGhlIHN5c3RlbSB3aXRoIElQTUkgaWYKIAkgdGhlIElQTUkgbWFuYWdlbWVudCBjb250cm9sbGVyIGlzIGNhcGFibGUgb2YgdGhpcy4KIAotZW5kbWVudQorZW5kaWYgIyBJUE1JX0hBTkRMRVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYwppbmRleCBlMDI4OTNiLi5iODYxODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCkBAIC02NzksNyArNjc5LDcgQEAKIHsKIAlpbnQgcnY7CiAKLQlwcmludGsgKCJDb3B5cmlnaHQgKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSAtIgorCXByaW50ayAoS0VSTl9JTkZPICJDb3B5cmlnaHQgKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSAtIgogCQkiIElQTUkgUG93ZXJkb3duIHZpYSBzeXNfcmVib290LlxuIik7CiAKIAlpZiAocG93ZXJvZmZfcG93ZXJjeWNsZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKaW5kZXggNzhlMWI5Ni4uNGVkZmRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKQEAgLTI4NTcsNyArMjg1Nyw3IEBACiAKIAltdXRleF91bmxvY2soJnNtaV9pbmZvc19sb2NrKTsKIAotCXByaW50aygiIElQTUkgJXMgaW50ZXJmYWNlIGluaXRpYWxpemVkXG4iLHNpX3RvX3N0cltuZXdfc21pLT5zaV90eXBlXSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiSVBNSSAlcyBpbnRlcmZhY2UgaW5pdGlhbGl6ZWRcbiIsc2lfdG9fc3RyW25ld19zbWktPnNpX3R5cGVdKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKaW5kZXggNzYxZjc3Ny4uNzdhN2E0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwpAQCAtMTcxLDkgKzE3MSw2IEBACiBzdGF0aWMgaW50IHByZXZfY2FyZCA9IDM7CS8qCXN0YXJ0IHNlcnZpY2luZyBpc2lfY2FyZFswXQkqLwogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICppc2ljb21fbm9ybWFsOwogCi1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGlzaV90aW1lcmRvbmUpOwotc3RhdGljIGNoYXIgcmVfc2NoZWR1bGUgPSAxOwotCiBzdGF0aWMgdm9pZCBpc2ljb21fdHgodW5zaWduZWQgbG9uZyBfZGF0YSk7CiBzdGF0aWMgdm9pZCBpc2ljb21fc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAKQEAgLTE4Nyw3ICsxODQsNyBAQAogCiBzdHJ1Y3QJaXNpX2JvYXJkIHsKIAl1bnNpZ25lZCBsb25nCQliYXNlOwotCXVuc2lnbmVkIGNoYXIJCWlycTsKKwlpbnQJCQlpcnE7CiAJdW5zaWduZWQgY2hhcgkJcG9ydF9jb3VudDsKIAl1bnNpZ25lZCBzaG9ydAkJc3RhdHVzOwogCXVuc2lnbmVkIHNob3J0CQlwb3J0X3N0YXR1czsgLyogZWFjaCBiaXQgZm9yIGVhY2ggcG9ydCAqLwpAQCAtMjI3LDcgKzIyNCw3IEBACiAgKglpdCB3YW50cyB0byB0YWxrLgogICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IFdhaXRUaWxsQ2FyZElzRnJlZSh1MTYgYmFzZSkKK3N0YXRpYyBpbmxpbmUgaW50IFdhaXRUaWxsQ2FyZElzRnJlZSh1bnNpZ25lZCBsb25nIGJhc2UpCiB7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAl1bnNpZ25lZCBpbnQgYSA9IGluX2F0b21pYygpOyAvKiBkbyB3ZSBydW4gdW5kZXIgc3BpbmxvY2s/ICovCkBAIC0yNDMsMTcgKzI0MCwxOCBAQAogCiBzdGF0aWMgaW50IGxvY2tfY2FyZChzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkKQogewotCWNoYXIJCXJldHJpZXM7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgcmV0cmllcywgYTsKIAotCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDA7IHJldHJpZXMrKykgeworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDsgcmV0cmllcysrKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKLQkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkgewotCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKLQkJCXVkZWxheSgxMDAwKTsgICAvKiAxbXMgKi8KKwkJZm9yIChhID0gMDsgYSA8IDEwOyBhKyspIHsKKwkJCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpCisJCQkJcmV0dXJuIDE7CisJCQl1ZGVsYXkoMTApOwogCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOworCQltc2xlZXAoMTApOwogCX0KIAlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006IEZhaWxlZCB0byBsb2NrIENhcmQgKDB4JWx4KVxuIiwKIAkJY2FyZC0+YmFzZSk7CkBAIC0yNjEsMjMgKzI1OSw2IEBACiAJcmV0dXJuIDA7CS8qIEZhaWxlZCB0byBhY3F1aXJlIHRoZSBjYXJkISAqLwogfQogCi1zdGF0aWMgaW50IGxvY2tfY2FyZF9hdF9pbnRlcnJ1cHQoc3RydWN0IGlzaV9ib2FyZCAqY2FyZCkKLXsKLQl1bnNpZ25lZCBjaGFyCQlyZXRyaWVzOwotCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNhcmQtPmJhc2U7Ci0KLQlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMjAwOyByZXRyaWVzKyspIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOwotCi0JCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7Ci0JfQotCS8qIEZhaWxpbmcgaW4gaW50ZXJydXB0IGlzIGFuIGFjY2VwdGFibGUgZXZlbnQgKi8KLQlyZXR1cm4gMDsJLyogRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGNhcmQhICovCi19Ci0KIHN0YXRpYyB2b2lkIHVubG9ja19jYXJkKHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCiB7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CkBAIC00MTUsNyArMzk2LDkgQEAKIAogc3RhdGljIHZvaWQgaXNpY29tX3R4KHVuc2lnbmVkIGxvbmcgX2RhdGEpCiB7Ci0Jc2hvcnQgY291bnQgPSAoQk9BUkRfQ09VTlQtMSksIGNhcmQsIGJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFncywgYmFzZTsKKwl1bnNpZ25lZCBpbnQgcmV0cmllczsKKwlzaG9ydCBjb3VudCA9IChCT0FSRF9DT1VOVC0xKSwgY2FyZDsKIAlzaG9ydCB0eGNvdW50LCB3cmQsIHJlc2lkdWUsIHdvcmRfY291bnQsIGNudDsKIAlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKQEAgLTQzNSwzMiArNDE4LDM0IEBACiAJY291bnQgPSBpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50OwogCXBvcnQgPSBpc2lfY2FyZFtjYXJkXS5wb3J0czsKIAliYXNlID0gaXNpX2NhcmRbY2FyZF0uYmFzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc2lfY2FyZFtjYXJkXS5jYXJkX2xvY2ssIGZsYWdzKTsKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMTAwOyByZXRyaWVzKyspIHsKKwkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMik7CisJfQorCWlmIChyZXRyaWVzID49IDEwMCkKKwkJZ290byB1bmxvY2s7CisKIAlmb3IgKDtjb3VudCA+IDA7Y291bnQtLSwgcG9ydCsrKSB7Ci0JCWlmICghbG9ja19jYXJkX2F0X2ludGVycnVwdCgmaXNpX2NhcmRbY2FyZF0pKQotCQkJY29udGludWU7CiAJCS8qIHBvcnQgbm90IGFjdGl2ZSBvciB0eCBkaXNhYmxlZCB0byBmb3JjZSBmbG93IGNvbnRyb2wgKi8KIAkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgfHwKIAkJCQkhKHBvcnQtPnN0YXR1cyAmIElTSV9UWE9LKSkKLQkJCXVubG9ja19jYXJkKCZpc2lfY2FyZFtjYXJkXSk7CiAJCQljb250aW51ZTsKIAogCQl0dHkgPSBwb3J0LT50dHk7CiAKLQotCQlpZiAodHR5ID09IE5VTEwpIHsKLQkJCXVubG9ja19jYXJkKCZpc2lfY2FyZFtjYXJkXSk7CisJCWlmICh0dHkgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwotCQl9CiAKIAkJdHhjb3VudCA9IG1pbl90KHNob3J0LCBUWF9TSVpFLCBwb3J0LT54bWl0X2NudCk7Ci0JCWlmICh0eGNvdW50IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCkgewotCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwkJaWYgKHR4Y291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkKQogCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCEoaW53KGJhc2UgKyAweDAyKSAmICgxIDw8IHBvcnQtPmNoYW5uZWwpKSkgewotCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKworCQlpZiAoIShpbncoYmFzZSArIDB4MDIpICYgKDEgPDwgcG9ydC0+Y2hhbm5lbCkpKQogCQkJY29udGludWU7Ci0JCX0KKwogCQlwcl9kYmcoInR4aW5nICVkIGJ5dGVzLCBwb3J0JWQuXG4iLCB0eGNvdW50LAogCQkJcG9ydC0+Y2hhbm5lbCArIDEpOwogCQlvdXR3KChwb3J0LT5jaGFubmVsIDw8IGlzaV9jYXJkW2NhcmRdLnNoaWZ0X2NvdW50KSB8IHR4Y291bnQsCkBAIC01MDgsMTYgKzQ5MywxMiBAQAogCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfVFhPSzsKIAkJaWYgKHBvcnQtPnhtaXRfY250IDw9IFdBS0VVUF9DSEFSUykKIAkJCXR0eV93YWtldXAodHR5KTsKLQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKIAl9CiAKK3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2lfY2FyZFtjYXJkXS5jYXJkX2xvY2ssIGZsYWdzKTsKIAkvKglzY2hlZHVsZSBhbm90aGVyIHR4IGZvciBob3BlZnVsbHkgaW4gYWJvdXQgMTBtcwkqLwogc2NoZWRfYWdhaW46Ci0JaWYgKCFyZV9zY2hlZHVsZSkgewotCQljb21wbGV0ZSgmaXNpX3RpbWVyZG9uZSk7Ci0gCQlyZXR1cm47Ci0JfQotCiAJbW9kX3RpbWVyKCZ0eCwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKIH0KIApAQCAtMTc0OSwxNyArMTczMCwxMyBAQAogc3RhdGljIGludCBfX2RldmluaXQgaXNpY29tX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JdW5zaWduZWQgaW50IGlvYWRkciwgc2lnbmF0dXJlLCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgc2lnbmF0dXJlLCBpbmRleDsKIAlpbnQgcmV0dmFsID0gLUVQRVJNOwotCXU4IHBjaWlycTsKIAlzdHJ1Y3QgaXNpX2JvYXJkICpib2FyZCA9IE5VTEw7CiAKIAlpZiAoY2FyZF9jb3VudCA+PSBCT0FSRF9DT1VOVCkKIAkJZ290byBlcnI7CiAKLQlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyk7Ci0JLyogaS5lIGF0IG9mZnNldCAweDFjIGluIHRoZSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlciBzcGFjZS4gKi8KLQlwY2lpcnEgPSBwZGV2LT5pcnE7CiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIklTSSBQQ0kgQ2FyZChEZXZpY2UgSUQgMHgleClcbiIsIGVudC0+ZGV2aWNlKTsKIAogCS8qIGFsbG90IHRoZSBmaXJzdCBlbXB0eSBzbG90IGluIHRoZSBhcnJheSAqLwpAQCAtMTc3MCw4ICsxNzQ3LDggQEAKIAkJfQogCiAJYm9hcmQtPmluZGV4ID0gaW5kZXg7Ci0JYm9hcmQtPmJhc2UgPSBpb2FkZHI7Ci0JYm9hcmQtPmlycSA9IHBjaWlycTsKKwlib2FyZC0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlib2FyZC0+aXJxID0gcGRldi0+aXJxOwogCWNhcmRfY291bnQrKzsKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBib2FyZCk7CkBAIC0xOTAxLDkgKzE4NzgsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXNpY29tX2V4aXQodm9pZCkKIHsKLQlyZV9zY2hlZHVsZSA9IDA7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlzaV90aW1lcmRvbmUsIEhaKTsKKwlkZWxfdGltZXJfc3luYygmdHgpOwogCiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpc2ljb21fZHJpdmVyKTsKIAl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoaXNpY29tX25vcm1hbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKaW5kZXggN2IyNzlkMS4uM2M2NmY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwpAQCAtMTc1Myw5ICsxNzUzLDYgQEAKIAkJcmV0dXJuOwogCiAJdGlvc3AgPSB0dHktPnRlcm1pb3M7Ci0JaWYgKCh0aW9zcC0+Y19jZmxhZyA9PSBvbGQtPmNfY2ZsYWcpICYmCi0JICAgICh0aW9zcC0+Y19pZmxhZyA9PSBvbGQtPmNfaWZsYWcpKQotCQlyZXR1cm47CiAKIAlzdGxpX21rYXN5cG9ydChwb3J0cCwgJmFwb3J0LCB0aW9zcCk7CiAJc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1NFVFBPUlQsICZhcG9ydCwgc2l6ZW9mKGFzeXBvcnRfdCksIDApOwpAQCAtMjE2NiwxNCArMjE2MywxMCBAQAogCWNka2hkcl90IF9faW9tZW0gKmhkcnA7CiAJY2RrY3RybF90IF9faW9tZW0gKmNwOwogCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqYml0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CiAKIAlpZiAodGVzdF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBjb21tYW5kIGFscmVhZHkgYnVzeSwgY21kPSV4IVxuIiwKIAkJCQkoaW50KSBjbWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmRfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMTk0LDcgKzIxODcsNiBAQAogCXdyaXRlYihyZWFkYihiaXRzKSB8IHBvcnRwLT5wb3J0Yml0LCBiaXRzKTsKIAlzZXRfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSk7CiAJRUJSRERJU0FCTEUoYnJkcCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnJkX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc3RsaV9zZW5kY21kKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKQpAQCAtMzIxOCwxMyArMzIxMCwxMyBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlicmRwLT5pb3NpemUgPSBFQ1BfSU9TSVpFOworCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSwgImlzdGFsbGlvbiIpKSB7CiAJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gZXJyOwogCX0KIAotCWJyZHAtPmlvc2l6ZSA9IEVDUF9JT1NJWkU7Ci0KIC8qCiAgKglCYXNlZCBvbiB0aGUgc3BlY2lmaWMgYm9hcmQgdHlwZSBzZXR1cCB0aGUgY29tbW9uIHZhcnMgdG8gYWNjZXNzCiAgKglhbmQgZW5hYmxlIHNoYXJlZCBtZW1vcnkuIFNldCBhbGwgYm9hcmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gbm93CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCmluZGV4IDkwOTY1YjQuLjJjZTBhZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCisrKyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKiAyMS0wOC0wMjogQ29udmVydGVkIHRvIGlucHV0IEFQSSwgbWFqb3IgY2xlYW51cC4gKFZvanRlY2ggUGF2bGlrKQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KQEAgLTMwOCwxMCArMzA5LDkgQEAKICAqIE1hbnkgb3RoZXIgcm91dGluZXMgZG8gcHV0X3F1ZXVlLCBidXQgSSB0aGluayBlaXRoZXIKICAqIHRoZXkgcHJvZHVjZSBBU0NJSSwgb3IgdGhleSBwcm9kdWNlIHNvbWUgdXNlci1hc3NpZ25lZAogICogc3RyaW5nLCBhbmQgaW4gYm90aCBjYXNlcyB3ZSBtaWdodCBhc3N1bWUgdGhhdCBpdCBpcwotICogaW4gdXRmLTggYWxyZWFkeS4gVVRGLTggaXMgZGVmaW5lZCBmb3Igd29yZHMgb2YgdXAgdG8gMzEgYml0cywKLSAqIGJ1dCB3ZSBuZWVkIG9ubHkgMTYgYml0cyBoZXJlCisgKiBpbiB1dGYtOCBhbHJlYWR5LgogICovCi1zdGF0aWMgdm9pZCB0b191dGY4KHN0cnVjdCB2Y19kYXRhICp2YywgdXNob3J0IGMpCitzdGF0aWMgdm9pZCB0b191dGY4KHN0cnVjdCB2Y19kYXRhICp2YywgdWludCBjKQogewogCWlmIChjIDwgMHg4MCkKIAkJLyogIDAqKioqKioqICovCkBAIC0zMjAsMTEgKzMyMCwyMSBAQAogCQkvKiAxMTAqKioqKiAxMCoqKioqKiAqLwogCQlwdXRfcXVldWUodmMsIDB4YzAgfCAoYyA+PiA2KSk7CiAJCXB1dF9xdWV1ZSh2YywgMHg4MCB8IChjICYgMHgzZikpOwotCX0gZWxzZSB7CisgICAgCX0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHsKKwkgICAgICAgCWlmIChjID49IDB4RDgwMCAmJiBjIDwgMHhFMDAwKQorCQkJcmV0dXJuOworCQlpZiAoYyA9PSAweEZGRkYpCisJCQlyZXR1cm47CiAJCS8qIDExMTAqKioqIDEwKioqKioqIDEwKioqKioqICovCiAJCXB1dF9xdWV1ZSh2YywgMHhlMCB8IChjID4+IDEyKSk7CiAJCXB1dF9xdWV1ZSh2YywgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKIAkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKGMgJiAweDNmKSk7CisgICAgCX0gZWxzZSBpZiAoYyA8IDB4MTEwMDAwKSB7CisJCS8qIDExMTEwKioqIDEwKioqKioqIDEwKioqKioqIDEwKioqKioqICovCisJCXB1dF9xdWV1ZSh2YywgMHhmMCB8IChjID4+IDE4KSk7CisJCXB1dF9xdWV1ZSh2YywgMHg4MCB8ICgoYyA+PiAxMikgJiAweDNmKSk7CisJCXB1dF9xdWV1ZSh2YywgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKKwkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKGMgJiAweDNmKSk7CiAJfQogfQogCkBAIC0zOTMsNyArNDAzLDcgQEAKIAkJcmV0dXJuIGQ7CiAKIAlpZiAoa2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREUpCi0JCXRvX3V0ZjgodmMsIGQpOworCQl0b191dGY4KHZjLCBjb252XzhiaXRfdG9fdW5pKGQpKTsKIAllbHNlIGlmIChkIDwgMHgxMDApCiAJCXB1dF9xdWV1ZSh2YywgZCk7CiAKQEAgLTQwNyw3ICs0MTcsNyBAQAogewogCWlmIChkaWFjcikgewogCQlpZiAoa2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREUpCi0JCQl0b191dGY4KHZjLCBkaWFjcik7CisJCQl0b191dGY4KHZjLCBjb252XzhiaXRfdG9fdW5pKGRpYWNyKSk7CiAJCWVsc2UgaWYgKGRpYWNyIDwgMHgxMDApCiAJCQlwdXRfcXVldWUodmMsIGRpYWNyKTsKIAkJZGlhY3IgPSAwOwpAQCAtNjE3LDcgKzYyNyw3IEBACiAJCXJldHVybjsKIAl9CiAJaWYgKGtiZC0+a2JkbW9kZSA9PSBWQ19VTklDT0RFKQotCQl0b191dGY4KHZjLCB2YWx1ZSk7CisJCXRvX3V0ZjgodmMsIGNvbnZfOGJpdF90b191bmkodmFsdWUpKTsKIAllbHNlIGlmICh2YWx1ZSA8IDB4MTAwKQogCQlwdXRfcXVldWUodmMsIHZhbHVlKTsKIH0KQEAgLTc3NSw3ICs3ODUsNyBAQAogCS8qIGtsdWRnZSAqLwogCWlmICh1cF9mbGFnICYmIHNoaWZ0X3N0YXRlICE9IG9sZF9zdGF0ZSAmJiBucGFkY2ggIT0gLTEpIHsKIAkJaWYgKGtiZC0+a2JkbW9kZSA9PSBWQ19VTklDT0RFKQotCQkJdG9fdXRmOCh2YywgbnBhZGNoICYgMHhmZmZmKTsKKwkJCXRvX3V0ZjgodmMsIG5wYWRjaCk7CiAJCWVsc2UKIAkJCXB1dF9xdWV1ZSh2YywgbnBhZGNoICYgMHhmZik7CiAJCW5wYWRjaCA9IC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21pc2MuYyBiL2RyaXZlcnMvY2hhci9taXNjLmMKaW5kZXggNGU2ZmI5Ni4uNzFjOGNkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21pc2MuYworKysgYi9kcml2ZXJzL2NoYXIvbWlzYy5jCkBAIC02NywyNSArNjcsMTMgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIHZvaWQgKm1pc2Nfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbWlzY2RldmljZSAqcDsKLQlsb2ZmX3Qgb2ZmID0gMDsKLQogCW11dGV4X2xvY2soJm1pc2NfbXR4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZtaXNjX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCpwb3MgPT0gb2ZmKyspIAotCQkJcmV0dXJuIHA7Ci0JfQotCXJldHVybiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmbWlzY19saXN0LCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKm1pc2Nfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKm4gPSAoKHN0cnVjdCBtaXNjZGV2aWNlICopdiktPmxpc3QubmV4dDsKLQotCSsrKnBvczsKLQotCXJldHVybiAobiAhPSAmbWlzY19saXN0KSA/IGxpc3RfZW50cnkobiwgc3RydWN0IG1pc2NkZXZpY2UsIGxpc3QpCi0JCSA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJm1pc2NfbGlzdCwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgbWlzY19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKQEAgLTk1LDcgKzgzLDcgQEAKIAogc3RhdGljIGludCBtaXNjX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewotCWNvbnN0IHN0cnVjdCBtaXNjZGV2aWNlICpwID0gdjsKKwljb25zdCBzdHJ1Y3QgbWlzY2RldmljZSAqcCA9IGxpc3RfZW50cnkodiwgc3RydWN0IG1pc2NkZXZpY2UsIGxpc3QpOwogCiAJc2VxX3ByaW50ZihzZXEsICIlM2kgJXNcbiIsIHAtPm1pbm9yLCBwLT5uYW1lID8gcC0+bmFtZSA6ICIiKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tb3hhLmMgYi9kcml2ZXJzL2NoYXIvbW94YS5jCmluZGV4IGUwZDM1YzIuLmVkNzZmMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tb3hhLmMKKysrIGIvZHJpdmVycy9jaGFyL21veGEuYwpAQCAtMTQwNSw3ICsxNDA1LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbW9uX3N0ciBtb3hhTG9nOwogc3RhdGljIGludCBtb3hhRnVuY1RvdXQgPSBIWiAvIDI7CiAKLXN0YXRpYyB2b2lkIG1veGFkZWxheShpbnQpOwogc3RhdGljIHZvaWQgbW94YWZ1bmModm9pZCBfX2lvbWVtICosIGludCwgdXNob3J0KTsKIHN0YXRpYyB2b2lkIHdhaXRfZmluaXNoKHZvaWQgX19pb21lbSAqKTsKIHN0YXRpYyB2b2lkIGxvd193YXRlcl9jaGVjayh2b2lkIF9faW9tZW0gKik7CkBAIC0yNDA0LDEwICsyNDAzLDEwIEBACiAJb2ZzQWRkciA9IG1veGFfcG9ydHNbcG9ydF0udGFibGVBZGRyOwogCWlmIChtczEwMCkgewogCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZW5kQnJlYWssIE1hZ2ljX2NvZGUpOwotCQltb3hhZGVsYXkobXMxMDAgKiAoSFogLyAxMCkpOworCQltc2xlZXAobXMxMDAgKiAxMCk7CiAJfSBlbHNlIHsKIAkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2VuZEJyZWFrLCBNYWdpY19jb2RlKTsKLQkJbW94YWRlbGF5KEhaIC8gNCk7CS8qIDI1MCBtcyAqLworCQltc2xlZXAoMjUwKTsKIAl9CiAJbW94YWZ1bmMob2ZzQWRkciwgRkNfU3RvcEJyZWFrLCBNYWdpY19jb2RlKTsKIH0KQEAgLTI0NzYsMTggKzI0NzUsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglTdGF0aWMgbG9jYWwgZnVuY3Rpb25zOiAJCQkJCSAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG1veGFkZWxheSAtIGRlbGF5cyBhIHNwZWNpZmllZCBudW1iZXIgdGlja3MKLSAqLwotc3RhdGljIHZvaWQgbW94YWRlbGF5KGludCB0aWNrKQotewotCXVuc2lnbmVkIGxvbmcgc3QsIGV0OwotCi0Jc3QgPSBqaWZmaWVzOwotCWV0ID0gc3QgKyB0aWNrOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBldCkpOwotfQotCiBzdGF0aWMgdm9pZCBtb3hhZnVuYyh2b2lkIF9faW9tZW0gKm9mc0FkZHIsIGludCBjbWQsIHVzaG9ydCBhcmcpCiB7CiAKQEAgLTI1MzUsNyArMjUyMiw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCWJhc2VBZGRyID0gbW94YV9ib2FyZHNbY2FyZG5vXS5iYXNlbWVtOwogCXdyaXRlYihIV19yZXNldCwgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CS8qIHJlc2V0ICovCi0JbW94YWRlbGF5KDEpOwkJLyogZGVsYXkgMTAgbXMgKi8KKwltc2xlZXAoMTApOwogCWZvciAoaSA9IDA7IGkgPCA0MDk2OyBpKyspCiAJCXdyaXRlYigwLCBiYXNlQWRkciArIGkpOwkvKiBjbGVhciBmaXggcGFnZSAqLwogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKQEAgLTI3MTMsNyArMjcwMCw3IEBACiAJCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkgPT0ga2V5Y29kZSkKIAkJCQkJYnJlYWs7Ci0JCQkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCQkJCW1zbGVlcCgxMCk7CiAJCQl9CiAJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkgIT0ga2V5Y29kZSkgewogCQkJCXJldHVybiAoLTEpOwpAQCAtMjcyNSw3ICsyNzEyLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkgPT0ga2V5Y29kZSkKIAkJCQlicmVhazsKLQkJCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwkJCW1zbGVlcCgxMCk7CiAJCX0KIAkJcmV0cnkrKzsKIAl9IHdoaWxlICgocmVhZGIoYmFzZUFkZHIgKyBDMjE4Y2hrc3VtX29rKSAhPSAxKSAmJiAocmV0cnkgPCAzKSk7CkBAIC0yNzM2LDcgKzI3MjMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKIAkJCWJyZWFrOwotCQltb3hhZGVsYXkoMSk7CS8qIGRlbGF5IDEwIG1zICovCisJCW1zbGVlcCgxMCk7CiAJfQogCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKSB7CiAJCXJldHVybiAoLTEpOwpAQCAtMjc0Niw3ICsyNzMzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCiAJCQlicmVhazsKLQkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCQltc2xlZXAoMTApOwogCX0KIAlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkgewogCQlyZXR1cm4gKC0xKTsKQEAgLTI3ODgsNyArMjc3NSw3IEBACiAJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewogCQkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSA9PSBDMzIwX0tleUNvZGUpCiAJCQkJCWJyZWFrOwotCQkJCW1veGFkZWxheSgxKTsKKwkJCQltc2xlZXAoMTApOwogCQkJfQogCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzMyMF9rZXkpICE9IEMzMjBfS2V5Q29kZSkKIAkJCQlyZXR1cm4gKC0xKTsKQEAgLTI3OTksNyArMjc4Niw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMzIwX2tleSkgPT0gQzMyMF9LZXlDb2RlKQogCQkJCWJyZWFrOwotCQkJbW94YWRlbGF5KDEpOworCQkJbXNsZWVwKDEwKTsKIAkJfQogCQlyZXRyeSsrOwogCX0gd2hpbGUgKChyZWFkYihiYXNlQWRkciArIEMzMjBjaGtzdW1fb2spICE9IDEpICYmIChyZXRyeSA8IDMpKTsKQEAgLTI4MDksNyArMjc5Niw3IEBACiAJZm9yIChpID0gMDsgaSA8IDYwMDsgaSsrKSB7CiAJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQogCQkJYnJlYWs7Ci0JCW1veGFkZWxheSgxKTsKKwkJbXNsZWVwKDEwKTsKIAl9CiAJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpCiAJCXJldHVybiAoLTEwMCk7CkBAIC0yODI4LDcgKzI4MTUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgewogCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKIAkJCWJyZWFrOwotCQltb3hhZGVsYXkoMSk7CisJCW1zbGVlcCgxMCk7CiAJfQogCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKQogCQlyZXR1cm4gKC0xMDIpOwpAQCAtMjg0Miw3ICsyODI5LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKIAkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCiAJCQlicmVhazsKLQkJbW94YWRlbGF5KDEpOworCQltc2xlZXAoMTApOwogCX0KIAlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKIAkJcmV0dXJuICgtMTAyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tc3BlYy5jIGIvZHJpdmVycy9jaGFyL21zcGVjLmMKaW5kZXggN2FjMzA2MS4uYzcxNmVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21zcGVjLmMKKysrIGIvZHJpdmVycy9jaGFyL21zcGVjLmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogCXZkYXRhLT5yZWZjbnQgPSBBVE9NSUNfSU5JVCgxKTsKIAl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHZkYXRhOwogCi0Jdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9MT0NLRUQgfCBWTV9SRVNFUlZFRCB8IFZNX1BGTk1BUCk7CisJdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9SRVNFUlZFRCB8IFZNX1BGTk1BUCk7CiAJaWYgKHZkYXRhLT50eXBlID09IE1TUEVDX0ZFVENIT1AgfHwgdmRhdGEtPnR5cGUgPT0gTVNQRUNfVU5DQUNIRUQpCiAJCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CiAJdm1hLT52bV9vcHMgPSAmbXNwZWNfdm1fb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyLmMgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwppbmRleCA1OTUzYTQ1Li4yYWVlM2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXhzZXIuYworKysgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwpAQCAtOTAsOCArOTAsNiBAQAogI2RlZmluZSBVQVJUX01DUl9BRkUJCTB4MjAKICNkZWZpbmUgVUFSVF9MU1JfU1BFQ0lBTAkweDFFCiAKLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpCShpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0t8XAotCQkJCQkgIElYT058SVhPRkYpKQogCiAjZGVmaW5lIElSUV9UKGluZm8pICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TSEFSRV9JUlEpID8gSVJRRl9TSEFSRUQgOiBJUlFGX0RJU0FCTEVEKQogCkBAIC0xNzI5LDE2ICsxNzI3LDEyIEBACiAJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSB8fAotCQkJKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgIT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CiAKLQkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKLQotCQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKLQkJCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7Ci0JCQl0dHktPmh3X3N0b3BwZWQgPSAwOwotCQkJbXhzZXJfc3RhcnQodHR5KTsKLQkJfQorCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlteHNlcl9zdGFydCh0dHkpOwogCX0KIAogLyogSGFuZGxlIHN3IHN0b3BwZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlcl9uZXcuYyBiL2RyaXZlcnMvY2hhci9teHNlcl9uZXcuYwppbmRleCA2Y2RlNDQ4Li42YTU2MzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXhzZXJfbmV3LmMKKysrIGIvZHJpdmVycy9jaGFyL214c2VyX25ldy5jCkBAIC03Miw4ICs3Miw2IEBACiAjZGVmaW5lIFVBUlRfTUNSX0FGRQkJMHgyMAogI2RlZmluZSBVQVJUX0xTUl9TUEVDSUFMCTB4MUUKIAotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykJKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDS3xcCi0JCQkJCSAgSVhPTnxJWE9GRikpCiAKICNkZWZpbmUgQzE2OF9BU0lDX0lEICAgIDEKICNkZWZpbmUgQzEwNF9BU0lDX0lEICAgIDIKQEAgLTE1NjAsNyArMTU1OCw3IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIDA7CiAJY2FzZSBNT1hBX0FTUFBfTU9OX0VYVDogewotCQlpbnQgc3RhdHVzLCBwLCBzaGlmdGJpdDsKKwkJaW50IHAsIHNoaWZ0Yml0OwogCQl1bnNpZ25lZCBsb25nIG9wbW9kZTsKIAkJdW5zaWduZWQgY2ZsYWcsIGlmbGFnOwogCkBAIC0xOTkwLDE4ICsxOTg4LDE0IEBACiAJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19jZmxhZykgfHwKLQkJCShSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpICE9IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0KLQkJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCi0JCQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgewotCQkJdHR5LT5od19zdG9wcGVkID0gMDsKLQkJCW14c2VyX3N0YXJ0KHR0eSk7Ci0JCX0KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKwkJCSEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJbXhzZXJfc3RhcnQodHR5KTsKIAl9CiAKIAkvKiBIYW5kbGUgc3cgc3RvcHBlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25faGRsYy5jIGIvZHJpdmVycy9jaGFyL25faGRsYy5jCmluZGV4IDMzN2E4N2YuLmU4MzMyZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX2hkbGMuYworKysgYi9kcml2ZXJzL2NoYXIvbl9oZGxjLmMKQEAgLTQwMCw3ICs0MDAsMTIgQEAKIAkJLyogU2VuZCB0aGUgbmV4dCBibG9jayBvZiBkYXRhIHRvIGRldmljZSAqLwogCQl0dHktPmZsYWdzIHw9ICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOwogCQlhY3R1YWwgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCB0YnVmLT5idWYsIHRidWYtPmNvdW50KTsKLQkJICAgIAorCisJCS8qIHJvbGxiYWNrIHdhcyBwb3NzaWJsZSBhbmQgaGFzIGJlZW4gZG9uZSAqLworCQlpZiAoYWN0dWFsID09IC1FUkVTVEFSVFNZUykgeworCQkJbl9oZGxjLT50YnVmID0gdGJ1ZjsKKwkJCWJyZWFrOworCQl9CiAJCS8qIGlmIHRyYW5zbWl0IGVycm9yLCB0aHJvdyBmcmFtZSBhd2F5IGJ5ICovCiAJCS8qIHByZXRlbmRpbmcgaXQgd2FzIGFjY2VwdGVkIGJ5IGRyaXZlciAqLwogCQlpZiAoYWN0dWFsIDwgMCkKQEAgLTc4MCwxMyArNzg1LDE0IEBACiAJCXBvbGxfd2FpdChmaWxwLCAmdHR5LT53cml0ZV93YWl0LCB3YWl0KTsKIAogCQkvKiBzZXQgYml0cyBmb3Igb3BlcmF0aW9ucyB0aGF0IHdvbid0IGJsb2NrICovCi0JCWlmKG5faGRsYy0+cnhfYnVmX2xpc3QuaGVhZCkKKwkJaWYgKG5faGRsYy0+cnhfYnVmX2xpc3QuaGVhZCkKIAkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsJLyogcmVhZGFibGUgKi8KIAkJaWYgKHRlc3RfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKSkKIAkJCW1hc2sgfD0gUE9MTEhVUDsKLQkJaWYodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCiAJCQltYXNrIHw9IFBPTExIVVA7Ci0JCWlmKG5faGRsYy0+dHhfZnJlZV9idWZfbGlzdC5oZWFkKQorCQlpZiAoIXR0eV9pc193cml0ZWxvY2tlZCh0dHkpICYmCisJCQkJbl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0LmhlYWQpCiAJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwkvKiB3cml0YWJsZSAqLwogCX0KIAlyZXR1cm4gbWFzazsKQEAgLTg2MSw3ICs4NjcsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5zcGlubG9jayxmbGFncyk7CiAJCiAJYnVmLT5saW5rPU5VTEw7Ci0JaWYobGlzdC0+dGFpbCkKKwlpZiAobGlzdC0+dGFpbCkKIAkJbGlzdC0+dGFpbC0+bGluayA9IGJ1ZjsKIAllbHNlCiAJCWxpc3QtPmhlYWQgPSBidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwppbmRleCAxNDU1N2E0Li42YjkxOGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKQEAgLTEwNzEsOCArMTA3MSw2IEBACiAJc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OwogCXN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnOwogCXN0cnVjdCByMzk2NF9jbGllbnRfbWVzc2FnZSB0aGVNc2c7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0KIAlpbnQgY291bnQ7CiAKIAlUUkFDRV9MKCJyZWFkKCkiKTsKQEAgLTEwODYsMTYgKzEwODQsOCBAQAogCQkJCXJldHVybiAtRUFHQUlOOwogCQkJfQogCQkJLyogYmxvY2sgdW50aWwgdGhlcmUgaXMgYSBtZXNzYWdlOiAqLwotCQkJYWRkX3dhaXRfcXVldWUoJnBJbmZvLT5yZWFkX3dhaXQsICZ3YWl0KTsKLXJlcGVhdDoKLQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXBNc2cgPSByZW1vdmVfbXNnKHBJbmZvLCBwQ2xpZW50KTsKLQkJCWlmICghcE1zZyAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlzY2hlZHVsZSgpOwotCQkJCWdvdG8gcmVwZWF0OwotCQkJfQotCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBJbmZvLT5yZWFkX3dhaXQsICZ3YWl0KTsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwSW5mby0+cmVhZF93YWl0LAorCQkJCQkocE1zZyA9IHJlbW92ZV9tc2cocEluZm8sIHBDbGllbnQpKSk7CiAJCX0KIAogCQkvKiBJZiB3ZSBzdGlsbCBoYXZlbid0IGdvdCBhIG1lc3NhZ2UsIHdlIG11c3QgaGF2ZSBiZWVuIHNpZ25hbGxlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25fdHR5LmMgYi9kcml2ZXJzL2NoYXIvbl90dHkuYwppbmRleCAxNTRmNDIyLi4wMzgwNTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbl90dHkuYworKysgYi9kcml2ZXJzL2NoYXIvbl90dHkuYwpAQCAtNDUsNiArNDUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTc4LDYgKzgwLDEzIEBACiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYnVmKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdHR5X3B1dF91c2VyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgeCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqcHRyKQoreworCXR0eV9hdWRpdF9hZGRfZGF0YSh0dHksICZ4LCAxKTsKKwlyZXR1cm4gcHV0X3VzZXIoeCwgcHRyKTsKK30KKwogLyoqCiAgKgluX3R0eV9zZXRfX3Jvb20JLQlyZWNlaXZlIHNwYWNlCiAgKglAdHR5OiB0ZXJtaW5hbApAQCAtMTE1Myw2ICsxMTYyLDcgQEAKIAlpZiAobikgewogCQlyZXR2YWwgPSBjb3B5X3RvX3VzZXIoKmIsICZ0dHktPnJlYWRfYnVmW3R0eS0+cmVhZF90YWlsXSwgbik7CiAJCW4gLT0gcmV0dmFsOworCQl0dHlfYXVkaXRfYWRkX2RhdGEodHR5LCAmdHR5LT5yZWFkX2J1Zlt0dHktPnJlYWRfdGFpbF0sIG4pOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJdHR5LT5yZWFkX3RhaWwgPSAodHR5LT5yZWFkX3RhaWwgKyBuKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKIAkJdHR5LT5yZWFkX2NudCAtPSBuOwpAQCAtMTI3OSw3ICsxMjg5LDcgQEAKIAkJCQlicmVhazsKIAkJCWNzID0gdHR5LT5saW5rLT5jdHJsX3N0YXR1czsKIAkJCXR0eS0+bGluay0+Y3RybF9zdGF0dXMgPSAwOwotCQkJaWYgKHB1dF91c2VyKGNzLCBiKyspKSB7CisJCQlpZiAodHR5X3B1dF91c2VyKHR0eSwgY3MsIGIrKykpIHsKIAkJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJCWItLTsKIAkJCQlicmVhazsKQEAgLTEzMjEsNyArMTMzMSw3IEBACiAKIAkJLyogRGVhbCB3aXRoIHBhY2tldCBtb2RlLiAqLwogCQlpZiAodHR5LT5wYWNrZXQgJiYgYiA9PSBidWYpIHsKLQkJCWlmIChwdXRfdXNlcihUSU9DUEtUX0RBVEEsIGIrKykpIHsKKwkJCWlmICh0dHlfcHV0X3VzZXIodHR5LCBUSU9DUEtUX0RBVEEsIGIrKykpIHsKIAkJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJCWItLTsKIAkJCQlicmVhazsKQEAgLTEzNTIsMTUgKzEzNjIsMTcgQEAKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOwogCiAJCQkJaWYgKCFlb2wgfHwgKGMgIT0gX19ESVNBQkxFRF9DSEFSKSkgewotCQkJCQlpZiAocHV0X3VzZXIoYywgYisrKSkgeworCQkJCQlpZiAodHR5X3B1dF91c2VyKHR0eSwgYywgYisrKSkgewogCQkJCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCQkJCWItLTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCW5yLS07CiAJCQkJfQotCQkJCWlmIChlb2wpCisJCQkJaWYgKGVvbCkgeworCQkJCQl0dHlfYXVkaXRfcHVzaCh0dHkpOwogCQkJCQlicmVhazsKKwkJCQl9CiAJCQl9CiAJCQlpZiAocmV0dmFsKQogCQkJCWJyZWFrOwpAQCAtMTUzOCw3ICsxNTUwLDggQEAKIAkJZWxzZQogCQkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSAxOwogCX0KLQlpZiAodHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpIDwgV0FLRVVQX0NIQVJTICYmCisJaWYgKCF0dHlfaXNfd3JpdGVsb2NrZWQodHR5KSAmJgorCQkJdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpIDwgV0FLRVVQX0NIQVJTICYmCiAJCQl0dHktPmRyaXZlci0+d3JpdGVfcm9vbSh0dHkpID4gMCkKIAkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKIAlyZXR1cm4gbWFzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9udnJhbS5jIGIvZHJpdmVycy9jaGFyL252cmFtLmMKaW5kZXggMjA0ZGVhYS4uOThkZWMzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL252cmFtLmMKKysrIGIvZHJpdmVycy9jaGFyL252cmFtLmMKQEAgLTQyLDE5ICs0MiwxMiBAQAogCiAjZGVmaW5lIFBDCQkxCiAjZGVmaW5lIEFUQVJJCQkyCi0jZGVmaW5lIENPQkFMVAkJMwogCiAvKiBzZWxlY3QgbWFjaGluZSBjb25maWd1cmF0aW9uICovCiAjaWYgZGVmaW5lZChDT05GSUdfQVRBUkkpCiAjICBkZWZpbmUgTUFDSCBBVEFSSQogI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fYXJtX18pICAvKiBhbmQgb3RoZXJzPz8gKi8KLSNkZWZpbmUgTUFDSCBQQwotIyAgaWYgZGVmaW5lZChDT05GSUdfQ09CQUxUKQotIyAgICBpbmNsdWRlIDxsaW51eC9jb2JhbHQtbnZyYW0uaD4KLSMgICAgZGVmaW5lIE1BQ0ggQ09CQUxUCi0jICBlbHNlCi0jICAgIGRlZmluZSBNQUNIIFBDCi0jICBlbmRpZgorIyAgZGVmaW5lIE1BQ0ggUEMKICNlbHNlCiAjICBlcnJvciBDYW5ub3QgYnVpbGQgbnZyYW0gZHJpdmVyIGZvciB0aGlzIG1hY2hpbmUgY29uZmlndXJhdGlvbi4KICNlbmRpZgpAQCAtNzYsMTggKzY5LDYgQEAKIAogI2VuZGlmCiAKLSNpZiBNQUNIID09IENPQkFMVAotCi0jZGVmaW5lIENIRUNLX0RSSVZFUl9JTklUKCkgICAgIDEKLQotI2RlZmluZSBOVlJBTV9CWVRFUwkJKDEyOC1OVlJBTV9GSVJTVF9CWVRFKQotCi0jZGVmaW5lIG1hY2hfY2hlY2tfY2hlY2tzdW0JY29iYWx0X2NoZWNrX2NoZWNrc3VtCi0jZGVmaW5lIG1hY2hfc2V0X2NoZWNrc3VtCWNvYmFsdF9zZXRfY2hlY2tzdW0KLSNkZWZpbmUgbWFjaF9wcm9jX2luZm9zCQljb2JhbHRfcHJvY19pbmZvcwotCi0jZW5kaWYKLQogI2lmIE1BQ0ggPT0gQVRBUkkKIAogLyogU3BlY2lhbCBwYXJhbWV0ZXJzIGZvciBSVEMgaW4gQXRhcmkgbWFjaGluZXMgKi8KQEAgLTYwNCwxNzcgKzU4NSw2IEBACiAKICNlbmRpZiAvKiBNQUNIID09IFBDICovCiAKLSNpZiBNQUNIID09IENPQkFMVAotCi0vKiB0aGUgY29iYWx0IENNT1MgaGFzIGEgd2lkZXIgcmFuZ2Ugb2YgaXRzIGNoZWNrc3VtICovCi1zdGF0aWMgaW50IGNvYmFsdF9jaGVja19jaGVja3N1bSh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgZXhwZWN0OwotCi0JZm9yIChpID0gQ09CVF9DTU9TX0NLU19TVEFSVDsgaSA8PSBDT0JUX0NNT1NfQ0tTX0VORDsgKytpKSB7Ci0JCWlmICgoaSA9PSBDT0JUX0NNT1NfQ0hFQ0tTVU0pIHx8IChpID09IChDT0JUX0NNT1NfQ0hFQ0tTVU0rMSkpKQotCQkJY29udGludWU7Ci0KLQkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOwotCX0KLQlleHBlY3QgPSBfX252cmFtX3JlYWRfYnl0ZShDT0JUX0NNT1NfQ0hFQ0tTVU0pIDw8IDggfAotCSAgICBfX252cmFtX3JlYWRfYnl0ZShDT0JUX0NNT1NfQ0hFQ0tTVU0rMSk7Ci0JcmV0dXJuICgoc3VtICYgMHhmZmZmKSA9PSBleHBlY3QpOwotfQotCi1zdGF0aWMgdm9pZCBjb2JhbHRfc2V0X2NoZWNrc3VtKHZvaWQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKLQotCWZvciAoaSA9IENPQlRfQ01PU19DS1NfU1RBUlQ7IGkgPD0gQ09CVF9DTU9TX0NLU19FTkQ7ICsraSkgewotCQlpZiAoKGkgPT0gQ09CVF9DTU9TX0NIRUNLU1VNKSB8fCAoaSA9PSAoQ09CVF9DTU9TX0NIRUNLU1VNKzEpKSkKLQkJCWNvbnRpbnVlOwotCi0JCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKLQl9Ci0KLQlfX252cmFtX3dyaXRlX2J5dGUoc3VtID4+IDgsIENPQlRfQ01PU19DSEVDS1NVTSk7Ci0JX19udnJhbV93cml0ZV9ieXRlKHN1bSAmIDB4ZmYsIENPQlRfQ01PU19DSEVDS1NVTSsxKTsKLX0KLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0KLXN0YXRpYyBpbnQgY29iYWx0X3Byb2NfaW5mb3ModW5zaWduZWQgY2hhciAqbnZyYW0sIGNoYXIgKmJ1ZmZlciwgaW50ICpsZW4sCi0Jb2ZmX3QgKmJlZ2luLCBvZmZfdCBvZmZzZXQsIGludCBzaXplKQotewotCWludCBpOwotCXVuc2lnbmVkIGludCBjaGVja3N1bTsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0JY2hhciBzZXJudW1bMTRdOwotCWNoYXIgKmtleSA9ICJjTm9FYlRhV2xPdFIhIjsKLQl1bnNpZ25lZCBjaGFyIGJ0b19jc3VtOwotCi0Jc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOwotCWNoZWNrc3VtID0gX19udnJhbV9jaGVja19jaGVja3N1bSgpOwotCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwotCi0JUFJJTlRfUFJPQygiQ2hlY2tzdW0gc3RhdHVzOiAlc3ZhbGlkXG4iLCBjaGVja3N1bSA/ICIiIDogIm5vdCAiKTsKLQotCWZsYWdzID0gbnZyYW1bQ09CVF9DTU9TX0ZMQUdfQllURV8wXSA8PCA4IAotCSAgICB8IG52cmFtW0NPQlRfQ01PU19GTEFHX0JZVEVfMV07Ci0KLQlQUklOVF9QUk9DKCJDb25zb2xlOiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfQ09OU09MRV9GTEFHID8gICJvbiI6ICJvZmYiKTsKLQotCVBSSU5UX1BST0MoIkZpcm13YXJlIERlYnVnIE1lc3NhZ2VzOiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfREVCVUdfRkxBRyA/ICJvbiI6ICJvZmYiKTsKLQotCVBSSU5UX1BST0MoIkF1dG8gUHJvbXB0OiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfQVVUT19QUk9NUFRfRkxBRyA/ICJvbiI6ICJvZmYiKTsKLQotCVBSSU5UX1BST0MoIlNodXRkb3duIFN0YXR1czogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX0NMRUFOX0JPT1RfRkxBRyA/ICJjbGVhbiI6ICJkaXJ0eSIpOwotCi0JUFJJTlRfUFJPQygiSGFyZHdhcmUgUHJvYmU6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19IV19OT1BST0JFX0ZMQUcgPyAicGFydGlhbCI6ICJmdWxsIik7Ci0KLQlQUklOVF9QUk9DKCJTeXN0ZW0gRmF1bHQ6ICVzZGV0ZWN0ZWRcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX1NZU0ZBVUxUX0ZMQUcgPyAiIjogIm5vdCAiKTsKLQotCVBSSU5UX1BST0MoIlBhbmljIG9uIE9PUFM6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19PT1BTUEFOSUNfRkxBRyA/ICJ5ZXMiOiAibm8iKTsKLQotCVBSSU5UX1BST0MoIkRlbGF5ZWQgQ2FjaGUgSW5pdGlhbGl6YXRpb246ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19ERUxBWV9DQUNIRV9GTEFHID8gInllcyI6ICJubyIpOwotCi0JUFJJTlRfUFJPQygiU2hvdyBMb2dvIGF0IEJvb3Q6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19OT0xPR09fRkxBRyA/ICJubyI6ICJ5ZXMiKTsKLQotCVBSSU5UX1BST0MoIkJvb3QgTWV0aG9kOiAiKTsKLQlzd2l0Y2ggKG52cmFtW0NPQlRfQ01PU19CT09UX01FVEhPRF0pIHsKLQljYXNlIENPQlRfQ01PU19CT09UX01FVEhPRF9ESVNLOgotCQlQUklOVF9QUk9DKCJkaXNrXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENPQlRfQ01PU19CT09UX01FVEhPRF9ST006Ci0JCVBSSU5UX1BST0MoInJvbVxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfTkVUOgotCQlQUklOVF9QUk9DKCJuZXRcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVBSSU5UX1BST0MoInVua25vd25cbiIpOwotCQlicmVhazsKLQl9Ci0KLQlQUklOVF9QUk9DKCJQcmltYXJ5IEJvb3QgRGV2aWNlOiAlZDolZFxuIiwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMF9NQUpdLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYwX01JTl0gKTsKLQlQUklOVF9QUk9DKCJTZWNvbmRhcnkgQm9vdCBEZXZpY2U6ICVkOiVkXG4iLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYxX01BSl0sCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjFfTUlOXSApOwotCVBSSU5UX1BST0MoIlRlcnRpYXJ5IEJvb3QgRGV2aWNlOiAlZDolZFxuIiwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMl9NQUpdLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYyX01JTl0gKTsKLQotCVBSSU5UX1BST0MoIlVwdGltZTogJWRcbiIsCi0JCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfMF0gPDwgMjQgfAotCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzFdIDw8IDE2IHwKLQkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8yXSA8PCA4ICB8Ci0JCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfM10pOwotCi0JUFJJTlRfUFJPQygiQm9vdCBDb3VudDogJWRcbiIsCi0JCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfMF0gPDwgMjQgfAotCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzFdIDw8IDE2IHwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8yXSA8PCA4ICB8Ci0JCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfM10pOwotCi0JLyogMTMgYnl0ZXMgb2Ygc2VyaWFsIG51bSAqLwotCWZvciAoaT0wIDsgaTwxMyA7IGkrKykgewotCQlzZXJudW1baV0gPSBudnJhbVtDT0JUX0NNT1NfU1lTX1NFUk5VTV8wICsgaV07Ci0JfQotCXNlcm51bVsxM10gPSAnXDAnOwotCi0JY2hlY2tzdW0gPSAwOwotCWZvciAoaT0wIDsgaTwxMyA7IGkrKykgewotCQljaGVja3N1bSArPSBzZXJudW1baV0gXiBrZXlbaV07Ci0JfQotCWNoZWNrc3VtID0gKChjaGVja3N1bSAmIDB4N2YpIF4gKDB4ZDYpKSAmIDB4ZmY7Ci0KLQlQUklOVF9QUk9DKCJTZXJpYWwgTnVtYmVyOiAlcyIsIHNlcm51bSk7Ci0JaWYgKGNoZWNrc3VtICE9IG52cmFtW0NPQlRfQ01PU19TWVNfU0VSTlVNX0NTVU1dKSB7Ci0JCVBSSU5UX1BST0MoIiAoaW52YWxpZCBjaGVja3N1bSkiKTsKLQl9Ci0JUFJJTlRfUFJPQygiXG4iKTsKLQotCVBSSU5UX1BST0MoIlJvbSBSZXZpc29uOiAlZC4lZC4lZFxuIiwgbnZyYW1bQ09CVF9DTU9TX1JPTV9SRVZfTUFKXSwKLQkJbnZyYW1bQ09CVF9DTU9TX1JPTV9SRVZfTUlOXSwgbnZyYW1bQ09CVF9DTU9TX1JPTV9SRVZfUkVWXSk7Ci0KLQlQUklOVF9QUk9DKCJCVE8gU2VydmVyOiAlZC4lZC4lZC4lZCIsIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMF0sCi0JCW52cmFtW0NPQlRfQ01PU19CVE9fSVBfMV0sIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMl0sCi0JCW52cmFtW0NPQlRfQ01PU19CVE9fSVBfM10pOwotCWJ0b19jc3VtID0gbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8wXSArIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMV0KLQkJKyBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzJdICsgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8zXTsKLQlpZiAoYnRvX2NzdW0gIT0gbnZyYW1bQ09CVF9DTU9TX0JUT19JUF9DU1VNXSkgewotCQlQUklOVF9QUk9DKCIgKGludmFsaWQgY2hlY2tzdW0pIik7Ci0JfQotCVBSSU5UX1BST0MoIlxuIik7Ci0KLQlpZiAoZmxhZ3MgJiBDT0JUX0NNT1NfVkVSU0lPTl9GTEFHCi0JICYmIG52cmFtW0NPQlRfQ01PU19WRVJTSU9OXSA+PSBDT0JUX0NNT1NfVkVSX0JUT0NPREUpIHsKLQkJUFJJTlRfUFJPQygiQlRPIENvZGU6IDB4JXhcbiIsCi0JCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfMF0gPDwgMjQgfAotCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzFdIDw8IDE2IHwKLQkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8yXSA8PCA4IHwKLQkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8zXSk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KLQotI2VuZGlmIC8qIE1BQ0ggPT0gQ09CQUxUICovCi0KICNpZiBNQUNIID09IEFUQVJJCiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaXNjb204LmMgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCmluZGV4IDM0OTRlM2YuLmIzN2U2MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaXNjb204LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpc2NvbTguYwpAQCAtMjEzLDE0ICsyMTMsNiBAQAogCQlyZWxlYXNlX3JlZ2lvbihSQ19UT19JU0EocmNfaW9wb3J0W2ldKSArIGJwLT5iYXNlLCAxKTsKIH0KIAkKLS8qIE11c3QgYmUgY2FsbGVkIHdpdGggZW5hYmxlZCBpbnRlcnJ1cHRzICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmNfbG9uZ19kZWxheSh1bnNpZ25lZCBsb25nIGRlbGF5KQotewotCXVuc2lnbmVkIGxvbmcgaTsKLQkKLQlmb3IgKGkgPSBqaWZmaWVzICsgZGVsYXk7IHRpbWVfYWZ0ZXIoaSxqaWZmaWVzKTsgKSA7Ci19Ci0KIC8qIFJlc2V0IGFuZCBzZXR1cCBDRDE4MCBjaGlwICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcmNfaW5pdF9DRDE4MChzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCiB7CkBAIC0yMzEsNyArMjIzLDcgQEAKIAlyY193YWl0X0NDUihicCk7CQkJICAgLyogV2FpdCBmb3IgQ0NSIHJlYWR5ICAgICAgICAqLwogCXJjX291dChicCwgQ0QxODBfQ0NSLCBDQ1JfSEFSRFJFU0VUKTsgICAgICAvKiBSZXNldCBDRDE4MCBjaGlwICAgICAgICAgICovCiAJc3RpKCk7Ci0JcmNfbG9uZ19kZWxheShIWi8yMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KKwltc2xlZXAoNTApOwkJCQkgICAvKiBEZWxheSAwLjA1IHNlYyAgICAgICAgICAgICovCiAJY2xpKCk7CiAJcmNfb3V0KGJwLCBDRDE4MF9HSVZSLCBSQ19JRCk7ICAgICAgICAgICAgIC8qIFNldCBJRCBmb3IgdGhpcyBjaGlwICAgICAgKi8KIAlyY19vdXQoYnAsIENEMTgwX0dJQ1IsIDApOyAgICAgICAgICAgICAgICAgLyogQ2xlYXIgYWxsIGJpdHMgICAgICAgICAgICAqLwpAQCAtMjgwLDcgKzI3Miw3IEBACiAJCXJjX3dhaXRfQ0NSKGJwKTsKIAkJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9UWEVOKTsgICAgICAgIC8qIEVuYWJsZSB0cmFuc21pdHRlciAgICAgKi8KIAkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIElFUl9UWFJEWSk7ICAgICAgIC8qIEVuYWJsZSB0eCBlbXB0eSBpbnRyICAgKi8KLQkJcmNfbG9uZ19kZWxheShIWi8yMCk7CSAgICAgICAJCQorCQltc2xlZXAoNTApOwogCQlpcnFzID0gcHJvYmVfaXJxX29mZihpcnFzKTsKIAkJdmFsMSA9IHJjX2luKGJwLCBSQ19CU1IpOwkJLyogR2V0IEJvYXJkIFN0YXR1cyByZWcgICAqLwogCQl2YWwyID0gcmNfaW4oYnAsIFJDX0FDS19USU5UKTsgICAgICAgICAgLyogQUNLIGludGVycnVwdCAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JvY2tldC5jIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCmluZGV4IGEzZmQ3ZTcuLjAyNzAwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yb2NrZXQuYworKysgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKQEAgLTE3MDIsNyArMTcwMiw4IEBACiAJaWYgKGNvdW50IDw9IDAgfHwgcm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF93cml0ZSIpKQogCQlyZXR1cm4gMDsKIAotCW11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaW5mby0+d3JpdGVfbXR4KTsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpbmZvLT53cml0ZV9tdHgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAjaWZkZWYgUk9DS0VUX0RFQlVHX1dSSVRFCiAJcHJpbnRrKEtFUk5fSU5GTyAicnBfd3JpdGUgJWQgY2hhcnMuLi4iLCBjb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcnRjLmMgYi9kcml2ZXJzL2NoYXIvcnRjLmMKaW5kZXggMjAzODBhMi4uMjJjZjdhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3J0Yy5jCisrKyBiL2RyaXZlcnMvY2hhci9ydGMuYwpAQCAtMTE1OSw3ICsxMTU5LDggQEAKIAogCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAicnRjOiBsb3N0IHNvbWUgaW50ZXJydXB0cyBhdCAlbGRIei5cbiIsIGZyZXEpOworCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJ0YzogbG9zdCBzb21lIGludGVycnVwdHMgYXQgJWxkSHouXG4iLCBmcmVxKTsKIAogCS8qIE5vdyB3ZSBoYXZlIG5ldyBkYXRhICovCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGNfd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMgYi9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMKaW5kZXggYTY5ZjA5NC4uZDYzZjVjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAorI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGVtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZWxlY3Rpb24uaD4KQEAgLTM0LDYgKzM1LDcgQEAKIC8qIFZhcmlhYmxlcyBmb3Igc2VsZWN0aW9uIGNvbnRyb2wuICovCiAvKiBVc2UgYSBkeW5hbWljIGJ1ZmZlciwgaW5zdGVhZCBvZiBzdGF0aWMgKERlYyAxOTk0KSAqLwogc3RydWN0IHZjX2RhdGEgKnNlbF9jb25zOwkJLyogbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQgKi8KK3N0YXRpYyBpbnQgdXNlX3VuaWNvZGU7CiBzdGF0aWMgdm9sYXRpbGUgaW50IHNlbF9zdGFydCA9IC0xOyAJLyogY2xlYXJlZCBieSBjbGVhcl9zZWxlY3Rpb24gKi8KIHN0YXRpYyBpbnQgc2VsX2VuZDsKIHN0YXRpYyBpbnQgc2VsX2J1ZmZlcl9sdGg7CkBAIC01NCwxMCArNTYsMTEgQEAKIAljb21wbGVtZW50X3BvcyhzZWxfY29ucywgd2hlcmUpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgY2hhcgorc3RhdGljIHUxNgogc2VsX3BvcyhpbnQgbikKIHsKLQlyZXR1cm4gaW52ZXJzZV90cmFuc2xhdGUoc2VsX2NvbnMsIHNjcmVlbl9nbHlwaChzZWxfY29ucywgbikpOworCXJldHVybiBpbnZlcnNlX3RyYW5zbGF0ZShzZWxfY29ucywgc2NyZWVuX2dseXBoKHNlbF9jb25zLCBuKSwKKwkJCQl1c2VfdW5pY29kZSk7CiB9CiAKIC8qIHJlbW92ZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gaGlnaGxpZ2h0LCBpZiBhbnksCkBAIC04Niw4ICs4OSw4IEBACiAgIDB4RkY3RkZGRkYgIC8qIGxhdGluLTEgYWNjZW50ZWQgbGV0dGVycywgbm90IGRpdmlzaW9uIHNpZ24gKi8KIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlud29yZChjb25zdCB1bnNpZ25lZCBjaGFyIGMpIHsKLQlyZXR1cm4gKCBpbndvcmRMdXRbYz4+NV0gPj4gKGMgJiAweDFGKSApICYgMTsKK3N0YXRpYyBpbmxpbmUgaW50IGlud29yZChjb25zdCB1MTYgYykgeworCXJldHVybiBjID4gMHhmZiB8fCAoKCBpbndvcmRMdXRbYz4+NV0gPj4gKGMgJiAweDFGKSApICYgMSk7CiB9CiAKIC8qIHNldCBpbndvcmRMdXQgY29udGVudHMuIEludm9rZWQgYnkgaW9jdGwoKS4gKi8KQEAgLTEwOCwxMyArMTExLDM2IEBACiAJcmV0dXJuICh2ID4gdSkgPyB1IDogdjsKIH0KIAorLyogc3RvcmVzIHRoZSBjaGFyIGluIFVURjggYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkICgxLTMpICovCitzdGF0aWMgaW50IHN0b3JlX3V0ZjgodTE2IGMsIGNoYXIgKnApCit7CisJaWYgKGMgPCAweDgwKSB7CisJCS8qICAwKioqKioqKiAqLworCQlwWzBdID0gYzsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChjIDwgMHg4MDApIHsKKwkJLyogMTEwKioqKiogMTAqKioqKiogKi8KKwkJcFswXSA9IDB4YzAgfCAoYyA+PiA2KTsKKwkJcFsxXSA9IDB4ODAgfCAoYyAmIDB4M2YpOworCQlyZXR1cm4gMjsKKyAgICAJfSBlbHNlIHsKKwkJLyogMTExMCoqKiogMTAqKioqKiogMTAqKioqKiogKi8KKwkJcFswXSA9IDB4ZTAgfCAoYyA+PiAxMik7CisJCXBbMV0gPSAweDgwIHwgKChjID4+IDYpICYgMHgzZik7CisJCXBbMl0gPSAweDgwIHwgKGMgJiAweDNmKTsKKwkJcmV0dXJuIDM7CisgICAgCX0KK30KKwogLyogc2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gSW52b2tlZCBieSBpb2N0bCgpIG9yIGJ5IGtlcm5lbCBjb2RlLiAqLwogaW50IHNldF9zZWxlY3Rpb24oY29uc3Qgc3RydWN0IHRpb2NsX3NlbGVjdGlvbiBfX3VzZXIgKnNlbCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CiAJaW50IHNlbF9tb2RlLCBuZXdfc2VsX3N0YXJ0LCBuZXdfc2VsX2VuZCwgc3BjOwogCWNoYXIgKmJwLCAqb2JwOwotCWludCBpLCBwcywgcGU7CisJaW50IGksIHBzLCBwZSwgbXVsdGlwbGllcjsKKwl1MTYgYzsKKwlzdHJ1Y3Qga2JkX3N0cnVjdCAqa2JkID0ga2JkX3RhYmxlICsgZmdfY29uc29sZTsKIAogCXBva2VfYmxhbmtlZF9jb25zb2xlKCk7CiAKQEAgLTE1OCw2ICsxODQsNyBAQAogCQljbGVhcl9zZWxlY3Rpb24oKTsKIAkJc2VsX2NvbnMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CiAJfQorCXVzZV91bmljb2RlID0ga2JkICYmIGtiZC0+a2JkbW9kZSA9PSBWQ19VTklDT0RFOwogCiAJc3dpdGNoIChzZWxfbW9kZSkKIAl7CkBAIC0yNDAsNyArMjY3LDggQEAKIAlzZWxfZW5kID0gbmV3X3NlbF9lbmQ7CiAKIAkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgYmVmb3JlIGZyZWVpbmcgdGhlIG9sZCBvbmUgLi4uICovCi0JYnAgPSBrbWFsbG9jKChzZWxfZW5kLXNlbF9zdGFydCkvMisxLCBHRlBfS0VSTkVMKTsKKwltdWx0aXBsaWVyID0gdXNlX3VuaWNvZGUgPyAzIDogMTsgIC8qIGNoYXJzIGNhbiB0YWtlIHVwIHRvIDMgYnl0ZXMgKi8KKwlicCA9IGttYWxsb2MoKHNlbF9lbmQtc2VsX3N0YXJ0KS8yKm11bHRpcGxpZXIrMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFicCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZWxlY3Rpb246IGttYWxsb2MoKSBmYWlsZWRcbiIpOwogCQljbGVhcl9zZWxlY3Rpb24oKTsKQEAgLTI1MSw4ICsyNzksMTIgQEAKIAogCW9icCA9IGJwOwogCWZvciAoaSA9IHNlbF9zdGFydDsgaSA8PSBzZWxfZW5kOyBpICs9IDIpIHsKLQkJKmJwID0gc2VsX3BvcyhpKTsKLQkJaWYgKCFpc3NwYWNlKCpicCsrKSkKKwkJYyA9IHNlbF9wb3MoaSk7CisJCWlmICh1c2VfdW5pY29kZSkKKwkJCWJwICs9IHN0b3JlX3V0ZjgoYywgYnApOworCQllbHNlCisJCQkqYnArKyA9IGM7CisJCWlmICghaXNzcGFjZShjKSkKIAkJCW9icCA9IGJwOwogCQlpZiAoISAoKGkgKyAyKSAlIHZjLT52Y19zaXplX3JvdykpIHsKIAkJCS8qIHN0cmlwIHRyYWlsaW5nIGJsYW5rcyBmcm9tIGxpbmUgYW5kIGFkZCBuZXdsaW5lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCmluZGV4IDNlZjU5M2EuLjczMDM3YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zb255cGkuYworKysgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKQEAgLTg4NSw1MyArODg1LDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qIEV4dGVybmFsIGNhbWVyYSBjb21tYW5kIChleHBvcnRlZCB0byB0aGUgbW90aW9uIGV5ZSB2NGwgZHJpdmVyKSAqLwotaW50IHNvbnlwaV9jYW1lcmFfY29tbWFuZChpbnQgY29tbWFuZCwgdTggdmFsdWUpCi17Ci0JaWYgKCFjYW1lcmEpCi0JCXJldHVybiAtRUlPOwotCi0JbXV0ZXhfbG9jaygmc29ueXBpX2RldmljZS5sb2NrKTsKLQotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBOgotCQlpZiAodmFsdWUpCi0JCQlzb255cGlfY2FtZXJhX29uKCk7Ci0JCWVsc2UKLQkJCXNvbnlwaV9jYW1lcmFfb2ZmKCk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQlJJR0hUTkVTUzoKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT05UUkFTVDoKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0NPTlRSQVNULCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBSFVFOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfSFVFLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09MT1I6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9DT0xPUiwgdmFsdWUpOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUzoKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1NIQVJQTkVTUywgdmFsdWUpOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVBJQ1RVUkU6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9QSUNUVVJFLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQUdDOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQUdDLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBzb255cGlfY2FtZXJhX2NvbW1hbmQgaW52YWxpZDogJWRcbiIsCi0JCSAgICAgICBjb21tYW5kKTsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmc29ueXBpX2RldmljZS5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChzb255cGlfY2FtZXJhX2NvbW1hbmQpOwotCiBzdGF0aWMgaW50IHNvbnlwaV9taXNjX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCiB7CiAJaW50IHJldHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwppbmRleCBiYWY3MjM0Li40NTU4NTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKKysrIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCkBAIC0zNDUsMTggKzM0NSw2IEBACiB9CiAKIAotLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBlbmFibGVkIGludGVycnVwdHMgKi8KLS8qIFVnbHkuIFZlcnkgdWdseS4gRG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nIGVsc2UgdGhhbiBpbml0aWFsaXphdGlvbgotICAgY29kZSAqLwotc3RhdGljIGlubGluZSB2b2lkIHN4X2xvbmdfZGVsYXkodW5zaWduZWQgbG9uZyBkZWxheSkKLXsKLQl1bnNpZ25lZCBsb25nIGk7Ci0KLQlmb3IgKGkgPSBqaWZmaWVzICsgZGVsYXk7IHRpbWVfYWZ0ZXIoaSwgamlmZmllcyk7ICkgOwotfQotCi0KLQogLyogU2V0IHRoZSBJUlEgdXNpbmcgdGhlIFJUUyBsaW5lcyB0aGF0IHJ1biB0byB0aGUgUEFMIG9uIHRoZSBib2FyZC4uLi4gKi8KIHN0YXRpYyBpbnQgc3hfc2V0X2lycSAoIHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgKmJwKQogewpAQCAtMzk3LDcgKzM4NSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CiAJc3hfb3V0X29mZihicCwgQ0QxODZ4X0NDUiwgQ0NSX0hBUkRSRVNFVCk7ICAgICAgLyogUmVzZXQgQ0QxODZ4IGNoaXAgICAgICAgICAgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOwotCXN4X2xvbmdfZGVsYXkoSFovMjApOyAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSAwLjA1IHNlYyAgICAgICAgICAgICovCisJbXNsZWVwKDUwKTsJCQkJCS8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfR0lWUiwgU1hfSUQpOyAgICAgICAgICAgICAvKiBTZXQgSUQgZm9yIHRoaXMgY2hpcCAgICAgICovCiAJc3hfb3V0X29mZihicCwgQ0QxODZ4X0dJQ1IsIDApOyAgICAgICAgICAgICAgICAgLyogQ2xlYXIgYWxsIGJpdHMgICAgICAgICAgICAqLwpAQCAtNTMzLDcgKzUyMSw3IEBACiAJCXN4X3dhaXRfQ0NSKGJwKTsKIAkJc3hfb3V0KGJwLCBDRDE4NnhfQ0NSLCBDQ1JfVFhFTik7ICAgICAgICAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgICAgICovCiAJCXN4X291dChicCwgQ0QxODZ4X0lFUiwgSUVSX1RYUkRZKTsgICAgICAgLyogRW5hYmxlIHR4IGVtcHR5IGludHIgICAqLwotCQlzeF9sb25nX2RlbGF5KEhaLzIwKTsKKwkJbXNsZWVwKDUwKTsKIAkJaXJxcyA9IHByb2JlX2lycV9vZmYoaXJxcyk7CiAKIAkJZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIlNSU1IgPSAlMDJ4LCAiLCBzeF9pbihicCwgQ0QxODZ4X1NSU1IpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKaW5kZXggOGM3M2NjYi4uOTNkMGJiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKQEAgLTE3ODgsNyArMTc4OCw2IEBACiAJaWYgKHR0eSA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlsb2NrX2tlcm5lbCgpOwogCWlmICh0ZXN0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSkpCiAJCXR0eV93YWtldXAodHR5KTsKIApAQCAtMTgwMiw3ICsxODAxLDYgQEAKIAkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkKIAkJCQl0dHlfaGFuZ3VwKHR0eSk7CS8qIEZJWE1FOiBtb2R1bGUgcmVtb3ZhbCByYWNlIGhlcmUgLSBBS1BNICovCiAJfQotCXVubG9ja19rZXJuZWwoKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjM1Nyw5ICsyMzU1LDYgQEAKIAlpZiAoKHBkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKIAkJZ290byBlcnI7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicGxlYXNlLCByZXBvcnQgdGhpcyB0byBMS01MOiAleC8leC8leFxuIiwKLQkJCXBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5jbGFzcyk7Ci0KIAlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGluay5jIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMKaW5kZXggZjAyYTA3OS4uZjUzZTUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMKQEAgLTE2MCw4ICsxNjAsNiBAQAogCiAjZGVmaW5lIElPX1BJTl9TSFVURE9XTl9MSU1JVCAxMDAKIAotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCi0KIHN0cnVjdAlfaW5wdXRfc2lnbmFsX2V2ZW50cyB7CiAJaW50CXJpX3VwOwkKIAlpbnQJcmlfZG93bjsKQEAgLTMwNjQsMTIgKzMwNjIsNiBAQAogCQlwcmludGsoIiVzKCVkKTptZ3NsX3NldF90ZXJtaW9zICVzXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKIAkJCXR0eS0+ZHJpdmVyLT5uYW1lICk7CiAJCi0JLyoganVzdCByZXR1cm4gaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLwotCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkgIHJldHVybjsKLQogCW1nc2xfY2hhbmdlX3BhcmFtcyhpbmZvKTsKIAogCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwppbmRleCAwMmI0OWJjLi40MjhiNTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwpAQCAtMTQ0LDggKzE0NCw2IEBACiAvKgogICogdHR5IHN1cHBvcnQgYW5kIGNhbGxiYWNrcwogICovCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzZXJpYWxfZHJpdmVyOwogCiBzdGF0aWMgaW50ICBvcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCk7CkBAIC04MjMsMTIgKzgyMSw2IEBACiAKIAlEQkdJTkZPKCgiJXMgc2V0X3Rlcm1pb3NcbiIsIHR0eS0+ZHJpdmVyLT5uYW1lKSk7CiAKLQkvKiBqdXN0IHJldHVybiBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCi0JaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JICAgICYmIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpCi0JCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCi0JCXJldHVybjsKLQogCWNoYW5nZV9wYXJhbXMoaW5mbyk7CiAKIAkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCmluZGV4IGVmOTNkMDUuLmE2NTQwN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwpAQCAtMTM1LDggKzEzNSw2IEBACiAKICNkZWZpbmUgSU9fUElOX1NIVVRET1dOX0xJTUlUIDEwMAogCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQogc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzIHsKIAlpbnQJcmlfdXA7CiAJaW50CXJpX2Rvd247CkBAIC05MjcsMTIgKzkyNSw2IEBACiAJCXByaW50aygiJXMoJWQpOiVzIHNldF90ZXJtaW9zKClcbiIsIF9fRklMRV9fLF9fTElORV9fLAogCQkJdHR5LT5kcml2ZXItPm5hbWUgKTsKIAotCS8qIGp1c3QgcmV0dXJuIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KLQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkgICAgJiYgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkgIHJldHVybjsKLQogCWNoYW5nZV9wYXJhbXMoaW5mbyk7CiAKIAkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZwppbmRleCBkYzRlMWZmLi44ZjNmNzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCkBAIC0yLDExICsyLDkgQEAKICMgVFBNIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIlRQTSBkZXZpY2VzIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0KLWNvbmZpZyBUQ0dfVFBNCittZW51Y29uZmlnIFRDR19UUE0KIAl0cmlzdGF0ZSAiVFBNIEhhcmR3YXJlIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgaW4geW91ciBzeXN0ZW0sIHdoaWNoCkBAIC0yMSw5ICsxOSwxMSBAQAogCSAgTm90ZTogRm9yIG1vcmUgVFBNIGRyaXZlcnMgZW5hYmxlIENPTkZJR19QTlAsIENPTkZJR19BQ1BJCiAJICBhbmQgQ09ORklHX1BOUEFDUEkuCiAKK2lmIFRDR19UUE0KKwogY29uZmlnIFRDR19USVMKIAl0cmlzdGF0ZSAiVFBNIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uIDEuMiBJbnRlcmZhY2UiCi0JZGVwZW5kcyBvbiBUQ0dfVFBNICYmIFBOUEFDUEkKKwlkZXBlbmRzIG9uIFBOUEFDUEkKIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhIFRQTSBzZWN1cml0eSBjaGlwIHRoYXQgaXMgY29tcGxpYW50IHdpdGggdGhlCiAJICBUQ0cgVElTIDEuMiBUUE0gc3BlY2lmaWNhdGlvbiBzYXkgWWVzIGFuZCBpdCB3aWxsIGJlIGFjY2Vzc2libGUKQEAgLTMyLDcgKzMyLDcgQEAKIAogY29uZmlnIFRDR19OU0MKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBUUE0gSW50ZXJmYWNlIgotCWRlcGVuZHMgb24gVENHX1RQTSAmJiBQTlBBQ1BJCisJZGVwZW5kcyBvbiBQTlBBQ1BJCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBmcm9tIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgCiAJICBzYXkgWWVzIGFuZCBpdCB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gTGludXguICBUbyAKQEAgLTQxLDcgKzQxLDYgQEAKIAogY29uZmlnIFRDR19BVE1FTAogCXRyaXN0YXRlICJBdG1lbCBUUE0gSW50ZXJmYWNlIgotCWRlcGVuZHMgb24gVENHX1RQTQogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgZnJvbSBBdG1lbCBzYXkgWWVzIGFuZCBpdCAKIAkgIHdpbGwgYmUgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiBMaW51eC4gIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgCkBAIC00OSw3ICs0OCw3IEBACiAKIGNvbmZpZyBUQ0dfSU5GSU5FT04KIAl0cmlzdGF0ZSAiSW5maW5lb24gVGVjaG5vbG9naWVzIFRQTSBJbnRlcmZhY2UiCi0JZGVwZW5kcyBvbiBUQ0dfVFBNICYmIFBOUEFDUEkKKwlkZXBlbmRzIG9uIFBOUEFDUEkKIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhIFRQTSBzZWN1cml0eSBjaGlwIGZyb20gSW5maW5lb24gVGVjaG5vbG9naWVzCiAJICAoZWl0aGVyIFNMRCA5NjMwIFRUIDEuMSBvciBTTEIgOTYzNSBUVCAxLjIpIHNheSBZZXMgYW5kIGl0CkBAIC01OSw1ICs1OCw0IEBACiAJICBGdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyIGFuZCB0aGUgc3VwcG9ydGVkIGhhcmR3YXJlCiAJICBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5wcm9zZWMucnViLmRlL3RwbQogCi1lbmRtZW51Ci0KK2VuZGlmICMgVENHX1RQTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9hdWRpdC5jIGIvZHJpdmVycy9jaGFyL3R0eV9hdWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjIwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDcmVhdGluZyBhdWRpdCBldmVudHMgZnJvbSBUVFkgaW5wdXQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGNvcHlyaWdodGVkCisgKiBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsIG1vZGlmeSwgY29weSwgb3IKKyAqIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBBdXRob3JzOiBNaWxvc2xhdiBUcm1hYyA8bWl0ckByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKworc3RydWN0IHR0eV9hdWRpdF9idWYgeworCWF0b21pY190IGNvdW50OworCXN0cnVjdCBtdXRleCBtdXRleDsJLyogUHJvdGVjdHMgYWxsIGRhdGEgYmVsb3cgKi8KKwlpbnQgbWFqb3IsIG1pbm9yOwkvKiBUaGUgVFRZIHdoaWNoIHRoZSBkYXRhIGlzIGZyb20gKi8KKwl1bnNpZ25lZCBpY2Fub246MTsKKwlzaXplX3QgdmFsaWQ7CisJdW5zaWduZWQgY2hhciAqZGF0YTsJLyogQWxsb2NhdGVkIHNpemUgTl9UVFlfQlVGX1NJWkUgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqdHR5X2F1ZGl0X2J1Zl9hbGxvYyhpbnQgbWFqb3IsIGludCBtaW5vciwKKwkJCQkJCSBpbnQgaWNhbm9uKQoreworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWY7CisKKwlidWYgPSBrbWFsbG9jKHNpemVvZiAoKmJ1ZiksIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlnb3RvIGVycjsKKwlpZiAoUEFHRV9TSVpFICE9IE5fVFRZX0JVRl9TSVpFKQorCQlidWYtPmRhdGEgPSBrbWFsbG9jKE5fVFRZX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCWJ1Zi0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghYnVmLT5kYXRhKQorCQlnb3RvIGVycl9idWY7CisJYXRvbWljX3NldCgmYnVmLT5jb3VudCwgMSk7CisJbXV0ZXhfaW5pdCgmYnVmLT5tdXRleCk7CisJYnVmLT5tYWpvciA9IG1ham9yOworCWJ1Zi0+bWlub3IgPSBtaW5vcjsKKwlidWYtPmljYW5vbiA9IGljYW5vbjsKKwlidWYtPnZhbGlkID0gMDsKKwlyZXR1cm4gYnVmOworCitlcnJfYnVmOgorCWtmcmVlKGJ1Zik7CitlcnI6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHR0eV9hdWRpdF9idWZfZnJlZShzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmKQoreworCVdBUk5fT04oYnVmLT52YWxpZCAhPSAwKTsKKwlpZiAoUEFHRV9TSVpFICE9IE5fVFRZX0JVRl9TSVpFKQorCQlrZnJlZShidWYtPmRhdGEpOworCWVsc2UKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1Zi0+ZGF0YSk7CisJa2ZyZWUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgdHR5X2F1ZGl0X2J1Zl9wdXQoc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnVmLT5jb3VudCkpCisJCXR0eV9hdWRpdF9idWZfZnJlZShidWYpOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9idWZfcHVzaAktCVB1c2ggYnVmZmVyZWQgZGF0YSBvdXQKKyAqCisgKglHZW5lcmF0ZSBhbiBhdWRpdCBtZXNzYWdlIGZyb20gdGhlIGNvbnRlbnRzIG9mIEBidWYsIHdoaWNoIGlzIG93bmVkIGJ5CisgKglAdHNrIHdpdGggQGxvZ2ludWlkLiAgQGJ1Zi0+bXV0ZXggbXVzdCBiZSBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkIHR0eV9hdWRpdF9idWZfcHVzaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdWlkX3QgbG9naW51aWQsCisJCQkgICAgICAgc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYjsKKworCWlmIChidWYtPnZhbGlkID09IDApCisJCXJldHVybjsKKwlpZiAoYXVkaXRfZW5hYmxlZCA9PSAwKQorCQlyZXR1cm47CisJYWIgPSBhdWRpdF9sb2dfc3RhcnQoTlVMTCwgR0ZQX0tFUk5FTCwgQVVESVRfVFRZKTsKKwlpZiAoYWIpIHsKKwkJY2hhciBuYW1lW3NpemVvZih0c2stPmNvbW0pXTsKKworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAidHR5IHBpZD0ldSB1aWQ9JXUgYXVpZD0ldSBtYWpvcj0lZCAiCisJCQkJICJtaW5vcj0lZCBjb21tPSIsIHRzay0+cGlkLCB0c2stPnVpZCwKKwkJCQkgbG9naW51aWQsIGJ1Zi0+bWFqb3IsIGJ1Zi0+bWlub3IpOworCQlnZXRfdGFza19jb21tKG5hbWUsIHRzayk7CisJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIG5hbWUpOworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGRhdGE9Iik7CisJCWF1ZGl0X2xvZ19uX3VudHJ1c3RlZHN0cmluZyhhYiwgYnVmLT52YWxpZCwgYnVmLT5kYXRhKTsKKwkJYXVkaXRfbG9nX2VuZChhYik7CisJfQorCWJ1Zi0+dmFsaWQgPSAwOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9idWZfcHVzaF9jdXJyZW50CS0JUHVzaCBidWZmZXJlZCBkYXRhIG91dAorICoKKyAqCUdlbmVyYXRlIGFuIGF1ZGl0IG1lc3NhZ2UgZnJvbSB0aGUgY29udGVudHMgb2YgQGJ1Ziwgd2hpY2ggaXMgb3duZWQgYnkKKyAqCXRoZSBjdXJyZW50IHRhc2suICBAYnVmLT5tdXRleCBtdXN0IGJlIGxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQgdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQoc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZikKK3sKKwl0dHlfYXVkaXRfYnVmX3B1c2goY3VycmVudCwgYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpLAorCQkJICAgYnVmKTsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfZXhpdAktCUhhbmRsZSBhIHRhc2sgZXhpdAorICoKKyAqCU1ha2Ugc3VyZSBhbGwgYnVmZmVyZWQgZGF0YSBpcyB3cml0dGVuIG91dCBhbmQgZGVhbGxvY2F0ZSB0aGUgYnVmZmVyLgorICoJT25seSBuZWVkcyB0byBiZSBjYWxsZWQgaWYgY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmICE9ICVOVUxMLgorICovCit2b2lkIHR0eV9hdWRpdF9leGl0KHZvaWQpCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWJ1ZiA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZjsKKwljdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWYgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmJ1Zi0+bXV0ZXgpOworCXR0eV9hdWRpdF9idWZfcHVzaF9jdXJyZW50KGJ1Zik7CisJbXV0ZXhfdW5sb2NrKCZidWYtPm11dGV4KTsKKworCXR0eV9hdWRpdF9idWZfcHV0KGJ1Zik7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X2ZvcmsJLQlDb3B5IFRUWSBhdWRpdCBzdGF0ZSBmb3IgYSBuZXcgdGFzaworICoKKyAqCVNldCB1cCBUVFkgYXVkaXQgc3RhdGUgaW4gQHNpZyBmcm9tIGN1cnJlbnQuICBAc2lnIG5lZWRzIG5vIGxvY2tpbmcuCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X2Zvcmsoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKK3sKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzaWctPmF1ZGl0X3R0eSA9IGN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5OworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2lnLT50dHlfYXVkaXRfYnVmID0gTlVMTDsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfcHVzaF90YXNrCS0JRmx1c2ggdGFzaydzIHBlbmRpbmcgYXVkaXQgZGF0YQorICovCit2b2lkIHR0eV9hdWRpdF9wdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVpZF90IGxvZ2ludWlkKQoreworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWY7CisKKwlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCWJ1ZiA9IHRzay0+c2lnbmFsLT50dHlfYXVkaXRfYnVmOworCWlmIChidWYpCisJCWF0b21pY19pbmMoJmJ1Zi0+Y291bnQpOworCXNwaW5fdW5sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYnVmLT5tdXRleCk7CisJdHR5X2F1ZGl0X2J1Zl9wdXNoKHRzaywgbG9naW51aWQsIGJ1Zik7CisJbXV0ZXhfdW5sb2NrKCZidWYtPm11dGV4KTsKKworCXR0eV9hdWRpdF9idWZfcHV0KGJ1Zik7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X2J1Zl9nZXQJLQlHZXQgYW4gYXVkaXQgYnVmZmVyLgorICoKKyAqCUdldCBhbiBhdWRpdCBidWZmZXIgZm9yIEB0dHksIGFsbG9jYXRlIGl0IGlmIG5lY2Vzc2FyeS4gIFJldHVybiAlTlVMTAorICoJaWYgVFRZIGF1ZGl0aW5nIGlzIGRpc2FibGVkIG9yIG91dCBvZiBtZW1vcnkuICBPdGhlcndpc2UsIHJldHVybiBhIG5ldworICoJcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqdHR5X2F1ZGl0X2J1Zl9nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmLCAqYnVmMjsKKworCWJ1ZiA9IE5VTEw7CisJYnVmMiA9IE5VTEw7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKGxpa2VseSghY3VycmVudC0+c2lnbmFsLT5hdWRpdF90dHkpKQorCQlnb3RvIG91dDsKKwlidWYgPSBjdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWY7CisJaWYgKGJ1ZikgeworCQlhdG9taWNfaW5jKCZidWYtPmNvdW50KTsKKwkJZ290byBvdXQ7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlidWYyID0gdHR5X2F1ZGl0X2J1Zl9hbGxvYyh0dHktPmRyaXZlci0+bWFqb3IsCisJCQkJICAgdHR5LT5kcml2ZXItPm1pbm9yX3N0YXJ0ICsgdHR5LT5pbmRleCwKKwkJCQkgICB0dHktPmljYW5vbik7CisJaWYgKGJ1ZjIgPT0gTlVMTCkgeworCQlhdWRpdF9sb2dfbG9zdCgib3V0IG9mIG1lbW9yeSBpbiBUVFkgYXVkaXRpbmciKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKCFjdXJyZW50LT5zaWduYWwtPmF1ZGl0X3R0eSkKKwkJZ290byBvdXQ7CisJYnVmID0gY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmOworCWlmICghYnVmKSB7CisJCWN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZiA9IGJ1ZjI7CisJCWJ1ZiA9IGJ1ZjI7CisJCWJ1ZjIgPSBOVUxMOworCX0KKwlhdG9taWNfaW5jKCZidWYtPmNvdW50KTsKKwkvKiBGYWxsIHRocm91Z2ggKi8KKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoYnVmMikKKwkJdHR5X2F1ZGl0X2J1Zl9mcmVlKGJ1ZjIpOworCXJldHVybiBidWY7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X2FkZF9kYXRhCS0JQWRkIGRhdGEgZm9yIFRUWSBhdWRpdGluZy4KKyAqCisgKglBdWRpdCBAZGF0YSBvZiBAc2l6ZSBmcm9tIEB0dHksIGlmIG5lY2Vzc2FyeS4KKyAqLwordm9pZCB0dHlfYXVkaXRfYWRkX2RhdGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCXNpemVfdCBzaXplKQoreworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWY7CisJaW50IG1ham9yLCBtaW5vcjsKKworCWlmICh1bmxpa2VseShzaXplID09IDApKQorCQlyZXR1cm47CisKKwlidWYgPSB0dHlfYXVkaXRfYnVmX2dldCh0dHkpOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZidWYtPm11dGV4KTsKKwltYWpvciA9IHR0eS0+ZHJpdmVyLT5tYWpvcjsKKwltaW5vciA9IHR0eS0+ZHJpdmVyLT5taW5vcl9zdGFydCArIHR0eS0+aW5kZXg7CisJaWYgKGJ1Zi0+bWFqb3IgIT0gbWFqb3IgfHwgYnVmLT5taW5vciAhPSBtaW5vcgorCSAgICB8fCBidWYtPmljYW5vbiAhPSB0dHktPmljYW5vbikgeworCQl0dHlfYXVkaXRfYnVmX3B1c2hfY3VycmVudChidWYpOworCQlidWYtPm1ham9yID0gbWFqb3I7CisJCWJ1Zi0+bWlub3IgPSBtaW5vcjsKKwkJYnVmLT5pY2Fub24gPSB0dHktPmljYW5vbjsKKwl9CisJZG8geworCQlzaXplX3QgcnVuOworCisJCXJ1biA9IE5fVFRZX0JVRl9TSVpFIC0gYnVmLT52YWxpZDsKKwkJaWYgKHJ1biA+IHNpemUpCisJCQlydW4gPSBzaXplOworCQltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT52YWxpZCwgZGF0YSwgcnVuKTsKKwkJYnVmLT52YWxpZCArPSBydW47CisJCWRhdGEgKz0gcnVuOworCQlzaXplIC09IHJ1bjsKKwkJaWYgKGJ1Zi0+dmFsaWQgPT0gTl9UVFlfQlVGX1NJWkUpCisJCQl0dHlfYXVkaXRfYnVmX3B1c2hfY3VycmVudChidWYpOworCX0gd2hpbGUgKHNpemUgIT0gMCk7CisJbXV0ZXhfdW5sb2NrKCZidWYtPm11dGV4KTsKKwl0dHlfYXVkaXRfYnVmX3B1dChidWYpOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9wdXNoCS0JUHVzaCBidWZmZXJlZCBkYXRhIG91dAorICoKKyAqCU1ha2Ugc3VyZSBubyBhdWRpdCBkYXRhIGlzIHBlbmRpbmcgZm9yIEB0dHkgb24gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAqLwordm9pZCB0dHlfYXVkaXRfcHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWY7CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAobGlrZWx5KCFjdXJyZW50LT5zaWduYWwtPmF1ZGl0X3R0eSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJcmV0dXJuOworCX0KKwlidWYgPSBjdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWY7CisJaWYgKGJ1ZikKKwkJYXRvbWljX2luYygmYnVmLT5jb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWlmIChidWYpIHsKKwkJaW50IG1ham9yLCBtaW5vcjsKKworCQltYWpvciA9IHR0eS0+ZHJpdmVyLT5tYWpvcjsKKwkJbWlub3IgPSB0dHktPmRyaXZlci0+bWlub3Jfc3RhcnQgKyB0dHktPmluZGV4OworCQltdXRleF9sb2NrKCZidWYtPm11dGV4KTsKKwkJaWYgKGJ1Zi0+bWFqb3IgPT0gbWFqb3IgJiYgYnVmLT5taW5vciA9PSBtaW5vcikKKwkJCXR0eV9hdWRpdF9idWZfcHVzaF9jdXJyZW50KGJ1Zik7CisJCW11dGV4X3VubG9jaygmYnVmLT5tdXRleCk7CisJCXR0eV9hdWRpdF9idWZfcHV0KGJ1Zik7CisJfQorfQorCisvKioKKyAqCXR0eV9hdWRpdF9vcGVuaW5nCS0JQSBUVFkgaXMgYmVpbmcgb3BlbmVkLgorICoKKyAqCUFzIGEgc3BlY2lhbCBoYWNrLCB0YXNrcyB0aGF0IGNsb3NlIGFsbCB0aGVpciBUVFlzIGFuZCBvcGVuIG5ldyBvbmVzCisgKglhcmUgYXNzdW1lZCB0byBiZSBzeXN0ZW0gZGFlbW9ucyAoZS5nLiBnZXR0eSkgYW5kIGF1ZGl0aW5nIGlzCisgKglhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGZvciB0aGVtLgorICovCit2b2lkIHR0eV9hdWRpdF9vcGVuaW5nKHZvaWQpCit7CisJaW50IGRpc2FibGU7CisKKwlkaXNhYmxlID0gMTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoY3VycmVudC0+c2lnbmFsLT5hdWRpdF90dHkgPT0gMCkKKwkJZGlzYWJsZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoIWRpc2FibGUpCisJCXJldHVybjsKKworCXRhc2tfbG9jayhjdXJyZW50KTsKKwlpZiAoY3VycmVudC0+ZmlsZXMpIHsKKwkJc3RydWN0IGZkdGFibGUgKmZkdDsKKwkJdW5zaWduZWQgaTsKKworCQkvKgorCQkgKiBXZSBkb24ndCB0YWtlIGEgcmVmIHRvIHRoZSBmaWxlLCBzbyB3ZSBtdXN0IGhvbGQgLT5maWxlX2xvY2sKKwkJICogaW5zdGVhZC4KKwkJICovCisJCXNwaW5fbG9jaygmY3VycmVudC0+ZmlsZXMtPmZpbGVfbG9jayk7CisJCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCQlmb3IgKGkgPSAwOyBpIDwgZmR0LT5tYXhfZmRzOyBpKyspIHsKKwkJCXN0cnVjdCBmaWxlICpmaWxwOworCisJCQlmaWxwID0gZmNoZWNrX2ZpbGVzKGN1cnJlbnQtPmZpbGVzLCBpKTsKKwkJCWlmIChmaWxwICYmIGlzX3R0eShmaWxwKSkgeworCQkJCWRpc2FibGUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwl9CisJdGFza191bmxvY2soY3VycmVudCk7CisJaWYgKCFkaXNhYmxlKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwljdXJyZW50LT5zaWduYWwtPmF1ZGl0X3R0eSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW8uYyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwppbmRleCBhOTZmMjZhLi5kZTM3ZWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCkBAIC0xNTAzLDYgKzE1MDMsMTUgQEAKIAogRVhQT1JUX1NZTUJPTCh0dHlfaHVuZ191cF9wKTsKIAorLyoqCisgKiBpc190dHkJLQljaGVja2VyIHdoZXRoZXIgZmlsZSBpcyBhIFRUWQorICovCitpbnQgaXNfdHR5KHN0cnVjdCBmaWxlICpmaWxwKQoreworCXJldHVybiBmaWxwLT5mX29wLT5yZWFkID09IHR0eV9yZWFkCisJCXx8IGZpbHAtPmZfb3AtPnJlYWQgPT0gaHVuZ191cF90dHlfcmVhZDsKK30KKwogc3RhdGljIHZvaWQgc2Vzc2lvbl9jbGVhcl90dHkoc3RydWN0IHBpZCAqc2Vzc2lvbikKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CkBAIC0xNzI2LDYgKzE3MzUsMjMgQEAKIAlyZXR1cm4gaTsKIH0KIAordm9pZCB0dHlfd3JpdGVfdW5sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJbXV0ZXhfdW5sb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Cit9CisKK2ludCB0dHlfd3JpdGVfbG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbmRlbGF5KQoreworCWlmICghbXV0ZXhfdHJ5bG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpIHsKKwkJaWYgKG5kZWxheSkKKwkJCXJldHVybiAtRUFHQUlOOworCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCXJldHVybiAwOworfQorCiAvKgogICogU3BsaXQgd3JpdGVzIHVwIGluIHNhbmUgYmxvY2tzaXplcyB0byBhdm9pZAogICogZGVuaWFsLW9mLXNlcnZpY2UgdHlwZSBhdHRhY2tzCkBAIC0xNzM3LDEzICsxNzYzLDEyIEBACiAJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAlzaXplX3QgY291bnQpCiB7Ci0Jc3NpemVfdCByZXQgPSAwLCB3cml0dGVuID0gMDsKKwlzc2l6ZV90IHJldCwgd3JpdHRlbiA9IDA7CiAJdW5zaWduZWQgaW50IGNodW5rOwogCQotCS8qIEZJWE1FOiBPX05ERUxBWSAuLi4gKi8KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKSkgewotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCX0KKwlyZXQgPSB0dHlfd3JpdGVfbG9jayh0dHksIGZpbGUtPmZfZmxhZ3MgJiBPX05ERUxBWSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKgogCSAqIFdlIGNodW5rIHVwIHdyaXRlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcwpAQCAtMTc3Niw4ICsxODAxLDggQEAKIAogCQlidWYgPSBrbWFsbG9jKGNodW5rLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFidWYpIHsKLQkJCW11dGV4X3VubG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKIAkJfQogCQlrZnJlZSh0dHktPndyaXRlX2J1Zik7CiAJCXR0eS0+d3JpdGVfY250ID0gY2h1bms7CkBAIC0xODEyLDcgKzE4MzcsOCBAQAogCQlpbm9kZS0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CiAJCXJldCA9IHdyaXR0ZW47CiAJfQotCW11dGV4X3VubG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7CitvdXQ6CisJdHR5X3dyaXRlX3VubG9jayh0dHkpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIwMTYsMTEgKzIwNDIsOSBAQAogCX0KIAogCWlmICghKmx0cF9sb2MpIHsKLQkJbHRwID0gKHN0cnVjdCBrdGVybWlvcyAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpLAotCQkJCQkJIEdGUF9LRVJORUwpOworCQlsdHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFsdHApCiAJCQlnb3RvIGZyZWVfbWVtX291dDsKLQkJbWVtc2V0KGx0cCwgMCwgc2l6ZW9mKHN0cnVjdCBrdGVybWlvcykpOwogCX0KIAogCWlmIChkcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSkgewpAQCAtMjA0OSwxMSArMjA3Myw5IEBACiAJCX0KIAogCQlpZiAoISpvX2x0cF9sb2MpIHsKLQkJCW9fbHRwID0gKHN0cnVjdCBrdGVybWlvcyAqKQotCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOworCQkJb19sdHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghb19sdHApCiAJCQkJZ290byBmcmVlX21lbV9vdXQ7Ci0JCQltZW1zZXQob19sdHAsIDAsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKTsKIAkJfQogCiAJCS8qCkBAIC0yNjYwLDYgKzI2ODIsNyBAQAogCQlfX3Byb2Nfc2V0X3R0eShjdXJyZW50LCB0dHkpOwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOworCXR0eV9hdWRpdF9vcGVuaW5nKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3MjIsOCArMjc0NSwxMCBAQAogCiAJY2hlY2tfdHR5X2NvdW50KHR0eSwgInR0eV9vcGVuIik7CiAJcmV0dmFsID0gcHRtX2RyaXZlci0+b3Blbih0dHksIGZpbHApOwotCWlmICghcmV0dmFsKQorCWlmICghcmV0dmFsKSB7CisJCXR0eV9hdWRpdF9vcGVuaW5nKCk7CiAJCXJldHVybiAwOworCX0KIG91dDE6CiAJcmVsZWFzZV9kZXYoZmlscCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTMxNjMsMTQgKzMxODgsMTMgQEAKIAogc3RhdGljIGludCBzZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBkdXJhdGlvbikKIHsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKSkKKwlpZiAodHR5X3dyaXRlX2xvY2sodHR5LCAwKSA8IDApCiAJCXJldHVybiAtRUlOVFI7CiAJdHR5LT5kcml2ZXItPmJyZWFrX2N0bCh0dHksIC0xKTsKLQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoZHVyYXRpb24pOwotCX0KIAl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgMCk7Ci0JbXV0ZXhfdW5sb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKTsKKwl0dHlfd3JpdGVfdW5sb2NrKHR0eSk7CiAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQlyZXR1cm4gLUVJTlRSOwogCXJldHVybiAwOwpAQCAtMzczOSw5ICszNzYzLDggQEAKIHsKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyOwogCi0JZHJpdmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpLCBHRlBfS0VSTkVMKTsKKwlkcml2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlciksIEdGUF9LRVJORUwpOwogCWlmIChkcml2ZXIpIHsKLQkJbWVtc2V0KGRyaXZlciwgMCwgc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSk7CiAJCWRyaXZlci0+bWFnaWMgPSBUVFlfRFJJVkVSX01BR0lDOwogCQlkcml2ZXItPm51bSA9IGxpbmVzOwogCQkvKiBsYXRlciB3ZSdsbCBtb3ZlIGFsbG9jYXRpb24gb2YgdGFibGVzIGhlcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYwppbmRleCBmZDQ3MWNiLi4zNDIzZTllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYwpAQCAtNTIsOCArNTIsNiBAQAogCiB2b2lkIHR0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIGxvbmcgdGltZW91dCkKIHsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQogI2lmZGVmIFRUWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKIAljaGFyIGJ1Zls2NF07CiAJCkBAIC02MSwyNiArNTksMTMgQEAKICNlbmRpZgogCWlmICghdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcikKIAkJcmV0dXJuOwotCWFkZF93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKIAlpZiAoIXRpbWVvdXQpCiAJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKLQlkbyB7Ci0jaWZkZWYgVFRZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAotCQlwcmludGsoS0VSTl9ERUJVRyAid2FpdGluZyAlcy4uLiglZClcbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSwKLQkJICAgICAgIHR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSk7Ci0jZW5kaWYKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJZ290byBzdG9wX3dhaXRpbmc7Ci0JCWlmICghdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpKQotCQkJYnJlYWs7Ci0JCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCX0gd2hpbGUgKHRpbWVvdXQpOworCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh0dHktPndyaXRlX3dhaXQsCisJCQkhdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpLCB0aW1lb3V0KSkKKwkJcmV0dXJuOwogCWlmICh0dHktPmRyaXZlci0+d2FpdF91bnRpbF9zZW50KQogCQl0dHktPmRyaXZlci0+d2FpdF91bnRpbF9zZW50KHR0eSwgdGltZW91dCk7Ci1zdG9wX3dhaXRpbmc6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmdHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CiB9CiAKIEVYUE9SVF9TWU1CT0wodHR5X3dhaXRfdW50aWxfc2VudCk7CkBAIC0yNzYsMTMgKzI2MSwxMiBAQAogCQkJCXRlcm1pb3MtPmNfY2ZsYWcgfD0gKGJhdWRfYml0c1tpXSA8PCBJQlNISUZUKTsKIAkJCWlmb3VuZCA9IGk7CiAJCX0KLQl9Ci0Jd2hpbGUoKytpIDwgbl9iYXVkX3RhYmxlKTsKKwl9IHdoaWxlICgrK2kgPCBuX2JhdWRfdGFibGUpOwogCWlmIChvZm91bmQgPT0gLTEpCiAJCXRlcm1pb3MtPmNfY2ZsYWcgfD0gQk9USEVSOwogCS8qIFNldCBleGFjdCBpbnB1dCBiaXRzIG9ubHkgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGlmZmVyIG9yIHRoZQogCSAgIHVzZXIgYWxyZWFkeSBkaWQgKi8KLQlpZiAoaWZvdW5kID09IC0xICYmIChpYmF1ZCAhPSBvYmF1ZCAgfHwgaWJpbnB1dCkpCisJaWYgKGlmb3VuZCA9PSAtMSAmJiAoaWJhdWQgIT0gb2JhdWQgfHwgaWJpbnB1dCkpCiAJCXRlcm1pb3MtPmNfY2ZsYWcgfD0gKEJPVEhFUiA8PCBJQlNISUZUKTsKIH0KIApAQCAtNTc1LDcgKzU1OSw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKLQl0ZXJtaW9zID0gICp0dHktPnRlcm1pb3M7CisJdGVybWlvcyA9ICp0dHktPnRlcm1pb3M7CiAJdGVybWlvcy5jX2NjW1ZFUkFTRV0gPSB0bXAuc2dfZXJhc2U7CiAJdGVybWlvcy5jX2NjW1ZLSUxMXSA9IHRtcC5zZ19raWxsOwogCXNldF9zZ2ZsYWdzKCZ0ZXJtaW9zLCB0bXAuc2dfZmxhZ3MpOwpAQCAtNjY3LDcgKzY1MSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKQorCWlmICh0dHlfd3JpdGVfbG9jayh0dHksIDApIDwgMCkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWlmICh3YXNfc3RvcHBlZCkKQEAgLTY3NSw3ICs2NTksNyBAQAogCXR0eS0+ZHJpdmVyLT53cml0ZSh0dHksICZjaCwgMSk7CiAJaWYgKHdhc19zdG9wcGVkKQogCQlzdG9wX3R0eSh0dHkpOwotCW11dGV4X3VubG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7CisJdHR5X3dyaXRlX3VubG9jayh0dHkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jIGIvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYwppbmRleCAxM2ZhZjhkLi5kYjU3Mjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCisrKyBiL2RyaXZlcnMvY2hhci92aW90YXBlLmMKQEAgLTg3MywxMiArODczLDEyIEBACiB9CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmlvdGFwX2ZvcHMgPSB7Ci0Jb3duZXI6IFRISVNfTU9EVUxFLAotCXJlYWQ6IHZpb3RhcF9yZWFkLAotCXdyaXRlOiB2aW90YXBfd3JpdGUsCi0JaW9jdGw6IHZpb3RhcF9pb2N0bCwKLQlvcGVuOiB2aW90YXBfb3BlbiwKLQlyZWxlYXNlOiB2aW90YXBfcmVsZWFzZSwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVhZCA9CQl2aW90YXBfcmVhZCwKKwkud3JpdGUgPQl2aW90YXBfd3JpdGUsCisJLmlvY3RsID0JdmlvdGFwX2lvY3RsLAorCS5vcGVuID0JCXZpb3RhcF9vcGVuLAorCS5yZWxlYXNlID0JdmlvdGFwX3JlbGVhc2UsCiB9OwogCiAvKiBIYW5kbGUgaW50ZXJydXB0IGV2ZW50cyBmb3IgdGFwZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Z0LmMgYi9kcml2ZXJzL2NoYXIvdnQuYwppbmRleCA2NjUwYWUxLi5lZGI3MDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdnQuYworKysgYi9kcml2ZXJzL2NoYXIvdnQuYwpAQCAtNzI5LDEwICs3MjksOSBAQAogCSAgICAvKiBhbHRob3VnaCB0aGUgbnVtYmVycyBhYm92ZSBhcmUgbm90IHZhbGlkIHNpbmNlIGxvbmcgYWdvLCB0aGUKIAkgICAgICAgcG9pbnQgaXMgc3RpbGwgdXAtdG8tZGF0ZSBhbmQgdGhlIGNvbW1lbnQgc3RpbGwgaGFzIGl0cyB2YWx1ZQogCSAgICAgICBldmVuIGlmIG9ubHkgYXMgYSBoaXN0b3JpY2FsIGFydGlmYWN0LiAgLS1taiwgSnVseSAxOTk4ICovCi0JICAgIHZjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZjX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkgICAgdmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmNfZGF0YSksIEdGUF9LRVJORUwpOwogCSAgICBpZiAoIXZjKQogCQlyZXR1cm4gLUVOT01FTTsKLQkgICAgbWVtc2V0KHZjLCAwLCBzaXplb2YoKnZjKSk7CiAJICAgIHZjX2NvbnNbY3VycmNvbnNdLmQgPSB2YzsKIAkgICAgSU5JVF9XT1JLKCZ2Y19jb25zW2N1cnJjb25zXS5TQUtfd29yaywgdmNfU0FLKTsKIAkgICAgdmlzdWFsX2luaXQodmMsIGN1cnJjb25zLCAxKTsKQEAgLTE5OTEsOCArMTk5MCw3IEBACiAJCXsgMHhGRTEwLCAweEZFMTkgfSwgeyAweEZFMzAsIDB4RkU2RiB9LCB7IDB4RkYwMCwgMHhGRjYwIH0sCiAJCXsgMHhGRkUwLCAweEZGRTYgfSwgeyAweDIwMDAwLCAweDJGRkZEIH0sIHsgMHgzMDAwMCwgMHgzRkZGRCB9CiAJfTsKLQlyZXR1cm4gYmlzZWFyY2godWNzLCBkb3VibGVfd2lkdGgsCi0JCXNpemVvZihkb3VibGVfd2lkdGgpIC8gc2l6ZW9mKCpkb3VibGVfd2lkdGgpIC0gMSk7CisJcmV0dXJuIGJpc2VhcmNoKHVjcywgZG91YmxlX3dpZHRoLCBBUlJBWV9TSVpFKGRvdWJsZV93aWR0aCkgLSAxKTsKIH0KIAogLyogYWNxdWlyZXMgY29uc29sZV9zZW0gKi8KQEAgLTI5ODksOCArMjk4NywyNCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgdW5iaW5kX2Nvbl9kcml2ZXIoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3csIGludCBmaXJzdCwgaW50IGxhc3QsCi0JCQkgICAgIGludCBkZWZsdCkKKy8qKgorICogdW5iaW5kX2Nvbl9kcml2ZXIgLSB1bmJpbmQgYSBjb25zb2xlIGRyaXZlcgorICogQGNzdzogcG9pbnRlciB0byBjb25zb2xlIGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKiBAZmlyc3Q6IGZpcnN0IGluIHJhbmdlIG9mIGNvbnNvbGVzIHRoYXQgQGNzdyBzaG91bGQgYmUgdW5ib3VuZCBmcm9tCisgKiBAbGFzdDogbGFzdCBpbiByYW5nZSBvZiBjb25zb2xlcyB0aGF0IEBjc3cgc2hvdWxkIGJlIHVuYm91bmQgZnJvbQorICogQGRlZmx0OiBzaG91bGQgbmV4dCBib3VuZCBjb25zb2xlIGRyaXZlciBiZSBkZWZhdWx0IGFmdGVyIEBjc3cgaXMgdW5ib3VuZD8KKyAqCisgKiBUbyB1bmJpbmQgYSBkcml2ZXIgZnJvbSBhbGwgcG9zc2libGUgY29uc29sZXMsIHBhc3MgMCBhcyBAZmlyc3QgYW5kCisgKiAlTUFYX05SX0NPTlNPTEVTIGFzIEBsYXN0LgorICoKKyAqIEBkZWZsdCBjb250cm9scyB3aGV0aGVyIHRoZSBjb25zb2xlIHRoYXQgZW5kcyB1cCByZXBsYWNpbmcgQGNzdyBzaG91bGQgYmUKKyAqIHRoZSBkZWZhdWx0IGNvbnNvbGUuCisgKgorICogUkVUVVJOUzoKKyAqIC1FTk9ERVYgaWYgQGNzdyBpc24ndCBhIHJlZ2lzdGVyZWQgY29uc29sZSBkcml2ZXIgb3IgY2FuJ3QgYmUgdW5yZWdpc3RlcmVkCisgKiBvciAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB1bmJpbmRfY29uX2RyaXZlcihjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCwgaW50IGRlZmx0KQogewogCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gY3N3LT5vd25lcjsKIAljb25zdCBzdHJ1Y3QgY29uc3cgKmRlZmNzdyA9IE5VTEw7CkBAIC0zMDc1LDYgKzMwODksNyBAQAogCXJldHVybiByZXR2YWw7CiAKIH0KK0VYUE9SVF9TWU1CT0wodW5iaW5kX2Nvbl9kcml2ZXIpOwogCiBzdGF0aWMgaW50IHZ0X2JpbmQoc3RydWN0IGNvbl9kcml2ZXIgKmNvbikKIHsKQEAgLTM0OTEsOSArMzUwNiw2IEBACiAJCX0KIAkJcmV0dXJuOwogCX0KLQlpZiAoYmxhbmtfc3RhdGUgIT0gYmxhbmtfbm9ybWFsX3dhaXQpCi0JCXJldHVybjsKLQlibGFua19zdGF0ZSA9IGJsYW5rX29mZjsKIAogCS8qIGVudGVyaW5nIGdyYXBoaWNzIG1vZGU/ICovCiAJaWYgKGVudGVyaW5nX2dmeCkgewpAQCAtMzUwMSwxMCArMzUxMywxNSBAQAogCQlzYXZlX3NjcmVlbih2Yyk7CiAJCXZjLT52Y19zdy0+Y29uX2JsYW5rKHZjLCAtMSwgMSk7CiAJCWNvbnNvbGVfYmxhbmtlZCA9IGZnX2NvbnNvbGUgKyAxOworCQlibGFua19zdGF0ZSA9IGJsYW5rX29mZjsKIAkJc2V0X29yaWdpbih2Yyk7CiAJCXJldHVybjsKIAl9CiAKKwlpZiAoYmxhbmtfc3RhdGUgIT0gYmxhbmtfbm9ybWFsX3dhaXQpCisJCXJldHVybjsKKwlibGFua19zdGF0ZSA9IGJsYW5rX29mZjsKKwogCS8qIGRvbid0IGJsYW5rIGdyYXBoaWNzICovCiAJaWYgKHZjLT52Y19tb2RlICE9IEtEX1RFWFQpIHsKIAkJY29uc29sZV9ibGFua2VkID0gZmdfY29uc29sZSArIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nvbm5lY3Rvci9LY29uZmlnIGIvZHJpdmVycy9jb25uZWN0b3IvS2NvbmZpZwppbmRleCBlMGJkYzBkLi4xMDBiZmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY29ubmVjdG9yL0tjb25maWcKQEAgLTEsNiArMSw1IEBACi1tZW51ICJDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyIgogCi1jb25maWcgQ09OTkVDVE9SCittZW51Y29uZmlnIENPTk5FQ1RPUgogCXRyaXN0YXRlICJDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyIgogCWRlcGVuZHMgb24gTkVUCiAJLS0taGVscC0tLQpAQCAtMTAsNiArOSw4IEBACiAJICBDb25uZWN0b3Igc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBjbi5rby4KIAoraWYgQ09OTkVDVE9SCisKIGNvbmZpZyBQUk9DX0VWRU5UUwogCWJvb2xlYW4gIlJlcG9ydCBwcm9jZXNzIGV2ZW50cyB0byB1c2Vyc3BhY2UiCiAJZGVwZW5kcyBvbiBDT05ORUNUT1I9eQpAQCAtMTgsNCArMTksNCBAQAogCSAgUHJvdmlkZSBhIGNvbm5lY3RvciB0aGF0IHJlcG9ydHMgcHJvY2VzcyBldmVudHMgdG8gdXNlcnNwYWNlLiBTZW5kCiAJICBldmVudHMgc3VjaCBhcyBmb3JrLCBleGVjLCBpZCBjaGFuZ2UgKHVpZCwgZ2lkLCBzdWlkLCBldGMpLCBhbmQgZXhpdC4KIAotZW5kbWVudQorZW5kaWYgIyBDT05ORUNUT1IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL0tjb25maWcgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCmluZGV4IGJiOTBjYmQuLjg0ZWJmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKKysrIGIvZHJpdmVycy9jcnlwdG8vS2NvbmZpZwpAQCAtMSw0ICsxLDkgQEAKLW1lbnUgIkhhcmR3YXJlIGNyeXB0byBkZXZpY2VzIgorCittZW51Y29uZmlnIENSWVBUT19IVworCWJvb2wgIkhhcmR3YXJlIGNyeXB0byBkZXZpY2VzIgorCWRlZmF1bHQgeQorCitpZiBDUllQVE9fSFcKIAogY29uZmlnIENSWVBUT19ERVZfUEFETE9DSwogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBWSUEgUGFkTG9jayBBQ0UiCkBAIC03OCw0ICs4Myw0IEBACiAJICB0aGF0IGNvbnRhaW5zIGFsbCBwYXJ0cyBvZiB0aGUgY3J5cHRvIGRldmljZSBkcml2ZXIgKGFwIGJ1cywKIAkgIHJlcXVlc3Qgcm91dGVyIGFuZCBhbGwgdGhlIGNhcmQgZHJpdmVycykuCiAKLWVuZG1lbnUKK2VuZGlmICMgQ1JZUFRPX0hXCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCBiMzE3NTZkLi44ZjY3MGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTMsNyArMyw3IEBACiAjCiAKIG1lbnUgIkRNQSBFbmdpbmUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiBIQVNfRE1BCiAKIGNvbmZpZyBETUFfRU5HSU5FCiAJYm9vbCAiU3VwcG9ydCBmb3IgRE1BIGVuZ2luZXMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvS2NvbmZpZyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCmluZGV4IDgwN2M0MDIuLmRlYmYxZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCkBAIC02LDExICs2LDkgQEAKICMgJElkOiBLY29uZmlnLHYgMS40LjIuNyAyMDA1LzA3LzA4IDIyOjA1OjM4IGRzcF9sbG5sIEV4cCAkCiAjCiAKLW1lbnUgJ0VEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKScKK21lbnVjb25maWcgRURBQworCXRyaXN0YXRlICJFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIEVEQUMKLQl0cmlzdGF0ZSAiRURBQyBjb3JlIHN5c3RlbSBlcnJvciByZXBvcnRpbmcgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBYODYgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgRURBQyBpcyBkZXNpZ25lZCB0byByZXBvcnQgZXJyb3JzIGluIHRoZSBjb3JlIHN5c3RlbS4KQEAgLTMwLDEzICsyOCwxMiBAQAogCSAgVGhlcmUgaXMgYWxzbyBhIG1haWxpbmcgbGlzdCBmb3IgdGhlIEVEQUMgcHJvamVjdCwgd2hpY2ggY2FuCiAJICBiZSBmb3VuZCB2aWEgdGhlIHNvdXJjZWZvcmdlIHBhZ2UuCiAKK2lmIEVEQUMKIAogY29tbWVudCAiUmVwb3J0aW5nIHN1YnN5c3RlbXMiCi0JZGVwZW5kcyBvbiBFREFDCiAKIGNvbmZpZyBFREFDX0RFQlVHCiAJYm9vbCAiRGVidWdnaW5nIgotCWRlcGVuZHMgb24gRURBQwogCWhlbHAKIAkgIFRoaXMgdHVybnMgb24gZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZW50aXJlIEVEQUMKIAkgIHN1Yi1zeXN0ZW0uIFlvdSBjYW4gaW5zZXJ0IG1vZHVsZSB3aXRoICJkZWJ1Z19sZXZlbD14IiwgY3VycmVudApAQCAtNDUsNyArNDIsNiBAQAogCiBjb25maWcgRURBQ19NTV9FREFDCiAJdHJpc3RhdGUgIk1haW4gTWVtb3J5IEVEQUMgKEVycm9yIERldGVjdGlvbiBBbmQgQ29ycmVjdGlvbikgcmVwb3J0aW5nIgotCWRlcGVuZHMgb24gRURBQwogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFNvbWUgc3lzdGVtcyBhcmUgYWJsZSB0byBkZXRlY3QgYW5kIGNvcnJlY3QgZXJyb3JzIGluIG1haW4KQEAgLTEwMCwxNSArOTYsMTMgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJFcnJvciBkZXRlY3RpbmcgbWV0aG9kIgotCWRlcGVuZHMgb24gRURBQwogCWRlZmF1bHQgRURBQ19QT0xMCiAKIGNvbmZpZyBFREFDX1BPTEwKIAlib29sICJQb2xsIGZvciBlcnJvcnMiCi0JZGVwZW5kcyBvbiBFREFDCiAJaGVscAogCSAgUG9sbCB0aGUgY2hpcHNldCBwZXJpb2RpY2FsbHkgdG8gZGV0ZWN0IGVycm9ycy4KIAogZW5kY2hvaWNlCiAKLWVuZG1lbnUKK2VuZGlmICMgRURBQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKaW5kZXggN2I2MjIzMC4uODA0ODc1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCkBAIC0xOTA2LDYgKzE5MDYsNyBAQAogCiBzdGF0aWMgaW50IGVkYWNfa2VybmVsX3RocmVhZCh2b2lkICphcmcpCiB7CisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCWRvX2VkYWNfY2hlY2soKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZGQuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWRkLmMKaW5kZXggMTUyMzIyNy4uMGZiNzMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZGQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jCkBAIC02NjksNyArNjY5LDcgQEAKIAlzdHJ1Y3QgZWRkX2luZm8gKmluZm8gPSBlZGRfZGV2X2dldF9pbmZvKGVkZXYpOwogCiAJaWYgKGVkZF9kZXZfaXNfdHlwZShlZGV2LCAiUENJIikpIHsKLQkJcmV0dXJuIHBjaV9maW5kX3Nsb3QoaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5idXMsCisJCXJldHVybiBwY2lfZ2V0X2J1c19hbmRfc2xvdChpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLmJ1cywKIAkJCQkgICAgIFBDSV9ERVZGTihpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLnNsb3QsCiAJCQkJCSAgICAgICBpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLgogCQkJCQkgICAgICAgZnVuY3Rpb24pKTsKQEAgLTY4Miw5ICs2ODIsMTIgQEAKIHsKIAogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gZWRkX2dldF9wY2lfZGV2KGVkZXYpOworCWludCByZXQ7CiAJaWYgKCFwY2lfZGV2KQogCQlyZXR1cm4gMTsKLQlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJmVkZXYtPmtvYmosJnBjaV9kZXYtPmRldi5rb2JqLCJwY2lfZGV2Iik7CisJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmVkZXYtPmtvYmosJnBjaV9kZXYtPmRldi5rb2JqLCJwY2lfZGV2Iik7CisJcGNpX2Rldl9wdXQocGNpX2Rldik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYyBiL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCmluZGV4IDJiNGI3NmUuLjU4ZTlmOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8YXNtL3ZnYS5oPgogI2luY2x1ZGUgInBjZHAuaCIKIApAQCAtMjcsNyArMjgsNyBAQAogCWNoYXIgcGFyaXR5OwogCiAJbW1pbyA9ICh1YXJ0LT5hZGRyLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpOwotCXAgKz0gc3ByaW50ZihwLCAiY29uc29sZT11YXJ0LCVzLDB4JWx4IiwKKwlwICs9IHNwcmludGYocCwgInVhcnQ4MjUwLCVzLDB4JWx4IiwKIAkJbW1pbyA/ICJtbWlvIiA6ICJpbyIsIHVhcnQtPmFkZHIuYWRkcmVzcyk7CiAJaWYgKHVhcnQtPmJhdWQpIHsKIAkJcCArPSBzcHJpbnRmKHAsICIsJWx1IiwgdWFydC0+YmF1ZCk7CkBAIC00MSw3ICs0Miw4IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gZWFybHlfc2VyaWFsX2NvbnNvbGVfaW5pdChvcHRpb25zKTsKKwlhZGRfcHJlZmVycmVkX2NvbnNvbGUoInVhcnQiLCA4MjUwLCAmb3B0aW9uc1s5XSk7CisJcmV0dXJuIHNldHVwX2Vhcmx5X3NlcmlhbDgyNTBfY29uc29sZShvcHRpb25zKTsKICNlbHNlCiAJcmV0dXJuIC1FTk9ERVY7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03MC5jIGIvZHJpdmVycy9od21vbi9sbTcwLmMKaW5kZXggN2VhYWUzOC4uMjc1ZDM5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTcwLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTcwLmMKQEAgLTk2LDYgKzk2LDEwIEBACiAJc3RydWN0IGxtNzAgKnBfbG03MDsKIAlpbnQgc3RhdHVzOwogCisJLyogc2lnbmFsaW5nIGlzIFNQSV9NT0RFXzAgb24gYSAzLXdpcmUgbGluayAoc2hhcmVkIFNJL1NPKSAqLworCWlmICgoc3BpLT5tb2RlICYgKFNQSV9DUE9MfFNQSV9DUEhBKSkgfHwgIShzcGktPm1vZGUgJiBTUElfM1dJUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXBfbG03MCA9IGt6YWxsb2Moc2l6ZW9mICpwX2xtNzAsIEdGUF9LRVJORUwpOwogCWlmICghcF9sbTcwKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCmluZGV4IDAzMTg4ZDIuLjE3Y2VjZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYwpAQCAtNjMwLDcgKzYzMCw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbWNtc3B0d2lfZHJpdmVyID0gewogCS5wcm9iZSAgPSBwbWNtc3B0d2lfcHJvYmUsCiAJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHBtY21zcHR3aV9yZW1vdmUpLAotCS5kcml2ZXIgeworCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gRFJWX05BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwppbmRleCAzOTQ0ZTg4Li4yZTFjMjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKQEAgLTE1Myw0ICsxNTMsMTQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRzbDI1NTAuCiAKK2NvbmZpZyBNRU5FTEFVUworCWJvb2wgIlRXTDkyMzMwL01lbmVsYXVzIFBNIGNoaXAiCisJZGVwZW5kcyBvbiBJMkM9eSAmJiBBUkNIX09NQVAyNFhYCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cworCSAgVFdMOTIzMzAvTWVuZWxhdXMgUG93ZXIgTWFuYWdlbWVudCBjaGlwLiBUaGlzIGluY2x1ZGUgdm9sdGFnZQorCSAgcmVndWxhdG9ycywgRHVhbCBzbG90IG1lbW9yeSBjYXJkIHRyYW5jZWl2ZXJzLCByZWFsLXRpbWUgY2xvY2sKKwkgIGFuZCBvdGhlciBmZWF0dXJlcyB0aGF0IGFyZSBvZnRlbiB1c2VkIGluIHBvcnRhYmxlIGRldmljZXMgbGlrZQorCSAgY2VsbCBwaG9uZXMgYW5kIFBEQXMuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKaW5kZXggZDhjYmViMy4uY2E5MjRlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKQEAgLTEzLDYgKzEzLDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX1BDRjg1OTEpCSs9IHBjZjg1OTEubwogb2JqLSQoQ09ORklHX0lTUDEzMDFfT01BUCkJKz0gaXNwMTMwMV9vbWFwLm8KIG9iai0kKENPTkZJR19UUFM2NTAxMCkJCSs9IHRwczY1MDEwLm8KK29iai0kKENPTkZJR19NRU5FTEFVUykJCSs9IG1lbmVsYXVzLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1RTTDI1NTApCSs9IHRzbDI1NTAubwogCiBpZmVxICgkKENPTkZJR19JMkNfREVCVUdfQ0hJUCkseSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL21lbmVsYXVzLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9tZW5lbGF1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTdlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9tZW5lbGF1cy5jCkBAIC0wLDAgKzEsMTI4MSBAQAorI2RlZmluZSBERUJVRworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFNvbWUgcGFydHMgYmFzZWQgdHBzNjUwMTAuYzoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cyBhbmQKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogU29tZSBwYXJ0cyBiYXNlZCBvbiB0bHYzMjBhaWMyNC5jOgorICogQ29weXJpZ2h0IChDKSBieSBLYWkgU3ZhaG4gPGthaS5zdmFobkBub2tpYS5jb20+CisgKgorICogQ2hhbmdlcyBmb3IgaW50ZXJydXB0IGhhbmRsaW5nIGFuZCBjbGVhbi11cCBieQorICogVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4gYW5kIEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIENsZWFudXAgYW5kIGdlbmVyYWxpemVkIHN1cHBvcnQgZm9yIHZvbHRhZ2Ugc2V0dGluZyBieQorICogSnVoYSBZcmpvbGEKKyAqIEFkZGVkIHN1cHBvcnQgZm9yIGNvbnRyb2xsaW5nIFZDT1JFIGFuZCByZWd1bGF0b3Igc2xlZXAgc3RhdGVzLAorICogQW1pdCBLdWNoZXJpYSA8YW1pdC5rdWNoZXJpYUBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW5lbGF1cy5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkJIm1lbmVsYXVzIgorCisjZGVmaW5lIHByX2VycihmbXQsIGFyZy4uLikJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6ICIsICMjIGFyZyk7CisKKyNkZWZpbmUgTUVORUxBVVNfSTJDX0FERFJFU1MJCTB4NzIKKworI2RlZmluZSBNRU5FTEFVU19SRVYJCQkweDAxCisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkwxCQkweDAyCisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkwyCQkweDAzCisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkwzCQkweDA0CisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkw0CQkweDA1CisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkw1CQkweDA2CisjZGVmaW5lIE1FTkVMQVVTX0RDRENfQ1RSTDEJCTB4MDcKKyNkZWZpbmUgTUVORUxBVVNfRENEQ19DVFJMMgkJMHgwOAorI2RlZmluZSBNRU5FTEFVU19EQ0RDX0NUUkwzCQkweDA5CisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMMQkJMHgwQQorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDIJCTB4MEIKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkwzCQkweDBDCisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMNAkJMHgwRAorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDUJCTB4MEUKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkw2CQkweDBGCisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMNwkJMHgxMAorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDgJCTB4MTEKKyNkZWZpbmUgTUVORUxBVVNfU0xFRVBfQ1RSTDEJCTB4MTIKKyNkZWZpbmUgTUVORUxBVVNfU0xFRVBfQ1RSTDIJCTB4MTMKKyNkZWZpbmUgTUVORUxBVVNfREVWSUNFX09GRgkJMHgxNAorI2RlZmluZSBNRU5FTEFVU19PU0NfQ1RSTAkJMHgxNQorI2RlZmluZSBNRU5FTEFVU19ERVRFQ1RfQ1RSTAkJMHgxNgorI2RlZmluZSBNRU5FTEFVU19JTlRfTUFTSzEJCTB4MTcKKyNkZWZpbmUgTUVORUxBVVNfSU5UX01BU0syCQkweDE4CisjZGVmaW5lIE1FTkVMQVVTX0lOVF9TVEFUVVMxCQkweDE5CisjZGVmaW5lIE1FTkVMQVVTX0lOVF9TVEFUVVMyCQkweDFBCisjZGVmaW5lIE1FTkVMQVVTX0lOVF9BQ0sxCQkweDFCCisjZGVmaW5lIE1FTkVMQVVTX0lOVF9BQ0syCQkweDFDCisjZGVmaW5lIE1FTkVMQVVTX0dQSU9fQ1RSTAkJMHgxRAorI2RlZmluZSBNRU5FTEFVU19HUElPX0lOCQkweDFFCisjZGVmaW5lIE1FTkVMQVVTX0dQSU9fT1VUCQkweDFGCisjZGVmaW5lIE1FTkVMQVVTX0JCU01TCQkJMHgyMAorI2RlZmluZSBNRU5FTEFVU19SVENfQ1RSTAkJMHgyMQorI2RlZmluZSBNRU5FTEFVU19SVENfVVBEQVRFCQkweDIyCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19TRUMJCTB4MjMKKyNkZWZpbmUgTUVORUxBVVNfUlRDX01JTgkJMHgyNAorI2RlZmluZSBNRU5FTEFVU19SVENfSFIJCQkweDI1CisjZGVmaW5lIE1FTkVMQVVTX1JUQ19EQVkJCTB4MjYKKyNkZWZpbmUgTUVORUxBVVNfUlRDX01PTgkJMHgyNworI2RlZmluZSBNRU5FTEFVU19SVENfWVIJCQkweDI4CisjZGVmaW5lIE1FTkVMQVVTX1JUQ19XS0RBWQkJMHgyOQorI2RlZmluZSBNRU5FTEFVU19SVENfQUxfU0VDCQkweDJBCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19BTF9NSU4JCTB4MkIKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0FMX0hSCQkweDJDCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19BTF9EQVkJCTB4MkQKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0FMX01PTgkJMHgyRQorI2RlZmluZSBNRU5FTEFVU19SVENfQUxfWVIJCTB4MkYKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0NPTVBfTVNCCQkweDMwCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19DT01QX0xTQgkJMHgzMQorI2RlZmluZSBNRU5FTEFVU19TMV9QVUxMX0VOCQkweDMyCisjZGVmaW5lIE1FTkVMQVVTX1MxX1BVTExfRElSCQkweDMzCisjZGVmaW5lIE1FTkVMQVVTX1MyX1BVTExfRU4JCTB4MzQKKyNkZWZpbmUgTUVORUxBVVNfUzJfUFVMTF9ESVIJCTB4MzUKKyNkZWZpbmUgTUVORUxBVVNfTUNUX0NUUkwxCQkweDM2CisjZGVmaW5lIE1FTkVMQVVTX01DVF9DVFJMMgkJMHgzNworI2RlZmluZSBNRU5FTEFVU19NQ1RfQ1RSTDMJCTB4MzgKKyNkZWZpbmUgTUVORUxBVVNfTUNUX1BJTl9TVAkJMHgzOQorI2RlZmluZSBNRU5FTEFVU19ERUJPVU5DRTEJCTB4M0EKKworI2RlZmluZSBJSF9NRU5FTEFVU19JUlFTCQkxMgorI2RlZmluZSBNRU5FTEFVU19NTUNfUzFDRF9JUlEJCTAJLyogTU1DIHNsb3QgMSBjYXJkIGNoYW5nZSAqLworI2RlZmluZSBNRU5FTEFVU19NTUNfUzJDRF9JUlEJCTEJLyogTU1DIHNsb3QgMiBjYXJkIGNoYW5nZSAqLworI2RlZmluZSBNRU5FTEFVU19NTUNfUzFEMV9JUlEJCTIJLyogTU1DIERBVDEgbG93IGluIHNsb3QgMSAqLworI2RlZmluZSBNRU5FTEFVU19NTUNfUzJEMV9JUlEJCTMJLyogTU1DIERBVDEgbG93IGluIHNsb3QgMiAqLworI2RlZmluZSBNRU5FTEFVU19MT1dCQVRfSVJRCQk0CS8qIExvdyBiYXR0ZXJ5ICovCisjZGVmaW5lIE1FTkVMQVVTX0hPVERJRV9JUlEJCTUJLyogSG90IGRpZSBkZXRlY3QgKi8KKyNkZWZpbmUgTUVORUxBVVNfVVZMT19JUlEJCTYJLyogVVZMTyBkZXRlY3QgKi8KKyNkZWZpbmUgTUVORUxBVVNfVFNIVVRfSVJRCQk3CS8qIFRoZXJtYWwgc2h1dGRvd24gKi8KKyNkZWZpbmUgTUVORUxBVVNfUlRDVE1SX0lSUQkJOAkvKiBSVEMgdGltZXIgKi8KKyNkZWZpbmUgTUVORUxBVVNfUlRDQUxNX0lSUQkJOQkvKiBSVEMgYWxhcm0gKi8KKyNkZWZpbmUgTUVORUxBVVNfUlRDRVJSX0lSUQkJMTAJLyogUlRDIGVycm9yICovCisjZGVmaW5lIE1FTkVMQVVTX1BTSEJUTl9JUlEJCTExCS8qIFB1c2ggYnV0dG9uICovCisjZGVmaW5lIE1FTkVMQVVTX1JFU0VSVkVEMTJfSVJRCQkxMgkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNRU5FTEFVU19SRVNFUlZFRDEzX0lSUQkJMTMJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUVORUxBVVNfUkVTRVJWRUQxNF9JUlEJCTE0CS8qIFJlc2VydmVkICovCisjZGVmaW5lIE1FTkVMQVVTX1JFU0VSVkVEMTVfSVJRCQkxNQkvKiBSZXNlcnZlZCAqLworCitzdGF0aWMgdm9pZCBtZW5lbGF1c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqX21lbmVsYXVzKTsKKworc3RydWN0IG1lbmVsYXVzX2NoaXAgeworCXN0cnVjdCBtdXRleAkJbG9jazsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOworI2lmZGVmIENPTkZJR19SVENfRFJWX1RXTDkyMzMwCisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwl1OAkJCXJ0Y19jb250cm9sOworCXVuc2lnbmVkCQl1aWU6MTsKKyNlbmRpZgorCXVuc2lnbmVkCQl2Y29yZV9od19tb2RlOjE7CisJdTgJCQltYXNrMSwgbWFzazI7CisJdm9pZAkJCSgqaGFuZGxlcnNbMTZdKShzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqKTsKKwl2b2lkCQkJKCptbWNfY2FsbGJhY2spKHZvaWQgKmRhdGEsIHU4IG1hc2spOworCXZvaWQJCQkqbW1jX2NhbGxiYWNrX2RhdGE7Cit9OworCitzdGF0aWMgc3RydWN0IG1lbmVsYXVzX2NoaXAgKnRoZV9tZW5lbGF1czsKKworc3RhdGljIGludCBtZW5lbGF1c193cml0ZV9yZWcoaW50IHJlZywgdTggdmFsdWUpCit7CisJaW50IHZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEodGhlX21lbmVsYXVzLT5jbGllbnQsIHJlZywgdmFsdWUpOworCisJaWYgKHZhbCA8IDApIHsKKwkJcHJfZXJyKCJ3cml0ZSBlcnJvciIpOworCQlyZXR1cm4gdmFsOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX3JlYWRfcmVnKGludCByZWcpCit7CisJaW50IHZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSh0aGVfbWVuZWxhdXMtPmNsaWVudCwgcmVnKTsKKworCWlmICh2YWwgPCAwKQorCQlwcl9lcnIoInJlYWQgZXJyb3IiKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfZW5hYmxlX2lycShpbnQgaXJxKQoreworCWlmIChpcnEgPiA3KSB7CisJCWlycSAtPSA4OworCQl0aGVfbWVuZWxhdXMtPm1hc2syICY9IH4oMSA8PCBpcnEpOworCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMiwKKwkJCQl0aGVfbWVuZWxhdXMtPm1hc2syKTsKKwl9IGVsc2UgeworCQl0aGVfbWVuZWxhdXMtPm1hc2sxICY9IH4oMSA8PCBpcnEpOworCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMSwKKwkJCQl0aGVfbWVuZWxhdXMtPm1hc2sxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfZGlzYWJsZV9pcnEoaW50IGlycSkKK3sKKwlpZiAoaXJxID4gNykgeworCQlpcnEgLT0gODsKKwkJdGhlX21lbmVsYXVzLT5tYXNrMiB8PSAoMSA8PCBpcnEpOworCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMiwKKwkJCQl0aGVfbWVuZWxhdXMtPm1hc2syKTsKKwl9IGVsc2UgeworCQl0aGVfbWVuZWxhdXMtPm1hc2sxIHw9ICgxIDw8IGlycSk7CisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0sxLAorCQkJCXRoZV9tZW5lbGF1cy0+bWFzazEpOworCX0KK30KKworc3RhdGljIGludCBtZW5lbGF1c19hY2tfaXJxKGludCBpcnEpCit7CisJaWYgKGlycSA+IDcpCisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX0FDSzIsIDEgPDwgKGlycSAtIDgpKTsKKwllbHNlCisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX0FDSzEsIDEgPDwgaXJxKTsKK30KKworLyogQWRkcyBhIGhhbmRsZXIgZm9yIGFuIGludGVycnVwdC4gRG9lcyBub3QgcnVuIGluIGludGVycnVwdCBjb250ZXh0ICovCitzdGF0aWMgaW50IG1lbmVsYXVzX2FkZF9pcnFfd29yayhpbnQgaXJxLAorCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IG1lbmVsYXVzX2NoaXAgKikpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXRoZV9tZW5lbGF1cy0+aGFuZGxlcnNbaXJxXSA9IGhhbmRsZXI7CisJcmV0ID0gbWVuZWxhdXNfZW5hYmxlX2lycShpcnEpOworCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlbW92ZXMgaGFuZGxlciBmb3IgYW4gaW50ZXJydXB0ICovCitzdGF0aWMgaW50IG1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhpbnQgaXJxKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c19kaXNhYmxlX2lycShpcnEpOworCXRoZV9tZW5lbGF1cy0+aGFuZGxlcnNbaXJxXSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdldHMgc2NoZWR1bGVkIHdoZW4gYSBjYXJkIGRldGVjdCBpbnRlcnJ1cHQgaGFwcGVucy4gTm90ZSB0aGF0IGluIHNvbWUgY2FzZXMKKyAqIHRoaXMgbGluZSBpcyB3aXJlZCB0byBjYXJkIGNvdmVyIHN3aXRjaCByYXRoZXIgdGhhbiB0aGUgY2FyZCBkZXRlY3Qgc3dpdGNoCisgKiBpbiBlYWNoIHNsb3QuIEluIHRoaXMgY2FzZSB0aGUgY2FyZHMgYXJlIG5vdCBzZWVuIGJ5IG1lbmVsYXVzLgorICogRklYTUU6IEFkZCBoYW5kbGluZyBmb3IgRDEgdG9vCisgKi8KK3N0YXRpYyB2b2lkIG1lbmVsYXVzX21tY19jZF93b3JrKHN0cnVjdCBtZW5lbGF1c19jaGlwICptZW5lbGF1c19odykKK3sKKwlpbnQgcmVnOworCXVuc2lnbmVkIGNoYXIgY2FyZF9tYXNrID0gMDsKKworCXJlZyA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX01DVF9QSU5fU1QpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoIShyZWcgJiAweDEpKQorCQljYXJkX21hc2sgfD0gKDEgPDwgMCk7CisKKwlpZiAoIShyZWcgJiAweDIpKQorCQljYXJkX21hc2sgfD0gKDEgPDwgMSk7CisKKwlpZiAobWVuZWxhdXNfaHctPm1tY19jYWxsYmFjaykKKwkJbWVuZWxhdXNfaHctPm1tY19jYWxsYmFjayhtZW5lbGF1c19ody0+bW1jX2NhbGxiYWNrX2RhdGEsCisJCQkJCSAgY2FyZF9tYXNrKTsKK30KKworLyoKKyAqIFRvZ2dsZXMgdGhlIE1NQyBzbG90cyBiZXR3ZWVuIG9wZW4tZHJhaW4gYW5kIHB1c2gtcHVsbCBtb2RlLgorICovCitpbnQgbWVuZWxhdXNfc2V0X21tY19vcGVuZHJhaW4oaW50IHNsb3QsIGludCBlbmFibGUpCit7CisJaW50IHJldCwgdmFsOworCisJaWYgKHNsb3QgIT0gMSAmJiBzbG90ICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0ID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfTUNUX0NUUkwxKTsKKwlpZiAocmV0IDwgMCkgeworCQltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCXZhbCA9IHJldDsKKwlpZiAoc2xvdCA9PSAxKSB7CisJCWlmIChlbmFibGUpCisJCQl2YWwgfD0gMSA8PCAyOworCQllbHNlCisJCQl2YWwgJj0gfigxIDw8IDIpOworCX0gZWxzZSB7CisJCWlmIChlbmFibGUpCisJCQl2YWwgfD0gMSA8PCAzOworCQllbHNlCisJCQl2YWwgJj0gfigxIDw8IDMpOworCX0KKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfTUNUX0NUUkwxLCB2YWwpOworCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF9tbWNfb3BlbmRyYWluKTsKKworaW50IG1lbmVsYXVzX3NldF9zbG90X3NlbChpbnQgZW5hYmxlKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX0dQSU9fQ1RSTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCB8PSAweDAyOworCWlmIChlbmFibGUpCisJCXJldCB8PSAxIDw8IDU7CisJZWxzZQorCQlyZXQgJj0gfigxIDw8IDUpOworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19HUElPX0NUUkwsIHJldCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF9zbG90X3NlbCk7CisKK2ludCBtZW5lbGF1c19zZXRfbW1jX3Nsb3QoaW50IHNsb3QsIGludCBlbmFibGUsIGludCBwb3dlciwgaW50IGNkX2VuKQoreworCWludCByZXQsIHZhbDsKKworCWlmIChzbG90ICE9IDEgJiYgc2xvdCAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG93ZXIgPj0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCisJcmV0ID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfTUNUX0NUUkwyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdmFsID0gcmV0OworCWlmIChzbG90ID09IDEpIHsKKwkJaWYgKGNkX2VuKQorCQkJdmFsIHw9ICgxIDw8IDQpIHwgKDEgPDwgNik7CisJCWVsc2UKKwkJCXZhbCAmPSB+KCgxIDw8IDQpIHwgKDEgPDwgNikpOworCX0gZWxzZSB7CisJCWlmIChjZF9lbikKKwkJCXZhbCB8PSAoMSA8PCA1KSB8ICgxIDw8IDcpOworCQllbHNlCisJCQl2YWwgJj0gfigoMSA8PCA1KSB8ICgxIDw8IDcpKTsKKwl9CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX01DVF9DVFJMMiwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl2YWwgPSByZXQ7CisJaWYgKHNsb3QgPT0gMSkgeworCQlpZiAoZW5hYmxlKQorCQkJdmFsIHw9IDEgPDwgMDsKKwkJZWxzZQorCQkJdmFsICY9IH4oMSA8PCAwKTsKKwl9IGVsc2UgeworCQlpbnQgYjsKKworCQlpZiAoZW5hYmxlKQorCQkJcmV0IHw9IDEgPDwgMTsKKwkJZWxzZQorCQkJcmV0ICY9IH4oMSA8PCAxKTsKKwkJYiA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX01DVF9DVFJMMik7CisJCWIgJj0gfjB4MDM7CisJCWIgfD0gcG93ZXI7CisJCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDIsIGIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKwkvKiBEaXNhYmxlIGF1dG9ub21vdXMgc2h1dGRvd24gKi8KKwl2YWwgJj0gfigweDAzIDw8IDIpOworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDMsIHZhbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF9tbWNfc2xvdCk7CisKK2ludCBtZW5lbGF1c19yZWdpc3Rlcl9tbWNfY2FsbGJhY2sodm9pZCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhLCB1OCBjYXJkX21hc2spLAorCQkJCSAgIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwl0aGVfbWVuZWxhdXMtPm1tY19jYWxsYmFja19kYXRhID0gZGF0YTsKKwl0aGVfbWVuZWxhdXMtPm1tY19jYWxsYmFjayA9IGNhbGxiYWNrOworCXJldCA9IG1lbmVsYXVzX2FkZF9pcnFfd29yayhNRU5FTEFVU19NTUNfUzFDRF9JUlEsCisJCQkJICAgIG1lbmVsYXVzX21tY19jZF93b3JrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MyQ0RfSVJRLAorCQkJCSAgICBtZW5lbGF1c19tbWNfY2Rfd29yayk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gbWVuZWxhdXNfYWRkX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMUQxX0lSUSwKKwkJCQkgICAgbWVuZWxhdXNfbW1jX2NkX3dvcmspOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG1lbmVsYXVzX2FkZF9pcnFfd29yayhNRU5FTEFVU19NTUNfUzJEMV9JUlEsCisJCQkJICAgIG1lbmVsYXVzX21tY19jZF93b3JrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3JlZ2lzdGVyX21tY19jYWxsYmFjayk7CisKK3ZvaWQgbWVuZWxhdXNfdW5yZWdpc3Rlcl9tbWNfY2FsbGJhY2sodm9pZCkKK3sKKwltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MxQ0RfSVJRKTsKKwltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MyQ0RfSVJRKTsKKwltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MxRDFfSVJRKTsKKwltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MyRDFfSVJRKTsKKworCXRoZV9tZW5lbGF1cy0+bW1jX2NhbGxiYWNrID0gTlVMTDsKKwl0aGVfbWVuZWxhdXMtPm1tY19jYWxsYmFja19kYXRhID0gMDsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfdW5yZWdpc3Rlcl9tbWNfY2FsbGJhY2spOworCitzdHJ1Y3QgbWVuZWxhdXNfdnRnIHsKKwljb25zdCBjaGFyICpuYW1lOworCXU4IHZ0Z19yZWc7CisJdTggdnRnX3NoaWZ0OworCXU4IHZ0Z19iaXRzOworCXU4IG1vZGVfcmVnOworfTsKKworc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB7CisJdTE2IHZ0ZzsKKwl1MTYgdmFsOworfTsKKworc3RhdGljIGludCBtZW5lbGF1c19zZXRfdm9sdGFnZShjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnICp2dGcsIGludCBtViwKKwkJCQlpbnQgdnRnX3ZhbCwgaW50IG1vZGUpCit7CisJaW50IHZhbCwgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdGhlX21lbmVsYXVzLT5jbGllbnQ7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCWlmICh2dGcgPT0gMCkKKwkJZ290byBzZXRfdm9sdGFnZTsKKworCXJldCA9IG1lbmVsYXVzX3JlYWRfcmVnKHZ0Zy0+dnRnX3JlZyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXZhbCA9IHJldCAmIH4oKCgxIDw8IHZ0Zy0+dnRnX2JpdHMpIC0gMSkgPDwgdnRnLT52dGdfc2hpZnQpOworCXZhbCB8PSB2dGdfdmFsIDw8IHZ0Zy0+dnRnX3NoaWZ0OworCisJZGV2X2RiZygmYy0+ZGV2LCAiU2V0dGluZyB2b2x0YWdlICclcyciCisJCQkgInRvICVkIG1WIChyZWcgMHglMDJ4LCB2YWwgMHglMDJ4KVxuIiwKKwkJCXZ0Zy0+bmFtZSwgbVYsIHZ0Zy0+dnRnX3JlZywgdmFsKTsKKworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyh2dGctPnZ0Z19yZWcsIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0Oworc2V0X3ZvbHRhZ2U6CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKHZ0Zy0+bW9kZV9yZWcsIG1vZGUpOworb3V0OgorCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlpZiAocmV0ID09IDApIHsKKwkJLyogV2FpdCBmb3Igdm9sdGFnZSB0byBzdGFiaWxpemUgKi8KKwkJbXNsZWVwKDEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX2dldF92dGdfdmFsdWUoaW50IHZ0ZywgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSAqdGJsLAorCQkJCSAgaW50IG4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCB0YmwrKykKKwkJaWYgKHRibC0+dnRnID09IHZ0ZykKKwkJCXJldHVybiB0YmwtPnZhbDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFZjb3JlIGNhbiBiZSBwcm9ncmFtbWVkIGluIHR3byB3YXlzOgorICogU1ctY29udHJvbGxlZDogUmVxdWlyZWQgdm9sdGFnZSBpcyBwcm9ncmFtbWVkIGludG8gVkNPUkVfQ1RSTDEKKyAqIEhXLWNvbnRyb2xsZWQ6IFJlcXVpcmVkIHJhbmdlIChyb29mLWZsb29yKSBpcyBwcm9ncmFtbWVkIGludG8gVkNPUkVfQ1RSTDMKKyAqIGFuZCBWQ09SRV9DVFJMNAorICoKKyAqIENhbGwgY29ycmVjdCAnc2V0JyBmdW5jdGlvbiBhY2NvcmRpbmdseQorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlIHZjb3JlX3ZhbHVlc1tdID0geworCXsgMTAwMCwgMCB9LAorCXsgMTAyNSwgMSB9LAorCXsgMTA1MCwgMiB9LAorCXsgMTA3NSwgMyB9LAorCXsgMTEwMCwgNCB9LAorCXsgMTEyNSwgNSB9LAorCXsgMTE1MCwgNiB9LAorCXsgMTE3NSwgNyB9LAorCXsgMTIwMCwgOCB9LAorCXsgMTIyNSwgOSB9LAorCXsgMTI1MCwgMTAgfSwKKwl7IDEyNzUsIDExIH0sCisJeyAxMzAwLCAxMiB9LAorCXsgMTMyNSwgMTMgfSwKKwl7IDEzNTAsIDE0IH0sCisJeyAxMzc1LCAxNSB9LAorCXsgMTQwMCwgMTYgfSwKKwl7IDE0MjUsIDE3IH0sCisJeyAxNDUwLCAxOCB9LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92Y29yZV9zdyh1bnNpZ25lZCBpbnQgbVYpCit7CisJaW50IHZhbCwgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdGhlX21lbmVsYXVzLT5jbGllbnQ7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2Y29yZV92YWx1ZXMsCisJCQkJICAgICBBUlJBWV9TSVpFKHZjb3JlX3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoJmMtPmRldiwgIlNldHRpbmcgVkNPUkUgdG8gJWQgbVYgKHZhbCAweCUwMngpXG4iLCBtViwgdmFsKTsKKworCS8qIFNldCBTVyBtb2RlIGFuZCB0aGUgdm9sdGFnZSBpbiBvbmUgZ28uICovCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDEsIHZhbCk7CisJaWYgKHJldCA9PSAwKQorCQl0aGVfbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAwOworCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwltc2xlZXAoMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWVuZWxhdXNfc2V0X3Zjb3JlX2h3KHVuc2lnbmVkIGludCByb29mX21WLCB1bnNpZ25lZCBpbnQgZmxvb3JfbVYpCit7CisJaW50IGZ2YWwsIHJ2YWwsIHZhbCwgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdGhlX21lbmVsYXVzLT5jbGllbnQ7CisKKwlydmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShyb29mX21WLCB2Y29yZV92YWx1ZXMsCisJCQkJICAgICAgQVJSQVlfU0laRSh2Y29yZV92YWx1ZXMpKTsKKwlpZiAocnZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWZ2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKGZsb29yX21WLCB2Y29yZV92YWx1ZXMsCisJCQkJICAgICAgQVJSQVlfU0laRSh2Y29yZV92YWx1ZXMpKTsKKwlpZiAoZnZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2RiZygmYy0+ZGV2LCAiU2V0dGluZyBWQ09SRSBGTE9PUiB0byAlZCBtViBhbmQgUk9PRiB0byAlZCBtVlxuIiwKKwkgICAgICAgZmxvb3JfbVYsIHJvb2ZfbVYpOworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDMsIGZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDQsIHJ2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAoIXRoZV9tZW5lbGF1cy0+dmNvcmVfaHdfbW9kZSkgeworCQl2YWwgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19WQ09SRV9DVFJMMSk7CisJCS8qIEhXIG1vZGUsIHR1cm4gT0ZGIGJ5dGUgY29tcGFyYXRvciAqLworCQl2YWwgfD0gKCgxIDw8IDcpIHwgKDEgPDwgNSkpOworCQlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDEsIHZhbCk7CisJCXRoZV9tZW5lbGF1cy0+dmNvcmVfaHdfbW9kZSA9IDE7CisJfQorCW1zbGVlcCgxKTsKK291dDoKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdm1lbV92dGcgPSB7CisJLm5hbWUgPSAiVk1FTSIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDAsCisJLnZ0Z19iaXRzID0gMiwKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB2bWVtX3ZhbHVlc1tdID0geworCXsgMTUwMCwgMCB9LAorCXsgMTgwMCwgMSB9LAorCXsgMTkwMCwgMiB9LAorCXsgMjUwMCwgMyB9LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92bWVtKHVuc2lnbmVkIGludCBtVikKK3sKKwlpbnQgdmFsOworCisJaWYgKG1WID09IDApCisJCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdm1lbV92dGcsIDAsIDAsIDApOworCisJdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShtViwgdm1lbV92YWx1ZXMsIEFSUkFZX1NJWkUodm1lbV92YWx1ZXMpKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2bWVtX3Z0ZywgbVYsIHZhbCwgMHgwMik7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF92bWVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdmlvX3Z0ZyA9IHsKKwkubmFtZSA9ICJWSU8iLAorCS52dGdfcmVnID0gTUVORUxBVVNfTERPX0NUUkwxLAorCS52dGdfc2hpZnQgPSAyLAorCS52dGdfYml0cyA9IDIsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfTERPX0NUUkw0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdmlvX3ZhbHVlc1tdID0geworCXsgMTUwMCwgMCB9LAorCXsgMTgwMCwgMSB9LAorCXsgMjUwMCwgMiB9LAorCXsgMjgwMCwgMyB9LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92aW8odW5zaWduZWQgaW50IG1WKQoreworCWludCB2YWw7CisKKwlpZiAobVYgPT0gMCkKKwkJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2aW9fdnRnLCAwLCAwLCAwKTsKKworCXZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUobVYsIHZpb192YWx1ZXMsIEFSUkFZX1NJWkUodmlvX3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZpb192dGcsIG1WLCB2YWwsIDB4MDIpOworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19zZXRfdmlvKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdmRjZGNfdmFsdWVzW10gPSB7CisJeyAxNTAwLCAwIH0sCisJeyAxODAwLCAxIH0sCisJeyAyMDAwLCAyIH0sCisJeyAyMjAwLCAzIH0sCisJeyAyNDAwLCA0IH0sCisJeyAyODAwLCA1IH0sCisJeyAzMDAwLCA2IH0sCisJeyAzMzAwLCA3IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyB2ZGNkYzJfdnRnID0geworCS5uYW1lID0gIlZEQ0RDMiIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19EQ0RDX0NUUkwxLAorCS52dGdfc2hpZnQgPSAwLAorCS52dGdfYml0cyA9IDMsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfRENEQ19DVFJMMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnIHZkY2RjM192dGcgPSB7CisJLm5hbWUgPSAiVkRDREMzIiwKKwkudnRnX3JlZyA9IE1FTkVMQVVTX0RDRENfQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDMsCisJLnZ0Z19iaXRzID0gMywKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19EQ0RDX0NUUkwzLAorfTsKKworaW50IG1lbmVsYXVzX3NldF92ZGNkYyhpbnQgZGNkYywgdW5zaWduZWQgaW50IG1WKQoreworCWNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgKnZ0ZzsKKwlpbnQgdmFsOworCisJaWYgKGRjZGMgIT0gMiAmJiBkY2RjICE9IDMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkY2RjID09IDIpCisJCXZ0ZyA9ICZ2ZGNkYzJfdnRnOworCWVsc2UKKwkJdnRnID0gJnZkY2RjM192dGc7CisKKwlpZiAobVYgPT0gMCkKKwkJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKHZ0ZywgMCwgMCwgMCk7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2ZGNkY192YWx1ZXMsCisJCQkJICAgICBBUlJBWV9TSVpFKHZkY2RjX3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UodnRnLCBtViwgdmFsLCAweDAzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdm1tY192YWx1ZXNbXSA9IHsKKwl7IDE4NTAsIDAgfSwKKwl7IDI4MDAsIDEgfSwKKwl7IDMwMDAsIDIgfSwKKwl7IDMxMDAsIDMgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnIHZtbWNfdnRnID0geworCS5uYW1lID0gIlZNTUMiLAorCS52dGdfcmVnID0gTUVORUxBVVNfTERPX0NUUkwxLAorCS52dGdfc2hpZnQgPSA2LAorCS52dGdfYml0cyA9IDIsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfTERPX0NUUkw3LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92bW1jKHVuc2lnbmVkIGludCBtVikKK3sKKwlpbnQgdmFsOworCisJaWYgKG1WID09IDApCisJCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdm1tY192dGcsIDAsIDAsIDApOworCisJdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShtViwgdm1tY192YWx1ZXMsIEFSUkFZX1NJWkUodm1tY192YWx1ZXMpKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2bW1jX3Z0ZywgbVYsIHZhbCwgMHgwMik7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF92bW1jKTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB2YXV4X3ZhbHVlc1tdID0geworCXsgMTUwMCwgMCB9LAorCXsgMTgwMCwgMSB9LAorCXsgMjUwMCwgMiB9LAorCXsgMjgwMCwgMyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdmF1eF92dGcgPSB7CisJLm5hbWUgPSAiVkFVWCIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDQsCisJLnZ0Z19iaXRzID0gMiwKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDYsCit9OworCitpbnQgbWVuZWxhdXNfc2V0X3ZhdXgodW5zaWduZWQgaW50IG1WKQoreworCWludCB2YWw7CisKKwlpZiAobVYgPT0gMCkKKwkJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2YXV4X3Z0ZywgMCwgMCwgMCk7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2YXV4X3ZhbHVlcywgQVJSQVlfU0laRSh2YXV4X3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZhdXhfdnRnLCBtViwgdmFsLCAweDAyKTsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfc2V0X3ZhdXgpOworCitpbnQgbWVuZWxhdXNfZ2V0X3Nsb3RfcGluX3N0YXRlcyh2b2lkKQoreworCXJldHVybiBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19NQ1RfUElOX1NUKTsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfZ2V0X3Nsb3RfcGluX3N0YXRlcyk7CisKK2ludCBtZW5lbGF1c19zZXRfcmVndWxhdG9yX3NsZWVwKGludCBlbmFibGUsIHUzMiB2YWwpCit7CisJaW50IHQsIHJldDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHRoZV9tZW5lbGF1cy0+Y2xpZW50OworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfU0xFRVBfQ1RSTDIsIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZGV2X2RiZygmYy0+ZGV2LCAicmVndWxhdG9yIHNsZWVwIGNvbmZpZ3VyYXRpb246ICUwMnhcbiIsIHZhbCk7CisKKwlyZXQgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19HUElPX0NUUkwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl0ID0gKCgxIDw8IDYpIHwgMHgwNCk7CisJaWYgKGVuYWJsZSkKKwkJcmV0IHw9IHQ7CisJZWxzZQorCQlyZXQgJj0gfnQ7CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0dQSU9fQ1RSTCwgcmV0KTsKK291dDoKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEhhbmRsZXMgTWVuZWxhdXMgaW50ZXJydXB0cy4gRG9lcyBub3QgcnVuIGluIGludGVycnVwdCBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBtZW5lbGF1c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqX21lbmVsYXVzKQoreworCXN0cnVjdCBtZW5lbGF1c19jaGlwICptZW5lbGF1cyA9CisJCQljb250YWluZXJfb2YoX21lbmVsYXVzLCBzdHJ1Y3QgbWVuZWxhdXNfY2hpcCwgd29yayk7CisJdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBtZW5lbGF1c19jaGlwICptZW5lbGF1cyk7CisKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBpc3I7CisKKwkJaXNyID0gKG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX0lOVF9TVEFUVVMyKQorCQkJCSYgfm1lbmVsYXVzLT5tYXNrMikgPDwgODsKKwkJaXNyIHw9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX0lOVF9TVEFUVVMxKQorCQkJCSYgfm1lbmVsYXVzLT5tYXNrMTsKKwkJaWYgKCFpc3IpCisJCQlicmVhazsKKworCQl3aGlsZSAoaXNyKSB7CisJCQlpbnQgaXJxID0gZmxzKGlzcikgLSAxOworCQkJaXNyICY9IH4oMSA8PCBpcnEpOworCisJCQltdXRleF9sb2NrKCZtZW5lbGF1cy0+bG9jayk7CisJCQltZW5lbGF1c19kaXNhYmxlX2lycShpcnEpOworCQkJbWVuZWxhdXNfYWNrX2lycShpcnEpOworCQkJaGFuZGxlciA9IG1lbmVsYXVzLT5oYW5kbGVyc1tpcnFdOworCQkJaWYgKGhhbmRsZXIpCisJCQkJaGFuZGxlcihtZW5lbGF1cyk7CisJCQltZW5lbGF1c19lbmFibGVfaXJxKGlycSk7CisJCQltdXRleF91bmxvY2soJm1lbmVsYXVzLT5sb2NrKTsKKwkJfQorCX0KKwllbmFibGVfaXJxKG1lbmVsYXVzLT5jbGllbnQtPmlycSk7Cit9CisKKy8qCisgKiBXZSBjYW5ub3QgdXNlIEkyQyBpbiBpbnRlcnJ1cHQgY29udGV4dCwgc28gd2UganVzdCBzY2hlZHVsZSB3b3JrLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbWVuZWxhdXNfaXJxKGludCBpcnEsIHZvaWQgKl9tZW5lbGF1cykKK3sKKwlzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbWVuZWxhdXMgPSBfbWVuZWxhdXM7CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwkodm9pZClzY2hlZHVsZV93b3JrKCZtZW5lbGF1cy0+d29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhlIFJUQyBuZWVkcyB0byBiZSBzZXQgb25jZSwgdGhlbiBpdCBydW5zIG9uIGJhY2t1cCBiYXR0ZXJ5IHBvd2VyLgorICogSXQgc3VwcG9ydHMgYWxhcm1zLCBpbmNsdWRpbmcgc3lzdGVtIHdha2UgYWxhcm1zIChmcm9tIHNvbWUgbW9kZXMpOworICogYW5kIDEvc2Vjb25kIElSUXMgaWYgcmVxdWVzdGVkLgorICovCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfVFdMOTIzMzAKKworI2RlZmluZSBSVENfQ1RSTF9SVENfRU4JCSgxIDw8IDApCisjZGVmaW5lIFJUQ19DVFJMX0FMX0VOCQkoMSA8PCAxKQorI2RlZmluZSBSVENfQ1RSTF9NT0RFMTIJCSgxIDw8IDIpCisjZGVmaW5lIFJUQ19DVFJMX0VWRVJZX01BU0sJKDMgPDwgMykKKyNkZWZpbmUgUlRDX0NUUkxfRVZFUllfU0VDCSgwIDw8IDMpCisjZGVmaW5lIFJUQ19DVFJMX0VWRVJZX01JTgkoMSA8PCAzKQorI2RlZmluZSBSVENfQ1RSTF9FVkVSWV9IUgkoMiA8PCAzKQorI2RlZmluZSBSVENfQ1RSTF9FVkVSWV9EQVkJKDMgPDwgMykKKworI2RlZmluZSBSVENfVVBEQVRFX0VWRVJZCTB4MDgKKworI2RlZmluZSBSVENfSFJfUE0JCSgxIDw8IDcpCisKK3N0YXRpYyB2b2lkIG1lbmVsYXVzX3RvX3RpbWUoY2hhciAqcmVncywgc3RydWN0IHJ0Y190aW1lICp0KQoreworCXQtPnRtX3NlYyA9IEJDRDJCSU4ocmVnc1swXSk7CisJdC0+dG1fbWluID0gQkNEMkJJTihyZWdzWzFdKTsKKwlpZiAodGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX01PREUxMikgeworCQl0LT50bV9ob3VyID0gQkNEMkJJTihyZWdzWzJdICYgMHgxZikgLSAxOworCQlpZiAocmVnc1syXSAmIFJUQ19IUl9QTSkKKwkJCXQtPnRtX2hvdXIgKz0gMTI7CisJfSBlbHNlCisJCXQtPnRtX2hvdXIgPSBCQ0QyQklOKHJlZ3NbMl0gJiAweDNmKTsKKwl0LT50bV9tZGF5ID0gQkNEMkJJTihyZWdzWzNdKTsKKwl0LT50bV9tb24gPSBCQ0QyQklOKHJlZ3NbNF0pIC0gMTsKKwl0LT50bV95ZWFyID0gQkNEMkJJTihyZWdzWzVdKSArIDEwMDsKK30KKworc3RhdGljIGludCB0aW1lX3RvX21lbmVsYXVzKHN0cnVjdCBydGNfdGltZSAqdCwgaW50IHJlZ251bSkKK3sKKwlpbnQJaG91ciwgc3RhdHVzOworCisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKHJlZ251bSsrLCBCSU4yQkNEKHQtPnRtX3NlYykpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1fbWluKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCWlmICh0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfTU9ERTEyKSB7CisJCWhvdXIgPSB0LT50bV9ob3VyICsgMTsKKwkJaWYgKGhvdXIgPiAxMikKKwkJCWhvdXIgPSBSVENfSFJfUE0gfCBCSU4yQkNEKGhvdXIgLSAxMik7CisJCWVsc2UKKwkJCWhvdXIgPSBCSU4yQkNEKGhvdXIpOworCX0gZWxzZQorCQlob3VyID0gQklOMkJDRCh0LT50bV9ob3VyKTsKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIGhvdXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1fbWRheSkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1fbW9uICsgMSkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1feWVhciAtIDEwMCkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJZGV2X2VycigmdGhlX21lbmVsYXVzLT5jbGllbnQtPmRldiwgInJ0YyB3cml0ZSByZWcgJTAyeCwgZXJyICVkXG4iLAorCQkJLS1yZWdudW0sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCit7CisJc3RydWN0IGkyY19tc2cJbXNnWzJdOworCWNoYXIJCXJlZ3NbN107CisJaW50CQlzdGF0dXM7CisKKwkvKiBibG9jayByZWFkIGRhdGUgYW5kIHRpbWUgcmVnaXN0ZXJzICovCisJcmVnc1swXSA9IE1FTkVMQVVTX1JUQ19TRUM7CisKKwltc2dbMF0uYWRkciA9IE1FTkVMQVVTX0kyQ19BRERSRVNTOworCW1zZ1swXS5mbGFncyA9IDA7CisJbXNnWzBdLmxlbiA9IDE7CisJbXNnWzBdLmJ1ZiA9IHJlZ3M7CisKKwltc2dbMV0uYWRkciA9IE1FTkVMQVVTX0kyQ19BRERSRVNTOworCW1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ1sxXS5sZW4gPSBzaXplb2YocmVncyk7CisJbXNnWzFdLmJ1ZiA9IHJlZ3M7CisKKwlzdGF0dXMgPSBpMmNfdHJhbnNmZXIodGhlX21lbmVsYXVzLT5jbGllbnQtPmFkYXB0ZXIsIG1zZywgMik7CisJaWYgKHN0YXR1cyAhPSAyKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJyZWFkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVuZWxhdXNfdG9fdGltZShyZWdzLCB0KTsKKwl0LT50bV93ZGF5ID0gQkNEMkJJTihyZWdzWzZdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQoreworCWludAkJc3RhdHVzOworCisJLyogd3JpdGUgZGF0ZSBhbmQgdGltZSByZWdpc3RlcnMgKi8KKwlzdGF0dXMgPSB0aW1lX3RvX21lbmVsYXVzKHQsIE1FTkVMQVVTX1JUQ19TRUMpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfV0tEQVksIEJJTjJCQ0QodC0+dG1fd2RheSkpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9lcnIoJnRoZV9tZW5lbGF1cy0+Y2xpZW50LT5kZXYsICJydGMgd3JpdGUgcmVnICUwMngiLAorCQkJCSJlcnIgJWRcbiIsIE1FTkVMQVVTX1JUQ19XS0RBWSwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBub3cgY29tbWl0IHRoZSB3cml0ZSAqLworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfVVBEQVRFLCBSVENfVVBEQVRFX0VWRVJZKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZGV2X2VycigmdGhlX21lbmVsYXVzLT5jbGllbnQtPmRldiwgInJ0YyBjb21taXQgdGltZSwgZXJyICVkXG4iLAorCQkJCXN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKncpCit7CisJc3RydWN0IGkyY19tc2cJbXNnWzJdOworCWNoYXIJCXJlZ3NbNl07CisJaW50CQlzdGF0dXM7CisKKwkvKiBibG9jayByZWFkIGFsYXJtIHJlZ2lzdGVycyAqLworCXJlZ3NbMF0gPSBNRU5FTEFVU19SVENfQUxfU0VDOworCisJbXNnWzBdLmFkZHIgPSBNRU5FTEFVU19JMkNfQUREUkVTUzsKKwltc2dbMF0uZmxhZ3MgPSAwOworCW1zZ1swXS5sZW4gPSAxOworCW1zZ1swXS5idWYgPSByZWdzOworCisJbXNnWzFdLmFkZHIgPSBNRU5FTEFVU19JMkNfQUREUkVTUzsKKwltc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwltc2dbMV0ubGVuID0gc2l6ZW9mKHJlZ3MpOworCW1zZ1sxXS5idWYgPSByZWdzOworCisJc3RhdHVzID0gaTJjX3RyYW5zZmVyKHRoZV9tZW5lbGF1cy0+Y2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworCWlmIChzdGF0dXMgIT0gMikgeworCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAiYWxhcm0gcmVhZCIsIHN0YXR1cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1lbmVsYXVzX3RvX3RpbWUocmVncywgJnctPnRpbWUpOworCisJdy0+ZW5hYmxlZCA9ICEhKHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9BTF9FTik7CisKKwkvKiBOT1RFIHdlICpjb3VsZCogY2hlY2sgaWYgYWN0dWFsbHkgcGVuZGluZy4uLiAqLworCXctPnBlbmRpbmcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKncpCit7CisJaW50CQlzdGF0dXM7CisKKwlpZiAodGhlX21lbmVsYXVzLT5jbGllbnQtPmlycSA8PSAwICYmIHctPmVuYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogY2xlYXIgcHJldmlvdXMgYWxhcm0gZW5hYmxlICovCisJaWYgKHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9BTF9FTikgeworCQl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICY9IH5SVENfQ1RSTF9BTF9FTjsKKwkJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLAorCQkJCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogd3JpdGUgYWxhcm0gcmVnaXN0ZXJzICovCisJc3RhdHVzID0gdGltZV90b19tZW5lbGF1cygmdy0+dGltZSwgTUVORUxBVVNfUlRDX0FMX1NFQyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBlbmFibGUgYWxhcm0gaWYgcmVxdWVzdGVkICovCisJaWYgKHctPmVuYWJsZWQpIHsKKwkJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCB8PSBSVENfQ1RSTF9BTF9FTjsKKwkJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLAorCQkJCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWCisKK3N0YXRpYyB2b2lkIG1lbmVsYXVzX3J0Y191cGRhdGVfd29yayhzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbSkKK3sKKwkvKiByZXBvcnQgMS9zZWMgdXBkYXRlICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlydGNfdXBkYXRlX2lycShtLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX1VGKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludAlzdGF0dXM7CisKKwlpZiAodGhlX21lbmVsYXVzLT5jbGllbnQtPmlycSA8PSAwKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJc3dpdGNoIChjbWQpIHsKKwkvKiBhbGFybSBJUlEgKi8KKwljYXNlIFJUQ19BSUVfT046CisJCWlmICh0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfQUxfRU4pCisJCQlyZXR1cm4gMDsKKwkJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCB8PSBSVENfQ1RSTF9BTF9FTjsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJaWYgKCEodGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX0FMX0VOKSkKKwkJCXJldHVybiAwOworCQl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICY9IH5SVENfQ1RSTF9BTF9FTjsKKwkJYnJlYWs7CisJLyogMS9zZWNvbmQgInVwZGF0ZSIgSVJRICovCisJY2FzZSBSVENfVUlFX09OOgorCQlpZiAodGhlX21lbmVsYXVzLT51aWUpCisJCQlyZXR1cm4gMDsKKwkJc3RhdHVzID0gbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKE1FTkVMQVVTX1JUQ1RNUl9JUlEpOworCQlzdGF0dXMgPSBtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfUlRDVE1SX0lSUSwKKwkJCQltZW5lbGF1c19ydGNfdXBkYXRlX3dvcmspOworCQlpZiAoc3RhdHVzID09IDApCisJCQl0aGVfbWVuZWxhdXMtPnVpZSA9IDE7CisJCXJldHVybiBzdGF0dXM7CisJY2FzZSBSVENfVUlFX09GRjoKKwkJaWYgKCF0aGVfbWVuZWxhdXMtPnVpZSkKKwkJCXJldHVybiAwOworCQlzdGF0dXMgPSBtZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfUlRDVE1SX0lSUSk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCXRoZV9tZW5lbGF1cy0+dWllID0gMDsKKwkJcmV0dXJuIHN0YXR1czsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLCB0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgbWVuZWxhdXNfaW9jdGwJTlVMTAorI2VuZGlmCisKKy8qIFJFVklTSVQgbm8gY29tcGVuc2F0aW9uIHJlZ2lzdGVyIHN1cHBvcnQgLi4uICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtZW5lbGF1c19ydGNfb3BzID0geworCS5pb2N0bAkJCT0gbWVuZWxhdXNfaW9jdGwsCisJLnJlYWRfdGltZQkJPSBtZW5lbGF1c19yZWFkX3RpbWUsCisJLnNldF90aW1lCQk9IG1lbmVsYXVzX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCQk9IG1lbmVsYXVzX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQkJPSBtZW5lbGF1c19zZXRfYWxhcm0sCit9OworCitzdGF0aWMgdm9pZCBtZW5lbGF1c19ydGNfYWxhcm1fd29yayhzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbSkKK3sKKwkvKiByZXBvcnQgYWxhcm0gKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJ0Y191cGRhdGVfaXJxKG0tPnJ0YywgMSwgUlRDX0lSUUYgfCBSVENfQUYpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCS8qIHRoZW4gZGlzYWJsZSBpdDsgYWxhcm1zIGFyZSBvbmVzaG90ICovCisJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmPSB+UlRDX0NUUkxfQUxfRU47CisJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLCB0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbmVsYXVzX3J0Y19pbml0KHN0cnVjdCBtZW5lbGF1c19jaGlwICptKQoreworCWludAlhbGFybSA9IChtLT5jbGllbnQtPmlycSA+IDApOworCisJLyogYXNzdW1lIDMyS0RFVEVOIHBpbiBpcyBwdWxsZWQgaGlnaCAqLworCWlmICghKG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX09TQ19DVFJMKSAmIDB4ODApKSB7CisJCWRldl9kYmcoJm0tPmNsaWVudC0+ZGV2LCAibm8gMzJrIG9zY2lsbGF0b3JcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogc3VwcG9ydCBSVEMgYWxhcm07IGl0IGNhbiBpc3N1ZSB3YWtldXBzICovCisJaWYgKGFsYXJtKSB7CisJCWlmIChtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfUlRDQUxNX0lSUSwKKwkJCQltZW5lbGF1c19ydGNfYWxhcm1fd29yaykgPCAwKSB7CisJCQlkZXZfZXJyKCZtLT5jbGllbnQtPmRldiwgImNhbid0IGhhbmRsZSBSVEMgYWxhcm1cbiIpOworCQkJcmV0dXJuOworCQl9CisJCWRldmljZV9pbml0X3dha2V1cCgmbS0+Y2xpZW50LT5kZXYsIDEpOworCX0KKworCS8qIGJlIHN1cmUgUlRDIGlzIGVuYWJsZWQ7IGFsbG93IDEvc2VjIGlycXM7IGxlYXZlIDEyaHIgbW9kZSBhbG9uZSAqLworCW0tPnJ0Y19jb250cm9sID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfUlRDX0NUUkwpOworCWlmICghKG0tPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfUlRDX0VOKQorCQkJfHwgKG0tPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfQUxfRU4pCisJCQl8fCAobS0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9FVkVSWV9NQVNLKSkgeworCQlpZiAoIShtLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX1JUQ19FTikpIHsKKwkJCWRldl93YXJuKCZtLT5jbGllbnQtPmRldiwgInJ0YyBjbG9jayBuZWVkcyBzZXR0aW5nXG4iKTsKKwkJCW0tPnJ0Y19jb250cm9sIHw9IFJUQ19DVFJMX1JUQ19FTjsKKwkJfQorCQltLT5ydGNfY29udHJvbCAmPSB+UlRDX0NUUkxfRVZFUllfTUFTSzsKKwkJbS0+cnRjX2NvbnRyb2wgJj0gflJUQ19DVFJMX0FMX0VOOworCQltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfUlRDX0NUUkwsIG0tPnJ0Y19jb250cm9sKTsKKwl9CisKKwltLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKERSSVZFUl9OQU1FLAorCQkJJm0tPmNsaWVudC0+ZGV2LAorCQkJJm1lbmVsYXVzX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKG0tPnJ0YykpIHsKKwkJaWYgKGFsYXJtKSB7CisJCQltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfUlRDQUxNX0lSUSk7CisJCQlkZXZpY2VfaW5pdF93YWtldXAoJm0tPmNsaWVudC0+ZGV2LCAwKTsKKwkJfQorCQlkZXZfZXJyKCZtLT5jbGllbnQtPmRldiwgImNhbid0IHJlZ2lzdGVyIFJUQzogJWRcbiIsCisJCQkJKGludCkgUFRSX0VSUihtLT5ydGMpKTsKKwkJdGhlX21lbmVsYXVzLT5ydGMgPSBOVUxMOworCX0KK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIG1lbmVsYXVzX3J0Y19pbml0KHN0cnVjdCBtZW5lbGF1c19jaGlwICptKQoreworCS8qIG5vdGhpbmcgKi8KK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWVuZWxhdXNfaTJjX2RyaXZlcjsKKworc3RhdGljIGludCBtZW5lbGF1c19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtZW5lbGF1c19jaGlwCSptZW5lbGF1czsKKwlpbnQJCQlyZXYgPSAwLCB2YWw7CisJaW50CQkJZXJyID0gMDsKKwlzdHJ1Y3QgbWVuZWxhdXNfcGxhdGZvcm1fZGF0YSAqbWVuZWxhdXNfcGRhdGEgPQorCQkJCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKHRoZV9tZW5lbGF1cykgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm9ubHkgb25lICVzIGZvciBub3dcbiIsCisJCQkJRFJJVkVSX05BTUUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltZW5lbGF1cyA9IGt6YWxsb2Moc2l6ZW9mICptZW5lbGF1cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZW5lbGF1cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBtZW5lbGF1cyk7CisKKwl0aGVfbWVuZWxhdXMgPSBtZW5lbGF1czsKKwltZW5lbGF1cy0+Y2xpZW50ID0gY2xpZW50OworCisJLyogSWYgYSB0cnVlIHByb2JlIGNoZWNrIHRoZSBkZXZpY2UgKi8KKwlyZXYgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19SRVYpOworCWlmIChyZXYgPCAwKSB7CisJCXByX2VycigiZGV2aWNlIG5vdCBmb3VuZCIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZhaWwxOworCX0KKworCS8qIEFjayBhbmQgZGlzYWJsZSBhbGwgTWVuZWxhdXMgaW50ZXJydXB0cyAqLworCW1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfQUNLMSwgMHhmZik7CisJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9BQ0syLCAweGZmKTsKKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0sxLCAweGZmKTsKKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0syLCAweGZmKTsKKwltZW5lbGF1cy0+bWFzazEgPSAweGZmOworCW1lbmVsYXVzLT5tYXNrMiA9IDB4ZmY7CisKKwkvKiBTZXQgb3V0cHV0IGJ1ZmZlciBzdHJlbmd0aHMgKi8KKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfTUNUX0NUUkwxLCAweDczKTsKKworCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJZXJyID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIG1lbmVsYXVzX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCQkgIERSSVZFUl9OQU1FLCBtZW5lbGF1cyk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAgImNhbid0IGdldCBJUlEgJWQsIGVyciAlZCIsCisJCQkJCWNsaWVudC0+aXJxLCBlcnIpOworCQkJZ290byBmYWlsMTsKKwkJfQorCX0KKworCW11dGV4X2luaXQoJm1lbmVsYXVzLT5sb2NrKTsKKwlJTklUX1dPUksoJm1lbmVsYXVzLT53b3JrLCBtZW5lbGF1c193b3JrKTsKKworCXByX2luZm8oIk1lbmVsYXVzIHJldiAlZC4lZFxuIiwgcmV2ID4+IDQsIHJldiAmIDB4MGYpOworCisJdmFsID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDEpOworCWlmICh2YWwgPCAwKQorCQlnb3RvIGZhaWwyOworCWlmICh2YWwgJiAoMSA8PCA3KSkKKwkJbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAxOworCWVsc2UKKwkJbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAwOworCisJaWYgKG1lbmVsYXVzX3BkYXRhICE9IE5VTEwgJiYgbWVuZWxhdXNfcGRhdGEtPmxhdGVfaW5pdCAhPSBOVUxMKSB7CisJCWVyciA9IG1lbmVsYXVzX3BkYXRhLT5sYXRlX2luaXQoJmNsaWVudC0+ZGV2KTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGZhaWwyOworCX0KKworCW1lbmVsYXVzX3J0Y19pbml0KG1lbmVsYXVzKTsKKworCXJldHVybiAwOworZmFpbDI6CisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIG1lbmVsYXVzKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworZmFpbDE6CisJa2ZyZWUobWVuZWxhdXMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IG1lbmVsYXVzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtZW5lbGF1c19jaGlwCSptZW5lbGF1cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIG1lbmVsYXVzKTsKKwlrZnJlZShtZW5lbGF1cyk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJdGhlX21lbmVsYXVzID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1lbmVsYXVzX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJfSwKKwkucHJvYmUJCT0gbWVuZWxhdXNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChtZW5lbGF1c19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWVuZWxhdXNfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKwlyZXMgPSBpMmNfYWRkX2RyaXZlcigmbWVuZWxhdXNfaTJjX2RyaXZlcik7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJfZXJyKCJkcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZW5lbGF1c19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm1lbmVsYXVzX2kyY19kcml2ZXIpOworCisJLyogRklYTUU6IFNodXRkb3duIG1lbmVsYXVzIHBhcnRzIHRoYXQgY2FuIGJlIHNodXQgZG93biAqLworfQorCitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAoYW5kIG90aGVycykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIGludGVyZmFjZSBmb3IgTWVuZWxhdXMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KG1lbmVsYXVzX2luaXQpOworbW9kdWxlX2V4aXQobWVuZWxhdXNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKaW5kZXggZjQyOWJlOC4uYTIxZjU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwpAQCAtMTI1OCwxOSArMTI1OCwyNSBAQAogCXNldF9iaXQoUENfRE1BX1JFQ09NTUVOREVELCAmcGMtPmZsYWdzKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIHZvaWQKIGlkZWZsb3BweV9ibG9ja3BjX2NtZChpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSwgaWRlZmxvcHB5X3BjX3QgKnBjLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JLyoKLQkgKiBqdXN0IHN1cHBvcnQgZWplY3QgZm9yIG5vdywgaXQgd291bGQgbm90IGJlIGhhcmQgdG8gbWFrZSB0aGUKLQkgKiBSRVFfQkxPQ0tfUEMgc3VwcG9ydCBmdWxseS1mZWF0dXJlZAotCSAqLwotCWlmIChycS0+Y21kWzBdICE9IElERUZMT1BQWV9TVEFSVF9TVE9QX0NNRCkKLQkJcmV0dXJuIDE7Ci0KIAlpZGVmbG9wcHlfaW5pdF9wYyhwYyk7CisJcGMtPmNhbGxiYWNrID0gJmlkZWZsb3BweV9yd19jYWxsYmFjazsKIAltZW1jcHkocGMtPmMsIHJxLT5jbWQsIHNpemVvZihwYy0+YykpOwotCXJldHVybiAwOworCXBjLT5ycSA9IHJxOworCXBjLT5iX2NvdW50ID0gcnEtPmRhdGFfbGVuOworCWlmIChycS0+ZGF0YV9sZW4gJiYgcnFfZGF0YV9kaXIocnEpID09IFdSSVRFKQorCQlzZXRfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCXBjLT5idWZmZXIgPSBycS0+ZGF0YTsKKwlpZiAocnEtPmJpbykKKwkJc2V0X2JpdChQQ19ETUFfUkVDT01NRU5ERUQsICZwYy0+ZmxhZ3MpOworCQkKKwkvKgorCSAqIHBvc3NpYmx5IHByb2JsZW1hdGljLCBkb2Vzbid0IGxvb2sgbGlrZSBpZGUtZmxvcHB5IGNvcnJlY3RseQorCSAqIGhhbmRsZWQgc2NhdHRlcmVkIHJlcXVlc3RzIGlmIGRtYSBmYWlscy4uLgorCSAqLworCXBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gcGMtPmJ1ZmZlcl9zaXplID0gcnEtPmRhdGFfbGVuOwogfQogCiAvKgpAQCAtMTMxNywxMCArMTMyMyw3IEBACiAJCXBjID0gKGlkZWZsb3BweV9wY190ICopIHJxLT5idWZmZXI7CiAJfSBlbHNlIGlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKIAkJcGMgPSBpZGVmbG9wcHlfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKLQkJaWYgKGlkZWZsb3BweV9ibG9ja3BjX2NtZChmbG9wcHksIHBjLCBycSkpIHsKLQkJCWlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7Ci0JCQlyZXR1cm4gaWRlX3N0b3BwZWQ7Ci0JCX0KKwkJaWRlZmxvcHB5X2Jsb2NrcGNfY21kKGZsb3BweSwgcGMsIHJxKTsKIAl9IGVsc2UgewogCQlibGtfZHVtcF9ycV9mbGFncyhycSwKIAkJCSJpZGUtZmxvcHB5OiB1bnN1cHBvcnRlZCBjb21tYW5kIGluIHF1ZXVlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCmluZGV4IGNjNTgwMTMuLjVhNGM1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCkBAIC0xMDczLDE0ICsxMDczLDE0IEBACiAJCWh3Z3JvdXAtPmh3aWYtPm5leHQgPSBod2lmOwogCQlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKIAl9IGVsc2UgewotCQlod2dyb3VwID0ga21hbGxvY19ub2RlKHNpemVvZihpZGVfaHdncm91cF90KSwgR0ZQX0tFUk5FTCwKKwkJaHdncm91cCA9IGttYWxsb2Nfbm9kZShzaXplb2YoaWRlX2h3Z3JvdXBfdCksCisJCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAogCQkJCQlod2lmX3RvX25vZGUoaHdpZi0+ZHJpdmVzWzBdLmh3aWYpKTsKIAkJaWYgKCFod2dyb3VwKQogCSAgICAgICAJCWdvdG8gb3V0X3VwOwogCiAJCWh3aWYtPmh3Z3JvdXAgPSBod2dyb3VwOwogCi0JCW1lbXNldChod2dyb3VwLCAwLCBzaXplb2YoaWRlX2h3Z3JvdXBfdCkpOwogCQlod2dyb3VwLT5od2lmICAgICA9IGh3aWYtPm5leHQgPSBod2lmOwogCQlod2dyb3VwLT5ycSAgICAgICA9IE5VTEw7CiAJCWh3Z3JvdXAtPmhhbmRsZXIgID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS5jIGIvZHJpdmVycy9pZGUvaWRlLmMKaW5kZXggYzk0OGE1Yy4uOGNkNzY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLmMKQEAgLTEwNDksOSArMTA0OSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaWRlX2RyaXZlcl90ICpkcnY7CiAJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IGVyciA9IDAsICgqc2V0ZnVuYykoaWRlX2RyaXZlX3QgKiwgaW50KTsKKwlpbnQgZXJyLCAoKnNldGZ1bmMpKGlkZV9kcml2ZV90ICosIGludCk7CiAJdTggKnZhbDsKIAorCWVyciA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIGJkZXYtPmJkX2Rpc2stPnF1ZXVlLCBiZGV2LT5iZF9kaXNrLCBjbWQsIHApOworCWlmIChlcnIgIT0gLUVOT1RUWSkKKwkJcmV0dXJuIGVycjsKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBIRElPX0dFVF8zMkJJVDoJICAgIHZhbCA9ICZkcml2ZS0+aW9fMzJiaXQ7CSBnb3RvIHJlYWRfdmFsOwogCWNhc2UgSERJT19HRVRfS0VFUFNFVFRJTkdTOiB2YWwgPSAmZHJpdmUtPmtlZXBfc2V0dGluZ3M7IGdvdG8gcmVhZF92YWw7CkBAIC0xMTcxLDEwICsxMTc1LDYgQEAKIAkJCXJldHVybiAwOwogCQl9CiAKLQkJY2FzZSBDRFJPTUVKRUNUOgotCQljYXNlIENEUk9NQ0xPU0VUUkFZOgotCQkJcmV0dXJuIHNjc2lfY21kX2lvY3RsKGZpbGUsIGJkZXYtPmJkX2Rpc2ssIGNtZCwgcCk7Ci0KIAkJY2FzZSBIRElPX0dFVF9CVVNTVEFURToKIAkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJCQlyZXR1cm4gLUVBQ0NFUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKaW5kZXggMGZjOGM2ZS4uZWU0NTI1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+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+bmVxKTsKIAllaGVhX3JlbW92ZV9hZGFwdGVyX21yKGFkYXB0ZXIpOworCWxpc3RfZGVsKCZhZGFwdGVyLT5saXN0KTsKKwogCWtmcmVlKGFkYXB0ZXIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5MzksOSArMzA0NSwxOCBAQAogCXByaW50ayhLRVJOX0lORk8gIklCTSBlSEVBIGV0aGVybmV0IGRldmljZSBkcml2ZXIgKFJlbGVhc2UgJXMpXG4iLAogCSAgICAgICBEUlZfVkVSU0lPTik7CiAKKwllaGVhX2RyaXZlcl93cSA9IGNyZWF0ZV93b3JrcXVldWUoImVoZWFfZHJpdmVyX3dxIik7CisKKwlJTklUX1dPUksoJmVoZWFfcmVyZWdfbXJfdGFzaywgZWhlYV9yZXJlZ19tcnMpOworCiAJcmV0ID0gY2hlY2tfbW9kdWxlX3Bhcm0oKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKKworCXJldCA9IGVoZWFfY3JlYXRlX2J1c21hcCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCiAJcmV0ID0gaWJtZWJ1c19yZWdpc3Rlcl9kcml2ZXIoJmVoZWFfZHJpdmVyKTsKIAlpZiAocmV0KSB7CiAJCWVoZWFfZXJyb3IoImZhaWxlZCByZWdpc3RlcmluZyBlSEVBIGRldmljZSBkcml2ZXIgb24gZWJ1cyIpOwpAQCAtMjk2NSw2ICszMDgwLDcgQEAKIHsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmVoZWFfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2NhcGFiaWxpdGllcyk7CiAJaWJtZWJ1c191bnJlZ2lzdGVyX2RyaXZlcigmZWhlYV9kcml2ZXIpOworCWVoZWFfZGVzdHJveV9idXNtYXAoKTsKIH0KIAogbW9kdWxlX2luaXQoZWhlYV9tb2R1bGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaAppbmRleCBkMTdhNDVhLi44OWI2MzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKQEAgLTYwLDYgKzYwLDkgQEAKIAl9CiB9CiAKKy8qIE51bWJlciBvZiBwYWdlcyB3aGljaCBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBvbmNlIGJ5IEhfUkVHSVNURVJfSEVBX1JQQUdFUyAqLworI2RlZmluZSBFSEVBX01BWF9SUEFHRSA1MTIKKwogLyogTm90aWZpY2F0aW9uIEV2ZW50IFF1ZXVlIChORVEpIEVudHJ5IGJpdCBtYXNrcyAqLwogI2RlZmluZSBORVFFX0VWRU5UX0NPREUJCUVIRUFfQk1BU0tfSUJNKDIsIDcpCiAjZGVmaW5lIE5FUUVfUE9SVE5VTSAgCQlFSEVBX0JNQVNLX0lCTSgzMiwgNDcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKaW5kZXggMjllYWE0Ni4uYTM2ZmE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYwpAQCAtMzEsNiArMzEsMTMgQEAKICNpbmNsdWRlICJlaGVhX3BoeXAuaCIKICNpbmNsdWRlICJlaGVhX3Ftci5oIgogCisKK3N0cnVjdCBlaGVhX2J1c21hcCBlaGVhX2JtYXAgPSB7IDAsIDAsIE5VTEwgfTsKK2V4dGVybiB1NjQgZWhlYV9kcml2ZXJfZmxhZ3M7CitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmVoZWFfZHJpdmVyX3dxOworZXh0ZXJuIHN0cnVjdCB3b3JrX3N0cnVjdCBlaGVhX3JlcmVnX21yX3Rhc2s7CisKKwogc3RhdGljIHZvaWQgKmh3X3FwYWdlaXRfZ2V0X2luYyhzdHJ1Y3QgaHdfcXVldWUgKnF1ZXVlKQogewogCXZvaWQgKnJldHZhbHVlID0gaHdfcWVpdF9nZXQocXVldWUpOwpAQCAtNTQ3LDE4ICs1NTQsODQgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGVoZWFfY3JlYXRlX2J1c21hcCggdm9pZCApCit7CisJdTY0IHZhZGRyID0gRUhFQV9CVVNNQVBfU1RBUlQ7CisJdW5zaWduZWQgbG9uZyBhYnNfbWF4X3BmbiA9IDA7CisJdW5zaWduZWQgbG9uZyBzZWNfbWF4X3BmbjsKKwlpbnQgaTsKKworCS8qCisJICogU2VjdGlvbnMgYXJlIG5vdCBpbiBhc2NlbmRpbmcgb3JkZXIgLT4gTG9vcCBvdmVyIGFsbCBzZWN0aW9ucyBhbmQKKwkgKiBmaW5kIHRoZSBoaWdoZXN0IFBGTiB0byBjb21wdXRlIHRoZSByZXF1aXJlZCBtYXAgc2l6ZS4KKwkqLworCWVoZWFfYm1hcC52YWxpZF9zZWN0aW9ucyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfTUVNX1NFQ1RJT05TOyBpKyspCisJCWlmICh2YWxpZF9zZWN0aW9uX25yKGkpKSB7CisJCQlzZWNfbWF4X3BmbiA9IHNlY3Rpb25fbnJfdG9fcGZuKGkpOworCQkJaWYgKHNlY19tYXhfcGZuID4gYWJzX21heF9wZm4pCisJCQkJYWJzX21heF9wZm4gPSBzZWNfbWF4X3BmbjsKKwkJCWVoZWFfYm1hcC52YWxpZF9zZWN0aW9ucysrOworCQl9CisKKwllaGVhX2JtYXAuZW50cmllcyA9IGFic19tYXhfcGZuIC8gRUhFQV9QQUdFU19QRVJfU0VDVElPTiArIDE7CisJZWhlYV9ibWFwLnZhZGRyID0gdm1hbGxvYyhlaGVhX2JtYXAuZW50cmllcyAqIHNpemVvZigqZWhlYV9ibWFwLnZhZGRyKSk7CisKKwlpZiAoIWVoZWFfYm1hcC52YWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwIDsgaSA8IGVoZWFfYm1hcC5lbnRyaWVzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPSBzZWN0aW9uX25yX3RvX3BmbihpKTsKKworCQlpZiAocGZuX3ZhbGlkKHBmbikpIHsKKwkJCWVoZWFfYm1hcC52YWRkcltpXSA9IHZhZGRyOworCQkJdmFkZHIgKz0gRUhFQV9TRUNUU0laRTsKKwkJfSBlbHNlCisJCQllaGVhX2JtYXAudmFkZHJbaV0gPSAwOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGVoZWFfZGVzdHJveV9idXNtYXAoIHZvaWQgKQoreworCXZmcmVlKGVoZWFfYm1hcC52YWRkcik7Cit9CisKK3U2NCBlaGVhX21hcF92YWRkcih2b2lkICpjYWRkcikKK3sKKwl1NjQgbWFwcGVkX2FkZHI7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IF9fcGEoY2FkZHIpID4+IFNFQ1RJT05fU0laRV9CSVRTOworCisJaWYgKGxpa2VseShpbmRleCA8IGVoZWFfYm1hcC5lbnRyaWVzKSkgeworCQltYXBwZWRfYWRkciA9IGVoZWFfYm1hcC52YWRkcltpbmRleF07CisJCWlmIChsaWtlbHkobWFwcGVkX2FkZHIpKQorCQkJbWFwcGVkX2FkZHIgfD0gKCgodW5zaWduZWQgbG9uZyljYWRkcikKKwkJCQkJJiAoRUhFQV9TRUNUU0laRSAtIDEpKTsKKwkJZWxzZQorCQkJbWFwcGVkX2FkZHIgPSAtMTsKKwl9IGVsc2UKKwkJbWFwcGVkX2FkZHIgPSAtMTsKKworCWlmICh1bmxpa2VseShtYXBwZWRfYWRkciA9PSAtMSkpCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChfX0VIRUFfU1RPUF9YRkVSLCAmZWhlYV9kcml2ZXJfZmxhZ3MpKQorCQkJcXVldWVfd29yayhlaGVhX2RyaXZlcl93cSwgJmVoZWFfcmVyZWdfbXJfdGFzayk7CisKKwlyZXR1cm4gbWFwcGVkX2FkZHI7Cit9CisKIGludCBlaGVhX3JlZ19rZXJuZWxfbXIoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGVoZWFfbXIgKm1yKQogewotCWludCBpLCBrLCByZXQ7Ci0JdTY0IGhyZXQsIHB0X2Ficywgc3RhcnQsIGVuZCwgbnJfcGFnZXM7Ci0JdTMyIGFjY19jdHJsID0gRUhFQV9NUl9BQ0NfQ1RSTDsKKwlpbnQgcmV0OwogCXU2NCAqcHQ7CisJdm9pZCAqcGc7CisJdTY0IGhyZXQsIHB0X2FicywgaSwgaiwgbSwgbXJfbGVuOworCXUzMiBhY2NfY3RybCA9IEVIRUFfTVJfQUNDX0NUUkw7CiAKLQlzdGFydCA9IEtFUk5FTEJBU0U7Ci0JZW5kID0gKHU2NCloaWdoX21lbW9yeTsKLQlucl9wYWdlcyA9IChlbmQgLSBzdGFydCkgLyBFSEVBX1BBR0VTSVpFOworCW1yX2xlbiA9IGVoZWFfYm1hcC52YWxpZF9zZWN0aW9ucyAqIEVIRUFfU0VDVFNJWkU7CiAKLQlwdCA9ICBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJcHQgPSAga3phbGxvYyhFSEVBX01BWF9SUEFHRSAqIHNpemVvZih1NjQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXB0KSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSIpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtNTY2LDcgKzYzOSw4IEBACiAJfQogCXB0X2FicyA9IHZpcnRfdG9fYWJzKHB0KTsKIAotCWhyZXQgPSBlaGVhX2hfYWxsb2NfcmVzb3VyY2VfbXIoYWRhcHRlci0+aGFuZGxlLCBzdGFydCwgZW5kIC0gc3RhcnQsCisJaHJldCA9IGVoZWFfaF9hbGxvY19yZXNvdXJjZV9tcihhZGFwdGVyLT5oYW5kbGUsCisJCQkJCUVIRUFfQlVTTUFQX1NUQVJULCBtcl9sZW4sCiAJCQkJCWFjY19jdHJsLCBhZGFwdGVyLT5wZCwKIAkJCQkJJm1yLT5oYW5kbGUsICZtci0+bGtleSk7CiAJaWYgKGhyZXQgIT0gSF9TVUNDRVNTKSB7CkBAIC01NzUsNDkgKzY0OSw0MyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQltci0+dmFkZHIgPSBLRVJORUxCQVNFOwotCWsgPSAwOworCWZvciAoaSA9IDAgOyBpIDwgZWhlYV9ibWFwLmVudHJpZXM7IGkrKykKKwkJaWYgKGVoZWFfYm1hcC52YWRkcltpXSkgeworCQkJdm9pZCAqc2VjdGJhc2UgPSBfX3ZhKGkgPDwgU0VDVElPTl9TSVpFX0JJVFMpOworCQkJdW5zaWduZWQgbG9uZyBrID0gMDsKIAotCXdoaWxlIChucl9wYWdlcyA+IDApIHsKLQkJaWYgKG5yX3BhZ2VzID4gMSkgewotCQkJdTY0IG51bV9wYWdlcyA9IG1pbihucl9wYWdlcywgKHU2NCk1MTIpOwotCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKQotCQkJCXB0W2ldID0gdmlydF90b19hYnMoKHZvaWQqKSgoKHU2NClzdGFydCkgKwotCQkJCQkJCSAgICAoKGsrKykgKgotCQkJCQkJCSAgICAgRUhFQV9QQUdFU0laRSkpKTsKKwkJCWZvciAoaiA9IDA7IGogPCAoUEFHRVNfUEVSX1NFQ1RJT04gLyBFSEVBX01BWF9SUEFHRSk7CisJCQkgICAgICBqKyspIHsKIAotCQkJaHJldCA9IGVoZWFfaF9yZWdpc3Rlcl9ycGFnZV9tcihhZGFwdGVyLT5oYW5kbGUsCi0JCQkJCQkJbXItPmhhbmRsZSwgMCwKLQkJCQkJCQkwLCAodTY0KXB0X2FicywKLQkJCQkJCQludW1fcGFnZXMpOwotCQkJbnJfcGFnZXMgLT0gbnVtX3BhZ2VzOwotCQl9IGVsc2UgewotCQkJdTY0IGFic19hZHIgPSB2aXJ0X3RvX2Ficygodm9pZCopKCgodTY0KXN0YXJ0KSArCi0JCQkJCQkJICAoayAqIEVIRUFfUEFHRVNJWkUpKSk7CisJCQkJZm9yIChtID0gMDsgbSA8IEVIRUFfTUFYX1JQQUdFOyBtKyspIHsKKwkJCQkJcGcgPSBzZWN0YmFzZSArICgoaysrKSAqIEVIRUFfUEFHRVNJWkUpOworCQkJCQlwdFttXSA9IHZpcnRfdG9fYWJzKHBnKTsKKwkJCQl9CiAKLQkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAotCQkJCQkJCW1yLT5oYW5kbGUsIDAsCi0JCQkJCQkJMCwgYWJzX2FkciwxKTsKLQkJCW5yX3BhZ2VzLS07CisJCQkJaHJldCA9IGVoZWFfaF9yZWdpc3Rlcl9ycGFnZV9tcihhZGFwdGVyLT5oYW5kbGUsCisJCQkJCQkJCW1yLT5oYW5kbGUsCisJCQkJCQkJCTAsIDAsIHB0X2FicywKKwkJCQkJCQkJRUhFQV9NQVhfUlBBR0UpOworCQkJCWlmICgoaHJldCAhPSBIX1NVQ0NFU1MpCisJCQkJICAgICYmIChocmV0ICE9IEhfUEFHRV9SRUdJU1RFUkVEKSkgeworCQkJCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsCisJCQkJCQkJICAgICBtci0+aGFuZGxlLAorCQkJCQkJCSAgICAgRk9SQ0VfRlJFRSk7CisJCQkJCWVoZWFfZXJyb3IoInJlZ2lzdGVyX3JwYWdlX21yIGZhaWxlZCIpOworCQkJCQlyZXQgPSAtRUlPOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CiAJCX0KIAotCQlpZiAoKGhyZXQgIT0gSF9TVUNDRVNTKSAmJiAoaHJldCAhPSBIX1BBR0VfUkVHSVNURVJFRCkpIHsKLQkJCWVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXItPmhhbmRsZSwKLQkJCQkJICAgICBtci0+aGFuZGxlLCBGT1JDRV9GUkVFKTsKLQkJCWVoZWFfZXJyb3IoInJlZ2lzdGVyX3JwYWdlX21yIGZhaWxlZCIpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCiAJaWYgKGhyZXQgIT0gSF9TVUNDRVNTKSB7Ci0JCWVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXItPmhhbmRsZSwgbXItPmhhbmRsZSwKLQkJCQkgICAgIEZPUkNFX0ZSRUUpOwotCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZSBmYWlsZWQgZm9yIGxhc3QgcGFnZSIpOworCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIG1yLT5oYW5kbGUsIEZPUkNFX0ZSRUUpOworCQllaGVhX2Vycm9yKCJyZWdpc3RlcmluZyBtciBmYWlsZWQiKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCisJbXItPnZhZGRyID0gRUhFQV9CVVNNQVBfU1RBUlQ7CiAJbXItPmFkYXB0ZXIgPSBhZGFwdGVyOwogCXJldCA9IDA7CiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmggYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmgKaW5kZXggYzBlYjNlMC4uYjcxZjg0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuaApAQCAtMzYsOCArMzYsMTQgQEAKICAqIHBhZ2Ugc2l6ZSBvZiBlaGVhIGhhcmR3YXJlIHF1ZXVlcwogICovCiAKLSNkZWZpbmUgRUhFQV9QQUdFU0hJRlQgIDEyCi0jZGVmaW5lIEVIRUFfUEFHRVNJWkUgICA0MDk2VUwKKyNkZWZpbmUgRUhFQV9QQUdFU0hJRlQgICAgICAgICAxMgorI2RlZmluZSBFSEVBX1BBR0VTSVpFICAgICAgICAgICgxVUwgPDwgRUhFQV9QQUdFU0hJRlQpCisjZGVmaW5lIEVIRUFfU0VDVFNJWkUgICAgICAgICAgKDFVTCA8PCAyNCkKKyNkZWZpbmUgRUhFQV9QQUdFU19QRVJfU0VDVElPTiAoRUhFQV9TRUNUU0laRSA+PiBQQUdFX1NISUZUKQorCisjaWYgKDFVTCA8PCBTRUNUSU9OX1NJWkVfQklUUykgPCBFSEVBX1NFQ1RTSVpFCisjZXJyb3IgZUhFQSBtb2R1bGUgY2FuJ3Qgd29yayBpZiBrZXJuZWwgc2VjdGlvbnNpemUgPCBlaGVhIHNlY3Rpb25zaXplCisjZW5kaWYKIAogLyogU29tZSBhYmJyZXZpYXRpb25zIHVzZWQgaGVyZToKICAqCkBAIC0zNzIsNCArMzc4LDggQEAKIAogdm9pZCBlaGVhX2Vycm9yX2RhdGEoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciwgdTY0IHJlc19oYW5kbGUpOwogCitpbnQgZWhlYV9jcmVhdGVfYnVzbWFwKCB2b2lkICk7Cit2b2lkIGVoZWFfZGVzdHJveV9idXNtYXAoIHZvaWQgKTsKK3U2NCBlaGVhX21hcF92YWRkcih2b2lkICpjYWRkcik7CisKICNlbmRpZgkvKiBfX0VIRUFfUU1SX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCA2NzA0NmU4Li4xMzY4MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtNTUwLDYgKzU1MCw4IEBACiAvKiBQSFkgZGVmaW5lcyAqLwogI2RlZmluZSBQSFlfT1VJX01BUlZFTEwJMHg1MDQzCiAjZGVmaW5lIFBIWV9PVUlfQ0lDQURBCTB4MDNmMQorI2RlZmluZSBQSFlfT1VJX1ZJVEVTU0UJMHgwMWMxCisjZGVmaW5lIFBIWV9PVUlfUkVBTFRFSwkweDAxYzEKICNkZWZpbmUgUEhZSUQxX09VSV9NQVNLCTB4MDNmZgogI2RlZmluZSBQSFlJRDFfT1VJX1NIRlQJNgogI2RlZmluZSBQSFlJRDJfT1VJX01BU0sJMHhmYzAwCkBAIC01NTcsMTIgKzU1OSwzNiBAQAogI2RlZmluZSBQSFlJRDJfTU9ERUxfTUFTSwkJMHgwM2YwCiAjZGVmaW5lIFBIWV9NT0RFTF9NQVJWRUxMX0UzMDE2CQkweDIyMAogI2RlZmluZSBQSFlfTUFSVkVMTF9FMzAxNl9JTklUTUFTSwkweDAzMDAKLSNkZWZpbmUgUEhZX0lOSVQxCTB4MGYwMDAKLSNkZWZpbmUgUEhZX0lOSVQyCTB4MGUwMAotI2RlZmluZSBQSFlfSU5JVDMJMHgwMTAwMAotI2RlZmluZSBQSFlfSU5JVDQJMHgwMjAwCi0jZGVmaW5lIFBIWV9JTklUNQkweDAwMDQKLSNkZWZpbmUgUEhZX0lOSVQ2CTB4MDIwMDAKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUMQkweDBmMDAwCisjZGVmaW5lIFBIWV9DSUNBREFfSU5JVDIJMHgwZTAwCisjZGVmaW5lIFBIWV9DSUNBREFfSU5JVDMJMHgwMTAwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQ0CTB4MDIwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQ1CTB4MDAwNAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQ2CTB4MDIwMDAKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9SRUcxCTB4MWYKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyCTB4MTAKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9SRUczCTB4MTEKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0CTB4MTIKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9NU0sxCTB4YworI2RlZmluZSBQSFlfVklURVNTRV9JTklUX01TSzIJMHgwMTgwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQxCTB4NTJiNQorI2RlZmluZSBQSFlfVklURVNTRV9JTklUMgkweGFmOGEKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDMJMHg4CisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ0CTB4OGY4YQorI2RlZmluZSBQSFlfVklURVNTRV9JTklUNQkweGFmODYKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDYJMHg4Zjg2CisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ3CTB4YWY4MgorI2RlZmluZSBQSFlfVklURVNTRV9JTklUOAkweDAxMDAKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDkJMHg4ZjgyCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQxMAkweDAKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUcxCTB4MWYKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUcyCTB4MTkKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUczCTB4MTMKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDEJMHgwMDAwCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQyCTB4OGUwMAorI2RlZmluZSBQSFlfUkVBTFRFS19JTklUMwkweDAwMDEKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDQJMHhhZDE3CisKICNkZWZpbmUgUEhZX0dJR0FCSVQJMHgwMTAwCiAKICNkZWZpbmUgUEhZX1RJTUVPVVQJMHgxCkBAIC0xMDk2LDYgKzExMjIsMjggQEAKIAkJCXJldHVybiBQSFlfRVJST1I7CiAJCX0KIAl9CisJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfUkVBTFRFSykgeworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzIsIFBIWV9SRUFMVEVLX0lOSVQyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMywgUEhZX1JFQUxURUtfSU5JVDQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQogCiAJLyogc2V0IGFkdmVydGlzZSByZWdpc3RlciAqLwogCXJlZyA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCBNSUlfUkVBRCk7CkBAIC0xMTQxLDE0ICsxMTg5LDE0IEBACiAJLyogcGh5IHZlbmRvciBzcGVjaWZpYyBjb25maWd1cmF0aW9uICovCiAJaWYgKChucC0+cGh5X291aSA9PSBQSFlfT1VJX0NJQ0FEQSkgJiYgKHBoeWludGVyZmFjZSAmIFBIWV9SR01JSSkgKSB7CiAJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfUkVTVjEsIE1JSV9SRUFEKTsKLQkJcGh5X3Jlc2VydmVkICY9IH4oUEhZX0lOSVQxIHwgUEhZX0lOSVQyKTsKLQkJcGh5X3Jlc2VydmVkIHw9IChQSFlfSU5JVDMgfCBQSFlfSU5JVDQpOworCQlwaHlfcmVzZXJ2ZWQgJj0gfihQSFlfQ0lDQURBX0lOSVQxIHwgUEhZX0NJQ0FEQV9JTklUMik7CisJCXBoeV9yZXNlcnZlZCB8PSAoUEhZX0NJQ0FEQV9JTklUMyB8IFBIWV9DSUNBREFfSU5JVDQpOwogCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9SRVNWMSwgcGh5X3Jlc2VydmVkKSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CiAJCQlyZXR1cm4gUEhZX0VSUk9SOwogCQl9CiAJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfTkNPTkZJRywgTUlJX1JFQUQpOwotCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0lOSVQ1OworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0NJQ0FEQV9JTklUNTsKIAkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfTkNPTkZJRywgcGh5X3Jlc2VydmVkKSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CiAJCQlyZXR1cm4gUEhZX0VSUk9SOwpAQCAtMTE1NiwxMiArMTIwNCwxMDYgQEAKIAl9CiAJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfQ0lDQURBKSB7CiAJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfU1JFVklTSU9OLCBNSUlfUkVBRCk7Ci0JCXBoeV9yZXNlcnZlZCB8PSBQSFlfSU5JVDY7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfQ0lDQURBX0lOSVQ2OwogCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9TUkVWSVNJT04sIHBoeV9yZXNlcnZlZCkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwogCQkJcmV0dXJuIFBIWV9FUlJPUjsKIAkJfQogCX0KKwlpZiAobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9WSVRFU1NFKSB7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcxLCBQSFlfVklURVNTRV9JTklUMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDIpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgTUlJX1JFQUQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkICY9IH5QSFlfVklURVNTRV9JTklUX01TSzE7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfVklURVNTRV9JTklUMzsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQ1KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkICY9IH5QSFlfVklURVNTRV9JTklUX01TSzE7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfVklURVNTRV9JTklUMzsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBNSUlfUkVBRCk7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQ2KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUNykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBNSUlfUkVBRCk7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgTUlJX1JFQUQpOworCQlwaHlfcmVzZXJ2ZWQgJj0gflBIWV9WSVRFU1NFX0lOSVRfTVNLMjsKKwkJcGh5X3Jlc2VydmVkIHw9IFBIWV9WSVRFU1NFX0lOSVQ4OworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUOSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMSwgUEhZX1ZJVEVTU0VfSU5JVDEwKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQorCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX1JFQUxURUspIHsKKwkJLyogcmVzZXQgY291bGQgaGF2ZSBjbGVhcmVkIHRoZXNlIG91dCwgc2V0IHRoZW0gYmFjayAqLworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzIsIFBIWV9SRUFMVEVLX0lOSVQyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMywgUEhZX1JFQUxURUtfSU5JVDQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQorCiAJLyogc29tZSBwaHlzIGNsZWFyIG91dCBwYXVzZSBhZHZlcnRpc21lbnQgb24gcmVzZXQsIHNldCBpdCBiYWNrICovCiAJbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIHJlZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCmluZGV4IDVkZDM0YTEuLmFjMzU5NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL29jcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNiLmMgYi9kcml2ZXJzL25ldC9tYWNiLmMKaW5kZXggMGUwNGY3YS4uYTRiYjAyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjYi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY2IuYwpAQCAtMTcsMTMgKzE3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlpLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CiAKICNpbmNsdWRlICJtYWNiLmgiCiAKQEAgLTg1LDE3MiArODQsMjAyIEBACiAJCW1lbWNweShicC0+ZGV2LT5kZXZfYWRkciwgYWRkciwgc2l6ZW9mKGFkZHIpKTsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9lbmFibGVfbWRpbyhzdHJ1Y3QgbWFjYiAqYnApCitzdGF0aWMgaW50IG1hY2JfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0pCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7Ci0JcmVnID0gbWFjYl9yZWFkbChicCwgTkNSKTsKLQlyZWcgfD0gTUFDQl9CSVQoTVBFKTsKLQltYWNiX3dyaXRlbChicCwgTkNSLCByZWcpOwotCW1hY2Jfd3JpdGVsKGJwLCBJRVIsIE1BQ0JfQklUKE1GRCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hY2JfZGlzYWJsZV9tZGlvKHN0cnVjdCBtYWNiICpicCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiByZWc7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKLQlyZWcgPSBtYWNiX3JlYWRsKGJwLCBOQ1IpOwotCXJlZyAmPSB+TUFDQl9CSVQoTVBFKTsKLQltYWNiX3dyaXRlbChicCwgTkNSLCByZWcpOwotCW1hY2Jfd3JpdGVsKGJwLCBJRFIsIE1BQ0JfQklUKE1GRCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbWFjYl9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQotewotCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1hY2IgKmJwID0gYnVzLT5wcml2OwogCWludCB2YWx1ZTsKIAotCW11dGV4X2xvY2soJmJwLT5tZGlvX211dGV4KTsKLQotCW1hY2JfZW5hYmxlX21kaW8oYnApOwogCW1hY2Jfd3JpdGVsKGJwLCBNQU4sIChNQUNCX0JGKFNPRiwgTUFDQl9NQU5fU09GKQogCQkJICAgICAgfCBNQUNCX0JGKFJXLCBNQUNCX01BTl9SRUFEKQotCQkJICAgICAgfCBNQUNCX0JGKFBIWUEsIHBoeV9pZCkKLQkJCSAgICAgIHwgTUFDQl9CRihSRUdBLCBsb2NhdGlvbikKKwkJCSAgICAgIHwgTUFDQl9CRihQSFlBLCBtaWlfaWQpCisJCQkgICAgICB8IE1BQ0JfQkYoUkVHQSwgcmVnbnVtKQogCQkJICAgICAgfCBNQUNCX0JGKENPREUsIE1BQ0JfTUFOX0NPREUpKSk7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7CisJLyogd2FpdCBmb3IgZW5kIG9mIHRyYW5zZmVyICovCisJd2hpbGUgKCFNQUNCX0JGRVhUKElETEUsIG1hY2JfcmVhZGwoYnAsIE5TUikpKQorCQljcHVfcmVsYXgoKTsKIAogCXZhbHVlID0gTUFDQl9CRkVYVChEQVRBLCBtYWNiX3JlYWRsKGJwLCBNQU4pKTsKLQltYWNiX2Rpc2FibGVfbWRpbyhicCk7Ci0JbXV0ZXhfdW5sb2NrKCZicC0+bWRpb19tdXRleCk7CiAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLAotCQkJICAgIGludCBsb2NhdGlvbiwgaW50IHZhbCkKK3N0YXRpYyBpbnQgbWFjYl9tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0sCisJCQkgICB1MTYgdmFsdWUpCiB7Ci0Jc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJtZGlvX3dyaXRlICUwMng6JTAyeCA8LSAlMDR4XG4iLAotCQlwaHlfaWQsIGxvY2F0aW9uLCB2YWwpOwotCi0JbXV0ZXhfbG9jaygmYnAtPm1kaW9fbXV0ZXgpOwotCW1hY2JfZW5hYmxlX21kaW8oYnApOworCXN0cnVjdCBtYWNiICpicCA9IGJ1cy0+cHJpdjsKIAogCW1hY2Jfd3JpdGVsKGJwLCBNQU4sIChNQUNCX0JGKFNPRiwgTUFDQl9NQU5fU09GKQogCQkJICAgICAgfCBNQUNCX0JGKFJXLCBNQUNCX01BTl9XUklURSkKLQkJCSAgICAgIHwgTUFDQl9CRihQSFlBLCBwaHlfaWQpCi0JCQkgICAgICB8IE1BQ0JfQkYoUkVHQSwgbG9jYXRpb24pCisJCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgbWlpX2lkKQorCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIHJlZ251bSkKIAkJCSAgICAgIHwgTUFDQl9CRihDT0RFLCBNQUNCX01BTl9DT0RFKQotCQkJICAgICAgfCBNQUNCX0JGKERBVEEsIHZhbCkpKTsKKwkJCSAgICAgIHwgTUFDQl9CRihEQVRBLCB2YWx1ZSkpKTsKIAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJwLT5tZGlvX2NvbXBsZXRlKTsKKwkvKiB3YWl0IGZvciBlbmQgb2YgdHJhbnNmZXIgKi8KKwl3aGlsZSAoIU1BQ0JfQkZFWFQoSURMRSwgbWFjYl9yZWFkbChicCwgTlNSKSkpCisJCWNwdV9yZWxheCgpOwogCi0JbWFjYl9kaXNhYmxlX21kaW8oYnApOwotCW11dGV4X3VubG9jaygmYnAtPm1kaW9fbXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IG1hY2JfcGh5X3Byb2JlKHN0cnVjdCBtYWNiICpicCkKLXsKLQlpbnQgcGh5X2FkZHJlc3M7Ci0JdTE2IHBoeWlkMSwgcGh5aWQyOwotCi0JZm9yIChwaHlfYWRkcmVzcyA9IDA7IHBoeV9hZGRyZXNzIDwgMzI7IHBoeV9hZGRyZXNzKyspIHsKLQkJcGh5aWQxID0gbWFjYl9tZGlvX3JlYWQoYnAtPmRldiwgcGh5X2FkZHJlc3MsIE1JSV9QSFlTSUQxKTsKLQkJcGh5aWQyID0gbWFjYl9tZGlvX3JlYWQoYnAtPmRldiwgcGh5X2FkZHJlc3MsIE1JSV9QSFlTSUQyKTsKLQotCQlpZiAocGh5aWQxICE9IDB4ZmZmZiAmJiBwaHlpZDEgIT0gMHgwMDAwCi0JCSAgICAmJiBwaHlpZDIgIT0gMHhmZmZmICYmIHBoeWlkMiAhPSAweDAwMDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocGh5X2FkZHJlc3MgPT0gMzIpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2X2luZm8oJmJwLT5wZGV2LT5kZXYsCi0JCSAiZGV0ZWN0ZWQgUEhZIGF0IGFkZHJlc3MgJWQgKElEICUwNHg6JTA0eClcbiIsCi0JCSBwaHlfYWRkcmVzcywgcGh5aWQxLCBwaHlpZDIpOwotCi0JYnAtPm1paS5waHlfaWQgPSBwaHlfYWRkcmVzczsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9zZXRfbWVkaWEoc3RydWN0IG1hY2IgKmJwLCBpbnQgbWVkaWEpCitzdGF0aWMgaW50IG1hY2JfbWRpb19yZXNldChzdHJ1Y3QgbWlpX2J1cyAqYnVzKQogewotCXUzMiByZWc7Ci0KLQlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7Ci0JcmVnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpOwotCXJlZyAmPSB+KE1BQ0JfQklUKFNQRCkgfCBNQUNCX0JJVChGRCkpOwotCWlmIChtZWRpYSAmIChBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKSkKLQkJcmVnIHw9IE1BQ0JfQklUKFNQRCk7Ci0JaWYgKG1lZGlhICYgQURWRVJUSVNFX0ZVTEwpCi0JCXJlZyB8PSBNQUNCX0JJVChGRCk7Ci0JbWFjYl93cml0ZWwoYnAsIE5DRkdSLCByZWcpOwotCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX2NoZWNrX21lZGlhKHN0cnVjdCBtYWNiICpicCwgaW50IG9rX3RvX3ByaW50LCBpbnQgaW5pdF9tZWRpYSkKK3N0YXRpYyB2b2lkIG1hY2JfaGFuZGxlX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1paV9pZl9pbmZvICptaWkgPSAmYnAtPm1paTsKLQl1bnNpZ25lZCBpbnQgb2xkX2NhcnJpZXIsIG5ld19jYXJyaWVyOwotCWludCBhZHZlcnRpc2UsIGxwYSwgbWVkaWEsIGR1cGxleDsKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBicC0+cGh5X2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogaWYgZm9yY2VkIG1lZGlhLCBnbyBubyBmdXJ0aGVyICovCi0JaWYgKG1paS0+Zm9yY2VfbWVkaWEpCi0JCXJldHVybjsKKwlpbnQgc3RhdHVzX2NoYW5nZSA9IDA7CiAKLQkvKiBjaGVjayBjdXJyZW50IGFuZCBvbGQgbGluayBzdGF0dXMgKi8KLQlvbGRfY2FycmllciA9IG5ldGlmX2NhcnJpZXJfb2sobWlpLT5kZXYpID8gMSA6IDA7Ci0JbmV3X2NhcnJpZXIgPSAodW5zaWduZWQgaW50KSBtaWlfbGlua19vayhtaWkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwogCi0JLyogaWYgY2FycmllciBzdGF0ZSBkaWQgbm90IGNoYW5nZSwgYXNzdW1lIG5vdGhpbmcgZWxzZSBkaWQgKi8KLQlpZiAoIWluaXRfbWVkaWEgJiYgb2xkX2NhcnJpZXIgPT0gbmV3X2NhcnJpZXIpCi0JCXJldHVybjsKKwlpZiAocGh5ZGV2LT5saW5rKSB7CisJCWlmICgoYnAtPnNwZWVkICE9IHBoeWRldi0+c3BlZWQpIHx8CisJCSAgICAoYnAtPmR1cGxleCAhPSBwaHlkZXYtPmR1cGxleCkpIHsKKwkJCXUzMiByZWc7CiAKLQkvKiBubyBjYXJyaWVyLCBub3RoaW5nIG11Y2ggdG8gZG8gKi8KLQlpZiAoIW5ld19jYXJyaWVyKSB7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKG1paS0+ZGV2KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgbWlpLT5kZXYtPm5hbWUpOwotCQlyZXR1cm47CisJCQlyZWcgPSBtYWNiX3JlYWRsKGJwLCBOQ0ZHUik7CisJCQlyZWcgJj0gfihNQUNCX0JJVChTUEQpIHwgTUFDQl9CSVQoRkQpKTsKKworCQkJaWYgKHBoeWRldi0+ZHVwbGV4KQorCQkJCXJlZyB8PSBNQUNCX0JJVChGRCk7CisJCQlpZiAocGh5ZGV2LT5zcGVlZCkKKwkJCQlyZWcgfD0gTUFDQl9CSVQoU1BEKTsKKworCQkJbWFjYl93cml0ZWwoYnAsIE5DRkdSLCByZWcpOworCisJCQlicC0+c3BlZWQgPSBwaHlkZXYtPnNwZWVkOworCQkJYnAtPmR1cGxleCA9IHBoeWRldi0+ZHVwbGV4OworCQkJc3RhdHVzX2NoYW5nZSA9IDE7CisJCX0KIAl9CiAKLQkvKgotCSAqIHdlIGhhdmUgY2Fycmllciwgc2VlIHdobydzIG9uIHRoZSBvdGhlciBlbmQKLQkgKi8KLQluZXRpZl9jYXJyaWVyX29uKG1paS0+ZGV2KTsKKwlpZiAocGh5ZGV2LT5saW5rICE9IGJwLT5saW5rKSB7CisJCWlmIChwaHlkZXYtPmxpbmspCisJCQluZXRpZl9zY2hlZHVsZShkZXYpOworCQllbHNlIHsKKwkJCWJwLT5zcGVlZCA9IDA7CisJCQlicC0+ZHVwbGV4ID0gLTE7CisJCX0KKwkJYnAtPmxpbmsgPSBwaHlkZXYtPmxpbms7CiAKLQkvKiBnZXQgTUlJIGFkdmVydGlzZSBhbmQgTFBBIHZhbHVlcyAqLwotCWlmICghaW5pdF9tZWRpYSAmJiBtaWktPmFkdmVydGlzaW5nKSB7Ci0JCWFkdmVydGlzZSA9IG1paS0+YWR2ZXJ0aXNpbmc7CisJCXN0YXR1c19jaGFuZ2UgPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhdHVzX2NoYW5nZSkgeworCQlpZiAocGh5ZGV2LT5saW5rKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAgKCVkLyVzKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHBoeWRldi0+c3BlZWQsCisJCQkgICAgICAgRFVQTEVYX0ZVTEwgPT0gcGh5ZGV2LT5kdXBsZXggPyAiRnVsbCI6IkhhbGYiKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgZGV2LT5uYW1lKTsKKwl9Cit9CisKKy8qIGJhc2VkIG9uIGF1MTAwMF9ldGguIGMqLworc3RhdGljIGludCBtYWNiX21paV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IE5VTEw7CisJc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgcGh5X2FkZHI7CisKKwkvKiBmaW5kIHRoZSBmaXJzdCBwaHkgKi8KKwlmb3IgKHBoeV9hZGRyID0gMDsgcGh5X2FkZHIgPCBQSFlfTUFYX0FERFI7IHBoeV9hZGRyKyspIHsKKwkJaWYgKGJwLT5taWlfYnVzLnBoeV9tYXBbcGh5X2FkZHJdKSB7CisJCQlwaHlkZXYgPSBicC0+bWlpX2J1cy5waHlfbWFwW3BoeV9hZGRyXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFwaHlkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IG5vIFBIWSBmb3VuZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBkYXRhID0gYnAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCS8qIFRPRE8gOiBhZGQgcGluX2lycSAqLworCisJLyogYXR0YWNoIHRoZSBtYWMgdG8gdGhlIHBoeSAqLworCWlmIChwZGF0YSAmJiBwZGF0YS0+aXNfcm1paSkgeworCQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeWRldi0+ZGV2LmJ1c19pZCwKKwkJCSZtYWNiX2hhbmRsZV9saW5rX2NoYW5nZSwgMCwgUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUkpOwogCX0gZWxzZSB7Ci0JCWFkdmVydGlzZSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0FEVkVSVElTRSk7Ci0JCW1paS0+YWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2U7CisJCXBoeWRldiA9IHBoeV9jb25uZWN0KGRldiwgcGh5ZGV2LT5kZXYuYnVzX2lkLAorCQkJJm1hY2JfaGFuZGxlX2xpbmtfY2hhbmdlLCAwLCBQSFlfSU5URVJGQUNFX01PREVfTUlJKTsKIAl9Ci0JbHBhID0gbWlpLT5tZGlvX3JlYWQobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfTFBBKTsKIAotCS8qIGZpZ3VyZSBvdXQgbWVkaWEgYW5kIGR1cGxleCBmcm9tIGFkdmVydGlzZSBhbmQgTFBBIHZhbHVlcyAqLwotCW1lZGlhID0gbWlpX253YXlfcmVzdWx0KGxwYSAmIGFkdmVydGlzZSk7Ci0JZHVwbGV4ID0gKG1lZGlhICYgQURWRVJUSVNFX0ZVTEwpID8gMSA6IDA7CisJaWYgKElTX0VSUihwaHlkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gUFRSX0VSUihwaHlkZXYpOworCX0KIAotCWlmIChva190b19wcmludCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAsICVzTWJwcywgJXMtZHVwbGV4LCBscGEgMHglMDRYXG4iLAotCQkgICAgICAgbWlpLT5kZXYtPm5hbWUsCi0JCSAgICAgICBtZWRpYSAmIChBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMDBIQUxGKSA/ICIxMDAiIDogIjEwIiwKLQkJICAgICAgIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwgbHBhKTsKKwkvKiBtYXNrIHdpdGggTUFDIHN1cHBvcnRlZCBmZWF0dXJlcyAqLworCXBoeWRldi0+c3VwcG9ydGVkICY9IFBIWV9CQVNJQ19GRUFUVVJFUzsKIAotCW1paS0+ZnVsbF9kdXBsZXggPSBkdXBsZXg7CisJcGh5ZGV2LT5hZHZlcnRpc2luZyA9IHBoeWRldi0+c3VwcG9ydGVkOwogCi0JLyogTGV0IHRoZSBNQUMga25vdyBhYm91dCB0aGUgbmV3IGxpbmsgc3RhdGUgKi8KLQltYWNiX3NldF9tZWRpYShicCwgbWVkaWEpOworCWJwLT5saW5rID0gMDsKKwlicC0+c3BlZWQgPSAwOworCWJwLT5kdXBsZXggPSAtMTsKKwlicC0+cGh5X2RldiA9IHBoeWRldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY2JfbWlpX2luaXQoc3RydWN0IG1hY2IgKmJwKQoreworCXN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IGVyciA9IC1FTlhJTywgaTsKKworCS8qIEVuYWJsZSBtYW5hZ21lbnQgcG9ydCAqLworCW1hY2Jfd3JpdGVsKGJwLCBOQ1IsIE1BQ0JfQklUKE1QRSkpOworCisJYnAtPm1paV9idXMubmFtZSA9ICJNQUNCX21paV9idXMiLAorCWJwLT5taWlfYnVzLnJlYWQgPSAmbWFjYl9tZGlvX3JlYWQsCisJYnAtPm1paV9idXMud3JpdGUgPSAmbWFjYl9tZGlvX3dyaXRlLAorCWJwLT5taWlfYnVzLnJlc2V0ID0gJm1hY2JfbWRpb19yZXNldCwKKwlicC0+bWlpX2J1cy5pZCA9IGJwLT5wZGV2LT5pZCwKKwlicC0+bWlpX2J1cy5wcml2ID0gYnAsCisJYnAtPm1paV9idXMuZGV2ID0gJmJwLT5kZXYtPmRldjsKKwlwZGF0YSA9IGJwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChwZGF0YSkKKwkJYnAtPm1paV9idXMucGh5X21hc2sgPSBwZGF0YS0+cGh5X21hc2s7CisKKwlicC0+bWlpX2J1cy5pcnEgPSBrbWFsbG9jKHNpemVvZihpbnQpKlBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicC0+bWlpX2J1cy5pcnEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBQSFlfTUFYX0FERFI7IGkrKykKKwkJYnAtPm1paV9idXMuaXJxW2ldID0gUEhZX1BPTEw7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShicC0+ZGV2LCAmYnAtPm1paV9idXMpOworCisJaWYgKG1kaW9idXNfcmVnaXN0ZXIoJmJwLT5taWlfYnVzKSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfbWRpb19pcnE7CisKKwlpZiAobWFjYl9taWlfcHJvYmUoYnAtPmRldikgIT0gMCkgeworCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9idXM7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5yZWdpc3Rlcl9idXM6CisJbWRpb2J1c191bnJlZ2lzdGVyKCZicC0+bWlpX2J1cyk7CitlcnJfb3V0X2ZyZWVfbWRpb19pcnE6CisJa2ZyZWUoYnAtPm1paV9idXMuaXJxKTsKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgbWFjYl91cGRhdGVfc3RhdHMoc3RydWN0IG1hY2IgKmJwKQpAQCAtMjY1LDE2ICsyOTQsNiBAQAogCQkqcCArPSBfX3Jhd19yZWFkbChyZWcpOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX3BlcmlvZGljX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBtYWNiICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWFjYiwgcGVyaW9kaWNfdGFzay53b3JrKTsKLQotCW1hY2JfdXBkYXRlX3N0YXRzKGJwKTsKLQltYWNiX2NoZWNrX21lZGlhKGJwLCAxLCAwKTsKLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYnAtPnBlcmlvZGljX3Rhc2ssIEhaKTsKLX0KLQogc3RhdGljIHZvaWQgbWFjYl90eChzdHJ1Y3QgbWFjYiAqYnApCiB7CiAJdW5zaWduZWQgaW50IHRhaWw7CkBAIC01MTksOSArNTM4LDYgQEAKIAlzcGluX2xvY2soJmJwLT5sb2NrKTsKIAogCXdoaWxlIChzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyAmIE1BQ0JfQklUKE1GRCkpCi0JCQljb21wbGV0ZSgmYnAtPm1kaW9fY29tcGxldGUpOwotCiAJCS8qIGNsb3NlIHBvc3NpYmxlIHJhY2Ugd2l0aCBkZXZfY2xvc2UgKi8KIAkJaWYgKHVubGlrZWx5KCFuZXRpZl9ydW5uaW5nKGRldikpKSB7CiAJCQltYWNiX3dyaXRlbChicCwgSURSLCB+MFVMKTsKQEAgLTUzNSw3ICs1NTEsOCBAQAogCQkJCSAqIHVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZSBidWZmZXJzCiAJCQkJICovCiAJCQkJbWFjYl93cml0ZWwoYnAsIElEUiwgTUFDQl9SWF9JTlRfRkxBR1MpOwotCQkJCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJzY2hlZHVsaW5nIFJYIHNvZnRpcnFcbiIpOworCQkJCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsCisJCQkJCSJzY2hlZHVsaW5nIFJYIHNvZnRpcnFcbiIpOwogCQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKIAkJCX0KIAkJfQpAQCAtNzY1LDcgKzc4Miw3IEBACiAJbWFjYl93cml0ZWwoYnAsIFRCUVAsIGJwLT50eF9yaW5nX2RtYSk7CiAKIAkvKiBFbmFibGUgVFggYW5kIFJYICovCi0JbWFjYl93cml0ZWwoYnAsIE5DUiwgTUFDQl9CSVQoUkUpIHwgTUFDQl9CSVQoVEUpKTsKKwltYWNiX3dyaXRlbChicCwgTkNSLCBNQUNCX0JJVChSRSkgfCBNQUNCX0JJVChURSkgfCBNQUNCX0JJVChNUEUpKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAJbWFjYl93cml0ZWwoYnAsIElFUiwgKE1BQ0JfQklUKFJDT01QKQpAQCAtNzc2LDE4ICs3OTMsMTI2IEBACiAJCQkgICAgICB8IE1BQ0JfQklUKFRDT01QKQogCQkJICAgICAgfCBNQUNCX0JJVChJU1JfUk9WUikKIAkJCSAgICAgIHwgTUFDQl9CSVQoSFJFU1ApKSk7CisKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9pbml0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorLyoKKyAqIFRoZSBoYXNoIGFkZHJlc3MgcmVnaXN0ZXIgaXMgNjQgYml0cyBsb25nIGFuZCB0YWtlcyB1cCB0d28KKyAqIGxvY2F0aW9ucyBpbiB0aGUgbWVtb3J5IG1hcC4gIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSBzdG9yZWQKKyAqIGluIEVNQUNfSFNMIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIGluIEVNQUNfSFNILgorICoKKyAqIFRoZSB1bmljYXN0IGhhc2ggZW5hYmxlIGFuZCB0aGUgbXVsdGljYXN0IGhhc2ggZW5hYmxlIGJpdHMgaW4gdGhlCisgKiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZW5hYmxlIHRoZSByZWNlcHRpb24gb2YgaGFzaCBtYXRjaGVkCisgKiBmcmFtZXMuIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIHJlZHVjZWQgdG8gYSA2IGJpdCBpbmRleCBpbnRvCisgKiB0aGUgNjQgYml0IGhhc2ggcmVnaXN0ZXIgdXNpbmcgdGhlIGZvbGxvd2luZyBoYXNoIGZ1bmN0aW9uLiAgVGhlCisgKiBoYXNoIGZ1bmN0aW9uIGlzIGFuIGV4Y2x1c2l2ZSBvciBvZiBldmVyeSBzaXh0aCBiaXQgb2YgdGhlCisgKiBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoKKyAqIGhpWzVdID0gZGFbNV0gXiBkYVsxMV0gXiBkYVsxN10gXiBkYVsyM10gXiBkYVsyOV0gXiBkYVszNV0gXiBkYVs0MV0gXiBkYVs0N10KKyAqIGhpWzRdID0gZGFbNF0gXiBkYVsxMF0gXiBkYVsxNl0gXiBkYVsyMl0gXiBkYVsyOF0gXiBkYVszNF0gXiBkYVs0MF0gXiBkYVs0Nl0KKyAqIGhpWzNdID0gZGFbM10gXiBkYVswOV0gXiBkYVsxNV0gXiBkYVsyMV0gXiBkYVsyN10gXiBkYVszM10gXiBkYVszOV0gXiBkYVs0NV0KKyAqIGhpWzJdID0gZGFbMl0gXiBkYVswOF0gXiBkYVsxNF0gXiBkYVsyMF0gXiBkYVsyNl0gXiBkYVszMl0gXiBkYVszOF0gXiBkYVs0NF0KKyAqIGhpWzFdID0gZGFbMV0gXiBkYVswN10gXiBkYVsxM10gXiBkYVsxOV0gXiBkYVsyNV0gXiBkYVszMV0gXiBkYVszN10gXiBkYVs0M10KKyAqIGhpWzBdID0gZGFbMF0gXiBkYVswNl0gXiBkYVsxMl0gXiBkYVsxOF0gXiBkYVsyNF0gXiBkYVszMF0gXiBkYVszNl0gXiBkYVs0Ml0KKyAqCisgKiBkYVswXSByZXByZXNlbnRzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGZpcnN0IGJ5dGUKKyAqIHJlY2VpdmVkLCB0aGF0IGlzLCB0aGUgbXVsdGljYXN0L3VuaWNhc3QgaW5kaWNhdG9yLCBhbmQgZGFbNDddCisgKiByZXByZXNlbnRzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbGFzdCBieXRlIHJlY2VpdmVkLiAgSWYKKyAqIHRoZSBoYXNoIGluZGV4LCBoaVtuXSwgcG9pbnRzIHRvIGEgYml0IHRoYXQgaXMgc2V0IGluIHRoZSBoYXNoCisgKiByZWdpc3RlciB0aGVuIHRoZSBmcmFtZSB3aWxsIGJlIG1hdGNoZWQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlCisgKiBmcmFtZSBpcyBtdWx0aWNhc3Qgb3IgdW5pY2FzdC4gIEEgbXVsdGljYXN0IG1hdGNoIHdpbGwgYmUgc2lnbmFsbGVkCisgKiBpZiB0aGUgbXVsdGljYXN0IGhhc2ggZW5hYmxlIGJpdCBpcyBzZXQsIGRhWzBdIGlzIDEgYW5kIHRoZSBoYXNoCisgKiBpbmRleCBwb2ludHMgdG8gYSBiaXQgc2V0IGluIHRoZSBoYXNoIHJlZ2lzdGVyLiAgQSB1bmljYXN0IG1hdGNoCisgKiB3aWxsIGJlIHNpZ25hbGxlZCBpZiB0aGUgdW5pY2FzdCBoYXNoIGVuYWJsZSBiaXQgaXMgc2V0LCBkYVswXSBpcyAwCisgKiBhbmQgdGhlIGhhc2ggaW5kZXggcG9pbnRzIHRvIGEgYml0IHNldCBpbiB0aGUgaGFzaCByZWdpc3Rlci4gIFRvCisgKiByZWNlaXZlIGFsbCBtdWx0aWNhc3QgZnJhbWVzLCB0aGUgaGFzaCByZWdpc3RlciBzaG91bGQgYmUgc2V0IHdpdGgKKyAqIGFsbCBvbmVzIGFuZCB0aGUgbXVsdGljYXN0IGhhc2ggZW5hYmxlIGJpdCBzaG91bGQgYmUgc2V0IGluIHRoZQorICogbmV0d29yayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGhhc2hfYml0X3ZhbHVlKGludCBiaXRuciwgX191OCAqYWRkcikKIHsKKwlpZiAoYWRkcltiaXRuciAvIDhdICYgKDEgPDwgKGJpdG5yICUgOCkpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgaGFzaCBpbmRleCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IGhhc2hfZ2V0X2luZGV4KF9fdTggKmFkZHIpCit7CisJaW50IGksIGosIGJpdHZhbDsKKwlpbnQgaGFzaF9pbmRleCA9IDA7CisKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCWZvciAoaSA9IDAsIGJpdHZhbCA9IDA7IGkgPCA4OyBpKyspCisJCQliaXR2YWwgXj0gaGFzaF9iaXRfdmFsdWUoaSo2ICsgaiwgYWRkcik7CisKKwkJaGFzaF9pbmRleCB8PSAoYml0dmFsIDw8IGopOworCX0KKworCXJldHVybiBoYXNoX2luZGV4OworfQorCisvKgorICogQWRkIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gdGhlIGludGVybmFsIG11bHRpY2FzdC1oYXNoIHRhYmxlLgorICovCitzdGF0aWMgdm9pZCBtYWNiX3NldGhhc2h0YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqY3VycjsKKwl1bnNpZ25lZCBsb25nIG1jX2ZpbHRlclsyXTsKKwl1bnNpZ25lZCBpbnQgaSwgYml0bnI7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCS8qIFNldCBzb21lIHJlYXNvbmFibGUgZGVmYXVsdCBzZXR0aW5ncyAqLwotCW1hY2JfbWRpb193cml0ZShkZXYsIGJwLT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAotCQkJQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfQUxMKTsKLQltYWNiX21kaW9fd3JpdGUoZGV2LCBicC0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsCi0JCQkoQk1DUl9TUEVFRDEwMCB8IEJNQ1JfQU5FTkFCTEUKLQkJCSB8IEJNQ1JfQU5SRVNUQVJUIHwgQk1DUl9GVUxMRFBMWCkpOworCW1jX2ZpbHRlclswXSA9IG1jX2ZpbHRlclsxXSA9IDA7CisKKwljdXJyID0gZGV2LT5tY19saXN0OworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyssIGN1cnIgPSBjdXJyLT5uZXh0KSB7CisJCWlmICghY3VycikgYnJlYWs7CS8qIHVuZXhwZWN0ZWQgZW5kIG9mIGxpc3QgKi8KKworCQliaXRuciA9IGhhc2hfZ2V0X2luZGV4KGN1cnItPmRtaV9hZGRyKTsKKwkJbWNfZmlsdGVyW2JpdG5yID4+IDVdIHw9IDEgPDwgKGJpdG5yICYgMzEpOworCX0KKworCW1hY2Jfd3JpdGVsKGJwLCBIUkIsIG1jX2ZpbHRlclswXSk7CisJbWFjYl93cml0ZWwoYnAsIEhSVCwgbWNfZmlsdGVyWzFdKTsKK30KKworLyoKKyAqIEVuYWJsZS9EaXNhYmxlIHByb21pc2N1b3VzIGFuZCBtdWx0aWNhc3QgbW9kZXMuCisgKi8KK3N0YXRpYyB2b2lkIG1hY2Jfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGNmZzsKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJY2ZnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJY2ZnIHw9IE1BQ0JfQklUKENBRik7CisJZWxzZSBpZiAoZGV2LT5mbGFncyAmICh+SUZGX1BST01JU0MpKQorCQkgLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCWNmZyAmPSB+TUFDQl9CSVQoQ0FGKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCS8qIEVuYWJsZSBhbGwgbXVsdGljYXN0IG1vZGUgKi8KKwkJbWFjYl93cml0ZWwoYnAsIEhSQiwgLTEpOworCQltYWNiX3dyaXRlbChicCwgSFJULCAtMSk7CisJCWNmZyB8PSBNQUNCX0JJVChOQ0ZHUl9NVEkpOworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA+IDApIHsKKwkJLyogRW5hYmxlIHNwZWNpZmljIG11bHRpY2FzdHMgKi8KKwkJbWFjYl9zZXRoYXNodGFibGUoZGV2KTsKKwkJY2ZnIHw9IE1BQ0JfQklUKE5DRkdSX01USSk7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgKH5JRkZfQUxMTVVMVEkpKSB7CisJCS8qIERpc2FibGUgYWxsIG11bHRpY2FzdCBtb2RlICovCisJCW1hY2Jfd3JpdGVsKGJwLCBIUkIsIDApOworCQltYWNiX3dyaXRlbChicCwgSFJULCAwKTsKKwkJY2ZnICY9IH5NQUNCX0JJVChOQ0ZHUl9NVEkpOworCX0KKworCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgY2ZnKTsKIH0KIAogc3RhdGljIGludCBtYWNiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTc5Nyw2ICs5MjIsMTAgQEAKIAogCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJvcGVuXG4iKTsKIAorCS8qIGlmIHRoZSBwaHkgaXMgbm90IHlldCByZWdpc3RlciwgcmV0cnkgbGF0ZXIqLworCWlmICghYnAtPnBoeV9kZXYpCisJCXJldHVybiAtRUFHQUlOOworCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQogCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiAKQEAgLTgxMCwxMyArOTM5LDEyIEBACiAKIAltYWNiX2luaXRfcmluZ3MoYnApOwogCW1hY2JfaW5pdF9odyhicCk7Ci0JbWFjYl9pbml0X3BoeShkZXYpOwogCi0JbWFjYl9jaGVja19tZWRpYShicCwgMSwgMSk7CisJLyogc2NoZWR1bGUgYSBsaW5rIHN0YXRlIGNoZWNrICovCisJcGh5X3N0YXJ0KGJwLT5waHlfZGV2KTsKKwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5wZXJpb2RpY190YXNrLCBIWik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODI1LDEwICs5NTMsMTEgQEAKIAlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZicC0+cGVyaW9kaWNfdGFzayk7Ci0KIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKKwlpZiAoYnAtPnBoeV9kZXYpCisJCXBoeV9zdG9wKGJwLT5waHlfZGV2KTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwogCW1hY2JfcmVzZXRfaHcoYnApOwogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CkBAIC04NDUsNiArOTc0LDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXQgPSAmYnAtPnN0YXRzOwogCXN0cnVjdCBtYWNiX3N0YXRzICpod3N0YXQgPSAmYnAtPmh3X3N0YXRzOwogCisJLyogcmVhZCBzdGF0cyBmcm9tIGhhcmR3YXJlICovCisJbWFjYl91cGRhdGVfc3RhdHMoYnApOworCiAJLyogQ29udmVydCBIVyBzdGF0cyBpbnRvIG5ldGRldmljZSBzdGF0cyAqLwogCW5zdGF0LT5yeF9lcnJvcnMgPSAoaHdzdGF0LT5yeF9mY3NfZXJyb3JzICsKIAkJCSAgICBod3N0YXQtPnJ4X2FsaWduX2Vycm9ycyArCkBAIC04ODIsMTggKzEwMTQsMjcgQEAKIHN0YXRpYyBpbnQgbWFjYl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CiAKLQlyZXR1cm4gbWlpX2V0aHRvb2xfZ3NldCgmYnAtPm1paSwgY21kKTsKKwlpZiAoIXBoeWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwaHlkZXYsIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgbWFjYl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CiAKLQlyZXR1cm4gbWlpX2V0aHRvb2xfc3NldCgmYnAtPm1paSwgY21kKTsKKwlpZiAoIXBoeWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwaHlkZXYsIGNtZCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3N0YXRpYyB2b2lkIG1hY2JfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC05MDIsMTA0ICsxMDQzLDM0IEBACiAJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBicC0+cGRldi0+ZGV2LmJ1c19pZCk7CiB9CiAKLXN0YXRpYyBpbnQgbWFjYl9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmYnAtPm1paSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbWFjYl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzCQk9IG1hY2JfZ2V0X3NldHRpbmdzLAogCS5zZXRfc2V0dGluZ3MJCT0gbWFjYl9zZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IG1hY2JfZ2V0X2RydmluZm8sCi0JLm53YXlfcmVzZXQJCT0gbWFjYl9ud2F5X3Jlc2V0LAogCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAogfTsKIAogc3RhdGljIGludCBtYWNiX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gZ2VuZXJpY19taWlfaW9jdGwoJmJwLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9taWlfaW9jdGwocGh5ZGV2LCBpZl9taWkocnEpLCBjbWQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBtYWNiX21paV9zaG93KGNvbnN0IHN0cnVjdCBkZXZpY2UgKl9kZXYsIGNoYXIgKmJ1ZiwKLQkJCXVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihfZGV2KTsKLQlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKLQotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJaW50IHZhbHVlOwotCQl2YWx1ZSA9IG1hY2JfbWRpb19yZWFkKGRldiwgYnAtPm1paS5waHlfaWQsIGFkZHIpOwotCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIjB4JTA0eFxuIiwgKHVpbnQxNl90KXZhbHVlKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIE1JSV9FTlRSWShuYW1lLCBhZGRyKQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGRldmljZSAqX2RldiwJCQlcCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJICAgY2hhciAqYnVmKQkJCQlcCi17CQkJCQkJCQlcCi0JcmV0dXJuIG1hY2JfbWlpX3Nob3coX2RldiwgYnVmLCBhZGRyKTsJCQlcCi19CQkJCQkJCQlcCi1zdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpCi0KLU1JSV9FTlRSWShibWNyLCBNSUlfQk1DUik7Ci1NSUlfRU5UUlkoYm1zciwgTUlJX0JNU1IpOwotTUlJX0VOVFJZKHBoeXNpZDEsIE1JSV9QSFlTSUQxKTsKLU1JSV9FTlRSWShwaHlzaWQyLCBNSUlfUEhZU0lEMik7Ci1NSUlfRU5UUlkoYWR2ZXJ0aXNlLCBNSUlfQURWRVJUSVNFKTsKLU1JSV9FTlRSWShscGEsIE1JSV9MUEEpOwotTUlJX0VOVFJZKGV4cGFuc2lvbiwgTUlJX0VYUEFOU0lPTik7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYWNiX21paV9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9ibWNyLmF0dHIsCi0JJmRldl9hdHRyX2Jtc3IuYXR0ciwKLQkmZGV2X2F0dHJfcGh5c2lkMS5hdHRyLAotCSZkZXZfYXR0cl9waHlzaWQyLmF0dHIsCi0JJmRldl9hdHRyX2FkdmVydGlzZS5hdHRyLAotCSZkZXZfYXR0cl9scGEuYXR0ciwKLQkmZGV2X2F0dHJfZXhwYW5zaW9uLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1hY2JfbWlpX2dyb3VwID0gewotCS5uYW1lCT0gIm1paSIsCi0JLmF0dHJzCT0gbWFjYl9taWlfYXR0cnMsCi19OwotCi1zdGF0aWMgdm9pZCBtYWNiX3VucmVnaXN0ZXJfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpfZGV2ID0gJm5ldC0+ZGV2OwotCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZfZGV2LT5rb2JqLCAmbWFjYl9taWlfZ3JvdXApOwotfQotCi1zdGF0aWMgaW50IG1hY2JfcmVnaXN0ZXJfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpfZGV2ID0gJm5ldC0+ZGV2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJl9kZXYtPmtvYmosICZtYWNiX21paV9ncm91cCk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIiVzOiBzeXNmcyBtaWkgYXR0cmlidXRlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgbmV0LT5uYW1lLCByZXQpOwotCXJldHVybiByZXQ7Ci19CiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtYWNiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWFjYiAqYnA7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAl1bnNpZ25lZCBsb25nIHBjbGtfaHo7CiAJdTMyIGNvbmZpZzsKIAlpbnQgZXJyID0gLUVOWElPOwpAQCAtMTA3Myw2ICsxMTQ0LDcgQEAKIAlkZXYtPnN0b3AgPSBtYWNiX2Nsb3NlOwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbWFjYl9zdGFydF94bWl0OwogCWRldi0+Z2V0X3N0YXRzID0gbWFjYl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBtYWNiX3NldF9yeF9tb2RlOwogCWRldi0+ZG9faW9jdGwgPSBtYWNiX2lvY3RsOwogCWRldi0+cG9sbCA9IG1hY2JfcG9sbDsKIAlkZXYtPndlaWdodCA9IDY0OwpAQCAtMTA4MCwxMCArMTE1Miw2IEBACiAKIAlkZXYtPmJhc2VfYWRkciA9IHJlZ3MtPnN0YXJ0OwogCi0JSU5JVF9ERUxBWUVEX1dPUksoJmJwLT5wZXJpb2RpY190YXNrLCBtYWNiX3BlcmlvZGljX3Rhc2spOwotCW11dGV4X2luaXQoJmJwLT5tZGlvX211dGV4KTsKLQlpbml0X2NvbXBsZXRpb24oJmJwLT5tZGlvX2NvbXBsZXRlKTsKLQogCS8qIFNldCBNSUkgbWFuYWdlbWVudCBjbG9jayBkaXZpZGVyICovCiAJcGNsa19oeiA9IGNsa19nZXRfcmF0ZShicC0+cGNsayk7CiAJaWYgKHBjbGtfaHogPD0gMjAwMDAwMDApCkBAIC0xMDk2LDIwICsxMTY0LDkgQEAKIAkJY29uZmlnID0gTUFDQl9CRihDTEssIE1BQ0JfQ0xLX0RJVjY0KTsKIAltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNvbmZpZyk7CiAKLQlicC0+bWlpLmRldiA9IGRldjsKLQlicC0+bWlpLm1kaW9fcmVhZCA9IG1hY2JfbWRpb19yZWFkOwotCWJwLT5taWkubWRpb193cml0ZSA9IG1hY2JfbWRpb193cml0ZTsKLQlicC0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKLQlicC0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7Ci0KIAltYWNiX2dldF9od2FkZHIoYnApOwotCWVyciA9IG1hY2JfcGh5X3Byb2JlKGJwKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBkZXRlY3QgUEhZLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9vdXRfZnJlZV9pcnE7Ci0JfQotCiAJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwogCWlmIChwZGF0YSAmJiBwZGF0YS0+aXNfcm1paSkKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTEpCiAJCW1hY2Jfd3JpdGVsKGJwLCBVU1JJTywgKE1BQ0JfQklUKFJNSUkpIHwgTUFDQl9CSVQoQ0xLRU4pKSApOwpAQCAtMTEzMSw5ICsxMTg4LDExIEBACiAJCWdvdG8gZXJyX291dF9mcmVlX2lycTsKIAl9CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWlmIChtYWNiX21paV9pbml0KGJwKSAhPSAwKSB7CisJCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjsKKwl9CiAKLQltYWNiX3JlZ2lzdGVyX3N5c2ZzKGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdG1lbCBNQUNCIGF0IDB4JTA4bHggaXJxICVkICIKIAkgICAgICAgIiglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCkBAIC0xMTQxLDggKzEyMDAsMTUgQEAKIAkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKIAkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CiAKKwlwaHlkZXYgPSBicC0+cGh5X2RldjsKKwlwcmludGsoS0VSTl9JTkZPICIlczogYXR0YWNoZWQgUEhZIGRyaXZlciBbJXNdICIKKwkJIihtaWlfYnVzOnBoeV9hZGRyPSVzLCBpcnE9JWQpXG4iLAorCQlkZXYtPm5hbWUsIHBoeWRldi0+ZHJ2LT5uYW1lLCBwaHlkZXYtPmRldi5idXNfaWQsIHBoeWRldi0+aXJxKTsKKwogCXJldHVybiAwOwogCitlcnJfb3V0X3VucmVnaXN0ZXJfbmV0ZGV2OgorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiBlcnJfb3V0X2ZyZWVfaXJxOgogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogZXJyX291dF9pb3VubWFwOgpAQCAtMTE1Myw3ICsxMjE5LDkgQEAKIAljbGtfcHV0KGJwLT5oY2xrKTsKICNlbmRpZgogCWNsa19kaXNhYmxlKGJwLT5wY2xrKTsKKyNpZm5kZWYgQ09ORklHX0FSQ0hfQVQ5MQogZXJyX291dF9wdXRfcGNsazoKKyNlbmRpZgogCWNsa19wdXQoYnAtPnBjbGspOwogZXJyX291dF9mcmVlX2RldjoKIAlmcmVlX25ldGRldihkZXYpOwpAQCAtMTE3MSw3ICsxMjM5LDggQEAKIAogCWlmIChkZXYpIHsKIAkJYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCQltYWNiX3VucmVnaXN0ZXJfc3lzZnMoZGV2KTsKKwkJbWRpb2J1c191bnJlZ2lzdGVyKCZicC0+bWlpX2J1cyk7CisJCWtmcmVlKGJwLT5taWlfYnVzLmlycSk7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCQlpb3VubWFwKGJwLT5yZWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2IuaCBiL2RyaXZlcnMvbmV0L21hY2IuaAppbmRleCBiM2JiMjE4Li40ZTMyODNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNiLmgKKysrIGIvZHJpdmVycy9uZXQvbWFjYi5oCkBAIC0zODMsMTEgKzM4MywxMSBAQAogCiAJdW5zaWduZWQgaW50CQlyeF9wZW5kaW5nLCB0eF9wZW5kaW5nOwogCi0Jc3RydWN0IGRlbGF5ZWRfd29yawlwZXJpb2RpY190YXNrOwotCi0Jc3RydWN0IG11dGV4CQltZGlvX211dGV4OwotCXN0cnVjdCBjb21wbGV0aW9uCW1kaW9fY29tcGxldGU7Ci0Jc3RydWN0IG1paV9pZl9pbmZvCW1paTsKKwlzdHJ1Y3QgbWlpX2J1cwkJbWlpX2J1czsKKwlzdHJ1Y3QgcGh5X2RldmljZQkqcGh5X2RldjsKKwl1bnNpZ25lZCBpbnQgCQlsaW5rOworCXVuc2lnbmVkIGludCAJCXNwZWVkOworCXVuc2lnbmVkIGludCAJCWR1cGxleDsKIH07CiAKICNlbmRpZiAvKiBfTUFDQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCBlMTczMmMxLi5kZWNhNjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKQEAgLTEwNjAsNyArMTA2MCw2IEBACiAJc3RydWN0IG15cmkxMGdlX3R4X2J1ZiAqdHggPSAmbWdwLT50eDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBpZHgsIGxlbjsKLQlpbnQgbGltaXQgPSAwOwogCiAJd2hpbGUgKHR4LT5wa3RfZG9uZSAhPSBtY3BfaW5kZXgpIHsKIAkJaWR4ID0gdHgtPmRvbmUgJiB0eC0+bWFzazsKQEAgLTEwOTEsMTEgKzEwOTAsNiBAQAogCQkJCQkJCSAgICAgIGJ1cyksIGxlbiwKIAkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQl9Ci0KLQkJLyogbGltaXQgcG90ZW50aWFsIGZvciBsaXZlbG9jayBieSBvbmx5IGhhbmRsaW5nCi0JCSAqIDIgZnVsbCB0eCByaW5ncyBwZXIgY2FsbCAqLwotCQlpZiAodW5saWtlbHkoKytsaW1pdCA+IDIgKiB0eC0+bWFzaykpCi0JCQlicmVhazsKIAl9CiAJLyogc3RhcnQgdGhlIHF1ZXVlIGlmIHdlJ3ZlIHN0b3BwZWQgaXQgKi8KIAlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChtZ3AtPmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwppbmRleCA1OGJiZmRkLi5hZmVmNmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmMKKysrIGIvZHJpdmVycy9uZXQvczJpby5jCkBAIC03OTYsMTIgKzc5NiwxNCBAQAogCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwogCWludCBsc3Rfc2l6ZSwgbHN0X3Blcl9wYWdlOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBwYWdlX251bSA9IDA7CiAKIAlpZiAoIW5pYykKIAkJcmV0dXJuOwogCisJZGV2ID0gbmljLT5kZXY7CisKIAltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOwogCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3Vudm5ldC5jIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjY3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW52bmV0LmMKQEAgLTAsMCArMSwxMTY0IEBACisvKiBzdW52bmV0LmM6IFN1biBMRE9NIFZpcnR1YWwgTmV0d29yayBEcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgorCisjaW5jbHVkZSAic3Vudm5ldC5oIgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInN1bnZuZXQiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW5lIDI1LCAyMDA3IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1biBMRE9NIHZpcnR1YWwgbmV0d29yayBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7CisKKy8qIE9yZGVyZWQgZnJvbSBsYXJnZXN0IG1ham9yIHRvIGxvd2VzdCAqLworc3RhdGljIHN0cnVjdCB2aW9fdmVyc2lvbiB2bmV0X3ZlcnNpb25zW10gPSB7CisJeyAubWFqb3IgPSAxLCAubWlub3IgPSAwIH0sCit9OworCitzdGF0aWMgaW5saW5lIHUzMiB2bmV0X3R4X2RyaW5nX2F2YWlsKHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCXJldHVybiB2aW9fZHJpbmdfYXZhaWwoZHIsIFZORVRfVFhfUklOR19TSVpFKTsKK30KKworc3RhdGljIGludCB2bmV0X2hhbmRsZV91bmtub3duKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlvX21zZ190YWcgKnBrdCA9IGFyZzsKKworCXByaW50ayhLRVJOX0VSUiBQRlggIlJlY2VpdmVkIHVua25vd24gbXNnIFslMDJ4OiUwMng6JTA0eDolMDh4XVxuIiwKKwkgICAgICAgcGt0LT50eXBlLCBwa3QtPnN0eXBlLCBwa3QtPnN0eXBlX2VudiwgcGt0LT5zaWQpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlJlc2V0dGluZyBjb25uZWN0aW9uLlxuIik7CisKKwlsZGNfZGlzY29ubmVjdChwb3J0LT52aW8ubHApOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHZuZXRfc2VuZF9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydCA9IHRvX3ZuZXRfcG9ydCh2aW8pOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0LT52cC0+ZGV2OworCXN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyBwa3Q7CisJaW50IGk7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC50YWcudHlwZSA9IFZJT19UWVBFX0NUUkw7CisJcGt0LnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0lORk87CisJcGt0LnRhZy5zdHlwZV9lbnYgPSBWSU9fQVRUUl9JTkZPOworCXBrdC50YWcuc2lkID0gdmlvX3NlbmRfc2lkKHZpbyk7CisJcGt0LnhmZXJfbW9kZSA9IFZJT19EUklOR19NT0RFOworCXBrdC5hZGRyX3R5cGUgPSBWTkVUX0FERFJfRVRIRVJNQUM7CisJcGt0LmFja19mcmVxID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwa3QuYWRkciB8PSAodTY0KWRldi0+ZGV2X2FkZHJbaV0gPDwgKCg1IC0gaSkgKiA4KTsKKwlwa3QubXR1ID0gRVRIX0ZSQU1FX0xFTjsKKworCXZpb2RiZyhIUywgIlNFTkQgTkVUIEFUVFIgeG1vZGVbMHgleF0gYXR5cGVbMHgleF0gYWRkclslbGx4XSAiCisJICAgICAgICJhY2tmcmVxWyV1XSBtdHVbJWxsdV1cbiIsCisJICAgICAgIHBrdC54ZmVyX21vZGUsIHBrdC5hZGRyX3R5cGUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC5hZGRyLAorCSAgICAgICBwa3QuYWNrX2ZyZXEsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC5tdHUpOworCisJcmV0dXJuIHZpb19sZGNfc2VuZCh2aW8sICZwa3QsIHNpemVvZihwa3QpKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfYXR0cl9pbmZvKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIE5FVCBBVFRSIElORk8geG1vZGVbMHgleF0gYXR5cGVbMHgleF0gYWRkclslbGx4XSAiCisJICAgICAgICJhY2tmcmVxWyV1XSBtdHVbJWxsdV1cbiIsCisJICAgICAgIHBrdC0+eGZlcl9tb2RlLCBwa3QtPmFkZHJfdHlwZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5hZGRyLAorCSAgICAgICBwa3QtPmFja19mcmVxLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3QtPm10dSk7CisKKwlwa3QtPnRhZy5zaWQgPSB2aW9fc2VuZF9zaWQodmlvKTsKKworCWlmIChwa3QtPnhmZXJfbW9kZSAhPSBWSU9fRFJJTkdfTU9ERSB8fAorCSAgICBwa3QtPmFkZHJfdHlwZSAhPSBWTkVUX0FERFJfRVRIRVJNQUMgfHwKKwkgICAgcGt0LT5tdHUgIT0gRVRIX0ZSQU1FX0xFTikgeworCQl2aW9kYmcoSFMsICJTRU5EIE5FVCBBVFRSIE5BQ0tcbiIpOworCisJCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfTkFDSzsKKworCQkodm9pZCkgdmlvX2xkY19zZW5kKHZpbywgcGt0LCBzaXplb2YoKnBrdCkpOworCisJCXJldHVybiAtRUNPTk5SRVNFVDsKKwl9IGVsc2UgeworCQl2aW9kYmcoSFMsICJTRU5EIE5FVCBBVFRSIEFDS1xuIik7CisKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9BQ0s7CisKKwkJcmV0dXJuIHZpb19sZGNfc2VuZCh2aW8sIHBrdCwgc2l6ZW9mKCpwa3QpKTsKKwl9CisKK30KKworc3RhdGljIGludCBoYW5kbGVfYXR0cl9hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgIHN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBORVQgQVRUUiBBQ0tcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2F0dHJfbmFjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgIHN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBORVQgQVRUUiBOQUNLXG4iKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCB2bmV0X2hhbmRsZV9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gKnBrdCA9IGFyZzsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBoYW5kbGVfYXR0cl9pbmZvKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfQUNLOgorCQlyZXR1cm4gaGFuZGxlX2F0dHJfYWNrKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfTkFDSzoKKwkJcmV0dXJuIGhhbmRsZV9hdHRyX25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCX0KK30KKworc3RhdGljIHZvaWQgdm5ldF9oYW5kc2hha2VfY29tcGxldGUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKworCWRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisJZHItPnNuZF9ueHQgPSBkci0+cmN2X254dCA9IDE7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCWRyLT5zbmRfbnh0ID0gZHItPnJjdl9ueHQgPSAxOworfQorCisvKiBUaGUgaHlwZXJ2aXNvciBpbnRlcmZhY2UgdGhhdCBpbXBsZW1lbnRzIGNvcHlpbmcgdG8vZnJvbSBpbXBvcnRlZAorICogbWVtb3J5IGZyb20gYW5vdGhlciBkb21haW4gcmVxdWlyZXMgdGhhdCBjb3BpZXMgYXJlIGRvbmUgdG8gOC1ieXRlCisgKiBhbGlnbmVkIGJ1ZmZlcnMsIGFuZCB0aGF0IHRoZSBsZW5ndGhzIG9mIHN1Y2ggY29waWVzIGFyZSBhbHNvIDgtYnl0ZQorICogbXVsdGlwbGVzLgorICoKKyAqIFNvIHdlIGFsaWduIHNrYi0+ZGF0YSB0byBhbiA4LWJ5dGUgbXVsdGlwbGUgYW5kIHBhZC1vdXQgdGhlIGRhdGEKKyAqIGFyZWEgc28gd2UgY2FuIHJvdW5kIHRoZSBjb3B5IGxlbmd0aCB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZgorICogOCBmb3IgdGhlIGNvcHkuCisgKgorICogVGhlIHRyYW5zbWl0dGVyIHB1dHMgdGhlIGFjdHVhbCBzdGFydCBvZiB0aGUgcGFja2V0IDYgYnl0ZXMgaW50bworICogdGhlIGJ1ZmZlciBpdCBzZW5kcyBvdmVyLCBzbyB0aGF0IHRoZSBJUCBoZWFkZXJzIGFmdGVyIHRoZSBldGhlcm5ldAorICogaGVhZGVyIGFyZSBhbGlnbmVkIHByb3Blcmx5LiAgVGhlc2UgNiBieXRlcyBhcmUgbm90IGluIHRoZSBkZXNjcmlwdG9yCisgKiBsZW5ndGgsIHRoZXkgYXJlIHNpbXBseSBpbXBsaWVkLiAgVGhpcyBvZmZzZXQgaXMgcmVwcmVzZW50ZWQgdXNpbmcKKyAqIHRoZSBWTkVUX1BBQ0tFVF9TS0lQIG1hY3JvLgorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmFsbG9jX2FuZF9hbGlnbl9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIGxlbitWTkVUX1BBQ0tFVF9TS0lQKzgrOCk7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBvZmY7CisKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCXJldHVybiBOVUxMOworCisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGE7CisJb2ZmID0gKChhZGRyICsgN1VMKSAmIH43VUwpIC0gYWRkcjsKKwlpZiAob2ZmKQorCQlza2JfcmVzZXJ2ZShza2IsIG9mZik7CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IHZuZXRfcnhfb25lKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBsZW4sCisJCSAgICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0LT52cC0+ZGV2OworCXVuc2lnbmVkIGludCBjb3B5X2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwllcnIgPSAtRU1TR1NJWkU7CisJaWYgKHVubGlrZWx5KGxlbiA8IEVUSF9aTEVOIHx8IGxlbiA+IEVUSF9GUkFNRV9MRU4pKSB7CisJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlnb3RvIG91dF9kcm9wcGVkOworCX0KKworCXNrYiA9IGFsbG9jX2FuZF9hbGlnbl9za2IoZGV2LCBsZW4pOworCWVyciA9IC1FTk9NRU07CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQlnb3RvIG91dF9kcm9wcGVkOworCX0KKworCWNvcHlfbGVuID0gKGxlbiArIFZORVRfUEFDS0VUX1NLSVAgKyA3VSkgJiB+N1U7CisJc2tiX3B1dChza2IsIGNvcHlfbGVuKTsKKwllcnIgPSBsZGNfY29weShwb3J0LT52aW8ubHAsIExEQ19DT1BZX0lOLAorCQkgICAgICAgc2tiLT5kYXRhLCBjb3B5X2xlbiwgMCwKKwkJICAgICAgIGNvb2tpZXMsIG5jb29raWVzKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZ290byBvdXRfZnJlZV9za2I7CisJfQorCisJc2tiX3B1bGwoc2tiLCBWTkVUX1BBQ0tFVF9TS0lQKTsKKwlza2JfdHJpbShza2IsIGxlbik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJbmV0aWZfcngoc2tiKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZV9za2I6CisJa2ZyZWVfc2tiKHNrYik7CisKK291dF9kcm9wcGVkOgorCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9zZW5kX2FjayhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCSB1MzIgc3RhcnQsIHUzMiBlbmQsIHU4IHZpb19kcmluZ19zdGF0ZSkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgaGRyID0geworCQkudGFnID0geworCQkJLnR5cGUJCT0gVklPX1RZUEVfREFUQSwKKwkJCS5zdHlwZQkJPSBWSU9fU1VCVFlQRV9BQ0ssCisJCQkuc3R5cGVfZW52CT0gVklPX0RSSU5HX0RBVEEsCisJCQkuc2lkCQk9IHZpb19zZW5kX3NpZCgmcG9ydC0+dmlvKSwKKwkJfSwKKwkJLmRyaW5nX2lkZW50CQk9IGRyLT5pZGVudCwKKwkJLnN0YXJ0X2lkeAkJPSBzdGFydCwKKwkJLmVuZF9pZHgJCT0gZW5kLAorCQkuc3RhdGUJCQk9IHZpb19kcmluZ19zdGF0ZSwKKwl9OworCWludCBlcnIsIGRlbGF5OworCisJaGRyLnNlcSA9IGRyLT5zbmRfbnh0OworCWRlbGF5ID0gMTsKKwlkbyB7CisJCWVyciA9IHZpb19sZGNfc2VuZCgmcG9ydC0+dmlvLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJCWlmIChlcnIgPiAwKSB7CisJCQlkci0+c25kX254dCsrOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KGRlbGF5KTsKKwkJaWYgKChkZWxheSA8PD0gMSkgPiAxMjgpCisJCQlkZWxheSA9IDEyODsKKwl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdTMyIG5leHRfaWR4KHUzMiBpZHgsIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCWlmICgrK2lkeCA9PSBkci0+bnVtX2VudHJpZXMpCisJCWlkeCA9IDA7CisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIHUzMiBwcmV2X2lkeCh1MzIgaWR4LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlpZiAoaWR4ID09IDApCisJCWlkeCA9IGRyLT5udW1fZW50cmllcyAtIDE7CisJZWxzZQorCQlpZHgtLTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX25ldF9kZXNjICpnZXRfcnhfZGVzYyhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LAorCQkJCQlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCQkJdTMyIGluZGV4KQoreworCXN0cnVjdCB2aW9fbmV0X2Rlc2MgKmRlc2MgPSBwb3J0LT52aW8uZGVzY19idWY7CisJaW50IGVycjsKKworCWVyciA9IGxkY19nZXRfZHJpbmdfZW50cnkocG9ydC0+dmlvLmxwLCBkZXNjLCBkci0+ZW50cnlfc2l6ZSwKKwkJCQkgIChpbmRleCAqIGRyLT5lbnRyeV9zaXplKSwKKwkJCQkgIGRyLT5jb29raWVzLCBkci0+bmNvb2tpZXMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCisJcmV0dXJuIGRlc2M7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3J4X2Rlc2Moc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwKKwkJICAgICAgIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkgICAgICAgc3RydWN0IHZpb19uZXRfZGVzYyAqZGVzYywKKwkJICAgICAgIHUzMiBpbmRleCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbGRjX3B1dF9kcmluZ19lbnRyeShwb3J0LT52aW8ubHAsIGRlc2MsIGRyLT5lbnRyeV9zaXplLAorCQkJCSAgKGluZGV4ICogZHItPmVudHJ5X3NpemUpLAorCQkJCSAgZHItPmNvb2tpZXMsIGRyLT5uY29va2llcyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bmV0X3dhbGtfcnhfb25lKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsCisJCQkgICAgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkgICAgdTMyIGluZGV4LCBpbnQgKm5lZWRzX2FjaykKK3sKKwlzdHJ1Y3QgdmlvX25ldF9kZXNjICpkZXNjID0gZ2V0X3J4X2Rlc2MocG9ydCwgZHIsIGluZGV4KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKwlpbnQgZXJyOworCisJaWYgKElTX0VSUihkZXNjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGVzYyk7CisKKwl2aW9kYmcoREFUQSwgInZpb193YWxrX3J4X29uZSBkZXNjWyUwMng6JTAyeDolMDh4OiUwOHg6JWx4OiVseF1cbiIsCisJICAgICAgIGRlc2MtPmhkci5zdGF0ZSwgZGVzYy0+aGRyLmFjaywKKwkgICAgICAgZGVzYy0+c2l6ZSwgZGVzYy0+bmNvb2tpZXMsCisJICAgICAgIGRlc2MtPmNvb2tpZXNbMF0uY29va2llX2FkZHIsCisJICAgICAgIGRlc2MtPmNvb2tpZXNbMF0uY29va2llX3NpemUpOworCisJaWYgKGRlc2MtPmhkci5zdGF0ZSAhPSBWSU9fREVTQ19SRUFEWSkKKwkJcmV0dXJuIDE7CisJZXJyID0gdm5ldF9yeF9vbmUocG9ydCwgZGVzYy0+c2l6ZSwgZGVzYy0+Y29va2llcywgZGVzYy0+bmNvb2tpZXMpOworCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCXJldHVybiBlcnI7CisJZGVzYy0+aGRyLnN0YXRlID0gVklPX0RFU0NfRE9ORTsKKwllcnIgPSBwdXRfcnhfZGVzYyhwb3J0LCBkciwgZGVzYywgaW5kZXgpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCSpuZWVkc19hY2sgPSBkZXNjLT5oZHIuYWNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfd2Fsa19yeChzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCXUzMiBzdGFydCwgdTMyIGVuZCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKwlpbnQgYWNrX3N0YXJ0ID0gLTEsIGFja19lbmQgPSAtMTsKKworCWVuZCA9IChlbmQgPT0gKHUzMikgLTEpID8gcHJldl9pZHgoc3RhcnQsIGRyKSA6IG5leHRfaWR4KGVuZCwgZHIpOworCisJdmlvZGJnKERBVEEsICJ2bmV0X3dhbGtfcnggc3RhcnRbJTA4eF0gZW5kWyUwOHhdXG4iLCBzdGFydCwgZW5kKTsKKworCXdoaWxlIChzdGFydCAhPSBlbmQpIHsKKwkJaW50IGFjayA9IDAsIGVyciA9IHZuZXRfd2Fsa19yeF9vbmUocG9ydCwgZHIsIHN0YXJ0LCAmYWNrKTsKKwkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCXJldHVybiBlcnI7CisJCWlmIChlcnIgIT0gMCkKKwkJCWJyZWFrOworCQlpZiAoYWNrX3N0YXJ0ID09IC0xKQorCQkJYWNrX3N0YXJ0ID0gc3RhcnQ7CisJCWFja19lbmQgPSBzdGFydDsKKwkJc3RhcnQgPSBuZXh0X2lkeChzdGFydCwgZHIpOworCQlpZiAoYWNrICYmIHN0YXJ0ICE9IGVuZCkgeworCQkJZXJyID0gdm5ldF9zZW5kX2Fjayhwb3J0LCBkciwgYWNrX3N0YXJ0LCBhY2tfZW5kLAorCQkJCQkgICAgVklPX0RSSU5HX0FDVElWRSk7CisJCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJCXJldHVybiBlcnI7CisJCQlhY2tfc3RhcnQgPSAtMTsKKwkJfQorCX0KKwlpZiAodW5saWtlbHkoYWNrX3N0YXJ0ID09IC0xKSkKKwkJYWNrX3N0YXJ0ID0gYWNrX2VuZCA9IHByZXZfaWR4KHN0YXJ0LCBkcik7CisJcmV0dXJuIHZuZXRfc2VuZF9hY2socG9ydCwgZHIsIGFja19zdGFydCwgYWNrX2VuZCwgVklPX0RSSU5HX1NUT1BQRUQpOworfQorCitzdGF0aWMgaW50IHZuZXRfcngoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgdm9pZCAqbXNnYnVmKQoreworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSAqcGt0ID0gbXNnYnVmOworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKworCXZpb2RiZyhEQVRBLCAidm5ldF9yeCBzdHlwZV9lbnZbJTA0eF0gc2VxWyUwMTZseF0gcmN2X254dFslMDE2bHhdXG4iLAorCSAgICAgICBwa3QtPnRhZy5zdHlwZV9lbnYsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CisKKwlpZiAodW5saWtlbHkocGt0LT50YWcuc3R5cGVfZW52ICE9IFZJT19EUklOR19EQVRBKSkKKwkJcmV0dXJuIDA7CisJaWYgKHVubGlrZWx5KHBrdC0+c2VxICE9IGRyLT5yY3Zfbnh0KSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJSWCBvdXQgb2Ygc2VxdWVuY2Ugc2VxWzB4JWx4XSAiCisJCSAgICAgICAicmN2X254dFsweCVseF1cbiIsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CisJCXJldHVybiAwOworCX0KKworCWRyLT5yY3Zfbnh0Kys7CisKKwkvKiBYWFggVmFsaWRhdGUgcGt0LT5zdGFydF9pZHggYW5kIHBrdC0+ZW5kX2lkeCBYWFggKi8KKworCXJldHVybiB2bmV0X3dhbGtfcngocG9ydCwgZHIsIHBrdC0+c3RhcnRfaWR4LCBwa3QtPmVuZF9pZHgpOworfQorCitzdGF0aWMgaW50IGlkeF9pc19wZW5kaW5nKHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLCB1MzIgZW5kKQoreworCXUzMiBpZHggPSBkci0+Y29uczsKKwlpbnQgZm91bmQgPSAwOworCisJd2hpbGUgKGlkeCAhPSBkci0+cHJvZCkgeworCQlpZiAoaWR4ID09IGVuZCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBkcik7CisJfQorCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCB2bmV0X2FjayhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB2b2lkICptc2didWYpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSAqcGt0ID0gbXNnYnVmOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHZuZXQgKnZwOworCXUzMiBlbmQ7CisKKwlpZiAodW5saWtlbHkocGt0LT50YWcuc3R5cGVfZW52ICE9IFZJT19EUklOR19EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwllbmQgPSBwa3QtPmVuZF9pZHg7CisJaWYgKHVubGlrZWx5KCFpZHhfaXNfcGVuZGluZyhkciwgZW5kKSkpCisJCXJldHVybiAwOworCisJZHItPmNvbnMgPSBuZXh0X2lkeChlbmQsIGRyKTsKKworCXZwID0gcG9ydC0+dnA7CisJZGV2ID0gdnAtPmRldjsKKwlpZiAodW5saWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCSAgICAgdm5ldF90eF9kcmluZ19hdmFpbChkcikgPj0gVk5FVF9UWF9XQUtFVVBfVEhSRVNIKGRyKSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9uYWNrKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHZvaWQgKm1zZ2J1ZikKK3sKKwkvKiBYWFgganVzdCByZXNldCBvciBzaW1pbGFyIFhYWCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXliZV90eF93YWtldXAoc3RydWN0IHZuZXQgKnZwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2cC0+ZGV2OworCisJbmV0aWZfdHhfbG9jayhkZXYpOworCWlmIChsaWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSkgeworCQlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0OworCQlpbnQgd2FrZSA9IDE7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmdnAtPnBvcnRfbGlzdCwgbGlzdCkgeworCQkJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisKKwkJCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwkJCWlmICh2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA8CisJCQkgICAgVk5FVF9UWF9XQUtFVVBfVEhSRVNIKGRyKSkgeworCQkJCXdha2UgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh3YWtlKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwluZXRpZl90eF91bmxvY2soZGV2KTsKK30KKworc3RhdGljIHZvaWQgdm5ldF9ldmVudCh2b2lkICphcmcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0ID0gYXJnOworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8gPSAmcG9ydC0+dmlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHR4X3dha2V1cCwgZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpby0+bG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KGV2ZW50ID09IExEQ19FVkVOVF9SRVNFVCB8fAorCQkgICAgIGV2ZW50ID09IExEQ19FVkVOVF9VUCkpIHsKKwkJdmlvX2xpbmtfc3RhdGVfY2hhbmdlKHZpbywgZXZlbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KGV2ZW50ICE9IExEQ19FVkVOVF9EQVRBX1JFQURZKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlvLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwl0eF93YWtldXAgPSBlcnIgPSAwOworCXdoaWxlICgxKSB7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB2aW9fbXNnX3RhZyB0YWc7CisJCQl1NjQgcmF3WzhdOworCQl9IG1zZ2J1ZjsKKworCQllcnIgPSBsZGNfcmVhZCh2aW8tPmxwLCAmbXNnYnVmLCBzaXplb2YobXNnYnVmKSk7CisJCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCQl2aW9fY29ubl9yZXNldCh2aW8pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVyciA9PSAwKQorCQkJYnJlYWs7CisJCXZpb2RiZyhEQVRBLCAiVEFHIFslMDJ4OiUwMng6JTA0eDolMDh4XVxuIiwKKwkJICAgICAgIG1zZ2J1Zi50YWcudHlwZSwKKwkJICAgICAgIG1zZ2J1Zi50YWcuc3R5cGUsCisJCSAgICAgICBtc2didWYudGFnLnN0eXBlX2VudiwKKwkJICAgICAgIG1zZ2J1Zi50YWcuc2lkKTsKKwkJZXJyID0gdmlvX3ZhbGlkYXRlX3NpZCh2aW8sICZtc2didWYudGFnKTsKKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKworCQlpZiAobGlrZWx5KG1zZ2J1Zi50YWcudHlwZSA9PSBWSU9fVFlQRV9EQVRBKSkgeworCQkJaWYgKG1zZ2J1Zi50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfSU5GTykgeworCQkJCWVyciA9IHZuZXRfcngocG9ydCwgJm1zZ2J1Zik7CisJCQl9IGVsc2UgaWYgKG1zZ2J1Zi50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfQUNLKSB7CisJCQkJZXJyID0gdm5ldF9hY2socG9ydCwgJm1zZ2J1Zik7CisJCQkJaWYgKGVyciA+IDApCisJCQkJCXR4X3dha2V1cCB8PSBlcnI7CisJCQl9IGVsc2UgaWYgKG1zZ2J1Zi50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfTkFDSykgeworCQkJCWVyciA9IHZuZXRfbmFjayhwb3J0LCAmbXNnYnVmKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtc2didWYudGFnLnR5cGUgPT0gVklPX1RZUEVfQ1RSTCkgeworCQkJZXJyID0gdmlvX2NvbnRyb2xfcGt0X2VuZ2luZSh2aW8sICZtc2didWYpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IHZuZXRfaGFuZGxlX3Vua25vd24ocG9ydCwgJm1zZ2J1Zik7CisJCX0KKwkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmdmlvLT5sb2NrKTsKKwlpZiAodW5saWtlbHkodHhfd2FrZXVwICYmIGVyciAhPSAtRUNPTk5SRVNFVCkpCisJCW1heWJlX3R4X3dha2V1cChwb3J0LT52cCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fdm5ldF90eF90cmlnZ2VyKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSBoZHIgPSB7CisJCS50YWcgPSB7CisJCQkudHlwZQkJPSBWSU9fVFlQRV9EQVRBLAorCQkJLnN0eXBlCQk9IFZJT19TVUJUWVBFX0lORk8sCisJCQkuc3R5cGVfZW52CT0gVklPX0RSSU5HX0RBVEEsCisJCQkuc2lkCQk9IHZpb19zZW5kX3NpZCgmcG9ydC0+dmlvKSwKKwkJfSwKKwkJLmRyaW5nX2lkZW50CQk9IGRyLT5pZGVudCwKKwkJLnN0YXJ0X2lkeAkJPSBkci0+cHJvZCwKKwkJLmVuZF9pZHgJCT0gKHUzMikgLTEsCisJfTsKKwlpbnQgZXJyLCBkZWxheTsKKworCWhkci5zZXEgPSBkci0+c25kX254dDsKKwlkZWxheSA9IDE7CisJZG8geworCQllcnIgPSB2aW9fbGRjX3NlbmQoJnBvcnQtPnZpbywgJmhkciwgc2l6ZW9mKGhkcikpOworCQlpZiAoZXJyID4gMCkgeworCQkJZHItPnNuZF9ueHQrKzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheShkZWxheSk7CisJCWlmICgoZGVsYXkgPDw9IDEpID4gMTI4KQorCQkJZGVsYXkgPSAxMjg7CisJfSB3aGlsZSAoZXJyID09IC1FQUdBSU4pOworCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHZuZXRfcG9ydCAqX190eF9wb3J0X2ZpbmQoc3RydWN0IHZuZXQgKnZwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGludCBoYXNoID0gdm5ldF9oYXNoZm4oc2tiLT5kYXRhKTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaHAgPSAmdnAtPnBvcnRfaGFzaFtoYXNoXTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0OworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgbiwgaHAsIGhhc2gpIHsKKwkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIocG9ydC0+cmFkZHIsIHNrYi0+ZGF0YSkpCisJCQlyZXR1cm4gcG9ydDsKKwl9CisJcG9ydCA9IE5VTEw7CisJaWYgKCFsaXN0X2VtcHR5KCZ2cC0+cG9ydF9saXN0KSkKKwkJcG9ydCA9IGxpc3RfZW50cnkodnAtPnBvcnRfbGlzdC5uZXh0LCBzdHJ1Y3Qgdm5ldF9wb3J0LCBsaXN0KTsKKworCXJldHVybiBwb3J0OworfQorCitzdHJ1Y3Qgdm5ldF9wb3J0ICp0eF9wb3J0X2ZpbmQoc3RydWN0IHZuZXQgKnZwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB2bmV0X3BvcnQgKnJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gX190eF9wb3J0X2ZpbmQodnAsIHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZuZXQgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0ID0gdHhfcG9ydF9maW5kKHZwLCBza2IpOworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCXN0cnVjdCB2aW9fbmV0X2Rlc2MgKmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXZvaWQgKnR4X2J1ZjsKKwlpbnQgaSwgZXJyOworCisJaWYgKHVubGlrZWx5KCFwb3J0KSkKKwkJZ290byBvdXRfZHJvcHBlZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCisJZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCWlmICh1bmxpa2VseSh2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA8IDIpKSB7CisJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQuICovCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiAiCisJCQkgICAgICAgInF1ZXVlIGF3YWtlIVxuIiwgZGV2LT5uYW1lKTsKKwkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWQgPSB2aW9fZHJpbmdfY3VyKGRyKTsKKworCXR4X2J1ZiA9IHBvcnQtPnR4X2J1ZnNbZHItPnByb2RdLmJ1ZjsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgdHhfYnVmICsgVk5FVF9QQUNLRVRfU0tJUCwgc2tiLT5sZW4pOworCisJbGVuID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCWxlbiA9IEVUSF9aTEVOOworCQltZW1zZXQodHhfYnVmK1ZORVRfUEFDS0VUX1NLSVArc2tiLT5sZW4sIDAsIGxlbiAtIHNrYi0+bGVuKTsKKwl9CisKKwlkLT5oZHIuYWNrID0gVklPX0FDS19FTkFCTEU7CisJZC0+c2l6ZSA9IGxlbjsKKwlkLT5uY29va2llcyA9IHBvcnQtPnR4X2J1ZnNbZHItPnByb2RdLm5jb29raWVzOworCWZvciAoaSA9IDA7IGkgPCBkLT5uY29va2llczsgaSsrKQorCQlkLT5jb29raWVzW2ldID0gcG9ydC0+dHhfYnVmc1tkci0+cHJvZF0uY29va2llc1tpXTsKKworCS8qIFRoaXMgaGFzIHRvIGJlIGEgbm9uLVNNUCB3cml0ZSBiYXJyaWVyIGJlY2F1c2Ugd2UgYXJlIHdyaXRpbmcKKwkgKiB0byBtZW1vcnkgd2hpY2ggaXMgc2hhcmVkIHdpdGggdGhlIHBlZXIgTERPTS4KKwkgKi8KKwl3bWIoKTsKKworCWQtPmhkci5zdGF0ZSA9IFZJT19ERVNDX1JFQURZOworCisJZXJyID0gX192bmV0X3R4X3RyaWdnZXIocG9ydCk7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogVFggdHJpZ2dlciBlcnJvciAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJZC0+aGRyLnN0YXRlID0gVklPX0RFU0NfRlJFRTsKKwkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQlnb3RvIG91dF9kcm9wcGVkX3VubG9jazsKKwl9CisKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJZHItPnByb2QgPSAoZHItPnByb2QgKyAxKSAmIChWTkVUX1RYX1JJTkdfU0laRSAtIDEpOworCWlmICh1bmxpa2VseSh2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA8IDIpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJaWYgKHZuZXRfdHhfZHJpbmdfYXZhaWwoZHIpID4gVk5FVF9UWF9XQUtFVVBfVEhSRVNIKGRyKSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworb3V0X2Ryb3BwZWRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisKK291dF9kcm9wcGVkOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitzdGF0aWMgdm9pZCB2bmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBYWFggSW1wbGVtZW50IG1lIFhYWCAqLworfQorCitzdGF0aWMgaW50IHZuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBYWFggSW1wbGVtZW50IG11bHRpY2FzdCBzdXBwb3J0IFhYWCAqLworfQorCitzdGF0aWMgaW50IHZuZXRfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAobmV3X210dSAhPSBFVEhfREFUQV9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOworfQorCitzdGF0aWMgdTMyIHZuZXRfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZuZXQgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gdnAtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgdm5ldCAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZwLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgdm5ldF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gdm5ldF9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCQk9IHZuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdm5ldF9zZXRfbXNnbGV2ZWwsCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9wZXJtX2FkZHIJCT0gZXRodG9vbF9vcF9nZXRfcGVybV9hZGRyLAorfTsKKworc3RhdGljIHZvaWQgdm5ldF9wb3J0X2ZyZWVfdHhfYnVmcyhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCWludCBpOworCisJZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCWlmIChkci0+YmFzZSkgeworCQlsZGNfZnJlZV9leHBfZHJpbmcocG9ydC0+dmlvLmxwLCBkci0+YmFzZSwKKwkJCQkgICAoZHItPmVudHJ5X3NpemUgKiBkci0+bnVtX2VudHJpZXMpLAorCQkJCSAgIGRyLT5jb29raWVzLCBkci0+bmNvb2tpZXMpOworCQlkci0+YmFzZSA9IE5VTEw7CisJCWRyLT5lbnRyeV9zaXplID0gMDsKKwkJZHItPm51bV9lbnRyaWVzID0gMDsKKwkJZHItPnBlbmRpbmcgPSAwOworCQlkci0+bmNvb2tpZXMgPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBWTkVUX1RYX1JJTkdfU0laRTsgaSsrKSB7CisJCXZvaWQgKmJ1ZiA9IHBvcnQtPnR4X2J1ZnNbaV0uYnVmOworCisJCWlmICghYnVmKQorCQkJY29udGludWU7CisKKwkJbGRjX3VubWFwKHBvcnQtPnZpby5scCwKKwkJCSAgcG9ydC0+dHhfYnVmc1tpXS5jb29raWVzLAorCQkJICBwb3J0LT50eF9idWZzW2ldLm5jb29raWVzKTsKKworCQlrZnJlZShidWYpOworCQlwb3J0LT50eF9idWZzW2ldLmJ1ZiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bmV0X3BvcnRfYWxsb2NfdHhfYnVmcyhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWludCBpLCBlcnIsIG5jb29raWVzOworCXZvaWQgKmRyaW5nOworCisJZm9yIChpID0gMDsgaSA8IFZORVRfVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdm9pZCAqYnVmID0ga3phbGxvYyhFVEhfRlJBTUVfTEVOICsgOCwgR0ZQX0tFUk5FTCk7CisJCWludCBtYXBfbGVuID0gKEVUSF9GUkFNRV9MRU4gKyA3KSAmIH43OworCisJCWVyciA9IC1FTk9NRU07CisJCWlmICghYnVmKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRYIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmICgodW5zaWduZWQgbG9uZylidWYgJiAoOFVMIC0gMSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVFggYnVmZmVyIG1pc2FsaWduZWRcbiIpOworCQkJa2ZyZWUoYnVmKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWVyciA9IGxkY19tYXBfc2luZ2xlKHBvcnQtPnZpby5scCwgYnVmLCBtYXBfbGVuLAorCQkJCSAgICAgcG9ydC0+dHhfYnVmc1tpXS5jb29raWVzLCAyLAorCQkJCSAgICAgKExEQ19NQVBfU0hBRE9XIHwKKwkJCQkgICAgICBMRENfTUFQX0RJUkVDVCB8CisJCQkJICAgICAgTERDX01BUF9SVykpOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWUoYnVmKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlwb3J0LT50eF9idWZzW2ldLmJ1ZiA9IGJ1ZjsKKwkJcG9ydC0+dHhfYnVmc1tpXS5uY29va2llcyA9IGVycjsKKwl9CisKKwlkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisKKwlsZW4gPSAoVk5FVF9UWF9SSU5HX1NJWkUgKgorCSAgICAgICAoc2l6ZW9mKHN0cnVjdCB2aW9fbmV0X2Rlc2MpICsKKwkJKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKiAyKSkpOworCisJbmNvb2tpZXMgPSBWSU9fTUFYX1JJTkdfQ09PS0lFUzsKKwlkcmluZyA9IGxkY19hbGxvY19leHBfZHJpbmcocG9ydC0+dmlvLmxwLCBsZW4sCisJCQkJICAgIGRyLT5jb29raWVzLCAmbmNvb2tpZXMsCisJCQkJICAgIChMRENfTUFQX1NIQURPVyB8CisJCQkJICAgICBMRENfTUFQX0RJUkVDVCB8CisJCQkJICAgICBMRENfTUFQX1JXKSk7CisJaWYgKElTX0VSUihkcmluZykpIHsKKwkJZXJyID0gUFRSX0VSUihkcmluZyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkci0+YmFzZSA9IGRyaW5nOworCWRyLT5lbnRyeV9zaXplID0gKHNpemVvZihzdHJ1Y3QgdmlvX25ldF9kZXNjKSArCisJCQkgIChzaXplb2Yoc3RydWN0IGxkY190cmFuc19jb29raWUpICogMikpOworCWRyLT5udW1fZW50cmllcyA9IFZORVRfVFhfUklOR19TSVpFOworCWRyLT5wcm9kID0gZHItPmNvbnMgPSAwOworCWRyLT5wZW5kaW5nID0gVk5FVF9UWF9SSU5HX1NJWkU7CisJZHItPm5jb29raWVzID0gbmNvb2tpZXM7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwl2bmV0X3BvcnRfZnJlZV90eF9idWZzKHBvcnQpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgdm5ldF9sZGNfY2ZnID0geworCS5ldmVudAkJPSB2bmV0X2V2ZW50LAorCS5tdHUJCT0gNjQsCisJLm1vZGUJCT0gTERDX01PREVfVU5SRUxJQUJMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMgdm5ldF92aW9fb3BzID0geworCS5zZW5kX2F0dHIJCT0gdm5ldF9zZW5kX2F0dHIsCisJLmhhbmRsZV9hdHRyCQk9IHZuZXRfaGFuZGxlX2F0dHIsCisJLmhhbmRzaGFrZV9jb21wbGV0ZQk9IHZuZXRfaGFuZHNoYWtlX2NvbXBsZXRlLAorfTsKKworY29uc3QgY2hhciAqcmVtb3RlX21hY2FkZHJfcHJvcCA9ICJyZW1vdGUtbWFjLWFkZHJlc3MiOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bmV0X3BvcnRfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2bmV0ICp2cDsKKwljb25zdCB1NjQgKnJtYWM7CisJaW50IGxlbiwgaSwgZXJyLCBzd2l0Y2hfcG9ydDsKKworCXZwID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPmRldi5wYXJlbnQpOworCWlmICghdnApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgcG9ydCBwYXJlbnQgdm5ldC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKworCXJtYWMgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHZkZXYtPm1wLCByZW1vdGVfbWFjYWRkcl9wcm9wLCAmbGVuKTsKKwllcnIgPSAtRU5PREVWOworCWlmICghcm1hYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJQb3J0IGxhY2tzICVzIHByb3BlcnR5LlxuIiwKKwkJICAgICAgIHJlbW90ZV9tYWNhZGRyX3Byb3ApOworCQlnb3RvIGVycl9vdXRfcHV0X21kZXNjOworCX0KKworCXBvcnQgPSBremFsbG9jKHNpemVvZigqcG9ydCksIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFwb3J0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSB2bmV0X3BvcnQuXG4iKTsKKwkJZ290byBlcnJfb3V0X3B1dF9tZGVzYzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJcG9ydC0+cmFkZHJbaV0gPSAoKnJtYWMgPj4gKDUgLSBpKSAqIDgpICYgMHhmZjsKKworCXBvcnQtPnZwID0gdnA7CisKKwllcnIgPSB2aW9fZHJpdmVyX2luaXQoJnBvcnQtPnZpbywgdmRldiwgVkRFVl9ORVRXT1JLLAorCQkJICAgICAgdm5ldF92ZXJzaW9ucywgQVJSQVlfU0laRSh2bmV0X3ZlcnNpb25zKSwKKwkJCSAgICAgICZ2bmV0X3Zpb19vcHMsIHZwLT5kZXYtPm5hbWUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3BvcnQ7CisKKwllcnIgPSB2aW9fbGRjX2FsbG9jKCZwb3J0LT52aW8sICZ2bmV0X2xkY19jZmcsIHBvcnQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3BvcnQ7CisKKwllcnIgPSB2bmV0X3BvcnRfYWxsb2NfdHhfYnVmcyhwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9sZGM7CisKKwlJTklUX0hMSVNUX05PREUoJnBvcnQtPmhhc2gpOworCUlOSVRfTElTVF9IRUFEKCZwb3J0LT5saXN0KTsKKworCXN3aXRjaF9wb3J0ID0gMDsKKwlpZiAobWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB2ZGV2LT5tcCwgInN3aXRjaC1wb3J0IiwgTlVMTCkgIT0gTlVMTCkKKwkJc3dpdGNoX3BvcnQgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJaWYgKHN3aXRjaF9wb3J0KQorCQlsaXN0X2FkZCgmcG9ydC0+bGlzdCwgJnZwLT5wb3J0X2xpc3QpOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmcG9ydC0+bGlzdCwgJnZwLT5wb3J0X2xpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZwb3J0LT5oYXNoLCAmdnAtPnBvcnRfaGFzaFt2bmV0X2hhc2hmbihwb3J0LT5yYWRkcildKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIHBvcnQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBPUlQgKCByZW1vdGUtbWFjICIsIHZwLT5kZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIHBvcnQtPnJhZGRyW2ldLCBpID09IDUgPyAnICcgOiAnOicpOworCWlmIChzd2l0Y2hfcG9ydCkKKwkJcHJpbnRrKCJzd2l0Y2gtcG9ydCAiKTsKKwlwcmludGsoIilcbiIpOworCisJdmlvX3BvcnRfdXAoJnBvcnQtPnZpbyk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfbGRjOgorCXZpb19sZGNfZnJlZSgmcG9ydC0+dmlvKTsKKworZXJyX291dF9mcmVlX3BvcnQ6CisJa2ZyZWUocG9ydCk7CisKK2Vycl9vdXRfcHV0X21kZXNjOgorCW1kZXNjX3JlbGVhc2UoaHApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9wb3J0X3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0ID0gZGV2X2dldF9kcnZkYXRhKCZ2ZGV2LT5kZXYpOworCisJaWYgKHBvcnQpIHsKKwkJc3RydWN0IHZuZXQgKnZwID0gcG9ydC0+dnA7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJZGVsX3RpbWVyX3N5bmMoJnBvcnQtPnZpby50aW1lcik7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJCWxpc3RfZGVsKCZwb3J0LT5saXN0KTsKKwkJaGxpc3RfZGVsKCZwb3J0LT5oYXNoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCQl2bmV0X3BvcnRfZnJlZV90eF9idWZzKHBvcnQpOworCQl2aW9fbGRjX2ZyZWUoJnBvcnQtPnZpbyk7CisKKwkJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIE5VTEwpOworCisJCWtmcmVlKHBvcnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZuZXRfcG9ydF9tYXRjaFtdID0geworCXsKKwkJLnR5cGUgPSAidm5ldC1wb3J0IiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2bmV0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZuZXRfcG9ydF9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gdm5ldF9wb3J0X21hdGNoLAorCS5wcm9iZQkJPSB2bmV0X3BvcnRfcHJvYmUsCisJLnJlbW92ZQkJPSB2bmV0X3BvcnRfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2bmV0X3BvcnQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitjb25zdCBjaGFyICpsb2NhbF9tYWNfcHJvcCA9ICJsb2NhbC1tYWMtYWRkcmVzcyI7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZuZXRfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBpbnQgdm5ldF92ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgdm5ldCAqdnA7CisJY29uc3QgdTY0ICptYWM7CisJaW50IGVyciwgaSwgbGVuOworCisJaWYgKHZuZXRfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWhwID0gbWRlc2NfZ3JhYigpOworCisJbWFjID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB2ZGV2LT5tcCwgbG9jYWxfbWFjX3Byb3AsICZsZW4pOworCWlmICghbWFjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInZuZXQgbGFja3MgJXMgcHJvcGVydHkuXG4iLAorCQkgICAgICAgbG9jYWxfbWFjX3Byb3ApOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCp2cCkpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkV0aGVyZGV2IGFsbG9jIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gKCptYWMgPj4gKDUgLSBpKSAqIDgpICYgMHhmZjsKKworCW1lbWNweShkZXYtPnBlcm1fYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisKKwlTRVRfTkVUREVWX0RFVihkZXYsICZ2ZGV2LT5kZXYpOworCisJdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJnZwLT5sb2NrKTsKKwl2cC0+ZGV2ID0gZGV2OworCXZwLT52ZGV2ID0gdmRldjsKKworCUlOSVRfTElTVF9IRUFEKCZ2cC0+cG9ydF9saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgVk5FVF9QT1JUX0hBU0hfU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJnZwLT5wb3J0X2hhc2hbaV0pOworCisJZGV2LT5vcGVuID0gdm5ldF9vcGVuOworCWRldi0+c3RvcCA9IHZuZXRfY2xvc2U7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB2bmV0X3NldF9yeF9tb2RlOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gdm5ldF9zZXRfbWFjX2FkZHI7CisJZGV2LT50eF90aW1lb3V0ID0gdm5ldF90eF90aW1lb3V0OworCWRldi0+ZXRodG9vbF9vcHMgPSAmdm5ldF9ldGh0b29sX29wczsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVk5FVF9UWF9USU1FT1VUOworCWRldi0+Y2hhbmdlX210dSA9IHZuZXRfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHZuZXRfc3RhcnRfeG1pdDsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN1biBMRE9NIHZuZXQgIiwgZGV2LT5uYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIHZwKTsKKworCW1kZXNjX3JlbGVhc2UoaHApOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKworZXJyX291dDoKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZuZXRfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCisJc3RydWN0IHZuZXQgKnZwID0gZGV2X2dldF9kcnZkYXRhKCZ2ZGV2LT5kZXYpOworCisJaWYgKHZwKSB7CisJCS8qIFhYWCB1bnJlZ2lzdGVyIHBvcnQsIG9yIGF0IGxlYXN0IGNoZWNrIFhYWCAqLworCQl1bnJlZ2lzdGVyX25ldGRldmljZSh2cC0+ZGV2KTsKKwkJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIE5VTEwpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZuZXRfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gIm5ldHdvcmsiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZuZXRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgdm5ldF9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gdm5ldF9tYXRjaCwKKwkucHJvYmUJCT0gdm5ldF9wcm9iZSwKKwkucmVtb3ZlCQk9IHZuZXRfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2bmV0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgdm5ldF9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZuZXRfZHJpdmVyKTsKKworCWlmICghZXJyKSB7CisJCWVyciA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZuZXRfcG9ydF9kcml2ZXIpOworCQlpZiAoZXJyKQorCQkJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X2RyaXZlcik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZuZXRfZXhpdCh2b2lkKQoreworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdm5ldF9wb3J0X2RyaXZlcik7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHZuZXRfaW5pdCk7Cittb2R1bGVfZXhpdCh2bmV0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3Vudm5ldC5oIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODg3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW52bmV0LmgKQEAgLTAsMCArMSw3MCBAQAorI2lmbmRlZiBfU1VOVk5FVF9ICisjZGVmaW5lIF9TVU5WTkVUX0gKKworI2RlZmluZSBERVNDX05DT09LSUVTKGVudHJ5X3NpemUpCVwKKwkoKGVudHJ5X3NpemUpIC0gc2l6ZW9mKHN0cnVjdCB2aW9fbmV0X2Rlc2MpKQorCisvKiBsZW5ndGggb2YgdGltZSBiZWZvcmUgd2UgZGVjaWRlIHRoZSBoYXJkd2FyZSBpcyBib3JrZWQsCisgKiBhbmQgZGV2LT50eF90aW1lb3V0KCkgc2hvdWxkIGJlIGNhbGxlZCB0byBmaXggdGhlIHByb2JsZW0KKyAqLworI2RlZmluZSBWTkVUX1RYX1RJTUVPVVQJCQkoNSAqIEhaKQorCisjZGVmaW5lIFZORVRfVFhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgVk5FVF9UWF9XQUtFVVBfVEhSRVNIKGRyKQkoKGRyKS0+cGVuZGluZyAvIDQpCisKKy8qIFZORVQgcGFja2V0cyBhcmUgc2VudCBpbiBidWZmZXJzIHdpdGggdGhlIGZpcnN0IDYgYnl0ZXMgc2tpcHBlZAorICogc28gdGhhdCBhZnRlciB0aGUgZXRoZXJuZXQgaGVhZGVyIHRoZSBJUHY0L0lQdjYgaGVhZGVycyBhcmUgYWxpZ25lZAorICogcHJvcGVybHkuCisgKi8KKyNkZWZpbmUgVk5FVF9QQUNLRVRfU0tJUAkJNgorCitzdHJ1Y3Qgdm5ldF90eF9lbnRyeSB7CisJdm9pZAkJCSpidWY7CisJdW5zaWduZWQgaW50CQluY29va2llczsKKwlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZQljb29raWVzWzJdOworfTsKKworc3RydWN0IHZuZXQ7CitzdHJ1Y3Qgdm5ldF9wb3J0IHsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZQl2aW87CisKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQloYXNoOworCXU4CQkJcmFkZHJbRVRIX0FMRU5dOworCisJc3RydWN0IHZuZXQJCSp2cDsKKworCXN0cnVjdCB2bmV0X3R4X2VudHJ5CXR4X2J1ZnNbVk5FVF9UWF9SSU5HX1NJWkVdOworCisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm5ldF9wb3J0ICp0b192bmV0X3BvcnQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHZpbywgc3RydWN0IHZuZXRfcG9ydCwgdmlvKTsKK30KKworI2RlZmluZSBWTkVUX1BPUlRfSEFTSF9TSVpFCTE2CisjZGVmaW5lIFZORVRfUE9SVF9IQVNIX01BU0sJKFZORVRfUE9SVF9IQVNIX1NJWkUgLSAxKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2bmV0X2hhc2hmbih1OCAqbWFjKQoreworCXVuc2lnbmVkIGludCB2YWwgPSBtYWNbNF0gXiBtYWNbNV07CisKKwlyZXR1cm4gdmFsICYgKFZORVRfUE9SVF9IQVNIX01BU0spOworfQorCitzdHJ1Y3Qgdm5ldCB7CisJLyogUHJvdGVjdHMgcG9ydF9saXN0IGFuZCBwb3J0X2hhc2guICAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCisJdTMyCQkJbXNnX2VuYWJsZTsKKwlzdHJ1Y3QgdmlvX2RldgkJKnZkZXY7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBvcnRfbGlzdDsKKworCXN0cnVjdCBobGlzdF9oZWFkCXBvcnRfaGFzaFtWTkVUX1BPUlRfSEFTSF9TSVpFXTsKK307CisKKyNlbmRpZiAvKiBfU1VOVk5FVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjX3N1YnNldC5jIGIvZHJpdmVycy9uZXQvdXNiL2NkY19zdWJzZXQuYwppbmRleCBiYzYyYjAxLi45NDM5ODhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjX3N1YnNldC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfc3Vic2V0LmMKQEAgLTMwNSw2ICszMDUsOSBAQAogCVVTQl9ERVZJQ0UgKDB4ODA4NiwgMHgwN2QzKSwJLy8gImJsb2IiIGJvb3Rsb2FkZXIKIAkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmJsb2JfaW5mbywKIH0sIHsKKwlVU0JfREVWSUNFICgweDEyODYsIDB4ODAwMSksICAgIC8vICJibG9iIiBib290bG9hZGVyCisJLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmYmxvYl9pbmZvLAorfSwgewogCS8vIExpbnV4IEV0aGVybmV0L1JORElTIGdhZGdldCBvbiBweGEyMTAvMjV4LzI2eCwgc2Vjb25kIGNvbmZpZwogCS8vIGUuZy4gR3Vtc3RpeCwgY3VycmVudCBPcGVuWmF1cnVzLCAuLi4KIAlVU0JfREVWSUNFX1ZFUiAoMHgwNTI1LCAweGE0YTIsIDB4MDIwMywgMHgwMjAzKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKaW5kZXggNGZjODY4MS4uYTNkZjA5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKQEAgLTYxLDcgKzYxLDcgQEAKICMKIGNvbmZpZyBMQU5NRURJQQogCXRyaXN0YXRlICJMYW5NZWRpYSBDb3JwLiBTU0kvVi4zNSwgVDEvRTEsIEhTU0ksIFQzIGJvYXJkcyIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJLS0taGVscC0tLQogCSAgRHJpdmVyIGZvciB0aGUgZm9sbG93aW5nIExhbiBNZWRpYSBmYW1pbHkgb2Ygc2VyaWFsIGJvYXJkczoKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCmluZGV4IDJkM2ExODAuLmVlMWNjMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTUyLDYgKzUyLDggQEAKIAogI2luY2x1ZGUgImFpcm8uaCIKIAorI2RlZmluZSBEUlZfTkFNRSAiYWlybyIKKwogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjYXJkX2lkc1tdID0gewogCXsgMHgxNGI5LCAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LApAQCAtNzEsNyArNzMsNyBAQAogc3RhdGljIGludCBhaXJvX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWlyb19kcml2ZXIgPSB7Ci0JLm5hbWUgICAgID0gImFpcm8iLAorCS5uYW1lICAgICA9IERSVl9OQU1FLAogCS5pZF90YWJsZSA9IGNhcmRfaWRzLAogCS5wcm9iZSAgICA9IGFpcm9fcGNpX3Byb2JlLAogCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGFpcm9fcGNpX3JlbW92ZSksCkBAIC0xMDkyLDcgKzEwOTQsNyBAQAogc3RhdGljIHZvaWQgT1VUNDUwMCggc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmVnaXN0ZXIsIHUxNiB2YWx1ZSApOwogc3RhdGljIHVuc2lnbmVkIHNob3J0IElONDUwMCggc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmVnaXN0ZXIgKTsKIHN0YXRpYyB1MTYgc2V0dXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTggKm1hYywgaW50IGxvY2spOwotc3RhdGljIGludCBlbmFibGVfTUFDKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgUmVzcCAqcnNwLCBpbnQgbG9jayApOworc3RhdGljIGludCBlbmFibGVfTUFDKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbG9jayk7CiBzdGF0aWMgdm9pZCBkaXNhYmxlX01BQyhzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxvY2spOwogc3RhdGljIHZvaWQgZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGFpcm9faW5mbyopOwogc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBhaXJvX2luZm8qKTsKQEAgLTEyNTAsNyArMTI1Miw3IEBACiBzdGF0aWMgaW50IGZsYXNocmVzdGFydChzdHJ1Y3QgYWlyb19pbmZvICphaSxzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogI2RlZmluZSBhaXJvX3ByaW50KHR5cGUsIG5hbWUsIGZtdCwgYXJncy4uLikgXAotCXsgcHJpbnRrKHR5cGUgImFpcm8oJXMpOiAiIGZtdCAiXG4iLCBuYW1lLCAjI2FyZ3MpOyB9CisJcHJpbnRrKHR5cGUgRFJWX05BTUUgIiglcyk6ICIgZm10ICJcbiIsIG5hbWUsICMjYXJncykKIAogI2RlZmluZSBhaXJvX3ByaW50X2luZm8obmFtZSwgZm10LCBhcmdzLi4uKSBcCiAJYWlyb19wcmludChLRVJOX0lORk8sIG5hbWUsIGZtdCwgIyNhcmdzKQpAQCAtMTkyNiwyOCArMTkyOCw1NCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBhaXJvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotCXN0cnVjdCBhaXJvX2luZm8gKmluZm8gPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CitzdGF0aWMgdm9pZCB0cnlfYXV0b193ZXAoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJaWYgKGF1dG9fd2VwICYmICEoYWktPmZsYWdzICYgRkxBR19SQURJT19ET1dOKSkgeworCQlhaS0+ZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhaS0+dGhyX3dhaXQpOworCX0KK30KIAotCWlmICh0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmaW5mby0+ZmxhZ3MpKQorc3RhdGljIGludCBhaXJvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCByYyA9IDA7CisKKwlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmFpLT5mbGFncykpCiAJCXJldHVybiAtRUlPOwogCiAJLyogTWFrZSBzdXJlIHRoZSBjYXJkIGlzIGNvbmZpZ3VyZWQuCiAJICogV2lyZWxlc3MgRXh0ZW5zaW9ucyBtYXkgcG9zdHBvbmUgY29uZmlnIGNoYW5nZXMgdW50aWwgdGhlIGNhcmQKIAkgKiBpcyBvcGVuICh0byBwaXBlbGluZSBjaGFuZ2VzIGFuZCBzcGVlZC11cCBjYXJkIHNldHVwKS4gSWYKIAkgKiB0aG9zZSBjaGFuZ2VzIGFyZSBub3QgeWV0IGNvbW1pdGVkLCBkbyBpdCBub3cgLSBKZWFuIElJICovCi0JaWYgKHRlc3RfYml0IChGTEFHX0NPTU1JVCwgJmluZm8tPmZsYWdzKSkgewotCQlkaXNhYmxlX01BQyhpbmZvLCAxKTsKLQkJd3JpdGVDb25maWdSaWQoaW5mbywgMSk7CisJaWYgKHRlc3RfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKSkgeworCQlkaXNhYmxlX01BQyhhaSwgMSk7CisJCXdyaXRlQ29uZmlnUmlkKGFpLCAxKTsKIAl9CiAKLQlpZiAoaW5mby0+d2lmaWRldiAhPSBkZXYpIHsKKwlpZiAoYWktPndpZmlkZXYgIT0gZGV2KSB7CisJCWNsZWFyX2JpdChKT0JfRElFLCAmYWktPmpvYnMpOworCQlhaS0+YWlyb190aHJlYWRfdGFzayA9IGt0aHJlYWRfcnVuKGFpcm9fdGhyZWFkLCBkZXYsIGRldi0+bmFtZSk7CisJCWlmIChJU19FUlIoYWktPmFpcm9fdGhyZWFkX3Rhc2spKQorCQkJcmV0dXJuIChpbnQpUFRSX0VSUihhaS0+YWlyb190aHJlYWRfdGFzayk7CisKKwkJcmMgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgYWlyb19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJZGV2LT5uYW1lLCBkZXYpOworCQlpZiAocmMpIHsKKwkJCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwKKwkJCQkicmVnaXN0ZXIgaW50ZXJydXB0ICVkIGZhaWxlZCwgcmMgJWQiLAorCQkJCWRldi0+aXJxLCByYyk7CisJCQlzZXRfYml0KEpPQl9ESUUsICZhaS0+am9icyk7CisJCQlrdGhyZWFkX3N0b3AoYWktPmFpcm9fdGhyZWFkX3Rhc2spOworCQkJcmV0dXJuIHJjOworCQl9CisKIAkJLyogUG93ZXIgb24gdGhlIE1BQyBjb250cm9sbGVyICh3aGljaCBtYXkgaGF2ZSBiZWVuIGRpc2FibGVkKSAqLwotCQljbGVhcl9iaXQoRkxBR19SQURJT19ET1dOLCAmaW5mby0+ZmxhZ3MpOwotCQllbmFibGVfaW50ZXJydXB0cyhpbmZvKTsKKwkJY2xlYXJfYml0KEZMQUdfUkFESU9fRE9XTiwgJmFpLT5mbGFncyk7CisJCWVuYWJsZV9pbnRlcnJ1cHRzKGFpKTsKKworCQl0cnlfYXV0b193ZXAoYWkpOwogCX0KLQllbmFibGVfTUFDKGluZm8sICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogCiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTIzMzgsMTQgKzIzNjYsMTMgQEAKIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwotCVJlc3AgcnNwOwogCiAJcmVhZENvbmZpZ1JpZChhaSwgMSk7CiAJbWVtY3B5IChhaS0+Y29uZmlnLm1hY0FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwogCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJd3JpdGVDb25maWdSaWQgKGFpLCAxKTsKLQllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIAltZW1jcHkgKGFpLT5kZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKIAlpZiAoYWktPndpZmlkZXYpCiAJCW1lbWNweSAoYWktPndpZmlkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKQEAgLTIzOTIsNiArMjQxOSwxMSBAQAogCQlkaXNhYmxlX01BQyhhaSwgMSk7CiAjZW5kaWYKIAkJZGlzYWJsZV9pbnRlcnJ1cHRzKCBhaSApOworCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJCXNldF9iaXQoSk9CX0RJRSwgJmFpLT5qb2JzKTsKKwkJa3RocmVhZF9zdG9wKGFpLT5haXJvX3RocmVhZF90YXNrKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDAzLDcgKzI0MzUsNiBAQAogCXNldF9iaXQoRkxBR19SQURJT19ET1dOLCAmYWktPmZsYWdzKTsKIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJZGlzYWJsZV9pbnRlcnJ1cHRzKGFpKTsKLQlmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOwogCXRha2Vkb3duX3Byb2NfZW50cnkoIGRldiwgYWkgKTsKIAlpZiAodGVzdF9iaXQoRkxBR19SRUdJU1RFUkVELCAmYWktPmZsYWdzKSkgewogCQl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7CkBAIC0yNDE0LDkgKzI0NDUsNiBAQAogCQl9CiAJCWNsZWFyX2JpdChGTEFHX1JFR0lTVEVSRUQsICZhaS0+ZmxhZ3MpOwogCX0KLQlzZXRfYml0KEpPQl9ESUUsICZhaS0+am9icyk7Ci0Ja3RocmVhZF9zdG9wKGFpLT5haXJvX3RocmVhZF90YXNrKTsKLQogCS8qCiAJICogQ2xlYW4gb3V0IHR4IHF1ZXVlCiAJICovCkBAIC0yNTU0LDggKzI1ODIsNyBAQAogICogMikgTWFwIFBDSSBtZW1vcnkgZm9yIGlzc3VlaW5nIGNvbW1hbmRzLgogICogMykgQWxsb2NhdGUgbWVtb3J5IChzaGFyZWQpIHRvIHNlbmQgYW5kIHJlY2VpdmUgZXRoZXJuZXQgZnJhbWVzLgogICovCi1zdGF0aWMgaW50IG1waV9tYXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgc3RydWN0IHBjaV9kZXYgKnBjaSwKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgaW50IG1waV9tYXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgc3RydWN0IHBjaV9kZXYgKnBjaSkKIHsKIAl1bnNpZ25lZCBsb25nIG1lbV9zdGFydCwgbWVtX2xlbiwgYXV4X3N0YXJ0LCBhdXhfbGVuOwogCWludCByYyA9IC0xOwpAQCAtMjU2OSwzNSArMjU5NiwzNSBAQAogCWF1eF9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDIpOwogCWF1eF9sZW4gPSBBVVhNRU1TSVpFOwogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtX3N0YXJ0LCBtZW1fbGVuLCBuYW1lKSkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0gZm9yICVzIiwKLQkJICAgICAgIChpbnQpbWVtX3N0YXJ0LCAoaW50KW1lbV9sZW4sIG5hbWUpOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9zdGFydCwgbWVtX2xlbiwgRFJWX05BTUUpKSB7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0iLAorCQkJKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbik7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhdXhfc3RhcnQsIGF1eF9sZW4sIG5hbWUpKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBnZXQgcmVnaW9uICV4WyV4XSBmb3IgJXMiLAotCQkgICAgICAgKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbiwgbmFtZSk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYXV4X3N0YXJ0LCBhdXhfbGVuLCBEUlZfTkFNRSkpIHsKKwkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBnZXQgcmVnaW9uICV4WyV4XSIsCisJCQkoaW50KWF1eF9zdGFydCwgKGludClhdXhfbGVuKTsKIAkJZ290byBmcmVlX3JlZ2lvbjE7CiAJfQogCiAJYWktPnBjaW1lbSA9IGlvcmVtYXAobWVtX3N0YXJ0LCBtZW1fbGVuKTsKIAlpZiAoIWFpLT5wY2ltZW0pIHsKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIGZvciAlcyIsCi0JCSAgICAgICAoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuLCBuYW1lKTsKKwkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSIsCisJCQkoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuKTsKIAkJZ290byBmcmVlX3JlZ2lvbjI7CiAJfQogCWFpLT5wY2lhdXggPSBpb3JlbWFwKGF1eF9zdGFydCwgYXV4X2xlbik7CiAJaWYgKCFhaS0+cGNpYXV4KSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSBmb3IgJXMiLAotCQkgICAgICAgKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbiwgbmFtZSk7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0iLAorCQkJKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbik7CiAJCWdvdG8gZnJlZV9tZW1tYXA7CiAJfQogCiAJLyogUmVzZXJ2ZSBQS1RTSVpFIGZvciBlYWNoIGZpZCBhbmQgMksgZm9yIHRoZSBSaWRzICovCiAJYWktPnNoYXJlZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaSwgUENJX1NIQVJFRF9MRU4sICZhaS0+c2hhcmVkX2RtYSk7CiAJaWYgKCFhaS0+c2hhcmVkKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBhbGxvY19jb25zaXN0ZW50ICVkIiwKLQkJICAgICAgIFBDSV9TSEFSRURfTEVOKTsKKwkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBhbGxvY19jb25zaXN0ZW50ICVkIiwKKwkJCVBDSV9TSEFSRURfTEVOKTsKIAkJZ290byBmcmVlX2F1eG1hcDsKIAl9CiAKQEAgLTI3NDIsNyArMjc2OSw3IEBACiAJICAgIGt6YWxsb2MoQUlST19NQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihCU1NMaXN0RWxlbWVudCksCiAJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWFpLT5uZXR3b3JrcykgewotCQlhaXJvX3ByaW50X3dhcm4oYWktPmRldi0+bmFtZSwgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBiZWFjb25zIik7CisJCWFpcm9fcHJpbnRfd2FybigiIiwgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBiZWFjb25zIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjc3MCw3ICsyNzk3LDYgQEAKIHsKIAlpbnQgc3RhdHVzOwogCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsKLQljb25zdCBjaGFyICpuYW1lID0gYWktPmRldi0+bmFtZTsKIAogCXN0YXR1cyA9IHJlYWRDYXBhYmlsaXR5UmlkKGFpLCAmY2FwX3JpZCwgMSk7CiAJaWYgKHN0YXR1cyAhPSBTVUNDRVNTKSByZXR1cm4gMDsKQEAgLTI3NzgsMTIgKzI4MDQsMTIgQEAKIAkvKiBPbmx5IGZpcm13YXJlIHZlcnNpb25zIDUuMzAuMTcgb3IgYmV0dGVyIGNhbiBkbyBXUEEgKi8KIAlpZiAoKGNhcF9yaWQuc29mdFZlciA+IDB4NTMwKQogCSAgfHwgKChjYXBfcmlkLnNvZnRWZXIgPT0gMHg1MzApICYmIChjYXBfcmlkLnNvZnRTdWJWZXIgPj0gMTcpKSkgewotCQlhaXJvX3ByaW50X2luZm8obmFtZSwgIldQQSBpcyBzdXBwb3J0ZWQuIik7CisJCWFpcm9fcHJpbnRfaW5mbygiIiwgIldQQSBpcyBzdXBwb3J0ZWQuIik7CiAJCXJldHVybiAxOwogCX0KIAogCS8qIE5vIFdQQSBzdXBwb3J0ICovCi0JYWlyb19wcmludF9pbmZvKG5hbWUsICJXUEEgdW5zdXBwb3J0ZWQgKG9ubHkgZmlybXdhcmUgdmVyc2lvbnMgNS4zMC4xNyIKKwlhaXJvX3ByaW50X2luZm8oIiIsICJXUEEgdW5zdXBwb3J0ZWQgKG9ubHkgZmlybXdhcmUgdmVyc2lvbnMgNS4zMC4xNyIKIAkJIiBhbmQgZ3JlYXRlciBzdXBwb3J0IFdQQS4gIERldGVjdGVkICVzKSIsIGNhcF9yaWQucHJvZFZlcik7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNzk3LDIzICsyODIzLDE5IEBACiAJaW50IGksIHJjOwogCiAJLyogQ3JlYXRlIHRoZSBuZXR3b3JrIGRldmljZSBvYmplY3QuICovCi0gICAgICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqYWkpKTsKLSAgICAgICAgaWYgKCFkZXYpIHsKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCphaSksICIiLCBldGhlcl9zZXR1cCk7CisJaWYgKCFkZXYpIHsKIAkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBhbGxvY19ldGhlcmRldiIpOwogCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSkgPCAwKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgZ2V0IG5hbWUhIik7Ci0JCWdvdG8gZXJyX291dF9mcmVlOwogCX0KIAogCWFpID0gZGV2LT5wcml2OwogCWFpLT53aWZpZGV2ID0gTlVMTDsKLQlhaS0+ZmxhZ3MgPSAwOworCWFpLT5mbGFncyA9IDEgPDwgRkxBR19SQURJT19ET1dOOwogCWFpLT5qb2JzID0gMDsKIAlhaS0+ZGV2ID0gZGV2OwogCWlmIChwY2kgJiYgKHBjaS0+ZGV2aWNlID09IDB4NTAwMCB8fCBwY2ktPmRldmljZSA9PSAweGE1MDQpKSB7Ci0JCWFpcm9fcHJpbnRfZGJnKGRldi0+bmFtZSwgIkZvdW5kIGFuIE1QSTM1MCBjYXJkIik7CisJCWFpcm9fcHJpbnRfZGJnKCIiLCAiRm91bmQgYW4gTVBJMzUwIGNhcmQiKTsKIAkJc2V0X2JpdChGTEFHX01QSSwgJmFpLT5mbGFncyk7CiAJfQogCXNwaW5fbG9ja19pbml0KCZhaS0+YXV4X2xvY2spOwpAQCAtMjgyMSwxNCArMjg0MywxMSBAQAogCWFpLT5jb25maWcubGVuID0gMDsKIAlhaS0+cGNpID0gcGNpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZhaS0+dGhyX3dhaXQpOwotCWFpLT5haXJvX3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4oYWlyb190aHJlYWQsIGRldiwgZGV2LT5uYW1lKTsKLQlpZiAoSVNfRVJSKGFpLT5haXJvX3RocmVhZF90YXNrKSkKLQkJZ290byBlcnJfb3V0X2ZyZWU7CiAJYWktPnRmbSA9IE5VTEw7CiAJYWRkX2Fpcm9fZGV2KGFpKTsKIAogCWlmIChhaXJvX25ldHdvcmtzX2FsbG9jYXRlIChhaSkpCi0JCWdvdG8gZXJyX291dF90aHI7CisJCWdvdG8gZXJyX291dF9mcmVlOwogCWFpcm9fbmV0d29ya3NfaW5pdGlhbGl6ZSAoYWkpOwogCiAJLyogVGhlIEFpcm8tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KQEAgLTI4NTEsMjcgKzI4NzAsMjIgQEAKIAlkZXYtPmJhc2VfYWRkciA9IHBvcnQ7CiAKIAlTRVRfTkVUREVWX0RFVihkZXYsIGRtZGV2KTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CiAKIAlyZXNldF9jYXJkIChkZXYsIDEpOwogCW1zbGVlcCg0MDApOwogCi0JcmMgPSByZXF1ZXN0X2lycSggZGV2LT5pcnEsIGFpcm9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYgKTsKLQlpZiAocmMpIHsKLQkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLCAicmVnaXN0ZXIgaW50ZXJydXB0ICVkIGZhaWxlZCwgcmMgJWQiLAotCQkJCWlycSwgcmMpOwotCQlnb3RvIGVycl9vdXRfbmV0czsKLQl9CiAJaWYgKCFpc19wY21jaWEpIHsKLQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0LCBkZXYtPm5hbWUgKSkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCA2NCwgRFJWX05BTUUpKSB7CiAJCQlyYyA9IC1FQlVTWTsKIAkJCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwgIkNvdWxkbid0IHJlcXVlc3QgcmVnaW9uIik7Ci0JCQlnb3RvIGVycl9vdXRfaXJxOworCQkJZ290byBlcnJfb3V0X25ldHM7CiAJCX0KIAl9CiAKIAlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKLQkJaWYgKG1waV9tYXBfY2FyZChhaSwgcGNpLCBkZXYtPm5hbWUpKSB7Ci0JCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICJDb3VsZCBub3QgbWFwIG1lbW9yeSIpOworCQlpZiAobXBpX21hcF9jYXJkKGFpLCBwY2kpKSB7CisJCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkIG5vdCBtYXAgbWVtb3J5Iik7CiAJCQlnb3RvIGVycl9vdXRfcmVzOwogCQl9CiAJfQpAQCAtMjg5OSw2ICsyOTEzLDcgQEAKIAkJYWktPmJzc0xpc3RSaWRMZW4gPSBzaXplb2YoQlNTTGlzdFJpZCkgLSBzaXplb2YoQlNTTGlzdFJpZEV4dHJhKTsKIAl9CiAKKwlzdHJjcHkoZGV2LT5uYW1lLCAiZXRoJWQiKTsKIAlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChyYykgewogCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICJDb3VsZG4ndCByZWdpc3Rlcl9uZXRkZXYiKTsKQEAgLTI5MjEsOCArMjkzNiw2IEBACiAJaWYgKHNldHVwX3Byb2NfZW50cnkoZGV2LCBkZXYtPnByaXYpIDwgMCkKIAkJZ290byBlcnJfb3V0X3dpZmk7CiAKLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwotCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKIAlyZXR1cm4gZGV2OwogCiBlcnJfb3V0X3dpZmk6CkBAIC0yOTQwLDE0ICsyOTUzLDkgQEAKIGVycl9vdXRfcmVzOgogCWlmICghaXNfcGNtY2lhKQogCSAgICAgICAgcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCApOwotZXJyX291dF9pcnE6Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiBlcnJfb3V0X25ldHM6CiAJYWlyb19uZXR3b3Jrc19mcmVlKGFpKTsKLWVycl9vdXRfdGhyOgogCWRlbF9haXJvX2RldihhaSk7Ci0Jc2V0X2JpdChKT0JfRElFLCAmYWktPmpvYnMpOwotCWt0aHJlYWRfc3RvcChhaS0+YWlyb190aHJlYWRfdGFzayk7CiBlcnJfb3V0X2ZyZWU6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gTlVMTDsKQEAgLTMwNzgsNyArMzA4Niw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJaW50IGxvY2tlZDsKLQkKKworCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSgxKSB7CiAJCS8qIG1ha2Ugc3dzdXNwIGhhcHB5IHdpdGggb3VyIHRocmVhZCAqLwogCQl0cnlfdG9fZnJlZXplKCk7CkBAIC0zNTI5LDkgKzM1MzgsMTEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgZW5hYmxlX01BQyggc3RydWN0IGFpcm9faW5mbyAqYWksIFJlc3AgKnJzcCwgaW50IGxvY2sgKSB7CitzdGF0aWMgaW50IGVuYWJsZV9NQUMoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsb2NrKQorewogCWludCByYzsKLSAgICAgICAgQ21kIGNtZDsKKwlDbWQgY21kOworCVJlc3AgcnNwOwogCiAJLyogRkxBR19SQURJT19PRkYgOiBSYWRpbyBkaXNhYmxlZCB2aWEgL3Byb2Mgb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucwogCSAqIEZMQUdfUkFESU9fRE9XTiA6IFJhZGlvIGRpc2FibGVkIHZpYSAiaWZjb25maWcgZXRoWCBkb3duIgpAQCAtMzU0Nyw3ICszNTU4LDcgQEAKIAlpZiAoIXRlc3RfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncykpIHsKIAkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKIAkJY21kLmNtZCA9IE1BQ19FTkFCTEU7Ci0JCXJjID0gaXNzdWVjb21tYW5kKGFpLCAmY21kLCByc3ApOworCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CiAJCWlmIChyYyA9PSBTVUNDRVNTKQogCQkJc2V0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpOwogCX0gZWxzZQpAQCAtMzU1Nyw4ICszNTY4LDEyIEBACiAJICAgIHVwKCZhaS0+c2VtKTsKIAogCWlmIChyYykKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIiVzOiBDYW5ub3QgZW5hYmxlIE1BQywgZXJyPSVkIiwKLQkJCV9fRlVOQ1RJT05fXywgcmMpOworCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ2Fubm90IGVuYWJsZSBNQUMiKTsKKwllbHNlIGlmICgocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgeworCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQmFkIE1BQyBlbmFibGUgcmVhc29uPSV4LCAiCisJCQkicmlkPSV4LCBvZmZzZXQ9JWQiLCByc3AucnNwMCwgcnNwLnJzcDEsIHJzcC5yc3AyKTsKKwkJcmMgPSBFUlJPUjsKKwl9CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zOTAyLDEyICszOTE3LDkgQEAKIAkJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyApIHJldHVybiBFUlJPUjsKIAl9CiAKLQlzdGF0dXMgPSBlbmFibGVfTUFDKGFpLCAmcnNwLCBsb2NrKTsKLQlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTIHx8IChyc3Auc3RhdHVzICYgMHhGRjAwKSAhPSAwKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJCYWQgTUFDIGVuYWJsZSByZWFzb24gPSAleCwgcmlkID0gJXgsIgotCQkJIiBvZmZzZXQgPSAlZCIsIHJzcC5yc3AwLCByc3AucnNwMSwgcnNwLnJzcDIgKTsKKwlzdGF0dXMgPSBlbmFibGVfTUFDKGFpLCBsb2NrKTsKKwlpZiAoc3RhdHVzICE9IFNVQ0NFU1MpCiAJCXJldHVybiBFUlJPUjsKLQl9CiAKIAkvKiBHcmFiIHRoZSBpbml0aWFsIHdlcCBrZXksIHdlIGdvdHRhIHNhdmUgaXQgZm9yIGF1dG9fd2VwICovCiAJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAxLCBsb2NrKTsKQEAgLTM5MTksMTAgKzM5MzEsNyBAQAogCQlyYyA9IHJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDAsIGxvY2spOwogCX0gd2hpbGUobGFzdGluZGV4ICE9IHdrci5raW5kZXgpOwogCi0JaWYgKGF1dG9fd2VwKSB7Ci0JCWFpLT5leHBpcmVzID0gUlVOX0FUKDMqSFopOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFpLT50aHJfd2FpdCk7Ci0JfQorCXRyeV9hdXRvX3dlcChhaSk7CiAKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KQEAgLTQwMDQsNyArNDAxMyw3IEBACiAJCX0KIAkJaWYgKCAhKG1heF90cmllcy0tKSApIHsKIAkJCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsCi0JCQkJImFpcm86IEJBUCBzZXR1cCBlcnJvciB0b28gbWFueSByZXRyaWVzXG4iKTsKKwkJCQkiQkFQIHNldHVwIGVycm9yIHRvbyBtYW55IHJldHJpZXNcbiIpOwogCQkJcmV0dXJuIEVSUk9SOwogCQl9CiAJCS8vIC0tIFBDNDUwMCBtaXNzZWQgaXQsIHRyeSBhZ2FpbgpAQCAtNTE1Miw3ICs1MTYxLDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJU3NpZFJpZCBTU0lEX3JpZDsKLQlSZXNwIHJzcDsKIAlpbnQgaTsKIAlpbnQgb2Zmc2V0ID0gMDsKIApAQCAtNTE3Nyw3ICs1MTg1LDcgQEAKIAkJU1NJRF9yaWQubGVuID0gc2l6ZW9mKFNTSURfcmlkKTsKIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJd3JpdGVTc2lkUmlkKGFpLCAmU1NJRF9yaWQsIDEpOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogfQogCiBzdGF0aWMgaW5saW5lIHU4IGhleFZhbChjaGFyIGMpIHsKQEAgLTUxOTMsNyArNTIwMSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCUFQTGlzdFJpZCBBUExpc3RfcmlkOwotCVJlc3AgcnNwOwogCWludCBpOwogCiAJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CkBAIC01MjE4LDE4ICs1MjI1LDE3IEBACiAJfQogCWRpc2FibGVfTUFDKGFpLCAxKTsKIAl3cml0ZUFQTGlzdFJpZChhaSwgJkFQTGlzdF9yaWQsIDEpOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIFBDNDUwMF93cml0ZXJpZCB3aXRoIGEgTUFDIGRpc2FibGUgKi8KIHN0YXRpYyBpbnQgZG9fd3JpdGVyaWQoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCBjb25zdCB2b2lkICpyaWRfZGF0YSwKIAkJCWludCBsZW4sIGludCBkdW1teSApIHsKIAlpbnQgcmM7Ci0JUmVzcCByc3A7CiAKIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJcmMgPSBQQzQ1MDBfd3JpdGVyaWQoYWksIHJpZCwgcmlkX2RhdGEsIGxlbiwgMSk7Ci0JZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhhaSwgMSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC01MjYwLDcgKzUyNjYsNiBAQAogCQkgICAgICAgY29uc3QgY2hhciAqa2V5LCB1MTYga2V5bGVuLCBpbnQgcGVybSwgaW50IGxvY2sgKSB7CiAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFjYWRkcltFVEhfQUxFTl0gPSB7IDB4MDEsIDAsIDAsIDAsIDAsIDAgfTsKIAlXZXBLZXlSaWQgd2tyOwotCVJlc3AgcnNwOwogCiAJbWVtc2V0KCZ3a3IsIDAsIHNpemVvZih3a3IpKTsKIAlpZiAoa2V5bGVuID09IDApIHsKQEAgLTUyODAsNyArNTI4NSw3IEBACiAKIAlpZiAocGVybSkgZGlzYWJsZV9NQUMoYWksIGxvY2spOwogCXdyaXRlV2VwS2V5UmlkKGFpLCAmd2tyLCBwZXJtLCBsb2NrKTsKLQlpZiAocGVybSkgZW5hYmxlX01BQyhhaSwgJnJzcCwgbG9jayk7CisJaWYgKHBlcm0pIGVuYWJsZV9NQUMoYWksIGxvY2spOwogCXJldHVybiAwOwogfQogCkBAIC01NTQ4LDcgKzU1NTMsNiBAQAogICAgY2hhbmdlZC4gKi8KIHN0YXRpYyB2b2lkIHRpbWVyX2Z1bmMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKSB7CiAJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAKIC8qIFdlIGRvbid0IGhhdmUgYSBsaW5rIHNvIHRyeSBjaGFuZ2luZyB0aGUgYXV0aHR5cGUgKi8KIAlyZWFkQ29uZmlnUmlkKGFwcml2LCAwKTsKQEAgLTU1NzUsNyArNTU3OSw3IEBACiAJfQogCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYXByaXYtPmZsYWdzKTsKIAl3cml0ZUNvbmZpZ1JpZChhcHJpdiwgMCk7Ci0JZW5hYmxlX01BQyhhcHJpdiwgJnJzcCwgMCk7CisJZW5hYmxlX01BQyhhcHJpdiwgMCk7CiAJdXAoJmFwcml2LT5zZW0pOwogCiAvKiBTY2hlZHVsZSBjaGVjayB0byBzZWUgaWYgdGhlIGNoYW5nZSB3b3JrZWQgKi8KQEAgLTU1OTcsOCArNTYwMSwxMCBAQAogCQkJZGV2ID0gX2luaXRfYWlyb19jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIDAsIHBkZXYsICZwZGV2LT5kZXYpOwogCWVsc2UKIAkJCWRldiA9IF9pbml0X2Fpcm9fY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzJdLnN0YXJ0LCAwLCBwZGV2LCAmcGRldi0+ZGV2KTsKLQlpZiAoIWRldikKKwlpZiAoIWRldikgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCXJldHVybiAwOwpAQCAtNTYxMCw2ICs1NjE2LDggQEAKIAogCWFpcm9fcHJpbnRfaW5mbyhkZXYtPm5hbWUsICJVbnJlZ2lzdGVyaW5nLi4uIik7CiAJc3RvcF9haXJvX2NhcmQoZGV2LCAxKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IGFpcm9fcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKQEAgLTU2NDYsNyArNTY1NCw2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKLQlSZXNwIHJzcDsKIAlwY2lfcG93ZXJfdCBwcmV2X3N0YXRlID0gcGRldi0+Y3VycmVudF9zdGF0ZTsKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKQEAgLTU2NzksNyArNTY4Niw3IEBACiAJCWFpLT5BUExpc3QgPSBOVUxMOwogCX0KIAl3cml0ZUNvbmZpZ1JpZChhaSwgMCk7Ci0JZW5hYmxlX01BQyhhaSwgJnJzcCwgMCk7CisJZW5hYmxlX01BQyhhaSwgMCk7CiAJYWktPnBvd2VyID0gUE1TR19PTjsKIAluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwpAQCAtNTkwMyw3ICs1OTEwLDYgQEAKIAkJCSAgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAJU3NpZFJpZCBTU0lEX3JpZDsJCS8qIFNTSURzICovCiAKIAkvKiBSZWxvYWQgdGhlIGxpc3Qgb2YgY3VycmVudCBTU0lEICovCkBAIC01OTM1LDcgKzU5NDEsNyBAQAogCS8qIFdyaXRlIGl0IHRvIHRoZSBjYXJkICovCiAJZGlzYWJsZV9NQUMobG9jYWwsIDEpOwogCXdyaXRlU3NpZFJpZChsb2NhbCwgJlNTSURfcmlkLCAxKTsKLQllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGxvY2FsLCAxKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjAwMCw3ICs2MDA2LDcgQEAKIAkJbWVtY3B5KEFQTGlzdF9yaWQuYXBbMF0sIGF3cnEtPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAkJZGlzYWJsZV9NQUMobG9jYWwsIDEpOwogCQl3cml0ZUFQTGlzdFJpZChsb2NhbCwgJkFQTGlzdF9yaWQsIDEpOwotCQllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAxKTsKKwkJZW5hYmxlX01BQyhsb2NhbCwgMSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNzQ1NCw3ICs3NDYwLDYgQEAKIAkJCSAgICAgIGNoYXIgKmV4dHJhKQkJCS8qIE5VTEwgKi8KIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKLQlSZXNwIHJzcDsKIAogCWlmICghdGVzdF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKSkKIAkJcmV0dXJuIDA7CkBAIC03NDc5LDcgKzc0ODQsNyBAQAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmxvY2FsLT5zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCXdyaXRlQ29uZmlnUmlkKGxvY2FsLCAwKTsKLQllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAwKTsKKwllbmFibGVfTUFDKGxvY2FsLCAwKTsKIAlpZiAodGVzdF9iaXQgKEZMQUdfUkVTRVQsICZsb2NhbC0+ZmxhZ3MpKQogCQlhaXJvX3NldF9wcm9taXNjKGxvY2FsKTsKIAllbHNlCkBAIC03NzQ2LDcgKzc3NTEsNiBAQAogCXVuc2lnbmVkIGNoYXIgKmlvYnVmOwogCWludCBsZW47CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAKIAlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmFpLT5mbGFncykpCiAJCXJldHVybiAtRUlPOwpAQCAtNzc1OCw3ICs3NzYyLDcgQEAKIAkJaWYgKHRlc3RfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKSkgewogCQkJZGlzYWJsZV9NQUMgKGFpLCAxKTsKIAkJCXdyaXRlQ29uZmlnUmlkIChhaSwgMSk7Ci0JCQllbmFibGVfTUFDIChhaSwgJnJzcCwgMSk7CisJCQllbmFibGVfTUFDKGFpLCAxKTsKIAkJfQogCQlicmVhazsKIAljYXNlIEFJUk9HU0xJU1Q6ICAgIHJpZGNvZGUgPSBSSURfU1NJRDsgICAgICAgICBicmVhazsKQEAgLTc4MTUsNyArNzgxOSw2IEBACiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJaW50ICByaWRjb2RlOwogICAgICAgICBpbnQgIGVuYWJsZWQ7Ci0JUmVzcCAgICAgIHJzcDsKIAlzdGF0aWMgaW50ICgqIHdyaXRlcikoc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmlkLCBjb25zdCB2b2lkICosIGludCwgaW50KTsKIAl1bnNpZ25lZCBjaGFyICppb2J1ZjsKIApAQCAtNzg0OSw3ICs3ODUyLDcgQEAKIAkJICogc2FtZSB3aXRoIE1BQyBvZmYKIAkJICovCiAJY2FzZSBBSVJPUE1BQ09OOgotCQlpZiAoZW5hYmxlX01BQyhhaSwgJnJzcCwgMSkgIT0gMCkKKwkJaWYgKGVuYWJsZV9NQUMoYWksIDEpICE9IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwppbmRleCBkNTFkYWY4Li4wNzJlZGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCkBAIC0xNzY4LDcgKzE3NjgsOCBAQAogCiAJCWlmIChwcml2LT5zdG9wX3JmX2tpbGwpIHsKIAkJCXByaXYtPnN0b3BfcmZfa2lsbCA9IDA7Ci0JCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwgSFopOworCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsCisJCQkJCSAgIHJvdW5kX2ppZmZpZXMoSFopKTsKIAkJfQogCiAJCWRlZmVycmVkID0gMTsKQEAgLTIwOTgsNyArMjA5OSw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBSRiBLaWxsIGNoZWNrIHRpbWVyIGlzIHJ1bm5pbmcgKi8KIAlwcml2LT5zdG9wX3JmX2tpbGwgPSAwOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnJmX2tpbGwpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCBIWik7CisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIHJvdW5kX2ppZmZpZXMoSFopKTsKIH0KIAogc3RhdGljIHZvaWQgaXNyX3NjYW5fY29tcGxldGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTMyIHN0YXR1cykKQEAgLTQyMzMsNyArNDIzNCw4IEBACiAJCQkvKiBNYWtlIHN1cmUgdGhlIFJGX0tJTEwgY2hlY2sgdGltZXIgaXMgcnVubmluZyAqLwogCQkJcHJpdi0+c3RvcF9yZl9raWxsID0gMDsKIAkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnJmX2tpbGwpOwotCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAorCQkJCQkgICByb3VuZF9qaWZmaWVzKEhaKSk7CiAJCX0gZWxzZQogCQkJc2NoZWR1bGVfcmVzZXQocHJpdik7CiAJfQpAQCAtNTk2OSw3ICs1OTcxLDggQEAKIAlpZiAocmZfa2lsbF9hY3RpdmUocHJpdikpIHsKIAkJSVBXX0RFQlVHX1JGX0tJTEwoIlJGIEtpbGwgYWN0aXZlLCByZXNjaGVkdWxpbmcgR1BJTyBjaGVja1xuIik7CiAJCWlmICghcHJpdi0+c3RvcF9yZl9raWxsKQotCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAorCQkJCQkgICByb3VuZF9qaWZmaWVzKEhaKSk7CiAJCWdvdG8gZXhpdF91bmxvY2s7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKaW5kZXggN2NiMjA1Mi4uYWEzMmE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwpAQCAtMTc1MSw3ICsxNzUxLDcgQEAKIAkJCS8qIE1ha2Ugc3VyZSB0aGUgUkZfS0lMTCBjaGVjayB0aW1lciBpcyBydW5uaW5nICovCiAJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAotCQkJCQkgICAyICogSFopOworCQkJCQkgICByb3VuZF9qaWZmaWVzKDIgKiBIWikpOwogCQl9IGVsc2UKIAkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dXApOwogCX0KQEAgLTQ2OTAsNyArNDY5MCw4IEBACiAJCQllbHNlIGlmIChwcml2LT5jb25maWcgJiBDRkdfQkFDS0dST1VORF9TQ0FOCiAJCQkJICYmIHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKQogCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsCi0JCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuLCBIWik7CisJCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuLAorCQkJCQkJICAgcm91bmRfamlmZmllcyhIWikpOwogCiAJCQkvKiBTZW5kIGFuIGVtcHR5IGV2ZW50IHRvIHVzZXIgc3BhY2UuCiAJCQkgKiBXZSBkb24ndCBzZW5kIHRoZSByZWNlaXZlZCBkYXRhIG9uIHRoZSBldmVudCBiZWNhdXNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCmluZGV4IDEzZjY1MjguLjRhOGY1ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJaWYgKCplbmFibGUpCiAJCQlwZW5hYmxlUlNOLT5lbmFibGUgPSBjcHVfdG9fbGUxNihjbWRfZW5hYmxlX3Jzbik7CiAJCWVsc2UKLQkJCXBlbmFibGVSU04tPmVuYWJsZSA9IGNwdV90b19sZTE2KGNtZF9lbmFibGVfcnNuKTsKKwkJCXBlbmFibGVSU04tPmVuYWJsZSA9IGNwdV90b19sZTE2KGNtZF9kaXNhYmxlX3Jzbik7CiAJfQogCiAJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NNRCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKaW5kZXggNGE1OTMwNi4uOWYzNjYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwpAQCAtNjEzLDYgKzYxMyw3IEBACiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQlsYnNfZGViX3RocmVhZCggIm1haW4tdGhyZWFkIDExMTogaW50Y291bnRlcj0lZCAiCiAJCSAgICAgICAiY3VycmVudHR4c2tiPSVwIGRubGRfc2VudD0lZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCmluZGV4IDg4ZDlkMmQuLjc2OWM4NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwpAQCAtNDM5LDcgKzQzOSw2IEBACiAJcmV0ID0gMDsKIAogZG9uZToKLQlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOwkvKiBFVEhfUF84MDIxMV9SQVcgKi8KIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9SWCwgInJldCAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3ZlcnNpb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxMzc4OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYwppbmRleCBmNDJiNzk2Li4yZmNjM2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCkBAIC0xNzE5LDkgKzE3MTksNiBAQAogCQkJcGtleS0+dHlwZSA9IEtFWV9UWVBFX0lEX1RLSVA7CiAJCX0gZWxzZSBpZiAoYWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkgewogCQkJcGtleS0+dHlwZSA9IEtFWV9UWVBFX0lEX0FFUzsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKIAkJfQogCiAJCS8qIElmIFdQQSBpc24ndCBlbmFibGVkIHlldCwgZG8gdGhhdCBub3cgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCmluZGV4IDI4M2JlNGEuLjU4NWY1OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwpAQCAtMTg1Myw3ICsxODUzLDYgQEAKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOwogCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOwogCiAJaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCkBAIC0xODYxLDExICsxODYwLDkgQEAKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dDsgcHRyICE9ICZhY2wtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmFjbC0+bWFjX2xpc3QsIF9saXN0KSB7CiAJCWlmIChtZW1jbXAoZW50cnktPmFkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKSA9PSAwKSB7Ci0JCQlsaXN0X2RlbChwdHIpOworCQkJbGlzdF9kZWwoJmVudHJ5LT5fbGlzdCk7CiAJCQlhY2wtPnNpemUtLTsKIAkJCWtmcmVlKGVudHJ5KTsKIAkJCXVwKCZhY2wtPnNlbSk7CkBAIC0xODgzLDcgKzE4ODAsNiBAQAogCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGlzbHBjaV9hY2wgKmFjbCA9ICZwcml2LT5hY2w7CiAJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyOwogCXN0cnVjdCBzb2NrYWRkciAqZHN0ID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKIAogCWR3cnEtPmxlbmd0aCA9IDA7CkBAIC0xODkxLDkgKzE4ODcsNyBAQAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYWNsLT5tYWNfbGlzdCwgX2xpc3QpIHsKIAkJbWVtY3B5KGRzdC0+c2FfZGF0YSwgZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKIAkJZHN0LT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCWR3cnEtPmxlbmd0aCsrOwpAQCAtMTk2MCw3ICsxOTU0LDYgQEAKIHN0YXRpYyBpbnQKIHByaXNtNTRfbWFjX2FjY2VwdChzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsLCBjaGFyICptYWMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyOwogCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OwogCWludCByZXMgPSAwOwogCkBAIC0xOTcyLDggKzE5NjUsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dDsgcHRyICE9ICZhY2wtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZhY2wtPm1hY19saXN0LCBfbGlzdCkgewogCQlpZiAobWVtY21wKGVudHJ5LT5hZGRyLCBtYWMsIEVUSF9BTEVOKSA9PSAwKSB7CiAJCQlyZXMgPSAxOwogCQkJYnJlYWs7CkBAIC0yMjE2LDExICsyMjA4LDkgQEAKIHZvaWQKIHByaXNtNTRfd3BhX2Jzc19pZV9jbGVhbihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCXN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSAqYnNzLCAqbjsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG4sICZwcml2LT5ic3Nfd3BhX2xpc3QpIHsKLQkJc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llICpic3M7Ci0JCWJzcyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShic3MsIG4sICZwcml2LT5ic3Nfd3BhX2xpc3QsIGxpc3QpIHsKIAkJa2ZyZWUoYnNzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X3J0bDgyMjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfcnRsODIyNS5jCmluZGV4IGUyNWEwOWYuLmVmYzQxMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfcnRsODIyNS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfcnRsODIyNS5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJbXNsZWVwKDIpOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MjI1X3dyaXRlXzgwNTEoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1OCBhZGRyLCB1MTYgZGF0YSkKK3N0YXRpYyB2b2lkIHJ0bDgyMjVfd3JpdGVfODA1MShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHU4IGFkZHIsIF9fbGUxNiBkYXRhKQogewogCXN0cnVjdCBydGw4MTg3X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAJdTE2IHJlZzgwLCByZWc4MiwgcmVnODQ7CkBAIC0xMDYsNyArMTA2LDcgQEAKIAlzdHJ1Y3QgcnRsODE4N19wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCiAJaWYgKHByaXYtPmFzaWNfcmV2KQotCQlydGw4MjI1X3dyaXRlXzgwNTEoZGV2LCBhZGRyLCBkYXRhKTsKKwkJcnRsODIyNV93cml0ZV84MDUxKGRldiwgYWRkciwgY3B1X3RvX2xlMTYoZGF0YSkpOwogCWVsc2UKIAkJcnRsODIyNV93cml0ZV9iaXRiYW5nKGRldiwgYWRkciwgZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKaW5kZXggNWI2MjRiZi4uYzM5ZjE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYwpAQCAtNDksOCArNDksOSBAQAogCVpEX01FTUNMRUFSKGNoaXAsIHNpemVvZigqY2hpcCkpOwogfQogCi1zdGF0aWMgaW50IHNjbnByaW50X21hY19vdWkoY29uc3QgdTggKmFkZHIsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50IHNjbnByaW50X21hY19vdWkoc3RydWN0IHpkX2NoaXAgKmNoaXAsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CisJdTggKmFkZHIgPSB6ZF91c2JfdG9fbmV0ZGV2KCZjaGlwLT51c2IpLT5kZXZfYWRkcjsKIAlyZXR1cm4gc2NucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiUwMngtJTAyeC0lMDJ4IiwKIAkJICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSk7CiB9CkBAIC02MSwxMCArNjIsMTAgQEAKIAlpbnQgaSA9IDA7CiAKIAlpID0gc2NucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgInpkMTIxMSVzIGNoaXAgIiwKLQkJICAgICAgY2hpcC0+aXNfemQxMjExYiA/ICJiIiA6ICIiKTsKKwkJICAgICAgemRfY2hpcF9pc196ZDEyMTFiKGNoaXApID8gImIiIDogIiIpOwogCWkgKz0gemRfdXNiX3NjbnByaW50X2lkKCZjaGlwLT51c2IsIGJ1ZmZlcitpLCBzaXplLWkpOwogCWkgKz0gc2NucHJpbnRmKGJ1ZmZlcitpLCBzaXplLWksICIgIik7Ci0JaSArPSBzY25wcmludF9tYWNfb3VpKGNoaXAtPmUycF9tYWMsIGJ1ZmZlcitpLCBzaXplLWkpOworCWkgKz0gc2NucHJpbnRfbWFjX291aShjaGlwLCBidWZmZXIraSwgc2l6ZS1pKTsKIAlpICs9IHNjbnByaW50ZihidWZmZXIraSwgc2l6ZS1pLCAiICIpOwogCWkgKz0gemRfcmZfc2NucHJpbnRfaWQoJmNoaXAtPnJmLCBidWZmZXIraSwgc2l6ZS1pKTsKIAlpICs9IHNjbnByaW50ZihidWZmZXIraSwgc2l6ZS1pLCAiIHBhJTF4ICVjJWMlYyVjJWMiLCBjaGlwLT5wYV90eXBlLApAQCAtMzY2LDY0ICszNjcsOSBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgaW50IF9yZWFkX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIsCi0JICAgICAgICAgICAgICAgICAgY29uc3QgemRfYWRkcl90ICphZGRyKQotewotCWludCByOwotCXUzMiBwYXJ0c1syXTsKLQotCXIgPSB6ZF9pb3JlYWQzMnZfbG9ja2VkKGNoaXAsIHBhcnRzLCAoY29uc3QgemRfYWRkcl90ICopYWRkciwgMik7Ci0JaWYgKHIpIHsKLQkJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLAotCQkJImVycm9yOiBjb3VsZG4ndCByZWFkIGUycCBtYWNzLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQltYWNfYWRkclswXSA9IHBhcnRzWzBdOwotCW1hY19hZGRyWzFdID0gcGFydHNbMF0gPj4gIDg7Ci0JbWFjX2FkZHJbMl0gPSBwYXJ0c1swXSA+PiAxNjsKLQltYWNfYWRkclszXSA9IHBhcnRzWzBdID4+IDI0OwotCW1hY19hZGRyWzRdID0gcGFydHNbMV07Ci0JbWFjX2FkZHJbNV0gPSBwYXJ0c1sxXSA+PiAgODsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlYWRfZTJwX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwKQotewotCXN0YXRpYyBjb25zdCB6ZF9hZGRyX3QgYWRkclsyXSA9IHsgRTJQX01BQ19BRERSX1AxLCBFMlBfTUFDX0FERFJfUDIgfTsKLQotCVpEX0FTU0VSVChtdXRleF9pc19sb2NrZWQoJmNoaXAtPm11dGV4KSk7Ci0JcmV0dXJuIF9yZWFkX21hY19hZGRyKGNoaXAsIGNoaXAtPmUycF9tYWMsIChjb25zdCB6ZF9hZGRyX3QgKilhZGRyKTsKLX0KLQogLyogTUFDIGFkZHJlc3M6IGlmIGN1c3RvbSBtYWMgYWRkcmVzc2VzIGFyZSB0byB0byBiZSB1c2VkIENSX01BQ19BRERSX1AxIGFuZAogICogICAgICAgICAgICAgIENSX01BQ19BRERSX1AyIG11c3QgYmUgb3ZlcndyaXR0ZW4KICAqLwotdm9pZCB6ZF9nZXRfZTJwX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIpCi17Ci0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCW1lbWNweShtYWNfYWRkciwgY2hpcC0+ZTJwX21hYywgRVRIX0FMRU4pOwotCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IHJlYWRfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkcikKLXsKLQlzdGF0aWMgY29uc3QgemRfYWRkcl90IGFkZHJbMl0gPSB7IENSX01BQ19BRERSX1AxLCBDUl9NQUNfQUREUl9QMiB9OwotCXJldHVybiBfcmVhZF9tYWNfYWRkcihjaGlwLCBtYWNfYWRkciwgKGNvbnN0IHpkX2FkZHJfdCAqKWFkZHIpOwotfQotCi1pbnQgemRfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKQotewotCWludCByOwotCi0JZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiXG4iKTsKLQltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JciA9IHJlYWRfbWFjX2FkZHIoY2hpcCwgbWFjX2FkZHIpOwotCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwotCXJldHVybiByOwotfQotCiBpbnQgemRfd3JpdGVfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKIAlpbnQgcjsKQEAgLTQ0NCwxMiArMzkwLDYgQEAKIAogCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKIAlyID0gemRfaW93cml0ZTMyYV9sb2NrZWQoY2hpcCwgcmVxcywgQVJSQVlfU0laRShyZXFzKSk7Ci0jaWZkZWYgREVCVUcKLQl7Ci0JCXU4IHRtcFtFVEhfQUxFTl07Ci0JCXJlYWRfbWFjX2FkZHIoY2hpcCwgdG1wKTsKLQl9Ci0jZW5kaWYgLyogREVCVUcgKi8KIAltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKIAlyZXR1cm4gcjsKIH0KQEAgLTgwOSw3ICs3NDksNyBAQAogCiBzdGF0aWMgaW50IGh3X3Jlc2V0X3BoeShzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKIHsKLQlyZXR1cm4gY2hpcC0+aXNfemQxMjExYiA/IHpkMTIxMWJfaHdfcmVzZXRfcGh5KGNoaXApIDoKKwlyZXR1cm4gemRfY2hpcF9pc196ZDEyMTFiKGNoaXApID8gemQxMjExYl9od19yZXNldF9waHkoY2hpcCkgOgogCQkgICAgICAgICAgICAgICAgICB6ZDEyMTFfaHdfcmVzZXRfcGh5KGNoaXApOwogfQogCkBAIC04NzQsNyArODE0LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlyZXR1cm4gY2hpcC0+aXNfemQxMjExYiA/CisJcmV0dXJuIHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSA/CiAJCXpkMTIxMWJfaHdfaW5pdF9obWFjKGNoaXApIDogemQxMjExX2h3X2luaXRfaG1hYyhjaGlwKTsKIH0KIApAQCAtMTEzNiw4ICsxMDc2LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFJlYWQgbWFjIGFkZHJlc3MgdXNpbmcgcHJlLWZpcm13YXJlIGludGVyZmFjZSAqLworaW50IHpkX2NoaXBfcmVhZF9tYWNfYWRkcl9mdyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKmFkZHIpCit7CisJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiXG4iKTsKKwlyZXR1cm4gemRfdXNiX3JlYWRfZncoJmNoaXAtPnVzYiwgRTJQX01BQ19BRERSX1AxLCBhZGRyLAorCQlFVEhfQUxFTik7Cit9CiAKLWludCB6ZF9jaGlwX2luaXRfaHcoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4IGRldmljZV90eXBlKQoraW50IHpkX2NoaXBfaW5pdF9odyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKIHsKIAlpbnQgcjsKIAl1OCByZl90eXBlOwpAQCAtMTE0NSw3ICsxMDkyLDYgQEAKIAlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICJcbiIpOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWNoaXAtPmlzX3pkMTIxMWIgPSAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX1pEMTIxMUIpICE9IDA7CiAKICNpZmRlZiBERUJVRwogCXIgPSB0ZXN0X2luaXQoY2hpcCk7CkBAIC0xMjAxLDEwICsxMTQ3LDYgQEAKIAkJZ290byBvdXQ7CiAjZW5kaWYgLyogREVCVUcgKi8KIAotCXIgPSByZWFkX2UycF9tYWNfYWRkcihjaGlwKTsKLQlpZiAocikKLQkJZ290byBvdXQ7Ci0KIAlyID0gcmVhZF9jYWxfaW50X3RhYmxlcyhjaGlwKTsKIAlpZiAocikKIAkJZ290byBvdXQ7CkBAIC0xMjU5LDcgKzEyMDEsNyBAQAogCXIgPSB1cGRhdGVfcHdyX2ludChjaGlwLCBjaGFubmVsKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7Ci0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpIHsKKwlpZiAoemRfY2hpcF9pc196ZDEyMTFiKGNoaXApKSB7CiAJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNbXSA9IHsKIAkJCXsgQ1I2OSwgMHgyOCB9LAogCQkJe30sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKaW5kZXggNzlkMDI4OC4uZjQ2OTg1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaApAQCAtNzA0LDcgKzcwNCw2IEBACiAJc3RydWN0IG11dGV4IG11dGV4OwogCS8qIEJhc2UgYWRkcmVzcyBvZiBGV19SRUdfIHJlZ2lzdGVycyAqLwogCXpkX2FkZHJfdCBmd19yZWdzX2Jhc2U7Ci0JdTggZTJwX21hY1tFVEhfQUxFTl07CiAJLyogRWVwU2V0UG9pbnQgaW4gdGhlIHZlbmRvciBkcml2ZXIgKi8KIAl1OCBwd3JfY2FsX3ZhbHVlc1tFMlBfQ0hBTk5FTF9DT1VOVF07CiAJLyogaW50ZWdyYXRpb24gdmFsdWVzIGluIHRoZSB2ZW5kb3IgZHJpdmVyICovCkBAIC03MTUsNyArNzE0LDcgQEAKIAl1bnNpZ25lZCBpbnQgcGFfdHlwZTo0LAogCQlwYXRjaF9jY2tfZ2FpbjoxLCBwYXRjaF9jcjE1NzoxLCBwYXRjaF82bV9iYW5kX2VkZ2U6MSwKIAkJbmV3X3BoeV9sYXlvdXQ6MSwgYWwyMjMwc19iaXQ6MSwKLQkJaXNfemQxMjExYjoxLCBzdXBwb3J0c190eF9sZWQ6MTsKKwkJc3VwcG9ydHNfdHhfbGVkOjE7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB6ZF9jaGlwICp6ZF91c2JfdG9fY2hpcChzdHJ1Y3QgemRfdXNiICp1c2IpCkBAIC03MzQsOSArNzMzLDE1IEBACiAJICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiB2b2lkIHpkX2NoaXBfY2xlYXIoc3RydWN0IHpkX2NoaXAgKmNoaXApOwotaW50IHpkX2NoaXBfaW5pdF9odyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggZGV2aWNlX3R5cGUpOworaW50IHpkX2NoaXBfcmVhZF9tYWNfYWRkcl9mdyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKmFkZHIpOworaW50IHpkX2NoaXBfaW5pdF9odyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiBpbnQgemRfY2hpcF9yZXNldChzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IHpkX2NoaXBfaXNfemQxMjExYihzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gY2hpcC0+dXNiLmlzX3pkMTIxMWI7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHpkX2lvcmVhZDE2dl9sb2NrZWQoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHUxNiAqdmFsdWVzLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpkX2FkZHJfdCAqYWRkcmVzc2VzLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBjb3VudCkKQEAgLTgyNSw4ICs4MzAsNiBAQAogfQogdTggIHpkX2NoaXBfZ2V0X2NoYW5uZWwoc3RydWN0IHpkX2NoaXAgKmNoaXApOwogaW50IHpkX3JlYWRfcmVnZG9tYWluKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqcmVnZG9tYWluKTsKLXZvaWQgemRfZ2V0X2UycF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKTsKLWludCB6ZF9yZWFkX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIpOwogaW50IHpkX3dyaXRlX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBjb25zdCB1OCAqbWFjX2FkZHIpOwogaW50IHpkX2NoaXBfc3dpdGNoX3JhZGlvX29uKHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKIGludCB6ZF9jaGlwX3N3aXRjaF9yYWRpb19vZmYoc3RydWN0IHpkX2NoaXAgKmNoaXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwppbmRleCA2NzUzZDI0Li5mNmM0ODdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwpAQCAtODYsMzggKzg2LDQ2IEBACiAJcmV0dXJuIHI7CiB9CiAKLWludCB6ZF9tYWNfaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMsIHU4IGRldmljZV90eXBlKQoraW50IHpkX21hY19wcmVpbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYykKK3sKKwlpbnQgcjsKKwl1OCBhZGRyW0VUSF9BTEVOXTsKKworCXIgPSB6ZF9jaGlwX3JlYWRfbWFjX2FkZHJfZncoJm1hYy0+Y2hpcCwgYWRkcik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbWVtY3B5KG1hYy0+bmV0ZGV2LT5kZXZfYWRkciwgYWRkciwgRVRIX0FMRU4pOworCXJldHVybiAwOworfQorCitpbnQgemRfbWFjX2luaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjKQogewogCWludCByOwogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gJm1hYy0+Y2hpcDsKLQl1OCBhZGRyW0VUSF9BTEVOXTsKIAl1OCBkZWZhdWx0X3JlZ2RvbWFpbjsKIAogCXIgPSB6ZF9jaGlwX2VuYWJsZV9pbnQoY2hpcCk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0OwotCXIgPSB6ZF9jaGlwX2luaXRfaHcoY2hpcCwgZGV2aWNlX3R5cGUpOworCXIgPSB6ZF9jaGlwX2luaXRfaHcoY2hpcCk7CiAJaWYgKHIpCiAJCWdvdG8gZGlzYWJsZV9pbnQ7CiAKLQl6ZF9nZXRfZTJwX21hY19hZGRyKGNoaXAsIGFkZHIpOwotCXIgPSB6ZF93cml0ZV9tYWNfYWRkcihjaGlwLCBhZGRyKTsKLQlpZiAocikKLQkJZ290byBkaXNhYmxlX2ludDsKIAlaRF9BU1NFUlQoIWlycXNfZGlzYWJsZWQoKSk7Ci0Jc3Bpbl9sb2NrX2lycSgmbWFjLT5sb2NrKTsKLQltZW1jcHkobWFjLT5uZXRkZXYtPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtYWMtPmxvY2spOwogCiAJciA9IHpkX3JlYWRfcmVnZG9tYWluKGNoaXAsICZkZWZhdWx0X3JlZ2RvbWFpbik7CiAJaWYgKHIpCiAJCWdvdG8gZGlzYWJsZV9pbnQ7CiAJaWYgKCF6ZF9yZWdkb21haW5fc3VwcG9ydGVkKGRlZmF1bHRfcmVnZG9tYWluKSkgewotCQlkZXZfZGJnX2YoemRfbWFjX2RldihtYWMpLAotCQkJICAiUmVndWxhdG9yeSBEb21haW4gJSMwNHggaXMgbm90IHN1cHBvcnRlZC5cbiIsCi0JCSAgICAgICAgICBkZWZhdWx0X3JlZ2RvbWFpbik7Ci0JCXIgPSAtRUlOVkFMOwotCQlnb3RvIGRpc2FibGVfaW50OworCQkvKiBUaGUgdmVuZG9yIGRyaXZlciBvdmVycmlkZXMgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIGFuZAorCQkgKiBhbGxvd2VkIGNoYW5uZWwgcmVnaXN0ZXJzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmVzdHJpY3RzCisJCSAqIGF2YWlsYWJsZSBjaGFubmVscyB0byAxLTExIGV2ZXJ5d2hlcmUuIE1hdGNoIHRoZWlyCisJCSAqIHF1ZXN0aW9uYWJsZSBiZWhhdmlvdXIgb25seSBmb3IgcmVnZG9tYWlucyB3aGljaCB3ZSBkb24ndAorCQkgKiByZWNvZ25pc2UuICovCisJCWRldl93YXJuKHpkX21hY19kZXYobWFjKSwgICJVbnJlY29nbmlzZWQgcmVndWxhdG9yeSBkb21haW46ICIKKwkJCSIlIzA0eC4gRGVmYXVsdGluZyB0byBGQ0MuXG4iLCBkZWZhdWx0X3JlZ2RvbWFpbik7CisJCWRlZmF1bHRfcmVnZG9tYWluID0gWkRfUkVHRE9NQUlOX0ZDQzsKIAl9CiAJc3Bpbl9sb2NrX2lycSgmbWFjLT5sb2NrKTsKIAltYWMtPnJlZ2RvbWFpbiA9IG1hYy0+ZGVmYXVsdF9yZWdkb21haW4gPSBkZWZhdWx0X3JlZ2RvbWFpbjsKQEAgLTE2NCwxNCArMTcyLDI1IEBACiB7CiAJc3RydWN0IHpkX21hYyAqbWFjID0gemRfbmV0ZGV2X21hYyhuZXRkZXYpOwogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gJm1hYy0+Y2hpcDsKKwlzdHJ1Y3QgemRfdXNiICp1c2IgPSAmY2hpcC0+dXNiOwogCWludCByOwogCisJaWYgKCF1c2ItPmluaXRpYWxpemVkKSB7CisJCXIgPSB6ZF91c2JfaW5pdF9odyh1c2IpOworCQlpZiAocikKKwkJCWdvdG8gb3V0OworCX0KKwogCXRhc2tsZXRfZW5hYmxlKCZtYWMtPnJ4X3Rhc2tsZXQpOwogCiAJciA9IHpkX2NoaXBfZW5hYmxlX2ludChjaGlwKTsKIAlpZiAociA8IDApCiAJCWdvdG8gb3V0OwogCisJciA9IHpkX3dyaXRlX21hY19hZGRyKGNoaXAsIG5ldGRldi0+ZGV2X2FkZHIpOworCWlmIChyKQorCQlnb3RvIGRpc2FibGVfaW50OworCiAJciA9IHpkX2NoaXBfc2V0X2Jhc2ljX3JhdGVzKGNoaXAsIENSX1JBVEVTXzgwMjExQiB8IENSX1JBVEVTXzgwMjExRyk7CiAJaWYgKHIgPCAwKQogCQlnb3RvIGRpc2FibGVfaW50OwpAQCAtMjUxLDkgKzI3MCwxMSBAQAogCWRldl9kYmdfZih6ZF9tYWNfZGV2KG1hYyksCiAJCSAgIlNldHRpbmcgTUFDIHRvICIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGFkZHItPnNhX2RhdGEpKTsKIAotCXIgPSB6ZF93cml0ZV9tYWNfYWRkcihjaGlwLCBhZGRyLT5zYV9kYXRhKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7CisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJciA9IHpkX3dyaXRlX21hY19hZGRyKGNoaXAsIGFkZHItPnNhX2RhdGEpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOwpAQCAtODU1LDcgKzg3Niw3IEBACiAJLyogWkQxMjExQjogQ29tcHV0aW5nIHRoZSBsZW5ndGggZGlmZmVyZW5jZSB0aGlzIHdheSwgZ2l2ZXMgdXMKIAkgKiBmbGV4aWJpbGl0eSB0byBjb21wdXRlIHRoZSBwYWNrZXQgbGVuZ3RoLgogCSAqLwotCWNzLT5wYWNrZXRfbGVuZ3RoID0gY3B1X3RvX2xlMTYobWFjLT5jaGlwLmlzX3pkMTIxMWIgPworCWNzLT5wYWNrZXRfbGVuZ3RoID0gY3B1X3RvX2xlMTYoemRfY2hpcF9pc196ZDEyMTFiKCZtYWMtPmNoaXApID8KIAkJCXBhY2tldF9sZW5ndGggLSBmcmFnX2xlbiA6IHBhY2tldF9sZW5ndGgpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKaW5kZXggZmFmNGM3OC4uOWY5MzQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKQEAgLTE4OSw3ICsxODksOCBAQAogCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiB2b2lkIHpkX21hY19jbGVhcihzdHJ1Y3QgemRfbWFjICptYWMpOwogCi1pbnQgemRfbWFjX2luaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjLCB1OCBkZXZpY2VfdHlwZSk7CitpbnQgemRfbWFjX3ByZWluaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjKTsKK2ludCB6ZF9tYWNfaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMpOwogCiBpbnQgemRfbWFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBpbnQgemRfbWFjX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYwppbmRleCA3NDA3NDA5Li5hYmU1ZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAlbQUwyMjEwX1JGXQk9ICJBTDIyMTBfUkYiLAogCVtNQVhJTV9ORVdfUkZdCT0gIk1BWElNX05FV19SRiIsCiAJW1VXMjQ1M19SRl0JPSAiVVcyNDUzX1JGIiwKLQlbVU5LTk9XTl9BX1JGXQk9ICJVTktOT1dOX0FfUkYiLAorCVtBTDIyMzBTX1JGXQk9ICJBTDIyMzBTX1JGIiwKIAlbUkFMSU5LX1JGXQk9ICJSQUxJTktfUkYiLAogCVtJTlRFUlNJTF9SRl0JPSAiSU5URVJTSUxfUkYiLAogCVtSRjI5NTlfUkZdCT0gIlJGMjk1OV9SRiIsCkBAIC03Nyw2ICs3Nyw3IEBACiAJCXIgPSB6ZF9yZl9pbml0X3JmMjk1OShyZik7CiAJCWJyZWFrOwogCWNhc2UgQUwyMjMwX1JGOgorCWNhc2UgQUwyMjMwU19SRjoKIAkJciA9IHpkX3JmX2luaXRfYWwyMjMwKHJmKTsKIAkJYnJlYWs7CiAJY2FzZSBBTDcyMzBCX1JGOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmgKaW5kZXggYzZkZmQ4Mi4uMzA1MDJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oCkBAIC0yNiw3ICsyNiw3IEBACiAjZGVmaW5lIEFMMjIxMF9SRgkJCTB4NwogI2RlZmluZSBNQVhJTV9ORVdfUkYJCQkweDgKICNkZWZpbmUgVVcyNDUzX1JGCQkJMHg5Ci0jZGVmaW5lIFVOS05PV05fQV9SRgkJCTB4YQorI2RlZmluZSBBTDIyMzBTX1JGCQkJMHhhCiAjZGVmaW5lIFJBTElOS19SRgkJCTB4YgogI2RlZmluZSBJTlRFUlNJTF9SRgkJCTB4YwogI2RlZmluZSBSRjI5NTlfUkYJCQkweGQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKaW5kZXggZTdhNGVjZi4uMDA2Nzc0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlICJ6ZF91c2IuaCIKICNpbmNsdWRlICJ6ZF9jaGlwLmgiCiAKKyNkZWZpbmUgSVNfQUwyMjMwUyhjaGlwKSAoKGNoaXApLT5hbDIyMzBzX2JpdCB8fCAoY2hpcCktPnJmLnR5cGUgPT0gQUwyMjMwU19SRikKKwogc3RhdGljIGNvbnN0IHUzMiB6ZDEyMTFfYWwyMjMwX3RhYmxlW11bM10gPSB7CiAJUkZfQ0hBTk5FTCggMSkgPSB7IDB4MDNmNzkwLCAweDAzMzMzMSwgMHgwMDAwMGQsIH0sCiAJUkZfQ0hBTk5FTCggMikgPSB7IDB4MDNmNzkwLCAweDBiMzMzMSwgMHgwMDAwMGQsIH0sCkBAIC0xNzYsNyArMTc4LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlpZiAoY2hpcC0+YWwyMjMwc19iaXQpIHsKKwlpZiAoSVNfQUwyMjMwUyhjaGlwKSkgewogCQlyID0gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzX2luaXRfYWwyMjMwcywKIAkJCUFSUkFZX1NJWkUoaW9yZXFzX2luaXRfYWwyMjMwcykpOwogCQlpZiAocikKQEAgLTE4OCw3ICsxOTAsNyBAQAogCQlyZXR1cm4gcjsKIAogCS8qIGltcHJvdmUgYmFuZCBlZGdlIGZvciBBTDIyMzBTICovCi0JaWYgKGNoaXAtPmFsMjIzMHNfYml0KQorCWlmIChJU19BTDIyMzBTKGNoaXApKQogCQlyID0gemRfcmZ3cml0ZV9sb2NrZWQoY2hpcCwgMHgwMDA4MjQsIFJGX1JWX0JJVFMpOwogCWVsc2UKIAkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MDAwNWE0LCBSRl9SVl9CSVRTKTsKQEAgLTMxNCw3ICszMTYsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkgeworCWlmIChJU19BTDIyMzBTKGNoaXApKSB7CiAJCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfaW5pdF9hbDIyMzBzLAogCQkJQVJSQVlfU0laRShpb3JlcXNfaW5pdF9hbDIyMzBzKSk7CiAJCWlmIChyKQpAQCAtMzI4LDcgKzMzMCw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaWYgKGNoaXAtPmFsMjIzMHNfYml0KQorCWlmIChJU19BTDIyMzBTKGNoaXApKQogCQlyID0gemRfcmZ3cml0ZV9sb2NrZWQoY2hpcCwgMHgyNDEwMDAsIFJGX1JWX0JJVFMpOwogCWVsc2UKIAkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MjVhMDAwLCBSRl9SVl9CSVRTKTsKQEAgLTQyMiw3ICs0MjQsNyBAQAogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CiAKIAlyZi0+c3dpdGNoX3JhZGlvX29mZiA9IGFsMjIzMF9zd2l0Y2hfcmFkaW9fb2ZmOwotCWlmIChjaGlwLT5pc196ZDEyMTFiKSB7CisJaWYgKHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSkgewogCQlyZi0+aW5pdF9odyA9IHpkMTIxMWJfYWwyMjMwX2luaXRfaHc7CiAJCXJmLT5zZXRfY2hhbm5lbCA9IHpkMTIxMWJfYWwyMjMwX3NldF9jaGFubmVsOwogCQlyZi0+c3dpdGNoX3JhZGlvX29uID0gemQxMjExYl9hbDIyMzBfc3dpdGNoX3JhZGlvX29uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jCmluZGV4IGY0ZThiNmEuLjczZDBiYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsNzIzMGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDcyMzBiLmMKQEAgLTQ3Myw3ICs0NzMsNyBAQAogewogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CiAKLQlpZiAoY2hpcC0+aXNfemQxMjExYikgeworCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpIHsKIAkJcmYtPmluaXRfaHcgPSB6ZDEyMTFiX2FsNzIzMGJfaW5pdF9odzsKIAkJcmYtPnN3aXRjaF9yYWRpb19vbiA9IHpkMTIxMWJfYWw3MjMwYl9zd2l0Y2hfcmFkaW9fb247CiAJCXJmLT5zZXRfY2hhbm5lbCA9IHpkMTIxMWJfYWw3MjMwYl9zZXRfY2hhbm5lbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3JmMjk1OS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfcmYyOTU5LmMKaW5kZXggMmQ3MzZiZC4uY2M3MGQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfcmYyOTU5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfcmYyOTU5LmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogewogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CiAKLQlpZiAoY2hpcC0+aXNfemQxMjExYikgeworCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpIHsKIAkJZGV2X2Vycih6ZF9jaGlwX2RldihjaGlwKSwKIAkJICAgICAgICJSRjI5NTkgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZm9yIFpEMTIxMUIiCiAJCSAgICAgICAiIGRldmljZXNcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfdXcyNDUzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl91dzI0NTMuYwppbmRleCA0MTRlNDBkLi44NTdkY2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl91dzI0NTMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl91dzI0NTMuYwpAQCAtNDg2LDcgKzQ4Niw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpCisJaWYgKHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSkKIAkJaW9yZXFzWzFdLnZhbHVlID0gMHg3ZjsKIAogCXJldHVybiB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCmluZGV4IGNhMjQyOTkuLjI4ZDQxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCkBAIC03MSw2ICs3MSw3IEBACiAJeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDEyKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MTMpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCXsgVVNCX0RFVklDRSgweDAwNTMsIDB4NTMwMSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCisJeyBVU0JfREVWSUNFKDB4MDQxMSwgMHgwMGRhKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAkvKiAiRHJpdmVybGVzcyIgZGV2aWNlcyB0aGF0IG5lZWQgZWplY3RpbmcgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYWNlLCAweDIwMTEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfSU5TVEFMTEVSIH0sCiAJeyBVU0JfREVWSUNFKDB4MGFjZSwgMHgyMGZmKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX0lOU1RBTExFUiB9LApAQCAtMTk1LDI2ICsxOTYsMjcgQEAKIAlyZXR1cm4gbGUxNl90b19jcHUocFtvZmZzZXRdKTsKIH0KIAotc3RhdGljIGNoYXIgKmdldF9md19uYW1lKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHU4IGRldmljZV90eXBlLAorc3RhdGljIGNoYXIgKmdldF9md19uYW1lKHN0cnVjdCB6ZF91c2IgKnVzYiwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKIAkgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwb3N0Zml4KQogewogCXNjbnByaW50ZihidWZmZXIsIHNpemUsICIlcyVzIiwKLQkJZGV2aWNlX3R5cGUgPT0gREVWSUNFX1pEMTIxMUIgPworCQl1c2ItPmlzX3pkMTIxMWIgPwogCQkJRldfWkQxMjExQl9QUkVGSVggOiBGV19aRDEyMTFfUFJFRklYLAogCQlwb3N0Zml4KTsKIAlyZXR1cm4gYnVmZmVyOwogfQogCi1zdGF0aWMgaW50IGhhbmRsZV92ZXJzaW9uX21pc21hdGNoKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCBkZXZpY2VfdHlwZSwKK3N0YXRpYyBpbnQgaGFuZGxlX3ZlcnNpb25fbWlzbWF0Y2goc3RydWN0IHpkX3VzYiAqdXNiLAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWJfZncpCiB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICp1cl9mdyA9IE5VTEw7CiAJaW50IG9mZnNldDsKIAlpbnQgciA9IDA7CiAJY2hhciBmd19uYW1lWzEyOF07CiAKIAlyID0gcmVxdWVzdF9md19maWxlKCZ1cl9mdywKLQkJZ2V0X2Z3X25hbWUoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCBkZXZpY2VfdHlwZSwgInVyIiksCisJCWdldF9md19uYW1lKHVzYiwgZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAidXIiKSwKIAkJJnVkZXYtPmRldik7CiAJaWYgKHIpCiAJCWdvdG8gZXJyb3I7CkBAIC0yMzcsMTEgKzIzOSwxMiBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgaW50IHVwbG9hZF9maXJtd2FyZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggZGV2aWNlX3R5cGUpCitzdGF0aWMgaW50IHVwbG9hZF9maXJtd2FyZShzdHJ1Y3QgemRfdXNiICp1c2IpCiB7CiAJaW50IHI7CiAJdTE2IGZ3X2JjZERldmljZTsKIAl1MTYgYmNkRGV2aWNlOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gemRfdXNiX3RvX3VzYmRldih1c2IpOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWJfZncgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdXBoX2Z3ID0gTlVMTDsKIAljaGFyIGZ3X25hbWVbMTI4XTsKQEAgLTI0OSw3ICsyNTIsNyBAQAogCWJjZERldmljZSA9IGdldF9iY2REZXZpY2UodWRldik7CiAKIAlyID0gcmVxdWVzdF9md19maWxlKCZ1Yl9mdywKLQkJZ2V0X2Z3X25hbWUoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCBkZXZpY2VfdHlwZSwgICJ1YiIpLAorCQlnZXRfZndfbmFtZSh1c2IsIGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInViIiksCiAJCSZ1ZGV2LT5kZXYpOwogCWlmIChyKQogCQlnb3RvIGVycm9yOwpAQCAtMjY0LDcgKzI2Nyw3IEBACiAJCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiZGV2aWNlIGhhcyBvbGQgYm9vdGNvZGUsIHBsZWFzZSAiCiAJCQkJInJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmVcbiIpOwogCi0JCXIgPSBoYW5kbGVfdmVyc2lvbl9taXNtYXRjaCh1ZGV2LCBkZXZpY2VfdHlwZSwgdWJfZncpOworCQlyID0gaGFuZGxlX3ZlcnNpb25fbWlzbWF0Y2godXNiLCB1Yl9mdyk7CiAJCWlmIChyKQogCQkJZ290byBlcnJvcjsKIAl9IGVsc2UgewpAQCAtMjc1LDcgKzI3OCw3IEBACiAKIAogCXIgPSByZXF1ZXN0X2Z3X2ZpbGUoJnVwaF9mdywKLQkJZ2V0X2Z3X25hbWUoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCBkZXZpY2VfdHlwZSwgInVwaHIiKSwKKwkJZ2V0X2Z3X25hbWUodXNiLCBmd19uYW1lLCBzaXplb2YoZndfbmFtZSksICJ1cGhyIiksCiAJCSZ1ZGV2LT5kZXYpOwogCWlmIChyKQogCQlnb3RvIGVycm9yOwpAQCAtMjk0LDYgKzI5NywzMCBAQAogCXJldHVybiByOwogfQogCisvKiBSZWFkIGRhdGEgZnJvbSBkZXZpY2UgYWRkcmVzcyBzcGFjZSB1c2luZyAiZmlybXdhcmUgaW50ZXJmYWNlIiB3aGljaCBkb2VzCisgKiBub3QgcmVxdWlyZSBmaXJtd2FyZSB0byBiZSBsb2FkZWQuICovCitpbnQgemRfdXNiX3JlYWRfZncoc3RydWN0IHpkX3VzYiAqdXNiLCB6ZF9hZGRyX3QgYWRkciwgdTggKmRhdGEsIHUxNiBsZW4pCit7CisJaW50IHI7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7CisKKwlyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJVVNCX1JFUV9GSVJNV0FSRV9SRUFEX0RBVEEsIFVTQl9ESVJfSU4gfCAweDQwLCBhZGRyLCAwLAorCQlkYXRhLCBsZW4sIDUwMDApOworCWlmIChyIDwgMCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQkicmVhZCBvdmVyIGZpcm13YXJlIGludGVyZmFjZSBmYWlsZWQ6ICVkXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfSBlbHNlIGlmIChyICE9IGxlbikgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQkiaW5jb21wbGV0ZSByZWFkIG92ZXIgZmlybXdhcmUgaW50ZXJmYWNlOiAlZC8lZFxuIiwKKwkJCXIsIGxlbik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCiAjZGVmaW5lIHVyYl9kZXYodXJiKSAoJih1cmIpLT5kZXYtPmRldikKIAogc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9yZWdzX2ludChzdHJ1Y3QgdXJiICp1cmIpCkBAIC05MjAsOSArOTQ3LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCB6ZF91c2JfaW5pdF9odyhzdHJ1Y3QgemRfdXNiICp1c2IpCit7CisJaW50IHI7CisJc3RydWN0IHpkX21hYyAqbWFjID0gemRfdXNiX3RvX21hYyh1c2IpOworCisJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwgIlxuIik7CisKKwlyID0gdXBsb2FkX2Zpcm13YXJlKHVzYik7CisJaWYgKHIpIHsKKwkJZGV2X2Vycih6ZF91c2JfZGV2KHVzYiksCisJCSAgICAgICAiY291bGRuJ3QgbG9hZCBmaXJtd2FyZS4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKHpkX3VzYl90b191c2JkZXYodXNiKSk7CisJaWYgKHIpIHsKKwkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwKKwkJCSJjb3VsZG4ndCByZXNldCBjb25maWd1cmF0aW9uLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gemRfbWFjX2luaXRfaHcobWFjKTsKKwlpZiAocikgeworCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAorCQkgICAgICAgICAiY291bGRuJ3QgaW5pdGlhbGl6ZSBtYWMuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXJldHVybiByOworCX0KKworCXVzYi0+aW5pdGlhbGl6ZWQgPSAxOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHByb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IHI7CisJc3RydWN0IHpkX3VzYiAqdXNiOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKIApAQCAtOTUwLDI2ICsxMDEwLDEwIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JciA9IHVwbG9hZF9maXJtd2FyZSh1ZGV2LCBpZC0+ZHJpdmVyX2luZm8pOwotCWlmIChyKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwKLQkJICAgICAgICJjb3VsZG4ndCBsb2FkIGZpcm13YXJlLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwotCQlnb3RvIGVycm9yOwotCX0KKwl1c2IgPSAmemRfbmV0ZGV2X21hYyhuZXRkZXYpLT5jaGlwLnVzYjsKKwl1c2ItPmlzX3pkMTIxMWIgPSAoaWQtPmRyaXZlcl9pbmZvID09IERFVklDRV9aRDEyMTFCKSAhPSAwOwogCi0JciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKHVkZXYpOwotCWlmIChyKSB7Ci0JCWRldl9kYmdfZigmaW50Zi0+ZGV2LAotCQkJImNvdWxkbid0IHJlc2V0IGNvbmZpZ3VyYXRpb24uIEVycm9yIG51bWJlciAlZFxuIiwgcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogQXQgdGhpcyBwb2ludCB0aGUgaW50ZXJydXB0IGVuZHBvaW50IGlzIG5vdCBnZW5lcmFsbHkgZW5hYmxlZC4gV2UKLQkgKiBzYXZlIHRoZSBVU0IgYmFuZHdpZHRoIHVudGlsIHRoZSBuZXR3b3JrIGRldmljZSBpcyBvcGVuZWQuIEJ1dAotCSAqIG5vdGlmeSB0aGF0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgTUFDIHdpbGwgcmVxdWlyZSB0aGUKLQkgKiBpbnRlcnJ1cHRzIHRvIGJlIHRlbXBvcmFyeSBlbmFibGVkLgotCSAqLwotCXIgPSB6ZF9tYWNfaW5pdF9odyh6ZF9uZXRkZXZfbWFjKG5ldGRldiksIGlkLT5kcml2ZXJfaW5mbyk7CisJciA9IHpkX21hY19wcmVpbml0X2h3KHpkX25ldGRldl9tYWMobmV0ZGV2KSk7CiAJaWYgKHIpIHsKIAkJZGV2X2RiZ19mKCZpbnRmLT5kZXYsCiAJCSAgICAgICAgICJjb3VsZG4ndCBpbml0aWFsaXplIG1hYy4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKaW5kZXggNTA2ZWE2YS4uOTYxYTdhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKQEAgLTE4OCw2ICsxODgsNyBAQAogCXN0cnVjdCB6ZF91c2Jfcnggcng7CiAJc3RydWN0IHpkX3VzYl90eCB0eDsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwl1OCBpc196ZDEyMTFiOjEsIGluaXRpYWxpemVkOjE7CiB9OwogCiAjZGVmaW5lIHpkX3VzYl9kZXYodXNiKSAoJnVzYi0+aW50Zi0+ZGV2KQpAQCAtMjM2LDYgKzIzNyw4IEBACiAKIGludCB6ZF91c2JfcmZ3cml0ZShzdHJ1Y3QgemRfdXNiICp1c2IsIHUzMiB2YWx1ZSwgdTggYml0cyk7CiAKK2ludCB6ZF91c2JfcmVhZF9mdyhzdHJ1Y3QgemRfdXNiICp1c2IsIHpkX2FkZHJfdCBhZGRyLCB1OCAqZGF0YSwgdTE2IGxlbik7CisKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqemRfd29ya3F1ZXVlOwogCiAjZW5kaWYgLyogX1pEX1VTQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCmluZGV4IGY0NmM2OWUuLjA5YzkzZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCkBAIC01LDExICs1LDkgQEAKICMgUGFycG9ydCBjb25maWd1cmF0aW9uLgogIwogCi1tZW51ICJQYXJhbGxlbCBwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFBBUlBPUlQKK21lbnVjb25maWcgUEFSUE9SVAogCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugd2FudCB0byB1c2UgZGV2aWNlcyBjb25uZWN0ZWQgdG8geW91ciBtYWNoaW5lJ3MgcGFyYWxsZWwgcG9ydAogCSAgKHRoZSBjb25uZWN0b3IgYXQgdGhlIGNvbXB1dGVyIHdpdGggMjUgaG9sZXMpLCBlLmcuIHByaW50ZXIsIFpJUApAQCAtMzMsOSArMzEsMTEgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAoraWYgUEFSUE9SVAorCiBjb25maWcgUEFSUE9SVF9QQwogCXRyaXN0YXRlICJQQy1zdHlsZSBoYXJkd2FyZSIKLQlkZXBlbmRzIG9uIFBBUlBPUlQgJiYgKCFTUEFSQzY0IHx8IFBDSSkgJiYgIVNQQVJDMzIgJiYgIU0zMlIgJiYgIUZSVgorCWRlcGVuZHMgb24gKCFTUEFSQzY0IHx8IFBDSSkgJiYgIVNQQVJDMzIgJiYgIU0zMlIgJiYgIUZSVgogCS0tLWhlbHAtLS0KIAkgIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBDLXN0eWxlIHBhcmFsbGVsIHBvcnQuIEFsbAogCSAgSUJNIFBDIGNvbXBhdGlibGUgY29tcHV0ZXJzIGFuZCBzb21lIEFscGhhcyBoYXZlIFBDLXN0eWxlCkBAIC04NSw3ICs4NSw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0lQMzIKIAl0cmlzdGF0ZSAiU0dJIElQMzIgYnVpbHRpbiBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gU0dJX0lQMzIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFNHSV9JUDMyICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgdGhlIHBhcmFsbGVsIHBvcnQgb24KQEAgLTk0LDcgKzk0LDcgQEAKIAogY29uZmlnIFBBUlBPUlRfQU1JR0EKIAl0cmlzdGF0ZSAiQW1pZ2EgYnVpbHRpbiBwb3J0IgotCWRlcGVuZHMgb24gQU1JR0EgJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gQU1JR0EKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogY29uZmlnIFBBUlBPUlRfTUZDMwogCXRyaXN0YXRlICJNdWx0aWZhY2UgSUlJIHBhcmFsbGVsIHBvcnQiCi0JZGVwZW5kcyBvbiBaT1JSTyAmJiBQQVJQT1JUCisJZGVwZW5kcyBvbiBaT1JSTwogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgcGFyYWxsZWwgcG9ydCBzdXBwb3J0IGZvciB0aGUgTUZDMyBjYXJkLgpAQCAtMTEyLDcgKzExMiw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0FUQVJJCiAJdHJpc3RhdGUgIkF0YXJpIGhhcmR3YXJlIgotCWRlcGVuZHMgb24gQVRBUkkgJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gQVRBUkkKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xMjIsMTIgKzEyMiwxMSBAQAogY29uZmlnIFBBUlBPUlRfR1NDCiAJdHJpc3RhdGUKIAlkZWZhdWx0IEdTQwotCWRlcGVuZHMgb24gUEFSUE9SVAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCiBjb25maWcgUEFSUE9SVF9TVU5CUFAKIAl0cmlzdGF0ZSAiU3BhcmMgaGFyZHdhcmUgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBTQlVTICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBTQlVTICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBiaWRpcmVjdGlvbmFsIHBhcmFsbGVsIHBvcnQKQEAgLTEzNiw3ICsxMzUsNiBAQAogCiBjb25maWcgUEFSUE9SVF9BWDg4Nzk2CiAJdHJpc3RhdGUgIkFYODg3OTYgUGFyYWxsZWwgUG9ydCIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xNDgsNyArMTQ2LDYgQEAKIAogY29uZmlnIFBBUlBPUlRfMTI4NAogCWJvb2wgIklFRUUgMTI4NCB0cmFuc2ZlciBtb2RlcyIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIHByaW50ZXIgdGhhdCBzdXBwb3J0cyBzdGF0dXMgcmVhZGJhY2sgb3IgZGV2aWNlIElELCBvcgogCSAgd2FudCB0byB1c2UgYSBkZXZpY2UgdGhhdCB1c2VzIGVuaGFuY2VkIHBhcmFsbGVsIHBvcnQgdHJhbnNmZXIgbW9kZXMKQEAgLTE1OSw1ICsxNTYsNCBAQAogY29uZmlnIFBBUlBPUlRfTk9UX1BDCiAJYm9vbAogCi1lbmRtZW51Ci0KK2VuZGlmICMgUEFSUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKaW5kZXggN2JmYmFkNS4uNWQ1OGFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCkBAIC0yNDI0LDcgKzI0MjQsNiBAQAogCXUzMiBpdGU4ODcyc2V0OwogCXUzMiBpdGU4ODcyX2xwdCwgaXRlODg3Ml9scHRoaTsKIAl1OCBpdGU4ODcyX2lycSwgdHlwZTsKLQljaGFyICpmYWtlX25hbWUgPSAicGFycG9ydCBwcm9iZSI7CiAJaW50IGlycTsKIAlpbnQgaTsKIApAQCAtMjQzMiwxMSArMjQzMSwxMSBAQAogCQogCS8vIG1ha2Ugc3VyZSB3aGljaCBvbmUgY2hpcAogCWZvcihpID0gMDsgaSA8IDU7IGkrKykgewotCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMHg4LCBmYWtlX25hbWUpOworCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMzIsICJpdDg4N3giKTsKIAkJaWYgKGJhc2VfcmVzKSB7CiAJCQlpbnQgdGVzdDsKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4NjAsCi0JCQkJCQkweGU3MDAwMDAwIHwgaW50YV9hZGRyW2ldKTsKKwkJCQkJCTB4ZTUwMDAwMDAgfCBpbnRhX2FkZHJbaV0pOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAocGRldiwgMHg3OCwKIAkJCQkJCTB4MDAwMDAwMDAgfCBpbnRhX2FkZHJbaV0pOwogCQkJdGVzdCA9IGluYiAoaW50YV9hZGRyW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKaW5kZXggYmIzYzEwMS4uZGViNmI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKQEAgLTE1OSw4ICsxNTksOCBAQAogCS8qIENsYWltIG5ldyBidXMgcmVzb3VyY2VzICovCiAJcGNpYmlvc19jbGFpbV9vbmVfYnVzKGRldi0+YnVzKTsKIAotCS8qIGlvcmVtYXAoKSBmb3IgY2hpbGQgYnVzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBzdWNjZWVkICovCi0JcmVtYXBfYnVzX3JhbmdlKGRldi0+c3Vib3JkaW5hdGUpOworCS8qIE1hcCBJTyBzcGFjZSBmb3IgY2hpbGQgYnVzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBzdWNjZWVkICovCisJcGNpYmlvc19tYXBfaW9fc3BhY2UoZGV2LT5zdWJvcmRpbmF0ZSk7CiAKIAkvKiBBZGQgbmV3IGRldmljZXMgdG8gZ2xvYmFsIGxpc3RzLiAgUmVnaXN0ZXIgaW4gcHJvYywgc3lzZnMuICovCiAJcGNpX2J1c19hZGRfZGV2aWNlcyhwaGItPmJ1cyk7CkBAIC0zOTAsNyArMzkwLDcgQEAKIAl9IGVsc2UKIAkJcGNpYmlvc19yZW1vdmVfcGNpX2RldmljZXMoYnVzKTsKIAotCWlmICh1bm1hcF9idXNfcmFuZ2UoYnVzKSkgeworCWlmIChwY2liaW9zX3VubWFwX2lvX3NwYWNlKGJ1cykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVubWFwIGJ1cyByYW5nZVxuIiwKIAkJCV9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRVJBTkdFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwppbmRleCAxMGRiZGVjLi4xYjdiMjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKIHN0YXRpYyBpbnQgc3lzZnNfaW5pdGlhbGl6ZWQ7CS8qID0gMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggYTdiY2U3NS4uMzRiOGRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0yMiw2ICsyMiwxOCBAQAogCiBMSVNUX0hFQUQocGNpX2RldmljZXMpOwogCisvKgorICogU29tZSBkZXZpY2UgZHJpdmVycyBuZWVkIGtub3cgaWYgcGNpIGlzIGluaXRpYXRlZC4KKyAqIEJhc2ljYWxseSwgd2UgdGhpbmsgcGNpIGlzIG5vdCBpbml0aWF0ZWQgd2hlbiB0aGVyZQorICogaXMgbm8gZGV2aWNlIGluIGxpc3Qgb2YgcGNpX2RldmljZXMuCisgKi8KK2ludCBub19wY2lfZGV2aWNlcyh2b2lkKQoreworCXJldHVybiBsaXN0X2VtcHR5KCZwY2lfZGV2aWNlcyk7Cit9CisKK0VYUE9SVF9TWU1CT0wobm9fcGNpX2RldmljZXMpOworCiAjaWZkZWYgSEFWRV9QQ0lfTEVHQUNZCiAvKioKICAqIHBjaV9jcmVhdGVfbGVnYWN5X2ZpbGVzIC0gY3JlYXRlIGxlZ2FjeSBJL08gcG9ydCBhbmQgbWVtb3J5IGZpbGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9jLmMgYi9kcml2ZXJzL3BjaS9wcm9jLmMKaW5kZXggY2ZhMGRmZS4uOTBhZGM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYy5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2MuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgInBjaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2VhcmNoLmMgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwppbmRleCA5ZjcwOTBmLi5jNmU3OWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZWFyY2guYworKysgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJICogY2FuIGNhdXNlIHNvbWUgbWFjaGluZXMgdG8gY3Jhc2guICBTbyBoZXJlIHdlIGRldGVjdCBhbmQgZmxhZyB0aGF0CiAJICogc2l0dWF0aW9uIGFuZCBiYWlsIG91dCBlYXJseS4KIAkgKi8KLQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmcGNpX2RldmljZXMpKSkKKwlpZiAodW5saWtlbHkobm9fcGNpX2RldmljZXMoKSkpCiAJCXJldHVybiBOVUxMOwogCWRvd25fcmVhZCgmcGNpX2J1c19zZW0pOwogCW4gPSBmcm9tID8gZnJvbS0+Z2xvYmFsX2xpc3QubmV4dCA6IHBjaV9kZXZpY2VzLm5leHQ7CkBAIC0yNzcsNyArMjc3LDcgQEAKIAkgKiBjYW4gY2F1c2Ugc29tZSBtYWNoaW5lcyB0byBjcmFzaC4gIFNvIGhlcmUgd2UgZGV0ZWN0IGFuZCBmbGFnIHRoYXQKIAkgKiBzaXR1YXRpb24gYW5kIGJhaWwgb3V0IGVhcmx5LgogCSAqLwotCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZwY2lfZGV2aWNlcykpKQorCWlmICh1bmxpa2VseShub19wY2lfZGV2aWNlcygpKSkKIAkJcmV0dXJuIE5VTEw7CiAJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJbiA9IGZyb20gPyBmcm9tLT5nbG9iYWxfbGlzdC5uZXh0IDogcGNpX2RldmljZXMubmV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcgYi9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCmluZGV4IDM1Zjg4NjQuLmMwYzc3ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKKysrIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwpAQCAtMTgwLDE0ICsxODAsMTUgQEAKIAkgIFBDTUNJQSBjYXJkcyBhcmUgcGx1Z2dlZCBpbnRvLiBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgUENNQ0lBX004WFgKLSAgICAgICAgdHJpc3RhdGUgIk1QQzh4eCBQQ01DSUEgc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBQQ01DSUEgJiYgUFBDICYmIDh4eCAKLSAgICAgICAgc2VsZWN0IFBDQ0FSRF9JT0RZTgotICAgICAgICBoZWxwCi0gICAgICAgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBQb3dlclBDIDh4eCBzZXJpZXMgUENNQ0lBCi0gICAgICAgIGNvbnRyb2xsZXIuCisJdHJpc3RhdGUgIk1QQzh4eCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiBQUEMgJiYgOHh4CisJc2VsZWN0IFBDQ0FSRF9JT0RZTgorCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFBvd2VyUEMgOHh4IHNlcmllcyBQQ01DSUEKKwkgIGNvbnRyb2xsZXIuCiAKLSAgICAgICAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgY2FsbGVkIG04eHhfcGNtY2lhLgorCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgY2FsbGVkIG04eHhfcGNtY2lhLgogCiBjb25maWcgSEQ2NDQ2NV9QQ01DSUEKIAl0cmlzdGF0ZSAiSEQ2NDQ2NSBob3N0IGJyaWRnZSBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY3MuYyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKaW5kZXggNTBjYWQzYS4uN2M5M2ExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvY3MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jcy5jCkBAIC02NTEsNiArNjUxLDcgQEAKIAlhZGRfd2FpdF9xdWV1ZSgmc2t0LT50aHJlYWRfd2FpdCwgJndhaXQpOwogCWNvbXBsZXRlKCZza3QtPnRocmVhZF9kb25lKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXVuc2lnbmVkIGludCBldmVudHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jIGIvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYwppbmRleCA5NzIxZWQ3Li4zYzQ1MTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIEZ1cnRoZXIgZml4ZXMsIHYyLjYga2VybmVsIHBvcnQKICAqICAgICA8bWFyY2Vsby50b3NhdHRpQGN5Y2xhZGVzLmNvbT4KICAqIAotICogU29tZSBmaXhlcywgYWRkaXRpb25zIChDKSAyMDA1IE1vbnRhdmlzdGEgU29mdHdhcmUsIEluYy4gCisgKiBTb21lIGZpeGVzLCBhZGRpdGlvbnMgKEMpIDIwMDUtMjAwNyBNb250YXZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKiAgICAgPHZib3JkdWdAcnUubXZpc3RhLmNvbT4KICAqCiAgKiAiVGhlIEV4Q0Egc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgc29ja2V0IGNvbnRyb2xsZXJzIHNob3VsZCBwcm92aWRlCkBAIC00MCwxMCArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC01MSwxMSArNDcsMTggQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21wYzh4eC5oPgogI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2ZzX3BkLmg+CisjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KQEAgLTExMCw3ICsxMTMsNyBAQAogI2RlZmluZSBDT05GSUdfUENNQ0lBX1NMT1RfQgogI2VuZGlmCiAKLSNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQSkgJiYgIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0IpICovCisjZW5kaWYJCQkJLyogIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0EpICYmICFkZWZpbmVkKENPTkZJR19QQ01DSUFfU0xPVF9CKSAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQSkgJiYgZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQikKIApAQCAtMTQzLDMwICsxNDYsMjAgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jZGVmaW5lIFBDTUNJQV9NRU1fV0lOX0JBU0UgMHhlMDAwMDAwMCAvKiBiYXNlIGFkZHJlc3MgZm9yIG1lbW9yeSB3aW5kb3cgMCAgICovCi0jZGVmaW5lIFBDTUNJQV9NRU1fV0lOX1NJWkUgMHgwNDAwMDAwMCAvKiBlYWNoIG1lbW9yeSB3aW5kb3cgaXMgNjQgTUJ5dGUgICAgICovCi0jZGVmaW5lIFBDTUNJQV9JT19XSU5fQkFTRSAgX0lPX0JBU0UgICAvKiBiYXNlIGFkZHJlc3MgZm9yIGlvIHdpbmRvdyAwICAgICAgICovCi0KLSNkZWZpbmUgUENNQ0lBX1NDSExWTCBQQ01DSUFfSU5URVJSVVBUIC8qIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0IExldmVsICAgICAgKi8KLQorI2RlZmluZSBQQ01DSUFfTUVNX1dJTl9CQVNFIDB4ZTAwMDAwMDAJLyogYmFzZSBhZGRyZXNzIGZvciBtZW1vcnkgd2luZG93IDAgICAqLworI2RlZmluZSBQQ01DSUFfTUVNX1dJTl9TSVpFIDB4MDQwMDAwMDAJLyogZWFjaCBtZW1vcnkgd2luZG93IGlzIDY0IE1CeXRlICAgICAqLworI2RlZmluZSBQQ01DSUFfSU9fV0lOX0JBU0UgIF9JT19CQVNFCS8qIGJhc2UgYWRkcmVzcyBmb3IgaW8gd2luZG93IDAgICAgICAgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyogMi40LnggYW5kIG5ld2VyIGhhcyB0aGlzIGFsd2F5cyBpbiBIWiAqLwotI2RlZmluZSBNOFhYX0JVU0ZSRVEgKCgoKGJkX3QgKikmKF9fcmVzKSktPmJpX2J1c2ZyZXEpKQotCi1zdGF0aWMgaW50IHBjbWNpYV9zY2hsdmwgPSBQQ01DSUFfU0NITFZMOworc3RhdGljIGludCBwY21jaWFfc2NobHZsOwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGV2ZW50c19sb2NrKTsKIAotCiAjZGVmaW5lIFBDTUNJQV9TT0NLRVRfS0VZXzVWIDEKICNkZWZpbmUgUENNQ0lBX1NPQ0tFVF9LRVlfTFYgMgogCiAvKiBsb29rIHVwIHRhYmxlIGZvciBwZ2NyeCByZWdpc3RlcnMgKi8KLXN0YXRpYyB1MzIgKm04eHhfcGdjcnhbMl0gPSB7Ci0JJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BnY3JhLAotCSYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZ2NyYgotfTsKK3N0YXRpYyB1MzIgKm04eHhfcGdjcnhbMl07CiAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGFkZHJlc3MgZWFjaCB3aW5kb3cgaW4gdGhlIFBDTUNJQSBjb250cm9sbGVyLgpAQCAtMTc2LDggKzE2OSw4IEBACiAgKi8KIAogc3RydWN0IHBjbWNpYV93aW4gewotCXUzMglicjsKLQl1MzIJb3I7CisJdTMyIGJyOworCXUzMiBvcjsKIH07CiAKIC8qCkBAIC0yMjEsMjIgKzIxNCwyNyBAQAogCiAvKiB3ZSBrZWVwIG9uZSBsb29rdXAgdGFibGUgcGVyIHNvY2tldCB0byBjaGVjayBmbGFncyAqLwogCi0jZGVmaW5lIFBDTUNJQV9FVkVOVFNfTUFYIDUgIC8qIDQgbWF4IGF0IGEgdGltZSArIHRlcm1pbmF0aW9uICovCisjZGVmaW5lIFBDTUNJQV9FVkVOVFNfTUFYIDUJLyogNCBtYXggYXQgYSB0aW1lICsgdGVybWluYXRpb24gKi8KIAogc3RydWN0IGV2ZW50X3RhYmxlIHsKIAl1MzIgcmVnYml0OwogCXUzMiBldmVudGJpdDsKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAibTh4eC1wY21jaWEiOworCiBzdHJ1Y3Qgc29ja2V0X2luZm8gewotCXZvaWQJKCpoYW5kbGVyKSh2b2lkICppbmZvLCB1MzIgZXZlbnRzKTsKLQl2b2lkCSppbmZvOworCXZvaWQgKCpoYW5kbGVyKSAodm9pZCAqaW5mbywgdTMyIGV2ZW50cyk7CisJdm9pZCAqaW5mbzsKIAogCXUzMiBzbG90OworCXBjbWNvbmY4eHhfdCAqcGNtY2lhOworCXUzMiBidXNfZnJlcTsKKwlpbnQgaHdpcnE7CiAKIAlzb2NrZXRfc3RhdGVfdCBzdGF0ZTsKIAlzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgbWVtX3dpbltQQ01DSUFfTUVNX1dJTl9OT107Ci0Jc3RydWN0IHBjY2FyZF9pb19tYXAgIGlvX3dpbltQQ01DSUFfSU9fV0lOX05PXTsKKwlzdHJ1Y3QgcGNjYXJkX2lvX21hcCBpb193aW5bUENNQ0lBX0lPX1dJTl9OT107CiAJc3RydWN0IGV2ZW50X3RhYmxlIGV2ZW50c1tQQ01DSUFfRVZFTlRTX01BWF07CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgc29ja2V0OwogfTsKQEAgLTI1MCw4ICsyNDgsNyBAQAogCiAjZGVmaW5lIE04WFhfU0laRVNfTk8gMzIKIAotc3RhdGljIGNvbnN0IHUzMiBtOHh4X3NpemVfdG9fZ3JheVtNOFhYX1NJWkVTX05PXSA9Ci17CitzdGF0aWMgY29uc3QgdTMyIG04eHhfc2l6ZV90b19ncmF5W004WFhfU0laRVNfTk9dID0gewogCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDQsCiAJMHgwMDAwMDA4MCwgMHgwMDAwMDA0MCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAyMCwKIAkweDAwMDA4MDAwLCAweDAwMDA0MDAwLCAweDAwMDAxMDAwLCAweDAwMDAyMDAwLApAQCAtMjY3LDcgKzI2NCw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtOHh4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpOwogCi0jZGVmaW5lIFBDTUNJQV9CTVRfTElNSVQgKDE1KjQpICAvKiBCdXMgTW9uaXRvciBUaW1lb3V0IHZhbHVlICovCisjZGVmaW5lIFBDTUNJQV9CTVRfTElNSVQgKDE1KjQpCS8qIEJ1cyBNb25pdG9yIFRpbWVvdXQgdmFsdWUgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogYm9hcmQgc3BlY2lmaWMgc3R1ZmY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjkxLDggKzI4OCw5IEBACiB7CiAJdTMyIHJlZyA9IDA7CiAKLQlzd2l0Y2godmNjKSB7Ci0JY2FzZSAwOiBicmVhazsKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CiAJY2FzZSAzMzoKIAkJcmVnIHw9IEJDU1IxX1BDVkNUTDQ7CiAJCWJyZWFrOwpAQCAtMzAzLDExICszMDEsMTIgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0Jc3dpdGNoKHZwcCkgewotCWNhc2UgMDogYnJlYWs7CisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOwogCWNhc2UgMzM6CiAJY2FzZSA1MDoKLQkJaWYodmNjID09IHZwcCkKKwkJaWYgKHZjYyA9PSB2cHApCiAJCQlyZWcgfD0gQkNTUjFfUENWQ1RMNjsKIAkJZWxzZQogCQkJcmV0dXJuIDE7CkBAIC0zMTgsMjUgKzMxNywyOSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZighKCh2Y2MgPT0gNTApIHx8ICh2Y2MgPT0gMCkpKQorCWlmICghKCh2Y2MgPT0gNTApIHx8ICh2Y2MgPT0gMCkpKQogCQlyZXR1cm4gMTsKIAogCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KIAotCW91dF9iZTMyKCgodTMyICopUlBYX0NTUl9BRERSKSwgaW5fYmUzMigoKHUzMiAqKVJQWF9DU1JfQUREUikpICYgfihCQ1NSMV9QQ1ZDVEw0IHwgQkNTUjFfUENWQ1RMNSB8IEJDU1IxX1BDVkNUTDYgfCBCQ1NSMV9QQ1ZDVEw3KSk7CisJb3V0X2JlMzIoKCh1MzIgKikgUlBYX0NTUl9BRERSKSwKKwkJIGluX2JlMzIoKCh1MzIgKikgUlBYX0NTUl9BRERSKSkgJiB+KEJDU1IxX1BDVkNUTDQgfAorCQkJCQkJICAgICBCQ1NSMV9QQ1ZDVEw1IHwKKwkJCQkJCSAgICAgQkNTUjFfUENWQ1RMNiB8CisJCQkJCQkgICAgIEJDU1IxX1BDVkNUTDcpKTsKIAogCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLwogCi0Jb3V0X2JlMzIoKCh1MzIgKilSUFhfQ1NSX0FERFIpLCBpbl9iZTMyKCgodTMyICopUlBYX0NTUl9BRERSKSkgfCByZWcpOworCW91dF9iZTMyKCgodTMyICopIFJQWF9DU1JfQUREUiksIGluX2JlMzIoKCh1MzIgKikgUlBYX0NTUl9BRERSKSkgfCByZWcpOwogCiAJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgc29ja2V0X2dldChfc2xvdF8pIFBDTUNJQV9TT0NLRVRfS0VZXzVWCi0jZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pICAvKiBObyBoYXJkd2FyZSB0byBlbmFibGUgKi8KLSNkZWZpbmUgaGFyZHdhcmVfZGlzYWJsZShfc2xvdF8pIC8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KKyNkZWZpbmUgaGFyZHdhcmVfZW5hYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKQkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCiAKLSNlbmRpZiAvKiBDT05GSUdfUlBYQ0xBU1NJQyAqLworI2VuZGlmCQkJCS8qIENPTkZJR19SUFhDTEFTU0lDICovCiAKIC8qIEZBRFMgQm9hcmRzIGZyb20gTW90b3JvbGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTM0OCw0MyArMzUxLDQ1IEBACiB7CiAJdTMyIHJlZyA9IDA7CiAKLQlzd2l0Y2godmNjKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDoKLQkJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKLQlzd2l0Y2godnBwKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQljYXNlIDUwOgotCQkJaWYodmNjID09IHZwcCkKLQkJCQlyZWcgfD0gQkNTUjFfUENDVlBQMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJCWJyZWFrOwotCQljYXNlIDEyMDoKLQkJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKLQkJCQlyZWcgfD0gQkNTUjFfUENDVlBQMDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJZGVmYXVsdDoKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAxOworCQllbHNlCiAJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJY2FzZSAxMjA6CisJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAwOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCi0Jb3V0X2JlMzIoKHUzMiAqKUJDU1IxLCBpbl9iZTMyKCh1MzIgKilCQ1NSMSkgJiB+KEJDU1IxX1BDQ1ZDQ19NQVNLIHwgQkNTUjFfUENDVlBQX01BU0spKTsKKwlvdXRfYmUzMigodTMyICopIEJDU1IxLAorCQkgaW5fYmUzMigodTMyICopIEJDU1IxKSAmIH4oQkNTUjFfUENDVkNDX01BU0sgfAorCQkJCQkgICAgQkNTUjFfUENDVlBQX01BU0spKTsKIAogCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLwotCW91dF9iZTMyKCh1MzIgKilCQ1NSMSwgaW5fYmUzMigodTMyICopQkNTUjEpIHwgcmVnKTsKKwlvdXRfYmUzMigodTMyICopIEJDU1IxLCBpbl9iZTMyKCh1MzIgKikgQkNTUjEpIHwgcmVnKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzkzLDEyICszOTgsMTIgQEAKIAogc3RhdGljIHZvaWQgaGFyZHdhcmVfZW5hYmxlKGludCBzbG90KQogewotCW91dF9iZTMyKCh1MzIgKilCQ1NSMSwgaW5fYmUzMigodTMyICopQkNTUjEpICYgfkJDU1IxX1BDQ0VOKTsKKwlvdXRfYmUzMigodTMyICopIEJDU1IxLCBpbl9iZTMyKCh1MzIgKikgQkNTUjEpICYgfkJDU1IxX1BDQ0VOKTsKIH0KIAogc3RhdGljIHZvaWQgaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKLQlvdXRfYmUzMigodTMyICopQkNTUjEsIGluX2JlMzIoKHUzMiAqKUJDU1IxKSB8ICBCQ1NSMV9QQ0NFTik7CisJb3V0X2JlMzIoKHUzMiAqKSBCQ1NSMSwgaW5fYmUzMigodTMyICopIEJDU1IxKSB8IEJDU1IxX1BDQ0VOKTsKIH0KIAogI2VuZGlmCkBAIC00MDgsNzggKzQxMywyMSBAQAogI2lmIGRlZmluZWQoQ09ORklHX01QQzg4NUFEUykKIAogI2RlZmluZSBQQ01DSUFfQk9BUkRfTVNHICJNUEM4ODVBRFMiCi0KLXN0YXRpYyBpbnQgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCi17Ci0JdTMyIHJlZyA9IDA7Ci0JdW5zaWduZWQgKmJjc3JfaW87Ci0KLQliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQotCXN3aXRjaCh2Y2MpIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCQlyZWcgfD0gQkNTUjFfUENDVkNDMDsKLQkJCWJyZWFrOwotCQljYXNlIDUwOgotCQkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gb3V0X3VubWFwOwotCX0KLQotCXN3aXRjaCh2cHApIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCWNhc2UgNTA6Ci0JCQlpZih2Y2MgPT0gdnBwKQotCQkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAxOwotCQkJZWxzZQotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTIwOgotCQkJaWYgKCh2Y2MgPT0gMzMpIHx8ICh2Y2MgPT0gNTApKQotCQkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAwOwotCQkJZWxzZQotCQkJCWdvdG8gb3V0X3VubWFwOwotCQlkZWZhdWx0OgotCQkJZ290byBvdXRfdW5tYXA7Ci0JfQotCi0JLyogZmlyc3QsIHR1cm4gb2ZmIGFsbCBwb3dlciAqLwotCW91dF9iZTMyKGJjc3JfaW8sIGluX2JlMzIoYmNzcl9pbykgJiB+KEJDU1IxX1BDQ1ZDQ19NQVNLIHwgQkNTUjFfUENDVlBQX01BU0spKTsKLQotCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLwotCW91dF9iZTMyKGJjc3JfaW8sIGluX2JlMzIoYmNzcl9pbykgfCByZWcpOwotCi0JaW91bm1hcChiY3NyX2lvKTsKLQlyZXR1cm4gMDsKLQotb3V0X3VubWFwOgotCWlvdW5tYXAoYmNzcl9pbyk7Ci0JcmV0dXJuIDE7Ci19Ci0KICNkZWZpbmUgc29ja2V0X2dldChfc2xvdF8pIFBDTUNJQV9TT0NLRVRfS0VZXzVWCiAKLXN0YXRpYyB2b2lkIGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXJkd2FyZV9lbmFibGUoaW50IHNsb3QpCiB7Ci0JdW5zaWduZWQgKmJjc3JfaW87Ci0KLQliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQlvdXRfYmUzMihiY3NyX2lvLCBpbl9iZTMyKGJjc3JfaW8pICYgfkJDU1IxX1BDQ0VOKTsKLQlpb3VubWFwKGJjc3JfaW8pOworCW04eHhfcGNtY2lhX29wcy5od19jdHJsKHNsb3QsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBoYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQorc3RhdGljIGlubGluZSB2b2lkIGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7Ci0JdW5zaWduZWQgKmJjc3JfaW87CisJbTh4eF9wY21jaWFfb3BzLmh3X2N0cmwoc2xvdCwgMCk7Cit9CiAKLQliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQlvdXRfYmUzMihiY3NyX2lvLCBpbl9iZTMyKGJjc3JfaW8pIHwgIEJDU1IxX1BDQ0VOKTsKLQlpb3VubWFwKGJjc3JfaW8pOworc3RhdGljIGlubGluZSBpbnQgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCit7CisJcmV0dXJuIG04eHhfcGNtY2lhX29wcy52b2x0YWdlX3NldChzbG90LCB2Y2MsIHZwcCk7CiB9CiAKICNlbmRpZgpAQCAtNDk1LDUyICs0NDMsNTMgQEAKIHsKIAl1OCByZWcgPSAwOwogCi0Jc3dpdGNoKHZjYykgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAzMzoKLQkJCXJlZyB8PSBDU1IyX1ZDQ18zMzsKLQkJCWJyZWFrOwotCQljYXNlIDUwOgotCQkJcmVnIHw9IENTUjJfVkNDXzUwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IENTUjJfVkNDXzMzOworCQlicmVhazsKKwljYXNlIDUwOgorCQlyZWcgfD0gQ1NSMl9WQ0NfNTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOwogCX0KIAotCXN3aXRjaCh2cHApIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCWNhc2UgNTA6Ci0JCQlpZih2Y2MgPT0gdnBwKQotCQkJCXJlZyB8PSBDU1IyX1ZQUF9WQ0M7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjA6Ci0JCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCi0JCQkJcmVnIHw9IENTUjJfVlBQXzEyOwotCQkJZWxzZQotCQkJCXJldHVybiAxOwotCQlkZWZhdWx0OgorCXN3aXRjaCAodnBwKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDMzOgorCWNhc2UgNTA6CisJCWlmICh2Y2MgPT0gdnBwKQorCQkJcmVnIHw9IENTUjJfVlBQX1ZDQzsKKwkJZWxzZQogCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCisJCQlyZWcgfD0gQ1NSMl9WUFBfMTI7CisJCWVsc2UKKwkJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAxOwogCX0KIAogCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KLQlvdXRfOCgodTggKilNQlhfQ1NSMl9BRERSLCBpbl84KCh1OCAqKU1CWF9DU1IyX0FERFIpICYgfihDU1IyX1ZDQ19NQVNLIHwgQ1NSMl9WUFBfTUFTSykpOworCW91dF84KCh1OCAqKSBNQlhfQ1NSMl9BRERSLAorCSAgICAgIGluXzgoKHU4ICopIE1CWF9DU1IyX0FERFIpICYgfihDU1IyX1ZDQ19NQVNLIHwgQ1NSMl9WUFBfTUFTSykpOwogCiAJLyogZW5hYmxlIG5ldyBwb3dlcnNldHRpbmdzICovCi0Jb3V0XzgoKHU4ICopTUJYX0NTUjJfQUREUiwgaW5fOCgodTggKilNQlhfQ1NSMl9BRERSKSB8IHJlZyk7CisJb3V0XzgoKHU4ICopIE1CWF9DU1IyX0FERFIsIGluXzgoKHU4ICopIE1CWF9DU1IyX0FERFIpIHwgcmVnKTsKIAogCXJldHVybiAwOwogfQogCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81VgotI2RlZmluZSBoYXJkd2FyZV9lbmFibGUoX3Nsb3RfKSAgLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCi0jZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKSAvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pCS8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLworI2RlZmluZSBoYXJkd2FyZV9kaXNhYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLwogCi0jZW5kaWYgLyogQ09ORklHX01CWCAqLworI2VuZGlmCQkJCS8qIENPTkZJR19NQlggKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BSeEspCiAjaW5jbHVkZSA8YXNtL2NwbGQuaD4KQEAgLTU1NCw0MyArNTAzLDQ2IEBACiAJdTggcmVncmVhZDsKIAljcGxkX3JlZ3MgKmNjcGxkID0gZ2V0X2NwbGQoKTsKIAotCXN3aXRjaCh2Y2MpIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCQlyZWcgfD0gUENNQ0lBX1ZDQ18zMzsKLQkJCWJyZWFrOwotCQljYXNlIDUwOgotCQkJcmVnIHw9IFBDTUNJQV9WQ0NfNTA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAxOworCXN3aXRjaCAodmNjKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDMzOgorCQlyZWcgfD0gUENNQ0lBX1ZDQ18zMzsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJcmVnIHw9IFBDTUNJQV9WQ0NfNTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOwogCX0KIAotCXN3aXRjaCh2cHApIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCWNhc2UgNTA6Ci0JCQlpZih2Y2MgPT0gdnBwKQotCQkJCXJlZyB8PSBQQ01DSUFfVlBQX1ZDQzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJCWJyZWFrOwotCQljYXNlIDEyMDoKLQkJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKLQkJCQlyZWcgfD0gUENNQ0lBX1ZQUF8xMjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJZGVmYXVsdDoKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBQQ01DSUFfVlBQX1ZDQzsKKwkJZWxzZQogCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCisJCQlyZWcgfD0gUENNQ0lBX1ZQUF8xMjsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CiAJfQogCiAJcmVnID0gcmVnID4+IChzbG90IDw8IDIpOwogCXJlZ3JlYWQgPSBpbl84KCZjY3BsZC0+ZnBnYV9wY19jdGwpOwotCWlmIChyZWcgIT0gKHJlZ3JlYWQgJiAoKFBDTUNJQV9WQ0NfTUFTSyB8IFBDTUNJQV9WUFBfTUFTSykgPj4gKHNsb3QgPDwgMikpKSkgeworCWlmIChyZWcgIT0KKwkgICAgKHJlZ3JlYWQgJiAoKFBDTUNJQV9WQ0NfTUFTSyB8IFBDTUNJQV9WUFBfTUFTSykgPj4gKHNsb3QgPDwgMikpKSkgewogCQkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KLQkJcmVncmVhZCA9IHJlZ3JlYWQgJiB+KChQQ01DSUFfVkNDX01BU0sgfCBQQ01DSUFfVlBQX01BU0spID4+IChzbG90IDw8IDIpKTsKKwkJcmVncmVhZCA9CisJCSAgICByZWdyZWFkICYgfigoUENNQ0lBX1ZDQ19NQVNLIHwgUENNQ0lBX1ZQUF9NQVNLKSA+PgorCQkJCShzbG90IDw8IDIpKTsKIAkJb3V0XzgoJmNjcGxkLT5mcGdhX3BjX2N0bCwgcmVnIHwgcmVncmVhZCk7CiAJCW1zbGVlcCgxMDApOwogCX0KQEAgLTU5OSw1MiArNTUxLDEwIEBACiB9CiAKICNkZWZpbmUgc29ja2V0X2dldChfc2xvdF8pIFBDTUNJQV9TT0NLRVRfS0VZX0xWCi0jZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pICAvKiBObyBoYXJkd2FyZSB0byBlbmFibGUgKi8KLSNkZWZpbmUgaGFyZHdhcmVfZGlzYWJsZShfc2xvdF8pIC8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KKyNkZWZpbmUgaGFyZHdhcmVfZW5hYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKQkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCiAKLSNlbmRpZiAvKiBDT05GSUdfUFJ4SyAqLwotCi1zdGF0aWMgdm9pZCBtOHh4X3NodXRkb3duKHZvaWQpCi17Ci0JdTMyIG0sIGk7Ci0Jc3RydWN0IHBjbWNpYV93aW4gKnc7Ci0KLQlmb3IoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKXsKLQkJdyA9ICh2b2lkICopICYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wYnIwOwotCi0JCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyLCBNOFhYX1BDTUNJQV9NQVNLKGkpKTsKLQkJb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlciwgaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyKSAmIH5NOFhYX1BDTUNJQV9NQVNLKGkpKTsKLQotCQkvKiB0dXJuIG9mZiBpbnRlcnJ1cHQgYW5kIGRpc2FibGUgQ3hPRSAqLwotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGkpLCBNOFhYX1BHQ1JYX0NYT0UpOwotCi0JCS8qIHR1cm4gb2ZmIG1lbW9yeSB3aW5kb3dzICovCi0JCWZvcihtID0gMDsgbSA8IFBDTUNJQV9NRU1fV0lOX05POyBtKyspIHsKLQkJCW91dF9iZTMyKCZ3LT5vciwgMCk7IC8qIHNldCB0byBub3QgdmFsaWQgKi8KLQkJCXcrKzsKLQkJfQotCi0JCS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KLQkJdm9sdGFnZV9zZXQoaSwgMCwgMCk7Ci0KLQkJLyogZGlzYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLwotCQloYXJkd2FyZV9kaXNhYmxlKGkpOwotCX0KLQotCWZyZWVfaXJxKHBjbWNpYV9zY2hsdmwsIE5VTEwpOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgbTh4eF9kcml2ZXIgPSB7Ci0gICAgICAgIC5uYW1lID0gIm04eHgtcGNtY2lhIiwKLSAgICAgICAgLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKLSAgICAgICAgLnN1c3BlbmQgPSBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kLAotICAgICAgICAucmVzdW1lID0gcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbTh4eF9kZXZpY2UgPSB7Ci0gICAgICAgIC5uYW1lID0gIm04eHgtcGNtY2lhIiwKLSAgICAgICAgLmlkID0gMCwKLX07CisjZW5kaWYJCQkJLyogQ09ORklHX1BSeEsgKi8KIAogc3RhdGljIHUzMiBwZW5kaW5nX2V2ZW50c1tQQ01DSUFfU09DS0VUU19OT107CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBlbmRpbmdfZXZlbnRfbG9jayk7CkBAIC02NTQsMjQgKzU2NCwyNSBAQAogCXN0cnVjdCBzb2NrZXRfaW5mbyAqczsKIAlzdHJ1Y3QgZXZlbnRfdGFibGUgKmU7CiAJdW5zaWduZWQgaW50IGksIGV2ZW50cywgcHNjciwgcGlwciwgcGVyOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gc29ja2V0WzBdLnBjbWNpYTsKIAogCWRwcmludGsoIkludGVycnVwdCFcbiIpOwogCS8qIGdldCBpbnRlcnJ1cHQgc291cmNlcyAqLwogCi0JcHNjciA9IGluX2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BzY3IpOwotCXBpcHIgPSBpbl9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19waXByKTsKLQlwZXIgPSBpbl9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZXIpOworCXBzY3IgPSBpbl9iZTMyKCZwY21jaWEtPnBjbWNfcHNjcik7CisJcGlwciA9IGluX2JlMzIoJnBjbWNpYS0+cGNtY19waXByKTsKKwlwZXIgPSBpbl9iZTMyKCZwY21jaWEtPnBjbWNfcGVyKTsKIAotCWZvcihpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykgewogCQlzID0gJnNvY2tldFtpXTsKIAkJZSA9ICZzLT5ldmVudHNbMF07CiAJCWV2ZW50cyA9IDA7CiAKLQkJd2hpbGUoZS0+cmVnYml0KSB7Ci0JCQlpZihwc2NyICYgZS0+cmVnYml0KQorCQl3aGlsZSAoZS0+cmVnYml0KSB7CisJCQlpZiAocHNjciAmIGUtPnJlZ2JpdCkKIAkJCQlldmVudHMgfD0gZS0+ZXZlbnRiaXQ7CiAKLQkJCQllKys7CisJCQllKys7CiAJCX0KIAogCQkvKgpAQCAtNjc5LDEzICs1OTAsMTEgQEAKIAkJICogbm90IHRvbyBuaWNlIGRvbmUsCiAJCSAqIHdlIGRlcGVuZCBvbiB0aGF0IENEMiBpcyB0aGUgYml0IHRvIHRoZSBsZWZ0IG9mIENEMS4uLgogCQkgKi8KLQkJaWYoZXZlbnRzICYgU1NfREVURUNUKQotCQkJaWYoKChwaXByICYgTThYWF9QQ01DSUFfQ0QyKGkpKSA+PiAxKSBeCi0JCQkJKHBpcHIgJiBNOFhYX1BDTUNJQV9DRDEoaSkpKQotCQkJeworCQlpZiAoZXZlbnRzICYgU1NfREVURUNUKQorCQkJaWYgKCgocGlwciAmIE04WFhfUENNQ0lBX0NEMihpKSkgPj4gMSkgXgorCQkJICAgIChwaXByICYgTThYWF9QQ01DSUFfQ0QxKGkpKSkgewogCQkJCWV2ZW50cyAmPSB+U1NfREVURUNUOwogCQkJfQotCiAjaWZkZWYgUENNQ0lBX0dMSVRDSFlfQ0QKIAkJLyoKIAkJICogSSd2ZSBleHBlcmllbmNlZCBDRCBwcm9ibGVtcyB3aXRoIG15IEFEUyBib2FyZC4KQEAgLTY5MywyNCArNjAyLDIzIEBACiAJCSAqIHJlYWwgY2hhbmdlIG9mIENhcmQgZGV0ZWN0aW9uLgogCQkgKi8KIAotCQlpZigoZXZlbnRzICYgU1NfREVURUNUKSAmJgotCQkgICAoKHBpcHIgJgotCQkgICAgIChNOFhYX1BDTUNJQV9DRDIoaSkgfCBNOFhYX1BDTUNJQV9DRDEoaSkpKSA9PSAwKSAmJgotCQkgICAocy0+c3RhdGUuVmNjIHwgcy0+c3RhdGUuVnBwKSkgeworCQlpZiAoKGV2ZW50cyAmIFNTX0RFVEVDVCkgJiYKKwkJICAgICgocGlwciAmCisJCSAgICAgIChNOFhYX1BDTUNJQV9DRDIoaSkgfCBNOFhYX1BDTUNJQV9DRDEoaSkpKSA9PSAwKSAmJgorCQkgICAgKHMtPnN0YXRlLlZjYyB8IHMtPnN0YXRlLlZwcCkpIHsKIAkJCWV2ZW50cyAmPSB+U1NfREVURUNUOwogCQkJLypwcmludGsoICJDRCBnbGl0Y2ggd29ya2Fyb3VuZCAtIENEID0gMHglMDh4IVxuIiwKLQkJCQkocGlwciAmIChNOFhYX1BDTUNJQV9DRDIoaSkKLQkJCQkJIHwgTThYWF9QQ01DSUFfQ0QxKGkpKSkpOyovCisJCQkgICAocGlwciAmIChNOFhYX1BDTUNJQV9DRDIoaSkKKwkJCSAgIHwgTThYWF9QQ01DSUFfQ0QxKGkpKSkpOyAqLwogCQl9CiAjZW5kaWYKIAogCQkvKiBjYWxsIHRoZSBoYW5kbGVyICovCiAKIAkJZHByaW50aygic2xvdCAldTogZXZlbnRzID0gMHglMDJ4LCBwc2NyID0gMHglMDh4LCAiCi0JCQkicGlwciA9IDB4JTA4eFxuIiwKLQkJCWksIGV2ZW50cywgcHNjciwgcGlwcik7CisJCQkicGlwciA9IDB4JTA4eFxuIiwgaSwgZXZlbnRzLCBwc2NyLCBwaXByKTsKIAotCQlpZihldmVudHMpIHsKKwkJaWYgKGV2ZW50cykgewogCQkJc3Bpbl9sb2NrKCZwZW5kaW5nX2V2ZW50X2xvY2spOwogCQkJcGVuZGluZ19ldmVudHNbaV0gfD0gZXZlbnRzOwogCQkJc3Bpbl91bmxvY2soJnBlbmRpbmdfZXZlbnRfbG9jayk7CkBAIC03MjQsNyArNjMyLDcgQEAKIAkJCXBlciAmPSB+TThYWF9QQ01DSUFfUkRZX0woMCk7CiAJCQlwZXIgJj0gfk04WFhfUENNQ0lBX1JEWV9MKDEpOwogCi0JCQlvdXRfYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyLCBwZXIpOworCQkJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wZXIsIHBlcik7CiAKIAkJCWlmIChldmVudHMpCiAJCQkJcGNtY2lhX3BhcnNlX2V2ZW50cygmc29ja2V0W2ldLnNvY2tldCwgZXZlbnRzKTsKQEAgLTczMiw3ICs2NDAsNyBAQAogCX0KIAogCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAqLwotCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyLCBwc2NyKTsKKwlvdXRfYmUzMigmcGNtY2lhLT5wY21jX3BzY3IsIHBzY3IpOwogCiAJZHByaW50aygiSW50ZXJydXB0IGRvbmUuXG4iKTsKIApAQCAtNzQzLDIxICs2NTEsMjEgQEAKIHsKIAl1MzIgazsKIAotCWZvcihrID0gMDsgayA8IE04WFhfU0laRVNfTk87IGsrKykKLQkJaWYobTh4eF9zaXplX3RvX2dyYXlba10gPT0gc2l6ZSkKKwlmb3IgKGsgPSAwOyBrIDwgTThYWF9TSVpFU19OTzsgaysrKQorCQlpZiAobTh4eF9zaXplX3RvX2dyYXlba10gPT0gc2l6ZSkKIAkJCWJyZWFrOwogCi0JaWYoKGsgPT0gTThYWF9TSVpFU19OTykgfHwgKG04eHhfc2l6ZV90b19ncmF5W2tdID09IC0xKSkKKwlpZiAoKGsgPT0gTThYWF9TSVpFU19OTykgfHwgKG04eHhfc2l6ZV90b19ncmF5W2tdID09IC0xKSkKIAkJayA9IC0xOwogCiAJcmV0dXJuIGs7CiB9CiAKLXN0YXRpYyB1MzIgbTh4eF9nZXRfc3BlZWQodTMyIG5zLCB1MzIgaXNfaW8pCitzdGF0aWMgdTMyIG04eHhfZ2V0X3NwZWVkKHUzMiBucywgdTMyIGlzX2lvLCB1MzIgYnVzX2ZyZXEpCiB7CiAJdTMyIHJlZywgY2xvY2tzLCBwc3N0LCBwc2wsIHBzaHQ7CiAKLQlpZighbnMpIHsKKwlpZiAoIW5zKSB7CiAKIAkJLyoKIAkJICogV2UgZ2V0IGNhbGxlZCB3aXRoIElPIG1hcHMgc2V0dXAgdG8gMG5zCkBAIC03NjUsMTAgKzY3MywxMCBAQAogCQkgKiBUaGV5IHNob3VsZCBiZSAyNTVucy4KIAkJICovCiAKLQkJaWYoaXNfaW8pCisJCWlmIChpc19pbykKIAkJCW5zID0gMjU1OwogCQllbHNlCi0JCQlucyA9IDEwMDsgIC8qIGZhc3QgbWVtb3J5IGlmIDAgKi8KKwkJCW5zID0gMTAwOwkvKiBmYXN0IG1lbW9yeSBpZiAwICovCiAJfQogCiAJLyoKQEAgLTc3OSwyMyArNjg3LDIzIEBACiAKIC8qIGhvdyB3ZSB3YW50IHRvIGFkanVzdCB0aGUgdGltaW5nIC0gaW4gcGVyY2VudCAqLwogCi0jZGVmaW5lIEFESiAxODAgLyogODAgJSBsb25nZXIgYWNjZXNzdGltZSAtIHRvIGJlIHN1cmUgKi8KKyNkZWZpbmUgQURKIDE4MAkJCS8qIDgwICUgbG9uZ2VyIGFjY2Vzc3RpbWUgLSB0byBiZSBzdXJlICovCiAKLQljbG9ja3MgPSAoKE04WFhfQlVTRlJFUSAvIDEwMDApICogbnMpIC8gMTAwMDsKLQljbG9ja3MgPSAoY2xvY2tzICogQURKKSAvICgxMDAqMTAwMCk7Ci0JaWYoY2xvY2tzID49IFBDTUNJQV9CTVRfTElNSVQpIHsKLQkJcHJpbnRrKCAiTWF4IGFjY2VzcyB0aW1lIGxpbWl0IHJlYWNoZWRcbiIpOwotCQljbG9ja3MgPSBQQ01DSUFfQk1UX0xJTUlULTE7CisJY2xvY2tzID0gKChidXNfZnJlcSAvIDEwMDApICogbnMpIC8gMTAwMDsKKwljbG9ja3MgPSAoY2xvY2tzICogQURKKSAvICgxMDAgKiAxMDAwKTsKKwlpZiAoY2xvY2tzID49IFBDTUNJQV9CTVRfTElNSVQpIHsKKwkJcHJpbnRrKCJNYXggYWNjZXNzIHRpbWUgbGltaXQgcmVhY2hlZFxuIik7CisJCWNsb2NrcyA9IFBDTUNJQV9CTVRfTElNSVQgLSAxOwogCX0KIAotCXBzc3QgPSBjbG9ja3MgLyA3OyAgICAgICAgICAvKiBzZXR1cCB0aW1lICovCi0JcHNodCA9IGNsb2NrcyAvIDc7ICAgICAgICAgIC8qIGhvbGQgdGltZSAqLwotCXBzbCAgPSAoY2xvY2tzICogNSkgLyA3OyAgICAvKiBzdHJvYmUgbGVuZ3RoICovCisJcHNzdCA9IGNsb2NrcyAvIDc7CS8qIHNldHVwIHRpbWUgKi8KKwlwc2h0ID0gY2xvY2tzIC8gNzsJLyogaG9sZCB0aW1lICovCisJcHNsID0gKGNsb2NrcyAqIDUpIC8gNzsJLyogc3Ryb2JlIGxlbmd0aCAqLwogCiAJcHNzdCArPSBjbG9ja3MgLSAocHNzdCArIHBzaHQgKyBwc2wpOwogCi0JcmVnID0gIHBzc3QgPDwgMTI7Ci0JcmVnIHw9IHBzbCAgPDwgNzsKKwlyZWcgPSBwc3N0IDw8IDEyOworCXJlZyB8PSBwc2wgPDwgNzsKIAlyZWcgfD0gcHNodCA8PCAxNjsKIAogCXJldHVybiByZWc7CkBAIC04MDYsMTEgKzcxNCwxMiBAQAogCWludCBsc29jayA9IGNvbnRhaW5lcl9vZihzb2NrLCBzdHJ1Y3Qgc29ja2V0X2luZm8sIHNvY2tldCktPnNsb3Q7CiAJc3RydWN0IHNvY2tldF9pbmZvICpzID0gJnNvY2tldFtsc29ja107CiAJdW5zaWduZWQgaW50IHBpcHIsIHJlZzsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHMtPnBjbWNpYTsKIAotCXBpcHIgPSBpbl9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19waXByKTsKKwlwaXByID0gaW5fYmUzMigmcGNtY2lhLT5wY21jX3BpcHIpOwogCi0JKnZhbHVlICA9ICgocGlwciAmIChNOFhYX1BDTUNJQV9DRDEobHNvY2spCi0JCQkgICAgfCBNOFhYX1BDTUNJQV9DRDIobHNvY2spKSkgPT0gMCkgPyBTU19ERVRFQ1QgOiAwOworCSp2YWx1ZSA9ICgocGlwciAmIChNOFhYX1BDTUNJQV9DRDEobHNvY2spCisJCQkgICB8IE04WFhfUENNQ0lBX0NEMihsc29jaykpKSA9PSAwKSA/IFNTX0RFVEVDVCA6IDA7CiAJKnZhbHVlIHw9IChwaXByICYgTThYWF9QQ01DSUFfV1AobHNvY2spKSA/IFNTX1dSUFJPVCA6IDA7CiAKIAlpZiAocy0+c3RhdGUuZmxhZ3MgJiBTU19JT0NBUkQpCkBAIC04OTQsMTYgKzgwMywxNiBAQAogCS8qIHJlYWQgb3V0IFZTMSBhbmQgVlMyICovCiAKIAlyZWcgPSAocGlwciAmIE04WFhfUENNQ0lBX1ZTX01BU0sobHNvY2spKQotCQk+PiBNOFhYX1BDTUNJQV9WU19TSElGVChsc29jayk7CisJICAgID4+IE04WFhfUENNQ0lBX1ZTX1NISUZUKGxzb2NrKTsKIAotCWlmKHNvY2tldF9nZXQobHNvY2spID09IFBDTUNJQV9TT0NLRVRfS0VZX0xWKSB7Ci0JCXN3aXRjaChyZWcpIHsKKwlpZiAoc29ja2V0X2dldChsc29jaykgPT0gUENNQ0lBX1NPQ0tFVF9LRVlfTFYpIHsKKwkJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSAxOgogCQkJKnZhbHVlIHw9IFNTXzNWQ0FSRDsKLQkJCWJyZWFrOyAvKiBHTkQsIE5DIC0gMy4zViBvbmx5ICovCisJCQlicmVhazsJLyogR05ELCBOQyAtIDMuM1Ygb25seSAqLwogCQljYXNlIDI6CiAJCQkqdmFsdWUgfD0gU1NfWFZDQVJEOwotCQkJYnJlYWs7IC8qIE5DLiBHTkQgLSB4LnhWIG9ubHkgKi8KKwkJCWJyZWFrOwkvKiBOQy4gR05EIC0geC54ViBvbmx5ICovCiAJCX07CiAJfQogCkBAIC05MTEsMjcgKzgyMCwyOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG04eHhfc2V0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQorc3RhdGljIGludCBtOHh4X3NldF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2ssIHNvY2tldF9zdGF0ZV90ICogc3RhdGUpCiB7CiAJaW50IGxzb2NrID0gY29udGFpbmVyX29mKHNvY2ssIHN0cnVjdCBzb2NrZXRfaW5mbywgc29ja2V0KS0+c2xvdDsKIAlzdHJ1Y3Qgc29ja2V0X2luZm8gKnMgPSAmc29ja2V0W2xzb2NrXTsKIAlzdHJ1Y3QgZXZlbnRfdGFibGUgKmU7CiAJdW5zaWduZWQgaW50IHJlZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gc29ja2V0WzBdLnBjbWNpYTsKIAotCWRwcmludGsoICJTZXRTb2NrZXQoJWQsIGZsYWdzICUjMy4zeCwgVmNjICVkLCBWcHAgJWQsICIKLQkgICAgICAiaW9faXJxICVkLCBjc2NfbWFzayAlIzIuMngpXG4iLCBsc29jaywgc3RhdGUtPmZsYWdzLAotCSAgICAgIHN0YXRlLT5WY2MsIHN0YXRlLT5WcHAsIHN0YXRlLT5pb19pcnEsIHN0YXRlLT5jc2NfbWFzayk7CisJZHByaW50aygiU2V0U29ja2V0KCVkLCBmbGFncyAlIzMuM3gsIFZjYyAlZCwgVnBwICVkLCAiCisJCSJpb19pcnEgJWQsIGNzY19tYXNrICUjMi4yeClcbiIsIGxzb2NrLCBzdGF0ZS0+ZmxhZ3MsCisJCXN0YXRlLT5WY2MsIHN0YXRlLT5WcHAsIHN0YXRlLT5pb19pcnEsIHN0YXRlLT5jc2NfbWFzayk7CiAKIAkvKiBGaXJzdCwgc2V0IHZvbHRhZ2UgLSBiYWlsIG91dCBpZiBpbnZhbGlkICovCi0JaWYodm9sdGFnZV9zZXQobHNvY2ssIHN0YXRlLT5WY2MsIHN0YXRlLT5WcHApKQorCWlmICh2b2x0YWdlX3NldChsc29jaywgc3RhdGUtPlZjYywgc3RhdGUtPlZwcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogVGFrZSBjYXJlIG9mIHJlc2V0Li4uICovCi0JaWYoc3RhdGUtPmZsYWdzICYgU1NfUkVTRVQpCi0JCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSB8ICBNOFhYX1BHQ1JYX0NYUkVTRVQpOyAvKiBhY3RpdmUgaGlnaCAqLworCWlmIChzdGF0ZS0+ZmxhZ3MgJiBTU19SRVNFVCkKKwkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpIHwgTThYWF9QR0NSWF9DWFJFU0VUKTsJLyogYWN0aXZlIGhpZ2ggKi8KIAllbHNlCi0JCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSAmIH5NOFhYX1BHQ1JYX0NYUkVTRVQpOworCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwKKwkJCSBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSAmIH5NOFhYX1BHQ1JYX0NYUkVTRVQpOwogCiAJLyogLi4uIGFuZCBvdXRwdXQgZW5hYmxlLiAqLwogCkBAIC05NDMsMTAgKzg1NCwxMSBAQAogCSAgIG5vIHB1bGx1cHMgYXJlIHByZXNlbnQgLT4gdGhlIGNhcmRzIGFjdCB3aWVyZC4KIAkgICBTbyByaWdodCBub3cgdGhlIGJ1ZmZlcnMgYXJlIGVuYWJsZWQgaWYgdGhlIHBvd2VyIGlzIG9uLiAqLwogCi0JaWYoc3RhdGUtPlZjYyB8fCBzdGF0ZS0+VnBwKQotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiB+TThYWF9QR0NSWF9DWE9FKTsgLyogYWN0aXZlIGxvdyAqLworCWlmIChzdGF0ZS0+VmNjIHx8IHN0YXRlLT5WcHApCisJCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSAmIH5NOFhYX1BHQ1JYX0NYT0UpOwkvKiBhY3RpdmUgbG93ICovCiAJZWxzZQotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfCBNOFhYX1BHQ1JYX0NYT0UpOworCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwKKwkJCSBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSB8IE04WFhfUEdDUlhfQ1hPRSk7CiAKIAkvKgogCSAqIFdlJ2QgYmV0dGVyIHR1cm4gb2ZmIGludGVycnVwdHMgYmVmb3JlCkBAIC05NjMsMTcgKzg3NSwxNyBAQAogCWUgPSAmcy0+ZXZlbnRzWzBdOwogCXJlZyA9IDA7CiAKLQlpZihzdGF0ZS0+Y3NjX21hc2sgJiBTU19ERVRFQ1QpIHsKKwlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfREVURUNUKSB7CiAJCWUtPmV2ZW50Yml0ID0gU1NfREVURUNUOwogCQlyZWcgfD0gZS0+cmVnYml0ID0gKE04WFhfUENNQ0lBX0NEMihsc29jaykKIAkJCQkgICAgfCBNOFhYX1BDTUNJQV9DRDEobHNvY2spKTsKIAkJZSsrOwogCX0KLQlpZihzdGF0ZS0+ZmxhZ3MgJiBTU19JT0NBUkQpIHsKKwlpZiAoc3RhdGUtPmZsYWdzICYgU1NfSU9DQVJEKSB7CiAJCS8qCiAJCSAqIEkvTyBjYXJkCiAJCSAqLwotCQlpZihzdGF0ZS0+Y3NjX21hc2sgJiBTU19TVFNDSEcpIHsKKwkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX1NUU0NIRykgewogCQkJZS0+ZXZlbnRiaXQgPSBTU19TVFNDSEc7CiAJCQlyZWcgfD0gZS0+cmVnYml0ID0gTThYWF9QQ01DSUFfQlZEMShsc29jayk7CiAJCQllKys7CkBAIC05ODEsOCArODkzLDEwIEBACiAJCS8qCiAJCSAqIElmIGlvX2lycSBpcyBub24temVybyB3ZSBzaG91bGQgZW5hYmxlIGlycS4KIAkJICovCi0JCWlmKHN0YXRlLT5pb19pcnEpIHsKLQkJCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSB8IG1rX2ludF9pbnRfbWFzayhzdGF0ZS0+aW9faXJxKSA8PCAyNCk7CisJCWlmIChzdGF0ZS0+aW9faXJxKSB7CisJCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwKKwkJCQkgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfAorCQkJCSBta19pbnRfaW50X21hc2socy0+aHdpcnEpIDw8IDI0KTsKIAkJCS8qCiAJCQkgKiBTdHJhbmdlIHRoaW5nIGhlcmU6CiAJCQkgKiBUaGUgbWFudWFsIGRvZXMgbm90IHRlbGwgdXMgd2hpY2ggaW50ZXJydXB0CkBAIC05OTMsMzMgKzkwNywzMiBAQAogCQkJICogaGF2ZSB0byBiZSBjbGVhcmVkIGluIFBTQ1IgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLgogCQkJICovCiAJCQlyZWcgfD0gTThYWF9QQ01DSUFfUkRZX0wobHNvY2spOwotCQl9Ci0JCWVsc2UKLQkJCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSAmIDB4MDBmZmZmZmYpOwotCX0KLQllbHNlIHsKKwkJfSBlbHNlCisJCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwKKwkJCQkgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiAweDAwZmZmZmZmKTsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBNZW1vcnkgY2FyZAogCQkgKi8KLQkJaWYoc3RhdGUtPmNzY19tYXNrICYgU1NfQkFUREVBRCkgeworCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfQkFUREVBRCkgewogCQkJZS0+ZXZlbnRiaXQgPSBTU19CQVRERUFEOwogCQkJcmVnIHw9IGUtPnJlZ2JpdCA9IE04WFhfUENNQ0lBX0JWRDEobHNvY2spOwogCQkJZSsrOwogCQl9Ci0JCWlmKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVFdBUk4pIHsKKwkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVFdBUk4pIHsKIAkJCWUtPmV2ZW50Yml0ID0gU1NfQkFUV0FSTjsKIAkJCXJlZyB8PSBlLT5yZWdiaXQgPSBNOFhYX1BDTUNJQV9CVkQyKGxzb2NrKTsKIAkJCWUrKzsKIAkJfQogCQkvKiBXaGF0IHNob3VsZCBJIHRyaWdnZXIgb24gLSBsb3cvaGlnaCxyYWlzZSxmYWxsPyAqLwotCQlpZihzdGF0ZS0+Y3NjX21hc2sgJiBTU19SRUFEWSkgeworCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfUkVBRFkpIHsKIAkJCWUtPmV2ZW50Yml0ID0gU1NfUkVBRFk7Ci0JCQlyZWcgfD0gZS0+cmVnYml0ID0gMDsgLy8/PworCQkJcmVnIHw9IGUtPnJlZ2JpdCA9IDA7CS8vPz8KIAkJCWUrKzsKIAkJfQogCX0KIAotCWUtPnJlZ2JpdCA9IDA7ICAvKiB0ZXJtaW5hdGUgbGlzdCAqLworCWUtPnJlZ2JpdCA9IDA7CQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogCiAJLyoKIAkgKiBDbGVhciB0aGUgc3RhdHVzIGNoYW5nZWQgLgpAQCAtMTAyNyw3ICs5NDAsNyBAQAogCSAqIFdyaXRpbmcgb25lcyB3aWxsIGNsZWFyIHRoZSBiaXRzLgogCSAqLwogCi0Jb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BzY3IsIHJlZyk7CisJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wc2NyLCByZWcpOwogCiAJLyoKIAkgKiBXcml0ZSB0aGUgbWFzay4KQEAgLTEwMzYsMTUgKzk0OSwxMCBAQAogCSAqIE9uZXMgd2lsbCBlbmFibGUgdGhlIGludGVycnVwdC4KIAkgKi8KIAotCS8qCi0JICByZWcgfD0gKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyCi0JICAmIE04WFhfUENNQ0lBX01BU0sobHNvY2spOwotCSovCi0KLQlyZWcgfD0gaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyKSAmCi0JCShNOFhYX1BDTUNJQV9NQVNLKDApIHwgTThYWF9QQ01DSUFfTUFTSygxKSk7Ci0KLQlvdXRfYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyLCByZWcpOworCXJlZyB8PQorCSAgICBpbl9iZTMyKCZwY21jaWEtPgorCQkgICAgcGNtY19wZXIpICYgKE04WFhfUENNQ0lBX01BU0soMCkgfCBNOFhYX1BDTUNJQV9NQVNLKDEpKTsKKwlvdXRfYmUzMigmcGNtY2lhLT5wY21jX3BlciwgcmVnKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50c19sb2NrLCBmbGFncyk7CiAKQEAgLTEwNjIsNjYgKzk3MCw2OCBAQAogCXN0cnVjdCBzb2NrZXRfaW5mbyAqcyA9ICZzb2NrZXRbbHNvY2tdOwogCXN0cnVjdCBwY21jaWFfd2luICp3OwogCXVuc2lnbmVkIGludCByZWcsIHdpbm5yOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gcy0+cGNtY2lhOwogCiAjZGVmaW5lIE04WFhfU0laRSAoaW8tPnN0b3AgLSBpby0+c3RhcnQgKyAxKQogI2RlZmluZSBNOFhYX0JBU0UgKFBDTUNJQV9JT19XSU5fQkFTRSArIGlvLT5zdGFydCkKIAotCWRwcmludGsoICJTZXRJT01hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkgICAgICAiJSM0LjR4LSUjNC40eClcbiIsIGxzb2NrLCBpby0+bWFwLCBpby0+ZmxhZ3MsCi0JICAgICAgaW8tPnNwZWVkLCBpby0+c3RhcnQsIGlvLT5zdG9wKTsKKwlkcHJpbnRrKCJTZXRJT01hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKKwkJIiUjNC40eC0lIzQuNHgpXG4iLCBsc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAorCQlpby0+c3BlZWQsIGlvLT5zdGFydCwgaW8tPnN0b3ApOwogCiAJaWYgKChpby0+bWFwID49IFBDTUNJQV9JT19XSU5fTk8pIHx8IChpby0+c3RhcnQgPiAweGZmZmYpCiAJICAgIHx8IChpby0+c3RvcCA+IDB4ZmZmZikgfHwgKGlvLT5zdG9wIDwgaW8tPnN0YXJ0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZigocmVnID0gbTh4eF9nZXRfZ3JheWNvZGUoTThYWF9TSVpFKSkgPT0gLTEpCisJaWYgKChyZWcgPSBtOHh4X2dldF9ncmF5Y29kZShNOFhYX1NJWkUpKSA9PSAtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZihpby0+ZmxhZ3MgJiBNQVBfQUNUSVZFKSB7CisJaWYgKGlvLT5mbGFncyAmIE1BUF9BQ1RJVkUpIHsKIAotCQlkcHJpbnRrKCAiaW8tPmZsYWdzICYgTUFQX0FDVElWRVxuIik7CisJCWRwcmludGsoImlvLT5mbGFncyAmIE1BUF9BQ1RJVkVcbiIpOwogCiAJCXdpbm5yID0gKFBDTUNJQV9NRU1fV0lOX05PICogUENNQ0lBX1NPQ0tFVFNfTk8pCi0JCQkrIChsc29jayAqIFBDTUNJQV9JT19XSU5fTk8pICsgaW8tPm1hcDsKKwkJICAgICsgKGxzb2NrICogUENNQ0lBX0lPX1dJTl9OTykgKyBpby0+bWFwOwogCiAJCS8qIHNldHVwIHJlZ2lzdGVycyAqLwogCi0JCXcgPSAodm9pZCAqKSAmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGJyMDsKKwkJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOwogCQl3ICs9IHdpbm5yOwogCi0JCW91dF9iZTMyKCZ3LT5vciwgMCk7IC8qIHR1cm4gb2ZmIHdpbmRvdyBmaXJzdCAqLworCQlvdXRfYmUzMigmdy0+b3IsIDApOwkvKiB0dXJuIG9mZiB3aW5kb3cgZmlyc3QgKi8KIAkJb3V0X2JlMzIoJnctPmJyLCBNOFhYX0JBU0UpOwogCiAJCXJlZyA8PD0gMjc7Ci0gIAkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9JTyB8KGxzb2NrIDw8IDIpOworCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX0lPIHwgKGxzb2NrIDw8IDIpOwogCi0JCXJlZyB8PSBtOHh4X2dldF9zcGVlZChpby0+c3BlZWQsIDEpOworCQlyZWcgfD0gbTh4eF9nZXRfc3BlZWQoaW8tPnNwZWVkLCAxLCBzLT5idXNfZnJlcSk7CiAKLQkJaWYoaW8tPmZsYWdzICYgTUFQX1dSUFJPVCkKKwkJaWYgKGlvLT5mbGFncyAmIE1BUF9XUlBST1QpCiAJCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX1dSUFJPVDsKIAotCQlpZihpby0+ZmxhZ3MgJiAoTUFQXzE2QklUIHwgTUFQX0FVVE9TWikpCisJCS8qaWYoaW8tPmZsYWdzICYgKE1BUF8xNkJJVCB8IE1BUF9BVVRPU1opKSAqLworCQlpZiAoaW8tPmZsYWdzICYgTUFQXzE2QklUKQogCQkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl8xNkJJVDsKIAotCQlpZihpby0+ZmxhZ3MgJiBNQVBfQUNUSVZFKQorCQlpZiAoaW8tPmZsYWdzICYgTUFQX0FDVElWRSkKIAkJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfVkFMSUQ7CiAKIAkJb3V0X2JlMzIoJnctPm9yLCByZWcpOwogCiAJCWRwcmludGsoIlNvY2tldCAldTogTWFwcGVkIGlvIHdpbmRvdyAldSBhdCAlIzguOHgsICIKLQkJICAgICAgIk9SID0gJSM4Ljh4LlxuIiwgbHNvY2ssIGlvLT5tYXAsIHctPmJyLCB3LT5vcik7CisJCQkiT1IgPSAlIzguOHguXG4iLCBsc29jaywgaW8tPm1hcCwgdy0+YnIsIHctPm9yKTsKIAl9IGVsc2UgewogCQkvKiBzaHV0ZG93biBJTyB3aW5kb3cgKi8KIAkJd2lubnIgPSAoUENNQ0lBX01FTV9XSU5fTk8gKiBQQ01DSUFfU09DS0VUU19OTykKLQkJCSsgKGxzb2NrICogUENNQ0lBX0lPX1dJTl9OTykgKyBpby0+bWFwOworCQkgICAgKyAobHNvY2sgKiBQQ01DSUFfSU9fV0lOX05PKSArIGlvLT5tYXA7CiAKIAkJLyogc2V0dXAgcmVnaXN0ZXJzICovCiAKLQkJdyA9ICh2b2lkICopICYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wYnIwOworCQl3ID0gKHZvaWQgKikmcGNtY2lhLT5wY21jX3BicjA7CiAJCXcgKz0gd2lubnI7CiAKLQkJb3V0X2JlMzIoJnctPm9yLCAwKTsgLyogdHVybiBvZmYgd2luZG93ICovCi0JCW91dF9iZTMyKCZ3LT5iciwgMCk7IC8qIHR1cm4gb2ZmIGJhc2UgYWRkcmVzcyAqLworCQlvdXRfYmUzMigmdy0+b3IsIDApOwkvKiB0dXJuIG9mZiB3aW5kb3cgKi8KKwkJb3V0X2JlMzIoJnctPmJyLCAwKTsJLyogdHVybiBvZmYgYmFzZSBhZGRyZXNzICovCiAKIAkJZHByaW50aygiU29ja2V0ICV1OiBVbm1hcHBlZCBpbyB3aW5kb3cgJXUgYXQgJSM4Ljh4LCAiCiAJCQkiT1IgPSAlIzguOHguXG4iLCBsc29jaywgaW8tPm1hcCwgdy0+YnIsIHctPm9yKTsKQEAgLTExMjksMzUgKzEwMzksMzUgQEAKIAogCS8qIGNvcHkgdGhlIHN0cnVjdCBhbmQgbW9kaWZ5IHRoZSBjb3B5ICovCiAJcy0+aW9fd2luW2lvLT5tYXBdID0gKmlvOwotCXMtPmlvX3dpbltpby0+bWFwXS5mbGFncyAmPSAoTUFQX1dSUFJPVAotCQkJCSAgICAgfCBNQVBfMTZCSVQKLQkJCQkgICAgIHwgTUFQX0FDVElWRSk7CisJcy0+aW9fd2luW2lvLT5tYXBdLmZsYWdzICY9IChNQVBfV1JQUk9UIHwgTUFQXzE2QklUIHwgTUFQX0FDVElWRSk7CiAJZHByaW50aygiU2V0SU9NYXAgZXhpdFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtOHh4X3NldF9tZW1fbWFwKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgKm1lbSkKK3N0YXRpYyBpbnQgbTh4eF9zZXRfbWVtX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywKKwkJCSAgICBzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgKm1lbSkKIHsKIAlpbnQgbHNvY2sgPSBjb250YWluZXJfb2Yoc29jaywgc3RydWN0IHNvY2tldF9pbmZvLCBzb2NrZXQpLT5zbG90OwogCXN0cnVjdCBzb2NrZXRfaW5mbyAqcyA9ICZzb2NrZXRbbHNvY2tdOwogCXN0cnVjdCBwY21jaWFfd2luICp3OwogCXN0cnVjdCBwY2NhcmRfbWVtX21hcCAqb2xkOwogCXVuc2lnbmVkIGludCByZWcsIHdpbm5yOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gcy0+cGNtY2lhOwogCi0JZHByaW50ayggIlNldE1lbU1hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkgICAgICAiJSM1LjVseCwgJSM1LjV4KVxuIiwgbHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLAotCSAgICAgIG1lbS0+c3BlZWQsIG1lbS0+c3RhdGljX3N0YXJ0LCBtZW0tPmNhcmRfc3RhcnQpOworCWRwcmludGsoIlNldE1lbU1hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKKwkJIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKKwkJbWVtLT5zcGVlZCwgbWVtLT5zdGF0aWNfc3RhcnQsIG1lbS0+Y2FyZF9zdGFydCk7CiAKIAlpZiAoKG1lbS0+bWFwID49IFBDTUNJQV9NRU1fV0lOX05PKQotLy8JICAgIHx8ICgobWVtLT5zKSA+PSBQQ01DSUFfTUVNX1dJTl9TSVpFKQorLy8gICAgICAgICAgfHwgKChtZW0tPnMpID49IFBDTUNJQV9NRU1fV0lOX1NJWkUpCiAJICAgIHx8IChtZW0tPmNhcmRfc3RhcnQgPj0gMHgwNDAwMDAwMCkKLQkgICAgfHwgKG1lbS0+c3RhdGljX3N0YXJ0ICYgMHhmZmYpICAgICAgICAgICAgICAgIC8qIDRLQnl0ZSByZXNvbHV0aW9uICovCi0JICAgIHx8IChtZW0tPmNhcmRfc3RhcnQgJiAweGZmZikpCisJICAgIHx8IChtZW0tPnN0YXRpY19zdGFydCAmIDB4ZmZmKQkvKiA0S0J5dGUgcmVzb2x1dGlvbiAqLworCSAgICB8fChtZW0tPmNhcmRfc3RhcnQgJiAweGZmZikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYoKHJlZyA9IG04eHhfZ2V0X2dyYXljb2RlKFBDTUNJQV9NRU1fV0lOX1NJWkUpKSA9PSAtMSkgewotCQlwcmludGsoICJDYW5ub3Qgc2V0IHNpemUgdG8gMHglMDh4LlxuIiwgUENNQ0lBX01FTV9XSU5fU0laRSk7CisJaWYgKChyZWcgPSBtOHh4X2dldF9ncmF5Y29kZShQQ01DSUFfTUVNX1dJTl9TSVpFKSkgPT0gLTEpIHsKKwkJcHJpbnRrKCJDYW5ub3Qgc2V0IHNpemUgdG8gMHglMDh4LlxuIiwgUENNQ0lBX01FTV9XSU5fU0laRSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZWcgPDw9IDI3OwpAQCAtMTE2Niw1MCArMTA3Niw0NyBAQAogCiAJLyogU2V0dXAgdGhlIHdpbmRvdyBpbiB0aGUgcGNtY2lhIGNvbnRyb2xsZXIgKi8KIAotCXcgPSAodm9pZCAqKSAmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGJyMDsKKwl3ID0gKHZvaWQgKikmcGNtY2lhLT5wY21jX3BicjA7CiAJdyArPSB3aW5ucjsKIAogCXJlZyB8PSBsc29jayA8PCAyOwogCi0JcmVnIHw9IG04eHhfZ2V0X3NwZWVkKG1lbS0+c3BlZWQsIDApOworCXJlZyB8PSBtOHh4X2dldF9zcGVlZChtZW0tPnNwZWVkLCAwLCBzLT5idXNfZnJlcSk7CiAKLQlpZihtZW0tPmZsYWdzICYgTUFQX0FUVFJJQikKLQkJcmVnIHw9ICBNOFhYX1BDTUNJQV9QT1JfQVRUUk1FTTsKKwlpZiAobWVtLT5mbGFncyAmIE1BUF9BVFRSSUIpCisJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfQVRUUk1FTTsKIAotCWlmKG1lbS0+ZmxhZ3MgJiBNQVBfV1JQUk9UKQorCWlmIChtZW0tPmZsYWdzICYgTUFQX1dSUFJPVCkKIAkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9XUlBST1Q7CiAKLQlpZihtZW0tPmZsYWdzICYgTUFQXzE2QklUKQorCWlmIChtZW0tPmZsYWdzICYgTUFQXzE2QklUKQogCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SXzE2QklUOwogCi0JaWYobWVtLT5mbGFncyAmIE1BUF9BQ1RJVkUpCisJaWYgKG1lbS0+ZmxhZ3MgJiBNQVBfQUNUSVZFKQogCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX1ZBTElEOwogCiAJb3V0X2JlMzIoJnctPm9yLCByZWcpOwogCiAJZHByaW50aygiU29ja2V0ICV1OiBNYXBwZWQgbWVtb3J5IHdpbmRvdyAldSBhdCAlIzguOHgsICIKLQkgICAgICAiT1IgPSAlIzguOHguXG4iLCBsc29jaywgbWVtLT5tYXAsIHctPmJyLCB3LT5vcik7CisJCSJPUiA9ICUjOC44eC5cbiIsIGxzb2NrLCBtZW0tPm1hcCwgdy0+YnIsIHctPm9yKTsKIAotCWlmKG1lbS0+ZmxhZ3MgJiBNQVBfQUNUSVZFKSB7CisJaWYgKG1lbS0+ZmxhZ3MgJiBNQVBfQUNUSVZFKSB7CiAJCS8qIGdldCB0aGUgbmV3IGJhc2UgYWRkcmVzcyAqLwogCQltZW0tPnN0YXRpY19zdGFydCA9IFBDTUNJQV9NRU1fV0lOX0JBU0UgKwotCQkJKFBDTUNJQV9NRU1fV0lOX1NJWkUgKiB3aW5ucikKLQkJCSsgbWVtLT5jYXJkX3N0YXJ0OworCQkgICAgKFBDTUNJQV9NRU1fV0lOX1NJWkUgKiB3aW5ucikKKwkJICAgICsgbWVtLT5jYXJkX3N0YXJ0OwogCX0KIAogCWRwcmludGsoIlNldE1lbU1hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkgICAgICAiJSM1LjVseCwgJSM1LjV4KVxuIiwgbHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLAotCSAgICAgIG1lbS0+c3BlZWQsIG1lbS0+c3RhdGljX3N0YXJ0LCBtZW0tPmNhcmRfc3RhcnQpOworCQkiJSM1LjVseCwgJSM1LjV4KVxuIiwgbHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLAorCQltZW0tPnNwZWVkLCBtZW0tPnN0YXRpY19zdGFydCwgbWVtLT5jYXJkX3N0YXJ0KTsKIAogCS8qIGNvcHkgdGhlIHN0cnVjdCBhbmQgbW9kaWZ5IHRoZSBjb3B5ICovCiAKIAlvbGQgPSAmcy0+bWVtX3dpblttZW0tPm1hcF07CiAKIAkqb2xkID0gKm1lbTsKLQlvbGQtPmZsYWdzICY9IChNQVBfQVRUUklCCi0JCSAgICAgICB8IE1BUF9XUlBST1QKLQkJICAgICAgIHwgTUFQXzE2QklUCi0JCSAgICAgICB8IE1BUF9BQ1RJVkUpOworCW9sZC0+ZmxhZ3MgJj0gKE1BUF9BVFRSSUIgfCBNQVBfV1JQUk9UIHwgTUFQXzE2QklUIHwgTUFQX0FDVElWRSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjAsNyArMTEyNyw3IEBACiAJcGNjYXJkX2lvX21hcCBpbyA9IHsgMCwgMCwgMCwgMCwgMSB9OwogCXBjY2FyZF9tZW1fbWFwIG1lbSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwogCi0JZHByaW50ayggInNvY2tfaW5pdCglZClcbiIsIHMpOworCWRwcmludGsoInNvY2tfaW5pdCglZClcbiIsIHMpOwogCiAJbTh4eF9zZXRfc29ja2V0KHNvY2ssICZkZWFkX3NvY2tldCk7CiAJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9JT19XSU5fTk87IGkrKykgewpAQCAtMTIzNiwxMTEgKzExNDMsMTk1IEBACiAKIH0KIAotc3RhdGljIGludCBtOHh4X3N1c3BlbmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2spCitzdGF0aWMgaW50IG04eHhfc29ja19zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrKQogewogCXJldHVybiBtOHh4X3NldF9zb2NrZXQoc29jaywgJmRlYWRfc29ja2V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBwY2NhcmRfb3BlcmF0aW9ucyBtOHh4X3NlcnZpY2VzID0gewotCS5pbml0CT0gbTh4eF9zb2NrX2luaXQsCi0JLnN1c3BlbmQgPSBtOHh4X3N1c3BlbmQsCisJLmluaXQgPSBtOHh4X3NvY2tfaW5pdCwKKwkuc3VzcGVuZCA9IG04eHhfc29ja19zdXNwZW5kLAogCS5nZXRfc3RhdHVzID0gbTh4eF9nZXRfc3RhdHVzLAogCS5zZXRfc29ja2V0ID0gbTh4eF9zZXRfc29ja2V0LAogCS5zZXRfaW9fbWFwID0gbTh4eF9zZXRfaW9fbWFwLAogCS5zZXRfbWVtX21hcCA9IG04eHhfc2V0X21lbV9tYXAsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBtOHh4X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG04eHhfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBwY21jaWFfd2luICp3OwotCXVuc2lnbmVkIGludCBpLG07CisJdW5zaWduZWQgaW50IGksIG0sIGh3aXJxOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhOworCWludCBzdGF0dXM7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5ub2RlOwogCiAJcGNtY2lhX2luZm8oIiVzXG4iLCB2ZXJzaW9uKTsKIAotCWlmIChkcml2ZXJfcmVnaXN0ZXIoJm04eHhfZHJpdmVyKSkKLQkJcmV0dXJuIC0xOworCXBjbWNpYSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAocGNtY2lhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcGNtY2lhX3NjaGx2bCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlod2lycSA9IGlycV9tYXBbcGNtY2lhX3NjaGx2bF0uaHdpcnE7CisJaWYgKHBjbWNpYV9zY2hsdmwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW04eHhfcGdjcnhbMF0gPSAmcGNtY2lhLT5wY21jX3BnY3JhOworCW04eHhfcGdjcnhbMV0gPSAmcGNtY2lhLT5wY21jX3BnY3JiOwogCiAJcGNtY2lhX2luZm8oUENNQ0lBX0JPQVJEX01TRyAiIHVzaW5nICIgUENNQ0lBX1NMT1RfTVNHCi0JCSAgICAiIHdpdGggSVJRICV1LlxuIiwgcGNtY2lhX3NjaGx2bCk7CisJCSAgICAiIHdpdGggSVJRICV1ICAoJWQpLiBcbiIsIHBjbWNpYV9zY2hsdmwsIGh3aXJxKTsKIAogCS8qIENvbmZpZ3VyZSBTdGF0dXMgY2hhbmdlIGludGVycnVwdCAqLwogCi0JaWYocmVxdWVzdF9pcnEocGNtY2lhX3NjaGx2bCwgbTh4eF9pbnRlcnJ1cHQsIDAsCi0JCQkgICJtOHh4X3BjbWNpYSIsIE5VTEwpKSB7CisJaWYgKHJlcXVlc3RfaXJxKHBjbWNpYV9zY2hsdmwsIG04eHhfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCWRyaXZlcl9uYW1lLCBzb2NrZXQpKSB7CiAJCXBjbWNpYV9lcnJvcigiQ2Fubm90IGFsbG9jYXRlIElSUSAldSBmb3IgU0NITFZMIVxuIiwKIAkJCSAgICAgcGNtY2lhX3NjaGx2bCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQl3ID0gKHZvaWQgKikgJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BicjA7CisJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOwogCi0Jb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BzY3IsCi0JCU04WFhfUENNQ0lBX01BU0soMCl8IE04WFhfUENNQ0lBX01BU0soMSkpOworCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcHNjciwgTThYWF9QQ01DSUFfTUFTSygwKSB8IE04WFhfUENNQ0lBX01BU0soMSkpOworCWNscmJpdHMzMigmcGNtY2lhLT5wY21jX3BlciwgTThYWF9QQ01DSUFfTUFTSygwKSB8IE04WFhfUENNQ0lBX01BU0soMSkpOwogCi0Jb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlciwKLQkJaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyKSAmCi0JCX4oTThYWF9QQ01DSUFfTUFTSygwKXwgTThYWF9QQ01DSUFfTUFTSygxKSkpOworCS8qIGNvbm5lY3QgaW50ZXJydXB0IGFuZCBkaXNhYmxlIEN4T0UgKi8KIAotLyogY29ubmVjdCBpbnRlcnJ1cHQgYW5kIGRpc2FibGUgQ3hPRSAqLworCW91dF9iZTMyKE04WFhfUEdDUlgoMCksCisJCSBNOFhYX1BHQ1JYX0NYT0UgfCAobWtfaW50X2ludF9tYXNrKGh3aXJxKSA8PCAxNikpOworCW91dF9iZTMyKE04WFhfUEdDUlgoMSksCisJCSBNOFhYX1BHQ1JYX0NYT0UgfCAobWtfaW50X2ludF9tYXNrKGh3aXJxKSA8PCAxNikpOwogCi0Jb3V0X2JlMzIoTThYWF9QR0NSWCgwKSwgTThYWF9QR0NSWF9DWE9FIHwgKG1rX2ludF9pbnRfbWFzayhwY21jaWFfc2NobHZsKSA8PCAxNikpOwotCW91dF9iZTMyKE04WFhfUEdDUlgoMSksIE04WFhfUEdDUlhfQ1hPRSB8IChta19pbnRfaW50X21hc2socGNtY2lhX3NjaGx2bCkgPDwgMTYpKTsKKwkvKiBpbnRpYWxpemUgdGhlIGZpeGVkIG1lbW9yeSB3aW5kb3dzICovCiAKLS8qIGludGlhbGl6ZSB0aGUgZml4ZWQgbWVtb3J5IHdpbmRvd3MgKi8KLQotCWZvcihpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspewotCQlmb3IobSA9IDA7IG0gPCBQQ01DSUFfTUVNX1dJTl9OTzsgbSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKKwkJZm9yIChtID0gMDsgbSA8IFBDTUNJQV9NRU1fV0lOX05POyBtKyspIHsKIAkJCW91dF9iZTMyKCZ3LT5iciwgUENNQ0lBX01FTV9XSU5fQkFTRSArCi0JCQkJKFBDTUNJQV9NRU1fV0lOX1NJWkUKLQkJCQkgKiAobSArIGkgKiBQQ01DSUFfTUVNX1dJTl9OTykpKTsKKwkJCQkgKFBDTUNJQV9NRU1fV0lOX1NJWkUKKwkJCQkgICogKG0gKyBpICogUENNQ0lBX01FTV9XSU5fTk8pKSk7CiAKLQkJCW91dF9iZTMyKCZ3LT5vciwgMCk7ICAvKiBzZXQgdG8gbm90IHZhbGlkICovCisJCQlvdXRfYmUzMigmdy0+b3IsIDApOwkvKiBzZXQgdG8gbm90IHZhbGlkICovCiAKIAkJCXcrKzsKIAkJfQogCX0KIAotLyogdHVybiBvZmYgdm9sdGFnZSAqLworCS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KIAl2b2x0YWdlX3NldCgwLCAwLCAwKTsKIAl2b2x0YWdlX3NldCgxLCAwLCAwKTsKIAotLyogRW5hYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCisJLyogRW5hYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCiAJaGFyZHdhcmVfZW5hYmxlKDApOwogCWhhcmR3YXJlX2VuYWJsZSgxKTsKIAotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbTh4eF9kZXZpY2UpOwotCi0JZm9yIChpID0gMCA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKIAkJc29ja2V0W2ldLnNsb3QgPSBpOwogCQlzb2NrZXRbaV0uc29ja2V0Lm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCXNvY2tldFtpXS5zb2NrZXQuZmVhdHVyZXMgPSBTU19DQVBfUENDQVJEIHwgU1NfQ0FQX01FTV9BTElHTiB8IFNTX0NBUF9TVEFUSUNfTUFQOworCQlzb2NrZXRbaV0uc29ja2V0LmZlYXR1cmVzID0KKwkJICAgIFNTX0NBUF9QQ0NBUkQgfCBTU19DQVBfTUVNX0FMSUdOIHwgU1NfQ0FQX1NUQVRJQ19NQVA7CiAJCXNvY2tldFtpXS5zb2NrZXQuaXJxX21hc2sgPSAweDAwMDsKIAkJc29ja2V0W2ldLnNvY2tldC5tYXBfc2l6ZSA9IDB4MTAwMDsKIAkJc29ja2V0W2ldLnNvY2tldC5pb19vZmZzZXQgPSAwOwotCQlzb2NrZXRbaV0uc29ja2V0LnBjaV9pcnEgPSBpICA/IDcgOiA5OworCQlzb2NrZXRbaV0uc29ja2V0LnBjaV9pcnEgPSBwY21jaWFfc2NobHZsOwogCQlzb2NrZXRbaV0uc29ja2V0Lm9wcyA9ICZtOHh4X3NlcnZpY2VzOwotCQlzb2NrZXRbaV0uc29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfaW9keW5fb3BzOworCQlzb2NrZXRbaV0uc29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfbm9uc3RhdGljX29wczsKIAkJc29ja2V0W2ldLnNvY2tldC5jYl9kZXYgPSBOVUxMOwotCQlzb2NrZXRbaV0uc29ja2V0LmRldi5wYXJlbnQgPSAmbTh4eF9kZXZpY2UuZGV2OworCQlzb2NrZXRbaV0uc29ja2V0LmRldi5wYXJlbnQgPSAmb2ZkZXYtPmRldjsKKwkJc29ja2V0W2ldLnBjbWNpYSA9IHBjbWNpYTsKKwkJc29ja2V0W2ldLmJ1c19mcmVxID0gcHBjX3Byb2NfZnJlcTsKKwkJc29ja2V0W2ldLmh3aXJxID0gaHdpcnE7CisKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykKLQkJcGNtY2lhX3JlZ2lzdGVyX3NvY2tldCgmc29ja2V0W2ldLnNvY2tldCk7CisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKKwkJc3RhdHVzID0gcGNtY2lhX3JlZ2lzdGVyX3NvY2tldCgmc29ja2V0W2ldLnNvY2tldCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcGNtY2lhX2Vycm9yKCJTb2NrZXQgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IG04eHhfZXhpdCh2b2lkKQorc3RhdGljIGludCBtOHh4X3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKIHsKLQlpbnQgaTsKKwl1MzIgbSwgaTsKKwlzdHJ1Y3QgcGNtY2lhX3dpbiAqdzsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHNvY2tldFswXS5wY21jaWE7CiAKKwlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykgeworCQl3ID0gKHZvaWQgKikmcGNtY2lhLT5wY21jX3BicjA7CisKKwkJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wc2NyLCBNOFhYX1BDTUNJQV9NQVNLKGkpKTsKKwkJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wZXIsCisJCQkgaW5fYmUzMigmcGNtY2lhLT5wY21jX3BlcikgJiB+TThYWF9QQ01DSUFfTUFTSyhpKSk7CisKKwkJLyogdHVybiBvZmYgaW50ZXJydXB0IGFuZCBkaXNhYmxlIEN4T0UgKi8KKwkJb3V0X2JlMzIoTThYWF9QR0NSWChpKSwgTThYWF9QR0NSWF9DWE9FKTsKKworCQkvKiB0dXJuIG9mZiBtZW1vcnkgd2luZG93cyAqLworCQlmb3IgKG0gPSAwOyBtIDwgUENNQ0lBX01FTV9XSU5fTk87IG0rKykgeworCQkJb3V0X2JlMzIoJnctPm9yLCAwKTsJLyogc2V0IHRvIG5vdCB2YWxpZCAqLworCQkJdysrOworCQl9CisKKwkJLyogdHVybiBvZmYgdm9sdGFnZSAqLworCQl2b2x0YWdlX3NldChpLCAwLCAwKTsKKworCQkvKiBkaXNhYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCisJCWhhcmR3YXJlX2Rpc2FibGUoaSk7CisJfQogCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKQogCQlwY21jaWFfdW5yZWdpc3Rlcl9zb2NrZXQoJnNvY2tldFtpXS5zb2NrZXQpOwogCi0JbTh4eF9zaHV0ZG93bigpOworCWZyZWVfaXJxKHBjbWNpYV9zY2hsdmwsIE5VTEwpOwogCi0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJm04eHhfZGV2aWNlKTsKLQlkcml2ZXJfdW5yZWdpc3RlcigmbTh4eF9kcml2ZXIpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG04eHhfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJnBkZXYtPmRldiwgc3RhdGUpOworfQorCitzdGF0aWMgaW50IG04eHhfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZSgmcGRldi0+ZGV2KTsKK30KKyNlbHNlCisjZGVmaW5lIG04eHhfc3VzcGVuZCBOVUxMCisjZGVmaW5lIG04eHhfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtOHh4X3BjbWNpYV9tYXRjaFtdID0geworCXsKKwkgLnR5cGUgPSAicGNtY2lhIiwKKwkgLmNvbXBhdGlibGUgPSAiZnNsLHBxLXBjbWNpYSIsCisJIH0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtOHh4X3BjbWNpYV9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIG04eHhfcGNtY2lhX2RyaXZlciA9IHsKKwkubmFtZSA9IChjaGFyICopZHJpdmVyX25hbWUsCisJLm1hdGNoX3RhYmxlID0gbTh4eF9wY21jaWFfbWF0Y2gsCisJLnByb2JlID0gbTh4eF9wcm9iZSwKKwkucmVtb3ZlID0gbTh4eF9yZW1vdmUsCisJLnN1c3BlbmQgPSBtOHh4X3N1c3BlbmQsCisJLnJlc3VtZSA9IG04eHhfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTh4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbTh4eF9wY21jaWFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG04eHhfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZtOHh4X3BjbWNpYV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChtOHh4X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL0tjb25maWcKaW5kZXggMTk1OWNlZi4uODIxOTMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvS2NvbmZpZworKysgYi9kcml2ZXJzL3BucC9LY29uZmlnCkBAIC0yLDExICsyLDkgQEAKICMgUGx1ZyBhbmQgUGxheSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIlBsdWcgYW5kIFBsYXkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhBU19JT01FTQotCi1jb25maWcgUE5QCittZW51Y29uZmlnIFBOUAogCWJvb2wgIlBsdWcgYW5kIFBsYXkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQogCWRlcGVuZHMgb24gSVNBIHx8IEFDUEkKIAktLS1oZWxwLS0tCiAJICBQbHVnIGFuZCBQbGF5IChQblApIGlzIGEgc3RhbmRhcmQgZm9yIHBlcmlwaGVyYWxzIHdoaWNoIGFsbG93cyB0aG9zZQpAQCAtMjIsMTUgKzIwLDE1IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKK2lmIFBOUAorCiBjb25maWcgUE5QX0RFQlVHCiAJYm9vbCAiUG5QIERlYnVnIE1lc3NhZ2VzIgotCWRlcGVuZHMgb24gUE5QCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdGhlIFBsdWcgYW5kIFBsYXkgTGF5ZXIgdG8gcHJpbnQgZGVidWcgbWVzc2FnZXMuCiAJICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGRldmVsb3BpbmcgYSBQblAgZHJpdmVyIG9yIHRyb3VibGVzaG9vdGluZy4KIAogY29tbWVudCAiUHJvdG9jb2xzIgotCWRlcGVuZHMgb24gUE5QCiAKIHNvdXJjZSAiZHJpdmVycy9wbnAvaXNhcG5wL0tjb25maWciCiAKQEAgLTM4LDUgKzM2LDQgQEAKIAogc291cmNlICJkcml2ZXJzL3BucC9wbnBhY3BpL0tjb25maWciCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBQTlAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnIGIvZHJpdmVycy9wbnAvaXNhcG5wL0tjb25maWcKaW5kZXggNTc4NjUxZS4uZjFlZjM2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvaXNhcG5wL0tjb25maWcKKysrIGIvZHJpdmVycy9wbnAvaXNhcG5wL0tjb25maWcKQEAgLTMsNyArMyw3IEBACiAjCiBjb25maWcgSVNBUE5QCiAJYm9vbCAiSVNBIFBsdWcgYW5kIFBsYXkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBOUCAmJiBJU0EKKwlkZXBlbmRzIG9uIElTQQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2Ugc3VwcG9ydCBmb3IgSVNBIFBsdWcgYW5kIFBsYXkgZGV2aWNlcy4KIAkgIFNvbWUgaW5mb3JtYXRpb24gaXMgaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9pc2FwbnAudHh0Pi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMgYi9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCmluZGV4IGEwYjE1ODcuLjkxNGQwMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYwpAQCAtMzcwLDggKzM3MCw2IEBACiAjaWYgMAogCXByaW50ayhLRVJOX0RFQlVHICJ0YWcgPSAweCV4LCB0eXBlID0gMHgleCwgc2l6ZSA9ICVpXG4iLCB0YWcsICp0eXBlLCAqc2l6ZSk7CiAjZW5kaWYKLQlpZiAodHlwZSA9PSAwKQkJCQkvKiB3cm9uZyB0eXBlICovCi0JCXJldHVybiAtMTsKIAlpZiAoKnR5cGUgPT0gMHhmZiAmJiAqc2l6ZSA9PSAweGZmZmYpCS8qIHByb2JhYmx5IGludmFsaWQgZGF0YSAqLwogCQlyZXR1cm4gLTE7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL0tjb25maWcgYi9kcml2ZXJzL3BucC9wbnBiaW9zL0tjb25maWcKaW5kZXggZmFiODQ4Yy4uYjk4NmQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKICMKIGNvbmZpZyBQTlBCSU9TCiAJYm9vbCAiUGx1ZyBhbmQgUGxheSBCSU9TIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBQTlAgJiYgSVNBICYmIFg4NiAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIElTQSAmJiBYODYgJiYgRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCSAgTGludXggdXNlcyB0aGUgUE5QQklPUyBhcyBkZWZpbmVkIGluICJQbHVnIGFuZCBQbGF5IEJJT1MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKaW5kZXggM2EyMDFiNy4uMDNiYWYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKQEAgLTE2MCw2ICsxNjAsNyBAQAogewogCXN0YXRpYyBzdHJ1Y3QgcG5wX2RvY2tpbmdfc3RhdGlvbl9pbmZvIG5vdzsKIAlpbnQgZG9ja2VkID0gLTEsIGQgPSAwOworCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIXVubG9hZGluZykKIAl7CiAJCWludCBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9NYWtlZmlsZSBiL2RyaXZlcnMvcHMzL01ha2VmaWxlCmluZGV4IGUyNTFkMWMuLjc0NjAzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcHMzL01ha2VmaWxlCkBAIC0xLDMgKzEsNiBAQAogb2JqLSQoQ09ORklHX1BTM19WVUFSVCkgKz0gdnVhcnQubwotb2JqLSQoQ09ORklHX1BTM19QUzNBVikgKz0gcHMzYXYubyBwczNhdl9jbWQubworb2JqLSQoQ09ORklHX1BTM19QUzNBVikgKz0gcHMzYXZfbW9kLm8KK3BzM2F2X21vZC1vYmpzCQkrPSBwczNhdi5vIHBzM2F2X2NtZC5vCitvYmotJChDT05GSUdfUFBDX1BTMykgKz0gc3lzLW1hbmFnZXItY29yZS5vCiBvYmotJChDT05GSUdfUFMzX1NZU19NQU5BR0VSKSArPSBzeXMtbWFuYWdlci5vCitvYmotJChDT05GSUdfUFMzX1NUT1JBR0UpICs9IHBzM3N0b3JfbGliLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzM2F2LmMgYi9kcml2ZXJzL3BzMy9wczNhdi5jCmluZGV4IDEzOTNlNjQuLjg1ZTIxNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3BzM2F2LmMKKysrIGIvZHJpdmVycy9wczMvcHMzYXYuYwpAQCAtMSwzMiArMSwzMCBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgotICogQ29weXJpZ2h0IDIwMDYsIDIwMDcgU29ueSBDb3Jwb3JhdGlvbgorICogIFBTMyBBViBiYWNrZW5kIHN1cHBvcnQuCiAgKgotICogQVYgYmFja2VuZCBzdXBwb3J0IGZvciBQUzMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KICNpbmNsdWRlIDxhc20vcHMzYXYuaD4KICNpbmNsdWRlIDxhc20vcHMzLmg+CiAKQEAgLTM5LDEzICszNywxMiBAQAogbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMDY0NCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcHMzYXYgewotCWludCBhdmFpbGFibGU7CiAJc3RydWN0IG11dGV4IG11dGV4OwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogCWludCBvcGVuX2NvdW50OwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXY7CiAKIAlpbnQgcmVnaW9uOwogCXN0cnVjdCBwczNhdl9wa3RfYXZfZ2V0X2h3X2NvbmYgYXZfaHdfY29uZjsKQEAgLTU1LDExICs1MiwxMyBAQAogCXUzMiBhdWRpb19wb3J0OwogCWludCBwczNhdl9tb2RlOwogCWludCBwczNhdl9tb2RlX29sZDsKLX0gcHMzYXY7Ci0KLXN0YXRpYyBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlIHBzM2F2X2RldiA9IHsKLQkubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MKLX07CisJdW5pb24geworCQlzdHJ1Y3QgcHMzYXZfcmVwbHlfaGRyIHJlcGx5X2hkcjsKKwkJdTggcmF3W1BTM0FWX0JVRl9TSVpFXTsKKwl9IHJlY3ZfYnVmOworCXZvaWQgKCpmbGlwX2N0bCkoaW50IG9uLCB2b2lkICpkYXRhKTsKKwl2b2lkICpmbGlwX2RhdGE7Cit9ICpwczNhdjsKIAogLyogY29sb3Igc3BhY2UgKi8KICNkZWZpbmUgWVVWNDQ0IFBTM0FWX0NNRF9WSURFT19DU19ZVVY0NDRfOApAQCAtMTY5LDcgKzE2OCw3IEBACiAJaWYgKGhkci0+Y2lkICYgUFMzQVZfRVZFTlRfQ01EX01BU0spIHsKIAkJdGFibGUgPSBwczNhdl9zZWFyY2hfY21kX3RhYmxlKGhkci0+Y2lkLCBQUzNBVl9FVkVOVF9DTURfTUFTSyk7CiAJCWlmICh0YWJsZSkKLQkJCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCQkicmVjdiBldmVudCBwYWNrZXQgY2lkOiUwOHggcG9ydDoweCV4IHNpemU6JWRcbiIsCiAJCQkJaGRyLT5jaWQsIHBzM2F2X2V2ZW50X2dldF9wb3J0X2lkKGhkci0+Y2lkKSwKIAkJCQloZHItPnNpemUpOwpAQCAtMTgyLDYgKzE4MSw0MSBAQAogCXJldHVybiAwOwogfQogCisKKyNkZWZpbmUgUE9MTElOR19JTlRFUlZBTCAgMjUJLyogaW4gbXNlYyAqLworCitzdGF0aWMgaW50IHBzM2F2X3Z1YXJ0X3dyaXRlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwkJCSAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGVycm9yOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwllcnJvciA9IHBzM192dWFydF93cml0ZShkZXYsIGJ1Ziwgc2l6ZSk7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiBlcnJvciA/IGVycm9yIDogc2l6ZTsKK30KKworc3RhdGljIGludCBwczNhdl92dWFydF9yZWFkKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHRpbWVvdXQpCit7CisJaW50IGVycm9yOworCWludCBsb29wY250ID0gMDsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwl0aW1lb3V0ID0gKHRpbWVvdXQgKyBQT0xMSU5HX0lOVEVSVkFMIC0gMSkgLyBQT0xMSU5HX0lOVEVSVkFMOworCXdoaWxlIChsb29wY250KysgPD0gdGltZW91dCkgeworCQllcnJvciA9IHBzM192dWFydF9yZWFkKGRldiwgYnVmLCBzaXplKTsKKwkJaWYgKCFlcnJvcikKKwkJCXJldHVybiBzaXplOworCQlpZiAoZXJyb3IgIT0gLUVBR0FJTikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcHMzX3Z1YXJ0X3JlYWQgZmFpbGVkICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJbXNsZWVwKFBPTExJTkdfSU5URVJWQUwpOworCX0KKwlyZXR1cm4gLUVXT1VMREJMT0NLOworfQorCiBzdGF0aWMgaW50IHBzM2F2X3NlbmRfY21kX3BrdChjb25zdCBzdHJ1Y3QgcHMzYXZfc2VuZF9oZHIgKnNlbmRfYnVmLAogCQkJICAgICAgc3RydWN0IHBzM2F2X3JlcGx5X2hkciAqcmVjdl9idWYsIGludCB3cml0ZV9sZW4sCiAJCQkgICAgICBpbnQgcmVhZF9sZW4pCkBAIC0xOTAsMTMgKzIyNCwxMyBAQAogCXUzMiBjbWQ7CiAJaW50IGV2ZW50OwogCi0JaWYgKCFwczNhdi5hdmFpbGFibGUpCisJaWYgKCFwczNhdikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBzZW5kIHBrdCAqLwotCXJlcyA9IHBzM2F2X3Z1YXJ0X3dyaXRlKHBzM2F2LmRldiwgc2VuZF9idWYsIHdyaXRlX2xlbik7CisJcmVzID0gcHMzYXZfdnVhcnRfd3JpdGUocHMzYXYtPmRldiwgc2VuZF9idWYsIHdyaXRlX2xlbik7CiAJaWYgKHJlcyA8IDApIHsKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkiJXM6IHBzM2F2X3Z1YXJ0X3dyaXRlKCkgZmFpbGVkIChyZXN1bHQ9JWQpXG4iLAogCQkJX19mdW5jX18sIHJlcyk7CiAJCXJldHVybiByZXM7CkBAIC0yMDYsMjAgKzI0MCwyMCBAQAogCWNtZCA9IHNlbmRfYnVmLT5jaWQ7CiAJZG8gewogCQkvKiByZWFkIGhlYWRlciAqLwotCQlyZXMgPSBwczNhdl92dWFydF9yZWFkKHBzM2F2LmRldiwgcmVjdl9idWYsIFBTM0FWX0hEUl9TSVpFLAorCQlyZXMgPSBwczNhdl92dWFydF9yZWFkKHBzM2F2LT5kZXYsIHJlY3ZfYnVmLCBQUzNBVl9IRFJfU0laRSwKIAkJCQkgICAgICAgdGltZW91dCk7CiAJCWlmIChyZXMgIT0gUFMzQVZfSERSX1NJWkUpIHsKLQkJCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCQkiJXM6IHBzM2F2X3Z1YXJ0X3JlYWQoKSBmYWlsZWQgKHJlc3VsdD0lZClcbiIsCiAJCQkJX19mdW5jX18sIHJlcyk7CiAJCQlyZXR1cm4gcmVzOwogCQl9CiAKIAkJLyogcmVhZCBib2R5ICovCi0JCXJlcyA9IHBzM2F2X3Z1YXJ0X3JlYWQocHMzYXYuZGV2LCAmcmVjdl9idWYtPmNpZCwKKwkJcmVzID0gcHMzYXZfdnVhcnRfcmVhZChwczNhdi0+ZGV2LCAmcmVjdl9idWYtPmNpZCwKIAkJCQkgICAgICAgcmVjdl9idWYtPnNpemUsIHRpbWVvdXQpOwogCQlpZiAocmVzIDwgMCkgewotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJCSIlczogcHMzYXZfdnVhcnRfcmVhZCgpIGZhaWxlZCAocmVzdWx0PSVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgcmVzKTsKIAkJCXJldHVybiByZXM7CkBAIC0yMzAsNyArMjY0LDcgQEAKIAl9IHdoaWxlIChldmVudCk7CiAKIAlpZiAoKGNtZCB8IFBTM0FWX1JFUExZX0JJVCkgIT0gcmVjdl9idWYtPmNpZCkgewotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgIiVzOiByZXBseSBlcnIgKHJlc3VsdD0leClcbiIsCisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsICIlczogcmVwbHkgZXJyIChyZXN1bHQ9JXgpXG4iLAogCQkJX19mdW5jX18sIHJlY3ZfYnVmLT5jaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNDUsNyArMjc5LDcgQEAKIAlpbnQgcmV0dXJuX2xlbjsKIAogCWlmIChyZWN2X2J1Zi0+dmVyc2lvbiAhPSBQUzNBVl9WRVJTSU9OKSB7Ci0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLCAicmVwbHlfcGFja2V0IGludmFsaWQgdmVyc2lvbjoleFxuIiwKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgInJlcGx5X3BhY2tldCBpbnZhbGlkIHZlcnNpb246JXhcbiIsCiAJCQlyZWN2X2J1Zi0+dmVyc2lvbik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTI2NywxNiArMzAxLDExIEBACiAJCSBzdHJ1Y3QgcHMzYXZfc2VuZF9oZHIgKmJ1ZikKIHsKIAlpbnQgcmVzID0gMDsKLQlzdGF0aWMgdW5pb24gewotCQlzdHJ1Y3QgcHMzYXZfcmVwbHlfaGRyIHJlcGx5X2hkcjsKLQkJdTggcmF3W1BTM0FWX0JVRl9TSVpFXTsKLQl9IHJlY3ZfYnVmOwotCiAJdTMyICp0YWJsZTsKIAotCUJVR19PTighcHMzYXYuYXZhaWxhYmxlKTsKKwlCVUdfT04oIXBzM2F2KTsKIAotCW11dGV4X2xvY2soJnBzM2F2Lm11dGV4KTsKKwltdXRleF9sb2NrKCZwczNhdi0+bXV0ZXgpOwogCiAJdGFibGUgPSBwczNhdl9zZWFyY2hfY21kX3RhYmxlKGNpZCwgUFMzQVZfQ0lEX01BU0spOwogCUJVR19PTighdGFibGUpOwpAQCAtMjg4LDcgKzMxNyw3IEBACiAJcHMzYXZfc2V0X2hkcihjaWQsIHNlbmRfbGVuLCBidWYpOwogCiAJLyogc2VuZCBwYWNrZXQgdmlhIHZ1YXJ0ICovCi0JcmVzID0gcHMzYXZfc2VuZF9jbWRfcGt0KGJ1ZiwgJnJlY3ZfYnVmLnJlcGx5X2hkciwgc2VuZF9sZW4sCisJcmVzID0gcHMzYXZfc2VuZF9jbWRfcGt0KGJ1ZiwgJnBzM2F2LT5yZWN2X2J1Zi5yZXBseV9oZHIsIHNlbmRfbGVuLAogCQkJCSB1c3JfYnVmX3NpemUpOwogCWlmIChyZXMgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtMjk4LDcgKzMyNyw3IEBACiAJfQogCiAJLyogcHJvY2VzcyByZXBseSBwYWNrZXQgKi8KLQlyZXMgPSBwczNhdl9wcm9jZXNzX3JlcGx5X3BhY2tldChidWYsICZyZWN2X2J1Zi5yZXBseV9oZHIsCisJcmVzID0gcHMzYXZfcHJvY2Vzc19yZXBseV9wYWNrZXQoYnVmLCAmcHMzYXYtPnJlY3ZfYnVmLnJlcGx5X2hkciwKIAkJCQkJIHVzcl9idWZfc2l6ZSk7CiAJaWYgKHJlcyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcHV0X3JldHVybl9zdGF0dXMoKSBmYWlsZWQgKHJlc3VsdD0lZClcbiIsCkBAIC0zMDYsMTEgKzMzNSwxMSBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKKwltdXRleF91bmxvY2soJnBzM2F2LT5tdXRleCk7CiAJcmV0dXJuIDA7CiAKICAgICAgIGVycjoKLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKKwltdXRleF91bmxvY2soJnBzM2F2LT5tdXRleCk7CiAJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIGNpZDoleCByZXM6JWRcbiIsIF9fZnVuY19fLCBjaWQsIHJlcyk7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTMxOSwxMSArMzQ4LDExIEBACiB7CiAJaW50IGksIG51bV9vZl9hdl9wb3J0LCByZXM7CiAKLQludW1fb2ZfYXZfcG9ydCA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKwotCQkJIHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CisJbnVtX29mX2F2X3BvcnQgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCisJCQkgcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CiAJLyogdmlkZW8gbXV0ZSBvbiAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfYXZfcG9ydDsgaSsrKSB7Ci0JCXJlcyA9IHBzM2F2X2NtZF9hdl92aWRlb19tdXRlKDEsICZwczNhdi5hdl9wb3J0W2ldLCBtdXRlKTsKKwkJcmVzID0gcHMzYXZfY21kX2F2X3ZpZGVvX211dGUoMSwgJnBzM2F2LT5hdl9wb3J0W2ldLCBtdXRlKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzM1LDEzICszNjQsMTMgQEAKIHsKIAlpbnQgaSwgbnVtX29mX2hkbWlfcG9ydCwgbnVtX29mX2F2X3BvcnQsIHJlczsKIAotCW51bV9vZl9oZG1pX3BvcnQgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pOwotCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCi0JCQkgcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aTsKKwludW1fb2ZfaGRtaV9wb3J0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWk7CisJbnVtX29mX2F2X3BvcnQgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCisJCQkgcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CiAKIAkvKiB0diBtdXRlICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9vZl9oZG1pX3BvcnQ7IGkrKykgewotCQlyZXMgPSBwczNhdl9jbWRfYXZfdHZfbXV0ZShwczNhdi5hdl9wb3J0W2ldLAorCQlyZXMgPSBwczNhdl9jbWRfYXZfdHZfbXV0ZShwczNhdi0+YXZfcG9ydFtpXSwKIAkJCQkJICAgUFMzQVZfQ01EX01VVEVfT04pOwogCQlpZiAocmVzIDwgMCkKIAkJCXJldHVybiAtMTsKQEAgLTM1MCwxMSArMzc5LDExIEBACiAKIAkvKiB2aWRlbyBtdXRlIG9uICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9vZl9hdl9wb3J0OyBpKyspIHsKLQkJcmVzID0gcHMzYXZfY21kX2F2X3ZpZGVvX2Rpc2FibGVfc2lnKHBzM2F2LmF2X3BvcnRbaV0pOworCQlyZXMgPSBwczNhdl9jbWRfYXZfdmlkZW9fZGlzYWJsZV9zaWcocHMzYXYtPmF2X3BvcnRbaV0pOwogCQlpZiAocmVzIDwgMCkKIAkJCXJldHVybiAtMTsKIAkJaWYgKGkgPCBudW1fb2ZfaGRtaV9wb3J0KSB7Ci0JCQlyZXMgPSBwczNhdl9jbWRfYXZfdHZfbXV0ZShwczNhdi5hdl9wb3J0W2ldLAorCQkJcmVzID0gcHMzYXZfY21kX2F2X3R2X211dGUocHMzYXYtPmF2X3BvcnRbaV0sCiAJCQkJCQkgICBQUzNBVl9DTURfTVVURV9PRkYpOwogCQkJaWYgKHJlcyA8IDApCiAJCQkJcmV0dXJuIC0xOwpAQCAtMzY5LDE3ICszOTgsMTcgQEAKIHsKIAlpbnQgaSwgbnVtX29mX2F2X3BvcnQsIG51bV9vZl9vcHRfcG9ydCwgcmVzOwogCi0JbnVtX29mX2F2X3BvcnQgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pICsKLQkJCSBwczNhdi5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOwotCW51bV9vZl9vcHRfcG9ydCA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX3NwZGlmOworCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKworCQkJIHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOworCW51bV9vZl9vcHRfcG9ydCA9IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9zcGRpZjsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfYXZfcG9ydDsgaSsrKSB7Ci0JCXJlcyA9IHBzM2F2X2NtZF9hdl9hdWRpb19tdXRlKDEsICZwczNhdi5hdl9wb3J0W2ldLCBtdXRlKTsKKwkJcmVzID0gcHMzYXZfY21kX2F2X2F1ZGlvX211dGUoMSwgJnBzM2F2LT5hdl9wb3J0W2ldLCBtdXRlKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBudW1fb2Zfb3B0X3BvcnQ7IGkrKykgewotCQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fbXV0ZSgxLCAmcHMzYXYub3B0X3BvcnRbaV0sIG11dGUpOworCQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fbXV0ZSgxLCAmcHMzYXYtPm9wdF9wb3J0W2ldLCBtdXRlKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzk0LDQwICs0MjMsNDAgQEAKIAlzdHJ1Y3QgcHMzYXZfcGt0X2F1ZGlvX21vZGUgYXVkaW9fbW9kZTsKIAl1MzIgbGVuID0gMDsKIAotCW51bV9vZl9hdWRpbyA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKwotCQkgICAgICAgcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aSArCi0JCSAgICAgICBwczNhdi5hdl9od19jb25mLm51bV9vZl9zcGRpZjsKKwludW1fb2ZfYXVkaW8gPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCisJCSAgICAgICBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aSArCisJCSAgICAgICBwczNhdi0+YXZfaHdfY29uZi5udW1fb2Zfc3BkaWY7CiAKIAlhdmJfcGFyYW0ubnVtX29mX3ZpZGVvX3BrdCA9IDA7CiAJYXZiX3BhcmFtLm51bV9vZl9hdWRpb19wa3QgPSBQUzNBVl9BVkJfTlVNX0FVRElPOwkvKiBhbHdheXMgMCAqLwogCWF2Yl9wYXJhbS5udW1fb2ZfYXZfdmlkZW9fcGt0ID0gMDsKLQlhdmJfcGFyYW0ubnVtX29mX2F2X2F1ZGlvX3BrdCA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2hkbWk7CisJYXZiX3BhcmFtLm51bV9vZl9hdl9hdWRpb19wa3QgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaTsKIAotCXZpZCA9IHZpZGVvX21vZGVfdGFibGVbcHMzYXYucHMzYXZfbW9kZV0udmlkOworCXZpZCA9IHZpZGVvX21vZGVfdGFibGVbcHMzYXYtPnBzM2F2X21vZGVdLnZpZDsKIAogCS8qIGF1ZGlvIG11dGUgKi8KIAlwczNhdl9zZXRfYXVkaW9fbXV0ZShQUzNBVl9DTURfTVVURV9PTik7CiAKIAkvKiBhdWRpbyBpbmFjdGl2ZSAqLwotCXJlcyA9IHBzM2F2X2NtZF9hdWRpb19hY3RpdmUoMCwgcHMzYXYuYXVkaW9fcG9ydCk7CisJcmVzID0gcHMzYXZfY21kX2F1ZGlvX2FjdGl2ZSgwLCBwczNhdi0+YXVkaW9fcG9ydCk7CiAJaWYgKHJlcyA8IDApCi0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJInBzM2F2X2NtZF9hdWRpb19hY3RpdmUgT0ZGIGZhaWxlZFxuIik7CiAKIAkvKiBhdWRpb19wa3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2F1ZGlvOyBpKyspIHsKLQkJcHMzYXZfY21kX3NldF9hdWRpb19tb2RlKCZhdWRpb19tb2RlLCBwczNhdi5hdl9wb3J0W2ldLCBjaCwgZnMsCi0JCQkJCSB3b3JkX2JpdHMsIGZvcm1hdCwgc291cmNlKTsKLQkJaWYgKGkgPCBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pKSB7CisJCXBzM2F2X2NtZF9zZXRfYXVkaW9fbW9kZSgmYXVkaW9fbW9kZSwgcHMzYXYtPmF2X3BvcnRbaV0sIGNoLAorCQkJCQkgZnMsIHdvcmRfYml0cywgZm9ybWF0LCBzb3VyY2UpOworCQlpZiAoaSA8IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9oZG1pKSB7CiAJCQkvKiBoZG1pIG9ubHkgKi8KIAkJCWxlbiArPSBwczNhdl9jbWRfc2V0X2F2X2F1ZGlvX3BhcmFtKCZhdmJfcGFyYW0uYnVmW2xlbl0sCi0JCQkJCQkJICAgIHBzM2F2LmF2X3BvcnRbaV0sCisJCQkJCQkJICAgIHBzM2F2LT5hdl9wb3J0W2ldLAogCQkJCQkJCSAgICAmYXVkaW9fbW9kZSwgdmlkKTsKIAkJfQogCQkvKiBhdWRpb19tb2RlIHBrdCBzaG91bGQgYmUgc2VudCBzZXBhcmF0ZWx5ICovCiAJCXJlcyA9IHBzM2F2X2NtZF9hdWRpb19tb2RlKCZhdWRpb19tb2RlKTsKIAkJaWYgKHJlcyA8IDApCi0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkJInBzM2F2X2NtZF9hdWRpb19tb2RlIGZhaWxlZCwgcG9ydDoleFxuIiwgaSk7CiAJfQogCkBAIC00MzUsMTUgKzQ2NCwxNiBAQAogCWxlbiArPSBvZmZzZXRvZihzdHJ1Y3QgcHMzYXZfcGt0X2F2Yl9wYXJhbSwgYnVmKTsKIAlyZXMgPSBwczNhdl9jbWRfYXZiX3BhcmFtKCZhdmJfcGFyYW0sIGxlbik7CiAJaWYgKHJlcyA8IDApCi0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLCAicHMzYXZfY21kX2F2Yl9wYXJhbSBmYWlsZWRcbiIpOworCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLCAicHMzYXZfY21kX2F2Yl9wYXJhbSBmYWlsZWRcbiIpOwogCiAJLyogYXVkaW8gbXV0ZSAqLwogCXBzM2F2X3NldF9hdWRpb19tdXRlKFBTM0FWX0NNRF9NVVRFX09GRik7CiAKIAkvKiBhdWRpbyBhY3RpdmUgKi8KLQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fYWN0aXZlKDEsIHBzM2F2LmF1ZGlvX3BvcnQpOworCXJlcyA9IHBzM2F2X2NtZF9hdWRpb19hY3RpdmUoMSwgcHMzYXYtPmF1ZGlvX3BvcnQpOwogCWlmIChyZXMgPCAwKQotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgInBzM2F2X2NtZF9hdWRpb19hY3RpdmUgT04gZmFpbGVkXG4iKTsKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKKwkJCSJwczNhdl9jbWRfYXVkaW9fYWN0aXZlIE9OIGZhaWxlZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1Niw3ICs0ODYsNyBAQAogCXBzM2F2X3NldF9hdl92aWRlb19tdXRlKFBTM0FWX0NNRF9NVVRFX09OKTsKIAogCS8qIHdha2UgdXAgcHMzYXZkIHRvIGRvIHRoZSBhY3R1YWwgdmlkZW8gbW9kZSBzZXR0aW5nICovCi0JcXVldWVfd29yayhwczNhdi53cSwgJnBzM2F2LndvcmspOworCXF1ZXVlX3dvcmsocHMzYXYtPndxLCAmcHMzYXYtPndvcmspOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NzMsOCArNTAzLDggQEAKIAogCWF2Yl9wYXJhbS5udW1fb2ZfdmlkZW9fcGt0ID0gUFMzQVZfQVZCX05VTV9WSURFTzsJLyogbnVtIG9mIGhlYWQgKi8KIAlhdmJfcGFyYW0ubnVtX29mX2F1ZGlvX3BrdCA9IDA7Ci0JYXZiX3BhcmFtLm51bV9vZl9hdl92aWRlb19wa3QgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pICsKLQkJCQkJcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aTsKKwlhdmJfcGFyYW0ubnVtX29mX2F2X3ZpZGVvX3BrdCA9IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9oZG1pICsKKwkJCQkJcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CiAJYXZiX3BhcmFtLm51bV9vZl9hdl9hdWRpb19wa3QgPSAwOwogCiAJLyogdmlkZW8gc2lnbmFsIG9mZiAqLwpAQCAtNDg0LDIxICs1MTQsMjEgQEAKIAlpZiAoaWQgJiBQUzNBVl9NT0RFX0hEQ1BfT0ZGKSB7CiAJCXJlcyA9IHBzM2F2X2NtZF9hdl9oZG1pX21vZGUoUFMzQVZfQ01EX0FWX0hETUlfSERDUF9PRkYpOwogCQlpZiAocmVzID09IFBTM0FWX1NUQVRVU19VTlNVUFBPUlRFRF9IRE1JX01PREUpCi0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgIk5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgIk5vdCBzdXBwb3J0ZWRcbiIpOwogCQllbHNlIGlmIChyZXMpCi0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkJInBzM2F2X2NtZF9hdl9oZG1pX21vZGUgZmFpbGVkXG4iKTsKIAl9IGVsc2UgaWYgKG9sZF9pZCAmIFBTM0FWX01PREVfSERDUF9PRkYpIHsKIAkJcmVzID0gcHMzYXZfY21kX2F2X2hkbWlfbW9kZShQUzNBVl9DTURfQVZfSERNSV9NT0RFX05PUk1BTCk7CiAJCWlmIChyZXMgPCAwICYmIHJlcyAhPSBQUzNBVl9TVEFUVVNfVU5TVVBQT1JURURfSERNSV9NT0RFKQotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJCSJwczNhdl9jbWRfYXZfaGRtaV9tb2RlIGZhaWxlZFxuIik7CiAJfQogCiAJLyogdmlkZW9fcGt0ICovCiAJZm9yIChpID0gMDsgaSA8IGF2Yl9wYXJhbS5udW1fb2ZfdmlkZW9fcGt0OyBpKyspCiAJCWxlbiArPSBwczNhdl9jbWRfc2V0X3ZpZGVvX21vZGUoJmF2Yl9wYXJhbS5idWZbbGVuXSwKLQkJCQkJCXBzM2F2LmhlYWRbaV0sIHZpZGVvX21vZGUtPnZpZCwKKwkJCQkJCXBzM2F2LT5oZWFkW2ldLCB2aWRlb19tb2RlLT52aWQsCiAJCQkJCQl2aWRlb19tb2RlLT5mbXQsIGlkKTsKIAkvKiBhdl92aWRlb19wa3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYXZiX3BhcmFtLm51bV9vZl9hdl92aWRlb19wa3Q7IGkrKykgewpAQCAtNTA3LDEyICs1MzcsMTIgQEAKIAkJZWxzZQogCQkJYXZfdmlkZW9fY3MgPSB2aWRlb19tb2RlLT5jczsKICNpZm5kZWYgUFMzQVZfSERNSV9ZVVYKLQkJaWYgKHBzM2F2LmF2X3BvcnRbaV0gPT0gUFMzQVZfQ01EX0FWUE9SVF9IRE1JXzAgfHwKLQkJICAgIHBzM2F2LmF2X3BvcnRbaV0gPT0gUFMzQVZfQ01EX0FWUE9SVF9IRE1JXzEpCisJCWlmIChwczNhdi0+YXZfcG9ydFtpXSA9PSBQUzNBVl9DTURfQVZQT1JUX0hETUlfMCB8fAorCQkgICAgcHMzYXYtPmF2X3BvcnRbaV0gPT0gUFMzQVZfQ01EX0FWUE9SVF9IRE1JXzEpCiAJCQlhdl92aWRlb19jcyA9IFJHQjg7CS8qIHVzZSBSR0IgZm9yIEhETUkgKi8KICNlbmRpZgogCQlsZW4gKz0gcHMzYXZfY21kX3NldF9hdl92aWRlb19jcygmYXZiX3BhcmFtLmJ1ZltsZW5dLAotCQkJCQkJIHBzM2F2LmF2X3BvcnRbaV0sCisJCQkJCQkgcHMzYXYtPmF2X3BvcnRbaV0sCiAJCQkJCQkgdmlkZW9fbW9kZS0+dmlkLCBhdl92aWRlb19jcywKIAkJCQkJCSB2aWRlb19tb2RlLT5hc3BlY3QsIGlkKTsKIAl9CkBAIC01MjQsNyArNTU0LDcgQEAKIAkJICAgICAgICIlczogQ29tbWFuZCBmYWlsZWQuIFBsZWFzZSB0cnkgeW91ciByZXF1ZXN0IGFnYWluLiBcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CiAJZWxzZSBpZiAocmVzKQotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgInBzM2F2X2NtZF9hdmJfcGFyYW0gZmFpbGVkXG4iKTsKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgInBzM2F2X2NtZF9hdmJfcGFyYW0gZmFpbGVkXG4iKTsKIAogCW1zbGVlcCgxNTAwKTsKIAkvKiBhdiB2aWRlbyBtdXRlICovCkBAIC01MzMsOCArNTYzLDggQEAKIAogc3RhdGljIHZvaWQgcHMzYXZkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlwczNhdl9zZXRfdmlkZW9tb2RlX2NvbnQocHMzYXYucHMzYXZfbW9kZSwgcHMzYXYucHMzYXZfbW9kZV9vbGQpOwotCWNvbXBsZXRlKCZwczNhdi5kb25lKTsKKwlwczNhdl9zZXRfdmlkZW9tb2RlX2NvbnQocHMzYXYtPnBzM2F2X21vZGUsIHBzM2F2LT5wczNhdl9tb2RlX29sZCk7CisJY29tcGxldGUoJnBzM2F2LT5kb25lKTsKIH0KIAogc3RhdGljIGludCBwczNhdl92aWQydGFibGVfaWQoaW50IHZpZCkKQEAgLTYwMSw3ICs2MzEsNyBAQAogCQlyZXR1cm4gdmlkOwogCX0KIAotCWlmIChwczNhdi5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApCisJaWYgKHBzM2F2LT5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApCiAJCXZpZCA9IFBTM0FWX0RFRkFVTFRfSERNSV9WSURfUkVHXzYwOwogCWVsc2UKIAkJdmlkID0gUFMzQVZfREVGQVVMVF9IRE1JX1ZJRF9SRUdfNTA7CkBAIC02NDMsMTYgKzY3MywxNiBAQAogCQl2aWQgPSBQUzNBVl9ERUZBVUxUX0RWSV9WSUQ7CiAJfSBlbHNlIGlmICh2aWQgPT0gLTEpIHsKIAkJLyogbm8gSERNSSBpbnRlcmZhY2Ugb3IgSERNSSBpcyBvZmYgKi8KLQkJaWYgKHBzM2F2LnJlZ2lvbiAmIFBTM0FWX1JFR0lPTl82MCkKKwkJaWYgKHBzM2F2LT5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApCiAJCQl2aWQgPSBQUzNBVl9ERUZBVUxUX0FWTVVMVElfVklEX1JFR182MDsKIAkJZWxzZQogCQkJdmlkID0gUFMzQVZfREVGQVVMVF9BVk1VTFRJX1ZJRF9SRUdfNTA7Ci0JCWlmIChwczNhdi5yZWdpb24gJiBQUzNBVl9SRUdJT05fUkdCKQorCQlpZiAocHMzYXYtPnJlZ2lvbiAmIFBTM0FWX1JFR0lPTl9SR0IpCiAJCQlyZ2IgPSBQUzNBVl9NT0RFX1JHQjsKIAl9IGVsc2UgaWYgKGJvb3QpIHsKIAkJLyogSERNSTogdXNpbmcgREVGQVVMVCBIRE1JX1ZJRCB3aGlsZSBib290aW5nIHVwICovCiAJCWluZm8gPSAmbW9uaXRvcl9pbmZvLmluZm87Ci0JCWlmIChwczNhdi5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApIHsKKwkJaWYgKHBzM2F2LT5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApIHsKIAkJCWlmIChpbmZvLT5yZXNfNjAucmVzX2JpdHMgJiBQUzNBVl9SRVNCSVRfNzIweDQ4MFApCiAJCQkJdmlkID0gUFMzQVZfREVGQVVMVF9IRE1JX1ZJRF9SRUdfNjA7CiAJCQllbHNlIGlmIChpbmZvLT5yZXNfNTAucmVzX2JpdHMgJiBQUzNBVl9SRVNCSVRfNzIweDU3NlApCkBAIC03MTUsMTQgKzc0NSwxNCBAQAogCiAJc2l6ZSA9IEFSUkFZX1NJWkUodmlkZW9fbW9kZV90YWJsZSk7CiAJaWYgKChpZCAmIFBTM0FWX01PREVfTUFTSykgPiBzaXplIC0gMSB8fCBpZCA8IDApIHsKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICIlczogZXJyb3IgaWQgOiVkXG4iLCBfX2Z1bmNfXywgaWQpOworCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLCAiJXM6IGVycm9yIGlkIDolZFxuIiwgX19mdW5jX18sIGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogYXV0byBtb2RlICovCiAJb3B0aW9uID0gaWQgJiB+UFMzQVZfTU9ERV9NQVNLOwogCWlmICgoaWQgJiBQUzNBVl9NT0RFX01BU0spID09IDApIHsKLQkJaWQgPSBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYuYXZfaHdfY29uZiwgYm9vdCk7CisJCWlkID0gcHMzYXZfYXV0b192aWRlb21vZGUoJnBzM2F2LT5hdl9od19jb25mLCBib290KTsKIAkJaWYgKGlkIDwgMSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBpZCA6JWRcbiIsIF9fZnVuY19fLCBpZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTczMSwxMSArNzYxLDExIEBACiAJfQogCiAJLyogc2V0IHZpZGVvbW9kZSAqLwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBzM2F2LmRvbmUpOwotCXBzM2F2LnBzM2F2X21vZGVfb2xkID0gcHMzYXYucHMzYXZfbW9kZTsKLQlwczNhdi5wczNhdl9tb2RlID0gaWQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmcHMzYXYtPmRvbmUpOworCXBzM2F2LT5wczNhdl9tb2RlX29sZCA9IHBzM2F2LT5wczNhdl9tb2RlOworCXBzM2F2LT5wczNhdl9tb2RlID0gaWQ7CiAJaWYgKHBzM2F2X3NldF92aWRlb21vZGUoKSkKLQkJcHMzYXYucHMzYXZfbW9kZSA9IHBzM2F2LnBzM2F2X21vZGVfb2xkOworCQlwczNhdi0+cHMzYXZfbW9kZSA9IHBzM2F2LT5wczNhdl9tb2RlX29sZDsKIAogCXJldHVybiAwOwogfQpAQCAtNzQ0LDcgKzc3NCw3IEBACiAKIGludCBwczNhdl9nZXRfYXV0b19tb2RlKGludCBib290KQogewotCXJldHVybiBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYuYXZfaHdfY29uZiwgYm9vdCk7CisJcmV0dXJuIHBzM2F2X2F1dG9fdmlkZW9tb2RlKCZwczNhdi0+YXZfaHdfY29uZiwgYm9vdCk7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X2dldF9hdXRvX21vZGUpOwpAQCAtNzcyLDcgKzgwMiw3IEBACiAKIGludCBwczNhdl9nZXRfbW9kZSh2b2lkKQogewotCXJldHVybiBwczNhdi5wczNhdl9tb2RlOworCXJldHVybiBwczNhdiA/IHBzM2F2LT5wczNhdl9tb2RlIDogMDsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwocHMzYXZfZ2V0X21vZGUpOwpAQCAtODQyLDgyICs4NzIsNjUgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwocHMzYXZfYXVkaW9fbXV0ZSk7CiAKLWludCBwczNhdl9kZXZfb3Blbih2b2lkKQordm9pZCBwczNhdl9yZWdpc3Rlcl9mbGlwX2N0bCh2b2lkICgqZmxpcF9jdGwpKGludCBvbiwgdm9pZCAqZGF0YSksCisJCQkgICAgIHZvaWQgKmZsaXBfZGF0YSkKIHsKLQlpbnQgc3RhdHVzID0gMDsKKwltdXRleF9sb2NrKCZwczNhdi0+bXV0ZXgpOworCXBzM2F2LT5mbGlwX2N0bCA9IGZsaXBfY3RsOworCXBzM2F2LT5mbGlwX2RhdGEgPSBmbGlwX2RhdGE7CisJbXV0ZXhfdW5sb2NrKCZwczNhdi0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzYXZfcmVnaXN0ZXJfZmxpcF9jdGwpOwogCi0JbXV0ZXhfbG9jaygmcHMzYXYubXV0ZXgpOwotCWlmICghcHMzYXYub3Blbl9jb3VudCsrKSB7Ci0JCXN0YXR1cyA9IGx2MV9ncHVfb3BlbigwKTsKLQkJaWYgKHN0YXR1cykgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbHYxX2dwdV9vcGVuIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJCXBzM2F2Lm9wZW5fY291bnQtLTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKLQotCXJldHVybiBzdGF0dXM7Cit2b2lkIHBzM2F2X2ZsaXBfY3RsKGludCBvbikKK3sKKwltdXRleF9sb2NrKCZwczNhdi0+bXV0ZXgpOworCWlmIChwczNhdi0+ZmxpcF9jdGwpCisJCXBzM2F2LT5mbGlwX2N0bChvbiwgcHMzYXYtPmZsaXBfZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZwczNhdi0+bXV0ZXgpOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChwczNhdl9kZXZfb3Blbik7Ci0KLWludCBwczNhdl9kZXZfY2xvc2Uodm9pZCkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCW11dGV4X2xvY2soJnBzM2F2Lm11dGV4KTsKLQlpZiAocHMzYXYub3Blbl9jb3VudCA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEdQVSBhbHJlYWR5IGNsb3NlZFxuIiwgX19mdW5jX18pOwotCQlzdGF0dXMgPSAtMTsKLQl9IGVsc2UgaWYgKCEtLXBzM2F2Lm9wZW5fY291bnQpIHsKLQkJc3RhdHVzID0gbHYxX2dwdV9jbG9zZSgpOwotCQlpZiAoc3RhdHVzKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGx2MV9ncHVfY2xvc2UgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotCX0KLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X2Rldl9jbG9zZSk7Ci0KLXN0YXRpYyBpbnQgcHMzYXZfcHJvYmUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNhdl9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlczsKIAl1MzIgaWQ7CiAKLQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgImluaXQgLi4uXG4iKTsKLQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgIiAgdGltZW91dD0lZFxuIiwgdGltZW91dCk7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAgdGltZW91dD0lZFxuIiwgdGltZW91dCk7CiAKLQltZW1zZXQoJnBzM2F2LCAwLCBzaXplb2YocHMzYXYpKTsKKwlpZiAocHMzYXYpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiT25seSBvbmUgcHMzYXYgZGV2aWNlIGlzIHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQogCi0JbXV0ZXhfaW5pdCgmcHMzYXYubXV0ZXgpOwotCXBzM2F2LnBzM2F2X21vZGUgPSAwOwotCXBzM2F2LmRldiA9IGRldjsKLQotCUlOSVRfV09SSygmcHMzYXYud29yaywgcHMzYXZkKTsKLQlpbml0X2NvbXBsZXRpb24oJnBzM2F2LmRvbmUpOwotCWNvbXBsZXRlKCZwczNhdi5kb25lKTsKLQlwczNhdi53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJwczNhdmQiKTsKLQlpZiAoIXBzM2F2LndxKQorCXBzM2F2ID0ga3phbGxvYyhzaXplb2YoKnBzM2F2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwczNhdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwczNhdi5hdmFpbGFibGUgPSAxOworCW11dGV4X2luaXQoJnBzM2F2LT5tdXRleCk7CisJcHMzYXYtPnBzM2F2X21vZGUgPSAwOworCXBzM2F2LT5kZXYgPSBkZXY7CisKKwlJTklUX1dPUksoJnBzM2F2LT53b3JrLCBwczNhdmQpOworCWluaXRfY29tcGxldGlvbigmcHMzYXYtPmRvbmUpOworCWNvbXBsZXRlKCZwczNhdi0+ZG9uZSk7CisJcHMzYXYtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInBzM2F2ZCIpOworCWlmICghcHMzYXYtPndxKQorCQlnb3RvIGZhaWw7CisKIAlzd2l0Y2ggKHBzM19vc19hcmVhX2dldF9hdl9tdWx0aV9vdXQoKSkgewogCWNhc2UgUFMzX1BBUkFNX0FWX01VTFRJX09VVF9OVFNDOgotCQlwczNhdi5yZWdpb24gPSBQUzNBVl9SRUdJT05fNjA7CisJCXBzM2F2LT5yZWdpb24gPSBQUzNBVl9SRUdJT05fNjA7CiAJCWJyZWFrOwogCWNhc2UgUFMzX1BBUkFNX0FWX01VTFRJX09VVF9QQUxfWUNCQ1I6CiAJY2FzZSBQUzNfUEFSQU1fQVZfTVVMVElfT1VUX1NFQ0FNOgotCQlwczNhdi5yZWdpb24gPSBQUzNBVl9SRUdJT05fNTA7CisJCXBzM2F2LT5yZWdpb24gPSBQUzNBVl9SRUdJT05fNTA7CiAJCWJyZWFrOwogCWNhc2UgUFMzX1BBUkFNX0FWX01VTFRJX09VVF9QQUxfUkdCOgotCQlwczNhdi5yZWdpb24gPSBQUzNBVl9SRUdJT05fNTAgfCBQUzNBVl9SRUdJT05fUkdCOworCQlwczNhdi0+cmVnaW9uID0gUFMzQVZfUkVHSU9OXzUwIHwgUFMzQVZfUkVHSU9OX1JHQjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHMzYXYucmVnaW9uID0gUFMzQVZfUkVHSU9OXzYwOworCQlwczNhdi0+cmVnaW9uID0gUFMzQVZfUkVHSU9OXzYwOwogCQlicmVhazsKIAl9CiAKQEAgLTkyNywzOSArOTQwLDQ3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM2F2X2NtZF9pbml0IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCiAJCSAgICAgICByZXMpOwogCi0JcHMzYXZfZ2V0X2h3X2NvbmYoJnBzM2F2KTsKLQlpZCA9IHBzM2F2X2F1dG9fdmlkZW9tb2RlKCZwczNhdi5hdl9od19jb25mLCAxKTsKLQltdXRleF9sb2NrKCZwczNhdi5tdXRleCk7Ci0JcHMzYXYucHMzYXZfbW9kZSA9IGlkOwotCW11dGV4X3VubG9jaygmcHMzYXYubXV0ZXgpOworCXBzM2F2X2dldF9od19jb25mKHBzM2F2KTsKKwlpZCA9IHBzM2F2X2F1dG9fdmlkZW9tb2RlKCZwczNhdi0+YXZfaHdfY29uZiwgMSk7CisJbXV0ZXhfbG9jaygmcHMzYXYtPm11dGV4KTsKKwlwczNhdi0+cHMzYXZfbW9kZSA9IGlkOworCW11dGV4X3VubG9jaygmcHMzYXYtPm11dGV4KTsKIAotCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLCAiaW5pdC4uLmRvbmVcbiIpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAogCXJldHVybiAwOworCitmYWlsOgorCWtmcmVlKHBzM2F2KTsKKwlwczNhdiA9IE5VTEw7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgcHMzYXZfcmVtb3ZlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzYXZfcmVtb3ZlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlpZiAocHMzYXYuYXZhaWxhYmxlKSB7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWlmIChwczNhdikgewogCQlwczNhdl9jbWRfZmluKCk7Ci0JCWlmIChwczNhdi53cSkKLQkJCWRlc3Ryb3lfd29ya3F1ZXVlKHBzM2F2LndxKTsKLQkJcHMzYXYuYXZhaWxhYmxlID0gMDsKKwkJaWYgKHBzM2F2LT53cSkKKwkJCWRlc3Ryb3lfd29ya3F1ZXVlKHBzM2F2LT53cSk7CisJCWtmcmVlKHBzM2F2KTsKKwkJcHMzYXYgPSBOVUxMOwogCX0KIAorCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHMzYXZfc2h1dGRvd24oc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcHMzYXZfc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogeworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlwczNhdl9yZW1vdmUoZGV2KTsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyIHBzM2F2X2RyaXZlciA9IHsKLQkubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MsCi0JLmNvcmUgPSB7Ci0JCS5uYW1lID0gInBzM19hdiIsCi0JfSwKKwkuY29yZS5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUywKKwkuY29yZS5jb3JlLm5hbWUgPSAicHMzX2F2IiwKIAkucHJvYmUgPSBwczNhdl9wcm9iZSwKIAkucmVtb3ZlID0gcHMzYXZfcmVtb3ZlLAogCS5zaHV0ZG93biA9IHBzM2F2X3NodXRkb3duLApAQCAtOTcyLDYgKzk5Myw4IEBACiAJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKIAllcnJvciA9IHBzM192dWFydF9wb3J0X2RyaXZlcl9yZWdpc3RlcigmcHMzYXZfZHJpdmVyKTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCkBAIC05ODAsMjAgKzEwMDMsMjEgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCWVycm9yID0gcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyKCZwczNhdl9kZXYpOwotCWlmIChlcnJvcikKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlciBmYWlsZWQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZXJyb3IpOwotCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwczNhdl9tb2R1bGVfZXhpdCh2b2lkKQogewotCWRldmljZV91bnJlZ2lzdGVyKCZwczNhdl9kZXYuY29yZSk7CisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3RlcigmcHMzYXZfZHJpdmVyKTsKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogfQogCiBzdWJzeXNfaW5pdGNhbGwocHMzYXZfbW9kdWxlX2luaXQpOwogbW9kdWxlX2V4aXQocHMzYXZfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBTMyBBViBTZXR0aW5ncyBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuIik7CitNT0RVTEVfQUxJQVMoUFMzX01PRFVMRV9BTElBU19BVl9TRVRUSU5HUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9wczNhdl9jbWQuYyBiL2RyaXZlcnMvcHMzL3BzM2F2X2NtZC5jCmluZGV4IDAxNDVlYTEuLmY3MmY1ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3BzM2F2X2NtZC5jCisrKyBiL2RyaXZlcnMvcHMzL3BzM2F2X2NtZC5jCkBAIC0xNDMsNiArMTQzLDE0IEBACiAJcmV0dXJuIFBTM0FWX0NNRF9BVl9WSURfNDgwUDsKIH0KIAorc3RhdGljIGludCBwczNhdl9oZG1pX3JhbmdlKHZvaWQpCit7CisJaWYgKHBzM19jb21wYXJlX2Zpcm13YXJlX3ZlcnNpb24oMSwgOCwgMCkgPCAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOyAvKiBzdXBwb3J0ZWQgKi8KK30KKwogaW50IHBzM2F2X2NtZF9pbml0KHZvaWQpCiB7CiAJaW50IHJlczsKQEAgLTM1MCw2ICszNTgsMTAgQEAKIAkvKiBzaG91bGQgYmUgc2FtZSBhcyB2aWRlb19tb2RlLnZpZGVvX2NzX291dCAqLwogCWF2X3ZpZGVvX2NzLT5hdl9jc19pbiA9IHBzM2F2X2NzX3ZpZGVvMmF2KFBTM0FWX0NNRF9WSURFT19DU19SR0JfOCk7CiAJYXZfdmlkZW9fY3MtPmJpdGxlbl9vdXQgPSBwczNhdl9jc192aWRlbzJhdl9iaXRsZW4oY3Nfb3V0KTsKKwlpZiAoKGlkICYgUFMzQVZfTU9ERV9XSElURSkgJiYgcHMzYXZfaGRtaV9yYW5nZSgpKQorCQlhdl92aWRlb19jcy0+c3VwZXJfd2hpdGUgPSBQUzNBVl9DTURfQVZfU1VQRVJfV0hJVEVfT047CisJZWxzZSAvKiBkZWZhdWx0IG9mZiAqLworCQlhdl92aWRlb19jcy0+c3VwZXJfd2hpdGUgPSBQUzNBVl9DTURfQVZfU1VQRVJfV0hJVEVfT0ZGOwogCWF2X3ZpZGVvX2NzLT5hc3BlY3QgPSBhc3BlY3Q7CiAJaWYgKGlkICYgUFMzQVZfTU9ERV9ESVRIRVIpIHsKIAkJYXZfdmlkZW9fY3MtPmRpdGhlciA9IFBTM0FWX0NNRF9BVl9ESVRIRVJfT04KQEAgLTM5Miw2ICs0MDQsMTAgQEAKIAl2aWRlb19tb2RlLT5waXRjaCA9IHZpZGVvX21vZGUtPndpZHRoICogNDsJLyogbGluZV9sZW5ndGggKi8KIAl2aWRlb19tb2RlLT52aWRlb19vdXRfZm9ybWF0ID0gUFMzQVZfQ01EX1ZJREVPX09VVF9GT1JNQVRfUkdCXzEyQklUOwogCXZpZGVvX21vZGUtPnZpZGVvX2Zvcm1hdCA9IHBzM2F2X3ZpZGVvX2ZtdF90YWJsZVt2aWRlb19mbXRdLmZvcm1hdDsKKwlpZiAoKGlkICYgUFMzQVZfTU9ERV9DT0xPUikgJiYgcHMzYXZfaGRtaV9yYW5nZSgpKQorCQl2aWRlb19tb2RlLT52aWRlb19jbF9jbnYgPSBQUzNBVl9DTURfVklERU9fQ0xfQ05WX0RJU0FCTEVfTFVUOworCWVsc2UgLyogZGVmYXVsdCBlbmFibGUgKi8KKwkJdmlkZW9fbW9kZS0+dmlkZW9fY2xfY252ID0gUFMzQVZfQ01EX1ZJREVPX0NMX0NOVl9FTkFCTEVfTFVUOwogCXZpZGVvX21vZGUtPnZpZGVvX29yZGVyID0gcHMzYXZfdmlkZW9fZm10X3RhYmxlW3ZpZGVvX2ZtdF0ub3JkZXI7CiAKIAlwcl9kZWJ1ZygiJXM6IHZpZGVvX21vZGU6dmlkOiV4IHdpZHRoOiVkIGhlaWdodDolZCBwaXRjaDolZCBvdXRfZm9ybWF0OiVkIGZvcm1hdDoleCBvcmRlcjoleFxuIiwKQEAgLTg1Miw3ICs4NjgsNyBAQAogewogCWludCByZXM7CiAKLQlwczNmYl9mbGlwX2N0bCgwKTsJLyogZmxpcCBvZmYgKi8KKwlwczNhdl9mbGlwX2N0bCgwKTsJLyogZmxpcCBvZmYgKi8KIAogCS8qIGF2YiBwYWNrZXQgKi8KIAlyZXMgPSBwczNhdl9kb19wa3QoUFMzQVZfQ0lEX0FWQl9QQVJBTSwgc2VuZF9sZW4sIHNpemVvZigqYXZiKSwKQEAgLTg2Niw3ICs4ODIsNyBAQAogCQkJIHJlcyk7CiAKICAgICAgIG91dDoKLQlwczNmYl9mbGlwX2N0bCgxKTsJLyogZmxpcCBvbiAqLworCXBzM2F2X2ZsaXBfY3RsKDEpOwkvKiBmbGlwIG9uICovCiAJcmV0dXJuIHJlczsKIH0KIApAQCAtOTg3LDM0ICsxMDAzLDMgQEAKIAkJfCBQUzNBVl9DTURfQVZfTEFZT1VUXzE3NiBcCiAJCXwgUFMzQVZfQ01EX0FWX0xBWU9VVF8xOTIpCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqIHZ1YXJ0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBQT0xMSU5HX0lOVEVSVkFMICAyNQkvKiBpbiBtc2VjICovCi0KLWludCBwczNhdl92dWFydF93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBlcnJvciA9IHBzM192dWFydF93cml0ZShkZXYsIGJ1Ziwgc2l6ZSk7Ci0JcmV0dXJuIGVycm9yID8gZXJyb3IgOiBzaXplOwotfQotCi1pbnQgcHMzYXZfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKLQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGludCB0aW1lb3V0KQotewotCWludCBlcnJvcjsKLQlpbnQgbG9vcGNudCA9IDA7Ci0KLQl0aW1lb3V0ID0gKHRpbWVvdXQgKyBQT0xMSU5HX0lOVEVSVkFMIC0gMSkgLyBQT0xMSU5HX0lOVEVSVkFMOwotCXdoaWxlIChsb29wY250KysgPD0gdGltZW91dCkgewotCQllcnJvciA9IHBzM192dWFydF9yZWFkKGRldiwgYnVmLCBzaXplKTsKLQkJaWYgKCFlcnJvcikKLQkJCXJldHVybiBzaXplOwotCQlpZiAoZXJyb3IgIT0gLUVBR0FJTikgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcHMzX3Z1YXJ0X3JlYWQgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBlcnJvcik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJbXNsZWVwKFBPTExJTkdfSU5URVJWQUwpOwotCX0KLQlyZXR1cm4gLUVXT1VMREJMT0NLOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvcHMzc3Rvcl9saWIuYyBiL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ODI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBQUzMgU3RvcmFnZSBMaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9wczNzdG9yLmg+CisKKworc3RhdGljIGludCBwczNzdG9yX3Byb2JlX2FjY2VzcyhzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYpCit7CisJaW50IHJlcywgZXJyb3I7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBuOworCisJaWYgKGRldi0+c2JkLm1hdGNoX2lkID09IFBTM19NQVRDSF9JRF9TVE9SX1JPTSkgeworCQkvKiBzcGVjaWFsIGNhc2U6IENELVJPTSBpcyBhc3N1bWVkIGFsd2F5cyBhY2Nlc3NpYmxlICovCisJCWRldi0+YWNjZXNzaWJsZV9yZWdpb25zID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyb3IgPSAtRVBFUk07CisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3JlZ2lvbnM7IGkrKykgeworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBjaGVja2luZyBhY2Nlc3NpYmlsaXR5IG9mIHJlZ2lvbiAldVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgaSk7CisKKwkJZGV2LT5yZWdpb25faWR4ID0gaTsKKwkJcmVzID0gcHMzc3Rvcl9yZWFkX3dyaXRlX3NlY3RvcnMoZGV2LCBkZXYtPmJvdW5jZV9scGFyLCAwLCAxLAorCQkJCQkJIDApOworCQlpZiAocmVzKSB7CisJCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlYWQgZmFpbGVkLCAiCisJCQkJInJlZ2lvbiAldSBpcyBub3QgYWNjZXNzaWJsZVxuIiwgX19mdW5jX18sCisJCQkJX19MSU5FX18sIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlZ2lvbiAldSBpcyBhY2Nlc3NpYmxlXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBpKTsKKwkJc2V0X2JpdChpLCAmZGV2LT5hY2Nlc3NpYmxlX3JlZ2lvbnMpOworCisJCS8qIFdlIGNhbiBhY2Nlc3MgYXQgbGVhc3Qgb25lIHJlZ2lvbiAqLworCQllcnJvciA9IDA7CisJfQorCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbiA9IGh3ZWlnaHRfbG9uZyhkZXYtPmFjY2Vzc2libGVfcmVnaW9ucyk7CisJaWYgKG4gPiAxKQorCQlkZXZfaW5mbygmZGV2LT5zYmQuY29yZSwKKwkJCSAiJXM6JXU6ICVsdSBhY2Nlc3NpYmxlIHJlZ2lvbnMgZm91bmQuIE9ubHkgdGhlIGZpcnN0ICIKKwkJCSAib25lIHdpbGwgYmUgdXNlZCIsCisJCQkgX19mdW5jX18sIF9fTElORV9fLCBuKTsKKwlkZXYtPnJlZ2lvbl9pZHggPSBfX2ZmcyhkZXYtPmFjY2Vzc2libGVfcmVnaW9ucyk7CisJZGV2X2luZm8oJmRldi0+c2JkLmNvcmUsCisJCSAiRmlyc3QgYWNjZXNzaWJsZSByZWdpb24gaGFzIGluZGV4ICV1IHN0YXJ0ICVsdSBzaXplICVsdVxuIiwKKwkJIGRldi0+cmVnaW9uX2lkeCwgZGV2LT5yZWdpb25zW2Rldi0+cmVnaW9uX2lkeF0uc3RhcnQsCisJCSBkZXYtPnJlZ2lvbnNbZGV2LT5yZWdpb25faWR4XS5zaXplKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICoJcHMzc3Rvcl9zZXR1cCAtIFNldHVwIGEgc3RvcmFnZSBkZXZpY2UgYmVmb3JlIHVzZQorICoJQGRldjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UKKyAqCUBoYW5kbGVyOiBQb2ludGVyIHRvIGFuIGludGVycnVwdCBoYW5kbGVyCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlCisgKi8KK2ludCBwczNzdG9yX3NldHVwKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyKQoreworCWludCBlcnJvciwgcmVzLCBhbGlnbm1lbnQ7CisJZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemU7CisKKwllcnJvciA9IHBzM19vcGVuX2h2X2RldmljZSgmZGV2LT5zYmQpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBwczNfb3Blbl9odl9kZXZpY2UgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBlcnJvcik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwllcnJvciA9IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoJmRldi0+c2JkLCBQUzNfQklORElOR19DUFVfQU5ZLAorCQkJCQkJJmRldi0+aXJxKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwKKwkJCSIlczoldTogcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9zZXR1cCBmYWlsZWQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIGVycm9yKTsKKwkJZ290byBmYWlsX2Nsb3NlX2RldmljZTsKKwl9CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBoYW5kbGVyLCBJUlFGX0RJU0FCTEVELAorCQkJICAgIGRldi0+c2JkLmNvcmUuZHJpdmVyLT5uYW1lLCBkZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlcXVlc3RfaXJxIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZXJyb3IpOworCQlnb3RvIGZhaWxfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3k7CisJfQorCisJYWxpZ25tZW50ID0gbWluKF9fZmZzKGRldi0+Ym91bmNlX3NpemUpLAorCQkJX19mZnMoKHVuc2lnbmVkIGxvbmcpZGV2LT5ib3VuY2VfYnVmKSk7CisJaWYgKGFsaWdubWVudCA8IDEyKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IGJvdW5jZSBidWZmZXIgbm90IGFsaWduZWQgKCVseCBhdCAweCVwKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5ib3VuY2Vfc2l6ZSwgZGV2LT5ib3VuY2VfYnVmKTsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfZnJlZV9pcnE7CisJfSBlbHNlIGlmIChhbGlnbm1lbnQgPCAxNikKKwkJcGFnZV9zaXplID0gUFMzX0RNQV80SzsKKwllbHNlCisJCXBhZ2Vfc2l6ZSA9IFBTM19ETUFfNjRLOworCWRldi0+c2JkLmRfcmVnaW9uID0gJmRldi0+ZG1hX3JlZ2lvbjsKKwlwczNfZG1hX3JlZ2lvbl9pbml0KCZkZXYtPnNiZCwgJmRldi0+ZG1hX3JlZ2lvbiwgcGFnZV9zaXplLAorCQkJICAgIFBTM19ETUFfT1RIRVIsIGRldi0+Ym91bmNlX2J1ZiwgZGV2LT5ib3VuY2Vfc2l6ZSk7CisJcmVzID0gcHMzX2RtYV9yZWdpb25fY3JlYXRlKCZkZXYtPmRtYV9yZWdpb24pOworCWlmIChyZXMpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiBjYW5ub3QgY3JlYXRlIERNQSByZWdpb25cbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9mcmVlX2lycTsKKwl9CisKKwlkZXYtPmJvdW5jZV9scGFyID0gcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKGRldi0+Ym91bmNlX2J1ZikpOworCWRldi0+Ym91bmNlX2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZkZXYtPnNiZC5jb3JlLCBkZXYtPmJvdW5jZV9idWYsCisJCQkJCSBkZXYtPmJvdW5jZV9zaXplLCBETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKCFkZXYtPmJvdW5jZV9kbWEpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiBtYXAgRE1BIHJlZ2lvbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9mcmVlX2RtYTsKKwl9CisKKwllcnJvciA9IHBzM3N0b3JfcHJvYmVfYWNjZXNzKGRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogTm8gYWNjZXNzaWJsZSByZWdpb25zIGZvdW5kXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX3VubWFwX2RtYTsKKwl9CisJcmV0dXJuIDA7CisKK2ZhaWxfdW5tYXBfZG1hOgorCWRtYV91bm1hcF9zaW5nbGUoJmRldi0+c2JkLmNvcmUsIGRldi0+Ym91bmNlX2RtYSwgZGV2LT5ib3VuY2Vfc2l6ZSwKKwkJCSBETUFfQklESVJFQ1RJT05BTCk7CitmYWlsX2ZyZWVfZG1hOgorCXBzM19kbWFfcmVnaW9uX2ZyZWUoJmRldi0+ZG1hX3JlZ2lvbik7CitmYWlsX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZmFpbF9zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveToKKwlwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koJmRldi0+c2JkLCBkZXYtPmlycSk7CitmYWlsX2Nsb3NlX2RldmljZToKKwlwczNfY2xvc2VfaHZfZGV2aWNlKCZkZXYtPnNiZCk7CitmYWlsOgorCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM3N0b3Jfc2V0dXApOworCisKKy8qKgorICoJcHMzc3Rvcl90ZWFyZG93biAtIFRlYXIgZG93biBhIHN0b3JhZ2UgZGV2aWNlIGFmdGVyIHVzZQorICoJQGRldjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UKKyAqLwordm9pZCBwczNzdG9yX3RlYXJkb3duKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyb3I7CisKKwlkbWFfdW5tYXBfc2luZ2xlKCZkZXYtPnNiZC5jb3JlLCBkZXYtPmJvdW5jZV9kbWEsIGRldi0+Ym91bmNlX3NpemUsCisJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCXBzM19kbWFfcmVnaW9uX2ZyZWUoJmRldi0+ZG1hX3JlZ2lvbik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWVycm9yID0gcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KCZkZXYtPnNiZCwgZGV2LT5pcnEpOworCWlmIChlcnJvcikKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwKKwkJCSIlczoldTogZGVzdHJveSBldmVudCByZWNlaXZlIHBvcnQgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBlcnJvcik7CisKKwllcnJvciA9IHBzM19jbG9zZV9odl9kZXZpY2UoJmRldi0+c2JkKTsKKwlpZiAoZXJyb3IpCisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IHBzM19jbG9zZV9odl9kZXZpY2UgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBlcnJvcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNzdG9yX3RlYXJkb3duKTsKKworCisvKioKKyAqCXBzM3N0b3JfcmVhZF93cml0ZV9zZWN0b3JzIC0gcmVhZC93cml0ZSBmcm9tL3RvIGEgc3RvcmFnZSBkZXZpY2UKKyAqCUBkZXY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlCisgKglAbHBhcjogSFYgbG9naWNhbCBwYXJ0aXRpb24gYWRkcmVzcworICoJQHN0YXJ0X3NlY3RvcjogRmlyc3Qgc2VjdG9yIHRvIHJlYWQvd3JpdGUKKyAqCUBzZWN0b3JzOiBOdW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkL3dyaXRlCisgKglAd3JpdGU6IEZsYWcgaW5kaWNhdGluZyB3cml0ZSAobm9uLXplcm8pIG9yIHJlYWQgKHplcm8pCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCAtMSBpbiBjYXNlIG9mIGZhaWx1cmUgdG8gc3VibWl0IHRoZSBjb21tYW5kLCBvcgorICoJYW4gTFYxIHN0YXR1cyB2YWx1ZSBpbiBjYXNlIG9mIG90aGVyIGVycm9ycworICovCit1NjQgcHMzc3Rvcl9yZWFkX3dyaXRlX3NlY3RvcnMoc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2LCB1NjQgbHBhciwKKwkJCSAgICAgICB1NjQgc3RhcnRfc2VjdG9yLCB1NjQgc2VjdG9ycywgaW50IHdyaXRlKQoreworCXVuc2lnbmVkIGludCByZWdpb25faWQgPSBkZXYtPnJlZ2lvbnNbZGV2LT5yZWdpb25faWR4XS5pZDsKKwljb25zdCBjaGFyICpvcCA9IHdyaXRlID8gIndyaXRlIiA6ICJyZWFkIjsKKwlpbnQgcmVzOworCisJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyAlbHUgc2VjdG9ycyBzdGFydGluZyBhdCAlbHVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgb3AsIHNlY3RvcnMsIHN0YXJ0X3NlY3Rvcik7CisKKwlpbml0X2NvbXBsZXRpb24oJmRldi0+ZG9uZSk7CisJcmVzID0gd3JpdGUgPyBsdjFfc3RvcmFnZV93cml0ZShkZXYtPnNiZC5kZXZfaWQsIHJlZ2lvbl9pZCwKKwkJCQkJc3RhcnRfc2VjdG9yLCBzZWN0b3JzLCAwLCBscGFyLAorCQkJCQkmZGV2LT50YWcpCisJCSAgICA6IGx2MV9zdG9yYWdlX3JlYWQoZGV2LT5zYmQuZGV2X2lkLCByZWdpb25faWQsCisJCQkJICAgICAgIHN0YXJ0X3NlY3Rvciwgc2VjdG9ycywgMCwgbHBhciwKKwkJCQkgICAgICAgJmRldi0+dGFnKTsKKwlpZiAocmVzKSB7CisJCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBvcCwgcmVzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRldi0+ZG9uZSk7CisJaWYgKGRldi0+bHYxX3N0YXR1cykgeworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6ICVzIGZhaWxlZCAweCVseFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgb3AsIGRldi0+bHYxX3N0YXR1cyk7CisJCXJldHVybiBkZXYtPmx2MV9zdGF0dXM7CisJfQorCisJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyBjb21wbGV0ZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJb3ApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNzdG9yX3JlYWRfd3JpdGVfc2VjdG9ycyk7CisKKworLyoqCisgKglwczNzdG9yX3NlbmRfY29tbWFuZCAtIHNlbmQgYSBkZXZpY2UgY29tbWFuZCB0byBhIHN0b3JhZ2UgZGV2aWNlCisgKglAZGV2OiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19zdG9yYWdlX2RldmljZQorICoJQGNtZDogQ29tbWFuZCBudW1iZXIKKyAqCUBhcmcxOiBGaXJzdCBjb21tYW5kIGFyZ3VtZW50CisgKglAYXJnMjogU2Vjb25kIGNvbW1hbmQgYXJndW1lbnQKKyAqCUBhcmczOiBUaGlyZCBjb21tYW5kIGFyZ3VtZW50CisgKglAYXJnNDogRm91cnRoIGNvbW1hbmQgYXJndW1lbnQKKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC0xIGluIGNhc2Ugb2YgZmFpbHVyZSB0byBzdWJtaXQgdGhlIGNvbW1hbmQsIG9yCisgKglhbiBMVjEgc3RhdHVzIHZhbHVlIGluIGNhc2Ugb2Ygb3RoZXIgZXJyb3JzCisgKi8KK3U2NCBwczNzdG9yX3NlbmRfY29tbWFuZChzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsIHU2NCBjbWQsIHU2NCBhcmcxLAorCQkJIHU2NCBhcmcyLCB1NjQgYXJnMywgdTY0IGFyZzQpCit7CisJaW50IHJlczsKKworCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogc2VuZCBkZXZpY2UgY29tbWFuZCAweCVseFxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBjbWQpOworCisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmRvbmUpOworCisJcmVzID0gbHYxX3N0b3JhZ2Vfc2VuZF9kZXZpY2VfY29tbWFuZChkZXYtPnNiZC5kZXZfaWQsIGNtZCwgYXJnMSwKKwkJCQkJICAgICAgYXJnMiwgYXJnMywgYXJnNCwgJmRldi0+dGFnKTsKKwlpZiAocmVzKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IHNlbmRfZGV2aWNlX2NvbW1hbmQgMHglbHggZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBjbWQsIHJlcyk7CisJCXJldHVybiAtMTsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkZXYtPmRvbmUpOworCWlmIChkZXYtPmx2MV9zdGF0dXMpIHsKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiBjb21tYW5kIDB4JWx4IGZhaWxlZCAweCVseFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgY21kLCBkZXYtPmx2MV9zdGF0dXMpOworCQlyZXR1cm4gZGV2LT5sdjFfc3RhdHVzOworCX0KKworCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogY29tbWFuZCAweCVseCBjb21wbGV0ZWRcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgY21kKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzc3Rvcl9zZW5kX2NvbW1hbmQpOworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUFMzIFN0b3JhZ2UgQnVzIExpYnJhcnkiKTsKK01PRFVMRV9BVVRIT1IoIlNvbnkgQ29ycG9yYXRpb24iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYyBiL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY0OGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wczMvc3lzLW1hbmFnZXItY29yZS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgUFMzIFN5c3RlbSBNYW5hZ2VyIGNvcmUuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisvKioKKyAqIFN0YXRpY2x5IGxpbmtlZCByb3V0aW5lcyB0aGF0IGFsbG93IGxhdGUgYmluZGluZyBvZiBhIGxvYWRlZCBzeXMtbWFuYWdlcgorICogbW9kdWxlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX29wcyBwczNfc3lzX21hbmFnZXJfb3BzOworCisvKioKKyAqIHBzM19yZWdpc3Rlcl9zeXNfbWFuYWdlcl9vcHMgLSBCaW5kIHBzM19zeXNfbWFuYWdlcl9vcHMgdG8gYSBtb2R1bGUuCisgKiBAb3BzOiBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX29wcy4KKyAqCisgKiBUbyBiZSBjYWxsZWQgZnJvbSBwczNfc3lzX21hbmFnZXJfcHJvYmUoKSBhbmQgcHMzX3N5c19tYW5hZ2VyX3JlbW92ZSgpIHRvCisgKiByZWdpc3RlciBjYWxsIGJhY2sgb3BzIGZvciBwb3dlciBjb250cm9sLiAgQ29waWVzIGRhdGEgdG8gdGhlIHN0YXRpYworICogdmFyaWFibGUgcHMzX3N5c19tYW5hZ2VyX29wcy4KKyAqLworCit2b2lkIHBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMoY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgKm9wcykKK3sKKwlCVUdfT04oIW9wcyk7CisJQlVHX09OKCFvcHMtPmRldik7CisJcHMzX3N5c19tYW5hZ2VyX29wcyA9IG9wcyA/ICpvcHMgOiBwczNfc3lzX21hbmFnZXJfb3BzOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX3N5c19tYW5hZ2VyX3JlZ2lzdGVyX29wcyk7CisKK3ZvaWQgcHMzX3N5c19tYW5hZ2VyX3Bvd2VyX29mZih2b2lkKQoreworCWlmIChwczNfc3lzX21hbmFnZXJfb3BzLnBvd2VyX29mZikKKwkJcHMzX3N5c19tYW5hZ2VyX29wcy5wb3dlcl9vZmYocHMzX3N5c19tYW5hZ2VyX29wcy5kZXYpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIlN5c3RlbSBIYWx0ZWQsIE9LIHRvIHR1cm4gb2ZmIHBvd2VyXG4iKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdoaWxlICgxKQorCQkodm9pZCkwOworfQorCit2b2lkIHBzM19zeXNfbWFuYWdlcl9yZXN0YXJ0KHZvaWQpCit7CisJaWYgKHBzM19zeXNfbWFuYWdlcl9vcHMucmVzdGFydCkKKwkJcHMzX3N5c19tYW5hZ2VyX29wcy5yZXN0YXJ0KHBzM19zeXNfbWFuYWdlcl9vcHMuZGV2KTsKKworCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gSGFsdGVkLCBPSyB0byB0dXJuIG9mZiBwb3dlclxuIik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3aGlsZSAoMSkKKwkJKHZvaWQpMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLmMgYi9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci5jCmluZGV4IDNhYTJiMGQuLjg0NjFiMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLmMKKysrIGIvZHJpdmVycy9wczMvc3lzLW1hbmFnZXIuYwpAQCAtMzUsNyArMzUsNyBAQAogLyoqCiAgKiBwczNfc3lzX21hbmFnZXIgLSBQUzMgc3lzdGVtIG1hbmFnZXIgZHJpdmVyLgogICoKLSAqIFRoZSBzeXN0ZW0gbWFuYWdlciBwcm92aWRlcyBhbiBhc3luY3Jvbm91cyBzeXN0ZW0gZXZlbnQgbm90aWZpY2F0aW9uCisgKiBUaGUgc3lzdGVtIG1hbmFnZXIgcHJvdmlkZXMgYW4gYXN5bmNocm9ub3VzIHN5c3RlbSBldmVudCBub3RpZmljYXRpb24KICAqIG1lY2hhbmlzbSBmb3IgcmVwb3J0aW5nIGV2ZW50cyBsaWtlIHRoZXJtYWwgYWxlcnQgYW5kIGJ1dHRvbiBwcmVzc2VzIHRvCiAgKiBndWVzdHMuICBJdCBhbHNvIHByb3ZpZGVzIHN1cHBvcnQgdG8gY29udHJvbCBzeXN0ZW0gc2h1dGRvd24gYW5kIHN0YXJ0dXAuCiAgKgpAQCAtNTIsNiArNTIsNyBAQAogICogQHNpemU6IEhlYWRlciBzaXplIGluIGJ5dGVzLCBjdXJlbnRseSAxNi4KICAqIEBwYXlsb2FkX3NpemU6IE1lc3NhZ2UgcGF5bG9hZCBzaXplIGluIGJ5dGVzLgogICogQHNlcnZpY2VfaWQ6IE1lc3NhZ2UgdHlwZSwgb25lIG9mIGVudW0gcHMzX3N5c19tYW5hZ2VyX3NlcnZpY2VfaWQuCisgKiBAcmVxdWVzdF90YWc6IFVuaXF1ZSBudW1iZXIgdG8gaWRlbnRpZnkgcmVwbHkuCiAgKi8KIAogc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgewpAQCAtNjEsMjkgKzYyLDQ5IEBACiAJdTE2IHJlc2VydmVkXzE7CiAJdTMyIHBheWxvYWRfc2l6ZTsKIAl1MTYgc2VydmljZV9pZDsKLQl1MTYgcmVzZXJ2ZWRfMlszXTsKKwl1MTYgcmVzZXJ2ZWRfMjsKKwl1MzIgcmVxdWVzdF90YWc7CiB9OwogCisjZGVmaW5lIGR1bXBfc21faGVhZGVyKF9oKSBfZHVtcF9zbV9oZWFkZXIoX2gsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX3NtX2hlYWRlcigKKwljb25zdCBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciAqaCwgY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCit7CisJcHJfZGVidWcoIiVzOiVkOiB2ZXJzaW9uOiAgICAgICV4aFxuIiwgZnVuYywgbGluZSwgaC0+dmVyc2lvbik7CisJcHJfZGVidWcoIiVzOiVkOiBzaXplOiAgICAgICAgICV4aFxuIiwgZnVuYywgbGluZSwgaC0+c2l6ZSk7CisJcHJfZGVidWcoIiVzOiVkOiBwYXlsb2FkX3NpemU6ICV4aFxuIiwgZnVuYywgbGluZSwgaC0+cGF5bG9hZF9zaXplKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHNlcnZpY2VfaWQ6ICAgJXhoXG4iLCBmdW5jLCBsaW5lLCBoLT5zZXJ2aWNlX2lkKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHJlcXVlc3RfdGFnOiAgJXhoXG4iLCBmdW5jLCBsaW5lLCBoLT5yZXF1ZXN0X3RhZyk7Cit9CisKIC8qKgotICogQFBTM19TTV9SWF9NU0dfTEVOIC0gU3lzdGVtIG1hbmFnZXIgcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGguCisgKiBAUFMzX1NNX1JYX01TR19MRU5fTUlOIC0gU2hvcnRlc3QgcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGguCisgKiBAUFMzX1NNX1JYX01TR19MRU5fTUFYIC0gTG9uZ2VzdCByZWNlaXZlZCBtZXNzYWdlIGxlbmd0aC4KICAqCi0gKiBDdXJyZW50bHkgYWxsIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIHN5c3RlbSBtYW5hZ2VyIGFyZSB0aGUgc2FtZSBsZW5ndGgKLSAqICgxNiBieXRlcyBoZWFkZXIgKyAxNiBieXRlcyBwYXlsb2FkID0gMzIgYnl0ZXMpLiAgVGhpcyBrbm93bGVnZSBpcyB1c2VkIHRvCi0gKiBzaW1wbGlmeSB0aGUgbG9naWMuCisgKiBDdXJyZW50bHkgYWxsIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIHN5c3RlbSBtYW5hZ2VyIGFyZSBlaXRoZXIKKyAqICgxNiBieXRlcyBoZWFkZXIgKyA4IGJ5dGVzIHBheWxvYWQgPSAyNCBieXRlcykgb3IgKDE2IGJ5dGVzIGhlYWRlcgorICogKyAxNiBieXRlcyBwYXlsb2FkID0gMzIgYnl0ZXMpLiAgVGhpcyBrbm93bGVnZSBpcyB1c2VkIHRvIHNpbXBsaWZ5CisgKiB0aGUgbG9naWMuCiAgKi8KIAogZW51bSB7Ci0JUFMzX1NNX1JYX01TR19MRU4gPSAzMiwKKwlQUzNfU01fUlhfTVNHX0xFTl9NSU4gPSAyNCwKKwlQUzNfU01fUlhfTVNHX0xFTl9NQVggPSAzMiwKIH07CiAKIC8qKgogICogZW51bSBwczNfc3lzX21hbmFnZXJfc2VydmljZV9pZCAtIE1lc3NhZ2UgaGVhZGVyIHNlcnZpY2VfaWQuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVDogICAgICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfQ09NTUFORDogICAgICBndWVzdCA8LS0gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfUkVTUE9OU0U6ICAgICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfU0VUX0FUVFI6ICAgICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfRVhURVJOX0VWRU5UOiBndWVzdCA8LS0gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1A6ICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVDogICAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1RfRVJST1I6IGd1ZXN0IDwtLSBzeXNfbWFuYWdlci4KKyAqIEBQUzNfU01fU0VSVklDRV9JRF9DT01NQU5EOiAgICAgICBndWVzdCA8LS0gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfUkVTUE9OU0U6ICAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1NFVF9BVFRSOiAgICAgIGd1ZXN0IC0tPiBzeXNfbWFuYWdlci4KKyAqIEBQUzNfU01fU0VSVklDRV9JRF9FWFRFUk5fRVZFTlQ6ICBndWVzdCA8LS0gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1A6ICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgorICoKKyAqIFBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1RfRVJST1IgaXMgcmV0dXJuZWQgZm9yIGludmFsaWQgZGF0YSB2YWx1ZXMgaW4gYQorICogYSBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUIG1lc3NhZ2UuICBJdCBhbHNvIHNlZW1zIHRvIGJlIHJldHVybmVkIHdoZW4KKyAqIGEgUkVRVUVTVCBtZXNzYWdlIGlzIHNlbnQgYXQgdGhlIHdyb25nIHRpbWUuCiAgKi8KIAogZW51bSBwczNfc3lzX21hbmFnZXJfc2VydmljZV9pZCB7CkBAIC05Myw2ICsxMTQsNyBAQAogCVBTM19TTV9TRVJWSUNFX0lEX0NPTU1BTkQgPSAzLAogCVBTM19TTV9TRVJWSUNFX0lEX0VYVEVSTl9FVkVOVCA9IDQsCiAJUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1AgPSA1LAorCVBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1RfRVJST1IgPSA2LAogCVBTM19TTV9TRVJWSUNFX0lEX1NFVF9BVFRSID0gOCwKIH07CiAKQEAgLTE4NSwxMSArMjA3LDIxIEBACiB9OwogCiAvKioKKyAqIHBzM19zbV9mb3JjZV9wb3dlcl9vZmYgLSBQb3dlcm9mZiBoZWxwZXIuCisgKgorICogQSBnbG9iYWwgdmFyaWFibGUgdXNlZCB0byBmb3JjZSBhIHBvd2Vyb2ZmIHdoZW4gdGhlIHBvd2VyIGJ1dHRvbiBoYXMKKyAqIGJlZW4gcHJlc3NlZCBpcnJlc3BlY3RpdmUgb2YgaG93IGluaXQgaGFuZGxlcyB0aGUgY3RybF9hbHRfZGVsIHNpZ25hbC4KKyAqCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBwczNfc21fZm9yY2VfcG93ZXJfb2ZmOworCisvKioKICAqIHBzM19zeXNfbWFuYWdlcl93cml0ZSAtIEhlbHBlciB0byB3cml0ZSBhIHR3byBwYXJ0IG1lc3NhZ2UgdG8gdGhlIHZ1YXJ0LgogICoKICAqLwogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl93cml0ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgKmhlYWRlciwgY29uc3Qgdm9pZCAqcGF5bG9hZCkKIHsKIAlpbnQgcmVzdWx0OwpAQCAtMjEzLDE1ICsyNDUsMTAgQEAKICAqCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9hdHRyKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfYXR0cihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJZW51bSBwczNfc3lzX21hbmFnZXJfYXR0ciBhdHRyKQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXIgPSB7Ci0JCS52ZXJzaW9uID0gMSwKLQkJLnNpemUgPSAxNiwKLQkJLnBheWxvYWRfc2l6ZSA9IDE2LAotCQkuc2VydmljZV9pZCA9IFBTM19TTV9TRVJWSUNFX0lEX1NFVF9BVFRSLAotCX07CisJc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCB7CiAJCXU4IHZlcnNpb247CiAJCXU4IHJlc2VydmVkXzFbM107CkBAIC0yMzIsNiArMjU5LDEyIEBACiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGF0dHIpOwogCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwloZWFkZXIudmVyc2lvbiA9IDE7CisJaGVhZGVyLnNpemUgPSAxNjsKKwloZWFkZXIucGF5bG9hZF9zaXplID0gMTY7CisJaGVhZGVyLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9TRVRfQVRUUjsKKwogCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKIAlwYXlsb2FkLnZlcnNpb24gPSAxOwogCXBheWxvYWQuYXR0cmlidXRlID0gYXR0cjsKQEAgLTI0NSwxNiArMjc4LDExIEBACiAgKiBUZWxsIHRoZSBzeXN0ZW0gbWFuYWdlciB3aGF0IHRvIGRvIGFmdGVyIHRoaXMgbHBhciBpcyBkZXN0cm95ZWQuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9uZXh0X29wKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfbmV4dF9vcChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJZW51bSBwczNfc3lzX21hbmFnZXJfbmV4dF9vcCBvcCwKIAllbnVtIHBzM19zeXNfbWFuYWdlcl93YWtlX3NvdXJjZSB3YWtlX3NvdXJjZSkKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyID0gewotCQkudmVyc2lvbiA9IDEsCi0JCS5zaXplID0gMTYsCi0JCS5wYXlsb2FkX3NpemUgPSAxNiwKLQkJLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9TRVRfTkVYVF9PUCwKLQl9OworCXN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlcjsKIAlzdHJ1Y3QgewogCQl1OCB2ZXJzaW9uOwogCQl1OCB0eXBlOwpAQCAtMjY4LDYgKzI5NiwxMiBAQAogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICgleGgpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG9wKTsKIAorCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLnZlcnNpb24gPSAxOworCWhlYWRlci5zaXplID0gMTY7CisJaGVhZGVyLnBheWxvYWRfc2l6ZSA9IDE2OworCWhlYWRlci5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1A7CisKIAltZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihwYXlsb2FkKSk7CiAJcGF5bG9hZC52ZXJzaW9uID0gMzsKIAlwYXlsb2FkLnR5cGUgPSBvcDsKQEAgLTI4NiwzMiArMzIwLDM1IEBACiAgKiB0aGUgY29tbWFuZCBpcyB0aGVuIGNvbW11bmljYXRlZCBiYWNrIHRvIHRoZSBzeXN0ZW0gbWFuYWdlciB3aXRoIGEgcmVzcG9uc2UKICAqIG1lc3NhZ2UuCiAgKgotICogQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgcmVxdWVzdCBpdCB0aGUgJ3NodXRkb3duIHNlbGYnIHJlcXVlc3QuCisgKiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCByZXF1ZXN0IGlzIHRoZSAnc2h1dGRvd24gc2VsZicgcmVxdWVzdC4KICAqLwogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX3JlcXVlc3Rfc2h1dGRvd24oc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9yZXF1ZXN0X3NodXRkb3duKAorCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyID0gewotCQkudmVyc2lvbiA9IDEsCi0JCS5zaXplID0gMTYsCi0JCS5wYXlsb2FkX3NpemUgPSAxNiwKLQkJLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNULAotCX07CisJc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCB7CiAJCXU4IHZlcnNpb247CiAJCXU4IHR5cGU7CiAJCXU4IGdvc19pZDsKIAkJdTggcmVzZXJ2ZWRfMVsxM107Ci0JfSBzdGF0aWMgY29uc3QgcGF5bG9hZCA9IHsKLQkJLnZlcnNpb24gPSAxLAotCQkudHlwZSA9IDEsIC8qIHNodXRkb3duICovCi0JCS5nb3NfaWQgPSAwLCAvKiBzZWxmICovCi0JfTsKKwl9IHBheWxvYWQ7CiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHBheWxvYWQpICE9IDE2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwloZWFkZXIudmVyc2lvbiA9IDE7CisJaGVhZGVyLnNpemUgPSAxNjsKKwloZWFkZXIucGF5bG9hZF9zaXplID0gMTY7CisJaGVhZGVyLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUOworCisJbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOworCXBheWxvYWQudmVyc2lvbiA9IDE7CisJcGF5bG9hZC50eXBlID0gMTsgLyogc2h1dGRvd24gKi8KKwlwYXlsb2FkLmdvc19pZCA9IDA7IC8qIHNlbGYgKi8KKwogCXJldHVybiBwczNfc3lzX21hbmFnZXJfd3JpdGUoZGV2LCAmaGVhZGVyLCAmcGF5bG9hZCk7CiB9CiAKQEAgLTMyMywxNSArMzYwLDEwIEBACiAgKiBmYWlsdXJlIG9mIGEgY29tbWFuZCBzZW50IGJ5IHRoZSBzeXN0ZW0gbWFuYWdlci4KICAqLwogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfcmVzcG9uc2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXU2NCBzdGF0dXMpCiB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlciA9IHsKLQkJLnZlcnNpb24gPSAxLAotCQkuc2l6ZSA9IDE2LAotCQkucGF5bG9hZF9zaXplID0gMTYsCi0JCS5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfUkVTUE9OU0UsCi0JfTsKKwlzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IHsKIAkJdTggdmVyc2lvbjsKIAkJdTggcmVzZXJ2ZWRfMVszXTsKQEAgLTM0NCw2ICszNzYsMTIgQEAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkoc3RhdHVzID8gIm5hayIgOiAiYWNrIikpOwogCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwloZWFkZXIudmVyc2lvbiA9IDE7CisJaGVhZGVyLnNpemUgPSAxNjsKKwloZWFkZXIucGF5bG9hZF9zaXplID0gMTY7CisJaGVhZGVyLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9SRVNQT05TRTsKKwogCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKIAlwYXlsb2FkLnZlcnNpb24gPSAxOwogCXBheWxvYWQuc3RhdHVzID0gc3RhdHVzOwpAQCAtMzU2LDcgKzM5NCw3IEBACiAgKgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9ldmVudChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfZXZlbnQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQ7CiAJc3RydWN0IHsKQEAgLTM3MCw3ICs0MDgsNyBAQAogCUJVSUxEX0JVR19PTihzaXplb2YoZXZlbnQpICE9IDE2KTsKIAogCXJlc3VsdCA9IHBzM192dWFydF9yZWFkKGRldiwgJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlCVUdfT04ocmVzdWx0ICYmICJuZWVkIHRvIHJldHJ5IGhlcmUiKTsKIAogCWlmIChldmVudC52ZXJzaW9uICE9IDEpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHVuc3VwcG9ydGVkIGV2ZW50IHZlcnNpb24gKCV1KVxuIiwKQEAgLTM4MiwxMSArNDIwLDM0IEBACiAJY2FzZSBQUzNfU01fRVZFTlRfUE9XRVJfUFJFU1NFRDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFBPV0VSX1BSRVNTRURcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlwczNfc21fZm9yY2VfcG93ZXJfb2ZmID0gMTsKKwkJLyoKKwkJICogQSBtZW1vcnkgYmFycmllciBpcyB1c2UgaGVyZSB0byBzeW5jIG1lbW9yeSBzaW5jZQorCQkgKiBwczNfc3lzX21hbmFnZXJfZmluYWxfcmVzdGFydCgpIGNvdWxkIGJlIGNhbGxlZCBvbgorCQkgKiBhbm90aGVyIGNwdS4KKwkJICovCisJCXdtYigpOworCQlraWxsX2NhZF9waWQoU0lHSU5ULCAxKTsgLyogY3RybF9hbHRfZGVsICovCiAJCWJyZWFrOwogCWNhc2UgUFMzX1NNX0VWRU5UX1BPV0VSX1JFTEVBU0VEOgogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogUE9XRVJfUkVMRUFTRUQgKCV1IG1zKVxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgZXZlbnQudmFsdWUpOwotCQlraWxsX2NhZF9waWQoU0lHSU5ULCAxKTsKKwkJYnJlYWs7CisJY2FzZSBQUzNfU01fRVZFTlRfUkVTRVRfUFJFU1NFRDoKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFJFU0VUX1BSRVNTRURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlwczNfc21fZm9yY2VfcG93ZXJfb2ZmID0gMDsKKwkJLyoKKwkJICogQSBtZW1vcnkgYmFycmllciBpcyB1c2UgaGVyZSB0byBzeW5jIG1lbW9yeSBzaW5jZQorCQkgKiBwczNfc3lzX21hbmFnZXJfZmluYWxfcmVzdGFydCgpIGNvdWxkIGJlIGNhbGxlZCBvbgorCQkgKiBhbm90aGVyIGNwdS4KKwkJICovCisJCXdtYigpOworCQlraWxsX2NhZF9waWQoU0lHSU5ULCAxKTsgLyogY3RybF9hbHRfZGVsICovCisJCWJyZWFrOworCWNhc2UgUFMzX1NNX0VWRU5UX1JFU0VUX1JFTEVBU0VEOgorCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogUkVTRVRfUkVMRUFTRUQgKCV1IG1zKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZXZlbnQudmFsdWUpOwogCQlicmVhazsKIAljYXNlIFBTM19TTV9FVkVOVF9USEVSTUFMX0FMRVJUOgogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogVEhFUk1BTF9BTEVSVCAoem9uZSAldSlcbiIsCkBAIC00MTEsNyArNDcyLDcgQEAKICAqIFRoZSBzeXN0ZW0gbWFuYWdlciBzZW5kcyB0aGlzIGluIHJlcGx5IHRvIGEgJ3JlcXVlc3QnIG1lc3NhZ2UgZnJvbSB0aGUgZ3Vlc3QuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX2NtZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfY21kKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCB7CkBAIC00MjUsNiArNDg2LDcgQEAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAogCXJlc3VsdCA9IHBzM192dWFydF9yZWFkKGRldiwgJmNtZCwgc2l6ZW9mKGNtZCkpOworCUJVR19PTihyZXN1bHQgJiYgIm5lZWQgdG8gcmV0cnkgaGVyZSIpOwogCiAJaWYocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwpAQCAtNDQ4LDkgKzUxMCwxMCBAQAogLyoqCiAgKiBwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyAtIEZpcnN0IHN0YWdlIG1zZyBoYW5kbGVyLgogICoKKyAqIENhbiBiZSBjYWxsZWQgZGlyZWN0bHkgdG8gbWFudWFsbHkgcG9sbCB2dWFydCBhbmQgcHVtcCBtZXNzYWdlIGhhbmRsZXIuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlcjsKQEAgLTQ2NCwxMiArNTI3LDE3IEBACiAJaWYgKGhlYWRlci52ZXJzaW9uICE9IDEpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHVuc3VwcG9ydGVkIGhlYWRlciB2ZXJzaW9uICgldSlcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGhlYWRlci52ZXJzaW9uKTsKKwkJZHVtcF9zbV9oZWFkZXIoJmhlYWRlcik7CiAJCWdvdG8gZmFpbF9oZWFkZXI7CiAJfQogCiAJQlVJTERfQlVHX09OKHNpemVvZihoZWFkZXIpICE9IDE2KTsKLQlCVUdfT04oaGVhZGVyLnNpemUgIT0gMTYpOwotCUJVR19PTihoZWFkZXIucGF5bG9hZF9zaXplICE9IDE2KTsKKworCWlmIChoZWFkZXIuc2l6ZSAhPSAxNiB8fCAoaGVhZGVyLnBheWxvYWRfc2l6ZSAhPSA4CisJCSYmIGhlYWRlci5wYXlsb2FkX3NpemUgIT0gMTYpKSB7CisJCWR1bXBfc21faGVhZGVyKCZoZWFkZXIpOworCQlCVUcoKTsKKwl9CiAKIAlzd2l0Y2ggKGhlYWRlci5zZXJ2aWNlX2lkKSB7CiAJY2FzZSBQUzNfU01fU0VSVklDRV9JRF9FWFRFUk5fRVZFTlQ6CkBAIC00NzgsNiArNTQ2LDExIEBACiAJY2FzZSBQUzNfU01fU0VSVklDRV9JRF9DT01NQU5EOgogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogQ09NTUFORFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfY21kKGRldik7CisJY2FzZSBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUX0VSUk9SOgorCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogUkVRVUVTVF9FUlJPUlxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCWR1bXBfc21faGVhZGVyKCZoZWFkZXIpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogdW5rbm93biBzZXJ2aWNlX2lkICgldSlcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGhlYWRlci5zZXJ2aWNlX2lkKTsKQEAgLTQ5NCw2OSArNTY3LDE5IEBACiB9CiAKIC8qKgotICogcHMzX3N5c19tYW5hZ2VyX3dvcmsgLSBBc3luY3Jvbm91cyByZWFkIGhhbmRsZXIuCisgKiBwczNfc3lzX21hbmFnZXJfZmluYWxfcG93ZXJfb2ZmIC0gVGhlIGZpbmFsIHBsYXRmb3JtIG1hY2hpbmVfcG93ZXJfb2ZmIHJvdXRpbmUuCiAgKgotICogU2lnbmFsZWQgd2hlbiBhIGNvbXBsZXRlIG1lc3NhZ2UgYXJyaXZlcyBhdCB0aGUgdnVhcnQgcG9ydC4KLSAqLwotCi1zdGF0aWMgdm9pZCBwczNfc3lzX21hbmFnZXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gcHMzX3Z1YXJ0X3dvcmtfdG9fcG9ydF9kZXZpY2Uod29yayk7Ci0KLQlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOwotCXBzM192dWFydF9yZWFkX2FzeW5jKGRldiwgcHMzX3N5c19tYW5hZ2VyX3dvcmssIFBTM19TTV9SWF9NU0dfTEVOKTsKLX0KLQotc3RydWN0IHsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXY7Ci19IHN0YXRpYyBkcnZfcHJpdjsKLQotLyoqCi0gKiBwczNfc3lzX21hbmFnZXJfcmVzdGFydCAtIFRoZSBmaW5hbCBwbGF0Zm9ybSBtYWNoaW5lX3Jlc3RhcnQgcm91dGluZS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucy4gIFRoZSByb3V0aW5lIGRpc2FibGVzIGFzeW5jcm9ub3VzIHZ1YXJ0IHJlYWRzCisgKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucy4gIFRoZSByb3V0aW5lIGRpc2FibGVzIGFzeW5jaHJvbm91cyB2dWFydCByZWFkcwogICogdGhlbiBzcGlucyBjYWxsaW5nIHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKCkgdG8gcmVjZWl2ZSBhbmQgYWNrbm93bGVkZ2UKICAqIHRoZSBzaHV0ZG93biBjb21tYW5kIHNlbnQgZnJvbSB0aGUgc3lzdGVtIG1hbmFnZXIuICBTb29uIGFmdGVyIHRoZQogICogYWNrbm93bGVkZ2VtZW50IGlzIHNlbnQgdGhlIGxwYXIgaXMgZGVzdHJveWVkIGJ5IHRoZSBIVi4gIFRoaXMgcm91dGluZQotICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gcHMzX3Jlc3RhcnQoKS4KKyAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHBzM19wb3dlcl9vZmYoKSB0aHJvdWdoCisgKiBwczNfc3lzX21hbmFnZXJfb3BzLnBvd2VyX29mZi4KICAqLwogCi12b2lkIHBzM19zeXNfbWFuYWdlcl9yZXN0YXJ0KHZvaWQpCitzdGF0aWMgdm9pZCBwczNfc3lzX21hbmFnZXJfZmluYWxfcG93ZXJfb2ZmKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYgPSBkcnZfcHJpdi5kZXY7Ci0KLQlCVUdfT04oIWRydl9wcml2LmRldik7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCXBzM192dWFydF9jYW5jZWxfYXN5bmMoZGV2KTsKLQotCXBzM19zeXNfbWFuYWdlcl9zZW5kX2F0dHIoZGV2LCAwKTsKLQlwczNfc3lzX21hbmFnZXJfc2VuZF9uZXh0X29wKGRldiwgUFMzX1NNX05FWFRfT1BfTFBBUl9SRUJPT1QsCi0JCVBTM19TTV9XQUtFX0RFRkFVTFQpOwotCXBzM19zeXNfbWFuYWdlcl9zZW5kX3JlcXVlc3Rfc2h1dGRvd24oZGV2KTsKLQotCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gSGFsdGVkLCBPSyB0byB0dXJuIG9mZiBwb3dlclxuIik7Ci0KLQl3aGlsZSgxKQotCQlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOwotfQotCi0vKioKLSAqIHBzM19zeXNfbWFuYWdlcl9wb3dlcl9vZmYgLSBUaGUgZmluYWwgcGxhdGZvcm0gbWFjaGluZV9wb3dlcl9vZmYgcm91dGluZS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucy4gIFRoZSByb3V0aW5lIGRpc2FibGVzIGFzeW5jcm9ub3VzIHZ1YXJ0IHJlYWRzCi0gKiB0aGVuIHNwaW5zIGNhbGxpbmcgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coKSB0byByZWNlaXZlIGFuZCBhY2tub3dsZWRnZQotICogdGhlIHNodXRkb3duIGNvbW1hbmQgc2VudCBmcm9tIHRoZSBzeXN0ZW0gbWFuYWdlci4gIFNvb24gYWZ0ZXIgdGhlCi0gKiBhY2tub3dsZWRnZW1lbnQgaXMgc2VudCB0aGUgbHBhciBpcyBkZXN0cm95ZWQgYnkgdGhlIEhWLiAgVGhpcyByb3V0aW5lCi0gKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBwczNfcG93ZXJfb2ZmKCkuCi0gKi8KLQotdm9pZCBwczNfc3lzX21hbmFnZXJfcG93ZXJfb2ZmKHZvaWQpCi17Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gZHJ2X3ByaXYuZGV2OwotCi0JQlVHX09OKCFkcnZfcHJpdi5kZXYpOworCUJVR19PTighZGV2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCkBAIC01NzIsMzEgKzU5NSw5NyBAQAogCQlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOwogfQogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9wcm9iZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCisvKioKKyAqIHBzM19zeXNfbWFuYWdlcl9maW5hbF9yZXN0YXJ0IC0gVGhlIGZpbmFsIHBsYXRmb3JtIG1hY2hpbmVfcmVzdGFydCByb3V0aW5lLgorICoKKyAqIFRoaXMgcm91dGluZSBuZXZlciByZXR1cm5zLiAgVGhlIHJvdXRpbmUgZGlzYWJsZXMgYXN5bmNocm9ub3VzIHZ1YXJ0IHJlYWRzCisgKiB0aGVuIHNwaW5zIGNhbGxpbmcgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coKSB0byByZWNlaXZlIGFuZCBhY2tub3dsZWRnZQorICogdGhlIHNodXRkb3duIGNvbW1hbmQgc2VudCBmcm9tIHRoZSBzeXN0ZW0gbWFuYWdlci4gIFNvb24gYWZ0ZXIgdGhlCisgKiBhY2tub3dsZWRnZW1lbnQgaXMgc2VudCB0aGUgbHBhciBpcyBkZXN0cm95ZWQgYnkgdGhlIEhWLiAgVGhpcyByb3V0aW5lCisgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBwczNfcmVzdGFydCgpIHRocm91Z2ggcHMzX3N5c19tYW5hZ2VyX29wcy5yZXN0YXJ0LgorICovCisKK3N0YXRpYyB2b2lkIHBzM19zeXNfbWFuYWdlcl9maW5hbF9yZXN0YXJ0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlpbnQgcmVzdWx0OworCUJVR19PTighZGV2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JQlVHX09OKGRydl9wcml2LmRldik7Ci0JZHJ2X3ByaXYuZGV2ID0gZGV2OworCS8qIENoZWNrIGlmIHdlIGdvdCBoZXJlIHZpYSBhIHBvd2VyIGJ1dHRvbiBldmVudC4gKi8KKworCWlmIChwczNfc21fZm9yY2VfcG93ZXJfb2ZmKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBmb3JjaW5nIHBvd2Vyb2ZmXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Bvd2VyX29mZihkZXYpOworCX0KKworCXBzM192dWFydF9jYW5jZWxfYXN5bmMoZGV2KTsKKworCXBzM19zeXNfbWFuYWdlcl9zZW5kX2F0dHIoZGV2LCAwKTsKKwlwczNfc3lzX21hbmFnZXJfc2VuZF9uZXh0X29wKGRldiwgUFMzX1NNX05FWFRfT1BfTFBBUl9SRUJPT1QsCisJCVBTM19TTV9XQUtFX0RFRkFVTFQpOworCXBzM19zeXNfbWFuYWdlcl9zZW5kX3JlcXVlc3Rfc2h1dGRvd24oZGV2KTsKKworCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gSGFsdGVkLCBPSyB0byB0dXJuIG9mZiBwb3dlclxuIik7CisKKwl3aGlsZSgxKQorCQlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOworfQorCisvKioKKyAqIHBzM19zeXNfbWFuYWdlcl93b3JrIC0gQXN5bmNocm9ub3VzIHJlYWQgaGFuZGxlci4KKyAqCisgKiBTaWduYWxlZCB3aGVuIFBTM19TTV9SWF9NU0dfTEVOX01JTiBieXRlcyBhcnJpdmUgYXQgdGhlIHZ1YXJ0IHBvcnQuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3dvcmsoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKGRldik7CisJcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoZGV2LCBQUzNfU01fUlhfTVNHX0xFTl9NSU4pOworfQorCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX29wcyBvcHM7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCW9wcy5wb3dlcl9vZmYgPSBwczNfc3lzX21hbmFnZXJfZmluYWxfcG93ZXJfb2ZmOworCW9wcy5yZXN0YXJ0ID0gcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Jlc3RhcnQ7CisJb3BzLmRldiA9IGRldjsKKworCS8qIHBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMgY29waWVzIG9wcy4gKi8KKworCXBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMoJm9wcyk7CiAKIAlyZXN1bHQgPSBwczNfc3lzX21hbmFnZXJfc2VuZF9hdHRyKGRldiwgUFMzX1NNX0FUVFJfQUxMKTsKIAlCVUdfT04ocmVzdWx0KTsKIAotCXJlc3VsdCA9IHBzM192dWFydF9yZWFkX2FzeW5jKGRldiwgcHMzX3N5c19tYW5hZ2VyX3dvcmssCi0JCVBTM19TTV9SWF9NU0dfTEVOKTsKKwlyZXN1bHQgPSBwczNfdnVhcnRfcmVhZF9hc3luYyhkZXYsIFBTM19TTV9SWF9NU0dfTEVOX01JTik7CiAJQlVHX09OKHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9yZW1vdmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwczNfc3lzX21hbmFnZXJfc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworfQorCiBzdGF0aWMgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciBwczNfc3lzX21hbmFnZXIgPSB7Ci0JLm1hdGNoX2lkID0gUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSLAotCS5jb3JlID0gewotCQkubmFtZSA9ICJwczNfc3lzX21hbmFnZXIiLAotCX0sCisJLmNvcmUubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVIsCisJLmNvcmUuY29yZS5uYW1lID0gInBzM19zeXNfbWFuYWdlciIsCiAJLnByb2JlID0gcHMzX3N5c19tYW5hZ2VyX3Byb2JlLAorCS5yZW1vdmUgPSBwczNfc3lzX21hbmFnZXJfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHBzM19zeXNfbWFuYWdlcl9zaHV0ZG93biwKKwkud29yayA9IHBzM19zeXNfbWFuYWdlcl93b3JrLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcHMzX3N5c19tYW5hZ2VyX2luaXQodm9pZCkKQEAgLTYwOCwzICs2OTcsNiBAQAogfQogCiBtb2R1bGVfaW5pdChwczNfc3lzX21hbmFnZXJfaW5pdCk7CisvKiBNb2R1bGUgcmVtb3ZlIG5vdCBzdXBwb3J0ZWQuICovCisKK01PRFVMRV9BTElBUyhQUzNfTU9EVUxFX0FMSUFTX1NZU1RFTV9NQU5BR0VSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmMgYi9kcml2ZXJzL3BzMy92dWFydC5jCmluZGV4IGVjMmQzNmEuLmJlYTI1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmMKKysrIGIvZHJpdmVycy9wczMvdnVhcnQuYwpAQCAtNzEsNiArNzEsMzQgQEAKIH07CiAKIC8qKgorICogc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgLSBwcml2YXRlIHZ1YXJ0IGRldmljZSBkYXRhLgorICovCisKK3N0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2IHsKKwl1NjQgaW50ZXJydXB0X21hc2s7CisKKwlzdHJ1Y3QgeworCQlzcGlubG9ja190IGxvY2s7CisJCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwl9IHR4X2xpc3Q7CisJc3RydWN0IHsKKwkJc3RydWN0IHBzM192dWFydF93b3JrIHdvcms7CisJCXVuc2lnbmVkIGxvbmcgYnl0ZXNfaGVsZDsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJfSByeF9saXN0OworCXN0cnVjdCBwczNfdnVhcnRfc3RhdHMgc3RhdHM7Cit9OworCitzdGF0aWMgc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnRvX3BvcnRfcHJpdigKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJQlVHX09OKCFkZXYpOworCUJVR19PTighZGV2LT5kcml2ZXJfcHJpdik7CisJcmV0dXJuIChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqKWRldi0+ZHJpdmVyX3ByaXY7Cit9CisKKy8qKgogICogc3RydWN0IHBvcnRzX2JtcCAtIGJpdG1hcCBpbmRpY2F0aW5nIHBvcnRzIG5lZWRpbmcgc2VydmljZS4KICAqCiAgKiBBIDI1NiBiaXQgcmVhZCBvbmx5IGJpdG1hcCBpbmRpY2F0aW5nIHBvcnRzIG5lZWRpbmcgc2VydmljZS4gIERvIG5vdCB3cml0ZQpAQCAtODMsMzEgKzExMSwxNCBAQAogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMzIpKSk7CiAKICNkZWZpbmUgZHVtcF9wb3J0c19ibXAoX2IpIF9kdW1wX3BvcnRzX2JtcChfYiwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX3BvcnRzX2JtcCgKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX3BvcnRzX2JtcCgKIAljb25zdCBzdHJ1Y3QgcG9ydHNfYm1wKiBibXAsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCXByX2RlYnVnKCIlczolZDogcG9ydHNfYm1wOiAlMDE2bHhoXG4iLCBmdW5jLCBsaW5lLCBibXAtPnN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X21hdGNoX2lkX3RvX3BvcnQoZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQsCi0JdW5zaWduZWQgaW50ICpwb3J0X251bWJlcikKLXsKLQlzd2l0Y2gobWF0Y2hfaWQpIHsKLQljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKLQkJKnBvcnRfbnVtYmVyID0gMDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVI6Ci0JCSpwb3J0X251bWJlciA9IDI7Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCVdBUk5fT04oMSk7Ci0JCSpwb3J0X251bWJlciA9IFVJTlRfTUFYOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotfQotCiAjZGVmaW5lIGR1bXBfcG9ydF9wYXJhbXMoX2IpIF9kdW1wX3BvcnRfcGFyYW1zKF9iLCBfX2Z1bmNfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfcG9ydF9wYXJhbXModW5zaWduZWQgaW50IHBvcnRfbnVtYmVyLAorc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgX2R1bXBfcG9ydF9wYXJhbXModW5zaWduZWQgaW50IHBvcnRfbnVtYmVyLAogCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogI2lmIGRlZmluZWQoREVCVUcpCkBAIC0xNDQsMTQgKzE1NSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgdHg7CiB9OwogCi1pbnQgcHMzX3Z1YXJ0X2dldF90cmlnZ2VycyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitpbnQgcHMzX3Z1YXJ0X2dldF90cmlnZ2VycyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJc3RydWN0IHZ1YXJ0X3RyaWdnZXJzICp0cmlnKQogewogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCi0JcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9UWF9UUklHR0VSLCAmdHJpZy0+dHgpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtMTYwLDcgKzE3MSw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9SWF9CVUZfU0laRSwgJnNpemUpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtMTY5LDcgKzE4MCw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9SWF9UUklHR0VSLCAmdmFsKTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTE4NiwxMyArMTk3LDEzIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IHBzM192dWFydF9zZXRfdHJpZ2dlcnMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdHgsCitpbnQgcHMzX3Z1YXJ0X3NldF90cmlnZ2VycyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB0eCwKIAl1bnNpZ25lZCBpbnQgcngpCiB7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAKLQlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnByaXYtPnBvcnRfbnVtYmVyLAorCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1RYX1RSSUdHRVIsIHR4KTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTIwMSw3ICsyMTIsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfQlVGX1NJWkUsICZzaXplKTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTIxMCw3ICsyMjEsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX3NldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfVFJJR0dFUiwgc2l6ZSAtIHJ4KTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTIyNSwxMCArMjM2LDEyIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X3J4X2J5dGVzX3dhaXRpbmcoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X3J4X2J5dGVzX3dhaXRpbmcoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXU2NCAqYnl0ZXNfd2FpdGluZykKIHsKLQlpbnQgcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfQllURVMsIGJ5dGVzX3dhaXRpbmcpOwogCiAJaWYgKHJlc3VsdCkKQEAgLTI0MCwxNyArMjUzLDI0IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKKy8qKgorICogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayAtIEVuYWJsZS9kaXNhYmxlIHRoZSBwb3J0IGludGVycnVwdCBzb3VyY2VzLgorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCisgKiBAYm1wOiBMb2dpY2FsIE9SIG9mIGVudW0gdnVhcnRfaW50ZXJydXB0X21hc2sgdmFsdWVzLiBBIHplcm8gYml0IGRpc2FibGVzLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJdW5zaWduZWQgbG9uZyBtYXNrKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG1hc2spOwogCi0JZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayA9IG1hc2s7CisJcHJpdi0+aW50ZXJydXB0X21hc2sgPSBtYXNrOwogCi0JcmVzdWx0ID0gbHYxX3NldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKLQkJUEFSQU1fSU5URVJSVVBUX01BU0ssIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2spOworCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCisJCVBBUkFNX0lOVEVSUlVQVF9NQVNLLCBwcml2LT5pbnRlcnJ1cHRfbWFzayk7CiAKIAlpZiAocmVzdWx0KQogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogaW50ZXJydXB0X21hc2sgZmFpbGVkOiAlc1xuIiwKQEAgLTI1OSw3OSArMjc5LDk2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X2ludGVycnVwdF9zdGF0dXMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X2ludGVycnVwdF9zdGF0dXMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXVuc2lnbmVkIGxvbmcgKnN0YXR1cykKIHsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdTY0IHRtcDsKLQlpbnQgcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKworCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX0lOVEVSUlVQVF9TVEFUVVMsICZ0bXApOwogCiAJaWYgKHJlc3VsdCkKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGludGVycnVwdF9zdGF0dXMgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAotCSpzdGF0dXMgPSB0bXAgJiBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrOworCSpzdGF0dXMgPSB0bXAgJiBwcml2LT5pbnRlcnJ1cHRfbWFzazsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBtICVseGgsIHMgJWx4aCwgbSZzICVseGhcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaywgdG1wLCAqc3RhdHVzKTsKKwkJX19mdW5jX18sIF9fTElORV9fLCBwcml2LT5pbnRlcnJ1cHRfbWFzaywgdG1wLCAqc3RhdHVzKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF90eChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1RYKSA/IDAKLQkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisKKwlyZXR1cm4gKHByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfVFgpID8gMAorCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQl8IElOVEVSUlVQVF9NQVNLX1RYKTsKIH0KIAotaW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK2ludCBwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIChkZXYtPnByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfUlgpID8gMAotCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrCisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKworCXJldHVybiAocHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19SWCkgPyAwCisJCTogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIHByaXYtPmludGVycnVwdF9tYXNrCiAJCXwgSU5URVJSVVBUX01BU0tfUlgpOwogfQogCi1pbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIChkZXYtPnByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfRElTQ09OTkVDVCkgPyAwCi0JCTogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCisJcmV0dXJuIChwcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpID8gMAorCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQl8IElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpOwogfQogCi1pbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK2ludCBwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1RYKQotCQk/IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrCisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKworCXJldHVybiAocHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19UWCkKKwkJPyBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgcHJpdi0+aW50ZXJydXB0X21hc2sKIAkJJiB+SU5URVJSVVBUX01BU0tfVFgpIDogMDsKIH0KIAotaW50IHBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19SWCkKLQkJPyBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisKKwlyZXR1cm4gKHByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfUlgpCisJCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIHByaXYtPmludGVycnVwdF9tYXNrCiAJCSYgfklOVEVSUlVQVF9NQVNLX1JYKSA6IDA7CiB9CiAKLWludCBwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpCi0JCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCisJcmV0dXJuIChwcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpCisJCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIHByaXYtPmludGVycnVwdF9tYXNrCiAJCSYgfklOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpIDogMDsKIH0KIAogLyoqCiAgKiBwczNfdnVhcnRfcmF3X3dyaXRlIC0gTG93IGxldmVsIHdyaXRlIGhlbHBlci4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgogICoKICAqIERvIG5vdCBjYWxsIHBzM192dWFydF9yYXdfd3JpdGUgZGlyZWN0bHksIHVzZSBwczNfdnVhcnRfd3JpdGUuCiAgKi8KIAotc3RhdGljIGludCBwczNfdnVhcnRfcmF3X3dyaXRlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Jhd193cml0ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgKmJ5dGVzX3dyaXR0ZW4pCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCi0JcmVzdWx0ID0gbHYxX3dyaXRlX3ZpcnR1YWxfdWFydChkZXYtPnByaXYtPnBvcnRfbnVtYmVyLAorCXJlc3VsdCA9IGx2MV93cml0ZV92aXJ0dWFsX3VhcnQoZGV2LT5wb3J0X251bWJlciwKIAkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKGJ1ZikpLCBieXRlcywgYnl0ZXNfd3JpdHRlbik7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0zNDAsMjggKzM3NywzMCBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCWRldi0+cHJpdi0+c3RhdHMuYnl0ZXNfd3JpdHRlbiArPSAqYnl0ZXNfd3JpdHRlbjsKKwlwcml2LT5zdGF0cy5ieXRlc193cml0dGVuICs9ICpieXRlc193cml0dGVuOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdyb3RlICVseGgvJXhoPT4lbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCSpieXRlc193cml0dGVuLCBieXRlcywgZGV2LT5wcml2LT5zdGF0cy5ieXRlc193cml0dGVuKTsKKwkJKmJ5dGVzX3dyaXR0ZW4sIGJ5dGVzLCBwcml2LT5zdGF0cy5ieXRlc193cml0dGVuKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgogICogcHMzX3Z1YXJ0X3Jhd19yZWFkIC0gTG93IGxldmVsIHJlYWQgaGVscGVyLgorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCiAgKgogICogRG8gbm90IGNhbGwgcHMzX3Z1YXJ0X3Jhd19yZWFkIGRpcmVjdGx5LCB1c2UgcHMzX3Z1YXJ0X3JlYWQuCiAgKi8KIAotc3RhdGljIGludCBwczNfdnVhcnRfcmF3X3JlYWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB2b2lkKiBidWYsCitzdGF0aWMgaW50IHBzM192dWFydF9yYXdfcmVhZChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgKmJ5dGVzX3JlYWQpCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICV4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBieXRlcyk7CiAKLQlyZXN1bHQgPSBsdjFfcmVhZF92aXJ0dWFsX3VhcnQoZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfcmVhZF92aXJ0dWFsX3VhcnQoZGV2LT5wb3J0X251bWJlciwKIAkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKGJ1ZikpLCBieXRlcywgYnl0ZXNfcmVhZCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0zNzAsMjUgKzQwOSwyNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCWRldi0+cHJpdi0+c3RhdHMuYnl0ZXNfcmVhZCArPSAqYnl0ZXNfcmVhZDsKKwlwcml2LT5zdGF0cy5ieXRlc19yZWFkICs9ICpieXRlc19yZWFkOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHJlYWQgJWx4aC8leGg9PiVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJKmJ5dGVzX3JlYWQsIGJ5dGVzLCBkZXYtPnByaXYtPnN0YXRzLmJ5dGVzX3JlYWQpOworCQkqYnl0ZXNfcmVhZCwgYnl0ZXMsIHByaXYtPnN0YXRzLmJ5dGVzX3JlYWQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCiAgKiBwczNfdnVhcnRfY2xlYXJfcnhfYnl0ZXMgLSBEaXNjYXJkIGJ5dGVzIHJlY2VpdmVkLgorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCiAgKiBAYnl0ZXM6IE1heCBieXRlIGNvdW50IHRvIGRpc2NhcmQsIHplcm8gPSBhbGwgcGVuZGluZy4KICAqCiAgKiBVc2VkIHRvIGNsZWFyIHBlbmRpbmcgcnggaW50ZXJydXB0IHNvdXJjZS4gIFdpbGwgbm90IGJsb2NrLgogICovCiAKLXZvaWQgcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3ZvaWQgcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMpCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXU2NCBieXRlc193YWl0aW5nOwogCXZvaWQqIHRtcDsKIApAQCAtNDE4LDggKzQ1OSw5IEBACiAKIAkvKiBEb24ndCBpbmNsdWRlIHRoZXNlIGJ5dGVzIGluIHRoZSBzdGF0cy4gKi8KIAotCWRldi0+cHJpdi0+c3RhdHMuYnl0ZXNfcmVhZCAtPSBieXRlc193YWl0aW5nOworCXByaXYtPnN0YXRzLmJ5dGVzX3JlYWQgLT0gYnl0ZXNfd2FpdGluZzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyk7CiAKIC8qKgogICogc3RydWN0IGxpc3RfYnVmZmVyIC0gQW4gZWxlbWVudCBmb3IgYSBwb3J0IGRldmljZSBmaWZvIGJ1ZmZlciBsaXN0LgpAQCAtNDM1LDYgKzQ3Nyw3IEBACiAKIC8qKgogICogcHMzX3Z1YXJ0X3dyaXRlIC0gdGhlIGVudHJ5IHBvaW50IGZvciB3cml0aW5nIGRhdGEgdG8gYSBwb3J0CisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KICAqCiAgKiBJZiB0aGUgcG9ydCBpcyBpZGxlIG9uIGVudHJ5IGFzIG11Y2ggb2YgdGhlIGluY29taW5nIGRhdGEgaXMgd3JpdHRlbiB0bwogICogdGhlIHBvcnQgYXMgdGhlIHBvcnQgd2lsbCBhY2NlcHQuICBPdGhlcndpc2UgYSBsaXN0IGJ1ZmZlciBpcyBjcmVhdGVkCkBAIC00NDIsMjUgKzQ4NSwyNiBAQAogICogdGhlbiBlbnF1ZXVlZCBmb3IgdHJhbnNtaXNpb24gdmlhIHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQuCiAgKi8KIAotaW50IHBzM192dWFydF93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQqIGJ1ZiwKK2ludCBwczNfdnVhcnRfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCBjb25zdCB2b2lkICpidWYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKQogewogCXN0YXRpYyB1bnNpZ25lZCBsb25nIGRiZ19udW1iZXI7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxpc3RfYnVmZmVyICpsYjsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAldSgleGgpIGJ5dGVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCWJ5dGVzLCBieXRlcyk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKLQlpZiAobGlzdF9lbXB0eSgmZGV2LT5wcml2LT50eF9saXN0LmhlYWQpKSB7CisJaWYgKGxpc3RfZW1wdHkoJnByaXYtPnR4X2xpc3QuaGVhZCkpIHsKIAkJdW5zaWduZWQgbG9uZyBieXRlc193cml0dGVuOwogCiAJCXJlc3VsdCA9IHBzM192dWFydF9yYXdfd3JpdGUoZGV2LCBidWYsIGJ5dGVzLCAmYnl0ZXNfd3JpdHRlbik7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJZGV2X2RiZygmZGV2LT5jb3JlLApAQCAtNDc4LDcgKzUyMiw3IEBACiAJCWJ5dGVzIC09IGJ5dGVzX3dyaXR0ZW47CiAJCWJ1ZiArPSBieXRlc193cml0dGVuOwogCX0gZWxzZQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKIAogCWxiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfYnVmZmVyKSArIGJ5dGVzLCBHRlBfS0VSTkVMKTsKIApAQCAtNDkxLDI5ICs1MzUsODYgQEAKIAlsYi0+dGFpbCA9IGxiLT5kYXRhICsgYnl0ZXM7CiAJbGItPmRiZ19udW1iZXIgPSArK2RiZ19udW1iZXI7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZsYi0+bGluaywgJmRldi0+cHJpdi0+dHhfbGlzdC5oZWFkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbGItPmxpbmssICZwcml2LT50eF9saXN0LmhlYWQpOwogCXBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X3R4KGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBxdWV1ZWQgYnVmXyVsdSwgJXhoIGJ5dGVzXG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLCBieXRlcyk7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF93cml0ZSk7CiAKIC8qKgotICogcHMzX3Z1YXJ0X3JlYWQgLSB0aGUgZW50cnkgcG9pbnQgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIGEgcG9ydAorICogcHMzX3Z1YXJ0X3F1ZXVlX3J4X2J5dGVzIC0gUXVldWUgd2FpdGluZyBieXRlcyBpbnRvIHRoZSBidWZmZXIgbGlzdC4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgorICogQGJ5dGVzX3F1ZXVlZDogTnVtYmVyIG9mIGJ5dGVzIHF1ZXVlZCB0byB0aGUgYnVmZmVyIGxpc3QuCiAgKgotICogSWYgZW5vdWdoIGJ5dGVzIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QgYXJlIGhlbGQgaW4gdGhlIGJ1ZmZlciBsaXN0IHRob3NlCi0gKiBieXRlcyBhcmUgZGVxdWV1ZWQgYW5kIGNvcGllZCB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyLiAgRW1wdGllZCBsaXN0IGJ1ZmZlcnMKLSAqIGFyZSByZXRpZXJlZC4gIElmIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSBzdGF0aWZpZWQgYnkgYnl0ZXMgaGVsZCBpbiB0aGUgbGlzdAotICogYnVmZmVycyAtRUFHQUlOIGlzIHJldHVybmVkLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBwcml2LT5yeF9saXN0LmxvY2sgaGVsZC4KICAqLwogCi1pbnQgcHMzX3Z1YXJ0X3JlYWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB2b2lkKiBidWYsCitzdGF0aWMgaW50IHBzM192dWFydF9xdWV1ZV9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJdTY0ICpieXRlc19xdWV1ZWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgZGJnX251bWJlcjsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisJc3RydWN0IGxpc3RfYnVmZmVyICpsYjsKKwl1NjQgYnl0ZXM7CisKKwkqYnl0ZXNfcXVldWVkID0gMDsKKworCXJlc3VsdCA9IHBzM192dWFydF9nZXRfcnhfYnl0ZXNfd2FpdGluZyhkZXYsICZieXRlcyk7CisJQlVHX09OKHJlc3VsdCk7CisKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghYnl0ZXMpCisJCXJldHVybiAwOworCisJLyogQWRkIHNvbWUgZXh0cmEgc3BhY2UgZm9yIHJlY2VudGx5IGFycml2ZWQgZGF0YS4gKi8KKworCWJ5dGVzICs9IDEyODsKKworCWxiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfYnVmZmVyKSArIGJ5dGVzLCBHRlBfQVRPTUlDKTsKKworCWlmICghbGIpCisJCXJldHVybiAtRU5PTUVNOworCisJcHMzX3Z1YXJ0X3Jhd19yZWFkKGRldiwgbGItPmRhdGEsIGJ5dGVzLCAmYnl0ZXMpOworCisJbGItPmhlYWQgPSBsYi0+ZGF0YTsKKwlsYi0+dGFpbCA9IGxiLT5kYXRhICsgYnl0ZXM7CisJbGItPmRiZ19udW1iZXIgPSArK2RiZ19udW1iZXI7CisKKwlsaXN0X2FkZF90YWlsKCZsYi0+bGluaywgJnByaXYtPnJ4X2xpc3QuaGVhZCk7CisJcHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkICs9IGJ5dGVzOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGJ1Zl8lbHU6IHF1ZXVlZCAlbHhoIGJ5dGVzXG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLCBieXRlcyk7CisKKwkqYnl0ZXNfcXVldWVkID0gYnl0ZXM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwczNfdnVhcnRfcmVhZCAtIFRoZSBlbnRyeSBwb2ludCBmb3IgcmVhZGluZyBkYXRhIGZyb20gYSBwb3J0LgorICoKKyAqIFF1ZXVlIGRhdGEgd2FpdGluZyBhdCB0aGUgcG9ydCwgYW5kIGlmIGVub3VnaCBieXRlcyB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0CisgKiBhcmUgaGVsZCBpbiB0aGUgYnVmZmVyIGxpc3QgdGhvc2UgYnl0ZXMgYXJlIGRlcXVldWVkIGFuZCBjb3BpZWQgdG8gdGhlCisgKiBjYWxsZXIncyBidWZmZXIuICBFbXB0aWVkIGxpc3QgYnVmZmVycyBhcmUgcmV0aWVyZWQuICBJZiB0aGUgcmVxdWVzdCBjYW5ub3QKKyAqIGJlIHN0YXRpZmllZCBieSBieXRlcyBoZWxkIGluIHRoZSBsaXN0IGJ1ZmZlcnMgLUVBR0FJTiBpcyByZXR1cm5lZC4KKyAqLworCitpbnQgcHMzX3Z1YXJ0X3JlYWQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB2b2lkICpidWYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKQogeworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGIsICpuOwogCXVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVhZDsKQEAgLTUyMSwzMCArNjIyLDM3IEBACiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICV1KCV4aCkgYnl0ZXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJYnl0ZXMsIGJ5dGVzKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKIAotCWlmIChkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA8IGJ5dGVzKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7Ci0JCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzdGFydmVkIGZvciAlbHhoIGJ5dGVzXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLAotCQkJYnl0ZXMgLSBkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCk7Ci0JCXJldHVybiAtRUFHQUlOOworCS8qIFF1ZXVlIHJ4IGJ5dGVzIGhlcmUgZm9yIHBvbGxlZCByZWFkcy4gKi8KKworCXdoaWxlIChwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgPCBieXRlcykgeworCQl1NjQgdG1wOworCisJCXJlc3VsdCA9IHBzM192dWFydF9xdWV1ZV9yeF9ieXRlcyhkZXYsICZ0bXApOworCQlpZiAocmVzdWx0IHx8ICF0bXApIHsKKwkJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzdGFydmVkIGZvciAlbHhoIGJ5dGVzXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQlieXRlcyAtIHByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxiLCBuLCAmZGV2LT5wcml2LT5yeF9saXN0LmhlYWQsIGxpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGIsIG4sICZwcml2LT5yeF9saXN0LmhlYWQsIGxpbmspIHsKIAkJYnl0ZXNfcmVhZCA9IG1pbigodW5zaWduZWQgaW50KShsYi0+dGFpbCAtIGxiLT5oZWFkKSwgYnl0ZXMpOwogCiAJCW1lbWNweShidWYsIGxiLT5oZWFkLCBieXRlc19yZWFkKTsKIAkJYnVmICs9IGJ5dGVzX3JlYWQ7CiAJCWJ5dGVzIC09IGJ5dGVzX3JlYWQ7Ci0JCWRldi0+cHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkIC09IGJ5dGVzX3JlYWQ7CisJCXByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCAtPSBieXRlc19yZWFkOwogCiAJCWlmIChieXRlc19yZWFkIDwgbGItPnRhaWwgLSBsYi0+aGVhZCkgewogCQkJbGItPmhlYWQgKz0gYnl0ZXNfcmVhZDsKIAkJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBidWZfJWx1OiBkZXF1ZXVlZCAlbHhoICIKIAkJCQkiYnl0ZXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbGItPmRiZ19udW1iZXIsCiAJCQkJYnl0ZXNfcmVhZCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC01NTYsMTYgKzY2NCwzMiBAQAogCQlrZnJlZShsYik7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9yZWFkKTsKIAotaW50IHBzM192dWFydF9yZWFkX2FzeW5jKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgd29ya19mdW5jX3QgZnVuYywKLQl1bnNpZ25lZCBpbnQgYnl0ZXMpCisvKioKKyAqIHBzM192dWFydF93b3JrIC0gQXN5bmNocm9ub3VzIHJlYWQgaGFuZGxlci4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfdnVhcnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0KKwkJcHMzX3Z1YXJ0X3dvcmtfdG9fc3lzdGVtX2J1c19kZXYod29yayk7CisJc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0KKwkJcHMzX3N5c3RlbV9idXNfZGV2X3RvX3Z1YXJ0X2RydihkZXYpOworCisJQlVHX09OKCFkcnYpOworCWRydi0+d29yayhkZXYpOworfQorCitpbnQgcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYnl0ZXMpCit7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYoZGV2LT5wcml2LT53b3JrLnRyaWdnZXIpIHsKKwlpZiAocHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdhcm5pbmcsIG11bHRpcGxlIGNhbGxzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIC1FQUdBSU47CkBAIC01NzMsMzAgKzY5NywzMiBAQAogCiAJQlVHX09OKCFieXRlcyk7CiAKLQlQUkVQQVJFX1dPUksoJmRldi0+cHJpdi0+d29yay53b3JrLCBmdW5jKTsKKwlQUkVQQVJFX1dPUksoJnByaXYtPnJ4X2xpc3Qud29yay53b3JrLCBwczNfdnVhcnRfd29yayk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT53b3JrLmxvY2ssIGZsYWdzKTsKLQlpZihkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA+PSBieXRlcykgeworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwlpZiAocHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkID49IGJ5dGVzKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzY2hlZHVsZV93b3JrICV4aCBieXRlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnl0ZXMpOwotCQlzY2hlZHVsZV93b3JrKCZkZXYtPnByaXYtPndvcmsud29yayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+d29yay5sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X2xpc3Qud29yay53b3JrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCWRldi0+cHJpdi0+d29yay50cmlnZ2VyID0gYnl0ZXM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT53b3JrLmxvY2ssIGZsYWdzKTsKKwlwcml2LT5yeF9saXN0LndvcmsudHJpZ2dlciA9IGJ5dGVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdhaXRpbmcgZm9yICV1KCV4aCkgYnl0ZXNcbiIsIF9fZnVuY19fLAogCQlfX0xJTkVfXywgYnl0ZXMsIGJ5dGVzKTsKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X3JlYWRfYXN5bmMpOwogCi12b2lkIHBzM192dWFydF9jYW5jZWxfYXN5bmMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQordm9pZCBwczNfdnVhcnRfY2FuY2VsX2FzeW5jKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlkZXYtPnByaXYtPndvcmsudHJpZ2dlciA9IDA7CisJdG9fcG9ydF9wcml2KGRldiktPnJ4X2xpc3Qud29yay50cmlnZ2VyID0gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9jYW5jZWxfYXN5bmMpOwogCiAvKioKICAqIHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3R4IC0gdGhpcmQgc3RhZ2UgdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIKQEAgLTYwNiwxOCArNzMyLDE5IEBACiAgKiBhZGp1c3RzIHRoZSBmaW5hbCBsaXN0IGJ1ZmZlciBzdGF0ZSBmb3IgYSBwYXJ0aWFsIHdyaXRlLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF90eChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGIsICpuOwogCXVuc2lnbmVkIGxvbmcgYnl0ZXNfdG90YWwgPSAwOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGIsIG4sICZkZXYtPnByaXYtPnR4X2xpc3QuaGVhZCwgbGluaykgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYiwgbiwgJnByaXYtPnR4X2xpc3QuaGVhZCwgbGluaykgewogCiAJCXVuc2lnbmVkIGxvbmcgYnl0ZXNfd3JpdHRlbjsKIApAQCAtNjUxLDcgKzc3OCw3IEBACiAKIAlwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfdHgoZGV2KTsKIHBvcnRfZnVsbDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOwogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkIHdyb3RlICVseGggYnl0ZXMgdG90YWxcbiIsCiAJCV9fZnVuY19fLCBfX0xJTkVfXywgYnl0ZXNfdG90YWwpOwogCXJldHVybiByZXN1bHQ7CkBAIC02NjUsNjAgKzc5MiwzNyBAQAogICogYnVmZmVyIGxpc3QuICBCdWZmZXIgbGlzdCBkYXRhIGlzIGRlcXVldWVkIHZpYSBwczNfdnVhcnRfcmVhZC4KICAqLwogCi1zdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfcngoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGRiZ19udW1iZXI7Ci0JaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfYnVmZmVyICpsYjsKLQl1bnNpZ25lZCBsb25nIGJ5dGVzOworCXU2NCBieXRlczsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JcmVzdWx0ID0gcHMzX3Z1YXJ0X2dldF9yeF9ieXRlc193YWl0aW5nKGRldiwgJmJ5dGVzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJcmVzdWx0ID0gcHMzX3Z1YXJ0X3F1ZXVlX3J4X2J5dGVzKGRldiwgJmJ5dGVzKTsKIAotCWlmIChyZXN1bHQpCi0JCXJldHVybiAtRUlPOwotCi0JQlVHX09OKCFieXRlcyk7Ci0KLQkvKiBBZGQgc29tZSBleHRyYSBzcGFjZSBmb3IgcmVjZW50bHkgYXJyaXZlZCBkYXRhLiAqLwotCi0JYnl0ZXMgKz0gMTI4OwotCi0JbGIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdF9idWZmZXIpICsgYnl0ZXMsIEdGUF9BVE9NSUMpOwotCi0JaWYgKCFsYikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwczNfdnVhcnRfcmF3X3JlYWQoZGV2LCBsYi0+ZGF0YSwgYnl0ZXMsICZieXRlcyk7Ci0KLQlsYi0+aGVhZCA9IGxiLT5kYXRhOwotCWxiLT50YWlsID0gbGItPmRhdGEgKyBieXRlczsKLQlsYi0+ZGJnX251bWJlciA9ICsrZGJnX251bWJlcjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmxiLT5saW5rLCAmZGV2LT5wcml2LT5yeF9saXN0LmhlYWQpOwotCWRldi0+cHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkICs9IGJ5dGVzOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogYnVmXyVsdTogcXVldWVkICVseGggYnl0ZXNcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgbGItPmRiZ19udW1iZXIsIGJ5dGVzKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnByaXYtPndvcmsubG9jaywgZmxhZ3MpOwotCWlmKGRldi0+cHJpdi0+d29yay50cmlnZ2VyCi0JCSYmIGRldi0+cHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkID49IGRldi0+cHJpdi0+d29yay50cmlnZ2VyKSB7Ci0JCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzY2hlZHVsZV93b3JrICVseGggYnl0ZXNcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+cHJpdi0+d29yay50cmlnZ2VyKTsKLQkJZGV2LT5wcml2LT53b3JrLnRyaWdnZXIgPSAwOwotCQlzY2hlZHVsZV93b3JrKCZkZXYtPnByaXYtPndvcmsud29yayk7CisJaWYgKHJlc3VsdCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT53b3JrLmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKKworCWlmIChwcml2LT5yeF9saXN0LndvcmsudHJpZ2dlciAmJiBwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQKKwkJPj0gcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHNjaGVkdWxlX3dvcmsgJWx4aCBieXRlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIpOworCQlwcml2LT5yeF9saXN0LndvcmsudHJpZ2dlciA9IDA7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X2xpc3Qud29yay53b3JrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3QoCi0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlCVUdfT04oIm5vIHN1cHBvcnQiKTsKQEAgLTczMyw5ICs4MzcsMTAgQEAKICAqIHN0YWdlIGhhbmRsZXIgYWZ0ZXIgb25lIGl0ZXJhdGlvbi4KICAqLwogCi1zdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfcG9ydF9pbnRlcnJ1cHQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX3BvcnRfaW50ZXJydXB0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CiAKIAlyZXN1bHQgPSBwczNfdnVhcnRfZ2V0X2ludGVycnVwdF9zdGF0dXMoZGV2LCAmc3RhdHVzKTsKQEAgLTc0NywyMSArODUyLDIxIEBACiAJCXN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzICYgSU5URVJSVVBUX01BU0tfRElTQ09OTkVDVCkgewotCQlkZXYtPnByaXYtPnN0YXRzLmRpc2Nvbm5lY3RfaW50ZXJydXB0cysrOworCQlwcml2LT5zdGF0cy5kaXNjb25uZWN0X2ludGVycnVwdHMrKzsKIAkJcmVzdWx0ID0gcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChkZXYpOwogCQlpZiAocmVzdWx0KQogCQkJcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3QoZGV2KTsKIAl9CiAKIAlpZiAoc3RhdHVzICYgSU5URVJSVVBUX01BU0tfVFgpIHsKLQkJZGV2LT5wcml2LT5zdGF0cy50eF9pbnRlcnJ1cHRzKys7CisJCXByaXYtPnN0YXRzLnR4X2ludGVycnVwdHMrKzsKIAkJcmVzdWx0ID0gcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfdHgoZGV2KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF90eChkZXYpOwogCX0KIAogCWlmIChzdGF0dXMgJiBJTlRFUlJVUFRfTUFTS19SWCkgewotCQlkZXYtPnByaXYtPnN0YXRzLnJ4X2ludGVycnVwdHMrKzsKKwkJcHJpdi0+c3RhdHMucnhfaW50ZXJydXB0cysrOwogCQlyZXN1bHQgPSBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF9yeChkZXYpOwogCQlpZiAocmVzdWx0KQogCQkJcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3J4KGRldik7CkBAIC03NzEsMTEgKzg3NiwxMSBAQAogfQogCiBzdHJ1Y3QgdnVhcnRfYnVzX3ByaXYgewotCWNvbnN0IHN0cnVjdCBwb3J0c19ibXAgYm1wOworCXN0cnVjdCBwb3J0c19ibXAgKmJtcDsKIAl1bnNpZ25lZCBpbnQgdmlycTsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHByb2JlX211dGV4OwogCWludCB1c2VfY291bnQ7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2aWNlc1tQT1JUX0NPVU5UXTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXZpY2VzW1BPUlRfQ09VTlRdOwogfSBzdGF0aWMgdnVhcnRfYnVzX3ByaXY7CiAKIC8qKgpAQCAtNzg4LDE3ICs4OTMsMTYgQEAKIAogc3RhdGljIGlycXJldHVybl90IHBzM192dWFydF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfcHJpdmF0ZSkKIHsKLQlzdHJ1Y3QgdnVhcnRfYnVzX3ByaXYgKmJ1c19wcml2OworCXN0cnVjdCB2dWFydF9idXNfcHJpdiAqYnVzX3ByaXYgPSBfcHJpdmF0ZTsKIAotCUJVR19PTighX3ByaXZhdGUpOwotCWJ1c19wcml2ID0gKHN0cnVjdCB2dWFydF9idXNfcHJpdiAqKV9wcml2YXRlOworCUJVR19PTighYnVzX3ByaXYpOwogCiAJd2hpbGUgKDEpIHsKIAkJdW5zaWduZWQgaW50IHBvcnQ7CiAKLQkJZHVtcF9wb3J0c19ibXAoJmJ1c19wcml2LT5ibXApOworCQlkdW1wX3BvcnRzX2JtcChidXNfcHJpdi0+Ym1wKTsKIAotCQlwb3J0ID0gKEJJVFNfUEVSX0xPTkcgLSAxKSAtIF9faWxvZzIoYnVzX3ByaXYtPmJtcC5zdGF0dXMpOworCQlwb3J0ID0gKEJJVFNfUEVSX0xPTkcgLSAxKSAtIF9faWxvZzIoYnVzX3ByaXYtPmJtcC0+c3RhdHVzKTsKIAogCQlpZiAocG9ydCA9PSBCSVRTX1BFUl9MT05HKQogCQkJYnJlYWs7CkBAIC04MTIsMTAwICs5MTYsMTQ0IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IHBzM192dWFydF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2J1c19pbnRlcnJ1cHRfZ2V0KHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPSB0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rydik7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gdG9fcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlKF9kZXYpOwogCi0JcmVzdWx0ID0gZGV2LT5tYXRjaF9pZCA9PSBkcnYtPm1hdGNoX2lkOworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKLQlkZXZfaW5mbygmZGV2LT5jb3JlLCAiJXM6JWQ6IGRldj0ldSglcyksIGRydj0ldSglcyk6ICVzXG4iLCBfX2Z1bmNfXywKLQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQsIGRldi0+Y29yZS5idXNfaWQsIGRydi0+bWF0Y2hfaWQsCi0JCWRydi0+Y29yZS5uYW1lLCAocmVzdWx0ID8gIm1hdGNoIiA6ICJtaXNzIikpOworCXZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudCsrOwogCisJQlVHX09OKHZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudCA+IDIpOworCisJaWYgKHZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudCAhPSAxKSB7CisJCXJldHVybiAwOworCX0KKworCUJVR19PTih2dWFydF9idXNfcHJpdi5ibXApOworCisJdnVhcnRfYnVzX3ByaXYuYm1wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBvcnRzX2JtcCksIEdGUF9LRVJORUwpOworCisJaWYgKCF2dWFydF9idXNfcHJpdi5ibXApIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBremFsbG9jIGZhaWxlZC5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9ibXBfbWFsbG9jOworCX0KKworCXJlc3VsdCA9IHBzM192dWFydF9pcnFfc2V0dXAoUFMzX0JJTkRJTkdfQ1BVX0FOWSwgdnVhcnRfYnVzX3ByaXYuYm1wLAorCQkmdnVhcnRfYnVzX3ByaXYudmlycSk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogcHMzX3Z1YXJ0X2lycV9zZXR1cCBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmVzdWx0ID0gLUVQRVJNOworCQlnb3RvIGZhaWxfYWxsb2NfaXJxOworCX0KKworCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHZ1YXJ0X2J1c19wcml2LnZpcnEsIHBzM192dWFydF9pcnFfaGFuZGxlciwKKwkJSVJRRl9ESVNBQkxFRCwgInZ1YXJ0IiwgJnZ1YXJ0X2J1c19wcml2KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiByZXF1ZXN0X2lycSBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJZ290byBmYWlsX3JlcXVlc3RfaXJxOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWQ6IG9rXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7CisKK2ZhaWxfcmVxdWVzdF9pcnE6CisJcHMzX3Z1YXJ0X2lycV9kZXN0cm95KHZ1YXJ0X2J1c19wcml2LnZpcnEpOworCXZ1YXJ0X2J1c19wcml2LnZpcnEgPSBOT19JUlE7CitmYWlsX2FsbG9jX2lycToKKwlrZnJlZSh2dWFydF9idXNfcHJpdi5ibXApOworCXZ1YXJ0X2J1c19wcml2LmJtcCA9IE5VTEw7CitmYWlsX2JtcF9tYWxsb2M6CisJdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50LS07CisJcHJfZGVidWcoIiA8LSAlczolZDogZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCitzdGF0aWMgaW50IHBzM192dWFydF9idXNfaW50ZXJydXB0X3B1dCh2b2lkKQoreworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwl2dWFydF9idXNfcHJpdi51c2VfY291bnQtLTsKKworCUJVR19PTih2dWFydF9idXNfcHJpdi51c2VfY291bnQgPCAwKTsKKworCWlmICh2dWFydF9idXNfcHJpdi51c2VfY291bnQgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlmcmVlX2lycSh2dWFydF9idXNfcHJpdi52aXJxLCAmdnVhcnRfYnVzX3ByaXYpOworCisJcHMzX3Z1YXJ0X2lycV9kZXN0cm95KHZ1YXJ0X2J1c19wcml2LnZpcnEpOworCXZ1YXJ0X2J1c19wcml2LnZpcnEgPSBOT19JUlE7CisKKwlrZnJlZSh2dWFydF9idXNfcHJpdi5ibXApOworCXZ1YXJ0X2J1c19wcml2LmJtcCA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzM192dWFydF9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gdG9fcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlKF9kZXYpOwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKmRydiA9Ci0JCXRvX3BzM192dWFydF9wb3J0X2RyaXZlcihfZGV2LT5kcml2ZXIpOworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKmRydjsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IE5VTEw7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAorCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b192dWFydF9kcnYoZGV2KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWRydi0+Y29yZS5jb3JlLm5hbWUpOworCiAJQlVHX09OKCFkcnYpOwogCisJaWYgKGRldi0+cG9ydF9udW1iZXIgPj0gUE9SVF9DT1VOVCkgeworCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJZG93bigmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOwogCi0JLyogU2V0dXAgdnVhcnRfYnVzX3ByaXYuZGV2aWNlc1tdLiAqLworCXJlc3VsdCA9IHBzM192dWFydF9idXNfaW50ZXJydXB0X2dldCgpOwogCi0JcmVzdWx0ID0gcHMzX3Z1YXJ0X21hdGNoX2lkX3RvX3BvcnQoZGV2LT5tYXRjaF9pZCwKLQkJJnBvcnRfbnVtYmVyKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfc2V0dXBfaW50ZXJydXB0OwogCi0JaWYgKHJlc3VsdCkgewotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogdW5rbm93biBtYXRjaF9pZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX21hdGNoOwotCX0KLQotCWlmICh2dWFydF9idXNfcHJpdi5kZXZpY2VzW3BvcnRfbnVtYmVyXSkgeworCWlmICh2dWFydF9idXNfcHJpdi5kZXZpY2VzW2Rldi0+cG9ydF9udW1iZXJdKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBwb3J0IGJ1c3kgKCVkKVxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgcG9ydF9udW1iZXIpOworCQkJX19MSU5FX18sIGRldi0+cG9ydF9udW1iZXIpOwogCQlyZXN1bHQgPSAtRUJVU1k7Ci0JCWdvdG8gZmFpbF9tYXRjaDsKKwkJZ290byBmYWlsX2J1c3k7CiAJfQogCi0JdnVhcnRfYnVzX3ByaXYuZGV2aWNlc1twb3J0X251bWJlcl0gPSBkZXY7CisJdnVhcnRfYnVzX3ByaXYuZGV2aWNlc1tkZXYtPnBvcnRfbnVtYmVyXSA9IGRldjsKIAotCS8qIFNldHVwIGRldi0+cHJpdi4gKi8KKwkvKiBTZXR1cCBkZXYtPmRyaXZlcl9wcml2LiAqLwogCi0JZGV2LT5wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYtPmRyaXZlcl9wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYpLAorCQlHRlBfS0VSTkVMKTsKIAotCWlmICghZGV2LT5wcml2KSB7CisJaWYgKCFkZXYtPmRyaXZlcl9wcml2KSB7CiAJCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9hbGxvYzsKKwkJZ290byBmYWlsX2Rldl9tYWxsb2M7CiAJfQogCi0JZGV2LT5wcml2LT5wb3J0X251bWJlciA9IHBvcnRfbnVtYmVyOworCXByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAotCUlOSVRfTElTVF9IRUFEKCZkZXYtPnByaXYtPnR4X2xpc3QuaGVhZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dHhfbGlzdC5oZWFkKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dHhfbGlzdC5sb2NrKTsKIAotCUlOSVRfTElTVF9IRUFEKCZkZXYtPnByaXYtPnJ4X2xpc3QuaGVhZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+cHJpdi0+cnhfbGlzdC5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+cnhfbGlzdC5oZWFkKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cnhfbGlzdC5sb2NrKTsKIAotCUlOSVRfV09SSygmZGV2LT5wcml2LT53b3JrLndvcmssIE5VTEwpOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPnByaXYtPndvcmsubG9jayk7Ci0JZGV2LT5wcml2LT53b3JrLnRyaWdnZXIgPSAwOwotCWRldi0+cHJpdi0+d29yay5kZXYgPSBkZXY7Ci0KLQlpZiAoKyt2dWFydF9idXNfcHJpdi51c2VfY291bnQgPT0gMSkgewotCi0JCXJlc3VsdCA9IHBzM192dWFydF9pcnFfc2V0dXAoUFMzX0JJTkRJTkdfQ1BVX0FOWSwKLQkJCSh2b2lkKikmdnVhcnRfYnVzX3ByaXYuYm1wLnN0YXR1cywgJnZ1YXJ0X2J1c19wcml2LnZpcnEpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCWRldl9kYmcoJmRldi0+Y29yZSwKLQkJCQkiJXM6JWQ6IHBzM192dWFydF9pcnFfc2V0dXAgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotCQkJcmVzdWx0ID0gLUVQRVJNOwotCQkJZ290byBmYWlsX2FsbG9jX2lycTsKLQkJfQotCi0JCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHZ1YXJ0X2J1c19wcml2LnZpcnEsIHBzM192dWFydF9pcnFfaGFuZGxlciwKLQkJCUlSUUZfRElTQUJMRUQsICJ2dWFydCIsICZ2dWFydF9idXNfcHJpdik7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJZGV2X2luZm8oJmRldi0+Y29yZSwgIiVzOiVkOiByZXF1ZXN0X2lycSBmYWlsZWQgKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7Ci0JCQlnb3RvIGZhaWxfcmVxdWVzdF9pcnE7Ci0JCX0KLQl9CisJSU5JVF9XT1JLKCZwcml2LT5yeF9saXN0Lndvcmsud29yaywgTlVMTCk7CisJcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIgPSAwOworCXByaXYtPnJ4X2xpc3Qud29yay5kZXYgPSBkZXY7CiAKIAkvKiBjbGVhciBzdGFsZSBwZW5kaW5nIGludGVycnVwdHMgKi8KIApAQCAtOTM2LDE1MiArMTA4NCwxNjAgQEAKIAogZmFpbF9wcm9iZToKIAlwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgMCk7Ci1mYWlsX3JlcXVlc3RfaXJxOgotCXBzM192dWFydF9pcnFfZGVzdHJveSh2dWFydF9idXNfcHJpdi52aXJxKTsKLQl2dWFydF9idXNfcHJpdi52aXJxID0gTk9fSVJROwotZmFpbF9hbGxvY19pcnE6Ci0JLS12dWFydF9idXNfcHJpdi51c2VfY291bnQ7Ci0Ja2ZyZWUoZGV2LT5wcml2KTsKLQlkZXYtPnByaXYgPSBOVUxMOwotZmFpbF9hbGxvYzoKLQl2dWFydF9idXNfcHJpdi5kZXZpY2VzW3BvcnRfbnVtYmVyXSA9IE5VTEw7Ci1mYWlsX21hdGNoOgorCWtmcmVlKGRldi0+ZHJpdmVyX3ByaXYpOworCWRldi0+ZHJpdmVyX3ByaXYgPSBOVUxMOworZmFpbF9kZXZfbWFsbG9jOgorCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbZGV2LT5wb3J0X251bWJlcl0gPSBOVUxMOworZmFpbF9idXN5OgorCXBzM192dWFydF9idXNfaW50ZXJydXB0X3B1dCgpOworZmFpbF9zZXR1cF9pbnRlcnJ1cHQ6CiAJdXAoJnZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4KTsKLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IHBzM192dWFydF9yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKKy8qKgorICogcHMzX3Z1YXJ0X2NsZWFudXAgLSBjb21tb24gY2xlYW51cCBoZWxwZXIuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KKyAqCisgKiBDbGVhbnMgaW50ZXJydXB0cyBhbmQgSFYgcmVzb3VyY2VzLiAgTXVzdCBiZSBjYWxsZWQgd2l0aAorICogdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXggaGVsZC4gIFVzZWQgYnkgcHMzX3Z1YXJ0X3JlbW92ZSBhbmQKKyAqIHBzM192dWFydF9zaHV0ZG93bi4gIEFmdGVyIHRoaXMgY2FsbCwgcG9sbGVkIHJlYWRpbmcgd2lsbCBzdGlsbCB3b3JrLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2NsZWFudXAoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPQotCQl0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXBzM192dWFydF9jYW5jZWxfYXN5bmMoZGV2KTsKKwlwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgMCk7CisJcHMzX3Z1YXJ0X2J1c19pbnRlcnJ1cHRfcHV0KCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X3JlbW92ZSAtIENvbXBsZXRlbHkgY2xlYW4gdGhlIGRldmljZSBpbnN0YW5jZS4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIENsZWFucyBhbGwgbWVtb3J5LCBpbnRlcnJ1cHRzIGFuZCBIViByZXNvdXJjZXMuICBBZnRlciB0aGlzIGNhbGwgdGhlCisgKiBkZXZpY2UgY2FuIG5vIGxvbmdlciBiZSB1c2VkLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3JlbW92ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnY7CisKKwlCVUdfT04oIWRldik7CiAKIAlkb3duKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CiAKLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJZGV2LT5jb3JlLmJ1c19pZCk7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIC0+ICVzOiVkOiBtYXRjaF9pZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKIAotCUJVR19PTih2dWFydF9idXNfcHJpdi51c2VfY291bnQgPCAxKTsKLQotCWlmIChkcnYtPnJlbW92ZSkKLQkJZHJ2LT5yZW1vdmUoZGV2KTsKLQllbHNlCi0JCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlcyBubyByZW1vdmUgbWV0aG9kXG4iLCBfX2Z1bmNfXywKLQkJCV9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKLQotCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbZGV2LT5wcml2LT5wb3J0X251bWJlcl0gPSBOVUxMOwotCi0JaWYgKC0tdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50ID09IDApIHsKLQkJQlVHKCk7Ci0JCWZyZWVfaXJxKHZ1YXJ0X2J1c19wcml2LnZpcnEsICZ2dWFydF9idXNfcHJpdik7Ci0JCXBzM192dWFydF9pcnFfZGVzdHJveSh2dWFydF9idXNfcHJpdi52aXJxKTsKLQkJdnVhcnRfYnVzX3ByaXYudmlycSA9IE5PX0lSUTsKKwlpZiAoIWRldi0+Y29yZS5kcml2ZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIGRyaXZlciBib3VuZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXVwKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CisJCXJldHVybiAwOwogCX0KIAotCWtmcmVlKGRldi0+cHJpdik7Ci0JZGV2LT5wcml2ID0gTlVMTDsKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fdnVhcnRfZHJ2KGRldik7CisKKwlCVUdfT04oIWRydik7CisKKwlpZiAoZHJ2LT5yZW1vdmUpIHsKKwkJZHJ2LT5yZW1vdmUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbm8gcmVtb3ZlIG1ldGhvZFxuIiwgX19mdW5jX18sCisJCV9fTElORV9fKTsKKwkJQlVHKCk7CisJfQorCisJcHMzX3Z1YXJ0X2NsZWFudXAoZGV2KTsKKworCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbZGV2LT5wb3J0X251bWJlcl0gPSBOVUxMOworCWtmcmVlKHByaXYpOworCXByaXYgPSBOVUxMOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXVwKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X3NodXRkb3duIC0gQ2xlYW5zIGludGVycnVwdHMgYW5kIEhWIHJlc291cmNlcy4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIENsZWFucyBpbnRlcnJ1cHRzIGFuZCBIViByZXNvdXJjZXMuICBBZnRlciB0aGlzIGNhbGwgdGhlCisgKiBkZXZpY2UgY2FuIHN0aWxsIGJlIHVzZWQgaW4gcG9sbGluZyBtb2RlLiAgVGhpcyBiZWhhdmlvciByZXF1aXJlZAorICogYnkgc3lzLW1hbmFnZXIgdG8gYmUgYWJsZSB0byBjb21wbGV0ZSB0aGUgZGV2aWNlIHBvd2VyIG9wZXJhdGlvbgorICogc2VxdWVuY2UuCisgKi8KKworc3RhdGljIGludCBwczNfdnVhcnRfc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKmRydjsKKworCUJVR19PTighZGV2KTsKKworCWRvd24oJnZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZDogbWF0Y2hfaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CisKKwlpZiAoIWRldi0+Y29yZS5kcml2ZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIGRyaXZlciBib3VuZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXVwKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b192dWFydF9kcnYoZGV2KTsKKworCUJVR19PTighZHJ2KTsKKworCWlmIChkcnYtPnNodXRkb3duKQorCQlkcnYtPnNodXRkb3duKGRldik7CisJZWxzZSBpZiAoZHJ2LT5yZW1vdmUpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIHNodXRkb3duLCBjYWxsaW5nIHJlbW92ZVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWRydi0+cmVtb3ZlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIHNodXRkb3duIG1ldGhvZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCUJVRygpOworCX0KKworCXBzM192dWFydF9jbGVhbnVwKGRldik7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAl1cCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwczNfdnVhcnRfc2h1dGRvd24oc3RydWN0IGRldmljZSAqX2RldikKK3N0YXRpYyBpbnQgX19pbml0IHBzM192dWFydF9idXNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPQotCQl0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKLQotCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlkZXYtPmNvcmUuYnVzX2lkKTsKLQotCWlmIChkcnYtPnNodXRkb3duKQotCQlkcnYtPnNodXRkb3duKGRldik7Ci0JZWxzZQotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXMgbm8gc2h1dGRvd24gbWV0aG9kXG4iLCBfX2Z1bmNfXywKLQkJCV9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKLX0KLQotLyoqCi0gKiBwczNfdnVhcnRfYnVzIC0gVGhlIHZ1YXJ0IGJ1cyBpbnN0YW5jZS4KLSAqCi0gKiBUaGUgdnVhcnQgaXMgbWFuYWdlZCBhcyBhIGJ1cyB0aGF0IHBvcnQgZGV2aWNlcyBjb25uZWN0IHRvLgotICovCi0KLXN0cnVjdCBidXNfdHlwZSBwczNfdnVhcnRfYnVzID0gewotICAgICAgICAubmFtZSA9ICJwczNfdnVhcnQiLAotCS5tYXRjaCA9IHBzM192dWFydF9tYXRjaCwKLQkucHJvYmUgPSBwczNfdnVhcnRfcHJvYmUsCi0JLnJlbW92ZSA9IHBzM192dWFydF9yZW1vdmUsCi0JLnNodXRkb3duID0gcHMzX3Z1YXJ0X3NodXRkb3duLAotfTsKLQotaW50IF9faW5pdCBwczNfdnVhcnRfYnVzX2luaXQodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCiAJcHJfZGVidWcoIiVzOiVkOlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAogCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpbml0X01VVEVYKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7Ci0JcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZwczNfdnVhcnRfYnVzKTsKLQlCVUdfT04ocmVzdWx0KTsKIAotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19leGl0IHBzM192dWFydF9idXNfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHBzM192dWFydF9idXNfZXhpdCh2b2lkKQogewogCXByX2RlYnVnKCIlczolZDpcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JYnVzX3VucmVnaXN0ZXIoJnBzM192dWFydF9idXMpOwogfQogCiBjb3JlX2luaXRjYWxsKHBzM192dWFydF9idXNfaW5pdCk7CiBtb2R1bGVfZXhpdChwczNfdnVhcnRfYnVzX2V4aXQpOwogCiAvKioKLSAqIHBzM192dWFydF9wb3J0X3JlbGVhc2VfZGV2aWNlIC0gUmVtb3ZlIGEgdnVhcnQgcG9ydCBkZXZpY2UuCi0gKi8KLQotc3RhdGljIHZvaWQgcHMzX3Z1YXJ0X3BvcnRfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqX2RldikKLXsKLSNpZiBkZWZpbmVkKERFQlVHKQotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKLQotCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JQlVHX09OKGRldi0+cHJpdiAmJiAiZm9yZ290IHRvIGZyZWUiKTsKLQltZW1zZXQoJmRldi0+Y29yZSwgMCwgc2l6ZW9mKGRldi0+Y29yZSkpOwotI2VuZGlmCi19Ci0KLS8qKgotICogcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyIC0gQWRkIGEgdnVhcnQgcG9ydCBkZXZpY2UuCi0gKi8KLQotaW50IHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBkZXZfY291bnQgPSAxOwotCi0JQlVHX09OKGRldi0+cHJpdiAmJiAiZm9yZ290IHRvIGZyZWUiKTsKLQotCWRldi0+Y29yZS5wYXJlbnQgPSBOVUxMOwotCWRldi0+Y29yZS5idXMgPSAmcHMzX3Z1YXJ0X2J1czsKLQlkZXYtPmNvcmUucmVsZWFzZSA9IHBzM192dWFydF9wb3J0X3JlbGVhc2VfZGV2aWNlOwotCi0Jc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLCAidnVhcnRfJTAyeCIsCi0JCWRldl9jb3VudCsrKTsKLQotCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JcmV0dXJuIGRldmljZV9yZWdpc3RlcigmZGV2LT5jb3JlKTsKLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyKTsKLQotLyoqCiAgKiBwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIgLSBBZGQgYSB2dWFydCBwb3J0IGRldmljZSBkcml2ZXIuCiAgKi8KIApAQCAtMTA4OSwxMiArMTI0NSwxOCBAQAogewogCWludCByZXN1bHQ7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6ICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwotCWRydi0+Y29yZS5idXMgPSAmcHMzX3Z1YXJ0X2J1czsKLQlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5jb3JlLm5hbWUpOworCisJQlVHX09OKCFkcnYtPmNvcmUubWF0Y2hfaWQpOworCUJVR19PTighZHJ2LT5jb3JlLmNvcmUubmFtZSk7CisKKwlkcnYtPmNvcmUucHJvYmUgPSBwczNfdnVhcnRfcHJvYmU7CisJZHJ2LT5jb3JlLnJlbW92ZSA9IHBzM192dWFydF9yZW1vdmU7CisJZHJ2LT5jb3JlLnNodXRkb3duID0gcHMzX3Z1YXJ0X3NodXRkb3duOworCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmNvcmUpOwogCXJldHVybiByZXN1bHQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9wb3J0X2RyaXZlcl9yZWdpc3Rlcik7CiAKIC8qKgpAQCAtMTEwMyw4ICsxMjY1LDcgQEAKIAogdm9pZCBwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYpCiB7Ci0JcHJfZGVidWcoIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKLQlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5jb3JlKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6ICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLmNvcmUubmFtZSk7CisJcHMzX3N5c3RlbV9idXNfZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9wb3J0X2RyaXZlcl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmggYi9kcml2ZXJzL3BzMy92dWFydC5oCmluZGV4IDFiZTk5MmQuLmViN2Y2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmgKKysrIGIvZHJpdmVycy9wczMvdnVhcnQuaApAQCAtMzQsMjkgKzM0LDcgQEAKIHN0cnVjdCBwczNfdnVhcnRfd29yayB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJdW5zaWduZWQgbG9uZyB0cmlnZ2VyOwotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlKiBkZXY7IC8qIHRvIGNvbnZlcnQgd29yayB0byBkZXZpY2UgKi8KLX07Ci0KLS8qKgotICogc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgLSBwcml2YXRlIHZ1YXJ0IGRldmljZSBkYXRhLgotICovCi0KLXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2IHsKLQl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7Ci0JdTY0IGludGVycnVwdF9tYXNrOwotCi0Jc3RydWN0IHsKLQkJc3BpbmxvY2tfdCBsb2NrOwotCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Ci0JfSB0eF9saXN0OwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGxvbmcgYnl0ZXNfaGVsZDsKLQkJc3BpbmxvY2tfdCBsb2NrOwotCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Ci0JfSByeF9saXN0OwotCXN0cnVjdCBwczNfdnVhcnRfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IHBzM192dWFydF93b3JrIHdvcms7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2OyAvKiB0byBjb252ZXJ0IHdvcmsgdG8gZGV2aWNlICovCiB9OwogCiAvKioKQEAgLTY0LDMyICs0MiwzMCBAQAogICovCiAKIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgewotCWVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkOwotCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGNvcmU7Ci0JaW50ICgqcHJvYmUpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKik7Ci0JaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICopOwotCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqKTsKLQlpbnQgKCp0eF9ldmVudCkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLQlpbnQgKCpyeF9ldmVudCkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLQlpbnQgKCpkaXNjb25uZWN0X2V2ZW50KShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpOwotCS8qIGludCAoKnN1c3BlbmQpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKiwgcG1fbWVzc2FnZV90KTsgKi8KLQkvKiBpbnQgKCpyZXN1bWUpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKik7ICovCisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciBjb3JlOworCWludCAoKnByb2JlKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOworCWludCAoKnJlbW92ZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisJdm9pZCAoKndvcmspKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisJLyogaW50ICgqdHhfZXZlbnQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7ICovCisJLyogaW50ICgqcnhfZXZlbnQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7ICovCisJLyogaW50ICgqZGlzY29ubmVjdF9ldmVudCkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsgKi8KKwkvKiBpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICosIHBtX21lc3NhZ2VfdCk7ICovCisJLyogaW50ICgqcmVzdW1lKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOyAqLwogfTsKIAogaW50IHBzM192dWFydF9wb3J0X2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYpOwogdm9pZCBwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKnRvX3BzM192dWFydF9wb3J0X2RyaXZlcigKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqCisJcHMzX3N5c3RlbV9idXNfZGV2X3RvX3Z1YXJ0X2RydihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpfZGV2KQogewotCXJldHVybiBjb250YWluZXJfb2YoX2Rydiwgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciwgY29yZSk7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqc2JkID0KKwkJcHMzX3N5c3RlbV9idXNfZGV2X3RvX3N5c3RlbV9idXNfZHJ2KF9kZXYpOworCUJVR19PTighc2JkKTsKKwlyZXR1cm4gY29udGFpbmVyX29mKHNiZCwgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciwgY29yZSk7CiB9Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKnRvX3BzM192dWFydF9wb3J0X2RldmljZSgKLQlzdHJ1Y3QgZGV2aWNlICpfZGV2KQotewotCXJldHVybiBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSwgY29yZSk7Ci19Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKnBzM192dWFydF93b3JrX3RvX3BvcnRfZGV2aWNlKAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpwczNfdnVhcnRfd29ya190b19zeXN0ZW1fYnVzX2RldigKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl93b3JrKQogewogCXN0cnVjdCBwczNfdnVhcnRfd29yayAqdncgPSBjb250YWluZXJfb2YoX3dvcmssIHN0cnVjdCBwczNfdnVhcnRfd29yaywKQEAgLTk3LDE0ICs3MywxMyBAQAogCXJldHVybiB2dy0+ZGV2OwogfQogCi1pbnQgcHMzX3Z1YXJ0X3dyaXRlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgY29uc3Qgdm9pZCogYnVmLAoraW50IHBzM192dWFydF93cml0ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKmJ1ZiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMpOwotaW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCogYnVmLAoraW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAogCXVuc2lnbmVkIGludCBieXRlcyk7Ci1pbnQgcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB3b3JrX2Z1bmNfdCBmdW5jLAotCXVuc2lnbmVkIGludCBieXRlcyk7Ci12b2lkIHBzM192dWFydF9jYW5jZWxfYXN5bmMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLXZvaWQgcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK2ludCBwczNfdnVhcnRfcmVhZF9hc3luYyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBieXRlcyk7Cit2b2lkIHBzM192dWFydF9jYW5jZWxfYXN5bmMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsKK3ZvaWQgcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IDRlNGMxMGEuLmNlYTQwMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtMTAsNyArMTAsNiBAQAogCiBjb25maWcgUlRDX0NMQVNTCiAJdHJpc3RhdGUgIlJUQyBjbGFzcyIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCXNlbGVjdCBSVENfTElCCiAJaGVscApAQCAtMTE5LDcgKzExOCw3IEBACiAJICB3aWxsIGJlIGNhbGxlZCBydGMtdGVzdC4KIAogY29tbWVudCAiSTJDIFJUQyBkcml2ZXJzIgotCWRlcGVuZHMgb24gUlRDX0NMQVNTCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCiAKIGNvbmZpZyBSVENfRFJWX0RTMTMwNwogCXRyaXN0YXRlICJEYWxsYXMvTWF4aW0gRFMxMzA3LzM3LzM4LzM5LzQwLCBTVCBNNDFUMDAiCkBAIC0xNjAsMTEgKzE1OSwxMSBAQAogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW1heDY5MDAuCiAKIGNvbmZpZyBSVENfRFJWX1JTNUMzNzIKLQl0cmlzdGF0ZSAiUmljb2ggUlM1QzM3MkEvQiIKKwl0cmlzdGF0ZSAiUmljb2ggUlM1QzM3MkEvQiwgUlY1QzM4NiwgUlY1QzM4N0EiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQotCSAgUmljb2ggUlM1QzM3MkEgYW5kIFJTNUMzNzJCIFJUQyBjaGlwcy4KKwkgIFJpY29oIFJTNUMzNzJBLCBSUzVDMzcyQiwgUlY1QzM4NiwgYW5kIFJWNUMzODdBIFJUQyBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtcnM1YzM3Mi4KQEAgLTIxMywxMiArMjEyLDQwIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1wY2Y4NTgzLgogCitjb25maWcgUlRDX0RSVl9NNDFUODAKKwl0cmlzdGF0ZSAiU1QgTTQxVDgwIHNlcmllcyBSVEMiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgU1QgTTQxVDgwIFJUQyBjaGlwcyBzZXJpZXMuIEN1cnJlbnRseSBmb2xsb3dpbmcgY2hpcHMgYXJlCisJICBzdXBwb3J0ZWQ6IE00MVQ4MCwgTTQxVDgxLCBNNDFUODIsIE00MVQ4MywgTTQxU1Q4NCwgTTQxU1Q4NQorCSAgYW5kIE00MVNUODcuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW00MXQ4MC4KKworY29uZmlnIFJUQ19EUlZfTTQxVDgwX1dEVAorCWJvb2wgIlNUIE00MVQ4MCBzZXJpZXMgUlRDIHdhdGNoZG9nIHRpbWVyIgorCWRlcGVuZHMgb24gUlRDX0RSVl9NNDFUODAKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICB3YXRjaGRvZyB0aW1lciBpbiBTVCBNNDFUODAgUlRDIGNoaXBzIHNlcmllcy4KKworY29uZmlnIFJUQ19EUlZfVFdMOTIzMzAKKwlib29sZWFuICJUSSBUV0w5MjMzMC9NZW5lbGF1cyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBJMkMgJiYgTUVORUxBVVMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBvbiB0aGUKKwkgIFRXTDkyMzMwICJNZW5lbGF1cyIgcG93ZXIgbWFuZ2VtZW50IGNoaXAsIHVzZWQgd2l0aCBPTUFQMgorCSAgcGxhdGZvcm1zLiAgVGhlIHN1cHBvcnQgaXMgaW50ZWdyYXRlZCB3aXRoIHRoZSByZXN0IG9mCisJICB0aGUgTWVuZWxhdXMgZHJpdmVyOyBpdCdzIG5vdCBzZXBhcmF0ZSBtb2R1bGUuCisKIGNvbW1lbnQgIlNQSSBSVEMgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFNQSV9NQVNURVIKIAogY29uZmlnIFJUQ19EUlZfUlM1QzM0OAogCXRyaXN0YXRlICJSaWNvaCBSUzVDMzQ4QS9CIgotCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFNQSQorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFNQSV9NQVNURVIKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCiAJICBSaWNvaCBSUzVDMzQ4QSBhbmQgUlM1QzM0OEIgUlRDIGNoaXBzLgpAQCAtMjI4LDcgKzI1NSw3IEBACiAKIGNvbmZpZyBSVENfRFJWX01BWDY5MDIKIAl0cmlzdGF0ZSAiTWF4aW0gNjkwMiIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUEkKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUElfTUFTVEVSCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCiAJICBNYXhpbSBNQVg2OTAyIFNQSSBSVEMgY2hpcC4KQEAgLTI0Niw3ICsyNzMsNyBAQAogY29uZmlnIFJUQ19EUlZfQ01PUwogCXRyaXN0YXRlICJQQy1zdHlsZSAnQ01PUyciCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgKFg4NiB8fCBBTFBIQSB8fCBBUk0yNiB8fCBBUk0gXAotCQl8fCBNMzJSIHx8IEFUQVJJIHx8IFBPV0VSUEMgfHwgTUlQUykKKwkJfHwgTTMyUiB8fCBBVEFSSSB8fCBQUEMgfHwgTUlQUykKIAloZWxwCiAJICBTYXkgInllcyIgaGVyZSB0byBnZXQgZGlyZWN0IHN1cHBvcnQgZm9yIHRoZSByZWFsIHRpbWUgY2xvY2sKIAkgIGZvdW5kIGluIGV2ZXJ5IFBDIG9yIEFDUEktYmFzZWQgc3lzdGVtLCBhbmQgc29tZSBvdGhlciBib2FyZHMuCkBAIC0yNjIsNiArMjg5LDEyIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1jbW9zLgogCitjb25maWcgUlRDX0RSVl9EUzEyMTYKKwl0cmlzdGF0ZSAiRGFsbGFzIERTMTIxNiIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTTklfUk0KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIERhbGxhcyBEUzEyMTYgUlRDIGNoaXBzLgorCiBjb25maWcgUlRDX0RSVl9EUzE1NTMKIAl0cmlzdGF0ZSAiRGFsbGFzIERTMTU1MyIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUwpAQCAtMjkyLDYgKzMyNSwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtbTQ4dDg2LgogCitjb25maWcgUlRDX0RSVl9NNDhUNTkKKwl0cmlzdGF0ZSAiU1QgTTQ4VDU5IgorCWRlcGVuZHMgb24gUlRDX0NMQVNTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgU1QgTTQ4VDU5IFJUQyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZSwgaWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkICJydGMtbTQ4dDU5Ii4KKwogY29uZmlnIFJUQ19EUlZfVjMwMjAKIAl0cmlzdGF0ZSAiRU0gTWljcm9lbGVjdHJvbmljIFYzMDIwIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTCkBAIC0zNzksNiArNDIyLDEzIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGMtcGwwMzEuCiAKK2NvbmZpZyBSVENfRFJWX0FUMzJBUDcwMFgKKwl0cmlzdGF0ZSAiQVQzMkFQNzAwWCBzZXJpZXMgUlRDIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFBMQVRGT1JNX0FUMzJBUAorCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIGludGVybmFsIFJUQyAoUmVhbHRpbWUgQ2xvY2spIG9uIEF0bWVsIEFWUjMyCisJICBBVDMyQVA3MDB4IGZhbWlseSBwcm9jZXNzb3JzLgorCiBjb25maWcgUlRDX0RSVl9BVDkxUk05MjAwCiAJdHJpc3RhdGUgIkFUOTFSTTkyMDAiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgQVJDSF9BVDkxUk05MjAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IGExYWZiYzIuLjMxMDlhZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9YMTIwNSkJKz0gcnRjLXgxMjA1Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0lTTDEyMDgpCSs9IHJ0Yy1pc2wxMjA4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1RFU1QpCSs9IHJ0Yy10ZXN0Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0FUMzJBUDcwMFgpCSs9IHJ0Yy1hdDMyYXA3MDB4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTMwNykJKz0gcnRjLWRzMTMwNy5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzE2NzIpCSs9IHJ0Yy1kczE2NzIubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNzQyKQkrPSBydGMtZHMxNzQyLm8KQEAgLTI4LDYgKzI5LDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX1JTNUMzNzIpCSs9IHJ0Yy1yczVjMzcyLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1MzQykJKz0gcnRjLXMzYy5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzQ4KQkrPSBydGMtcnM1YzM0OC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NNDFUODApCSs9IHJ0Yy1tNDF0ODAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQ4VDg2KQkrPSBydGMtbTQ4dDg2Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTU1MykJKz0gcnRjLWRzMTU1My5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzEzKQkrPSBydGMtcnM1YzMxMy5vCkBAIC00MSwzICs0Myw1IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9BVDkxUk05MjAwKSs9IHJ0Yy1hdDkxcm05MjAwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1NIKQkrPSBydGMtc2gubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQkZJTikJKz0gcnRjLWJmaW4ubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQ4VDU5KQkrPSBydGMtbTQ4dDU5Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTIxNikJKz0gcnRjLWRzMTIxNi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jIGIvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk5MjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIEFuIFJUQyBkcml2ZXIgZm9yIHRoZSBBVlIzMiBBVDMyQVA3MDB4IHByb2Nlc3NvciBzZXJpZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworLyoKKyAqIFRoaXMgaXMgYSBiYXJlLWJvbmVzIFJUQy4gSXQgcnVucyBkdXJpbmcgbW9zdCBzeXN0ZW0gc2xlZXAgc3RhdGVzLCBidXQgaGFzCisgKiBubyBiYXR0ZXJ5IGJhY2t1cCBhbmQgZ2V0cyByZXNldCBkdXJpbmcgc3lzdGVtIHJlc3RhcnQuICBJdCBtdXN0IGJlCisgKiBpbml0aWFsaXplZCBmcm9tIGFuIGV4dGVybmFsIGNsb2NrIChuZXR3b3JrLCBJMkMsIGV0YykgYmVmb3JlIGl0IGNhbiBiZSBvZgorICogbXVjaCB1c2UuCisgKgorICogVGhlIGFsYXJtIGZ1bmN0aW9uYWxpdHkgaXMgbGltaXRlZCBieSB0aGUgaGFyZHdhcmUsIG5vdCBzdXBwb3J0aW5nCisgKiBwZXJpb2RpYyBpbnRlcnJ1cHRzLgorICovCisKKyNkZWZpbmUgUlRDX0NUUkwJCTB4MDAKKyNkZWZpbmUgUlRDX0NUUkxfRU4JCSAgIDAKKyNkZWZpbmUgUlRDX0NUUkxfUENMUgkJICAgMQorI2RlZmluZSBSVENfQ1RSTF9UT1BFTgkJICAgMgorI2RlZmluZSBSVENfQ1RSTF9QU0VMCQkgICA4CisKKyNkZWZpbmUgUlRDX1ZBTAkJCTB4MDQKKworI2RlZmluZSBSVENfVE9QCQkJMHgwOAorCisjZGVmaW5lIFJUQ19JRVIJCQkweDEwCisjZGVmaW5lIFJUQ19JRVJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JRFIJCQkweDE0CisjZGVmaW5lIFJUQ19JRFJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JTVIJCQkweDE4CisjZGVmaW5lIFJUQ19JTVJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JU1IJCQkweDFjCisjZGVmaW5lIFJUQ19JU1JfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JQ1IJCQkweDIwCisjZGVmaW5lIFJUQ19JQ1JfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19CSVQobmFtZSkJCSgxIDw8IFJUQ18jI25hbWUpCisjZGVmaW5lIFJUQ19CRihuYW1lLCB2YWx1ZSkJKCh2YWx1ZSkgPDwgUlRDXyMjbmFtZSkKKworI2RlZmluZSBydGNfcmVhZGwoZGV2LCByZWcpCQkJCVwKKwlfX3Jhd19yZWFkbCgoZGV2KS0+cmVncyArIFJUQ18jI3JlZykKKyNkZWZpbmUgcnRjX3dyaXRlbChkZXYsIHJlZywgdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAoZGV2KS0+cmVncyArIFJUQ18jI3JlZykKKworc3RydWN0IHJ0Y19hdDMyYXA3MDB4IHsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJdW5zaWduZWQgbG9uZwkJYWxhcm1fdGltZTsKKwl1bnNpZ25lZCBsb25nCQlpcnE7CisJLyogUHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgcmVnaXN0ZXIgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QJCWxvY2s7Cit9OworCitzdGF0aWMgaW50IGF0MzJfcnRjX3JlYWR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgbm93OworCisJbm93ID0gcnRjX3JlYWRsKHJ0YywgVkFMKTsKKwlydGNfdGltZV90b190bShub3csIHRtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX3NldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBub3c7CisJaW50IHJldDsKKworCXJldCA9IHJ0Y190bV90b190aW1lKHRtLCAmbm93KTsKKwlpZiAocmV0ID09IDApCisJCXJ0Y193cml0ZWwocnRjLCBWQUwsIG5vdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX3JlYWRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlydGNfdGltZV90b190bShydGMtPmFsYXJtX3RpbWUsICZhbHJtLT50aW1lKTsKKwlhbHJtLT5wZW5kaW5nID0gcnRjX3JlYWRsKHJ0YywgSU1SKSAmIFJUQ19CSVQoSU1SX1RPUEkpID8gMSA6IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDMyX3J0Y19zZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBydGNfdW5peF90aW1lOworCXVuc2lnbmVkIGxvbmcgYWxhcm1fdW5peF90aW1lOworCWludCByZXQ7CisKKwlydGNfdW5peF90aW1lID0gcnRjX3JlYWRsKHJ0YywgVkFMKTsKKworCXJldCA9IHJ0Y190bV90b190aW1lKCZhbHJtLT50aW1lLCAmYWxhcm1fdW5peF90aW1lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFsYXJtX3VuaXhfdGltZSA8IHJ0Y191bml4X3RpbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKwlydGMtPmFsYXJtX3RpbWUgPSBhbGFybV91bml4X3RpbWU7CisJcnRjX3dyaXRlbChydGMsIFRPUCwgcnRjLT5hbGFybV90aW1lKTsKKwlpZiAoYWxybS0+cGVuZGluZykKKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJfCBSVENfQklUKENUUkxfVE9QRU4pKTsKKwllbHNlCisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCSYgflJUQ19CSVQoQ1RSTF9UT1BFTikpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXQzMl9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJ0Y19hdDMyYXA3MDB4ICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PTjoKKwkJaWYgKHJ0Y19yZWFkbChydGMsIFZBTCkgPiBydGMtPmFsYXJtX3RpbWUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgcnRjX3JlYWRsKHJ0YywgQ1RSTCkKKwkJCQl8IFJUQ19CSVQoQ1RSTF9UT1BFTikpOworCQlydGNfd3JpdGVsKHJ0YywgSUNSLCBSVENfQklUKElDUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJRVIsIFJUQ19CSVQoSUVSX1RPUEkpKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJJiB+UlRDX0JJVChDVFJMX1RPUEVOKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJRFIsIFJUQ19CSVQoSURSX1RPUEkpKTsKKwkJcnRjX3dyaXRlbChydGMsIElDUiwgUlRDX0JJVChJQ1JfVE9QSSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdDMyX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gKHN0cnVjdCBydGNfYXQzMmFwNzAweCAqKWRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGlzciA9IHJ0Y19yZWFkbChydGMsIElTUik7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCWludCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmcnRjLT5sb2NrKTsKKworCWlmIChpc3IgJiBSVENfQklUKElTUl9UT1BJKSkgeworCQlydGNfd3JpdGVsKHJ0YywgSUNSLCBSVENfQklUKElDUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJRFIsIFJUQ19CSVQoSURSX1RPUEkpKTsKKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJJiB+UlRDX0JJVChDVFJMX1RPUEVOKSk7CisJCXJ0Y193cml0ZWwocnRjLCBWQUwsIHJ0Yy0+YWxhcm1fdGltZSk7CisJCWV2ZW50cyA9IFJUQ19BRiB8IFJUQ19JUlFGOworCQlydGNfdXBkYXRlX2lycShydGMtPnJ0YywgMSwgZXZlbnRzKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJc3Bpbl91bmxvY2soJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgYXQzMl9ydGNfb3BzID0geworCS5pb2N0bAkJPSBhdDMyX3J0Y19pb2N0bCwKKwkucmVhZF90aW1lCT0gYXQzMl9ydGNfcmVhZHRpbWUsCisJLnNldF90aW1lCT0gYXQzMl9ydGNfc2V0dGltZSwKKwkucmVhZF9hbGFybQk9IGF0MzJfcnRjX3JlYWRhbGFybSwKKwkuc2V0X2FsYXJtCT0gYXQzMl9ydGNfc2V0YWxhcm0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDMyX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZQkqcmVnczsKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YzsKKwlpbnQgaXJxID0gLTE7CisJaW50IHJldDsKKworCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydGNfYXQzMmFwNzAweCksIEdGUF9LRVJORUwpOworCWlmICghcnRjKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlZ3MpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAibm8gbW1pbyByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgaXJxXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGF0MzJfcnRjX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJydGMiLCBydGMpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlcXVlc3QgaXJxICVkXG4iLCBpcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwlydGMtPmlycSA9IGlycTsKKwlydGMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWlmICghcnRjLT5yZWdzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBtYXAgSS9PIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCX0KKwlzcGluX2xvY2tfaW5pdCgmcnRjLT5sb2NrKTsKKworCS8qCisJICogTWF5YmUgaW5pdCBSVEM6IGNvdW50IGZyb20gemVybyBhdCAxIEh6LCBkaXNhYmxlIHdyYXAgaXJxLgorCSAqCisJICogRG8gbm90IHJlc2V0IFZBTCByZWdpc3RlciwgYXMgaXQgY2FuIGhvbGQgYW4gb2xkIHRpbWUKKwkgKiBmcm9tIGxhc3QgSlRBRyByZXNldC4KKwkgKi8KKwlpZiAoIShydGNfcmVhZGwocnRjLCBDVFJMKSAmIFJUQ19CSVQoQ1RSTF9FTikpKSB7CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBSVENfQklUKENUUkxfUENMUikpOworCQlydGNfd3JpdGVsKHJ0YywgSURSLCBSVENfQklUKElEUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBSVENfQkYoQ1RSTF9QU0VMLCAweGUpCisJCQkJfCBSVENfQklUKENUUkxfRU4pKTsKKwl9CisKKwlydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkmYXQzMl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMtPnJ0YykpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIHJ0YyBkZXZpY2VcbiIpOworCQlyZXQgPSBQVFJfRVJSKHJ0Yy0+cnRjKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkF0bWVsIFJUQyBmb3IgQVQzMkFQNzAweCBhdCAlMDhseCBpcnEgJWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpcnRjLT5yZWdzLCBydGMtPmlycSk7CisKKwlyZXR1cm4gMDsKKworb3V0X2lvdW5tYXA6CisJaW91bm1hcChydGMtPnJlZ3MpOworb3V0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKGlycSwgcnRjKTsKK291dDoKKwlrZnJlZShydGMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGF0MzJfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlmcmVlX2lycShydGMtPmlycSwgcnRjKTsKKwlpb3VubWFwKHJ0Yy0+cmVncyk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yy0+cnRjKTsKKwlrZnJlZShydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BTElBUygiYXQzMmFwNzAweF9ydGMiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXQzMl9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AoYXQzMl9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXQzMmFwNzAweF9ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQzMl9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF0MzJfcnRjX2RyaXZlciwgYXQzMl9ydGNfcHJvYmUpOworfQorbW9kdWxlX2luaXQoYXQzMl9ydGNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdDMyX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0MzJfcnRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhdDMyX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGNlZ3R2ZWR0QGF0bWVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVhbCB0aW1lIGNsb2NrIGZvciBBVlIzMiBBVDMyQVA3MDB4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKaW5kZXggZjRlNWYwMC4uMzA0NTM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRldi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwpAQCAtMzQxLDYgKzM0MSw4IEBACiAJY2FzZSBSVENfSVJRUF9SRUFEOgogCQlpZiAob3BzLT5pcnFfc2V0X2ZyZXEpCiAJCQllcnIgPSBwdXRfdXNlcihydGMtPmlycV9mcmVxLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKil1YXJnKTsKKwkJZWxzZQorCQkJZXJyID0gLUVOT1RUWTsKIAkJYnJlYWs7CiAKIAljYXNlIFJUQ19JUlFQX1NFVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2VmYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogRGFsbGFzIERTMTIxNiBSVEMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBCb2dlbmRvZXJmZXIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEiCisKK3N0cnVjdCBkczEyMTZfcmVncyB7CisJdTggdHNlYzsKKwl1OCBzZWM7CisJdTggbWluOworCXU4IGhvdXI7CisJdTggd2RheTsKKwl1OCBtZGF5OworCXU4IG1vbnRoOworCXU4IHllYXI7Cit9OworCisjZGVmaW5lIERTMTIxNl9IT1VSXzEyMjQJKDEgPDwgNykKKyNkZWZpbmUgRFMxMjE2X0hPVVJfQU1QTQkoMSA8PCA1KQorCitzdHJ1Y3QgZHMxMjE2X3ByaXYgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKK307CisKK3N0YXRpYyBjb25zdCB1OCBtYWdpY1tdID0geworCTB4YzUsIDB4M2EsIDB4YTMsIDB4NWMsIDB4YzUsIDB4M2EsIDB4YTMsIDB4NWMKK307CisKKy8qCisgKiBSZWFkIHRoZSA2NCBiaXQgd2UnZCBsaWtlIHRvIGhhdmUgLSBJdCBhIHNlcmllcworICogb2YgNjQgYml0cyBzaG93aW5nIHVwIGluIHRoZSBMU0Igb2YgdGhlIGJhc2UgcmVnaXN0ZXIuCisgKgorICovCitzdGF0aWMgdm9pZCBkczEyMTZfcmVhZCh1OCBfX2lvbWVtICppb2FkZHIsIHU4ICpidWYpCit7CisJdW5zaWduZWQgY2hhciBjOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQljID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWMgfD0gKHJlYWRiKGlvYWRkcikgJiAweDEpIDw8IGo7CisJCWJ1ZltpXSA9IGM7CisJfQorfQorCitzdGF0aWMgdm9pZCBkczEyMTZfd3JpdGUodTggX19pb21lbSAqaW9hZGRyLCBjb25zdCB1OCAqYnVmKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYyA9IGJ1ZltpXTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJd3JpdGViKGMsIGlvYWRkcik7CisJCQljID0gYyA+PiAxOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHU4IF9faW9tZW0gKmlvYWRkcikKK3sKKwkvKiBSZXNldCBtYWdpYyBwb2ludGVyICovCisJcmVhZGIoaW9hZGRyKTsKKwkvKiBXcml0ZSA2NCBiaXQgbWFnaWMgdG8gRFMxMjE2ICovCisJZHMxMjE2X3dyaXRlKGlvYWRkciwgbWFnaWMpOworfQorCitzdGF0aWMgaW50IGRzMTIxNl9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRzMTIxNl9yZWdzIHJlZ3M7CisKKwlkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHByaXYtPmlvYWRkcik7CisJZHMxMjE2X3JlYWQocHJpdi0+aW9hZGRyLCAodTggKikmcmVncyk7CisKKwl0bS0+dG1fc2VjID0gQkNEMkJJTihyZWdzLnNlYyk7CisJdG0tPnRtX21pbiA9IEJDRDJCSU4ocmVncy5taW4pOworCWlmIChyZWdzLmhvdXIgJiBEUzEyMTZfSE9VUl8xMjI0KSB7CisJCS8qIEFNL1BNIG1vZGUgKi8KKwkJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKHJlZ3MuaG91ciAmIDB4MWYpOworCQlpZiAocmVncy5ob3VyICYgRFMxMjE2X0hPVVJfQU1QTSkKKwkJCXRtLT50bV9ob3VyICs9IDEyOworCX0gZWxzZQorCQl0bS0+dG1faG91ciA9IEJDRDJCSU4ocmVncy5ob3VyICYgMHgzZik7CisJdG0tPnRtX3dkYXkgPSAocmVncy53ZGF5ICYgNykgLSAxOworCXRtLT50bV9tZGF5ID0gQkNEMkJJTihyZWdzLm1kYXkgJiAweDNmKTsKKwl0bS0+dG1fbW9uID0gQkNEMkJJTihyZWdzLm1vbnRoICYgMHgxZik7CisJdG0tPnRtX3llYXIgPSBCQ0QyQklOKHJlZ3MueWVhcik7CisJaWYgKHRtLT50bV95ZWFyIDwgNzApCisJCXRtLT50bV95ZWFyICs9IDEwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczEyMTZfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRzMTIxNl9yZWdzIHJlZ3M7CisKKwlkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHByaXYtPmlvYWRkcik7CisJZHMxMjE2X3JlYWQocHJpdi0+aW9hZGRyLCAodTggKikmcmVncyk7CisKKwlyZWdzLnRzZWMgPSAwOyAvKiBjbGVhciAwLjEgYW5kIDAuMDEgc2Vjb25kcyAqLworCXJlZ3Muc2VjID0gQklOMkJDRCh0bS0+dG1fc2VjKTsKKwlyZWdzLm1pbiA9IEJJTjJCQ0QodG0tPnRtX21pbik7CisJcmVncy5ob3VyICY9IERTMTIxNl9IT1VSXzEyMjQ7CisJaWYgKHJlZ3MuaG91ciAmJiB0bS0+dG1faG91ciA+IDEyKSB7CisJCXJlZ3MuaG91ciB8PSBEUzEyMTZfSE9VUl9BTVBNOworCQl0bS0+dG1faG91ciAtPSAxMjsKKwl9CisJcmVncy5ob3VyIHw9IEJJTjJCQ0QodG0tPnRtX2hvdXIpOworCXJlZ3Mud2RheSAmPSB+NzsKKwlyZWdzLndkYXkgfD0gdG0tPnRtX3dkYXk7CisJcmVncy5tZGF5ID0gQklOMkJDRCh0bS0+dG1fbWRheSk7CisJcmVncy5tb250aCA9IEJJTjJCQ0QodG0tPnRtX21vbik7CisJcmVncy55ZWFyID0gQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCk7CisKKwlkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHByaXYtPmlvYWRkcik7CisJZHMxMjE2X3dyaXRlKHByaXYtPmlvYWRkciwgKHU4ICopJnJlZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxMjE2X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGRzMTIxNl9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGRzMTIxNl9ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkczEyMTZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXY7CisJaW50IHJldCA9IDA7CisJdTggZHVtbXlbOF07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwcml2ID0ga3phbGxvYyhzaXplb2YgKnByaXYsIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJcHJpdi0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcHJpdi0+c2l6ZSwgcGRldi0+bmFtZSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJcHJpdi0+YmFzZWFkZHIgPSByZXMtPnN0YXJ0OworCXByaXYtPmlvYWRkciA9IGlvcmVtYXAocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWlmICghcHJpdi0+aW9hZGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEyMTYiLCAmcGRldi0+ZGV2LAorCQkJCSAgJmRzMTIxNl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBvdXQ7CisJfQorCXByaXYtPnJ0YyA9IHJ0YzsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCS8qIGR1bW15IHJlYWQgdG8gZ2V0IGNsb2NrIGludG8gYSBrbm93biBzdGF0ZSAqLworCWRzMTIxNl9yZWFkKHByaXYtPmlvYWRkciwgZHVtbXkpOworCXJldHVybiAwOworCitvdXQ6CisJaWYgKHByaXYtPnJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnJ0Yyk7CisJaWYgKHByaXYtPmlvYWRkcikKKwkJaW91bm1hcChwcml2LT5pb2FkZHIpOworCWlmIChwcml2LT5iYXNlYWRkcikKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEyMTZfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkczEyMTZfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnJ0Yyk7CisJaW91bm1hcChwcml2LT5pb2FkZHIpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwcml2LT5iYXNlYWRkciwgcHJpdi0+c2l6ZSk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRzMTIxNl9ydGNfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtZHMxMjE2IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gZHMxMjE2X3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRzMTIxNl9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTIxNl9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRzMTIxNl9ydGNfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRzMTIxNl9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkczEyMTZfcnRjX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBCb2dlbmRvZXJmZXIgPHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRTMTIxNiBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGRzMTIxNl9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChkczEyMTZfcnRjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCmluZGV4IDNmMGY3YjguLjUxNThhNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKQEAgLTI0LDI5ICsyNCwyOSBAQAogICogc2V0dGluZyB0aGUgZGF0ZSBhbmQgdGltZSksIExpbnV4IGNhbiBpZ25vcmUgdGhlIG5vbi1jbG9jayBmZWF0dXJlcy4KICAqIFRoYXQncyBhIG5hdHVyYWwgam9iIGZvciBhIGZhY3Rvcnkgb3IgcmVwYWlyIGJlbmNoLgogICoKLSAqIElmIHRoZSBJMkMgImZvcmNlIiBtZWNoYW5pc20gaXMgdXNlZCwgd2UgYXNzdW1lIHRoZSBjaGlwIGlzIGEgZHMxMzM3LgotICogKE11Y2ggYmV0dGVyIHdvdWxkIGJlIGJvYXJkLXNwZWNpZmljIHRhYmxlcyBvZiBJMkMgZGV2aWNlcywgYWxvbmcgd2l0aAotICogdGhlIHBsYXRmb3JtX2RhdGEgZHJpdmVycyB3b3VsZCB1c2UgdG8gc29ydCBzdWNoIGlzc3VlcyBvdXQuKQorICogVGhpcyBpcyBjdXJyZW50bHkgYSBzaW1wbGUgbm8tYWxhcm1zIGRyaXZlci4gIElmIHlvdXIgYm9hcmQgaGFzIHRoZQorICogYWxhcm0gaXJxIHdpcmVkIHVwIG9uIGEgZHMxMzM3IG9yIGRzMTMzOSwgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGF0LAorICogdGhlbiBsb29rIGF0IHRoZSBydGMtcnM1YzM3MiBkcml2ZXIgZm9yIGNvZGUgdG8gc3RlYWwuLi4KICAqLwogZW51bSBkc190eXBlIHsKLQl1bmtub3duID0gMCwKLQlkc18xMzA3LAkJLyogb3IgZHMxMzM4LCAuLi4gKi8KLQlkc18xMzM3LAkJLyogb3IgZHMxMzM5LCAuLi4gKi8KLQlkc18xMzQwLAkJLyogb3Igc3QgbTQxdDAwLCAuLi4gKi8KKwlkc18xMzA3LAorCWRzXzEzMzcsCisJZHNfMTMzOCwKKwlkc18xMzM5LAorCWRzXzEzNDAsCisJbTQxdDAwLAogCS8vIHJzNWMzNzIgdG9vPyAgZGlmZmVyZW50IGFkZHJlc3MuLi4KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NjgsIEkyQ19DTElFTlRfRU5EIH07Ci0KLUkyQ19DTElFTlRfSU5TTU9EOwotCi0KIAogLyogUlRDIHJlZ2lzdGVycyBkb24ndCBkaWZmZXIgbXVjaCwgZXhjZXB0IGZvciB0aGUgY2VudHVyeSBmbGFnICovCiAjZGVmaW5lIERTMTMwN19SRUdfU0VDUwkJMHgwMAkvKiAwMC01OSAqLwogIwlkZWZpbmUgRFMxMzA3X0JJVF9DSAkJMHg4MAorIwlkZWZpbmUgRFMxMzQwX0JJVF9uRU9TQwkJMHg4MAogI2RlZmluZSBEUzEzMDdfUkVHX01JTgkJMHgwMQkvKiAwMC01OSAqLwogI2RlZmluZSBEUzEzMDdfUkVHX0hPVVIJCTB4MDIJLyogMDAtMjMsIG9yIDEtMTJ7YW0scG19ICovCisjCWRlZmluZSBEUzEzMDdfQklUXzEySFIJCTB4NDAJLyogaW4gUkVHX0hPVVIgKi8KKyMJZGVmaW5lIERTMTMwN19CSVRfUE0JCTB4MjAJLyogaW4gUkVHX0hPVVIgKi8KICMJZGVmaW5lIERTMTM0MF9CSVRfQ0VOVFVSWV9FTgkweDgwCS8qIGluIFJFR19IT1VSICovCiAjCWRlZmluZSBEUzEzNDBfQklUX0NFTlRVUlkJMHg0MAkvKiBpbiBSRUdfSE9VUiAqLwogI2RlZmluZSBEUzEzMDdfUkVHX1dEQVkJCTB4MDMJLyogMDEtMDcgKi8KQEAgLTU2LDExICs1NiwxMiBAQAogI2RlZmluZSBEUzEzMDdfUkVHX1lFQVIJCTB4MDYJLyogMDAtOTkgKi8KIAogLyogT3RoZXIgcmVnaXN0ZXJzIChjb250cm9sLCBzdGF0dXMsIGFsYXJtcywgdHJpY2tsZSBjaGFyZ2UsIE5WUkFNLCBldGMpCi0gKiBzdGFydCBhdCA3LCBhbmQgdGhleSBkaWZmZXIgYSBsb3QuIE9ubHkgY29udHJvbCBhbmQgc3RhdHVzIG1hdHRlciBmb3IgUlRDOwotICogYmUgY2FyZWZ1bCB1c2luZyB0aGVtLgorICogc3RhcnQgYXQgNywgYW5kIHRoZXkgZGlmZmVyIGEgTE9ULiBPbmx5IGNvbnRyb2wgYW5kIHN0YXR1cyBtYXR0ZXIgZm9yCisgKiBiYXNpYyBSVEMgZGF0ZSBhbmQgdGltZSBmdW5jdGlvbmFsaXR5OyBiZSBjYXJlZnVsIHVzaW5nIHRoZW0uCiAgKi8KLSNkZWZpbmUgRFMxMzA3X1JFR19DT05UUk9MCTB4MDcKKyNkZWZpbmUgRFMxMzA3X1JFR19DT05UUk9MCTB4MDcJCS8qIG9yIGRzMTMzOCAqLwogIwlkZWZpbmUgRFMxMzA3X0JJVF9PVVQJCTB4ODAKKyMJZGVmaW5lIERTMTMzOF9CSVRfT1NGCQkweDIwCiAjCWRlZmluZSBEUzEzMDdfQklUX1NRV0UJCTB4MTAKICMJZGVmaW5lIERTMTMwN19CSVRfUlMxCQkweDAyCiAjCWRlZmluZSBEUzEzMDdfQklUX1JTMAkJMHgwMQpAQCAtNzEsNiArNzIsMTMgQEAKICMJZGVmaW5lIERTMTMzN19CSVRfSU5UQ04JCTB4MDQKICMJZGVmaW5lIERTMTMzN19CSVRfQTJJRQkJMHgwMgogIwlkZWZpbmUgRFMxMzM3X0JJVF9BMUlFCQkweDAxCisjZGVmaW5lIERTMTM0MF9SRUdfQ09OVFJPTAkweDA3CisjCWRlZmluZSBEUzEzNDBfQklUX09VVAkJMHg4MAorIwlkZWZpbmUgRFMxMzQwX0JJVF9GVAkJMHg0MAorIwlkZWZpbmUgRFMxMzQwX0JJVF9DQUxJQl9TSUdOCTB4MjAKKyMJZGVmaW5lIERTMTM0MF9NX0NBTElCUkFUSU9OCTB4MWYKKyNkZWZpbmUgRFMxMzQwX1JFR19GTEFHCQkweDA5CisjCWRlZmluZSBEUzEzNDBfQklUX09TRgkJMHg4MAogI2RlZmluZSBEUzEzMzdfUkVHX1NUQVRVUwkweDBmCiAjCWRlZmluZSBEUzEzMzdfQklUX09TRgkJMHg4MAogIwlkZWZpbmUgRFMxMzM3X0JJVF9BMkkJCTB4MDIKQEAgLTg0LDIxICs5Miw2MyBAQAogCXU4CQkJcmVnc1s4XTsKIAllbnVtIGRzX3R5cGUJCXR5cGU7CiAJc3RydWN0IGkyY19tc2cJCW1zZ1syXTsKLQlzdHJ1Y3QgaTJjX2NsaWVudAljbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudAlkZXY7CiAJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKIH07CiAKK3N0cnVjdCBjaGlwX2Rlc2MgeworCWNoYXIJCQluYW1lWzldOworCXVuc2lnbmVkCQludnJhbTU2OjE7CisJdW5zaWduZWQJCWFsYXJtOjE7CisJZW51bSBkc190eXBlCQl0eXBlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MgY2hpcHNbXSA9IHsgeworCS5uYW1lCQk9ICJkczEzMDciLAorCS50eXBlCQk9IGRzXzEzMDcsCisJLm52cmFtNTYJPSAxLAorfSwgeworCS5uYW1lCQk9ICJkczEzMzciLAorCS50eXBlCQk9IGRzXzEzMzcsCisJLmFsYXJtCQk9IDEsCit9LCB7CisJLm5hbWUJCT0gImRzMTMzOCIsCisJLnR5cGUJCT0gZHNfMTMzOCwKKwkubnZyYW01Ngk9IDEsCit9LCB7CisJLm5hbWUJCT0gImRzMTMzOSIsCisJLnR5cGUJCT0gZHNfMTMzOSwKKwkuYWxhcm0JCT0gMSwKK30sIHsKKwkubmFtZQkJPSAiZHMxMzQwIiwKKwkudHlwZQkJPSBkc18xMzQwLAorfSwgeworCS5uYW1lCQk9ICJtNDF0MDAiLAorCS50eXBlCQk9IG00MXQwMCwKK30sIH07CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGNoaXBfZGVzYyAqZmluZF9jaGlwKGNvbnN0IGNoYXIgKnMpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoaXBzKTsgaSsrKQorCQlpZiAoc3RybmljbXAocywgY2hpcHNbaV0ubmFtZSwgc2l6ZW9mIGNoaXBzW2ldLm5hbWUpID09IDApCisJCQlyZXR1cm4gJmNoaXBzW2ldOworCXJldHVybiBOVUxMOworfQogCiBzdGF0aWMgaW50IGRzMTMwN19nZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdCkKIHsKIAlzdHJ1Y3QgZHMxMzA3CSpkczEzMDcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQJCXRtcDsKIAotCS8qIHJlYWQgdGhlIFJUQyByZWdpc3RlcnMgYWxsIGF0IG9uY2UgKi8KKwkvKiByZWFkIHRoZSBSVEMgZGF0ZSBhbmQgdGltZSByZWdpc3RlcnMgYWxsIGF0IG9uY2UgKi8KIAlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOwogCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDc7CiAKLQl0bXAgPSBpMmNfdHJhbnNmZXIoZHMxMzA3LT5jbGllbnQuYWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCXRtcCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihkczEzMDctPmNsaWVudC0+ZGV2LnBhcmVudCksCisJCQlkczEzMDctPm1zZywgMik7CiAJaWYgKHRtcCAhPSAyKSB7CiAJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJyZWFkIiwgdG1wKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0xMjksNyArMTc5LDggQEAKIAkJdC0+dG1faG91ciwgdC0+dG1fbWRheSwKIAkJdC0+dG1fbW9uLCB0LT50bV95ZWFyLCB0LT50bV93ZGF5KTsKIAotCXJldHVybiAwOworCS8qIGluaXRpYWwgY2xvY2sgc2V0dGluZyBjYW4gYmUgdW5kZWZpbmVkICovCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0KTsKIH0KIAogc3RhdGljIGludCBkczEzMDdfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCkBAIC0xNTcsMTEgKzIwOCwxOCBAQAogCXRtcCA9IHQtPnRtX3llYXIgLSAxMDA7CiAJYnVmW0RTMTMwN19SRUdfWUVBUl0gPSBCSU4yQkNEKHRtcCk7CiAKLQlpZiAoZHMxMzA3LT50eXBlID09IGRzXzEzMzcpCisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIGRzXzEzMzc6CisJY2FzZSBkc18xMzM5OgogCQlidWZbRFMxMzA3X1JFR19NT05USF0gfD0gRFMxMzM3X0JJVF9DRU5UVVJZOwotCWVsc2UgaWYgKGRzMTMwNy0+dHlwZSA9PSBkc18xMzQwKQorCQlicmVhazsKKwljYXNlIGRzXzEzNDA6CiAJCWJ1ZltEUzEzMDdfUkVHX0hPVVJdIHw9IERTMTM0MF9CSVRfQ0VOVFVSWV9FTgogCQkJCXwgRFMxMzQwX0JJVF9DRU5UVVJZOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAlkczEzMDctPm1zZ1sxXS5mbGFncyA9IDA7CiAJZHMxMzA3LT5tc2dbMV0ubGVuID0gODsKQEAgLTE3MCw3ICsyMjgsOCBAQAogCQkid3JpdGUiLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCiAJCWJ1Zls0XSwgYnVmWzVdLCBidWZbNl0pOwogCi0JcmVzdWx0ID0gaTJjX3RyYW5zZmVyKGRzMTMwNy0+Y2xpZW50LmFkYXB0ZXIsICZkczEzMDctPm1zZ1sxXSwgMSk7CisJcmVzdWx0ID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGRzMTMwNy0+Y2xpZW50LT5kZXYucGFyZW50KSwKKwkJCSZkczEzMDctPm1zZ1sxXSwgMSk7CiAJaWYgKHJlc3VsdCAhPSAxKSB7CiAJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJ3cml0ZSIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMTg1LDI1ICsyNDQsMjkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMTMwN19kcml2ZXI7CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1kczEzMDdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQorc3RhdGljIGludCBfX2RldmluaXQgZHMxMzA3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGRzMTMwNwkJKmRzMTMwNzsKIAlpbnQJCQllcnIgPSAtRU5PREVWOwotCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJaW50CQkJdG1wOworCWNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MJKmNoaXA7CisJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKIAotCWlmICghKGRzMTMwNyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEzMDcpLCBHRlBfS0VSTkVMKSkpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0OworCWNoaXAgPSBmaW5kX2NoaXAoY2xpZW50LT5uYW1lKTsKKwlpZiAoIWNoaXApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmtub3duIGNoaXAgdHlwZSAnJXMnXG4iLAorCQkJCWNsaWVudC0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWNsaWVudCA9ICZkczEzMDctPmNsaWVudDsKLQljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JY2xpZW50LT5kcml2ZXIgPSAmZHMxMzA3X2RyaXZlcjsKLQljbGllbnQtPmZsYWdzID0gMDsKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsCisJCQlJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVJTzsKIAorCWlmICghKGRzMTMwNyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEzMDcpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZHMxMzA3LT5jbGllbnQgPSBjbGllbnQ7CiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZHMxMzA3KTsKIAogCWRzMTMwNy0+bXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CkBAIC0yMTYsMTQgKzI3OSwxNiBAQAogCWRzMTMwNy0+bXNnWzFdLmxlbiA9IHNpemVvZihkczEzMDctPnJlZ3MpOwogCWRzMTMwNy0+bXNnWzFdLmJ1ZiA9IGRzMTMwNy0+cmVnczsKIAotCS8qIEhBQ0s6ICJmb3JjZSIgaW1wbGllcyAibmVlZHMgZHMxMzM3LXN0eWxlLW9zY2lsbGF0b3Igc2V0dXAiICovCi0JaWYgKGtpbmQgPj0gMCkgewotCQlkczEzMDctPnR5cGUgPSBkc18xMzM3OworCWRzMTMwNy0+dHlwZSA9IGNoaXAtPnR5cGU7CiAKKwlzd2l0Y2ggKGRzMTMwNy0+dHlwZSkgeworCWNhc2UgZHNfMTMzNzoKKwljYXNlIGRzXzEzMzk6CiAJCWRzMTMwNy0+cmVnX2FkZHIgPSBEUzEzMzdfUkVHX0NPTlRST0w7CiAJCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDI7CiAKLQkJdG1wID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCQkvKiBnZXQgcmVnaXN0ZXJzIHRoYXQgdGhlICJydGMiIHJlYWQgYmVsb3cgd29uJ3QgcmVhZC4uLiAqLworCQl0bXAgPSBpMmNfdHJhbnNmZXIoYWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOwogCQlpZiAodG1wICE9IDIpIHsKIAkJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOwogCQkJZXJyID0gLUVJTzsKQEAgLTIzMywxOSArMjk4LDI2IEBACiAJCWRzMTMwNy0+cmVnX2FkZHIgPSAwOwogCQlkczEzMDctPm1zZ1sxXS5sZW4gPSBzaXplb2YoZHMxMzA3LT5yZWdzKTsKIAotCQkvKiBvc2NpbGxhdG9yIGlzIG9mZjsgbmVlZCB0byB0dXJuIGl0IG9uICovCi0JCWlmICgoZHMxMzA3LT5yZWdzWzBdICYgRFMxMzM3X0JJVF9uRU9TQykKLQkJCQl8fCAoZHMxMzA3LT5yZWdzWzFdICYgRFMxMzM3X0JJVF9PU0YpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm5vIGRzMTMzNyBvc2NpbGxhdG9yIGNvZGVcbiIpOwotCQkJZ290byBleGl0X2ZyZWU7CisJCS8qIG9zY2lsbGF0b3Igb2ZmPyAgdHVybiBpdCBvbiwgc28gY2xvY2sgY2FuIHRpY2suICovCisJCWlmIChkczEzMDctPnJlZ3NbMF0gJiBEUzEzMzdfQklUX25FT1NDKQorCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfQ09OVFJPTCwKKwkJCQlkczEzMDctPnJlZ3NbMF0gJiB+RFMxMzM3X0JJVF9uRU9TQyk7CisKKwkJLyogb3NjaWxsYXRvciBmYXVsdD8gIGNsZWFyIGZsYWcsIGFuZCB3YXJuICovCisJCWlmIChkczEzMDctPnJlZ3NbMV0gJiBEUzEzMzdfQklUX09TRikgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfU1RBVFVTLAorCQkJCWRzMTMwNy0+cmVnc1sxXSAmIH5EUzEzMzdfQklUX09TRik7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJTRVQgVElNRSFcbiIpOwogCQl9Ci0JfSBlbHNlCi0JCWRzMTMwNy0+dHlwZSA9IGRzXzEzMDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIAogcmVhZF9ydGM6CiAJLyogcmVhZCBSVEMgcmVnaXN0ZXJzICovCiAKLQl0bXAgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBkczEzMDctPm1zZywgMik7CisJdG1wID0gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKIAlpZiAodG1wICE9IDIpIHsKIAkJcHJfZGVidWcoInJlYWQgZXJyb3IgJWRcbiIsIHRtcCk7CiAJCWVyciA9IC1FSU87CkBAIC0yNTcsMTE5ICszMjksMTIxIEBACiAJICogc3RpbGwgYSBmZXcgdmFsdWVzIHRoYXQgYXJlIGNsZWFybHkgb3V0LW9mLXJhbmdlLgogCSAqLwogCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdOwotCWlmICh0bXAgJiBEUzEzMDdfQklUX0NIKSB7Ci0JCWlmIChkczEzMDctPnR5cGUgJiYgZHMxMzA3LT50eXBlICE9IGRzXzEzMDcpIHsKLQkJCXByX2RlYnVnKCJub3QgYSBkczEzMDc/XG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOwotCQl9Ci0JCWRzMTMwNy0+dHlwZSA9IGRzXzEzMDc7Ci0KLQkJLyogdGhpcyBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHNob3VsZCB3b3JrIGZvciBkczEzMDcsCi0JCSAqIGRzMTMzOCwgZHMxMzQwLCBzdCBtNDF0MDAsIGFuZCBtb3JlLgorCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CisJY2FzZSBkc18xMzQwOgorCQkvKiBGSVhNRSByZWFkIHJlZ2lzdGVyIHdpdGggRFMxMzQwX0JJVF9PU0YsIHVzZSB0aGF0IHRvCisJCSAqIHRyaWdnZXIgdGhlICJzZXQgdGltZSIgd2FybmluZyAoKmFmdGVyKiByZXN0YXJ0aW5nIHRoZQorCQkgKiBvc2NpbGxhdG9yISkgaW5zdGVhZCBvZiB0aGlzIHdlYWtlciBkczEzMDcvbTQxdDAwIHRlc3QuCiAJCSAqLwotCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJvc2NpbGxhdG9yIHN0YXJ0ZWQ7IFNFVCBUSU1FIVxuIik7Ci0JCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCAwLCAwKTsKLQkJZ290byByZWFkX3J0YzsKKwljYXNlIGRzXzEzMDc6CisJY2FzZSBtNDF0MDA6CisJCS8qIGNsb2NrIGhhbHRlZD8gIHR1cm4gaXQgb24sIHNvIGNsb2NrIGNhbiB0aWNrLiAqLworCQlpZiAodG1wICYgRFMxMzA3X0JJVF9DSCkgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMwN19SRUdfU0VDUywgMCk7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJTRVQgVElNRSFcbiIpOworCQkJZ290byByZWFkX3J0YzsKKwkJfQorCQlicmVhazsKKwljYXNlIGRzXzEzMzg6CisJCS8qIGNsb2NrIGhhbHRlZD8gIHR1cm4gaXQgb24sIHNvIGNsb2NrIGNhbiB0aWNrLiAqLworCQlpZiAodG1wICYgRFMxMzA3X0JJVF9DSCkKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX1NFQ1MsIDApOworCisJCS8qIG9zY2lsbGF0b3IgZmF1bHQ/ICBjbGVhciBmbGFnLCBhbmQgd2FybiAqLworCQlpZiAoZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfQ09OVFJPTF0gJiBEUzEzMzhfQklUX09TRikgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMwN19SRUdfQ09OVFJPTCwKKwkJCQkJZHMxMzA3LT5yZWdzW0RTMTMzN19SRUdfQ09OVFJPTF0KKwkJCQkJJiB+RFMxMzM4X0JJVF9PU0YpOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKKwkJCWdvdG8gcmVhZF9ydGM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkc18xMzM3OgorCWNhc2UgZHNfMTMzOToKKwkJYnJlYWs7CiAJfQorCisJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfU0VDU107CiAJdG1wID0gQkNEMkJJTih0bXAgJiAweDdmKTsKIAlpZiAodG1wID4gNjApCi0JCWdvdG8gZXhpdF9mcmVlOworCQlnb3RvIGV4aXRfYmFkOwogCXRtcCA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTUlOXSAmIDB4N2YpOwogCWlmICh0bXAgPiA2MCkKLQkJZ290byBleGl0X2ZyZWU7CisJCWdvdG8gZXhpdF9iYWQ7CiAKIAl0bXAgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01EQVldICYgMHgzZik7CiAJaWYgKHRtcCA9PSAwIHx8IHRtcCA+IDMxKQotCQlnb3RvIGV4aXRfZnJlZTsKKwkJZ290byBleGl0X2JhZDsKIAogCXRtcCA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTU9OVEhdICYgMHgxZik7CiAJaWYgKHRtcCA9PSAwIHx8IHRtcCA+IDEyKQotCQlnb3RvIGV4aXRfZnJlZTsKKwkJZ290byBleGl0X2JhZDsKIAotCS8qIGZvcmNlIGludG8gaW4gMjQgaG91ciBtb2RlIChtb3N0IGNoaXBzKSBvcgotCSAqIGRpc2FibGUgY2VudHVyeSBiaXQgKGRzMTM0MCkKLQkgKi8KIAl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19IT1VSXTsKLQlpZiAodG1wICYgKDEgPDwgNikpIHsKLQkJaWYgKHRtcCAmICgxIDw8IDUpKQotCQkJdG1wID0gQkNEMkJJTih0bXAgJiAweDFmKSArIDEyOwotCQllbHNlCi0JCQl0bXAgPSBCQ0QyQklOKHRtcCk7CisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIGRzXzEzNDA6CisJY2FzZSBtNDF0MDA6CisJCS8qIE5PVEU6IGlnbm9yZXMgY2VudHVyeSBiaXRzOyBmaXggYmVmb3JlIGRlcGxveWluZworCQkgKiBzeXN0ZW1zIHRoYXQgd2lsbCBydW4gdGhyb3VnaCB5ZWFyIDIxMDAuCisJCSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoISh0bXAgJiBEUzEzMDdfQklUXzEySFIpKQorCQkJYnJlYWs7CisKKwkJLyogQmUgc3VyZSB3ZSdyZSBpbiAyNCBob3VyIG1vZGUuICBNdWx0aS1tYXN0ZXIgc3lzdGVtcworCQkgKiB0YWtlIG5vdGUuLi4KKwkJICovCisJCXRtcCA9IEJDRDJCSU4odG1wICYgMHgxZik7CisJCWlmICh0bXAgPT0gMTIpCisJCQl0bXAgPSAwOworCQlpZiAoZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl0gJiBEUzEzMDdfQklUX1BNKQorCQkJdG1wICs9IDEyOwogCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQlEUzEzMDdfUkVHX0hPVVIsCiAJCQkJQklOMkJDRCh0bXApKTsKIAl9CiAKLQkvKiBGSVhNRSBjaGlwcyBsaWtlIDEzMzcgY2FuIGdlbmVyYXRlIGFsYXJtIGlycXMgdG9vOyB0aG9zZSBhcmUKLQkgKiB3b3J0aCBleHBvc2luZyB0aHJvdWdoIHRoZSBBUEkgKGVzcGVjaWFsbHkgd2hlbiB0aGUgaXJxIGlzCi0JICogd2FrZXVwLWNhcGFibGUpLgotCSAqLwotCi0Jc3dpdGNoIChkczEzMDctPnR5cGUpIHsKLQljYXNlIHVua25vd246Ci0JCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAidW5rbm93biIsIEkyQ19OQU1FX1NJWkUpOwotCQlicmVhazsKLQljYXNlIGRzXzEzMDc6Ci0JCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAiZHMxMzA3IiwgSTJDX05BTUVfU0laRSk7Ci0JCWJyZWFrOwotCWNhc2UgZHNfMTMzNzoKLQkJc3RybGNweShjbGllbnQtPm5hbWUsICJkczEzMzciLCBJMkNfTkFNRV9TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSBkc18xMzQwOgotCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgImRzMTM0MCIsIEkyQ19OQU1FX1NJWkUpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCi0JaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKLQkJZ290byBleGl0X2ZyZWU7Ci0KIAlkczEzMDctPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoY2xpZW50LT5uYW1lLCAmY2xpZW50LT5kZXYsCiAJCQkJJmRzMTN4eF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CiAJaWYgKElTX0VSUihkczEzMDctPnJ0YykpIHsKIAkJZXJyID0gUFRSX0VSUihkczEzMDctPnJ0Yyk7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAogCQkJInVuYWJsZSB0byByZWdpc3RlciB0aGUgY2xhc3MgZGV2aWNlXG4iKTsKLQkJZ290byBleGl0X2RldGFjaDsKKwkJZ290byBleGl0X2ZyZWU7CiAJfQogCiAJcmV0dXJuIDA7CiAKLWV4aXRfZGV0YWNoOgotCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CitleGl0X2JhZDoKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJImJvZ3VzIHJlZ2lzdGVyIiwKKwkJCWRzMTMwNy0+cmVnc1swXSwgZHMxMzA3LT5yZWdzWzFdLAorCQkJZHMxMzA3LT5yZWdzWzJdLCBkczEzMDctPnJlZ3NbM10sCisJCQlkczEzMDctPnJlZ3NbNF0sIGRzMTMwNy0+cmVnc1s1XSwKKwkJCWRzMTMwNy0+cmVnc1s2XSk7CisKIGV4aXRfZnJlZToKIAlrZnJlZShkczEzMDcpOwotZXhpdDoKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotZHMxMzA3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMTMwN19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCi0JCXJldHVybiAwOwotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgZHMxMzA3X2RldGVjdCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IGRzMTMwN19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50CQllcnI7CiAJc3RydWN0IGRzMTMwNwkqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZHMxMzA3LT5ydGMpOwotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCi0JCXJldHVybiBlcnI7CiAJa2ZyZWUoZHMxMzA3KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMTMwN19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiZHMxMzA3IiwKKwkJLm5hbWUJPSAicnRjLWRzMTMwNyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyCT0gZHMxMzA3X2F0dGFjaF9hZGFwdGVyLAotCS5kZXRhY2hfY2xpZW50CT0gX19kZXZleGl0X3AoZHMxMzA3X2RldGFjaF9jbGllbnQpLAorCS5wcm9iZQkJPSBkczEzMDdfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczEzMDdfcmVtb3ZlKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGRzMTMwN19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjNGE4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDF0ODAuYwpAQCAtMCwwICsxLDkxNyBAQAorLyoKKyAqIEkyQyBjbGllbnQvZHJpdmVyIGZvciB0aGUgU1QgTTQxVDgwIGZhbWlseSBvZiBpMmMgcnRjIGNoaXBzLgorICoKKyAqIEF1dGhvcjogQWxleGFuZGVyIEJpZ2dhIDxhYkBteWNhYmxlLmRlPgorICoKKyAqIEJhc2VkIG9uIG00MXQwMC5jIGJ5IE1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPgorICoKKyAqIDIwMDYgKGMpIG15Y2FibGUgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2lmZGVmIENPTkZJR19SVENfRFJWX000MVQ4MF9XRFQKKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjZW5kaWYKKworI2RlZmluZSBNNDFUODBfUkVHX1NTRUMJMAorI2RlZmluZSBNNDFUODBfUkVHX1NFQwkxCisjZGVmaW5lIE00MVQ4MF9SRUdfTUlOCTIKKyNkZWZpbmUgTTQxVDgwX1JFR19IT1VSCTMKKyNkZWZpbmUgTTQxVDgwX1JFR19XREFZCTQKKyNkZWZpbmUgTTQxVDgwX1JFR19EQVkJNQorI2RlZmluZSBNNDFUODBfUkVHX01PTgk2CisjZGVmaW5lIE00MVQ4MF9SRUdfWUVBUgk3CisjZGVmaW5lIE00MVQ4MF9SRUdfQUxBUk1fTU9OCTB4YQorI2RlZmluZSBNNDFUODBfUkVHX0FMQVJNX0RBWQkweGIKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9IT1VSCTB4YworI2RlZmluZSBNNDFUODBfUkVHX0FMQVJNX01JTgkweGQKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9TRUMJMHhlCisjZGVmaW5lIE00MVQ4MF9SRUdfRkxBR1MJMHhmCisjZGVmaW5lIE00MVQ4MF9SRUdfU1FXCTB4MTMKKworI2RlZmluZSBNNDFUODBfREFURVRJTUVfUkVHX1NJWkUJKE00MVQ4MF9SRUdfWUVBUiArIDEpCisjZGVmaW5lIE00MVQ4MF9BTEFSTV9SRUdfU0laRQlcCisJKE00MVQ4MF9SRUdfQUxBUk1fU0VDICsgMSAtIE00MVQ4MF9SRUdfQUxBUk1fTU9OKQorCisjZGVmaW5lIE00MVQ4MF9TRUNfU1QJCSgxIDw8IDcpCS8qIFNUOiBTdG9wIEJpdCAqLworI2RlZmluZSBNNDFUODBfQUxNT05fQUZFCSgxIDw8IDcpCS8qIEFGRTogQUYgRW5hYmxlIEJpdCAqLworI2RlZmluZSBNNDFUODBfQUxNT05fU1FXRQkoMSA8PCA2KQkvKiBTUVdFOiBTUVcgRW5hYmxlIEJpdCAqLworI2RlZmluZSBNNDFUODBfQUxIT1VSX0hUCSgxIDw8IDYpCS8qIEhUOiBIYWx0IFVwZGF0ZSBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0ZMQUdTX0FGCQkoMSA8PCA2KQkvKiBBRjogQWxhcm0gRmxhZyBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0ZMQUdTX0JBVFRfTE9XCSgxIDw8IDQpCS8qIEJMOiBCYXR0ZXJ5IExvdyBCaXQgKi8KKworI2RlZmluZSBNNDFUODBfRkVBVFVSRV9IVAkoMSA8PCAwKQorI2RlZmluZSBNNDFUODBfRkVBVFVSRV9CTAkoMSA8PCAxKQorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjA1IgorCitzdHJ1Y3QgbTQxdDgwX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1OCBmZWF0dXJlczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbTQxdDgwX2NoaXBfaW5mbyBtNDF0ODBfY2hpcF9pbmZvX3RibFtdID0geworCXsKKwkJLm5hbWUJCT0gIm00MXQ4MCIsCisJCS5mZWF0dXJlcwk9IDAsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDF0ODEiLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXQ4MXMiLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMLAorCX0sCisJeworCQkubmFtZQkJPSAibTQxdDgyIiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXQ4MyIsCisJCS5mZWF0dXJlcwk9IE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDFzdDg0IiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXN0ODUiLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMLAorCX0sCisJeworCQkubmFtZQkJPSAibTQxc3Q4NyIsCisJCS5mZWF0dXJlcwk9IE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwsCisJfSwKK307CisKK3N0cnVjdCBtNDF0ODBfZGF0YSB7CisJY29uc3Qgc3RydWN0IG00MXQ4MF9jaGlwX2luZm8gKmNoaXA7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKK307CisKK3N0YXRpYyBpbnQgbTQxdDgwX2dldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICAgIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdTggYnVmW000MVQ4MF9EQVRFVElNRV9SRUdfU0laRV0sIGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfU0VDIH07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBkdF9hZGRyLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRSAtIE00MVQ4MF9SRUdfU0VDLAorCQkJLmJ1Zgk9IGJ1ZiArIE00MVQ4MF9SRUdfU0VDLAorCQl9LAorCX07CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXRtLT50bV9zZWMgPSBCQ0QyQklOKGJ1ZltNNDFUODBfUkVHX1NFQ10gJiAweDdmKTsKKwl0bS0+dG1fbWluID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19NSU5dICYgMHg3Zik7CisJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKGJ1ZltNNDFUODBfUkVHX0hPVVJdICYgMHgzZik7CisJdG0tPnRtX21kYXkgPSBCQ0QyQklOKGJ1ZltNNDFUODBfUkVHX0RBWV0gJiAweDNmKTsKKwl0bS0+dG1fd2RheSA9IGJ1ZltNNDFUODBfUkVHX1dEQVldICYgMHgwNzsKKwl0bS0+dG1fbW9uID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19NT05dICYgMHgxZikgLSAxOworCisJLyogYXNzdW1lIDIwWVkgbm90IDE5WVksIGFuZCBpZ25vcmUgdGhlIENlbnR1cnkgQml0ICovCisJdG0tPnRtX3llYXIgPSBCQ0QyQklOKGJ1ZltNNDFUODBfUkVHX1lFQVJdKSArIDEwMDsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0cyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdGltZSB0byB0aGUgcmVhbCB0aW1lIGNsb2NrLiAqLworc3RhdGljIGludCBtNDF0ODBfc2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdTggd2J1ZlsxICsgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFXTsKKwl1OCAqYnVmID0gJndidWZbMV07CisJdTggZHRfYWRkclsxXSA9IHsgTTQxVDgwX1JFR19TRUMgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzX2luW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGR0X2FkZHIsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFIC0gTTQxVDgwX1JFR19TRUMsCisJCQkuYnVmCT0gYnVmICsgTTQxVDgwX1JFR19TRUMsCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxICsgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFLAorCQkJLmJ1Zgk9IHdidWYsCisJCSB9LAorCX07CisKKwkvKiBSZWFkIGN1cnJlbnQgcmVnIHZhbHVlcyBpbnRvIGJ1ZlsxLi43XSAqLworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzX2luLCAyKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJd2J1ZlswXSA9IDA7IC8qIG9mZnNldCBpbnRvIHJ0YydzIHJlZ3MgKi8KKwkvKiBNZXJnZSB0aW1lLWRhdGEgYW5kIHJlZ2lzdGVyIGZsYWdzIGludG8gYnVmWzAuLjddICovCisJYnVmW000MVQ4MF9SRUdfU1NFQ10gPSAwOworCWJ1ZltNNDFUODBfUkVHX1NFQ10gPQorCQlCSU4yQkNEKHRtLT50bV9zZWMpIHwgKGJ1ZltNNDFUODBfUkVHX1NFQ10gJiB+MHg3Zik7CisJYnVmW000MVQ4MF9SRUdfTUlOXSA9CisJCUJJTjJCQ0QodG0tPnRtX21pbikgfCAoYnVmW000MVQ4MF9SRUdfTUlOXSAmIH4weDdmKTsKKwlidWZbTTQxVDgwX1JFR19IT1VSXSA9CisJCUJJTjJCQ0QodG0tPnRtX2hvdXIpIHwgKGJ1ZltNNDFUODBfUkVHX0hPVVJdICYgfjB4M2YpIDsKKwlidWZbTTQxVDgwX1JFR19XREFZXSA9CisJCSh0bS0+dG1fd2RheSAmIDB4MDcpIHwgKGJ1ZltNNDFUODBfUkVHX1dEQVldICYgfjB4MDcpOworCWJ1ZltNNDFUODBfUkVHX0RBWV0gPQorCQlCSU4yQkNEKHRtLT50bV9tZGF5KSB8IChidWZbTTQxVDgwX1JFR19EQVldICYgfjB4M2YpOworCWJ1ZltNNDFUODBfUkVHX01PTl0gPQorCQlCSU4yQkNEKHRtLT50bV9tb24gKyAxKSB8IChidWZbTTQxVDgwX1JFR19NT05dICYgfjB4MWYpOworCS8qIGFzc3VtZSAyMFlZIG5vdCAxOVlZICovCisJYnVmW000MVQ4MF9SRUdfWUVBUl0gPSBCSU4yQkNEKHRtLT50bV95ZWFyICUgMTAwKTsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAxKSAhPSAxKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DX01PRFVMRSkKK3N0YXRpYyBpbnQgbTQxdDgwX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbTQxdDgwX2RhdGEgKmNsaWVudGRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCByZWc7CisKKwlpZiAoY2xpZW50ZGF0YS0+Y2hpcC0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9CTCkgeworCQlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0ZMQUdTKTsKKwkJc2VxX3ByaW50ZihzZXEsICJiYXR0ZXJ5XHRcdDogJXNcbiIsCisJCQkgICAocmVnICYgTTQxVDgwX0ZMQUdTX0JBVFRfTE9XKSA/ICJleGhhdXN0ZWQiIDogIm9rIik7CisJfQorCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgbTQxdDgwX3J0Y19wcm9jIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gbTQxdDgwX2dldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludCBtNDF0ODBfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gbTQxdDgwX3NldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX0RFVikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfREVWX01PRFVMRSkKK3N0YXRpYyBpbnQKK200MXQ4MF9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCByYzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwljYXNlIFJUQ19BSUVfT046CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgorCQlyYyAmPSB+TTQxVDgwX0FMTU9OX0FGRTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09OOgorCQlyYyB8PSBNNDFUODBfQUxNT05fQUZFOworCQlicmVhazsKKwl9CisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTiwgcmMpIDwgMCkKKwkJZ290byBlcnI7CisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIC1FSU87Cit9CisjZWxzZQorI2RlZmluZQltNDF0ODBfcnRjX2lvY3RsIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1OCB3YnVmWzEgKyBNNDFUODBfQUxBUk1fUkVHX1NJWkVdOworCXU4ICpidWYgPSAmd2J1ZlsxXTsKKwl1OCAqcmVnID0gYnVmIC0gTTQxVDgwX1JFR19BTEFSTV9NT047CisJdTggZHRfYWRkclsxXSA9IHsgTTQxVDgwX1JFR19BTEFSTV9NT04gfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzX2luW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGR0X2FkZHIsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gTTQxVDgwX0FMQVJNX1JFR19TSVpFLAorCQkJLmJ1Zgk9IGJ1ZiwKKwkJfSwKKwl9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEgKyBNNDFUODBfQUxBUk1fUkVHX1NJWkUsCisJCQkuYnVmCT0gd2J1ZiwKKwkJIH0sCisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzX2luLCAyKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gJj0gfigweDFmIHwgTTQxVDgwX0FMTU9OX0FGRSk7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSA9IDA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fSE9VUl0gJj0gfigweDNmIHwgMHg4MCk7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fTUlOXSA9IDA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fU0VDXSA9IDA7CisKKwl3YnVmWzBdID0gTTQxVDgwX1JFR19BTEFSTV9NT047IC8qIG9mZnNldCBpbnRvIHJ0YydzIHJlZ3MgKi8KKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9TRUNdIHw9IHQtPnRpbWUudG1fc2VjID49IDAgPworCQlCSU4yQkNEKHQtPnRpbWUudG1fc2VjKSA6IDB4ODA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fTUlOXSB8PSB0LT50aW1lLnRtX21pbiA+PSAwID8KKwkJQklOMkJDRCh0LT50aW1lLnRtX21pbikgOiAweDgwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX0hPVVJdIHw9IHQtPnRpbWUudG1faG91ciA+PSAwID8KKwkJQklOMkJDRCh0LT50aW1lLnRtX2hvdXIpIDogMHg4MDsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldIHw9IHQtPnRpbWUudG1fbWRheSA+PSAwID8KKwkJQklOMkJDRCh0LT50aW1lLnRtX21kYXkpIDogMHg4MDsKKwlpZiAodC0+dGltZS50bV9tb24gPj0gMCkKKwkJcmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSB8PSBCSU4yQkNEKHQtPnRpbWUudG1fbW9uICsgMSk7CisJZWxzZQorCQlyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldIHw9IDB4NDA7CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMSkgIT0gMSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIndyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHQtPmVuYWJsZWQpIHsKKwkJcmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSB8PSBNNDFUODBfQUxNT05fQUZFOworCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfQUxBUk1fTU9OLAorCQkJCQkgICAgICByZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dKSA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGUgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbTQxdDgwX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1OCBidWZbTTQxVDgwX0FMQVJNX1JFR19TSVpFICsgMV07IC8qIGFsbCBhbGFybSByZWdzIGFuZCBmbGFncyAqLworCXU4IGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfQUxBUk1fTU9OIH07CisJdTggKnJlZyA9IGJ1ZiAtIE00MVQ4MF9SRUdfQUxBUk1fTU9OOworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gZHRfYWRkciwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSBNNDFUODBfQUxBUk1fUkVHX1NJWkUgKyAxLAorCQkJLmJ1Zgk9IGJ1ZiwKKwkJfSwKKwl9OworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdC0+dGltZS50bV9zZWMgPSAtMTsKKwl0LT50aW1lLnRtX21pbiA9IC0xOworCXQtPnRpbWUudG1faG91ciA9IC0xOworCXQtPnRpbWUudG1fbWRheSA9IC0xOworCXQtPnRpbWUudG1fbW9uID0gLTE7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fU0VDXSAmIDB4ODApKQorCQl0LT50aW1lLnRtX3NlYyA9IEJDRDJCSU4ocmVnW000MVQ4MF9SRUdfQUxBUk1fU0VDXSAmIDB4N2YpOworCWlmICghKHJlZ1tNNDFUODBfUkVHX0FMQVJNX01JTl0gJiAweDgwKSkKKwkJdC0+dGltZS50bV9taW4gPSBCQ0QyQklOKHJlZ1tNNDFUODBfUkVHX0FMQVJNX01JTl0gJiAweDdmKTsKKwlpZiAoIShyZWdbTTQxVDgwX1JFR19BTEFSTV9IT1VSXSAmIDB4ODApKQorCQl0LT50aW1lLnRtX2hvdXIgPSBCQ0QyQklOKHJlZ1tNNDFUODBfUkVHX0FMQVJNX0hPVVJdICYgMHgzZik7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSAmIDB4ODApKQorCQl0LT50aW1lLnRtX21kYXkgPSBCQ0QyQklOKHJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gJiAweDNmKTsKKwlpZiAoIShyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldICYgMHg0MCkpCisJCXQtPnRpbWUudG1fbW9uID0gQkNEMkJJTihyZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dICYgMHgxZikgLSAxOworCXQtPnRpbWUudG1feWVhciA9IC0xOworCXQtPnRpbWUudG1fd2RheSA9IC0xOworCXQtPnRpbWUudG1feWRheSA9IC0xOworCXQtPnRpbWUudG1faXNkc3QgPSAtMTsKKwl0LT5lbmFibGVkID0gISEocmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSAmIE00MVQ4MF9BTE1PTl9BRkUpOworCXQtPnBlbmRpbmcgPSAhIShyZWdbTTQxVDgwX1JFR19GTEFHU10gJiBNNDFUODBfRkxBR1NfQUYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgbTQxdDgwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZSA9IG00MXQ4MF9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IG00MXQ4MF9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBtNDF0ODBfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IG00MXQ4MF9ydGNfc2V0X2FsYXJtLAorCS5wcm9jID0gbTQxdDgwX3J0Y19wcm9jLAorCS5pb2N0bCA9IG00MXQ4MF9ydGNfaW9jdGwsCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfU1lTRlMpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTX01PRFVMRSkKK3N0YXRpYyBzc2l6ZV90IG00MXQ4MF9zeXNmc19zaG93X2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJaW50IHZhbDsKKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfRkxBR1MpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlI3hcbiIsIHZhbCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZmxhZ3MsIFNfSVJVR08sIG00MXQ4MF9zeXNmc19zaG93X2ZsYWdzLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgbTQxdDgwX3N5c2ZzX3Nob3dfc3F3ZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCB2YWw7CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX1NRVyk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlPOworCXZhbCA9ICh2YWwgPj4gNCkgJiAweGY7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMToKKwkJdmFsID0gMzI3Njg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbCA9IDMyNzY4ID4+IHZhbDsKKwl9CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Cit9CitzdGF0aWMgc3NpemVfdCBtNDF0ODBfc3lzZnNfc2V0X3Nxd2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJaW50IGFsbW9uLCBzcXc7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlpZiAodmFsKSB7CisJCWlmICghaXNfcG93ZXJfb2ZfMih2YWwpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCA9IGlsb2cyKHZhbCk7CisJCWlmICh2YWwgPT0gMTUpCisJCQl2YWwgPSAxOworCQllbHNlIGlmICh2YWwgPCAxNCkKKwkJCXZhbCA9IDE1IC0gdmFsOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogZGlzYWJsZSBTUVcsIHNldCBTUVcgZnJlcXVlbmN5ICYgcmUtZW5hYmxlICovCisJYWxtb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTik7CisJaWYgKGFsbW9uIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJc3F3ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TUVcpOworCWlmIChzcXcgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlzcXcgPSAoc3F3ICYgMHgwZikgfCAodmFsIDw8IDQpOworCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sCisJCQkJICAgICAgYWxtb24gJiB+TTQxVDgwX0FMTU9OX1NRV0UpIDwgMCB8fAorCSAgICBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TUVcsIHNxdykgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAodmFsICYmIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTiwKKwkJCQkJICAgICBhbG1vbiB8IE00MVQ4MF9BTE1PTl9TUVdFKSA8IDApCisJCXJldHVybiAtRUlPOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzcXdmcmVxLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgbTQxdDgwX3N5c2ZzX3Nob3dfc3F3ZnJlcSwgbTQxdDgwX3N5c2ZzX3NldF9zcXdmcmVxKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHJzW10gPSB7CisJJmRldl9hdHRyX2ZsYWdzLmF0dHIsCisJJmRldl9hdHRyX3Nxd2ZyZXEuYXR0ciwKKwlOVUxMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGF0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gYXR0cnMsCit9OworCitzdGF0aWMgaW50IG00MXQ4MF9zeXNmc19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmYXR0cl9ncm91cCk7Cit9CisjZWxzZQorc3RhdGljIGludCBtNDF0ODBfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV2F0Y2hkb2cgRHJpdmVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqc2F2ZV9jbGllbnQ7CisKKy8qIERlZmF1bHQgbWFyZ2luICovCisjZGVmaW5lIFdEX1RJTU8gNjAJCS8qIDEuLjMxIHNlY29uZHMgKi8KKworc3RhdGljIGludCB3ZHRfbWFyZ2luID0gV0RfVElNTzsKK21vZHVsZV9wYXJhbSh3ZHRfbWFyZ2luLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZHRfbWFyZ2luLCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0IDYwcykiKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgaW50IGJvb3RfZmxhZzsKKworLyoqCisgKgl3ZHRfcGluZzoKKyAqCisgKglSZWxvYWQgY291bnRlciBvbmUgd2l0aCB0aGUgd2F0Y2hkb2cgdGltZW91dC4gV2UgZG9uJ3QgYm90aGVyIHJlbG9hZGluZworICoJdGhlIGNhc2NhZGUgY291bnRlci4KKyAqLworc3RhdGljIHZvaWQgd2R0X3Bpbmcodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGkyY19kYXRhWzJdOworCXN0cnVjdCBpMmNfbXNnIG1zZ3MxWzFdID0geworCQl7CisJCQkuYWRkcgk9IHNhdmVfY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAyLAorCQkJLmJ1Zgk9IGkyY19kYXRhLAorCQl9LAorCX07CisJaTJjX2RhdGFbMF0gPSAweDA5OwkJLyogd2F0Y2hkb2cgcmVnaXN0ZXIgKi8KKworCWlmICh3ZHRfbWFyZ2luID4gMzEpCisJCWkyY19kYXRhWzFdID0gKHdkdF9tYXJnaW4gJiAweEZDKSB8IDB4ODM7IC8qIHJlc29sdXRpb24gPSA0cyAqLworCWVsc2UKKwkJLyoKKwkJICogV0RTID0gMSAoMHg4MCksIG11bGl0cGxpZXIgPSBXRF9USU1PLCByZXNvbHV0aW9uID0gMXMgKDB4MDIpCisJCSAqLworCQlpMmNfZGF0YVsxXSA9IHdkdF9tYXJnaW48PDIgfCAweDgyOworCisJaTJjX3RyYW5zZmVyKHNhdmVfY2xpZW50LT5hZGFwdGVyLCBtc2dzMSwgMSk7Cit9CisKKy8qKgorICoJd2R0X2Rpc2FibGU6CisgKgorICoJZGlzYWJsZXMgd2F0Y2hkb2cuCisgKi8KK3N0YXRpYyB2b2lkIHdkdF9kaXNhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBpMmNfZGF0YVsyXSwgaTJjX2J1ZlsweDEwXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzMFsyXSA9IHsKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBpMmNfZGF0YSwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gaTJjX2J1ZiwKKwkJfSwKKwl9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3MxWzFdID0geworCQl7CisJCQkuYWRkcgk9IHNhdmVfY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAyLAorCQkJLmJ1Zgk9IGkyY19kYXRhLAorCQl9LAorCX07CisKKwlpMmNfZGF0YVswXSA9IDB4MDk7CisJaTJjX3RyYW5zZmVyKHNhdmVfY2xpZW50LT5hZGFwdGVyLCBtc2dzMCwgMik7CisKKwlpMmNfZGF0YVswXSA9IDB4MDk7CisJaTJjX2RhdGFbMV0gPSAweDAwOworCWkyY190cmFuc2ZlcihzYXZlX2NsaWVudC0+YWRhcHRlciwgbXNnczEsIDEpOworfQorCisvKioKKyAqCXdkdF93cml0ZToKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKKyAqCUBidWY6IGJ1ZmZlciB0byB3cml0ZSAodW51c2VkIGFzIGRhdGEgZG9lcyBub3QgbWF0dGVyIGhlcmUKKyAqCUBjb3VudDogY291bnQgb2YgYnl0ZXMKKyAqCUBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAorICoKKyAqCUEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQorICoJd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICovCitzdGF0aWMgc3NpemVfdCB3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJLyogIENhbid0IHNlZWsgKHB3cml0ZSkgb24gdGhpcyBkZXZpY2UKKwlpZiAocHBvcyAhPSAmZmlsZS0+Zl9wb3MpCisJcmV0dXJuIC1FU1BJUEU7CisJKi8KKwlpZiAoY291bnQpIHsKKwkJd2R0X3BpbmcoKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB3ZHRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqCXdkdF9pb2N0bDoKKyAqCUBpbm9kZTogaW5vZGUgb2YgdGhlIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqCUBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKKyAqCUBhcmc6IGFyZ3VtZW50IHBvaW50ZXIKKyAqCisgKglUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncworICoJYWNjb3JkaW5nIHRvIHRoZWlyIGF2YWlsYWJsZSBmZWF0dXJlcy4gV2Ugb25seSBhY3R1YWxseSB1c2VmdWxseSBzdXBwb3J0CisgKglxdWVyeWluZyBjYXBhYmlsaXRpZXMgYW5kIGN1cnJlbnQgc3RhdHVzLgorICovCitzdGF0aWMgaW50IHdkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbmV3X21hcmdpbiwgcnY7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX1BPV0VSVU5ERVIgfCBXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCVdESU9GX1NFVFRJTUVPVVQsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIk00MVQ4MCBXVEQiCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKilhcmcsICZpZGVudCwKKwkJCQkgICAgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKGJvb3RfZmxhZywgKGludCBfX3VzZXIgKilhcmcpOworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfcGluZygpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfbWFyZ2luLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogQXJiaXRyYXJ5LCBjYW4ndCBmaW5kIHRoZSBjYXJkJ3MgbGltaXRzICovCisJCWlmIChuZXdfbWFyZ2luIDwgMSB8fCBuZXdfbWFyZ2luID4gMTI0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXdkdF9tYXJnaW4gPSBuZXdfbWFyZ2luOworCQl3ZHRfcGluZygpOworCQkvKiBGYWxsICovCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIod2R0X21hcmdpbiwgKGludCBfX3VzZXIgKilhcmcpOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ2LCAoaW50IF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHJ2ICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAicnRjLW00MXQ4MDogZGlzYWJsZSB3YXRjaGRvZ1xuIik7CisJCQl3ZHRfZGlzYWJsZSgpOworCQl9CisKKwkJaWYgKHJ2ICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJydGMtbTQxdDgwOiBlbmFibGUgd2F0Y2hkb2dcbiIpOworCQkJd2R0X3BpbmcoKTsKKwkJfQorCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyoqCisgKgl3ZHRfb3BlbjoKKyAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChNSU5PUihpbm9kZS0+aV9yZGV2KSA9PSBXQVRDSERPR19NSU5PUikgeworCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJLyoKKwkJICoJQWN0aXZhdGUKKwkJICovCisJCXdkdF9pc19vcGVuID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisvKioKKyAqCXdkdF9jbG9zZToKKyAqCUBpbm9kZTogaW5vZGUgdG8gYm9hcmQKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBib2FyZAorICoKKyAqLworc3RhdGljIGludCB3ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoTUlOT1IoaW5vZGUtPmlfcmRldikgPT0gV0FUQ0hET0dfTUlOT1IpCisJCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOworCXJldHVybiAwOworfQorCisvKioKKyAqCW5vdGlmeV9zeXM6CisgKglAdGhpczogb3VyIG5vdGlmaWVyIGJsb2NrCisgKglAY29kZTogdGhlIGV2ZW50IGJlaW5nIHJlcG9ydGVkCisgKglAdW51c2VkOiB1bnVzZWQKKyAqCisgKglPdXIgbm90aWZpZXIgaXMgY2FsbGVkIG9uIHN5c3RlbSBzaHV0ZG93bnMuIFdlIHdhbnQgdG8gdHVybiB0aGUgY2FyZAorICoJb2ZmIGF0IHJlYm9vdCBvdGhlcndpc2UgdGhlIG1hY2hpbmUgd2lsbCByZWJvb3QgYWdhaW4gZHVyaW5nIG1lbW9yeQorICoJdGVzdCBvciB3b3JzZSB5ZXQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgZnNjay4gVGhpcyB3b3VsZCBzdWNrLCBpbiBmYWN0CisgKgl0cnVzdCBtZSAtIGlmIGl0IGhhcHBlbnMgaXQgZG9lcyBzdWNrLgorICovCitzdGF0aWMgaW50IHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJICB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkKKwkJLyogRGlzYWJsZSBXYXRjaGRvZyAqLworCQl3ZHRfZGlzYWJsZSgpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJPSB3ZHRfcmVhZCwKKwkuaW9jdGwJPSB3ZHRfaW9jdGwsCisJLndyaXRlCT0gd2R0X3dyaXRlLAorCS5vcGVuCT0gd2R0X29wZW4sCisJLnJlbGVhc2UgPSB3ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfZGV2ID0geworCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lID0gIndhdGNoZG9nIiwKKwkuZm9wcyA9ICZ3ZHRfZm9wcywKK307CisKKy8qCisgKglUaGUgV0RUIGNhcmQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCit9OworI2VuZGlmIC8qIENPTkZJR19SVENfRFJWX000MVQ4MF9XRFQgKi8KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCURyaXZlciBJbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGludCBtNDF0ODBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgaSwgcmMgPSAwOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBOVUxMOworCXN0cnVjdCBydGNfdGltZSB0bTsKKwljb25zdCBzdHJ1Y3QgbTQxdDgwX2NoaXBfaW5mbyAqY2hpcDsKKwlzdHJ1Y3QgbTQxdDgwX2RhdGEgKmNsaWVudGRhdGEgPSBOVUxMOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQworCQkJCSAgICAgfCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJICJjaGlwIGZvdW5kLCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJY2hpcCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobTQxdDgwX2NoaXBfaW5mb190YmwpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAobTQxdDgwX2NoaXBfaW5mb190YmxbaV0ubmFtZSwgY2xpZW50LT5uYW1lKSkgeworCQkJY2hpcCA9ICZtNDF0ODBfY2hpcF9pbmZvX3RibFtpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghY2hpcCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGNsaWVudC0+bmFtZSk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWNsaWVudGRhdGEgPSBremFsbG9jKHNpemVvZigqY2xpZW50ZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50ZGF0YSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKGNsaWVudC0+bmFtZSwgJmNsaWVudC0+ZGV2LAorCQkJCSAgJm00MXQ4MF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJjID0gUFRSX0VSUihydGMpOworCQlydGMgPSBOVUxMOworCQlnb3RvIGV4aXQ7CisJfQorCisJY2xpZW50ZGF0YS0+cnRjID0gcnRjOworCWNsaWVudGRhdGEtPmNoaXAgPSBjaGlwOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNsaWVudGRhdGEpOworCisJLyogTWFrZSBzdXJlIEhUIChIYWx0IFVwZGF0ZSkgYml0IGlzIGNsZWFyZWQgKi8KKwlyYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfQUxBUk1fSE9VUik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBodF9lcnI7CisKKwlpZiAocmMgJiBNNDFUODBfQUxIT1VSX0hUKSB7CisJCWlmIChjaGlwLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX0hUKSB7CisJCQltNDF0ODBfZ2V0X2RhdGV0aW1lKGNsaWVudCwgJnRtKTsKKwkJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkhUIGJpdCB3YXMgc2V0IVxuIik7CisJCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsCisJCQkJICJQb3dlciBEb3duIGF0ICIKKwkJCQkgIiUwNGktJTAyaS0lMDJpICUwMmk6JTAyaTolMDJpXG4iLAorCQkJCSB0bS50bV95ZWFyICsgMTkwMCwKKwkJCQkgdG0udG1fbW9uICsgMSwgdG0udG1fbWRheSwgdG0udG1faG91ciwKKwkJCQkgdG0udG1fbWluLCB0bS50bV9zZWMpOworCQl9CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJICAgICAgTTQxVDgwX1JFR19BTEFSTV9IT1VSLAorCQkJCQkgICAgICByYyAmIH5NNDFUODBfQUxIT1VSX0hUKSA8IDApCisJCQlnb3RvIGh0X2VycjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgU1QgKHN0b3ApIGJpdCBpcyBjbGVhcmVkICovCisJcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX1NFQyk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBzdF9lcnI7CisKKwlpZiAocmMgJiBNNDFUODBfU0VDX1NUKSB7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TRUMsCisJCQkJCSAgICAgIHJjICYgfk00MVQ4MF9TRUNfU1QpIDwgMCkKKwkJCWdvdG8gc3RfZXJyOworCX0KKworCXJjID0gbTQxdDgwX3N5c2ZzX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CisJaWYgKHJjKQorCQlnb3RvIGV4aXQ7CisKKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUCisJaWYgKGNoaXAtPmZlYXR1cmVzICYgTTQxVDgwX0ZFQVRVUkVfSFQpIHsKKwkJcmMgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfZGV2KTsKKwkJaWYgKHJjKQorCQkJZ290byBleGl0OworCQlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwkJaWYgKHJjKSB7CisJCQltaXNjX2RlcmVnaXN0ZXIoJndkdF9kZXYpOworCQkJZ290byBleGl0OworCQl9CisJCXNhdmVfY2xpZW50ID0gY2xpZW50OworCX0KKyNlbmRpZgorCXJldHVybiAwOworCitzdF9lcnI6CisJcmMgPSAtRUlPOworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2FuJ3QgY2xlYXIgU1QgYml0XG4iKTsKKwlnb3RvIGV4aXQ7CitodF9lcnI6CisJcmMgPSAtRUlPOworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2FuJ3QgY2xlYXIgSFQgYml0XG4iKTsKKwlnb3RvIGV4aXQ7CisKK2V4aXQ6CisJaWYgKHJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJa2ZyZWUoY2xpZW50ZGF0YSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG00MXQ4MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbTQxdDgwX2RhdGEgKmNsaWVudGRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gY2xpZW50ZGF0YS0+cnRjOworCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfTTQxVDgwX1dEVAorCWlmIChjbGllbnRkYXRhLT5jaGlwLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX0hUKSB7CisJCW1pc2NfZGVyZWdpc3Rlcigmd2R0X2Rldik7CisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCX0KKyNlbmRpZgorCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWtmcmVlKGNsaWVudGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtNDF0ODBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm00MXQ4MCIsCisJfSwKKwkucHJvYmUgPSBtNDF0ODBfcHJvYmUsCisJLnJlbW92ZSA9IG00MXQ4MF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtNDF0ODBfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm00MXQ4MF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbTQxdDgwX3J0Y19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm00MXQ4MF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBbGV4YW5kZXIgQmlnZ2EgPGFiQG15Y2FibGUuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNUIE1pY3JvZWxlY3Ryb25pY3MgTTQxVDgwIHNlcmllcyBSVEMgSTJDIENsaWVudCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQobTQxdDgwX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KG00MXQ4MF9ydGNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiNzUyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIFNUIE00OFQ1OSBSVEMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIEF1dGhvcjogTWFyayBaaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMvbTQ4dDU5Lmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKKyNpZm5kZWYgTk9fSVJRCisjZGVmaW5lIE5PX0lSUQkoLTEpCisjZW5kaWYKKworI2RlZmluZSBNNDhUNTlfUkVBRChyZWcpCXBkYXRhLT5yZWFkX2J5dGUoZGV2LCByZWcpCisjZGVmaW5lIE00OFQ1OV9XUklURSh2YWwsIHJlZykJcGRhdGEtPndyaXRlX2J5dGUoZGV2LCByZWcsIHZhbCkKKworI2RlZmluZSBNNDhUNTlfU0VUX0JJVFMobWFzaywgcmVnKQlcCisJTTQ4VDU5X1dSSVRFKChNNDhUNTlfUkVBRChyZWcpIHwgKG1hc2spKSwgKHJlZykpCisjZGVmaW5lIE00OFQ1OV9DTEVBUl9CSVRTKG1hc2ssIHJlZykJXAorCU00OFQ1OV9XUklURSgoTTQ4VDU5X1JFQUQocmVnKSAmIH4obWFzaykpLCAocmVnKSkKKworc3RydWN0IG00OHQ1OV9wcml2YXRlIHsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsgLyogaW9tZW0gc2l6ZSAqLworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzcGlubG9ja190IGxvY2s7IC8qIHNlcmlhbGl6ZSB0aGUgTlZSQU0gYW5kIFJUQyBhY2Nlc3MgKi8KK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBnZW5lcmljIGFjY2VzcyBtZXRob2Qgd2hlbiB0aGUgY2hpcCBpcyBtZW1vcnktbWFwcGVkCisgKi8KK3N0YXRpYyB2b2lkCittNDh0NTlfbWVtX3dyaXRlYihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMsIHU4IHZhbCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXdyaXRlYih2YWwsIG00OHQ1OS0+aW9hZGRyK29mcyk7Cit9CisKK3N0YXRpYyB1OAorbTQ4dDU5X21lbV9yZWFkYihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gcmVhZGIobTQ4dDU5LT5pb2FkZHIrb2ZzKTsKK30KKworLyoKKyAqIE5PVEU6IE00OFQ1OSBvbmx5IHVzZXMgQkNEIG1vZGUKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJLyogSXNzdWUgdGhlIFJFQUQgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9SRUFELCBNNDhUNTlfQ05UTCk7CisKKwl0bS0+dG1feWVhcgk9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X1lFQVIpKTsKKwkvKiB0bV9tb24gaXMgMC0xMSAqLworCXRtLT50bV9tb24JPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9NT05USCkpIC0gMTsKKwl0bS0+dG1fbWRheQk9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01EQVkpKTsKKworCXZhbCA9IE00OFQ1OV9SRUFEKE00OFQ1OV9XREFZKTsKKwlpZiAoKHZhbCAmIE00OFQ1OV9XREFZX0NFQikgJiYgKHZhbCAmIE00OFQ1OV9XREFZX0NCKSkgeworCQlkZXZfZGJnKGRldiwgIkNlbnR1cnkgYml0IGlzIGVuYWJsZWRcbiIpOworCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIG9uZSBjZW50dXJ5ICovCisJfQorCisJdG0tPnRtX3dkYXkJPSBCQ0QyQklOKHZhbCAmIDB4MDcpOworCXRtLT50bV9ob3VyCT0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfSE9VUikgJiAweDNGKTsKKwl0bS0+dG1fbWluCT0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfTUlOKSAmIDB4N0YpOworCXRtLT50bV9zZWMJPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9TRUMpICYgMHg3Rik7CisKKwkvKiBDbGVhciB0aGUgUkVBRCBiaXQgKi8KKwlNNDhUNTlfQ0xFQVJfQklUUyhNNDhUNTlfQ05UTF9SRUFELCBNNDhUNTlfQ05UTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKGRldiwgIlJUQyByZWFkIHRpbWUgJTA0ZC0lMDJkLSUwMmQgJTAyZC8lMDJkLyUwMmRcbiIsCisJCXRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtNDh0NTlfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHZhbCA9IDA7CisKKwlkZXZfZGJnKGRldiwgIlJUQyBzZXQgdGltZSAlMDRkLSUwMmQtJTAyZCAlMDJkLyUwMmQvJTAyZFxuIiwKKwkJdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCS8qIElzc3VlIHRoZSBXUklURSBjb21tYW5kICovCisJTTQ4VDU5X1NFVF9CSVRTKE00OFQ1OV9DTlRMX1dSSVRFLCBNNDhUNTlfQ05UTCk7CisKKwlNNDhUNTlfV1JJVEUoKEJJTjJCQ0QodG0tPnRtX3NlYykgJiAweDdGKSwgTTQ4VDU5X1NFQyk7CisJTTQ4VDU5X1dSSVRFKChCSU4yQkNEKHRtLT50bV9taW4pICYgMHg3RiksIE00OFQ1OV9NSU4pOworCU00OFQ1OV9XUklURSgoQklOMkJDRCh0bS0+dG1faG91cikgJiAweDNGKSwgTTQ4VDU5X0hPVVIpOworCU00OFQ1OV9XUklURSgoQklOMkJDRCh0bS0+dG1fbWRheSkgJiAweDNGKSwgTTQ4VDU5X01EQVkpOworCS8qIHRtX21vbiBpcyAwLTExICovCisJTTQ4VDU5X1dSSVRFKChCSU4yQkNEKHRtLT50bV9tb24gKyAxKSAmIDB4MUYpLCBNNDhUNTlfTU9OVEgpOworCU00OFQ1OV9XUklURShCSU4yQkNEKHRtLT50bV95ZWFyICUgMTAwKSwgTTQ4VDU5X1lFQVIpOworCisJaWYgKHRtLT50bV95ZWFyLzEwMCkKKwkJdmFsID0gKE00OFQ1OV9XREFZX0NFQiB8IE00OFQ1OV9XREFZX0NCKTsKKwl2YWwgfD0gKEJJTjJCQ0QodG0tPnRtX3dkYXkpICYgMHgwNyk7CisJTTQ4VDU5X1dSSVRFKHZhbCwgTTQ4VDU5X1dEQVkpOworCisJLyogQ2xlYXIgdGhlIFdSSVRFIGJpdCAqLworCU00OFQ1OV9DTEVBUl9CSVRTKE00OFQ1OV9DTlRMX1dSSVRFLCBNNDhUNTlfQ05UTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19yZWFkYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWw7CisKKwkvKiBJZiBubyBpcnEsIHdlIGRvbid0IHN1cHBvcnQgQUxBUk0gKi8KKwlpZiAobTQ4dDU5LT5pcnEgPT0gTk9fSVJRKQorCQlyZXR1cm4gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkvKiBJc3N1ZSB0aGUgUkVBRCBjb21tYW5kICovCisJTTQ4VDU5X1NFVF9CSVRTKE00OFQ1OV9DTlRMX1JFQUQsIE00OFQ1OV9DTlRMKTsKKworCXRtLT50bV95ZWFyID0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfWUVBUikpOworCS8qIHRtX21vbiBpcyAwLTExICovCisJdG0tPnRtX21vbiA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01PTlRIKSkgLSAxOworCisJdmFsID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X1dEQVkpOworCWlmICgodmFsICYgTTQ4VDU5X1dEQVlfQ0VCKSAmJiAodmFsICYgTTQ4VDU5X1dEQVlfQ0IpKQorCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIG9uZSBjZW50dXJ5ICovCisKKwl0bS0+dG1fbWRheSA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX0RBVEUpKTsKKwl0bS0+dG1faG91ciA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX0hPVVIpKTsKKwl0bS0+dG1fbWluID0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfQUxBUk1fTUlOKSk7CisJdG0tPnRtX3NlYyA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX1NFQykpOworCisJLyogQ2xlYXIgdGhlIFJFQUQgYml0ICovCisJTTQ4VDU5X0NMRUFSX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkZXYsICJSVEMgcmVhZCBhbGFybSB0aW1lICUwNGQtJTAyZC0lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQl0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgYWxhcm0gdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX3NldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCXU4IG1kYXksIGhvdXIsIG1pbiwgc2VjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBJZiBubyBpcnEsIHdlIGRvbid0IHN1cHBvcnQgQUxBUk0gKi8KKwlpZiAobTQ4dDU5LT5pcnEgPT0gTk9fSVJRKQorCQlyZXR1cm4gLUVJTzsKKworCS8qCisJICogMHhmZiBtZWFucyAiYWx3YXlzIG1hdGNoIgorCSAqLworCW1kYXkgPSB0bS0+dG1fbWRheTsKKwltZGF5ID0gKG1kYXkgPj0gMSAmJiBtZGF5IDw9IDMxKSA/IEJJTjJCQ0QobWRheSkgOiAweGZmOworCWlmIChtZGF5ID09IDB4ZmYpCisJCW1kYXkgPSBNNDhUNTlfUkVBRChNNDhUNTlfTURBWSk7CisKKwlob3VyID0gdG0tPnRtX2hvdXI7CisJaG91ciA9IChob3VyIDwgMjQpID8gQklOMkJDRChob3VyKSA6IDB4MDA7CisKKwltaW4gPSB0bS0+dG1fbWluOworCW1pbiA9IChtaW4gPCA2MCkgPyBCSU4yQkNEKG1pbikgOiAweDAwOworCisJc2VjID0gdG0tPnRtX3NlYzsKKwlzZWMgPSAoc2VjIDwgNjApID8gQklOMkJDRChzZWMpIDogMHgwMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkvKiBJc3N1ZSB0aGUgV1JJVEUgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9XUklURSwgTTQ4VDU5X0NOVEwpOworCisJTTQ4VDU5X1dSSVRFKG1kYXksIE00OFQ1OV9BTEFSTV9EQVRFKTsKKwlNNDhUNTlfV1JJVEUoaG91ciwgTTQ4VDU5X0FMQVJNX0hPVVIpOworCU00OFQ1OV9XUklURShtaW4sIE00OFQ1OV9BTEFSTV9NSU4pOworCU00OFQ1OV9XUklURShzZWMsIE00OFQ1OV9BTEFSTV9TRUMpOworCisJLyogQ2xlYXIgdGhlIFdSSVRFIGJpdCAqLworCU00OFQ1OV9DTEVBUl9CSVRTKE00OFQ1OV9DTlRMX1dSSVRFLCBNNDhUNTlfQ05UTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKGRldiwgIlJUQyBzZXQgYWxhcm0gdGltZSAlMDRkLSUwMmQtJTAyZCAlMDJkLyUwMmQvJTAyZFxuIiwKKwkJdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCXJldHVybiAwOworfQorCisvKgorICogSGFuZGxlIGNvbW1hbmRzIGZyb20gdXNlci1zcGFjZQorICovCitzdGF0aWMgaW50IG00OHQ1OV9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PRkY6CS8qIGFsYXJtIGludGVycnVwdCBvZmYgKi8KKwkJTTQ4VDU5X1dSSVRFKDB4MDAsIE00OFQ1OV9JTlRSKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09OOgkvKiBhbGFybSBpbnRlcnJ1cHQgb24gKi8KKwkJTTQ4VDU5X1dSSVRFKE00OFQ1OV9JTlRSX0FGRSwgTTQ4VDU5X0lOVFIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJdmFsID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X0ZMQUdTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKworCXNlcV9wcmludGYoc2VxLCAiYmF0dGVyeVx0XHQ6ICVzXG4iLAorCQkgKHZhbCAmIE00OFQ1OV9GTEFHU19CRikgPyAibG93IiA6ICJub3JtYWwiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElSUSBoYW5kbGVyIGZvciB0aGUgUlRDCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtNDh0NTlfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gKHN0cnVjdCBkZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTggZXZlbnQ7CisKKwlzcGluX2xvY2soJm00OHQ1OS0+bG9jayk7CisJZXZlbnQgPSBNNDhUNTlfUkVBRChNNDhUNTlfRkxBR1MpOworCXNwaW5fdW5sb2NrKCZtNDh0NTktPmxvY2spOworCisJaWYgKGV2ZW50ICYgTTQ4VDU5X0ZMQUdTX0FGKSB7CisJCXJ0Y191cGRhdGVfaXJxKG00OHQ1OS0+cnRjLCAxLCAoUlRDX0FGIHwgUlRDX0lSUUYpKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG00OHQ1OV9ydGNfb3BzID0geworCS5pb2N0bAkJPSBtNDh0NTlfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUJPSBtNDh0NTlfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBtNDh0NTlfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gbTQ4dDU5X3J0Y19yZWFkYWxhcm0sCisJLnNldF9hbGFybQk9IG00OHQ1OV9ydGNfc2V0YWxhcm0sCisJLnByb2MJCT0gbTQ4dDU5X3J0Y19wcm9jLAorfTsKKworc3RhdGljIHNzaXplX3QgbTQ4dDU5X252cmFtX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCWNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXNzaXplX3QgY250ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZm9yICg7IHNpemUgPiAwICYmIHBvcyA8IE00OFQ1OV9OVlJBTV9TSVpFOyBjbnQrKywgc2l6ZS0tKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkJKmJ1ZisrID0gTTQ4VDU5X1JFQUQoY250KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIHNzaXplX3QgbTQ4dDU5X252cmFtX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzc2l6ZV90IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoOyBzaXplID4gMCAmJiBwb3MgPCBNNDhUNTlfTlZSQU1fU0laRTsgY250KyssIHNpemUtLSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJCU00OFQ1OV9XUklURSgqYnVmKyssIGNudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBtNDh0NTlfbnZyYW1fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAibnZyYW0iLAorCQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVUdPLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZWFkID0gbTQ4dDU5X252cmFtX3JlYWQsCisJLndyaXRlID0gbTQ4dDU5X252cmFtX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbTQ4dDU5X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCS8qIFRoaXMgY2hpcCBjb3VsZCBiZSBtZW1vcnktbWFwcGVkIG9yIEkvTy1tYXBwZWQgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwkJaWYgKCFyZXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJLyogSWYgd2UgYXJlIEkvTy1tYXBwZWQsIHRoZSBwbGF0Zm9ybSBzaG91bGQgcHJvdmlkZQorCQkgKiB0aGUgb3BlcmF0aW9ucyBhY2Nlc3NpbmcgY2hpcCByZWdpc3RlcnMuCisJCSAqLworCQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+d3JpdGVfYnl0ZSB8fCAhcGRhdGEtPnJlYWRfYnl0ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCS8qIHdlIGFyZSBtZW1vcnktbWFwcGVkICovCisJCWlmICghcGRhdGEpIHsKKwkJCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXBkYXRhKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJLyogRW5zdXJlIHdlIG9ubHkga21hbGxvYyBwbGF0Zm9ybSBkYXRhIG9uY2UgKi8KKwkJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJCX0KKworCQkvKiBUcnkgdG8gdXNlIHRoZSBnZW5lcmljIG1lbW9yeSByZWFkL3dyaXRlIG9wcyAqLworCQlpZiAoIXBkYXRhLT53cml0ZV9ieXRlKQorCQkJcGRhdGEtPndyaXRlX2J5dGUgPSBtNDh0NTlfbWVtX3dyaXRlYjsKKwkJaWYgKCFwZGF0YS0+cmVhZF9ieXRlKQorCQkJcGRhdGEtPnJlYWRfYnl0ZSA9IG00OHQ1OV9tZW1fcmVhZGI7CisJfQorCisJbTQ4dDU5ID0ga3phbGxvYyhzaXplb2YoKm00OHQ1OSksIEdGUF9LRVJORUwpOworCWlmICghbTQ4dDU5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW00OHQ1OS0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJbTQ4dDU5LT5pb2FkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIG00OHQ1OS0+c2l6ZSk7CisJaWYgKCFtNDh0NTktPmlvYWRkcikKKwkJZ290byBvdXQ7CisKKwkvKiBUcnkgdG8gZ2V0IGlycSBudW1iZXIuIFdlIGFsc28gY2FuIHdvcmsgaW4KKwkgKiB0aGUgbW9kZSB3aXRob3V0IElSUS4KKwkgKi8KKwltNDh0NTktPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKG00OHQ1OS0+aXJxIDwgMCkKKwkJbTQ4dDU5LT5pcnEgPSBOT19JUlE7CisKKwlpZiAobTQ4dDU5LT5pcnEgIT0gTk9fSVJRKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKG00OHQ1OS0+aXJxLCBtNDh0NTlfcnRjX2ludGVycnVwdCwKKwkJCUlSUUZfU0hBUkVELCAicnRjLW00OHQ1OSIsICZwZGV2LT5kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJbTQ4dDU5LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJtNDh0NTkiLCAmcGRldi0+ZGV2LAorCQkJCSZtNDh0NTlfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIobTQ4dDU5LT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIobTQ4dDU5LT5ydGMpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmbTQ4dDU5X252cmFtX2F0dHIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2luaXQoJm00OHQ1OS0+bG9jayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbTQ4dDU5KTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmICghSVNfRVJSKG00OHQ1OS0+cnRjKSkKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKG00OHQ1OS0+cnRjKTsKKwlpZiAobTQ4dDU5LT5pcnEgIT0gTk9fSVJRKQorCQlmcmVlX2lycShtNDh0NTktPmlycSwgJnBkZXYtPmRldik7CisJaWYgKG00OHQ1OS0+aW9hZGRyKQorCQlpb3VubWFwKG00OHQ1OS0+aW9hZGRyKTsKKwlpZiAobTQ4dDU5KQorCQlrZnJlZShtNDh0NTkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG00OHQ1OV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZtNDh0NTlfbnZyYW1fYXR0cik7CisJaWYgKCFJU19FUlIobTQ4dDU5LT5ydGMpKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIobTQ4dDU5LT5ydGMpOworCWlmIChtNDh0NTktPmlvYWRkcikKKwkJaW91bm1hcChtNDh0NTktPmlvYWRkcik7CisJaWYgKG00OHQ1OS0+aXJxICE9IE5PX0lSUSkKKwkJZnJlZV9pcnEobTQ4dDU5LT5pcnEsICZwZGV2LT5kZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKG00OHQ1OSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG00OHQ1OV9ydGNfcGxhdGRydiA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLW00OHQ1OSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IG00OHQ1OV9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtNDh0NTlfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtNDh0NTlfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtNDh0NTlfcnRjX3BsYXRkcnYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbTQ4dDU5X3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm00OHQ1OV9ydGNfcGxhdGRydik7Cit9CisKK21vZHVsZV9pbml0KG00OHQ1OV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChtNDh0NTlfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJrIFpoYW4gPHJvbmdrYWkuemhhbkB3aW5kcml2ZXIuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNNDhUNTkgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKaW5kZXggMDliYmU1Ny4uNmI2N2I1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCkBAIC0xMywxMyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjQiCi0KLS8qIEFkZHJlc3NlcyB0byBzY2FuICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAvKiAweDMyLCovIEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qIEluc21vZCBwYXJhbWV0ZXJzICovCi1JMkNfQ0xJRU5UX0lOU01PRDsKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNSIKIAogCiAvKgpAQCAtODgsOSArODIsNiBAQAogCXVuc2lnbmVkCQloYXNfaXJxOjE7CiAJY2hhcgkJCWJ1ZlsxN107CiAJY2hhcgkJCSpyZWdzOwotCi0JLyogb24gY29udmVyc2lvbiB0byBhICJuZXcgc3R5bGUiIGkyYyBkcml2ZXIsIHRoaXMgdmFuaXNoZXMgKi8KLQlzdHJ1Y3QgaTJjX2NsaWVudAlkZXY7CiB9OwogCiBzdGF0aWMgaW50IHJzNWNfZ2V0X3JlZ3Moc3RydWN0IHJzNWMzNzIgKnJzNWMpCkBAIC00ODMsMjUgKzQ3NCwzNSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIHJzNWNfc3lzZnNfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3RyaW0pOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9vc2MpOworfQorCiAjZWxzZQogc3RhdGljIGludCByczVjX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIHZvaWQgcnM1Y19zeXNmc191bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiBub3RoaW5nICovCit9CiAjZW5kaWYJLyogU1lTRlMgKi8KIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJzNWMzNzJfZHJpdmVyOwogCi1zdGF0aWMgaW50IHJzNWMzNzJfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCitzdGF0aWMgaW50IHJzNWMzNzJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCByczVjMzcyICpyczVjMzcyOwogCXN0cnVjdCBydGNfdGltZSB0bTsKIAotCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNTE0LDM1ICs1MTUsMjIgQEAKIAkvKiB3ZSByZWFkIHJlZ2lzdGVycyAweDBmIHRoZW4gMHgwMC0weDBmOyBza2lwIHRoZSBmaXJzdCBvbmUgKi8KIAlyczVjMzcyLT5yZWdzPSZyczVjMzcyLT5idWZbMV07CiAKLQkvKiBPbiBjb252ZXJzaW9uIHRvIGEgIm5ldyBzdHlsZSIgaTJjIGRyaXZlciwgd2UnbGwgYmUgaGFuZGVkCi0JICogdGhlIGkyY19jbGllbnQgKHdlIHdvbid0IGNyZWF0ZSBpdCkKLQkgKi8KLQljbGllbnQgPSAmcnM1YzM3Mi0+ZGV2OwogCXJzNWMzNzItPmNsaWVudCA9IGNsaWVudDsKLQotCS8qIEkyQyBjbGllbnQgKi8KLQljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCWNsaWVudC0+ZHJpdmVyID0gJnJzNWMzNzJfZHJpdmVyOwotCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0KLQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgcnM1YzM3Ml9kcml2ZXIuZHJpdmVyLm5hbWUsIEkyQ19OQU1FX1NJWkUpOwotCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcnM1YzM3Mik7CiAKLQkvKiBJbmZvcm0gdGhlIGkyYyBsYXllciAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCi0JCWdvdG8gZXhpdF9rZnJlZTsKLQogCWVyciA9IHJzNWNfZ2V0X3JlZ3MocnM1YzM3Mik7CiAJaWYgKGVyciA8IDApCi0JCWdvdG8gZXhpdF9kZXRhY2g7CisJCWdvdG8gZXhpdF9rZnJlZTsKIAotCS8qIEZvciAibmV3IHN0eWxlIiBkcml2ZXJzLCBpcnEgaXMgaW4gaTJjX2NsaWVudCBhbmQgY2hpcCB0eXBlCi0JICogaW5mbyBjb21lcyBmcm9tIGkyY19jbGllbnQuZGV2LnBsYXRmb3JtX2RhdGEuICBNZWFud2hpbGU6Ci0JICoKLQkgKiBTVElDSyBCT0FSRC1TUEVDSUZJQyBTRVRVUCBDT0RFIFJJR0hUIEhFUkUKLQkgKi8KLQlpZiAocnM1YzM3Mi0+dHlwZSA9PSBydGNfdW5kZWYpIHsKKwlpZiAoc3RyY21wKGNsaWVudC0+bmFtZSwgInJzNWMzNzJhIikgPT0gMCkKKwkJcnM1YzM3Mi0+dHlwZSA9IHJ0Y19yczVjMzcyYTsKKwllbHNlIGlmIChzdHJjbXAoY2xpZW50LT5uYW1lLCAicnM1YzM3MmIiKSA9PSAwKQorCQlyczVjMzcyLT50eXBlID0gcnRjX3JzNWMzNzJiOworCWVsc2UgaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsICJydjVjMzg2IikgPT0gMCkKKwkJcnM1YzM3Mi0+dHlwZSA9IHJ0Y19ydjVjMzg2OworCWVsc2UgaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsICJydjVjMzg3YSIpID09IDApCisJCXJzNWMzNzItPnR5cGUgPSBydGNfcnY1YzM4N2E7CisJZWxzZSB7CiAJCXJzNWMzNzItPnR5cGUgPSBydGNfcnM1YzM3MmI7CiAJCWRldl93YXJuKCZjbGllbnQtPmRldiwgImFzc3VtaW5nIHJzNWMzNzJiXG4iKTsKIAl9CkBAIC01NjcsNyArNTU1LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmtub3duIFJUQyB0eXBlXG4iKTsKLQkJZ290byBleGl0X2RldGFjaDsKKwkJZ290byBleGl0X2tmcmVlOwogCX0KIAogCS8qIGlmIHRoZSBvc2NpbGxhdG9yIGxvc3QgcG93ZXIgYW5kIG5vIG90aGVyIHNvZnR3YXJlIChsaWtlCkBAIC02MDEsNyArNTg5LDcgQEAKIAogCQlpZiAoKGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMykpICE9IDMpIHsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAic2V0dXAgZXJyb3JcbiIpOwotCQkJZ290byBleGl0X2RldGFjaDsKKwkJCWdvdG8gZXhpdF9rZnJlZTsKIAkJfQogCQlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSA9IGJ1ZlsxXTsKIAkJcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl0gPSBidWZbMl07CkBAIC02MjEsMTQgKzYwOSwxNCBAQAogCQkJcnM1YzM3Mi0+dGltZTI0ID8gIjI0aHIiIDogImFtL3BtIgogCQkJKTsKIAotCS8qIEZJWE1FIHdoZW4gY2xpZW50LT5pcnEgZXhpc3RzLCB1c2UgaXQgdG8gcmVnaXN0ZXIgYWxhcm0gaXJxICovCisJLyogUkVWSVNJVCB1c2UgY2xpZW50LT5pcnEgdG8gcmVnaXN0ZXIgYWxhcm0gaXJxIC4uLiAqLwogCiAJcnM1YzM3Mi0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihyczVjMzcyX2RyaXZlci5kcml2ZXIubmFtZSwKIAkJCQkmY2xpZW50LT5kZXYsICZyczVjMzcyX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKIAogCWlmIChJU19FUlIocnM1YzM3Mi0+cnRjKSkgewogCQllcnIgPSBQVFJfRVJSKHJzNWMzNzItPnJ0Yyk7Ci0JCWdvdG8gZXhpdF9kZXRhY2g7CisJCWdvdG8gZXhpdF9rZnJlZTsKIAl9CiAKIAllcnIgPSByczVjX3N5c2ZzX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CkBAIC02NDAsOSArNjI4LDYgQEAKIGV4aXRfZGV2cmVnOgogCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihyczVjMzcyLT5ydGMpOwogCi1leGl0X2RldGFjaDoKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCiBleGl0X2tmcmVlOgogCWtmcmVlKHJzNWMzNzIpOwogCkBAIC02NTAsMjQgKzYzNSwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcnM1YzM3Ml9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCByczVjMzcyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgcnM1YzM3Ml9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBpbnQgcnM1YzM3Ml9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlpbnQgZXJyOwogCXN0cnVjdCByczVjMzcyICpyczVjMzcyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlpZiAocnM1YzM3Mi0+cnRjKQotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnM1YzM3Mi0+cnRjKTsKLQotCS8qIFJFVklTSVQgcHJvcGVybHkgZGVzdHJveSB0aGUgc3lzZnMgZmlsZXMgLi4uICovCi0KLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQotCQlyZXR1cm4gZXJyOwotCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJzNWMzNzItPnJ0Yyk7CisJcnM1Y19zeXNmc191bnJlZ2lzdGVyKCZjbGllbnQtPmRldik7CiAJa2ZyZWUocnM1YzM3Mik7CiAJcmV0dXJuIDA7CiB9CkBAIC02NzYsOCArNjQ5LDggQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAicnRjLXJzNWMzNzIiLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyCT0gJnJzNWMzNzJfYXR0YWNoLAotCS5kZXRhY2hfY2xpZW50CT0gJnJzNWMzNzJfZGV0YWNoLAorCS5wcm9iZQkJPSByczVjMzcyX3Byb2JlLAorCS5yZW1vdmUJCT0gcnM1YzM3Ml9yZW1vdmUsCiB9OwogCiBzdGF0aWMgX19pbml0IGludCByczVjMzcyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCmluZGV4IDEzNDA0NTEuLjM1NzY1ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwpAQCAtNzQ3LDE0ICs3NDcsOSBAQAogc3RhdGljIHZvaWQgX19leGl0CiBkY3NzYmxrX2V4aXQodm9pZCkKIHsKLQlpbnQgcmM7Ci0KIAlQUklOVF9ERUJVRygiRENTU0JMT0NLIEVYSVQuLi5cbiIpOwogCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKLQlyYyA9IHVucmVnaXN0ZXJfYmxrZGV2KGRjc3NibGtfbWFqb3IsIERDU1NCTEtfTkFNRSk7Ci0JaWYgKHJjKSB7Ci0JCVBSSU5UX0VSUigidW5yZWdpc3Rlcl9ibGtkZXYoKSBmYWlsZWQhXG4iKTsKLQl9CisJdW5yZWdpc3Rlcl9ibGtkZXYoZGNzc2Jsa19tYWpvciwgRENTU0JMS19OQU1FKTsKIAlQUklOVF9ERUJVRygiLi4uZmluaXNoZWQhXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGguaAppbmRleCBiMzRlYjgyLi5lYzE4YmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGguaAorKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGguaApAQCAtMjExLDYgKzIxMSwxMCBAQAogCS8qIGluaXRpYWwgdmFsdWVzIHdoZW4gbWVhc3VyaW5nIHN0YXJ0cyAqLwogCXVuc2lnbmVkIGxvbmcgaW5pdGlhbF9yeF9wYWNrZXRzOwogCXVuc2lnbmVkIGxvbmcgaW5pdGlhbF90eF9wYWNrZXRzOworCS8qIGluYm91bmQgc2NhdHRlciBnYXRoZXIgZGF0YSAqLworCXVuc2lnbmVkIGludCBzZ19za2JzX3J4OworCXVuc2lnbmVkIGludCBzZ19mcmFnc19yeDsKKwl1bnNpZ25lZCBpbnQgc2dfYWxsb2NfcGFnZV9yeDsKIH07CiAKIC8qIFJvdXRpbmcgc3R1ZmYgKi8KQEAgLTM0MSw2ICszNDUsOSBAQAogCiAjZGVmaW5lIFFFVEhfSVBfSEVBREVSX1NJWkUgNDAKIAorLyogbGFyZ2UgcmVjZWl2ZSBzY2F0dGVyIGdhdGhlciBjb3B5IGJyZWFrICovCisjZGVmaW5lIFFFVEhfUlhfU0dfQ0IgKFBBR0VfU0laRSA+PiAxKQorCiBzdHJ1Y3QgcWV0aF9oZHJfbGF5ZXIzIHsKIAlfX3U4ICBpZDsKIAlfX3U4ICBmbGFnczsKQEAgLTc3MSw2ICs3NzgsNyBAQAogCWludCBsYXllcjI7CiAJZW51bSBxZXRoX2xhcmdlX3NlbmRfdHlwZXMgbGFyZ2Vfc2VuZDsKIAlpbnQgcGVyZm9ybWFuY2Vfc3RhdHM7CisJaW50IHJ4X3NnX2NiOwogfTsKIAogLyoKQEAgLTgyOCw2ICs4MzYsNyBAQAogCWludCAoKm9yaWdfaGFyZF9oZWFkZXIpKHN0cnVjdCBza19idWZmICosc3RydWN0IG5ldF9kZXZpY2UgKiwKIAkJCQl1bnNpZ25lZCBzaG9ydCx2b2lkICosdm9pZCAqLHVuc2lnbmVkKTsKIAlzdHJ1Y3QgcWV0aF9vc25faW5mbyBvc25faW5mbzsKKwlhdG9taWNfdCBmb3JjZV9hbGxvY19za2I7CiB9OwogCiBzdHJ1Y3QgcWV0aF9jYXJkX2xpc3Rfc3RydWN0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCmluZGV4IDg2YjBjNDQuLjU3ZjY5NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYwpAQCAtMTA1NCw2ICsxMDU0LDcgQEAKIAllbHNlCiAJCWNhcmQtPm9wdGlvbnMubGF5ZXIyID0gMDsKIAljYXJkLT5vcHRpb25zLnBlcmZvcm1hbmNlX3N0YXRzID0gMDsKKwljYXJkLT5vcHRpb25zLnJ4X3NnX2NiID0gUUVUSF9SWF9TR19DQjsKIH0KIAogLyoqCkBAIC0xOTM0LDYgKzE5MzUsNyBAQAogCQkJYXRvbWljX2luYygmcmVwbHktPnJlY2VpdmVkKTsKIAkJCXdha2VfdXAoJnJlcGx5LT53YWl0X3EpOwogCQl9CisJCWNwdV9yZWxheCgpOwogCX07CiAJcmMgPSByZXBseS0+cmM7CiAJcWV0aF9wdXRfcmVwbHkocmVwbHkpOwpAQCAtMjI1OCw2ICsyMjYwLDg5IEBACiAJcmV0dXJuIHNrYjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK3FldGhfY3JlYXRlX3NrYl9mcmFnKHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICplbGVtZW50LAorCQkgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgICBpbnQgb2Zmc2V0LCBpbnQgKnBmcmFnLCBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZWxlbWVudC0+YWRkcik7CisJaWYgKCpwZnJhZyA9PSAwKSB7CisJCS8qIHRoZSB1cHBlciBwcm90b2NvbCBsYXllcnMgYXNzdW1lIHRoYXQgdGhlcmUgaXMgZGF0YSBpbiB0aGUKKwkJICogc2tiIGl0c2VsZi4gQ29weSBhIHNtYWxsIGFtb3VudCAoNjQgYnl0ZXMpIHRvIG1ha2UgdGhlbQorCQkgKiBoYXBweS4gKi8KKwkJKnBza2IgPSBkZXZfYWxsb2Nfc2tiKDY0ICsgUUVUSF9GQUtFX0xMX0xFTl9FVEgpOworCQlpZiAoISgqcHNrYikpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc2tiX3Jlc2VydmUoKnBza2IsIFFFVEhfRkFLRV9MTF9MRU5fRVRIKTsKKwkJaWYgKGRhdGFfbGVuIDw9IDY0KSB7CisJCQltZW1jcHkoc2tiX3B1dCgqcHNrYiwgZGF0YV9sZW4pLCBlbGVtZW50LT5hZGRyICsgb2Zmc2V0LAorCQkJCWRhdGFfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCWdldF9wYWdlKHBhZ2UpOworCQkJbWVtY3B5KHNrYl9wdXQoKnBza2IsIDY0KSwgZWxlbWVudC0+YWRkciArIG9mZnNldCwgNjQpOworCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKCpwc2tiLCAqcGZyYWcsIHBhZ2UsIG9mZnNldCArIDY0LAorCQkJCWRhdGFfbGVuIC0gNjQpOworCQkJKCpwc2tiKS0+ZGF0YV9sZW4gKz0gZGF0YV9sZW4gLSA2NDsKKwkJCSgqcHNrYiktPmxlbgkgICs9IGRhdGFfbGVuIC0gNjQ7CisJCQkoKnBza2IpLT50cnVlc2l6ZSArPSBkYXRhX2xlbiAtIDY0OworCQl9CisJfSBlbHNlIHsKKwkJZ2V0X3BhZ2UocGFnZSk7CisJCXNrYl9maWxsX3BhZ2VfZGVzYygqcHNrYiwgKnBmcmFnLCBwYWdlLCBvZmZzZXQsIGRhdGFfbGVuKTsKKwkJKCpwc2tiKS0+ZGF0YV9sZW4gKz0gZGF0YV9sZW47CisJCSgqcHNrYiktPmxlbgkgICs9IGRhdGFfbGVuOworCQkoKnBza2IpLT50cnVlc2l6ZSArPSBkYXRhX2xlbjsKKwl9CisJKCpwZnJhZykrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqCitxZXRoX2ZpbmRfZnJlZV9idWZmZXJfcG9vbF9lbnRyeShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBsaDsKKwlzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqZW50cnk7CisJaW50IGksIGZyZWU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAobGlzdF9lbXB0eSgmY2FyZC0+cWRpby5pbl9idWZfcG9vbC5lbnRyeV9saXN0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHBsaCwgJmNhcmQtPnFkaW8uaW5fYnVmX3Bvb2wuZW50cnlfbGlzdCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocGxoLCBzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSwgbGlzdCk7CisJCWZyZWUgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpOyArK2kpIHsKKwkJCWlmIChwYWdlX2NvdW50KHZpcnRfdG9fcGFnZShlbnRyeS0+ZWxlbWVudHNbaV0pKSA+IDEpIHsKKwkJCQlmcmVlID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZnJlZSkgeworCQkJbGlzdF9kZWxfaW5pdCgmZW50cnktPmxpc3QpOworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJfQorCisJLyogbm8gZnJlZSBidWZmZXIgaW4gcG9vbCBzbyB0YWtlIGZpcnN0IG9uZSBhbmQgc3dhcCBwYWdlcyAqLworCWVudHJ5ID0gbGlzdF9lbnRyeShjYXJkLT5xZGlvLmluX2J1Zl9wb29sLmVudHJ5X2xpc3QubmV4dCwKKwkJCXN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5LCBsaXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpOyArK2kpIHsKKwkJaWYgKHBhZ2VfY291bnQodmlydF90b19wYWdlKGVudHJ5LT5lbGVtZW50c1tpXSkpID4gMSkgeworCQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQ3xHRlBfRE1BKTsKKwkJCWlmICghcGFnZSkgeworCQkJCXJldHVybiBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZW50cnktPmVsZW1lbnRzW2ldKTsKKwkJCQllbnRyeS0+ZWxlbWVudHNbaV0gPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCQkJaWYgKGNhcmQtPm9wdGlvbnMucGVyZm9ybWFuY2Vfc3RhdHMpCisJCQkJCWNhcmQtPnBlcmZfc3RhdHMuc2dfYWxsb2NfcGFnZV9yeCsrOworCQkJfQorCQl9CisJfQorCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKKwlyZXR1cm4gZW50cnk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCiBxZXRoX2dldF9uZXh0X3NrYihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3QgcWRpb19idWZmZXIgKmJ1ZmZlciwKIAkJICBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqKl9fZWxlbWVudCwgaW50ICpfX29mZnNldCwKQEAgLTIyNjksNiArMjM1NCw4IEBACiAJaW50IHNrYl9sZW47CiAJdm9pZCAqZGF0YV9wdHI7CiAJaW50IGRhdGFfbGVuOworCWludCB1c2Vfcnhfc2cgPSAwOworCWludCBmcmFnID0gMDsKIAogCVFFVEhfREJGX1RFWFQodHJhY2UsNiwibmV4dHNrYiIpOwogCS8qIHFldGhfaGRyIG11c3Qgbm90IGNyb3NzIGVsZW1lbnQgYm91bmRhcmllcyAqLwpAQCAtMjI5MywyMyArMjM4MCw0MyBAQAogCiAJaWYgKCFza2JfbGVuKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoY2FyZC0+b3B0aW9ucy5mYWtlX2xsKXsKLQkJaWYoY2FyZC0+ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyX1RSKXsKLQkJCWlmICghKHNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuK1FFVEhfRkFLRV9MTF9MRU5fVFIsICpoZHIpKSkKLQkJCQlnb3RvIG5vX21lbTsKLQkJCXNrYl9yZXNlcnZlKHNrYixRRVRIX0ZBS0VfTExfTEVOX1RSKTsKKwlpZiAoKHNrYl9sZW4gPj0gY2FyZC0+b3B0aW9ucy5yeF9zZ19jYikgJiYKKwkgICAgKCEoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TTikpICYmCisJICAgICghYXRvbWljX3JlYWQoJmNhcmQtPmZvcmNlX2FsbG9jX3NrYikpKSB7CisJCXVzZV9yeF9zZyA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKGNhcmQtPm9wdGlvbnMuZmFrZV9sbCkgeworCQkJaWYgKGNhcmQtPmRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUikgeworCQkJCWlmICghKHNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuICsKKwkJCQkJCVFFVEhfRkFLRV9MTF9MRU5fVFIsICpoZHIpKSkKKwkJCQkJZ290byBub19tZW07CisJCQkJc2tiX3Jlc2VydmUoc2tiLCBRRVRIX0ZBS0VfTExfTEVOX1RSKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCEoc2tiID0gcWV0aF9nZXRfc2tiKHNrYl9sZW4gKworCQkJCQkJUUVUSF9GQUtFX0xMX0xFTl9FVEgsICpoZHIpKSkKKwkJCQkJZ290byBub19tZW07CisJCQkJc2tiX3Jlc2VydmUoc2tiLCBRRVRIX0ZBS0VfTExfTEVOX0VUSCk7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoIShza2IgPSBxZXRoX2dldF9za2Ioc2tiX2xlbitRRVRIX0ZBS0VfTExfTEVOX0VUSCwgKmhkcikpKQorCQkJc2tiID0gcWV0aF9nZXRfc2tiKHNrYl9sZW4sICpoZHIpOworCQkJaWYgKCFza2IpCiAJCQkJZ290byBub19tZW07Ci0JCQlza2JfcmVzZXJ2ZShza2IsUUVUSF9GQUtFX0xMX0xFTl9FVEgpOwogCQl9Ci0JfSBlbHNlIGlmICghKHNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuLCAqaGRyKSkpCi0JCWdvdG8gbm9fbWVtOworCX0KKwogCWRhdGFfcHRyID0gZWxlbWVudC0+YWRkciArIG9mZnNldDsKIAl3aGlsZSAoc2tiX2xlbikgewogCQlkYXRhX2xlbiA9IG1pbihza2JfbGVuLCAoaW50KShlbGVtZW50LT5sZW5ndGggLSBvZmZzZXQpKTsKLQkJaWYgKGRhdGFfbGVuKQotCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBkYXRhX2xlbiksIGRhdGFfcHRyLCBkYXRhX2xlbik7CisJCWlmIChkYXRhX2xlbikgeworCQkJaWYgKHVzZV9yeF9zZykgeworCQkJCWlmIChxZXRoX2NyZWF0ZV9za2JfZnJhZyhlbGVtZW50LCAmc2tiLCBvZmZzZXQsCisJCQkJICAgICZmcmFnLCBkYXRhX2xlbikpCisJCQkJCWdvdG8gbm9fbWVtOworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIGRhdGFfbGVuKSwgZGF0YV9wdHIsCisJCQkJCWRhdGFfbGVuKTsKKwkJCX0KKwkJfQogCQlza2JfbGVuIC09IGRhdGFfbGVuOwogCQlpZiAoc2tiX2xlbil7CiAJCQlpZiAocWV0aF9pc19sYXN0X3NiYWxlKGVsZW1lbnQpKXsKQEAgLTIzMzEsNiArMjQzOCwxMCBAQAogCX0KIAkqX19lbGVtZW50ID0gZWxlbWVudDsKIAkqX19vZmZzZXQgPSBvZmZzZXQ7CisJaWYgKHVzZV9yeF9zZyAmJiBjYXJkLT5vcHRpb25zLnBlcmZvcm1hbmNlX3N0YXRzKSB7CisJCWNhcmQtPnBlcmZfc3RhdHMuc2dfc2tic19yeCsrOworCQljYXJkLT5wZXJmX3N0YXRzLnNnX2ZyYWdzX3J4ICs9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJfQogCXJldHVybiBza2I7CiBub19tZW06CiAJaWYgKG5ldF9yYXRlbGltaXQoKSl7CkBAIC0yNjA4LDI4ICsyNzE5LDE1IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnkgKgotcWV0aF9nZXRfYnVmZmVyX3Bvb2xfZW50cnkoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqZW50cnk7Ci0KLQlRRVRIX0RCRl9URVhUKHRyYWNlLCA2LCAiZ3RiZnBsZW4iKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmNhcmQtPnFkaW8uaW5fYnVmX3Bvb2wuZW50cnlfbGlzdCkpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KGNhcmQtPnFkaW8uaW5fYnVmX3Bvb2wuZW50cnlfbGlzdC5uZXh0LAotCQkJCXN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5LCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmZW50cnktPmxpc3QpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogcWV0aF9pbml0X2lucHV0X2J1ZmZlcihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3QgcWV0aF9xZGlvX2J1ZmZlciAqYnVmKQogewogCXN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5ICpwb29sX2VudHJ5OwogCWludCBpOwotIAotCXBvb2xfZW50cnkgPSBxZXRoX2dldF9idWZmZXJfcG9vbF9lbnRyeShjYXJkKTsKKworCXBvb2xfZW50cnkgPSBxZXRoX2ZpbmRfZnJlZV9idWZmZXJfcG9vbF9lbnRyeShjYXJkKTsKKwlpZiAoIXBvb2xfZW50cnkpCisJCXJldHVybiAxOwogCS8qCiAJICogc2luY2UgdGhlIGJ1ZmZlciBpcyBhY2Nlc3NlZCBvbmx5IGZyb20gdGhlIGlucHV0X3Rhc2tsZXQKIAkgKiB0aGVyZSBzaG91bGRuJ3QgYmUgYSBuZWVkIHRvIHN5bmNocm9uaXplOyBhbHNvLCBzaW5jZSB3ZSB1c2UKQEAgLTI2NDgsNiArMjc0Niw3IEBACiAJCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5mbGFncyA9IDA7CiAJfQogCWJ1Zi0+c3RhdGUgPSBRRVRIX1FESU9fQlVGX0VNUFRZOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjY4Miw2ICsyNzgxLDcgQEAKIAlpbnQgY291bnQ7CiAJaW50IGk7CiAJaW50IHJjOworCWludCBuZXdjb3VudCA9IDA7CiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLDYsInF1ZWluYnVmIik7CiAJY291bnQgPSAoaW5kZXggPCBxdWV1ZS0+bmV4dF9idWZfdG9faW5pdCk/CkBAIC0yNjkyLDkgKzI3OTIsMjcgQEAKIAkvKiBvbmx5IHJlcXVldWUgYXQgYSBjZXJ0YWluIHRocmVzaG9sZCB0byBhdm9pZCBTSUdBcyAqLwogCWlmIChjb3VudCA+PSBRRVRIX0lOX0JVRl9SRVFVRVVFX1RIUkVTSE9MRChjYXJkKSl7CiAJCWZvciAoaSA9IHF1ZXVlLT5uZXh0X2J1Zl90b19pbml0OwotCQkgICAgIGkgPCBxdWV1ZS0+bmV4dF9idWZfdG9faW5pdCArIGNvdW50OyArK2kpCi0JCQlxZXRoX2luaXRfaW5wdXRfYnVmZmVyKGNhcmQsCi0JCQkJJnF1ZXVlLT5idWZzW2kgJSBRRElPX01BWF9CVUZGRVJTX1BFUl9RXSk7CisJCSAgICAgaSA8IHF1ZXVlLT5uZXh0X2J1Zl90b19pbml0ICsgY291bnQ7ICsraSkgeworCQkJaWYgKHFldGhfaW5pdF9pbnB1dF9idWZmZXIoY2FyZCwKKwkJCQkmcXVldWUtPmJ1ZnNbaSAlIFFESU9fTUFYX0JVRkZFUlNfUEVSX1FdKSkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQluZXdjb3VudCsrOworCQkJfQorCQl9CisKKwkJaWYgKG5ld2NvdW50IDwgY291bnQpIHsKKwkJCS8qIHdlIGFyZSBpbiBtZW1vcnkgc2hvcnRhZ2Ugc28gd2Ugc3dpdGNoIGJhY2sgdG8KKwkJCSAgIHRyYWRpdGlvbmFsIHNrYiBhbGxvY2F0aW9uIGFuZCBkcm9wIHBhY2thZ2VzICovCisJCQlpZiAoYXRvbWljX2NtcHhjaGcoJmNhcmQtPmZvcmNlX2FsbG9jX3NrYiwgMCwgMSkpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkicWV0aDogc3dpdGNoIHRvIGFsbG9jIHNrYlxuIik7CisJCQljb3VudCA9IG5ld2NvdW50OworCQl9IGVsc2UgeworCQkJaWYgKGF0b21pY19jbXB4Y2hnKCZjYXJkLT5mb3JjZV9hbGxvY19za2IsIDEsIDApKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInFldGg6IHN3aXRjaCB0byBzZ1xuIik7CisJCX0KKwogCQkvKgogCQkgKiBhY2NvcmRpbmcgdG8gb2xkIGNvZGUgaXQgc2hvdWxkIGJlIGF2b2lkZWQgdG8gcmVxdWV1ZSBhbGwKIAkJICogMTI4IGJ1ZmZlcnMgaW4gb3JkZXIgdG8gYmVuZWZpdCBmcm9tIFBDSSBhdm9pZGFuY2UuCkBAIC02NDk0LDYgKzY2MTIsNyBAQAogCiAJUUVUSF9EQkZfVEVYVChzZXR1cCwgMiwgImhyZHNldHVwIik7CiAKKwlhdG9taWNfc2V0KCZjYXJkLT5mb3JjZV9hbGxvY19za2IsIDApOwogcmV0cnk6CiAJaWYgKHJldHJpZXMgPCAzKXsKIAkJUFJJTlRfV0FSTigiUmV0cnlpbmcgdG8gZG8gSURYIGFjdGl2YXRlcy5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Byb2MuYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9wcm9jLmMKaW5kZXggODlkNTZjOC4uZjFmZjE2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Byb2MuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfcHJvYy5jCkBAIC0yMTIsNiArMjEyLDEyIEBACiAJCSAgICAgICIgIFNrYiBmcmFnbWVudHMgc2VudCBpbiBTRyBtb2RlICAgICAgICAgIDogJXVcblxuIiwKIAkJICAgICAgY2FyZC0+cGVyZl9zdGF0cy5zZ19za2JzX3NlbnQsCiAJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMuc2dfZnJhZ3Nfc2VudCk7CisJc2VxX3ByaW50ZihzLCAiICBTa2JzIHJlY2VpdmVkIGluIFNHIG1vZGUgICAgICAgICAgICAgICA6ICV1XG4iCisJCSAgICAgICIgIFNrYiBmcmFnbWVudHMgcmVjZWl2ZWQgaW4gU0cgbW9kZSAgICAgIDogJXVcbiIKKwkJICAgICAgIiAgUGFnZSBhbGxvY2F0aW9ucyBmb3IgcnggU0cgbW9kZSAgICAgICAgOiAldVxuXG4iLAorCQkgICAgICBjYXJkLT5wZXJmX3N0YXRzLnNnX3NrYnNfcngsCisJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMuc2dfZnJhZ3NfcngsCisJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMuc2dfYWxsb2NfcGFnZV9yeCk7CiAJc2VxX3ByaW50ZihzLCAiICBsYXJnZV9zZW5kIHR4IChpbiBLYnl0ZXMpICAgICAgICAgICAgICA6ICV1XG4iCiAJCSAgICAgICIgIGxhcmdlX3NlbmQgY291bnQgICAgICAgICAgICAgICAgICAgICAgIDogJXVcblxuIiwKIAkJICAgICAgY2FyZC0+cGVyZl9zdGF0cy5sYXJnZV9zZW5kX2J5dGVzID4+IDEwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jCmluZGV4IDAyMmU4NjkuLjdiNTc3M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2Nwd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYwppbmRleCA1MTI4NTdhLi41MTU3YTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCkBAIC02MTksOCArNjE5LDcgQEAKIAlqc2YwLmJ1c3kgPSAwOwogCiAJbWlzY19kZXJlZ2lzdGVyKCZqc2ZfZGV2KTsKLQlpZiAodW5yZWdpc3Rlcl9ibGtkZXYoSlNGRF9NQUpPUiwgImpzZmQiKSAhPSAwKQotCQlwcmludGsoImpzZmQ6IGNsZWFudXBfbW9kdWxlIGZhaWxlZFxuIik7CisJdW5yZWdpc3Rlcl9ibGtkZXYoSlNGRF9NQUpPUiwgImpzZmQiKTsKIAlibGtfY2xlYW51cF9xdWV1ZShqc2ZfcXVldWUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDlkMjExOWIuLjM3MjcyMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC01NDUsNyArNTQ1LDcgQEAKIAogY29uZmlnIFNDU0lfQlVTTE9HSUMKIAl0cmlzdGF0ZSAiQnVzTG9naWMgU0NTSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gKFBDSSB8fCBJU0EgfHwgTUNBKSAmJiBTQ1NJICYmIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiAoUENJIHx8IElTQSB8fCBNQ0EpICYmIFNDU0kgJiYgSVNBX0RNQV9BUEkgJiYgVklSVF9UT19CVVMKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIHN1cHBvcnQgZm9yIEJ1c0xvZ2ljIE11bHRpTWFzdGVyIGFuZCBGbGFzaFBvaW50IFNDU0kgSG9zdAogCSAgQWRhcHRlcnMuIENvbnN1bHQgdGhlIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCmluZGV4IGQ3MGRkZmQuLjljNTM0MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCkBAIC00MCw2ICs0MCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogLyogLS0tLS0tLS0tLSBTQ1NJIEhvc3QgZ2x1ZSAtLS0tLS0tLS0tICovCkBAIC04NjgsOCArODY5LDYgQEAKIHsKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gX3Nhc19oYTsKIAotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJd2hpbGUgKDEpIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc2NoZWR1bGUoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IDlhZGI2NGEuLjhhNTI1YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTE1MTYsOCArMTUxNyw2IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkYXRhOwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAkvKgogCSAqIFdlIHVzZSBUQVNLX0lOVEVSUlVQVElCTEUgc28gdGhhdCB0aGUgdGhyZWFkIGlzIG5vdAogCSAqIGNvdW50ZWQgYWdhaW5zdCB0aGUgbG9hZCBhdmVyYWdlIGFzIGEgcnVubmluZyBwcm9jZXNzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA0NDhkMzE2Li40MjRkNTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtNjg0LDcgKzY4NCw3IEBACiAJCWNhc2UgU0NTSV9JT0NUTF9HRVRfQlVTX05VTUJFUjoKIAkJCXJldHVybiBzY3NpX2lvY3RsKHNkcCwgY21kLCBwKTsKIAkJZGVmYXVsdDoKLQkJCWVycm9yID0gc2NzaV9jbWRfaW9jdGwoZmlscCwgZGlzaywgY21kLCBwKTsKKwkJCWVycm9yID0gc2NzaV9jbWRfaW9jdGwoZmlscCwgZGlzay0+cXVldWUsIGRpc2ssIGNtZCwgcCk7CiAJCQlpZiAoZXJyb3IgIT0gLUVOT1RUWSkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmMgYi9kcml2ZXJzL3Njc2kvc3QuYwppbmRleCA1NWJmZWNjLi5hNGY3Yjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMzU0OSw3ICszNTQ5LDggQEAKIAkJCSAgICAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJCQlpID0gLUVQRVJNOwogCQkJZWxzZQotCQkJCWkgPSBzY3NpX2NtZF9pb2N0bChmaWxlLCBTVHAtPmRpc2ssIGNtZF9pbiwgcCk7CisJCQkJaSA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIFNUcC0+ZGlzay0+cXVldWUsCisJCQkJCQkgICBTVHAtPmRpc2ssIGNtZF9pbiwgcCk7CiAJCQlpZiAoaSAhPSAtRU5PVFRZKQogCQkJCXJldHVybiBpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYwppbmRleCA2ODgxN2E3Li4yYWE2YmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKQEAgLTkzNCw4ICs5MzQsNiBAQAogCS8qCiAJICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCiAJICovCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQogCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSAoQkRfU0NfRU1QVFkgfCBCRF9TQ19PVik7CiAJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKIAkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBCRF9TQ19GUiB8IEJEX1NDX1BSOwpAQCAtMTUyNywxMSArMTUyNSw2IEBACiB7CiAJc2VyX2luZm9fdCAqaW5mbyA9IChzZXJfaW5mb190ICopdHR5LT5kcml2ZXJfZGF0YTsKIAotCWlmICggICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkgIHJldHVybjsKLQogCWNoYW5nZV9zcGVlZChpbmZvKTsKIAogI2lmZGVmIG1vZGVtX2NvbnRyb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwppbmRleCBjODRkYWIwLi4wYjNlYzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCkBAIC0yNTE0LDEyICsyNTE0LDE4IEBACiAJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IHNlcmlhbDgyNTBfY29uc29sZV9lYXJseV9zZXR1cCh2b2lkKQoreworCXJldHVybiBzZXJpYWw4MjUwX2ZpbmRfcG9ydF9mb3JfZWFybHljb24oKTsKK30KKwogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzZXJpYWw4MjUwX3JlZzsKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJpYWw4MjUwX2NvbnNvbGUgPSB7CiAJLm5hbWUJCT0gInR0eVMiLAogCS53cml0ZQkJPSBzZXJpYWw4MjUwX2NvbnNvbGVfd3JpdGUsCiAJLmRldmljZQkJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAogCS5zZXR1cAkJPSBzZXJpYWw4MjUwX2NvbnNvbGVfc2V0dXAsCisJLmVhcmx5X3NldHVwCT0gc2VyaWFsODI1MF9jb25zb2xlX2Vhcmx5X3NldHVwLAogCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCiAJLmluZGV4CQk9IC0xLAogCS5kYXRhCQk9ICZzZXJpYWw4MjUwX3JlZywKQEAgLTI1MzMsNyArMjUzOSw3IEBACiB9CiBjb25zb2xlX2luaXRjYWxsKHNlcmlhbDgyNTBfY29uc29sZV9pbml0KTsKIAotc3RhdGljIGludCBfX2luaXQgZmluZF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnApCitpbnQgc2VyaWFsODI1MF9maW5kX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcCkKIHsKIAlpbnQgbGluZTsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OwpAQCAtMjU0NiwyNiArMjU1Miw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLWludCBfX2luaXQgc2VyaWFsODI1MF9zdGFydF9jb25zb2xlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGNoYXIgKm9wdGlvbnMpCi17Ci0JaW50IGxpbmU7Ci0KLQlsaW5lID0gZmluZF9wb3J0KHBvcnQpOwotCWlmIChsaW5lIDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eVMiLCBsaW5lLCBvcHRpb25zKTsKLQlwcmludGsoIkFkZGluZyBjb25zb2xlIG9uIHR0eVMlZCBhdCAlcyAweCVseCAob3B0aW9ucyAnJXMnKVxuIiwKLQkJbGluZSwgcG9ydC0+aW90eXBlID09IFVQSU9fTUVNID8gIk1NSU8iIDogIkkvTyBwb3J0IiwKLQkJcG9ydC0+aW90eXBlID09IFVQSU9fTUVNID8gKHVuc2lnbmVkIGxvbmcpIHBvcnQtPm1hcGJhc2UgOgotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHBvcnQtPmlvYmFzZSwgb3B0aW9ucyk7Ci0JaWYgKCEoc2VyaWFsODI1MF9jb25zb2xlLmZsYWdzICYgQ09OX0VOQUJMRUQpKSB7Ci0JCXNlcmlhbDgyNTBfY29uc29sZS5mbGFncyAmPSB+Q09OX1BSSU5UQlVGRkVSOwotCQlyZWdpc3Rlcl9jb25zb2xlKCZzZXJpYWw4MjUwX2NvbnNvbGUpOwotCX0KLQlyZXR1cm4gbGluZTsKLX0KLQogI2RlZmluZSBTRVJJQUw4MjUwX0NPTlNPTEUJJnNlcmlhbDgyNTBfY29uc29sZQogI2Vsc2UKICNkZWZpbmUgU0VSSUFMODI1MF9DT05TT0xFCU5VTEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfZWFybHkuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfZWFybHkuYwppbmRleCA3ZTUxMTE5Li45NDdjMjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX2Vhcmx5LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jCkBAIC0xNywxMyArMTcsMTEgQEAKICAqIHdlIGxvY2F0ZSB0aGUgZGV2aWNlIGRpcmVjdGx5IGJ5IGl0cyBNTUlPIG9yIEkvTyBwb3J0IGFkZHJlc3MuCiAgKgogICogVGhlIHVzZXIgY2FuIHNwZWNpZnkgdGhlIGRldmljZSBkaXJlY3RseSwgZS5nLiwKLSAqCWNvbnNvbGU9dWFydCxpbywweDNmOCw5NjAwbjgKLSAqCWNvbnNvbGU9dWFydCxtbWlvLDB4ZmY1ZTAwMDAsMTE1MjAwbjgKLSAqIG9yIHBsYXRmb3JtIGNvZGUgY2FuIGNhbGwgZWFybHlfdWFydF9jb25zb2xlX2luaXQoKSB0byBzZXQKLSAqIHRoZSBlYXJseSBVQVJUIGRldmljZS4KLSAqCi0gKiBBZnRlciB0aGUgbm9ybWFsIHNlcmlhbCBkcml2ZXIgc3RhcnRzLCB3ZSB0cnkgdG8gbG9jYXRlIHRoZQotICogbWF0Y2hpbmcgdHR5UyBkZXZpY2UgYW5kIHN0YXJ0IGEgY29uc29sZSB0aGVyZS4KKyAqCWVhcmx5Y29uPXVhcnQ4MjUwLGlvLDB4M2Y4LDk2MDBuOAorICoJZWFybHljb249dWFydDgyNTAsbW1pbywweGZmNWUwMDAwLDExNTIwMG44CisgKiBvcgorICoJY29uc29sZT11YXJ0ODI1MCxpbywweDNmOCw5NjAwbjgKKyAqCWNvbnNvbGU9dWFydDgyNTAsbW1pbywweGZmNWUwMDAwLDExNTIwMG44CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpAQCAtMzIsMTcgKzMwLDIxIEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VyaWFsLmg+CisjaWZkZWYgQ09ORklHX0ZJWF9FQVJMWUNPTl9NRU0KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNlbmRpZgogCi1zdHJ1Y3QgZWFybHlfdWFydF9kZXZpY2Ugeworc3RydWN0IGVhcmx5X3NlcmlhbDgyNTBfZGV2aWNlIHsKIAlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CiAJY2hhciBvcHRpb25zWzE2XTsJCS8qIGUuZy4sIDExNTIwMG44ICovCiAJdW5zaWduZWQgaW50IGJhdWQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IGVhcmx5X3VhcnRfZGV2aWNlIGVhcmx5X2RldmljZSBfX2luaXRkYXRhOwotc3RhdGljIGludCBlYXJseV91YXJ0X3JlZ2lzdGVyZWQgX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgZWFybHlfZGV2aWNlOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBzZXJpYWxfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IG9mZnNldCkKIHsKQEAgLTgwLDcgKzgyLDcgQEAKIAlzZXJpYWxfb3V0KHBvcnQsIFVBUlRfVFgsIGMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfdWFydF93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQorc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3NlcmlhbDgyNTBfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmVhcmx5X2RldmljZS5wb3J0OwogCXVuc2lnbmVkIGludCBpZXI7CkBAIC0xMTEsNyArMTEzLDcgQEAKIAlyZXR1cm4gKHBvcnQtPnVhcnRjbGsgLyAxNikgLyBxdW90OwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9wb3J0KHN0cnVjdCBlYXJseV91YXJ0X2RldmljZSAqZGV2aWNlKQorc3RhdGljIHZvaWQgX19pbml0IGluaXRfcG9ydChzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKIAl1bnNpZ25lZCBpbnQgZGl2aXNvcjsKQEAgLTEzMCwxMCArMTMyLDkgQEAKIAlzZXJpYWxfb3V0KHBvcnQsIFVBUlRfTENSLCBjICYgflVBUlRfTENSX0RMQUIpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV9vcHRpb25zKHN0cnVjdCBlYXJseV91YXJ0X2RldmljZSAqZGV2aWNlLCBjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2luaXQgcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgKmRldmljZSwgY2hhciAqb3B0aW9ucykKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKLQlpbnQgbWFwc2l6ZSA9IDY0OwogCWludCBtbWlvLCBsZW5ndGg7CiAKIAlpZiAoIW9wdGlvbnMpCkBAIC0xNDMsMTIgKzE0NCwxOCBAQAogCWlmICghc3RybmNtcChvcHRpb25zLCAibW1pbywiLCA1KSkgewogCQlwb3J0LT5pb3R5cGUgPSBVUElPX01FTTsKIAkJcG9ydC0+bWFwYmFzZSA9IHNpbXBsZV9zdHJ0b3VsKG9wdGlvbnMgKyA1LCAmb3B0aW9ucywgMCk7Ci0JCXBvcnQtPm1lbWJhc2UgPSBpb3JlbWFwKHBvcnQtPm1hcGJhc2UsIG1hcHNpemUpOworI2lmZGVmIENPTkZJR19GSVhfRUFSTFlDT05fTUVNCisJCXNldF9maXhtYXBfbm9jYWNoZShGSVhfRUFSTFlDT05fTUVNX0JBU0UsIHBvcnQtPm1hcGJhc2UgJiBQQUdFX01BU0spOworCQlwb3J0LT5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKV9fZml4X3RvX3ZpcnQoRklYX0VBUkxZQ09OX01FTV9CQVNFKTsKKwkJcG9ydC0+bWVtYmFzZSArPSBwb3J0LT5tYXBiYXNlICYgflBBR0VfTUFTSzsKKyNlbHNlCisJCXBvcnQtPm1lbWJhc2UgPSBpb3JlbWFwKHBvcnQtPm1hcGJhc2UsIDY0KTsKIAkJaWYgKCFwb3J0LT5tZW1iYXNlKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZG4ndCBpb3JlbWFwIDB4JWx4XG4iLAogCQkJCV9fRlVOQ1RJT05fXywgcG9ydC0+bWFwYmFzZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQorI2VuZGlmCiAJCW1taW8gPSAxOwogCX0gZWxzZSBpZiAoIXN0cm5jbXAob3B0aW9ucywgImlvLCIsIDMpKSB7CiAJCXBvcnQtPmlvdHlwZSA9IFVQSU9fUE9SVDsKQEAgLTE3NSw5ICsxODIsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZWFybHlfdWFydF9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwgY2hhciAqb3B0aW9ucykKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBlYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUgX19pbml0ZGF0YSA9IHsKKwkubmFtZQk9ICJ1YXJ0IiwKKwkud3JpdGUJPSBlYXJseV9zZXJpYWw4MjUwX3dyaXRlLAorCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiB8IENPTl9CT09ULAorCS5pbmRleAk9IC0xLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfc2VyaWFsODI1MF9zZXR1cChjaGFyICpvcHRpb25zKQogewotCXN0cnVjdCBlYXJseV91YXJ0X2RldmljZSAqZGV2aWNlID0gJmVhcmx5X2RldmljZTsKKwlzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgKmRldmljZSA9ICZlYXJseV9kZXZpY2U7CiAJaW50IGVycjsKIAogCWlmIChkZXZpY2UtPnBvcnQubWVtYmFzZSB8fCBkZXZpY2UtPnBvcnQuaW9iYXNlKQpAQCAtMTkwLDYxICsyMDQsNDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjb25zb2xlIGVhcmx5X3VhcnRfY29uc29sZSBfX2luaXRkYXRhID0gewotCS5uYW1lCT0gInVhcnQiLAotCS53cml0ZQk9IGVhcmx5X3VhcnRfd3JpdGUsCi0JLnNldHVwCT0gZWFybHlfdWFydF9zZXR1cCwKLQkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIsCi0JLmluZGV4CT0gLTEsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBlYXJseV91YXJ0X2NvbnNvbGVfaW5pdCh2b2lkKQotewotCWlmICghZWFybHlfdWFydF9yZWdpc3RlcmVkKSB7Ci0JCXJlZ2lzdGVyX2NvbnNvbGUoJmVhcmx5X3VhcnRfY29uc29sZSk7Ci0JCWVhcmx5X3VhcnRfcmVnaXN0ZXJlZCA9IDE7Ci0JfQotCXJldHVybiAwOwotfQotY29uc29sZV9pbml0Y2FsbChlYXJseV91YXJ0X2NvbnNvbGVfaW5pdCk7Ci0KLWludCBfX2luaXQgZWFybHlfc2VyaWFsX2NvbnNvbGVfaW5pdChjaGFyICpjbWRsaW5lKQoraW50IF9faW5pdCBzZXR1cF9lYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUoY2hhciAqY21kbGluZSkKIHsKIAljaGFyICpvcHRpb25zOwogCWludCBlcnI7CiAKLQlvcHRpb25zID0gc3Ryc3RyKGNtZGxpbmUsICJjb25zb2xlPXVhcnQsIik7Ci0JaWYgKCFvcHRpb25zKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlvcHRpb25zID0gc3Ryc3RyKGNtZGxpbmUsICJ1YXJ0ODI1MCwiKTsKKwlpZiAoIW9wdGlvbnMpIHsKKwkJb3B0aW9ucyA9IHN0cnN0cihjbWRsaW5lLCAidWFydCwiKTsKKwkJaWYgKCFvcHRpb25zKQorCQkJcmV0dXJuIDA7CisJfQogCiAJb3B0aW9ucyA9IHN0cmNocihjbWRsaW5lLCAnLCcpICsgMTsKLQlpZiAoKGVyciA9IGVhcmx5X3VhcnRfc2V0dXAoTlVMTCwgb3B0aW9ucykpIDwgMCkKKwlpZiAoKGVyciA9IGVhcmx5X3NlcmlhbDgyNTBfc2V0dXAob3B0aW9ucykpIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlyZXR1cm4gZWFybHlfdWFydF9jb25zb2xlX2luaXQoKTsKLX0KIAotc3RhdGljIGludCBfX2luaXQgZWFybHlfdWFydF9jb25zb2xlX3N3aXRjaCh2b2lkKQotewotCXN0cnVjdCBlYXJseV91YXJ0X2RldmljZSAqZGV2aWNlID0gJmVhcmx5X2RldmljZTsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKLQlpbnQgbW1pbywgbGluZTsKLQotCWlmICghKGVhcmx5X3VhcnRfY29uc29sZS5mbGFncyAmIENPTl9FTkFCTEVEKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBUcnkgdG8gc3RhcnQgdGhlIG5vcm1hbCBkcml2ZXIgb24gYSBtYXRjaGluZyBsaW5lLiAgKi8KLQltbWlvID0gKHBvcnQtPmlvdHlwZSA9PSBVUElPX01FTSk7Ci0JbGluZSA9IHNlcmlhbDgyNTBfc3RhcnRfY29uc29sZShwb3J0LCBkZXZpY2UtPm9wdGlvbnMpOwotCWlmIChsaW5lIDwgMCkKLQkJcHJpbnRrKCJObyB0dHlTIGRldmljZSBhdCAlcyAweCVseCBmb3IgY29uc29sZVxuIiwKLQkJCW1taW8gPyAiTU1JTyIgOiAiSS9PIHBvcnQiLAotCQkJbW1pbyA/IHBvcnQtPm1hcGJhc2UgOgotCQkJICAgICh1bnNpZ25lZCBsb25nKSBwb3J0LT5pb2Jhc2UpOwotCi0JdW5yZWdpc3Rlcl9jb25zb2xlKCZlYXJseV91YXJ0X2NvbnNvbGUpOwotCWlmIChtbWlvKQotCQlpb3VubWFwKHBvcnQtPm1lbWJhc2UpOworCXJlZ2lzdGVyX2NvbnNvbGUoJmVhcmx5X3NlcmlhbDgyNTBfY29uc29sZSk7CiAKIAlyZXR1cm4gMDsKIH0KLWxhdGVfaW5pdGNhbGwoZWFybHlfdWFydF9jb25zb2xlX3N3aXRjaCk7CisKK2ludCBfX2luaXQgc2VyaWFsODI1MF9maW5kX3BvcnRfZm9yX2Vhcmx5Y29uKHZvaWQpCit7CisJc3RydWN0IGVhcmx5X3NlcmlhbDgyNTBfZGV2aWNlICpkZXZpY2UgPSAmZWFybHlfZGV2aWNlOworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZGV2aWNlLT5wb3J0OworCWludCBsaW5lOworCWludCByZXQ7CisKKwlpZiAoIWRldmljZS0+cG9ydC5tZW1iYXNlICYmICFkZXZpY2UtPnBvcnQuaW9iYXNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxpbmUgPSBzZXJpYWw4MjUwX2ZpbmRfcG9ydChwb3J0KTsKKwlpZiAobGluZSA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gdXBkYXRlX2NvbnNvbGVfY21kbGluZSgidWFydCIsIDgyNTAsCisJCQkgICAgICJ0dHlTIiwgbGluZSwgZGV2aWNlLT5vcHRpb25zKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gdXBkYXRlX2NvbnNvbGVfY21kbGluZSgidWFydCIsIDAsCisJCQkJICAgICAidHR5UyIsIGxpbmUsIGRldmljZS0+b3B0aW9ucyk7CisKKwlyZXR1cm4gcmV0OworfQorCitlYXJseV9wYXJhbSgiZWFybHljb24iLCBzZXR1cF9lYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggMmFkYmVkNC4uN2ZhNDEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC02Miw4ICs2MiwyMiBAQAogCSAga2VybmVsIHdpbGwgYXV0b21hdGljYWxseSB1c2UgdGhlIGZpcnN0IHNlcmlhbCBsaW5lLCAvZGV2L3R0eVMwLCBhcwogCSAgc3lzdGVtIGNvbnNvbGUuCiAKKwkgIHlvdSBjYW4gc2V0IHRoYXQgdXNpbmcgYSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiBzdWNoIGFzCisJICAiY29uc29sZT11YXJ0ODI1MCxpbywweDNmOCw5NjAwbjgiCisJICAiY29uc29sZT11YXJ0ODI1MCxtbWlvLDB4ZmY1ZTAwMDAsMTE1MjAwbjgiLgorCSAgYW5kIGl0IHdpbGwgc3dpdGNoIHRvIG5vcm1hbCBzZXJpYWwgY29uc29sZSB3aGVuIGNvcnJlcG9uZGluZyBwb3J0IGlzCisJICByZWFkeS4KKwkgICJlYXJseWNvbj11YXJ0ODI1MCxpbywweDNmOCw5NjAwbjgiCisJICAiZWFybHljb249dWFydDgyNTAsbW1pbywweGZmNWUwMDAwLDExNTIwMG44Ii4KKwkgIGl0IHdpbGwgbm90IG9ubHkgc2V0dXAgZWFybHkgY29uc29sZS4KKwogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIEZJWF9FQVJMWUNPTl9NRU0KKwlib29sCisJZGVwZW5kcyBvbiBYODYKKwlkZWZhdWx0IHkKKwogY29uZmlnIFNFUklBTF84MjUwX0dTQwogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAmJiBHU0MKQEAgLTMyNCw2ICszMzgsMzQgQEAKIAkgIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IgbG9hZGxpbikgYWJvdXQgaG93IHRvIHBhc3Mgb3B0aW9ucyB0byB0aGUKIAkgIGtlcm5lbCBhdCBib290IHRpbWUuKQogCitjb25maWcgU0VSSUFMX1NCMTI1MF9EVUFSVAorCXRyaXN0YXRlICJCQ00xeHh4IG9uLWNoaXAgRFVBUlQgc2VyaWFsIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTSUJZVEVfU0IxeHh4X1NPQz15CisJc2VsZWN0IFNFUklBTF9DT1JFCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgdGhlIGFzeW5jaHJvbm91cyBzZXJpYWwgaW50ZXJmYWNlIChEVUFSVCkgaW5jbHVkZWQgaW4KKwkgIHRoZSBCQ00xMjUwIGFuZCBkZXJpdmVkIFN5c3RlbS1Pbi1hLUNoaXAgKFNPQykgZGV2aWNlcy4gIE5vdGUgdGhhdAorCSAgdGhlIGxldHRlciBEIGluIERVQVJUIHN0YW5kcyBmb3IgImR1YWwiLCB3aGljaCBpcyBob3cgdGhlIGRldmljZQorCSAgaXMgaW1wbGVtZW50ZWQuICBEZXBlbmRpbmcgb24gdGhlIFNPQyBjb25maWd1cmF0aW9uIHRoZXJlIG1heSBiZQorCSAgb25lIG9yIG1vcmUgRFVBUlRzIGF2YWlsYWJsZSBvZiB3aGljaCBhbGwgYXJlIGhhbmRsZWQuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOgorCSAgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYjEyNTAtZHVhcnQuCisKK2NvbmZpZyBTRVJJQUxfU0IxMjUwX0RVQVJUX0NPTlNPTEUKKwlib29sICJTdXBwb3J0IGZvciBjb25zb2xlIG9uIGEgQkNNMXh4eCBEVUFSVCBzZXJpYWwgcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9TQjEyNTBfRFVBUlQ9eQorCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gdXNlIGEgc2VyaWFsIHBvcnQgYXMgdGhlCisJICBzeXN0ZW0gY29uc29sZSAodGhlIHN5c3RlbSBjb25zb2xlIGlzIHRoZSBkZXZpY2Ugd2hpY2ggcmVjZWl2ZXMgYWxsCisJICBrZXJuZWwgbWVzc2FnZXMgYW5kIHdhcm5pbmdzIGFuZCB3aGljaCBhbGxvd3MgbG9naW5zIGluIHNpbmdsZSB1c2VyCisJICBtb2RlKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIFNFUklBTF9BVE1FTAogCWJvb2wgIkFUOTEgLyBBVDMyIG9uLWNoaXAgc2VyaWFsIHBvcnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIChBUk0gJiYgQVJDSF9BVDkxKSB8fCBBVlIzMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQppbmRleCAwOGFkMGQ5Li5jNDhjZGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpAQCAtNTEsNiArNTEsNyBAQAogb2JqLSQoQ09ORklHX1NFUklBTF9JQ09NKSArPSBpY29tLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTTMyUl9TSU8pICs9IG0zMnJfc2lvLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTVBTQykgKz0gbXBzYy5vCitvYmotJChDT05GSUdfU0VSSUFMX1NCMTI1MF9EVUFSVCkgKz0gc2IxMjUwLWR1YXJ0Lm8KIG9iai0kKENPTkZJR19FVFJBWF9TRVJJQUwpICs9IGNyaXN2MTAubwogb2JqLSQoQ09ORklHX1NFUklBTF9KU00pICs9IGpzbS8KIG9iai0kKENPTkZJR19TRVJJQUxfVFhYOSkgKz0gc2VyaWFsX3R4eDkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYwppbmRleCAzMzIwYmNkLi40ZDZiM2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtMTE0LDYgKzExNCw3IEBACiAJc3RydWN0IHVhcnRfcG9ydAl1YXJ0OwkJLyogdWFydCAqLwogCXN0cnVjdCBjbGsJCSpjbGs7CQkvKiB1YXJ0IGNsb2NrICovCiAJdW5zaWduZWQgc2hvcnQJCXN1c3BlbmRlZDsJLyogaXMgcG9ydCBzdXNwZW5kZWQ/ICovCisJaW50CQkJYnJlYWtfYWN0aXZlOwkvKiBicmVhayBiZWluZyByZWNlaXZlZCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgYXRtZWxfcG9ydHNbQVRNRUxfTUFYX1VBUlRdOwpAQCAtMjUyLDYgKzI1Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGF0bWVsX3J4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IChzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICopIHBvcnQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmluZm8tPnR0eTsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzLCBjaCwgZmxnOwogCkBAIC0yNjcsMTMgKzI2OSwyOSBAQAogCQkgKiBub3RlIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGNvZGUgaXMKIAkJICogb3V0IG9mIHRoZSBtYWluIGV4ZWN1dGlvbiBwYXRoCiAJCSAqLwotCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKEFUTUVMX1VTX1BBUkUgfCBBVE1FTF9VU19GUkFNRSB8IEFUTUVMX1VTX09WUkUgfCBBVE1FTF9VU19SWEJSSykpKSB7CisJCWlmICh1bmxpa2VseShzdGF0dXMgJiAoQVRNRUxfVVNfUEFSRSB8IEFUTUVMX1VTX0ZSQU1FCisJCQkJICAgICAgIHwgQVRNRUxfVVNfT1ZSRSB8IEFUTUVMX1VTX1JYQlJLKQorCQkJICAgICB8fCBhdG1lbF9wb3J0LT5icmVha19hY3RpdmUpKSB7CiAJCQlVQVJUX1BVVF9DUihwb3J0LCBBVE1FTF9VU19SU1RTVEEpOwkvKiBjbGVhciBlcnJvciAqLwotCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1JYQlJLKSB7CisJCQlpZiAoc3RhdHVzICYgQVRNRUxfVVNfUlhCUksKKwkJCSAgICAmJiAhYXRtZWxfcG9ydC0+YnJlYWtfYWN0aXZlKSB7CiAJCQkJc3RhdHVzICY9IH4oQVRNRUxfVVNfUEFSRSB8IEFUTUVMX1VTX0ZSQU1FKTsJLyogaWdub3JlIHNpZGUtZWZmZWN0ICovCiAJCQkJcG9ydC0+aWNvdW50LmJyaysrOworCQkJCWF0bWVsX3BvcnQtPmJyZWFrX2FjdGl2ZSA9IDE7CisJCQkJVUFSVF9QVVRfSUVSKHBvcnQsIEFUTUVMX1VTX1JYQlJLKTsKIAkJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCiAJCQkJCWdvdG8gaWdub3JlX2NoYXI7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyBlaXRoZXIgdGhlIGVuZC1vZi1icmVhaworCQkJCSAqIGNvbmRpdGlvbiBvciB3ZSd2ZSByZWNlaXZlZCBhdAorCQkJCSAqIGxlYXN0IG9uZSBjaGFyYWN0ZXIgd2l0aG91dCBSWEJSSworCQkJCSAqIGJlaW5nIHNldC4gSW4gYm90aCBjYXNlcywgdGhlIG5leHQKKwkJCQkgKiBSWEJSSyB3aWxsIGluZGljYXRlIHN0YXJ0LW9mLWJyZWFrLgorCQkJCSAqLworCQkJCVVBUlRfUFVUX0lEUihwb3J0LCBBVE1FTF9VU19SWEJSSyk7CisJCQkJc3RhdHVzICY9IH5BVE1FTF9VU19SWEJSSzsKKwkJCQlhdG1lbF9wb3J0LT5icmVha19hY3RpdmUgPSAwOwogCQkJfQogCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1BBUkUpCiAJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOwpAQCAtMzUyLDYgKzM3MCwxNiBAQAogCQkvKiBJbnRlcnJ1cHQgcmVjZWl2ZSAqLwogCQlpZiAocGVuZGluZyAmIEFUTUVMX1VTX1JYUkRZKQogCQkJYXRtZWxfcnhfY2hhcnMocG9ydCk7CisJCWVsc2UgaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19SWEJSSykgeworCQkJLyoKKwkJCSAqIEVuZCBvZiBicmVhayBkZXRlY3RlZC4gSWYgaXQgY2FtZSBhbG9uZworCQkJICogd2l0aCBhIGNoYXJhY3RlciwgYXRtZWxfcnhfY2hhcnMgd2lsbAorCQkJICogaGFuZGxlIGl0LgorCQkJICovCisJCQlVQVJUX1BVVF9DUihwb3J0LCBBVE1FTF9VU19SU1RTVEEpOworCQkJVUFSVF9QVVRfSURSKHBvcnQsIEFUTUVMX1VTX1JYQlJLKTsKKwkJCWF0bWVsX3BvcnQtPmJyZWFrX2FjdGl2ZSA9IDA7CisJCX0KIAogCQkvLyBUT0RPOiBBbGwgcmVhZHMgdG8gQ1NSIHdpbGwgY2xlYXIgdGhlc2UgaW50ZXJydXB0cyEKIAkJaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19SSUlDKSBwb3J0LT5pY291bnQucm5nKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKaW5kZXggYjYzZmY4ZC4uY2VmZGU1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJCX0KIAkJYmRwLT5jYmRfZGF0bGVuID0gY291bnQ7CiAJCWJkcC0+Y2JkX3NjIHw9IEJEX1NDX1JFQURZOwotCQlfX2FzbV9fKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkvKiBHZXQgbmV4dCBCRC4gKi8KIAkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfU0NfV1JBUCkKIAkJCWJkcCA9IHBpbmZvLT50eF9iZF9iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaXAyMnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwppbmRleCBjM2FiZmIzLi5mMzI1N2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwpAQCAtODYyLDYgKzg2Miw3IEBACiAJdXAtPmNmbGFnID0gdGVybWlvcy0+Y19jZmxhZzsKIAogCWlwMjJ6aWxvZ19tYXliZV91cGRhdGVfcmVncyh1cCwgWklMT0dfQ0hBTk5FTF9GUk9NX1BPUlQocG9ydCkpOworCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CkBAIC0xMDE3LDYgKzEwMTgsOCBAQAogCX0KIAogCWNvbi0+Y2ZsYWcgPSBjZmxhZyB8IENTODsJCQkvKiA4TjEgKi8KKworCXVhcnRfdXBkYXRlX3RpbWVvdXQoJmlwMjJ6aWxvZ19wb3J0X3RhYmxlW2Nvbi0+aW5kZXhdLnBvcnQsIGNmbGFnLCBiYXVkKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaXAyMnppbG9nX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbiwgY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMKaW5kZXggN2ZmZGFlYS4uYTY0ZDg1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMKQEAgLTE3LDYgKzE3LDExIEBACiAjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAorc3RydWN0IG9mX3NlcmlhbF9pbmZvIHsKKwlpbnQgdHlwZTsKKwlpbnQgbGluZTsKK307CisKIC8qCiAgKiBGaWxsIGEgc3RydWN0IHVhcnRfcG9ydCBmb3IgYSBnaXZlbiBkZXZpY2Ugbm9kZQogICovCkBAIC02Miw2ICs2Nyw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBvZl9wbGF0Zm9ybV9zZXJpYWxfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCiAJCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3Qgb2Zfc2VyaWFsX2luZm8gKmluZm87CiAJc3RydWN0IHVhcnRfcG9ydCBwb3J0OwogCWludCBwb3J0X3R5cGU7CiAJaW50IHJldDsKQEAgLTY5LDMwICs3NSwzNSBAQAogCWlmIChvZl9maW5kX3Byb3BlcnR5KG9mZGV2LT5ub2RlLCAidXNlZC1ieS1ydGFzIiwgTlVMTCkpCiAJCXJldHVybiAtRUJVU1k7CiAKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXBvcnRfdHlwZSA9ICh1bnNpZ25lZCBsb25nKWlkLT5kYXRhOwogCXJldCA9IG9mX3BsYXRmb3JtX3NlcmlhbF9zZXR1cChvZmRldiwgcG9ydF90eXBlLCAmcG9ydCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKIAlzd2l0Y2ggKHBvcnRfdHlwZSkgewotCWNhc2UgUE9SVF9VTktOT1dOOgotCQlkZXZfaW5mbygmb2ZkZXYtPmRldiwgIlVua25vd24gc2VyaWFsIHBvcnQgZm91bmQsICIKLQkJCSJhdHRlbXB0aW5nIHRvIHVzZSA4MjUwIGRyaXZlclxuIik7Ci0JCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBQT1JUXzgyNTAgLi4uIFBPUlRfTUFYXzgyNTA6CiAJCXJldCA9IHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCgmcG9ydCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIG5lZWQgdG8gYWRkIGNvZGUgZm9yIHRoZXNlICovCisJY2FzZSBQT1JUX1VOS05PV046CisJCWRldl9pbmZvKCZvZmRldi0+ZGV2LCAiVW5rbm93biBzZXJpYWwgcG9ydCBmb3VuZCwgaWdub3JlZFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWJyZWFrOwogCX0KIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlvZmRldi0+ZGV2LmRyaXZlcl9kYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylyZXQ7CisJaW5mby0+dHlwZSA9IHBvcnRfdHlwZTsKKwlpbmZvLT5saW5lID0gcmV0OworCW9mZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBpbmZvOwogCXJldHVybiAwOwogb3V0OgorCWtmcmVlKGluZm8pOwogCWlycV9kaXNwb3NlX21hcHBpbmcocG9ydC5pcnEpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMDIsOCArMTEzLDE2IEBACiAgKi8KIHN0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fc2VyaWFsX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKIHsKLQlpbnQgbGluZSA9ICh1bnNpZ25lZCBsb25nKW9mZGV2LT5kZXYuZHJpdmVyX2RhdGE7Ci0Jc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQobGluZSk7CisJc3RydWN0IG9mX3NlcmlhbF9pbmZvICppbmZvID0gb2ZkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwlzd2l0Y2ggKGluZm8tPnR5cGUpIHsKKwljYXNlIFBPUlRfODI1MCAuLi4gUE9SVF9NQVhfODI1MDoKKwkJc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQoaW5mby0+bGluZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5lZWQgdG8gYWRkIGNvZGUgZm9yIHRoZXNlICovCisJCWJyZWFrOworCX0KKwlrZnJlZShpbmZvKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2IxMjUwLWR1YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC9zYjEyNTAtZHVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDlkNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvc2IxMjUwLWR1YXJ0LmMKQEAgLTAsMCArMSw5NzIgQEAKKy8qCisgKglkcml2ZXJzL3NlcmlhbC9zYjEyNTAtZHVhcnQuYworICoKKyAqCVN1cHBvcnQgZm9yIHRoZSBhc3luY2hyb25vdXMgc2VyaWFsIGludGVyZmFjZSAoRFVBUlQpIGluY2x1ZGVkCisgKglpbiB0aGUgQkNNMTI1MCBhbmQgZGVyaXZlZCBTeXN0ZW0tT24tYS1DaGlwIChTT0MpIGRldmljZXMuCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA3ICBNYWNpZWogVy4gUm96eWNraQorICoKKyAqCURlcml2ZWQgZnJvbSBkcml2ZXJzL2NoYXIvc2IxMjUwX2R1YXJ0LmMgZm9yIHdoaWNoIHRoZSBmb2xsb3dpbmcKKyAqCWNvcHlyaWdodCBhcHBsaWVzOgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVJlZmVyZW5jZXM6CisgKgorICoJIkJDTTEyNTAvQkNNMTEyNS9CQ00xMTI1SCBVc2VyIE1hbnVhbCIsIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfTUFHSUNfU1lTUlEpCisjZGVmaW5lIFNVUFBPUlRfU1lTUlEKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS93YXIuaD4KKworI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfdWFydC5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc3dhcm0uaD4KKworCisjaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4NTUpIHx8IGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDgwKQorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9iY20xNDgwX2ludC5oPgorCisjZGVmaW5lIFNCRF9DSEFOUkVHUyhsaW5lKQlBX0JDTTE0ODBfRFVBUlRfQ0hBTlJFRygobGluZSksIDApCisjZGVmaW5lIFNCRF9DVFJMUkVHUyhsaW5lKQlBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRygobGluZSksIDApCisjZGVmaW5lIFNCRF9JTlQobGluZSkJCShLX0JDTTE0ODBfSU5UX1VBUlRfMCArIChsaW5lKSkKKworI2VsaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX1NCMTI1MCkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTExMlgpCisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX2ludC5oPgorCisjZGVmaW5lIFNCRF9DSEFOUkVHUyhsaW5lKQlBX0RVQVJUX0NIQU5SRUcoKGxpbmUpLCAwKQorI2RlZmluZSBTQkRfQ1RSTFJFR1MobGluZSkJQV9EVUFSVF9DVFJMUkVHKDApCisjZGVmaW5lIFNCRF9JTlQobGluZSkJCShLX0lOVF9VQVJUXzAgKyAobGluZSkpCisKKyNlbHNlCisjZXJyb3IgaW52YWxpZCBTQjEyNTAgVUFSVCBjb25maWd1cmF0aW9uCisKKyNlbmRpZgorCisKK01PRFVMRV9BVVRIT1IoIk1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BsaW51eC1taXBzLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQkNNMXh4eCBvbi1jaGlwIERVQVJUIHNlcmlhbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisjZGVmaW5lIERVQVJUX01BWF9DSElQIDIKKyNkZWZpbmUgRFVBUlRfTUFYX1NJREUgMgorCisvKgorICogUGVyLXBvcnQgc3RhdGUuCisgKi8KK3N0cnVjdCBzYmRfcG9ydCB7CisJc3RydWN0IHNiZF9kdWFydAkqZHVhcnQ7CisJc3RydWN0IHVhcnRfcG9ydAlwb3J0OworCXVuc2lnbmVkIGNoYXIgX19pb21lbQkqbWVtY3RybDsKKwlpbnQJCQl0eF9zdG9wcGVkOworCWludAkJCWluaXRpYWxpc2VkOworfTsKKworLyoKKyAqIFBlci1EVUFSVCBzdGF0ZSBmb3IgdGhlIHNoYXJlZCByZWdpc3RlciBzcGFjZS4KKyAqLworc3RydWN0IHNiZF9kdWFydCB7CisJc3RydWN0IHNiZF9wb3J0CQlzcG9ydFsyXTsKKwl1bnNpZ25lZCBsb25nCQltYXBjdHJsOworCWF0b21pY190CQltYXBfZ3VhcmQ7Cit9OworCisjZGVmaW5lIHRvX3Nwb3J0KHVwb3J0KSBjb250YWluZXJfb2YodXBvcnQsIHN0cnVjdCBzYmRfcG9ydCwgcG9ydCkKKworc3RhdGljIHN0cnVjdCBzYmRfZHVhcnQgc2JkX2R1YXJ0c1tEVUFSVF9NQVhfQ0hJUF07CisKKyNkZWZpbmUgX191bnVzZWQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisKKworLyoKKyAqIFJlYWRpbmcgYW5kIHdyaXRpbmcgU0IxMjUwIERVQVJUIHJlZ2lzdGVycy4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgcmVnaXN0ZXIgc3BhY2VzOiB0d28gcGVyLWNoYW5uZWwgb25lcyBhbmQKKyAqIGEgc2hhcmVkIG9uZS4gIFdlIGhhdmUgdG8gZGVmaW5lIGFjY2Vzc29ycyBhcHByb3ByaWF0ZWx5LgorICogQWxsIHJlZ2lzdGVycyBhcmUgNjQtYml0IGFuZCBhbGwgYnV0IHRoZSBCYXVkIFJhdGUgQ2xvY2sKKyAqIHJlZ2lzdGVycyBvbmx5IGRlZmluZSA4IGxlYXN0IHNpZ25pZmljYW50IGJpdHMuICBUaGVyZSBpcworICogYWxzbyBhIHdvcmthcm91bmQgdG8gdGFrZSBpbnRvIGFjY291bnQuICBSYXcgYWNjZXNzb3JzIHVzZQorICogdGhlIGZ1bGwgcmVnaXN0ZXIgd2lkdGgsIGJ1dCBjb29rZWQgb25lcyB0cnVuY2F0ZSBpdAorICogaW50ZW50aW9uYWxseSBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZSBkcml2ZXIgZG9lcyBub3QgY2FyZS4KKyAqLworc3RhdGljIHU2NCBfX3JlYWRfc2JkY2huKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcpCit7CisJdm9pZCBfX2lvbWVtICpjc3IgPSBzcG9ydC0+cG9ydC5tZW1iYXNlICsgcmVnOworCisJcmV0dXJuIF9fcmF3X3JlYWRxKGNzcik7Cit9CisKK3N0YXRpYyB1NjQgX19yZWFkX3NiZHNocihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnKQoreworCXZvaWQgX19pb21lbSAqY3NyID0gc3BvcnQtPm1lbWN0cmwgKyByZWc7CisKKwlyZXR1cm4gX19yYXdfcmVhZHEoY3NyKTsKK30KKworc3RhdGljIHZvaWQgX193cml0ZV9zYmRjaG4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZywgdTY0IHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqY3NyID0gc3BvcnQtPnBvcnQubWVtYmFzZSArIHJlZzsKKworCV9fcmF3X3dyaXRlcSh2YWx1ZSwgY3NyKTsKK30KKworc3RhdGljIHZvaWQgX193cml0ZV9zYmRzaHIoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZywgdTY0IHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqY3NyID0gc3BvcnQtPm1lbWN0cmwgKyByZWc7CisKKwlfX3Jhd193cml0ZXEodmFsdWUsIGNzcik7Cit9CisKKy8qCisgKiBJbiBidWcgMTk1Niwgd2UgZ2V0IGdsaXRjaGVzIHRoYXQgY2FuIG1lc3MgdXAgdWFydCByZWdpc3RlcnMuICBUaGlzCisgKiAicmVhZC1tb2RlLXJlZyBhZnRlciBhbnkgcmVnaXN0ZXIgYWNjZXNzIiBpcyBhbiBhY2NlcHRlZCB3b3JrYXJvdW5kLgorICovCitzdGF0aWMgdm9pZCBfX3dhcl9zYmQxOTU2KHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJX19yZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xKTsKKwlfX3JlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX3NiZGNobihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGNoYXIgcmV0dmFsOworCisJcmV0dmFsID0gX19yZWFkX3NiZGNobihzcG9ydCwgcmVnKTsKKwlpZiAoU0lCWVRFXzE5NTZfV0FSKQorCQlfX3dhcl9zYmQxOTU2KHNwb3J0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX3NiZHNocihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGNoYXIgcmV0dmFsOworCisJcmV0dmFsID0gX19yZWFkX3NiZHNocihzcG9ydCwgcmVnKTsKKwlpZiAoU0lCWVRFXzE5NTZfV0FSKQorCQlfX3dhcl9zYmQxOTU2KHNwb3J0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9zYmRjaG4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCV9fd3JpdGVfc2JkY2huKHNwb3J0LCByZWcsIHZhbHVlKTsKKwlpZiAoU0lCWVRFXzE5NTZfV0FSKQorCQlfX3dhcl9zYmQxOTU2KHNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfc2Jkc2hyKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlfX3dyaXRlX3NiZHNocihzcG9ydCwgcmVnLCB2YWx1ZSk7CisJaWYgKFNJQllURV8xOTU2X1dBUikKKwkJX193YXJfc2JkMTk1NihzcG9ydCk7Cit9CisKKworc3RhdGljIGludCBzYmRfcmVjZWl2ZV9yZWFkeShzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXJldHVybiByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9TVEFUVVMpICYgTV9EVUFSVF9SWF9SRFk7Cit9CisKK3N0YXRpYyBpbnQgc2JkX3JlY2VpdmVfZHJhaW4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlpbnQgbG9vcHMgPSAxMDAwMDsKKworCXdoaWxlIChzYmRfcmVjZWl2ZV9yZWFkeShzcG9ydCkgJiYgbG9vcHMtLSkKKwkJcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfUlhfSE9MRCk7CisJcmV0dXJuIGxvb3BzOworfQorCitzdGF0aWMgaW50IF9fdW51c2VkIHNiZF90cmFuc21pdF9yZWFkeShzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXJldHVybiByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9TVEFUVVMpICYgTV9EVUFSVF9UWF9SRFk7Cit9CisKK3N0YXRpYyBpbnQgX191bnVzZWQgc2JkX3RyYW5zbWl0X2RyYWluKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJaW50IGxvb3BzID0gMTAwMDA7CisKKwl3aGlsZSAoIXNiZF90cmFuc21pdF9yZWFkeShzcG9ydCkgJiYgbG9vcHMtLSkKKwkJdWRlbGF5KDIpOworCXJldHVybiBsb29wczsKK30KKworc3RhdGljIGludCBzYmRfdHJhbnNtaXRfZW1wdHkoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlyZXR1cm4gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfU1RBVFVTKSAmIE1fRFVBUlRfVFhfRU1UOworfQorCitzdGF0aWMgaW50IHNiZF9saW5lX2RyYWluKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJaW50IGxvb3BzID0gMTAwMDA7CisKKwl3aGlsZSAoIXNiZF90cmFuc21pdF9lbXB0eShzcG9ydCkgJiYgbG9vcHMtLSkKKwkJdWRlbGF5KDIpOworCXJldHVybiBsb29wczsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IHNiZF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJcmV0dXJuIHNiZF90cmFuc21pdF9lbXB0eShzcG9ydCkgPyBUSU9DU0VSX1RFTVQgOiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNiZF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwl1bnNpZ25lZCBpbnQgbWN0cmwsIHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWRfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lOX1BPUlQpOworCXN0YXR1cyA+Pj0gKHVwb3J0LT5saW5lKSAlIDI7CisJbWN0cmwgPSAoIShzdGF0dXMgJiBNX0RVQVJUX0lOX1BJTjBfVkFMKSA/IFRJT0NNX0NUUyA6IDApIHwKKwkJKCEoc3RhdHVzICYgTV9EVUFSVF9JTl9QSU40X1ZBTCkgPyBUSU9DTV9DQVIgOiAwKSB8CisJCSghKHN0YXR1cyAmIE1fRFVBUlRfUklOMF9QSU4pID8gVElPQ01fUk5HIDogMCkgfAorCQkoIShzdGF0dXMgJiBNX0RVQVJUX0lOX1BJTjJfVkFMKSA/IFRJT0NNX0RTUiA6IDApOworCXJldHVybiBtY3RybDsKK30KKworc3RhdGljIHZvaWQgc2JkX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJdW5zaWduZWQgaW50IGNsciA9IDAsIHNldCA9IDAsIG1vZGUyOworCisJaWYgKG1jdHJsICYgVElPQ01fRFRSKQorCQlzZXQgfD0gTV9EVUFSVF9TRVRfT1BSMjsKKwllbHNlCisJCWNsciB8PSBNX0RVQVJUX0NMUl9PUFIyOworCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwkJc2V0IHw9IE1fRFVBUlRfU0VUX09QUjA7CisJZWxzZQorCQljbHIgfD0gTV9EVUFSVF9DTFJfT1BSMDsKKwljbHIgPDw9ICh1cG9ydC0+bGluZSkgJSAyOworCXNldCA8PD0gKHVwb3J0LT5saW5lKSAlIDI7CisKKwltb2RlMiA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIpOworCW1vZGUyICY9IH5NX0RVQVJUX0NIQU5fTU9ERTsKKwlpZiAobWN0cmwgJiBUSU9DTV9MT09QKQorCQltb2RlMiB8PSBWX0RVQVJUX0NIQU5fTU9ERV9MQ0xfTE9PUDsKKwllbHNlCisJCW1vZGUyIHw9IFZfRFVBUlRfQ0hBTl9NT0RFX05PUk1BTDsKKworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9DTEVBUl9PUFIsIGNscik7CisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX1NFVF9PUFIsIHNldCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIsIG1vZGUyKTsKK30KKworc3RhdGljIHZvaWQgc2JkX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRElTKTsKKwlzcG9ydC0+dHhfc3RvcHBlZCA9IDE7Cit9OworCitzdGF0aWMgdm9pZCBzYmRfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCS8qIEVuYWJsZSB0eCBpbnRlcnJ1cHRzLiAgKi8KKwltYXNrID0gcmVhZF9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisJbWFzayB8PSBNX0RVQVJUX0lNUl9UWDsKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwgbWFzayk7CisKKwkvKiBHbyEsIGdvISwgZ28hLi4uICAqLworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRU4pOworCXNwb3J0LT50eF9zdG9wcGVkID0gMDsKK307CisKK3N0YXRpYyB2b2lkIHNiZF9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwgMCk7Cit9OworCitzdGF0aWMgdm9pZCBzYmRfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQVVYQ1RMX1gsCisJCSAgICAgTV9EVUFSVF9DSU5fQ0hOR19FTkEgfCBNX0RVQVJUX0NUU19DSE5HX0VOQSk7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9icmVha19jdGwoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIGludCBicmVha19zdGF0ZSkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJaWYgKGJyZWFrX3N0YXRlID09IC0xKQorCQl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBWX0RVQVJUX01JU0NfQ01EX1NUQVJUX0JSRUFLKTsKKwllbHNlCisJCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIFZfRFVBUlRfTUlTQ19DTURfU1RPUF9CUkVBSyk7Cit9CisKKworc3RhdGljIHZvaWQgc2JkX3JlY2VpdmVfY2hhcnMoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKwlzdHJ1Y3QgdWFydF9pY291bnQgKmljb3VudDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBjaCwgZmxhZzsKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMTY7IGNvdW50OyBjb3VudC0tKSB7CisJCXN0YXR1cyA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1NUQVRVUyk7CisJCWlmICghKHN0YXR1cyAmIE1fRFVBUlRfUlhfUkRZKSkKKwkJCWJyZWFrOworCisJCWNoID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfUlhfSE9MRCk7CisKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CisKKwkJaWNvdW50ID0gJnVwb3J0LT5pY291bnQ7CisJCWljb3VudC0+cngrKzsKKworCQlpZiAodW5saWtlbHkoc3RhdHVzICYKKwkJCSAgICAgKE1fRFVBUlRfUkNWRF9CUksgfCBNX0RVQVJUX0ZSTV9FUlIgfAorCQkJICAgICAgTV9EVUFSVF9QQVJJVFlfRVJSIHwgTV9EVUFSVF9PVlJVTl9FUlIpKSkgeworCQkJaWYgKHN0YXR1cyAmIE1fRFVBUlRfUkNWRF9CUkspIHsKKwkJCQlpY291bnQtPmJyaysrOworCQkJCWlmICh1YXJ0X2hhbmRsZV9icmVhayh1cG9ydCkpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBNX0RVQVJUX0ZSTV9FUlIpCisJCQkJaWNvdW50LT5mcmFtZSsrOworCQkJZWxzZSBpZiAoc3RhdHVzICYgTV9EVUFSVF9QQVJJVFlfRVJSKQorCQkJCWljb3VudC0+cGFyaXR5Kys7CisJCQlpZiAoc3RhdHVzICYgTV9EVUFSVF9PVlJVTl9FUlIpCisJCQkJaWNvdW50LT5vdmVycnVuKys7CisKKwkJCXN0YXR1cyAmPSB1cG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKKwkJCWlmIChzdGF0dXMgJiBNX0RVQVJUX1JDVkRfQlJLKQorCQkJCWZsYWcgPSBUVFlfQlJFQUs7CisJCQllbHNlIGlmIChzdGF0dXMgJiBNX0RVQVJUX0ZSTV9FUlIpCisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIE1fRFVBUlRfUEFSSVRZX0VSUikKKwkJCQlmbGFnID0gVFRZX1BBUklUWTsKKwkJfQorCisJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKHVwb3J0LCBjaCkpCisJCQljb250aW51ZTsKKworCQl1YXJ0X2luc2VydF9jaGFyKHVwb3J0LCBzdGF0dXMsIE1fRFVBUlRfT1ZSVU5fRVJSLCBjaCwgZmxhZyk7CisJfQorCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godXBvcnQtPmluZm8tPnR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF90cmFuc21pdF9jaGFycyhzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5pbmZvLT54bWl0OworCXVuc2lnbmVkIGludCBtYXNrOworCWludCBzdG9wX3R4OworCisJLyogWE9OL1hPRkYgY2hhcnMuICAqLworCWlmIChzcG9ydC0+cG9ydC54X2NoYXIpIHsKKwkJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1RYX0hPTEQsIHNwb3J0LT5wb3J0LnhfY2hhcik7CisJCXNwb3J0LT5wb3J0Lmljb3VudC50eCsrOworCQlzcG9ydC0+cG9ydC54X2NoYXIgPSAwOworCQlyZXR1cm47CisJfQorCisJLyogSWYgbm90aGluZyB0byBkbyBvciBzdG9wcGVkIG9yIGhhcmR3YXJlIHN0b3BwZWQuICAqLworCXN0b3BfdHggPSAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmc3BvcnQtPnBvcnQpKTsKKworCS8qIFNlbmQgY2hhci4gICovCisJaWYgKCFzdG9wX3R4KSB7CisJCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9UWF9IT0xELCB4bWl0LT5idWZbeG1pdC0+dGFpbF0pOworCQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOworCQlzcG9ydC0+cG9ydC5pY291bnQudHgrKzsKKworCQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCQl1YXJ0X3dyaXRlX3dha2V1cCgmc3BvcnQtPnBvcnQpOworCX0KKworCS8qIEFyZSB3ZSBhcmUgZG9uZT8gICovCisJaWYgKHN0b3BfdHggfHwgdWFydF9jaXJjX2VtcHR5KHhtaXQpKSB7CisJCS8qIERpc2FibGUgdHggaW50ZXJydXB0cy4gICovCisJCW1hc2sgPSByZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwkJbWFzayAmPSB+TV9EVUFSVF9JTVJfVFg7CisJCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLCBtYXNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9zdGF0dXNfaGFuZGxlKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisJdW5zaWduZWQgaW50IGRlbHRhOworCisJZGVsdGEgPSByZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTkNIUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisJZGVsdGEgPj49ICh1cG9ydC0+bGluZSkgJSAyOworCisJaWYgKGRlbHRhICYgKE1fRFVBUlRfSU5fUElOMF9WQUwgPDwgU19EVUFSVF9JTl9QSU5fQ0hORykpCisJCXVhcnRfaGFuZGxlX2N0c19jaGFuZ2UodXBvcnQsICEoZGVsdGEgJiBNX0RVQVJUX0lOX1BJTjBfVkFMKSk7CisKKwlpZiAoZGVsdGEgJiAoTV9EVUFSVF9JTl9QSU4yX1ZBTCA8PCBTX0RVQVJUX0lOX1BJTl9DSE5HKSkKKwkJdXBvcnQtPmljb3VudC5kc3IrKzsKKworCWlmIChkZWx0YSAmICgoTV9EVUFSVF9JTl9QSU4yX1ZBTCB8IE1fRFVBUlRfSU5fUElOMF9WQUwpIDw8CisJCSAgICAgU19EVUFSVF9JTl9QSU5fQ0hORykpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdXBvcnQtPmluZm8tPmRlbHRhX21zcl93YWl0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNiZF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSBkZXZfaWQ7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisJaXJxcmV0dXJuX3Qgc3RhdHVzID0gSVJRX05PTkU7CisJdW5zaWduZWQgaW50IGludHN0YXQ7CisJaW50IGNvdW50OworCisJZm9yIChjb3VudCA9IDE2OyBjb3VudDsgY291bnQtLSkgeworCQlpbnRzdGF0ID0gcmVhZF9zYmRzaHIoc3BvcnQsCisJCQkJICAgICAgUl9EVUFSVF9JU1JSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwkJaW50c3RhdCAmPSByZWFkX3NiZHNocihzcG9ydCwKKwkJCQkgICAgICAgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwkJaW50c3RhdCAmPSBNX0RVQVJUX0lTUl9BTEw7CisJCWlmICghaW50c3RhdCkKKwkJCWJyZWFrOworCisJCWlmIChpbnRzdGF0ICYgTV9EVUFSVF9JU1JfUlgpCisJCQlzYmRfcmVjZWl2ZV9jaGFycyhzcG9ydCk7CisJCWlmIChpbnRzdGF0ICYgTV9EVUFSVF9JU1JfSU4pCisJCQlzYmRfc3RhdHVzX2hhbmRsZShzcG9ydCk7CisJCWlmIChpbnRzdGF0ICYgTV9EVUFSVF9JU1JfVFgpCisJCQlzYmRfdHJhbnNtaXRfY2hhcnMoc3BvcnQpOworCisJCXN0YXR1cyA9IElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCBzYmRfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCXVuc2lnbmVkIGludCBtb2RlMTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoc3BvcnQtPnBvcnQuaXJxLCBzYmRfaW50ZXJydXB0LAorCQkJICBJUlFGX1NIQVJFRCwgInNiMTI1MC1kdWFydCIsIHNwb3J0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQ2xlYXIgdGhlIHJlY2VpdmUgRklGTy4gICovCisJc2JkX3JlY2VpdmVfZHJhaW4oc3BvcnQpOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCByZWdpc3RlcnMuICAqLworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIFZfRFVBUlRfTUlTQ19DTURfUkVTRVRfQlJFQUtfSU5UKTsKKwlyZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTkNIUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisKKwkvKiBTZXQgcngvdHggaW50ZXJydXB0IHRvIEZJRk8gYXZhaWxhYmxlLiAgKi8KKwltb2RlMSA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEpOworCW1vZGUxICY9IH4oTV9EVUFSVF9SWF9JUlFfU0VMX1JYRlVMTCB8IE1fRFVBUlRfVFhfSVJRX1NFTF9UWEVNUFQpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xLCBtb2RlMSk7CisKKwkvKiBEaXNhYmxlIHR4LCBlbmFibGUgcnguICAqLworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRElTIHwgTV9EVUFSVF9SWF9FTik7CisJc3BvcnQtPnR4X3N0b3BwZWQgPSAxOworCisJLyogRW5hYmxlIGludGVycnVwdHMuICAqLworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLAorCQkgICAgIE1fRFVBUlRfSU1SX0lOIHwgTV9EVUFSVF9JTVJfUlgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9ESVMgfCBNX0RVQVJUX1JYX0RJUyk7CisJc3BvcnQtPnR4X3N0b3BwZWQgPSAxOworCWZyZWVfaXJxKHNwb3J0LT5wb3J0LmlycSwgc3BvcnQpOworfQorCisKK3N0YXRpYyB2b2lkIHNiZF9pbml0X3BvcnQoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKworCWlmIChzcG9ydC0+aW5pdGlhbGlzZWQpCisJCXJldHVybjsKKworCS8qIFRoZXJlIGlzIG5vIERVQVJUIHJlc2V0IGZlYXR1cmUsIHNvIGp1c3Qgc2V0IHNvbWUgc2FuZSBkZWZhdWx0cy4gICovCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgVl9EVUFSVF9NSVNDX0NNRF9SRVNFVF9UWCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgVl9EVUFSVF9NSVNDX0NNRF9SRVNFVF9SWCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEsIFZfRFVBUlRfQklUU19QRVJfQ0hBUl84KTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMiwgMCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0ZVTExfQ1RMLAorCQkgICAgIFZfRFVBUlRfSU5UX1RJTUUoMCkgfCBWX0RVQVJUX1NJR19GVUxMKDE1KSk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX09QQ1JfWCwgMCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0FVWENUTF9YLCAwKTsKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwgMCk7CisKKwlzcG9ydC0+aW5pdGlhbGlzZWQgPSAxOworfQorCitzdGF0aWMgdm9pZCBzYmRfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJdW5zaWduZWQgaW50IG1vZGUxID0gMCwgbW9kZTIgPSAwLCBhdXggPSAwOworCXVuc2lnbmVkIGludCBtb2RlMW1hc2sgPSAwLCBtb2RlMm1hc2sgPSAwLCBhdXhtYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgb2xkbW9kZTEsIG9sZG1vZGUyLCBvbGRhdXg7CisJdW5zaWduZWQgaW50IGJhdWQsIGJyZzsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZDsKKworCW1vZGUxbWFzayB8PSB+KE1fRFVBUlRfUEFSSVRZX01PREUgfCBNX0RVQVJUX1BBUklUWV9UWVBFX09ERCB8CisJCSAgICAgICBNX0RVQVJUX0JJVFNfUEVSX0NIQVIpOworCW1vZGUybWFzayB8PSB+TV9EVUFSVF9TVE9QX0JJVF9MRU5fMjsKKwlhdXhtYXNrIHw9IH5NX0RVQVJUX0NUU19DSE5HX0VOQTsKKworCS8qIEJ5dGUgc2l6ZS4gICovCisJc3dpdGNoICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNToKKwljYXNlIENTNjoKKwkJLyogVW5zdXBwb3J0ZWQsIGxlYXZlIHVuY2hhbmdlZC4gICovCisJCW1vZGUxbWFzayB8PSBNX0RVQVJUX1BBUklUWV9NT0RFOworCQlicmVhazsKKwljYXNlIENTNzoKKwkJbW9kZTEgfD0gVl9EVUFSVF9CSVRTX1BFUl9DSEFSXzc7CisJCWJyZWFrOworCWNhc2UgQ1M4OgorCWRlZmF1bHQ6CisJCW1vZGUxIHw9IFZfRFVBUlRfQklUU19QRVJfQ0hBUl84OworCQlicmVhazsKKwl9CisKKwkvKiBQYXJpdHkgYW5kIHN0b3AgYml0cy4gICovCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU1RPUEIpCisJCW1vZGUyIHw9IE1fRFVBUlRfU1RPUF9CSVRfTEVOXzI7CisJZWxzZQorCQltb2RlMiB8PSBNX0RVQVJUX1NUT1BfQklUX0xFTl8xOworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKQorCQltb2RlMSB8PSBWX0RVQVJUX1BBUklUWV9NT0RFX0FERDsKKwllbHNlCisJCW1vZGUxIHw9IFZfRFVBUlRfUEFSSVRZX01PREVfTk9ORTsKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJbW9kZTEgfD0gTV9EVUFSVF9QQVJJVFlfVFlQRV9PREQ7CisJZWxzZQorCQltb2RlMSB8PSBNX0RVQVJUX1BBUklUWV9UWVBFX0VWRU47CisKKwliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHVwb3J0LCB0ZXJtaW9zLCBvbGRfdGVybWlvcywgMTIwMCwgNTAwMDAwMCk7CisJYnJnID0gVl9EVUFSVF9CQVVEX1JBVEUoYmF1ZCk7CisJLyogVGhlIGFjdHVhbCBsb3dlciBib3VuZCBpcyAxMjIxYnBzLCBzbyBjb21wZW5zYXRlLiAgKi8KKwlpZiAoYnJnID4gTV9EVUFSVF9DTEtfQ09VTlRFUikKKwkJYnJnID0gTV9EVUFSVF9DTEtfQ09VTlRFUjsKKworCXVhcnRfdXBkYXRlX3RpbWVvdXQodXBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOworCisJdXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgPSBNX0RVQVJUX09WUlVOX0VSUjsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElOUENLKQorCQl1cG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBNX0RVQVJUX0ZSTV9FUlIgfAorCQkJCQkgICBNX0RVQVJUX1BBUklUWV9FUlI7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiAoQlJLSU5UIHwgUEFSTVJLKSkKKwkJdXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gTV9EVUFSVF9SQ1ZEX0JSSzsKKworCXVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQorCQl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IE1fRFVBUlRfRlJNX0VSUiB8CisJCQkJCSAgICAgTV9EVUFSVF9QQVJJVFlfRVJSOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOQlJLKSB7CisJCXVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTV9EVUFSVF9SQ1ZEX0JSSzsKKwkJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCisJCQl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IE1fRFVBUlRfT1ZSVU5fRVJSOworCX0KKworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpCisJCWNvbW1hbmQgPSBNX0RVQVJUX1JYX0VOOworCWVsc2UKKwkJY29tbWFuZCA9IE1fRFVBUlRfUlhfRElTOworCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKQorCQlhdXggfD0gTV9EVUFSVF9DVFNfQ0hOR19FTkE7CisJZWxzZQorCQlhdXggJj0gfk1fRFVBUlRfQ1RTX0NITkdfRU5BOworCisJc3Bpbl9sb2NrKCZ1cG9ydC0+bG9jayk7CisKKwlpZiAoc3BvcnQtPnR4X3N0b3BwZWQpCisJCWNvbW1hbmQgfD0gTV9EVUFSVF9UWF9ESVM7CisJZWxzZQorCQljb21tYW5kIHw9IE1fRFVBUlRfVFhfRU47CisKKwlvbGRtb2RlMSA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEpICYgbW9kZTFtYXNrOworCW9sZG1vZGUyID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMikgJiBtb2RlMm1hc2s7CisJb2xkYXV4ID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQVVYQ1RMX1gpICYgYXV4bWFzazsKKworCWlmICghc3BvcnQtPnR4X3N0b3BwZWQpCisJCXNiZF9saW5lX2RyYWluKHNwb3J0KTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBNX0RVQVJUX1RYX0RJUyB8IE1fRFVBUlRfUlhfRElTKTsKKworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xLCBtb2RlMSB8IG9sZG1vZGUxKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMiwgbW9kZTIgfCBvbGRtb2RlMik7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NMS19TRUwsIGJyZyk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0FVWENUTF9YLCBhdXggfCBvbGRhdXgpOworCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgY29tbWFuZCk7CisKKwlzcGluX3VubG9jaygmdXBvcnQtPmxvY2spOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpzYmRfdHlwZShzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlyZXR1cm4gIlNCMTI1MCBEVUFSVCI7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwlzdHJ1Y3Qgc2JkX2R1YXJ0ICpkdWFydCA9IHNwb3J0LT5kdWFydDsKKwlpbnQgbWFwX2d1YXJkOworCisJaW91bm1hcChzcG9ydC0+bWVtY3RybCk7CisJc3BvcnQtPm1lbWN0cmwgPSBOVUxMOworCWlvdW5tYXAodXBvcnQtPm1lbWJhc2UpOworCXVwb3J0LT5tZW1iYXNlID0gTlVMTDsKKworCW1hcF9ndWFyZCA9IGF0b21pY19hZGRfcmV0dXJuKC0xLCAmZHVhcnQtPm1hcF9ndWFyZCk7CisJaWYgKCFtYXBfZ3VhcmQpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihkdWFydC0+bWFwY3RybCwgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwlyZWxlYXNlX21lbV9yZWdpb24odXBvcnQtPm1hcGJhc2UsIERVQVJUX0NIQU5SRUdfU1BBQ0lORyk7Cit9CisKK3N0YXRpYyBpbnQgc2JkX21hcF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0YXRpYyBjb25zdCBjaGFyICplcnIgPSBLRVJOX0VSUiAic2JkOiBDYW5ub3QgbWFwIE1NSU9cbiI7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwlzdHJ1Y3Qgc2JkX2R1YXJ0ICpkdWFydCA9IHNwb3J0LT5kdWFydDsKKworCWlmICghdXBvcnQtPm1lbWJhc2UpCisJCXVwb3J0LT5tZW1iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHVwb3J0LT5tYXBiYXNlLAorCQkJCQkJIERVQVJUX0NIQU5SRUdfU1BBQ0lORyk7CisJaWYgKCF1cG9ydC0+bWVtYmFzZSkgeworCQlwcmludGsoZXJyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCFzcG9ydC0+bWVtY3RybCkKKwkJc3BvcnQtPm1lbWN0cmwgPSBpb3JlbWFwX25vY2FjaGUoZHVhcnQtPm1hcGN0cmwsCisJCQkJCQkgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwlpZiAoIXNwb3J0LT5tZW1jdHJsKSB7CisJCXByaW50ayhlcnIpOworCQlpb3VubWFwKHVwb3J0LT5tZW1iYXNlKTsKKwkJdXBvcnQtPm1lbWJhc2UgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYmRfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0YXRpYyBjb25zdCBjaGFyICplcnIgPSBLRVJOX0VSUgorCQkJCSAic2JkOiBVbmFibGUgdG8gcmVzZXJ2ZSBNTUlPIHJlc291cmNlXG4iOworCXN0cnVjdCBzYmRfZHVhcnQgKmR1YXJ0ID0gdG9fc3BvcnQodXBvcnQpLT5kdWFydDsKKwlpbnQgbWFwX2d1YXJkOworCWludCByZXQgPSAwOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24odXBvcnQtPm1hcGJhc2UsIERVQVJUX0NIQU5SRUdfU1BBQ0lORywKKwkJCQkic2IxMjUwLWR1YXJ0IikpIHsKKwkJcHJpbnRrKGVycik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW1hcF9ndWFyZCA9IGF0b21pY19hZGRfcmV0dXJuKDEsICZkdWFydC0+bWFwX2d1YXJkKTsKKwlpZiAobWFwX2d1YXJkID09IDEpIHsKKwkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZHVhcnQtPm1hcGN0cmwsIERVQVJUX0NIQU5SRUdfU1BBQ0lORywKKwkJCQkJInNiMTI1MC1kdWFydCIpKSB7CisJCQlhdG9taWNfYWRkKC0xLCAmZHVhcnQtPm1hcF9ndWFyZCk7CisJCQlwcmludGsoZXJyKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJfQorCX0KKwlpZiAoIXJldCkgeworCQlyZXQgPSBzYmRfbWFwX3BvcnQodXBvcnQpOworCQlpZiAocmV0KSB7CisJCQltYXBfZ3VhcmQgPSBhdG9taWNfYWRkX3JldHVybigtMSwgJmR1YXJ0LT5tYXBfZ3VhcmQpOworCQkJaWYgKCFtYXBfZ3VhcmQpCisJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGR1YXJ0LT5tYXBjdHJsLAorCQkJCQkJICAgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwkJfQorCX0KKwlpZiAocmV0KSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbih1cG9ydC0+bWFwYmFzZSwgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwlpZiAoZmxhZ3MgJiBVQVJUX0NPTkZJR19UWVBFKSB7CisJCWlmIChzYmRfcmVxdWVzdF9wb3J0KHVwb3J0KSkKKwkJCXJldHVybjsKKworCQl1cG9ydC0+dHlwZSA9IFBPUlRfU0IxMjUwX0RVQVJUOworCisJCXNiZF9pbml0X3BvcnQoc3BvcnQpOworCX0KK30KKworc3RhdGljIGludCBzYmRfdmVyaWZ5X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc2VyLT50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiBzZXItPnR5cGUgIT0gUE9SVF9TQjEyNTBfRFVBUlQpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKHNlci0+aXJxICE9IHVwb3J0LT5pcnEpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKHNlci0+YmF1ZF9iYXNlICE9IHVwb3J0LT51YXJ0Y2xrIC8gMTYpCisJCXJldCA9IC1FSU5WQUw7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIHNiZF9vcHMgPSB7CisJLnR4X2VtcHR5CT0gc2JkX3R4X2VtcHR5LAorCS5zZXRfbWN0cmwJPSBzYmRfc2V0X21jdHJsLAorCS5nZXRfbWN0cmwJPSBzYmRfZ2V0X21jdHJsLAorCS5zdG9wX3R4CT0gc2JkX3N0b3BfdHgsCisJLnN0YXJ0X3R4CT0gc2JkX3N0YXJ0X3R4LAorCS5zdG9wX3J4CT0gc2JkX3N0b3BfcngsCisJLmVuYWJsZV9tcwk9IHNiZF9lbmFibGVfbXMsCisJLmJyZWFrX2N0bAk9IHNiZF9icmVha19jdGwsCisJLnN0YXJ0dXAJPSBzYmRfc3RhcnR1cCwKKwkuc2h1dGRvd24JPSBzYmRfc2h1dGRvd24sCisJLnNldF90ZXJtaW9zCT0gc2JkX3NldF90ZXJtaW9zLAorCS50eXBlCQk9IHNiZF90eXBlLAorCS5yZWxlYXNlX3BvcnQJPSBzYmRfcmVsZWFzZV9wb3J0LAorCS5yZXF1ZXN0X3BvcnQJPSBzYmRfcmVxdWVzdF9wb3J0LAorCS5jb25maWdfcG9ydAk9IHNiZF9jb25maWdfcG9ydCwKKwkudmVyaWZ5X3BvcnQJPSBzYmRfdmVyaWZ5X3BvcnQsCit9OworCisvKiBJbml0aWFsaXplIFNCMTI1MCBEVUFSVCBwb3J0IHN0cnVjdHVyZXMuICAqLworc3RhdGljIHZvaWQgX19pbml0IHNiZF9wcm9iZV9kdWFydHModm9pZCkKK3sKKwlzdGF0aWMgaW50IHByb2JlZDsKKwlpbnQgY2hpcCwgc2lkZTsKKwlpbnQgbWF4X2xpbmVzLCBsaW5lOworCisJaWYgKHByb2JlZCkKKwkJcmV0dXJuOworCisJLyogU2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHVuaXRzIGJhc2VkIG9uIHRoZSBTT0MgdHlwZS4gICovCisJc3dpdGNoIChzb2NfdHlwZSkgeworCWNhc2UgS19TWVNfU09DX1RZUEVfQkNNMXg1NToKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTF4ODA6CisJCW1heF9saW5lcyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEFzc3VtZSBhdCBsZWFzdCB0d28gc2VyaWFsIHBvcnRzIGF0IHRoZSBub3JtYWwgYWRkcmVzcy4gICovCisJCW1heF9saW5lcyA9IDI7CisJCWJyZWFrOworCX0KKworCXByb2JlZCA9IDE7CisKKwlmb3IgKGNoaXAgPSAwLCBsaW5lID0gMDsgY2hpcCA8IERVQVJUX01BWF9DSElQICYmIGxpbmUgPCBtYXhfbGluZXM7CisJICAgICBjaGlwKyspIHsKKwkJc2JkX2R1YXJ0c1tjaGlwXS5tYXBjdHJsID0gU0JEX0NUUkxSRUdTKGxpbmUpOworCisJCWZvciAoc2lkZSA9IDA7IHNpZGUgPCBEVUFSVF9NQVhfU0lERSAmJiBsaW5lIDwgbWF4X2xpbmVzOworCQkgICAgIHNpZGUrKywgbGluZSsrKSB7CisJCQlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gJnNiZF9kdWFydHNbY2hpcF0uc3BvcnRbc2lkZV07CisJCQlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKworCQkJc3BvcnQtPmR1YXJ0CT0gJnNiZF9kdWFydHNbY2hpcF07CisKKwkJCXVwb3J0LT5pcnEJPSBTQkRfSU5UKGxpbmUpOworCQkJdXBvcnQtPnVhcnRjbGsJPSAxMDAwMDAwMDAgLyAyMCAqIDE2OworCQkJdXBvcnQtPmZpZm9zaXplCT0gMTY7CisJCQl1cG9ydC0+aW90eXBlCT0gVVBJT19NRU07CisJCQl1cG9ydC0+ZmxhZ3MJPSBVUEZfQk9PVF9BVVRPQ09ORjsKKwkJCXVwb3J0LT5vcHMJPSAmc2JkX29wczsKKwkJCXVwb3J0LT5saW5lCT0gbGluZTsKKwkJCXVwb3J0LT5tYXBiYXNlCT0gU0JEX0NIQU5SRUdTKGxpbmUpOworCQl9CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFCisvKgorICogU2VyaWFsIGNvbnNvbGUgc3R1ZmYuICBWZXJ5IGJhc2ljLCBwb2xsaW5nIGRyaXZlciBmb3IgZG9pbmcgc2VyaWFsCisgKiBjb25zb2xlIG91dHB1dC4gIFRoZSBjb25zb2xlX3NlbSBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIsIHNvIHdlCisgKiBzaG91bGRuJ3QgYmUgaW50ZXJydXB0ZWQgZm9yIG1vcmUgY29uc29sZSBhY3Rpdml0eS4KKyAqLworc3RhdGljIHZvaWQgc2JkX2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgaW50IGNoKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwlzYmRfdHJhbnNtaXRfZHJhaW4oc3BvcnQpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9UWF9IT0xELCBjaCk7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgY2hpcCA9IGNvLT5pbmRleCAvIERVQVJUX01BWF9TSURFOworCWludCBzaWRlID0gY28tPmluZGV4ICUgRFVBUlRfTUFYX1NJREU7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9ICZzYmRfZHVhcnRzW2NoaXBdLnNwb3J0W3NpZGVdOworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwkvKiBEaXNhYmxlIHRyYW5zbWl0IGludGVycnVwdHMgYW5kIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJbWFzayA9IHJlYWRfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMikpOworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLAorCQkgICAgIG1hc2sgJiB+TV9EVUFSVF9JTVJfVFgpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRU4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisKKwl1YXJ0X2NvbnNvbGVfd3JpdGUoJnNwb3J0LT5wb3J0LCBzLCBjb3VudCwgc2JkX2NvbnNvbGVfcHV0Y2hhcik7CisKKwkvKiBSZXN0b3JlIHRyYW5zbWl0IGludGVycnVwdHMgYW5kIHRoZSB0cmFuc21pdHRlciBlbmFibGUuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJc2JkX2xpbmVfZHJhaW4oc3BvcnQpOworCWlmIChzcG9ydC0+dHhfc3RvcHBlZCkKKwkJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9ESVMpOworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLCBtYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzYmRfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJaW50IGNoaXAgPSBjby0+aW5kZXggLyBEVUFSVF9NQVhfU0lERTsKKwlpbnQgc2lkZSA9IGNvLT5pbmRleCAlIERVQVJUX01BWF9TSURFOworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSAmc2JkX2R1YXJ0c1tjaGlwXS5zcG9ydFtzaWRlXTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKwlpbnQgYmF1ZCA9IDExNTIwMDsKKwlpbnQgYml0cyA9IDg7CisJaW50IHBhcml0eSA9ICduJzsKKwlpbnQgZmxvdyA9ICduJzsKKwlpbnQgcmV0OworCisJaWYgKCFzcG9ydC0+ZHVhcnQpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSBzYmRfbWFwX3BvcnQodXBvcnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzYmRfaW5pdF9wb3J0KHNwb3J0KTsKKworCWlmIChvcHRpb25zKQorCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CisJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnModXBvcnQsIGNvLCBiYXVkLCBwYXJpdHksIGJpdHMsIGZsb3cpOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHNiZF9yZWc7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgc2JkX2NvbnNvbGUgPSB7CisJLm5hbWUJPSAiZHVhcnQiLAorCS53cml0ZQk9IHNiZF9jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAorCS5zZXR1cAk9IHNiZF9jb25zb2xlX3NldHVwLAorCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJPSAtMSwKKwkuZGF0YQk9ICZzYmRfcmVnCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYmRfc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCXNiZF9wcm9iZV9kdWFydHMoKTsKKwlyZWdpc3Rlcl9jb25zb2xlKCZzYmRfY29uc29sZSk7CisKKwlyZXR1cm4gMDsKK30KKworY29uc29sZV9pbml0Y2FsbChzYmRfc2VyaWFsX2NvbnNvbGVfaW5pdCk7CisKKyNkZWZpbmUgU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFCSZzYmRfY29uc29sZQorI2Vsc2UKKyNkZWZpbmUgU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFICovCisKKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzYmRfcmVnID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAic2VyaWFsIiwKKwkuZGV2X25hbWUJPSAiZHVhcnQiLAorCS5tYWpvcgkJPSBUVFlfTUFKT1IsCisJLm1pbm9yCQk9IFNCMTI1MF9EVUFSVF9NSU5PUl9CQVNFLAorCS5ucgkJPSBEVUFSVF9NQVhfQ0hJUCAqIERVQVJUX01BWF9TSURFLAorCS5jb25zCQk9IFNFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRSwKK307CisKKy8qIFNldCB1cCB0aGUgZHJpdmVyIGFuZCByZWdpc3RlciBpdC4gICovCitzdGF0aWMgaW50IF9faW5pdCBzYmRfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisKKwlzYmRfcHJvYmVfZHVhcnRzKCk7CisKKwlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmc2JkX3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBEVUFSVF9NQVhfQ0hJUCAqIERVQVJUX01BWF9TSURFOyBpKyspIHsKKwkJc3RydWN0IHNiZF9kdWFydCAqZHVhcnQgPSAmc2JkX2R1YXJ0c1tpIC8gRFVBUlRfTUFYX1NJREVdOworCQlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gJmR1YXJ0LT5zcG9ydFtpICUgRFVBUlRfTUFYX1NJREVdOworCQlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKworCQlpZiAoc3BvcnQtPmR1YXJ0KQorCQkJdWFydF9hZGRfb25lX3BvcnQoJnNiZF9yZWcsIHVwb3J0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVW5sb2FkIHRoZSBkcml2ZXIuICBVbnJlZ2lzdGVyIHN0dWZmLCBnZXQgcmVhZHkgdG8gZ28gYXdheS4gICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc2JkX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IERVQVJUX01BWF9DSElQICogRFVBUlRfTUFYX1NJREUgLSAxOyBpID49IDA7IGktLSkgeworCQlzdHJ1Y3Qgc2JkX2R1YXJ0ICpkdWFydCA9ICZzYmRfZHVhcnRzW2kgLyBEVUFSVF9NQVhfU0lERV07CisJCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSAmZHVhcnQtPnNwb3J0W2kgJSBEVUFSVF9NQVhfU0lERV07CisJCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCisJCWlmIChzcG9ydC0+ZHVhcnQpCisJCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2JkX3JlZywgdXBvcnQpOworCX0KKworCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNiZF9yZWcpOworfQorCittb2R1bGVfaW5pdChzYmRfaW5pdCk7Cittb2R1bGVfZXhpdChzYmRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCAzMjYwMjBmLi45YzU3NDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKQEAgLTE5MTAsNiArMTkxMCwxMiBAQAogCWlmIChmbG93ID09ICdyJykKIAkJdGVybWlvcy5jX2NmbGFnIHw9IENSVFNDVFM7CiAKKwkvKgorCSAqIHNvbWUgdWFydHMgb24gb3RoZXIgc2lkZSBkb24ndCBzdXBwb3J0IG5vIGZsb3cgY29udHJvbC4KKwkgKiBTbyB3ZSBzZXQgKiBEVFIgaW4gaG9zdCB1YXJ0IHRvIG1ha2UgdGhlbSBoYXBweQorCSAqLworCXBvcnQtPm1jdHJsIHw9IFRJT0NNX0RUUjsKKwogCXBvcnQtPm9wcy0+c2V0X3Rlcm1pb3MocG9ydCwgJnRlcm1pb3MsIE5VTEwpOwogCWNvLT5jZmxhZyA9IHRlcm1pb3MuY19jZmxhZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwppbmRleCAxZjg5NDk2Li42NzJjZDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwpAQCAtMzY3LDcgKzM2Nyw5IEBACiAJfSBlbHNlIHsKICNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzCiAJCS8qIE5vdGhpbmcgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCiAJCWN0cmxfb3V0dygweDAwODAsIFNDU1BUUjApOyAvKiBTZXQgUlRTID0gMSAqLwogI2Vsc2UKIAkJY3RybF9vdXR3KDB4MDA4MCwgU0NTUFRSMik7IC8qIFNldCBSVFMgPSAxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaCBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCmluZGV4IGZiMDRmYjUuLjI0N2ZiNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCkBAIC01Myw3ICs1MywxMiBAQAogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCiAjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpIDB4M2EgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogIyBkZWZpbmUgU0NJRl9PTkxZCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkgIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIpCiAjIGRlZmluZSBTQ1NQVFIxIDB4ZmZlMDAwMWMgLyogOCAgYml0IFNDSSAqLwogIyBkZWZpbmUgU0NTUFRSMiAweEZGRTgwMDIwIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KQEAgLTczLDcgKzc4LDcgQEAKICMgZGVmaW5lIFNDUERSICAweEE0MDUwMTM2ICAgICAgICAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KSAgMHgwMDMwIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSAqLwogIyBkZWZpbmUgU0NJRl9PTkxZCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikgCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikKICMgZGVmaW5lIFNDU1BUUjAgMHhBNDQwMDAwMAkgIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lfTlBPUlRTIDIKICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwpAQCAtMTY4LDYgKzE3MywxNCBAQAogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KICMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkJMHgzOCAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCiAjIGRlZmluZSBTQ0lGX09OTFkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCisjIGRlZmluZSBTQ1NQVFIwIDB4ZmZjMzAwMjAJCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIxIDB4ZmZjNDAwMjAJCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIyIDB4ZmZjNTAwMjAJCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIzIDB4ZmZjNjAwMjAJCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxCQkvKiBPdmVycnVuIGVycm9yIGJpdCAqLworIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KQkweDM4CS8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8KKyMgZGVmaW5lIFNDSUZfT05MWQogI2Vsc2UKICMgZXJyb3IgQ1BVIHN1YnR5cGUgbm90IGRlZmluZWQKICNlbmRpZgpAQCAtMTc3LDEwICsxOTAsMTUgQEAKICNkZWZpbmUgU0NJX0NUUkxfRkxBR1NfUklFICAweDQwIC8qIGFsbCAqLwogI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19URSAgIDB4MjAgLyogYWxsICovCiAjZGVmaW5lIFNDSV9DVFJMX0ZMQUdTX1JFICAgMHgxMCAvKiBhbGwgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkgIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUykgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQogI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SRUlFIDB4MDggLyogNzc1MCBTQ0lGICovCiAjZWxzZQogI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SRUlFIDAKQEAgLTUxNCw4ICs1MzIsMTIgQEAKIAl9CiB9CiAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKSB8fCBcCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApICB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpICB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEpICB8fCBcCiAgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQogc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewpAQCAtNjUzLDYgKzY3NSwxOCBAQAogCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMikgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLwogCXJldHVybiAxOwogfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKK3N0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmYzMwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMCkgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZjNDAwMDApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIxKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmM1MDAwMCkKKwkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjIpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmYzYwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMykgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworfQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMgYi9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKaW5kZXggYTI3ZTllOS4uNDFmYzYxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKQEAgLTc1OSw3ICs3NTksNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIHNuX3NhbF9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQpOwotc3RhdGljIGludCBfX2luaXQgc25fc2FsX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgc25fc2FsX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKiwgY2hhciAqKTsKIHN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc2FsX2NvbnNvbGVfdWFydDsKIGV4dGVybiBzdHJ1Y3QgdHR5X2RyaXZlciAqdWFydF9jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqLCBpbnQgKik7CiAKQEAgLTEwMDYsNyArMTAwNiw3IEBACiAgKiBoZXJlIHNvIHByb3ZpZGluZyBpdCBpcyBlYXNpZXIuCiAgKgogICovCi1zdGF0aWMgaW50IF9faW5pdCBzbl9zYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50IHNuX3NhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5odi5jCmluZGV4IDk2NTU3ZTYuLmQ4MmJlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3VuaHYuYwpAQCAtMjU4LDE3ICsyNTgsNyBAQAogLyogcG9ydC0+bG9jayBoZWxkIGJ5IGNhbGxlci4gICovCiBzdGF0aWMgdm9pZCBzdW5odl9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OwotCi0Jd2hpbGUgKCF1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpIHsKLQkJbG9uZyBzdGF0dXMgPSBzdW40dl9jb25fcHV0Y2hhcih4bWl0LT5idWZbeG1pdC0+dGFpbF0pOwotCi0JCWlmIChzdGF0dXMgIT0gSFZfRU9LKQotCQkJYnJlYWs7Ci0KLQkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQkJcG9ydC0+aWNvdW50LnR4Kys7Ci0JfQorCXRyYW5zbWl0X2NoYXJzKHBvcnQpOwogfQogCiAvKiBwb3J0LT5sb2NrIGlzIG5vdCBoZWxkLiAgKi8KQEAgLTQ0MCw4ICs0MzAsMTYgQEAKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gc3VuaHZfcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsb2NrZWQgPSAxOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHBvcnQtPnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmcG9ydC0+bG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisKIAl3aGlsZSAobiA+IDApIHsKIAkJdW5zaWduZWQgbG9uZyByYSA9IF9fcGEoY29uX3dyaXRlX3BhZ2UpOwogCQl1bnNpZ25lZCBsb25nIHBhZ2VfYnl0ZXM7CkBAIC00NjksNyArNDY3LDEwIEBACiAJCQlyYSArPSB3cml0dGVuOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChsb2NrZWQpCisJCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdW5odl9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY2hhciBjKQpAQCAtNDg4LDcgKzQ4OSwxNSBAQAogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBzdW5odl9wb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7CisJaW50IGksIGxvY2tlZCA9IDE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHBvcnQtPnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmcG9ydC0+bG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKQEAgLTQ5Niw3ICs1MDUsMTAgQEAKIAkJCXN1bmh2X2NvbnNvbGVfcHV0Y2hhcihwb3J0LCAnXHInKTsKIAkJc3VuaHZfY29uc29sZV9wdXRjaGFyKHBvcnQsICpzKyspOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgc3VuaHZfY29uc29sZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggZGViOWFiNC4uOGEwZjllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKQEAgLTg2MCwyMiArODYwLDMxIEBACiBzdGF0aWMgdm9pZCBzdW5zYWJfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjKQogewogCXN0cnVjdCB1YXJ0X3N1bnNhYl9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKIAlzdW5zYWJfdGVjX3dhaXQodXApOwogCXdyaXRlYihjLCAmdXAtPnJlZ3MtPncudGljKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc3Vuc2FiX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbiwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbikKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAmc3Vuc2FiX3BvcnRzW2Nvbi0+aW5kZXhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxvY2tlZCA9IDE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHVwLT5wb3J0LnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmdXAtPnBvcnQubG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CiAKIAl1YXJ0X2NvbnNvbGVfd3JpdGUoJnVwLT5wb3J0LCBzLCBuLCBzdW5zYWJfY29uc29sZV9wdXRjaGFyKTsKIAlzdW5zYWJfdGVjX3dhaXQodXApOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBzdW5zYWJfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29uLCBjaGFyICpvcHRpb25zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKaW5kZXggMmE2M2NkYi4uMjZkNzIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCkBAIC0xMjg4LDcgKzEyODgsMTcgQEAKIAkJCQl1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJc3RydWN0IHVhcnRfc3Vuc3VfcG9ydCAqdXAgPSAmc3Vuc3VfcG9ydHNbY28tPmluZGV4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBpZXI7CisJaW50IGxvY2tlZCA9IDE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHVwLT5wb3J0LnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmdXAtPnBvcnQubG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CiAKIAkvKgogCSAqCUZpcnN0IHNhdmUgdGhlIFVFUiB0aGVuIGRpc2FibGUgdGhlIGludGVycnVwdHMKQEAgLTEzMDQsNiArMTMxNCwxMCBAQAogCSAqLwogCXdhaXRfZm9yX3htaXRyKHVwKTsKIAlzZXJpYWxfb3V0KHVwLCBVQVJUX0lFUiwgaWVyKTsKKworCWlmIChsb2NrZWQpCisJCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwppbmRleCAxNWI2ZTFjLi4wYTNlMTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKQEAgLTksNyArOSw3IEBACiAgKiBDLiBEb3N0LCBQZXRlIFphaXRjZXYsIFRlZCBUcydvIGFuZCBBbGV4IEJ1ZWxsIGZvciB0aGVpcgogICogd29yayB0aGVyZS4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTE1MSwxMSArMTE1MSwyMiBAQAogewogCXN0cnVjdCB1YXJ0X3N1bnppbG9nX3BvcnQgKnVwID0gJnN1bnppbG9nX3BvcnRfdGFibGVbY29uLT5pbmRleF07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbG9ja2VkID0gMTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICh1cC0+cG9ydC5zeXNycSkgeworCQlsb2NrZWQgPSAwOworCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgeworCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnVwLT5wb3J0LmxvY2spOworCX0gZWxzZQorCQlzcGluX2xvY2soJnVwLT5wb3J0LmxvY2spOworCiAJdWFydF9jb25zb2xlX3dyaXRlKCZ1cC0+cG9ydCwgcywgY291bnQsIHN1bnppbG9nX3B1dGNoYXIpOwogCXVkZWxheSgyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9jaygmdXAtPnBvcnQubG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzdW56aWxvZ19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjb24sIGNoYXIgKm9wdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwppbmRleCA1ZTNmNzQ4Li5iOTE1NzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTEwNyw2ICsxMDcsMTUgQEAKIAkgIFRoaXMgZW5hYmxlcyB1c2luZyB0aGUgRnJlZXNjYWxlIGlNWCBTUEkgY29udHJvbGxlciBpbiBtYXN0ZXIKIAkgIG1vZGUuCiAKK2NvbmZpZyBTUElfTE03MF9MTFAKKwl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIGZvciBMTTcwIGV2YWwgYm9hcmQgKERFVkVMT1BNRU5UKSIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTlMgTE03MCBMTFAgRXZhbHVhdGlvbiBCb2FyZCwKKwkgIHdoaWNoIGludGVyZmFjZXMgdG8gYW4gTE03MCB0ZW1wZXJhdHVyZSBzZW5zb3IgdXNpbmcKKwkgIGEgcGFyYWxsZWwgcG9ydC4KKwogY29uZmlnIFNQSV9NUEM1Mnh4X1BTQwogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDNTJ4eCBQU0MgU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFBQQ19NUEM1Mnh4ICYmIEVYUEVSSU1FTlRBTApAQCAtMTMzLDYgKzE0MiwxMiBAQAogCWhlbHAKIAkgIFRoaXMgaG9va3MgdXAgdG8gdGhlIE1pY3JvV2lyZSBjb250cm9sbGVyIG9uIE9NQVAxIGNoaXBzLgogCitjb25maWcgU1BJX09NQVAyNFhYCisJdHJpc3RhdGUgIk1jU1BJIGRyaXZlciBmb3IgT01BUDI0eHgiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEFSQ0hfT01BUDI0WFgKKwloZWxwCisJICBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZm9yIE9NQVAyNHh4IE11bHRpY2hhbm5lbCBTUEkKKwkgIChNY1NQSSkgbW9kdWxlcy4KIAogY29uZmlnIFNQSV9QWEEyWFgKIAl0cmlzdGF0ZSAiUFhBMnh4IFNTUCBTUEkgbWFzdGVyIgpAQCAtMTQ1LDE3ICsxNjAsMzYgQEAKIGNvbmZpZyBTUElfUzNDMjRYWAogCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0WFggc2VyaWVzIFNQSSIKIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgQVJDSF9TM0MyNDEwICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORwogCWhlbHAKIAkgIFNQSSBkcml2ZXIgZm9yIFNhbXN1bmcgUzNDMjRYWCBzZXJpZXMgQVJNIFNvQ3MKIAogY29uZmlnIFNQSV9TM0MyNFhYX0dQSU8KIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTM0MyNFhYIHNlcmllcyBTUEkgYnkgR1BJTyIKLQlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgQVJDSF9TM0MyNDEwICYmIFNQSV9CSVRCQU5HICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBBUkNIX1MzQzI0MTAgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNQSV9CSVRCQU5HCiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgU2Ftc3VuZyBTM0MyNFhYIHNlcmllcyBBUk0gU29DcyB1c2luZwogCSAgR1BJTyBsaW5lcyB0byBwcm92aWRlIHRoZSBTUEkgYnVzLiBUaGlzIGNhbiBiZSB1c2VkIHdoZXJlCiAJICB0aGUgaW5idWlsdCBoYXJkd2FyZSBjYW5ub3QgcHJvdmlkZSB0aGUgdHJhbnNmZXIgbW9kZSwgb3IKIAkgIHdoZXJlIHRoZSBib2FyZCBpcyB1c2luZyBub24gaGFyZHdhcmUgY29ubmVjdGVkIHBpbnMuCisKK2NvbmZpZyBTUElfVFhYOQorCXRyaXN0YXRlICJUb3NoaWJhIFRYeDkgU1BJIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEdFTkVSSUNfR1BJTyAmJiBDUFVfVFg0OVhYCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgVG9zaGliYSBUWHg5IE1JUFMgU29DcworCitjb25maWcgU1BJX1hJTElOWAorCXRyaXN0YXRlICJYaWxpbnggU1BJIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFhJTElOWF9WSVJURVggJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgVGhpcyBleHBvc2VzIHRoZSBTUEkgY29udHJvbGxlciBJUCBmcm9tIHRoZSBYaWxpbnggRURLLgorCisJICBTZWUgdGhlICJPUEIgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChTUEkpICh2MS4wMGUpIgorCSAgUHJvZHVjdCBTcGVjaWZpY2F0aW9uIGRvY3VtZW50IChEUzQ2NCkgZm9yIGhhcmR3YXJlIGRldGFpbHMuCisKICMKICMgQWRkIG5ldyBTUEkgbWFzdGVyIGNvbnRyb2xsZXJzIGluIGFscGhhYmV0aWNhbCBvcmRlciBhYm92ZSB0aGlzIGxpbmUKICMKQEAgLTE4Nyw2ICsyMjEsMTUgQEAKIAkgIE5vdGUgdGhhdCB0aGlzIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZSBpcyBFWFBFUklNRU5UQUwKIAkgIGFuZCBoZW5jZSBTVUJKRUNUIFRPIENIQU5HRSBXSVRIT1VUIE5PVElDRSB3aGlsZSBpdCBzdGFiaWxpemVzLgogCitjb25maWcgU1BJX1RMRTYyWDAKKwl0cmlzdGF0ZSAiSW5maW5lb24gVExFNjJYMCAoZm9yIHBvd2VyIHN3aXRjaGluZykiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFNZU0ZTCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgSW5maW5lb24gVExFNjJYMCBzZXJpZXMgbGluZSBkcml2ZXIgY2hpcHMsCisJICBzdWNoIGFzIHRoZSBUTEU2MjIwLCBUTEU2MjMwIGFuZCBUTEU2MjQwLiAgVGhpcyBwcm92aWRlcyBhCisJICBzeXNmcyBpbnRlcmZhY2UsIHdpdGggZWFjaCBsaW5lIHByZXNlbnRlZCBhcyBhIGtpbmQgb2YgR1BJTworCSAgZXhwb3NpbmcgYm90aCBzd2l0Y2ggY29udHJvbCBhbmQgZGlhZ25vc3RpYyBmZWVkYmFjay4KKwogIwogIyBBZGQgbmV3IFNQSSBwcm90b2NvbCBtYXN0ZXJzIGluIGFscGhhYmV0aWNhbCBvcmRlciBhYm92ZSB0aGlzIGxpbmUKICMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL01ha2VmaWxlIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKaW5kZXggNTc4OGQ4Ni4uNDFmYmFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTE3LDE3ICsxNywyMiBAQAogb2JqLSQoQ09ORklHX1NQSV9BVTE1NTApCQkrPSBhdTE1NTBfc3BpLm8KIG9iai0kKENPTkZJR19TUElfQlVUVEVSRkxZKQkJKz0gc3BpX2J1dHRlcmZseS5vCiBvYmotJChDT05GSUdfU1BJX0lNWCkJCQkrPSBzcGlfaW14Lm8KK29iai0kKENPTkZJR19TUElfTE03MF9MTFApCQkrPSBzcGlfbG03MGxscC5vCiBvYmotJChDT05GSUdfU1BJX1BYQTJYWCkJCSs9IHB4YTJ4eF9zcGkubwogb2JqLSQoQ09ORklHX1NQSV9PTUFQX1VXSVJFKQkJKz0gb21hcF91d2lyZS5vCitvYmotJChDT05GSUdfU1BJX09NQVAyNFhYKQkJKz0gb21hcDJfbWNzcGkubwogb2JqLSQoQ09ORklHX1NQSV9NUEM1Mnh4X1BTQykJCSs9IG1wYzUyeHhfcHNjX3NwaS5vCiBvYmotJChDT05GSUdfU1BJX01QQzgzeHgpCQkrPSBzcGlfbXBjODN4eC5vCiBvYmotJChDT05GSUdfU1BJX1MzQzI0WFhfR1BJTykJCSs9IHNwaV9zM2MyNHh4X2dwaW8ubwogb2JqLSQoQ09ORklHX1NQSV9TM0MyNFhYKQkJKz0gc3BpX3MzYzI0eHgubworb2JqLSQoQ09ORklHX1NQSV9UWFg5KQkJCSs9IHNwaV90eHg5Lm8KK29iai0kKENPTkZJR19TUElfWElMSU5YKQkJKz0geGlsaW54X3NwaS5vCiAjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KIAogIyBTUEkgcHJvdG9jb2wgZHJpdmVycyAoZGV2aWNlL2xpbmsgb24gYnVzKQogb2JqLSQoQ09ORklHX1NQSV9BVDI1KQkJKz0gYXQyNS5vCiBvYmotJChDT05GSUdfU1BJX1NQSURFVikJKz0gc3BpZGV2Lm8KK29iai0kKENPTkZJR19TUElfVExFNjJYMCkJKz0gdGxlNjJ4MC5vCiAjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KIAogIyBTUEkgc2xhdmUgY29udHJvbGxlciBkcml2ZXJzICh1cHN0cmVhbSBsaW5rKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMgYi9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYwppbmRleCA4YjI2MDFkLi5hZDE0NDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYwpAQCAtNDYsNiArNDYsNyBAQAogCXN0cnVjdCBjbGsJCSpjbGs7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKIAl1bnNpZ25lZAkJbmV3XzE6MTsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3RheTsKIAogCXU4CQkJc3RvcHBpbmc7CiAJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKQEAgLTYyLDI5ICs2Myw2MiBAQAogLyoKICAqIEVhcmxpZXIgU1BJIGNvbnRyb2xsZXJzIChlLmcuIG9uIGF0OTFybTkyMDApIGhhdmUgYSBkZXNpZ24gYnVnIHdoZXJlYnkKICAqIHRoZXkgYXNzdW1lIHRoYXQgc3BpIHNsYXZlIGRldmljZSBzdGF0ZSB3aWxsIG5vdCBjaGFuZ2Ugb24gZGVzZWxlY3QsIHNvCi0gKiB0aGF0IGF1dG9tYWdpYyBkZXNlbGVjdGlvbiBpcyBPSy4gIE5vdCBzbyEgIFdvcmthcm91bmQgdXNlcyBuQ1N4IHBpbnMKLSAqIGFzIEdQSU9zOyBvciBuZXdlciBjb250cm9sbGVycyBoYXZlIENTQUFUIGFuZCBmcmllbmRzLgorICogdGhhdCBhdXRvbWFnaWMgZGVzZWxlY3Rpb24gaXMgT0suICAoIk5QQ1N4IHJpc2VzIGlmIG5vIGRhdGEgaXMgdG8gYmUKKyAqIHRyYW5zbWl0dGVkIikgIE5vdCBzbyEgIFdvcmthcm91bmQgdXNlcyBuQ1N4IHBpbnMgYXMgR1BJT3M7IG9yIG5ld2VyCisgKiBjb250cm9sbGVycyBoYXZlIENTQUFUIGFuZCBmcmllbmRzLgogICoKLSAqIFNpbmNlIHRoZSBDU0FBVCBmdW5jdGlvbmFsaXR5IGlzIGEgYml0IHdlaXJkIG9uIG5ld2VyIGNvbnRyb2xsZXJzCi0gKiBhcyB3ZWxsLCB3ZSB1c2UgR1BJTyB0byBjb250cm9sIG5DU3ggcGlucyBvbiBhbGwgY29udHJvbGxlcnMuCisgKiBTaW5jZSB0aGUgQ1NBQVQgZnVuY3Rpb25hbGl0eSBpcyBhIGJpdCB3ZWlyZCBvbiBuZXdlciBjb250cm9sbGVycyBhcworICogd2VsbCwgd2UgdXNlIEdQSU8gdG8gY29udHJvbCBuQ1N4IHBpbnMgb24gYWxsIGNvbnRyb2xsZXJzLCB1cGRhdGluZworICogTVIuUENTIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgY29udHJvbGxlci4gIFVzaW5nIEdQSU9zIGFsc28gbGV0cyB1cworICogc3VwcG9ydCBhY3RpdmUtaGlnaCBjaGlwc2VsZWN0cyBkZXNwaXRlIHRoZSBjb250cm9sbGVyJ3MgYmVsaWVmIHRoYXQKKyAqIG9ubHkgYWN0aXZlLWxvdyBkZXZpY2VzL3N5c3RlbXMgZXhpc3RzLgorICoKKyAqIEhvd2V2ZXIsIGF0OTFybTkyMDAgaGFzIGEgc2Vjb25kIGVycmF0dW0gd2hlcmVieSBuQ1MwIGRvZXNuJ3Qgd29yaworICogcmlnaHQgd2hlbiBkcml2ZW4gd2l0aCBHUElPLiAgKCJNb2RlIEZhdWx0IGRvZXMgbm90IGFsbG93IG1vcmUgdGhhbiBvbmUKKyAqIE1hc3RlciBvbiBDaGlwIFNlbGVjdCAwLiIpICBObyB3b3JrYXJvdW5kIGV4aXN0cyBmb3IgdGhhdCAuLi4gc28gZm9yCisgKiBuQ1MwIG9uIHRoYXQgY2hpcCwgd2UgKGEpIGRvbid0IHVzZSB0aGUgR1BJTywgKGIpIGNhbid0IHN1cHBvcnQgQ1NfSElHSCwKKyAqIGFuZCAoYykgd2lsbCB0cmlnZ2VyIHRoYXQgZmlyc3QgZXJyYXR1bSBpbiBzb21lIGNhc2VzLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjc19hY3RpdmF0ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIHZvaWQgY3NfYWN0aXZhdGUoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJdW5zaWduZWQgZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CiAJdW5zaWduZWQgYWN0aXZlID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7CisJdTMyIG1yOwogCi0JZGV2X2RiZygmc3BpLT5kZXYsICJhY3RpdmF0ZSAldSVzXG4iLCBncGlvLCBhY3RpdmUgPyAiIChoaWdoKSIgOiAiIik7Ci0JZ3Bpb19zZXRfdmFsdWUoZ3BpbywgYWN0aXZlKTsKKwltciA9IHNwaV9yZWFkbChhcywgTVIpOworCW1yID0gU1BJX0JGSU5TKFBDUywgfigxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpLCBtcik7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgImFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCisJCQlncGlvLCBhY3RpdmUgPyAiIChoaWdoKSIgOiAiIiwKKwkJCW1yKTsKKworCWlmICghKGNwdV9pc19hdDkxcm05MjAwKCkgJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwKSkKKwkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgYWN0aXZlKTsKKwlzcGlfd3JpdGVsKGFzLCBNUiwgbXIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY3NfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIHZvaWQgY3NfZGVhY3RpdmF0ZShzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAl1bnNpZ25lZCBncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKIAl1bnNpZ25lZCBhY3RpdmUgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKKwl1MzIgbXI7CiAKLQlkZXZfZGJnKCZzcGktPmRldiwgIkRFYWN0aXZhdGUgJXUlc1xuIiwgZ3BpbywgYWN0aXZlID8gIiAobG93KSIgOiAiIik7Ci0JZ3Bpb19zZXRfdmFsdWUoZ3BpbywgIWFjdGl2ZSk7CisJLyogb25seSBkZWFjdGl2YXRlICp0aGlzKiBkZXZpY2U7IHNvbWV0aW1lcyB0cmFuc2ZlcnMgdG8KKwkgKiBhbm90aGVyIGRldmljZSBtYXkgYmUgYWN0aXZlIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZC4KKwkgKi8KKwltciA9IHNwaV9yZWFkbChhcywgTVIpOworCWlmICh+U1BJX0JGRVhUKFBDUywgbXIpICYgKDEgPDwgc3BpLT5jaGlwX3NlbGVjdCkpIHsKKwkJbXIgPSBTUElfQkZJTlMoUENTLCAweGYsIG1yKTsKKwkJc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKKwl9CisKKwlkZXZfZGJnKCZzcGktPmRldiwgIkRFYWN0aXZhdGUgJXUlcywgbXIgJTA4eFxuIiwKKwkJCWdwaW8sIGFjdGl2ZSA/ICIgKGxvdykiIDogIiIsCisJCQltcik7CisKKwlpZiAoIShjcHVfaXNfYXQ5MXJtOTIwMCgpICYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMCkpCisJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sICFhY3RpdmUpOwogfQogCiAvKgpAQCAtMTQwLDYgKzE3NCw3IEBACiAKIAkvKiBSRVZJU0lUOiB3aGVuIHhmZXItPmRlbGF5X3VzZWNzID09IDAsIHRoZSBQREMgIm5leHQgdHJhbnNmZXIiCiAJICogbWVjaGFuaXNtIG1pZ2h0IGhlbHAgYXZvaWQgdGhlIElSUSBsYXRlbmN5IGJldHdlZW4gdHJhbnNmZXJzCisJICogKGFuZCBpbXByb3ZlIHRoZSBuQ1MwIGVycmF0YSBoYW5kbGluZyBvbiBhdDkxcm05MjAwIGNoaXBzKQogCSAqCiAJICogV2UncmUgYWxzbyB3YWl0aW5nIGZvciBFTkRSWCBiZWZvcmUgd2Ugc3RhcnQgdGhlIG5leHQKIAkgKiB0cmFuc2ZlciBiZWNhdXNlIHdlIG5lZWQgdG8gaGFuZGxlIHNvbWUgZGlmZmljdWx0IHRpbWluZwpAQCAtMTY5LDMzICsyMDQsNjIgQEAKIHsKIAlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UJKm1zZzsKLQl1MzIJCQltcjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOwogCiAJQlVHX09OKGFzLT5jdXJyZW50X3RyYW5zZmVyKTsKIAogCW1zZyA9IGxpc3RfZW50cnkoYXMtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOworCXNwaSA9IG1zZy0+c3BpOwogCi0JLyogU2VsZWN0IHRoZSBjaGlwICovCi0JbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKLQltciA9IFNQSV9CRklOUyhQQ1MsIH4oMSA8PCBtc2ctPnNwaS0+Y2hpcF9zZWxlY3QpLCBtcik7Ci0Jc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKLQljc19hY3RpdmF0ZShtc2ctPnNwaSk7CisJZGV2X2RiZyhtYXN0ZXItPmNkZXYuZGV2LCAic3RhcnQgbWVzc2FnZSAlcCBmb3IgJXNcbiIsCisJCQltc2csIHNwaS0+ZGV2LmJ1c19pZCk7CisKKwkvKiBzZWxlY3QgY2hpcCBpZiBpdCdzIG5vdCBzdGlsbCBhY3RpdmUgKi8KKwlpZiAoYXMtPnN0YXkpIHsKKwkJaWYgKGFzLT5zdGF5ICE9IHNwaSkgeworCQkJY3NfZGVhY3RpdmF0ZShhcywgYXMtPnN0YXkpOworCQkJY3NfYWN0aXZhdGUoYXMsIHNwaSk7CisJCX0KKwkJYXMtPnN0YXkgPSBOVUxMOworCX0gZWxzZQorCQljc19hY3RpdmF0ZShhcywgc3BpKTsKIAogCWF0bWVsX3NwaV9uZXh0X3hmZXIobWFzdGVyLCBtc2cpOwogfQogCi1zdGF0aWMgdm9pZAorLyoKKyAqIEZvciBETUEsIHR4X2J1Zi90eF9kbWEgaGF2ZSB0aGUgc2FtZSByZWxhdGlvbnNoaXAgYXMgcnhfYnVmL3J4X2RtYToKKyAqICAtIFRoZSBidWZmZXIgaXMgZWl0aGVyIHZhbGlkIGZvciBDUFUgYWNjZXNzLCBlbHNlIE5VTEwKKyAqICAtIElmIHRoZSBidWZmZXIgaXMgdmFsaWQsIHNvIGlzIGl0cyBETUEgYWRkcmVzc3MKKyAqCisgKiBUaGlzIGRyaXZlciBtYW5hZ2VzIHRoZSBkbWEgYWRkcmVzc3MgdW5sZXNzIG1lc3NhZ2UtPmlzX2RtYV9tYXBwZWQuCisgKi8KK3N0YXRpYyBpbnQKIGF0bWVsX3NwaV9kbWFfbWFwX3hmZXIoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7CisJc3RydWN0IGRldmljZQkqZGV2ID0gJmFzLT5wZGV2LT5kZXY7CisKIAl4ZmVyLT50eF9kbWEgPSB4ZmVyLT5yeF9kbWEgPSBJTlZBTElEX0RNQV9BRERSRVNTOwotCWlmICh4ZmVyLT50eF9idWYpCi0JCXhmZXItPnR4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZhcy0+cGRldi0+ZGV2LAorCWlmICh4ZmVyLT50eF9idWYpIHsKKwkJeGZlci0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LAogCQkJCSh2b2lkICopIHhmZXItPnR4X2J1ZiwgeGZlci0+bGVuLAogCQkJCURNQV9UT19ERVZJQ0UpOwotCWlmICh4ZmVyLT5yeF9idWYpCi0JCXhmZXItPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZhcy0+cGRldi0+ZGV2LAorCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoeGZlci0+dHhfZG1hKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoeGZlci0+cnhfYnVmKSB7CisJCXhmZXItPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwKIAkJCQl4ZmVyLT5yeF9idWYsIHhmZXItPmxlbiwKIAkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoeGZlci0+dHhfZG1hKSkgeworCQkJaWYgKHhmZXItPnR4X2J1ZikKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwKKwkJCQkJCXhmZXItPnR4X2RtYSwgeGZlci0+bGVuLAorCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYXRtZWxfc3BpX2RtYV91bm1hcF94ZmVyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCkBAIC0yMTEsOSArMjc1LDEzIEBACiAKIHN0YXRpYyB2b2lkCiBhdG1lbF9zcGlfbXNnX2RvbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IGF0bWVsX3NwaSAqYXMsCi0JCSAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLCBpbnQgc3RhdHVzKQorCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZywgaW50IHN0YXR1cywgaW50IHN0YXkpCiB7Ci0JY3NfZGVhY3RpdmF0ZShtc2ctPnNwaSk7CisJaWYgKCFzdGF5IHx8IHN0YXR1cyA8IDApCisJCWNzX2RlYWN0aXZhdGUoYXMsIG1zZy0+c3BpKTsKKwllbHNlCisJCWFzLT5zdGF5ID0gbXNnLT5zcGk7CisKIAlsaXN0X2RlbCgmbXNnLT5xdWV1ZSk7CiAJbXNnLT5zdGF0dXMgPSBzdGF0dXM7CiAKQEAgLTMwMyw3ICszNzEsNyBAQAogCQkvKiBDbGVhciBhbnkgb3ZlcnJ1biBoYXBwZW5pbmcgd2hpbGUgY2xlYW5pbmcgdXAgKi8KIAkJc3BpX3JlYWRsKGFzLCBTUik7CiAKLQkJYXRtZWxfc3BpX21zZ19kb25lKG1hc3RlciwgYXMsIG1zZywgLUVJTyk7CisJCWF0bWVsX3NwaV9tc2dfZG9uZShtYXN0ZXIsIGFzLCBtc2csIC1FSU8sIDApOwogCX0gZWxzZSBpZiAocGVuZGluZyAmIFNQSV9CSVQoRU5EUlgpKSB7CiAJCXJldCA9IElSUV9IQU5ETEVEOwogCkBAIC0zMjEsMTIgKzM4OSwxMyBAQAogCiAJCQlpZiAobXNnLT50cmFuc2ZlcnMucHJldiA9PSAmeGZlci0+dHJhbnNmZXJfbGlzdCkgewogCQkJCS8qIHJlcG9ydCBjb21wbGV0ZWQgbWVzc2FnZSAqLwotCQkJCWF0bWVsX3NwaV9tc2dfZG9uZShtYXN0ZXIsIGFzLCBtc2csIDApOworCQkJCWF0bWVsX3NwaV9tc2dfZG9uZShtYXN0ZXIsIGFzLCBtc2csIDAsCisJCQkJCQl4ZmVyLT5jc19jaGFuZ2UpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoeGZlci0+Y3NfY2hhbmdlKSB7Ci0JCQkJCWNzX2RlYWN0aXZhdGUobXNnLT5zcGkpOworCQkJCQljc19kZWFjdGl2YXRlKGFzLCBtc2ctPnNwaSk7CiAJCQkJCXVkZWxheSgxKTsKLQkJCQkJY3NfYWN0aXZhdGUobXNnLT5zcGkpOworCQkJCQljc19hY3RpdmF0ZShhcywgbXNnLT5zcGkpOwogCQkJCX0KIAogCQkJCS8qCkBAIC0zNTAsNiArNDE5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KICNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKIAogc3RhdGljIGludCBhdG1lbF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKQEAgLTM4OCw2ICs0NTgsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogc2VlIG5vdGVzIGFib3ZlIHJlIGNoaXBzZWxlY3QgKi8KKwlpZiAoY3B1X2lzX2F0OTFybTkyMDAoKQorCQkJJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwCisJCQkmJiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IGNhbid0IGJlIGFjdGl2ZS1oaWdoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogc3BlZWQgemVybyBjb252ZW50aW9uIGlzIHVzZWQgYnkgc29tZSB1cHBlciBsYXllcnMgKi8KIAlidXNfaHogPSBjbGtfZ2V0X3JhdGUoYXMtPmNsayk7CiAJaWYgKHNwaS0+bWF4X3NwZWVkX2h6KSB7CkBAIC0zOTcsOCArNDc1LDkgQEAKIAkJc2NiciA9ICgoYnVzX2h6ICsgc3BpLT5tYXhfc3BlZWRfaHogLSAxKQogCQkJLyBzcGktPm1heF9zcGVlZF9oeik7CiAJCWlmIChzY2JyID49ICgxIDw8IFNQSV9TQ0JSX1NJWkUpKSB7Ci0JCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiAlZCBIeiB0b28gc2xvdywgc2NiciAldVxuIiwKLQkJCQkJc3BpLT5tYXhfc3BlZWRfaHosIHNjYnIpOworCQkJZGV2X2RiZygmc3BpLT5kZXYsCisJCQkJInNldHVwOiAlZCBIeiB0b28gc2xvdywgc2NiciAldTsgbWluICVsZCBIelxuIiwKKwkJCQlzcGktPm1heF9zcGVlZF9oeiwgc2NiciwgYnVzX2h6LzI1NSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZQpAQCAtNDIzLDYgKzUwMiwxNCBAQAogCQkJcmV0dXJuIHJldDsKIAkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gKHZvaWQgKilucGNzX3BpbjsKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG5wY3NfcGluLCAhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFzLT5sb2NrLCBmbGFncyk7CisJCWlmIChhcy0+c3RheSA9PSBzcGkpCisJCQlhcy0+c3RheSA9IE5VTEw7CisJCWNzX2RlYWN0aXZhdGUoYXMsIHNwaSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CiAJfQogCiAJZGV2X2RiZygmc3BpLT5kZXYsCkBAIC00NjQsMTQgKzU1MSwyMiBAQAogCQkJZGV2X2RiZygmc3BpLT5kZXYsICJubyBwcm90b2NvbCBvcHRpb25zIHlldFxuIik7CiAJCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCQl9CisKKwkJLyoKKwkJICogRE1BIG1hcCBlYXJseSwgZm9yIHBlcmZvcm1hbmNlIChlbXB0aWVzIGRjYWNoZSBBU0FQKSBhbmQKKwkJICogYmV0dGVyIGZhdWx0IHJlcG9ydGluZy4gIFRoaXMgaXMgYSBETUEtb25seSBkcml2ZXIuCisJCSAqCisJCSAqIE5PVEUgdGhhdCBpZiBkbWFfdW5tYXBfc2luZ2xlKCkgZXZlciBzdGFydHMgdG8gZG8gd29yayBvbgorCQkgKiBwbGF0Zm9ybXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCB3ZSB3b3VsZCBuZWVkIHRvIGNsZWFuCisJCSAqIHVwIG1hcHBpbmdzIGZvciBwcmV2aW91c2x5LW1hcHBlZCB0cmFuc2ZlcnMuCisJCSAqLworCQlpZiAoIW1zZy0+aXNfZG1hX21hcHBlZCkgeworCQkJaWYgKGF0bWVsX3NwaV9kbWFfbWFwX3hmZXIoYXMsIHhmZXIpIDwgMCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCX0KIAotCS8qIHNjcnViIGRjYWNoZSAiZWFybHkiICovCi0JaWYgKCFtc2ctPmlzX2RtYV9tYXBwZWQpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpCi0JCQlhdG1lbF9zcGlfZG1hX21hcF94ZmVyKGFzLCB4ZmVyKTsKLQl9Ci0KKyNpZmRlZiBWRVJCT1NFCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKIAkJZGV2X2RiZyhjb250cm9sbGVyLAogCQkJIiAgeGZlciAlcDogbGVuICV1IHR4ICVwLyUwOHggcnggJXAvJTA4eFxuIiwKQEAgLTQ3OSw2ICs1NzQsNyBAQAogCQkJeGZlci0+dHhfYnVmLCB4ZmVyLT50eF9kbWEsCiAJCQl4ZmVyLT5yeF9idWYsIHhmZXItPnJ4X2RtYSk7CiAJfQorI2VuZGlmCiAKIAltc2ctPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKIAltc2ctPmFjdHVhbF9sZW5ndGggPSAwOwpAQCAtNDk0LDggKzU5MCwyMSBAQAogCiBzdGF0aWMgdm9pZCBhdG1lbF9zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWlmIChzcGktPmNvbnRyb2xsZXJfc3RhdGUpCi0JCWdwaW9fZnJlZSgodW5zaWduZWQgaW50KXNwaS0+Y29udHJvbGxlcl9kYXRhKTsKKwlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXVuc2lnbmVkCQlncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoYXMtPnN0YXkgPT0gc3BpKSB7CisJCWFzLT5zdGF5ID0gTlVMTDsKKwkJY3NfZGVhY3RpdmF0ZShhcywgc3BpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXMtPmxvY2ssIGZsYWdzKTsKKworCWdwaW9fZnJlZShncGlvKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTUzNiw2ICs2NDUsMTAgQEAKIAogCWFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCisJLyoKKwkgKiBTY3JhdGNoIGJ1ZmZlciBpcyB1c2VkIGZvciB0aHJvd2F3YXkgcnggYW5kIHR4IGRhdGEuCisJICogSXQncyBjb2hlcmVudCB0byBtaW5pbWl6ZSBkY2FjaGUgcG9sbHV0aW9uLgorCSAqLwogCWFzLT5idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgQlVGRkVSX1NJWkUsCiAJCQkJCSZhcy0+YnVmZmVyX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcy0+YnVmZmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jIGIvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jCmluZGV4IGFlMmIxYWYuLmM0N2E2NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2F1MTU1MF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9hdTE1NTBfc3BpLmMKQEAgLTI4MCw2ICsyODAsOSBAQAogCXJldHVybiAwOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MU0JfRklSU1QpCisKIHN0YXRpYyBpbnQgYXUxNTUwX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwpAQCAtMjkyLDYgKzI5NSwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmIChzcGktPm1heF9zcGVlZF9oeiA9PSAwKQogCQlzcGktPm1heF9zcGVlZF9oeiA9IGh3LT5mcmVxX21heDsKIAlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPiBody0+ZnJlcV9tYXgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKaW5kZXggMTFmMzZiZS4uZDJhNGIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKQEAgLTI3MCw2ICsyNzAsOSBAQAogCXNwaW5fdW5sb2NrX2lycSgmbXBzLT5sb2NrKTsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggfCBTUElfTFNCX0ZJUlNUKQorCiBzdGF0aWMgaW50IG1wYzUyeHhfcHNjX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBtcGM1Mnh4X3BzY19zcGkgKm1wcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwpAQCAtMjc5LDYgKzI4MiwxMiBAQAogCWlmIChzcGktPmJpdHNfcGVyX3dvcmQlOCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmICghY3MpIHsKIAkJY3MgPSBremFsbG9jKHNpemVvZiAqY3MsIEdGUF9LRVJORUwpOwogCQlpZiAoIWNzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYyBiL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzNTdjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMKQEAgLTAsMCArMSwxMDgxIEBACisvKgorICogT01BUDIgTWNTUEkgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjoJU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPiBhbmQKKyAqCQlKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2NrLmg+CisKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRlJFUQkJNDgwMDAwMDAKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9SRVZJU0lPTgkJMHgwMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNDT05GSUcJCTB4MTAKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTU1RBVFVTCQkweDE0CisjZGVmaW5lIE9NQVAyX01DU1BJX0lSUVNUQVRVUwkJMHgxOAorI2RlZmluZSBPTUFQMl9NQ1NQSV9JUlFFTkFCTEUJCTB4MWMKKyNkZWZpbmUgT01BUDJfTUNTUElfV0FLRVVQRU5BQkxFCTB4MjAKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTVAkJMHgyNAorI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkwJCTB4MjgKKworLyogcGVyLWNoYW5uZWwgYmFua3MsIDB4MTQgYnl0ZXMgZWFjaCwgZmlyc3QgaXM6ICovCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORjAJCTB4MmMKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUMAkJMHgzMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENUUkwwCQkweDM0CisjZGVmaW5lIE9NQVAyX01DU1BJX1RYMAkJCTB4MzgKKyNkZWZpbmUgT01BUDJfTUNTUElfUlgwCQkJMHgzYworCisvKiBwZXItcmVnaXN0ZXIgYml0bWFza3M6ICovCisKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTQ09ORklHX0FVVE9JRExFCSgxIDw8IDApCisjZGVmaW5lIE9NQVAyX01DU1BJX1NZU0NPTkZJR19TT0ZUUkVTRVQJKDEgPDwgMSkKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNTVEFUVVNfUkVTRVRET05FCSgxIDw8IDApCisKKyNkZWZpbmUgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NJTkdMRQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfTVMJKDEgPDwgMikKKyNkZWZpbmUgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NURVNUCSgxIDw8IDMpCisKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1BIQQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1BPTAkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0NMS0RfTUFTSwkoMHgwZiA8PCAyKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRVBPTAkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1dMX01BU0sJKDB4MWYgPDwgNykKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RSTV9SWF9PTkxZCSgweDAxIDw8IDEyKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1RYX09OTFkJKDB4MDIgPDwgMTIpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fTUFTSwkoMHgwMyA8PCAxMikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0RNQVcJCSgxIDw8IDE0KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BUgkJKDEgPDwgMTUpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9EUEUwCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0RQRTEJCSgxIDw8IDE3KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfSVMJCSgxIDw8IDE4KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFVSQk8JKDEgPDwgMTkpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9GT1JDRQkoMSA8PCAyMCkKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfRU9UCQkoMSA8PCAyKQorCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ1RSTF9FTgkJKDEgPDwgMCkKKworCisvKiBXZSBoYXZlIDIgRE1BIGNoYW5uZWxzIHBlciBDUywgb25lIGZvciBSWCBhbmQgb25lIGZvciBUWCAqLworc3RydWN0IG9tYXAyX21jc3BpX2RtYSB7CisJaW50IGRtYV90eF9jaGFubmVsOworCWludCBkbWFfcnhfY2hhbm5lbDsKKworCWludCBkbWFfdHhfc3luY19kZXY7CisJaW50IGRtYV9yeF9zeW5jX2RldjsKKworCXN0cnVjdCBjb21wbGV0aW9uIGRtYV90eF9jb21wbGV0aW9uOworCXN0cnVjdCBjb21wbGV0aW9uIGRtYV9yeF9jb21wbGV0aW9uOworfTsKKworLyogdXNlIFBJTyBmb3Igc21hbGwgdHJhbnNmZXJzLCBhdm9pZGluZyBETUEgc2V0dXAvdGVhcmRvd24gb3ZlcmhlYWQgYW5kCisgKiBjYWNoZSBvcGVyYXRpb25zOyBiZXR0ZXIgaGV1cmlzdGljcyBjb25zaWRlciB3b3Jkc2l6ZSBhbmQgYml0cmF0ZS4KKyAqLworI2RlZmluZSBETUFfTUlOX0JZVEVTCQkJOAorCisKK3N0cnVjdCBvbWFwMl9tY3NwaSB7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJLyogbG9jayBwcm90ZWN0cyBxdWV1ZSBhbmQgcmVnaXN0ZXJzICovCisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW1zZ19xdWV1ZTsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBjbGsJCSppY2s7CisJc3RydWN0IGNsawkJKmZjazsKKwkvKiBWaXJ0dWFsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciAqLworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJLyogU1BJMSBoYXMgNCBjaGFubmVscywgd2hpbGUgU1BJMiBoYXMgMiAqLworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKmRtYV9jaGFubmVsczsKK307CisKK3N0cnVjdCBvbWFwMl9tY3NwaV9jcyB7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlpbnQJCQl3b3JkX2xlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqb21hcDJfbWNzcGlfd3E7CisKKyNkZWZpbmUgTU9EX1JFR19CSVQodmFsLCBtYXNrLCBzZXQpIGRvIHsgXAorCWlmIChzZXQpIFwKKwkJdmFsIHw9IG1hc2s7IFwKKwllbHNlIFwKKwkJdmFsICY9IH5tYXNrOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNzcGlfd3JpdGVfcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCWludCBpZHgsIHUzMiB2YWwpCit7CisJc3RydWN0IG9tYXAyX21jc3BpICptY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCV9fcmF3X3dyaXRlbCh2YWwsIG1jc3BpLT5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbWNzcGlfcmVhZF9yZWcoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcmV0dXJuIF9fcmF3X3JlYWRsKG1jc3BpLT5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1jc3BpX3dyaXRlX2NzX3JlZyhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlpbnQgaWR4LCB1MzIgdmFsKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlfX3Jhd193cml0ZWwodmFsLCBjcy0+YmFzZSArICBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtY3NwaV9yZWFkX2NzX3JlZyhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaWR4KQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwoY3MtPmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9zZXRfZG1hX3JlcShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlpbnQgaXNfcmVhZCwgaW50IGVuYWJsZSkKK3sKKwl1MzIgbCwgcnc7CisKKwlsID0gbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKKworCWlmIChpc19yZWFkKSAvKiAxIGlzIHJlYWQsIDAgd3JpdGUgKi8KKwkJcncgPSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BUjsKKwllbHNlCisJCXJ3ID0gT01BUDJfTUNTUElfQ0hDT05GX0RNQVc7CisKKwlNT0RfUkVHX0JJVChsLCBydywgZW5hYmxlKTsKKwltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfc2V0X2VuYWJsZShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgZW5hYmxlKQoreworCXUzMiBsOworCisJbCA9IGVuYWJsZSA/IE9NQVAyX01DU1BJX0NIQ1RSTF9FTiA6IDA7CisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDVFJMMCwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2ZvcmNlX2NzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBjc19hY3RpdmUpCit7CisJdTMyIGw7CisKKwlsID0gbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKKwlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9DSENPTkZfRk9SQ0UsIGNzX2FjdGl2ZSk7CisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX3NldF9tYXN0ZXJfbW9kZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXUzMiBsOworCisJLyogc2V0dXAgd2hlbiBzd2l0Y2hpbmcgZnJvbSAocmVzZXQgZGVmYXVsdCkgc2xhdmUgbW9kZQorCSAqIHRvIHNpbmdsZS1jaGFubmVsIG1hc3RlciBtb2RlCisJICovCisJbCA9IG1jc3BpX3JlYWRfcmVnKG1hc3RlciwgT01BUDJfTUNTUElfTU9EVUxDVFJMKTsKKwlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfU1RFU1QsIDApOworCU1PRF9SRUdfQklUKGwsIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9NUywgMCk7CisJTU9EX1JFR19CSVQobCwgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NJTkdMRSwgMSk7CisJbWNzcGlfd3JpdGVfcmVnKG1hc3RlciwgT01BUDJfTUNTUElfTU9EVUxDVFJMLCBsKTsKK30KKworc3RhdGljIHVuc2lnbmVkCitvbWFwMl9tY3NwaV90eHJ4X2RtYShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hICAqbWNzcGlfZG1hOworCXVuc2lnbmVkIGludAkJY291bnQsIGM7CisJdW5zaWduZWQgbG9uZwkJYmFzZSwgdHhfcmVnLCByeF9yZWc7CisJaW50CQkJd29yZF9sZW4sIGRhdGFfdHlwZSwgZWxlbWVudF9jb3VudDsKKwl1OAkJCSogcng7CisJY29uc3QgdTgJCSogdHg7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOworCisJY291bnQgPSB4ZmVyLT5sZW47CisJYyA9IGNvdW50OworCXdvcmRfbGVuID0gY3MtPndvcmRfbGVuOworCisJYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBpb192MnAoY3MtPmJhc2UpOworCXR4X3JlZyA9IGJhc2UgKyBPTUFQMl9NQ1NQSV9UWDA7CisJcnhfcmVnID0gYmFzZSArIE9NQVAyX01DU1BJX1JYMDsKKwlyeCA9IHhmZXItPnJ4X2J1ZjsKKwl0eCA9IHhmZXItPnR4X2J1ZjsKKworCWlmICh3b3JkX2xlbiA8PSA4KSB7CisJCWRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TODsKKwkJZWxlbWVudF9jb3VudCA9IGNvdW50OworCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMTYpIHsKKwkJZGF0YV90eXBlID0gT01BUF9ETUFfREFUQV9UWVBFX1MxNjsKKwkJZWxlbWVudF9jb3VudCA9IGNvdW50ID4+IDE7CisJfSBlbHNlIC8qIHdvcmRfbGVuIDw9IDMyICovIHsKKwkJZGF0YV90eXBlID0gT01BUF9ETUFfREFUQV9UWVBFX1MzMjsKKwkJZWxlbWVudF9jb3VudCA9IGNvdW50ID4+IDI7CisJfQorCisJaWYgKHR4ICE9IE5VTEwpIHsKKwkJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsLAorCQkJCWRhdGFfdHlwZSwgZWxlbWVudF9jb3VudCwgMSwKKwkJCQlPTUFQX0RNQV9TWU5DX0VMRU1FTlQsCisJCQkJbWNzcGlfZG1hLT5kbWFfdHhfc3luY19kZXYsIDApOworCisJCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsLCAwLAorCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAorCQkJCXR4X3JlZywgMCwgMCk7CisKKwkJb21hcF9zZXRfZG1hX3NyY19wYXJhbXMobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCwgMCwKKwkJCQlPTUFQX0RNQV9BTU9ERV9QT1NUX0lOQywKKwkJCQl4ZmVyLT50eF9kbWEsIDAsIDApOworCX0KKworCWlmIChyeCAhPSBOVUxMKSB7CisJCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCwKKwkJCQlkYXRhX3R5cGUsIGVsZW1lbnRfY291bnQsIDEsCisJCQkJT01BUF9ETUFfU1lOQ19FTEVNRU5ULAorCQkJCW1jc3BpX2RtYS0+ZG1hX3J4X3N5bmNfZGV2LCAxKTsKKworCQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsLCAwLAorCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAorCQkJCXJ4X3JlZywgMCwgMCk7CisKKwkJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwsIDAsCisJCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJeGZlci0+cnhfZG1hLCAwLCAwKTsKKwl9CisKKwlpZiAodHggIT0gTlVMTCkgeworCQlvbWFwX3N0YXJ0X2RtYShtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsKTsKKwkJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAwLCAxKTsKKwl9CisKKwlpZiAocnggIT0gTlVMTCkgeworCQlvbWFwX3N0YXJ0X2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKKwkJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAxLCAxKTsKKwl9CisKKwlpZiAodHggIT0gTlVMTCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCB4ZmVyLT50eF9kbWEsIGNvdW50LCBETUFfVE9fREVWSUNFKTsKKwl9CisKKwlpZiAocnggIT0gTlVMTCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV9yeF9jb21wbGV0aW9uKTsKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCB4ZmVyLT5yeF9kbWEsIGNvdW50LCBETUFfRlJPTV9ERVZJQ0UpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbWNzcGlfd2FpdF9mb3JfcmVnX2JpdCh2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgbG9uZyBiaXQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCXdoaWxlICghKF9fcmF3X3JlYWRsKHJlZykgJiBiaXQpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJcmV0dXJuIC0xOworCQljcHVfcmVsYXgoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorb21hcDJfbWNzcGlfdHhyeF9waW8oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJdW5zaWduZWQgaW50CQljb3VudCwgYzsKKwl1MzIJCQlsOworCXZvaWQgX19pb21lbQkJKmJhc2UgPSBjcy0+YmFzZTsKKwl2b2lkIF9faW9tZW0JCSp0eF9yZWc7CisJdm9pZCBfX2lvbWVtCQkqcnhfcmVnOworCXZvaWQgX19pb21lbQkJKmNoc3RhdF9yZWc7CisJaW50CQkJd29yZF9sZW47CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCWNvdW50ID0geGZlci0+bGVuOworCWMgPSBjb3VudDsKKwl3b3JkX2xlbiA9IGNzLT53b3JkX2xlbjsKKworCWwgPSBtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjApOworCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9UUk1fTUFTSzsKKworCS8qIFdlIHN0b3JlIHRoZSBwcmUtY2FsY3VsYXRlZCByZWdpc3RlciBhZGRyZXNzZXMgb24gc3RhY2sgdG8gc3BlZWQKKwkgKiB1cCB0aGUgdHJhbnNmZXIgbG9vcC4gKi8KKwl0eF9yZWcJCT0gYmFzZSArIE9NQVAyX01DU1BJX1RYMDsKKwlyeF9yZWcJCT0gYmFzZSArIE9NQVAyX01DU1BJX1JYMDsKKwljaHN0YXRfcmVnCT0gYmFzZSArIE9NQVAyX01DU1BJX0NIU1RBVDA7CisKKwlpZiAod29yZF9sZW4gPD0gOCkgeworCQl1OAkJKnJ4OworCQljb25zdCB1OAkqdHg7CisKKwkJcnggPSB4ZmVyLT5yeF9idWY7CisJCXR4ID0geGZlci0+dHhfYnVmOworCisJCWRvIHsKKwkJCWlmICh0eCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlRYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAid3JpdGUtJWQgJTAyeFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqdHgpOworI2VuZGlmCisJCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOworCQkJfQorCQkJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBwcmV2ZW50IGxhc3QgUlhfT05MWSByZWFkIGZyb20gdHJpZ2dlcmluZworCQkJCSAqIG1vcmUgd29yZCBpL286IHN3aXRjaCB0byByeCt0eAorCQkJCSAqLworCQkJCWlmIChjID09IDAgJiYgdHggPT0gTlVMTCkKKwkJCQkJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwKKwkJCQkJCQlPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKKwkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDJ4XG4iLAorCQkJCQkJd29yZF9sZW4sICoocnggLSAxKSk7CisjZW5kaWYKKwkJCX0KKwkJCWMgLT0gMTsKKwkJfSB3aGlsZSAoYyk7CisJfSBlbHNlIGlmICh3b3JkX2xlbiA8PSAxNikgeworCQl1MTYJCSpyeDsKKwkJY29uc3QgdTE2CSp0eDsKKworCQlyeCA9IHhmZXItPnJ4X2J1ZjsKKwkJdHggPSB4ZmVyLT50eF9idWY7CisJCWRvIHsKKwkJCWlmICh0eCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlRYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAid3JpdGUtJWQgJTA0eFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqdHgpOworI2VuZGlmCisJCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOworCQkJfQorCQkJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBwcmV2ZW50IGxhc3QgUlhfT05MWSByZWFkIGZyb20gdHJpZ2dlcmluZworCQkJCSAqIG1vcmUgd29yZCBpL286IHN3aXRjaCB0byByeCt0eAorCQkJCSAqLworCQkJCWlmIChjID09IDAgJiYgdHggPT0gTlVMTCkKKwkJCQkJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwKKwkJCQkJCQlPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKKwkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDR4XG4iLAorCQkJCQkJd29yZF9sZW4sICoocnggLSAxKSk7CisjZW5kaWYKKwkJCX0KKwkJCWMgLT0gMjsKKwkJfSB3aGlsZSAoYyk7CisJfSBlbHNlIGlmICh3b3JkX2xlbiA8PSAzMikgeworCQl1MzIJCSpyeDsKKwkJY29uc3QgdTMyCSp0eDsKKworCQlyeCA9IHhmZXItPnJ4X2J1ZjsKKwkJdHggPSB4ZmVyLT50eF9idWY7CisJCWRvIHsKKwkJCWlmICh0eCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlRYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAid3JpdGUtJWQgJTA0eFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqdHgpOworI2VuZGlmCisJCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOworCQkJfQorCQkJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBwcmV2ZW50IGxhc3QgUlhfT05MWSByZWFkIGZyb20gdHJpZ2dlcmluZworCQkJCSAqIG1vcmUgd29yZCBpL286IHN3aXRjaCB0byByeCt0eAorCQkJCSAqLworCQkJCWlmIChjID09IDAgJiYgdHggPT0gTlVMTCkKKwkJCQkJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwKKwkJCQkJCQlPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKKwkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDR4XG4iLAorCQkJCQkJd29yZF9sZW4sICoocnggLSAxKSk7CisjZW5kaWYKKwkJCX0KKwkJCWMgLT0gNDsKKwkJfSB3aGlsZSAoYyk7CisJfQorCisJLyogZm9yIFRYX09OTFkgbW9kZSwgYmUgc3VyZSBhbGwgd29yZHMgaGF2ZSBzaGlmdGVkIG91dCAqLworCWlmICh4ZmVyLT5yeF9idWYgPT0gTlVMTCkgeworCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKKwkJfSBlbHNlIGlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJT01BUDJfTUNTUElfQ0hTVEFUX0VPVCkgPCAwKQorCQkJZGV2X2Vycigmc3BpLT5kZXYsICJFT1QgdGltZWQgb3V0XG4iKTsKKwl9CitvdXQ6CisJcmV0dXJuIGNvdW50IC0gYzsKK30KKworLyogY2FsbGVkIG9ubHkgd2hlbiBubyB0cmFuc2ZlciBpcyBhY3RpdmUgdG8gdGhpcyBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGk7CisJdTMyIGwgPSAwLCBkaXYgPSAwOworCXU4IHdvcmRfbGVuID0gc3BpLT5iaXRzX3Blcl93b3JkOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWlmICh0ICE9IE5VTEwgJiYgdC0+Yml0c19wZXJfd29yZCkKKwkJd29yZF9sZW4gPSB0LT5iaXRzX3Blcl93b3JkOworCisJY3MtPndvcmRfbGVuID0gd29yZF9sZW47CisKKwlpZiAoc3BpLT5tYXhfc3BlZWRfaHopIHsKKwkJd2hpbGUgKGRpdiA8PSAxNSAmJiAoT01BUDJfTUNTUElfTUFYX0ZSRVEgLyAoMSA8PCBkaXYpKQorCQkJCQk+IHNwaS0+bWF4X3NwZWVkX2h6KQorCQkJZGl2Kys7CisJfSBlbHNlCisJCWRpdiA9IDE1OworCisJbCA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCk7CisKKwkvKiBzdGFuZGFyZCA0LXdpcmUgbWFzdGVyIG1vZGU6ICBTQ0ssIE1PU0kvb3V0LCBNSVNPL2luLCBuQ1MKKwkgKiBSRVZJU0lUOiB0aGlzIGNvbnRyb2xsZXIgY291bGQgc3VwcG9ydCBTUElfM1dJUkUgbW9kZS4KKwkgKi8KKwlsICY9IH4oT01BUDJfTUNTUElfQ0hDT05GX0lTfE9NQVAyX01DU1BJX0NIQ09ORl9EUEUxKTsKKwlsIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9EUEUwOworCisJLyogd29yZGxlbmd0aCAqLworCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9XTF9NQVNLOworCWwgfD0gKHdvcmRfbGVuIC0gMSkgPDwgNzsKKworCS8qIHNldCBjaGlwc2VsZWN0IHBvbGFyaXR5OyBtYW5hZ2Ugd2l0aCBGT1JDRSAqLworCWlmICghKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkKKwkJbCB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfRVBPTDsJLyogYWN0aXZlLWxvdzsgbm9ybWFsICovCisJZWxzZQorCQlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfRVBPTDsKKworCS8qIHNldCBjbG9jayBkaXZpc29yICovCisJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX0NMS0RfTUFTSzsKKwlsIHw9IGRpdiA8PCAyOworCisJLyogc2V0IFNQSSBtb2RlIDAuLjMgKi8KKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX1BPTDsKKwllbHNlCisJCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9QT0w7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQlsIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9QSEE7CisJZWxzZQorCQlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfUEhBOworCisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCwgbCk7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBzcGVlZCAlZCwgc2FtcGxlICVzIGVkZ2UsIGNsayAlc1xuIiwKKwkJCU9NQVAyX01DU1BJX01BWF9GUkVRIC8gKDEgPDwgZGl2KSwKKwkJCShzcGktPm1vZGUgJiBTUElfQ1BIQSkgPyAidHJhaWxpbmciIDogImxlYWRpbmciLAorCQkJKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/ICJpbnZlcnRlZCIgOiAibm9ybWFsIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZG1hX3J4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IGRhdGE7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICYobWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XSk7CisKKwljb21wbGV0ZSgmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7CisKKwkvKiBXZSBtdXN0IGRpc2FibGUgdGhlIERNQSBSWCByZXF1ZXN0ICovCisJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAxLCAwKTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZG1hX3R4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IGRhdGE7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICYobWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XSk7CisKKwljb21wbGV0ZSgmbWNzcGlfZG1hLT5kbWFfdHhfY29tcGxldGlvbik7CisKKwkvKiBXZSBtdXN0IGRpc2FibGUgdGhlIERNQSBUWCByZXF1ZXN0ICovCisJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAwLCAwKTsKK30KKworc3RhdGljIGludCBvbWFwMl9tY3NwaV9yZXF1ZXN0X2RtYShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBzcGktPm1hc3RlcjsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCW1jc3BpX2RtYSA9IG1jc3BpLT5kbWFfY2hhbm5lbHMgKyBzcGktPmNoaXBfc2VsZWN0OworCisJaWYgKG9tYXBfcmVxdWVzdF9kbWEobWNzcGlfZG1hLT5kbWFfcnhfc3luY19kZXYsICJNY1NQSSBSWCIsCisJCQlvbWFwMl9tY3NwaV9kbWFfcnhfY2FsbGJhY2ssIHNwaSwKKwkJCSZtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIFJYIERNQSBjaGFubmVsIGZvciBNY1NQSVxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmIChvbWFwX3JlcXVlc3RfZG1hKG1jc3BpX2RtYS0+ZG1hX3R4X3N5bmNfZGV2LCAiTWNTUEkgVFgiLAorCQkJb21hcDJfbWNzcGlfZG1hX3R4X2NhbGxiYWNrLCBzcGksCisJCQkmbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCkpIHsKKwkJb21hcF9mcmVlX2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKKwkJbWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9IC0xOworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIFRYIERNQSBjaGFubmVsIGZvciBNY1NQSVxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWluaXRfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7CisJaW5pdF9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKKworCXJldHVybiAwOworfQorCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKworc3RhdGljIGludCBvbWFwMl9tY3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludAkJCXJldDsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID09IDApCisJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJZWxzZSBpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDwgNCB8fCBzcGktPmJpdHNfcGVyX3dvcmQgPiAzMikgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCAlZCBiaXQgd29yZHNcbiIsCisJCQlzcGktPmJpdHNfcGVyX3dvcmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOworCisJaWYgKCFjcykgeworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWlmICghY3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJY3MtPmJhc2UgPSBtY3NwaS0+YmFzZSArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OworCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBjczsKKwl9CisKKwlpZiAobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9PSAtMQorCQkJfHwgbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCA9PSAtMSkgeworCQlyZXQgPSBvbWFwMl9tY3NwaV9yZXF1ZXN0X2RtYShzcGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJY2xrX2VuYWJsZShtY3NwaS0+aWNrKTsKKwljbGtfZW5hYmxlKG1jc3BpLT5mY2spOworCXJldCA9ICBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCWNsa19kaXNhYmxlKG1jc3BpLT5mY2spOworCWNsa19kaXNhYmxlKG1jc3BpLT5pY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqbWNzcGlfZG1hOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwltY3NwaV9kbWEgPSAmbWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XTsKKworCWtmcmVlKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSk7CisKKwlpZiAobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCAhPSAtMSkgeworCQlvbWFwX2ZyZWVfZG1hKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwpOworCQltY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsID0gLTE7CisJfQorCWlmIChtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsICE9IC0xKSB7CisJCW9tYXBfZnJlZV9kbWEobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCk7CisJCW1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwgPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisKKwltY3NwaSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgb21hcDJfbWNzcGksIHdvcmspOworCXNwaW5fbG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKKworCWNsa19lbmFibGUobWNzcGktPmljayk7CisJY2xrX2VuYWJsZShtY3NwaS0+ZmNrKTsKKworCS8qIFdlIG9ubHkgZW5hYmxlIG9uZSBjaGFubmVsIGF0IGEgdGltZSAtLSB0aGUgb25lIHdob3NlIG1lc3NhZ2UgaXMKKwkgKiBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgLS0gYWx0aG91Z2ggdGhpcyBjb250cm9sbGVyIHdvdWxkIGdsYWRseQorCSAqIGFyYml0cmF0ZSBhbW9uZyBtdWx0aXBsZSBjaGFubmVscy4gIFRoaXMgY29ycmVzcG9uZHMgdG8gInNpbmdsZQorCSAqIGNoYW5uZWwiIG1hc3RlciBtb2RlLiAgQXMgYSBzaWRlIGVmZmVjdCwgd2UgbmVlZCB0byBtYW5hZ2UgdGhlCisJICogY2hpcHNlbGVjdCB3aXRoIHRoZSBGT1JDRSBiaXQgLi4uIENTICE9IGNoYW5uZWwgZW5hYmxlLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmbWNzcGktPm1zZ19xdWV1ZSkpIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlCQkqbTsKKwkJc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7CisJCXN0cnVjdCBzcGlfdHJhbnNmZXIJCSp0ID0gTlVMTDsKKwkJaW50CQkJCWNzX2FjdGl2ZSA9IDA7CisJCXN0cnVjdCBvbWFwMl9tY3NwaV9kZXZpY2VfY29uZmlnICpjb25mOworCQlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJCSpjczsKKwkJaW50CQkJCXBhcl9vdmVycmlkZSA9IDA7CisJCWludAkJCQlzdGF0dXMgPSAwOworCQl1MzIJCQkJY2hjb25mOworCisJCW0gPSBjb250YWluZXJfb2YobWNzcGktPm1zZ19xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsCisJCQkJIHF1ZXVlKTsKKworCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycSgmbWNzcGktPmxvY2spOworCisJCXNwaSA9IG0tPnNwaTsKKwkJY29uZiA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOworCQljcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMSk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQkJaWYgKHQtPnR4X2J1ZiA9PSBOVUxMICYmIHQtPnJ4X2J1ZiA9PSBOVUxMICYmIHQtPmxlbikgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocGFyX292ZXJyaWRlIHx8IHQtPnNwZWVkX2h6IHx8IHQtPmJpdHNfcGVyX3dvcmQpIHsKKwkJCQlwYXJfb3ZlcnJpZGUgPSAxOworCQkJCXN0YXR1cyA9IG9tYXAyX21jc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdCk7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOworCQkJCWlmICghdC0+c3BlZWRfaHogJiYgIXQtPmJpdHNfcGVyX3dvcmQpCisJCQkJCXBhcl9vdmVycmlkZSA9IDA7CisJCQl9CisKKwkJCWlmICghY3NfYWN0aXZlKSB7CisJCQkJb21hcDJfbWNzcGlfZm9yY2VfY3Moc3BpLCAxKTsKKwkJCQljc19hY3RpdmUgPSAxOworCQkJfQorCisJCQljaGNvbmYgPSBtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjApOworCQkJY2hjb25mICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfVFJNX01BU0s7CisJCQlpZiAodC0+dHhfYnVmID09IE5VTEwpCisJCQkJY2hjb25mIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fUlhfT05MWTsKKwkJCWVsc2UgaWYgKHQtPnJ4X2J1ZiA9PSBOVUxMKQorCQkJCWNoY29uZiB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1RYX09OTFk7CisJCQltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwLCBjaGNvbmYpOworCisJCQlpZiAodC0+bGVuKSB7CisJCQkJdW5zaWduZWQJY291bnQ7CisKKwkJCQkvKiBSWF9PTkxZIG1vZGUgbmVlZHMgZHVtbXkgZGF0YSBpbiBUWCByZWcgKi8KKwkJCQlpZiAodC0+dHhfYnVmID09IE5VTEwpCisJCQkJCV9fcmF3X3dyaXRlbCgwLCBjcy0+YmFzZQorCQkJCQkJCSsgT01BUDJfTUNTUElfVFgwKTsKKworCQkJCWlmIChtLT5pc19kbWFfbWFwcGVkIHx8IHQtPmxlbiA+PSBETUFfTUlOX0JZVEVTKQorCQkJCQljb3VudCA9IG9tYXAyX21jc3BpX3R4cnhfZG1hKHNwaSwgdCk7CisJCQkJZWxzZQorCQkJCQljb3VudCA9IG9tYXAyX21jc3BpX3R4cnhfcGlvKHNwaSwgdCk7CisJCQkJbS0+YWN0dWFsX2xlbmd0aCArPSBjb3VudDsKKworCQkJCWlmIChjb3VudCAhPSB0LT5sZW4pIHsKKwkJCQkJc3RhdHVzID0gLUVJTzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQkJLyogaWdub3JlIHRoZSAibGVhdmUgaXQgb24gYWZ0ZXIgbGFzdCB4ZmVyIiBoaW50ICovCisJCQlpZiAodC0+Y3NfY2hhbmdlKSB7CisJCQkJb21hcDJfbWNzcGlfZm9yY2VfY3Moc3BpLCAwKTsKKwkJCQljc19hY3RpdmUgPSAwOworCQkJfQorCQl9CisKKwkJLyogUmVzdG9yZSBkZWZhdWx0cyBpZiB0aGV5IHdlcmUgb3ZlcnJpZGVuICovCisJCWlmIChwYXJfb3ZlcnJpZGUpIHsKKwkJCXBhcl9vdmVycmlkZSA9IDA7CisJCQlzdGF0dXMgPSBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCQl9CisKKwkJaWYgKGNzX2FjdGl2ZSkKKwkJCW9tYXAyX21jc3BpX2ZvcmNlX2NzKHNwaSwgMCk7CisKKwkJb21hcDJfbWNzcGlfc2V0X2VuYWJsZShzcGksIDApOworCisJCW0tPnN0YXR1cyA9IHN0YXR1czsKKwkJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7CisKKwkJc3Bpbl9sb2NrX2lycSgmbWNzcGktPmxvY2spOworCX0KKworCWNsa19kaXNhYmxlKG1jc3BpLT5mY2spOworCWNsa19kaXNhYmxlKG1jc3BpLT5pY2spOworCisJc3Bpbl91bmxvY2tfaXJxKCZtY3NwaS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgb21hcDJfbWNzcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqdDsKKworCW0tPmFjdHVhbF9sZW5ndGggPSAwOworCW0tPnN0YXR1cyA9IDA7CisKKwkvKiByZWplY3QgaW52YWxpZCBtZXNzYWdlcyBhbmQgdHJhbnNmZXJzICovCisJaWYgKGxpc3RfZW1wdHkoJm0tPnRyYW5zZmVycykgfHwgIW0tPmNvbXBsZXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJY29uc3Qgdm9pZAkqdHhfYnVmID0gdC0+dHhfYnVmOworCQl2b2lkCQkqcnhfYnVmID0gdC0+cnhfYnVmOworCQl1bnNpZ25lZAlsZW4gPSB0LT5sZW47CisKKwkJaWYgKHQtPnNwZWVkX2h6ID4gT01BUDJfTUNTUElfTUFYX0ZSRVEKKwkJCQl8fCAobGVuICYmICEocnhfYnVmIHx8IHR4X2J1ZikpCisJCQkJfHwgKHQtPmJpdHNfcGVyX3dvcmQgJiYKKwkJCQkJKCAgdC0+Yml0c19wZXJfd29yZCA8IDQKKwkJCQkJfHwgdC0+Yml0c19wZXJfd29yZCA+IDMyKSkpIHsKKwkJCWRldl9kYmcoJnNwaS0+ZGV2LCAidHJhbnNmZXI6ICVkIEh6LCAlZCAlcyVzLCAlZCBicHdcbiIsCisJCQkJCXQtPnNwZWVkX2h6LAorCQkJCQlsZW4sCisJCQkJCXR4X2J1ZiA/ICJ0eCIgOiAiIiwKKwkJCQkJcnhfYnVmID8gInJ4IiA6ICIiLAorCQkJCQl0LT5iaXRzX3Blcl93b3JkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICh0LT5zcGVlZF9oeiAmJiB0LT5zcGVlZF9oeiA8IE9NQVAyX01DU1BJX01BWF9GUkVRLygxPDwxNikpIHsKKwkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiJWQgSHogbWF4IGV4Y2VlZHMgJWRcbiIsCisJCQkJCXQtPnNwZWVkX2h6LAorCQkJCQlPTUFQMl9NQ1NQSV9NQVhfRlJFUS8oMTw8MTYpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG0tPmlzX2RtYV9tYXBwZWQgfHwgbGVuIDwgRE1BX01JTl9CWVRFUykKKwkJCWNvbnRpbnVlOworCisJCS8qIERvIERNQSBtYXBwaW5nICJlYXJseSIgZm9yIGJldHRlciBlcnJvciByZXBvcnRpbmcgYW5kCisJCSAqIGRjYWNoZSB1c2UuICBOb3RlIHRoYXQgaWYgZG1hX3VubWFwX3NpbmdsZSgpIGV2ZXIgc3RhcnRzCisJCSAqIHRvIGRvIHJlYWwgd29yayBvbiBBUk0sIHdlJ2QgbmVlZCB0byBjbGVhbiB1cCBtYXBwaW5ncworCQkgKiBmb3IgcHJldmlvdXMgdHJhbnNmZXJzIG9uICpBTEwqIGV4aXRzIG9mIHRoaXMgbG9vcC4uLgorCQkgKi8KKwkJaWYgKHR4X2J1ZiAhPSBOVUxMKSB7CisJCQl0LT50eF9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmc3BpLT5kZXYsICh2b2lkICopIHR4X2J1ZiwKKwkJCQkJbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0LT50eF9kbWEpKSB7CisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJkbWEgJWNYICVkIGJ5dGVzIGVycm9yXG4iLAorCQkJCQkJJ1QnLCBsZW4pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCWlmIChyeF9idWYgIT0gTlVMTCkgeworCQkJdC0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoJnNwaS0+ZGV2LCByeF9idWYsIHQtPmxlbiwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0LT5yeF9kbWEpKSB7CisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJkbWEgJWNYICVkIGJ5dGVzIGVycm9yXG4iLAorCQkJCQkJJ1InLCBsZW4pOworCQkJCWlmICh0eF9idWYgIT0gTlVMTCkKKwkJCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCB0LT50eF9kbWEsCisJCQkJCQkJbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNzcGktPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJm1jc3BpLT5tc2dfcXVldWUpOworCXF1ZXVlX3dvcmsob21hcDJfbWNzcGlfd3EsICZtY3NwaS0+d29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNzcGktPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9tY3NwaV9yZXNldChzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpKQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBtY3NwaS0+bWFzdGVyOworCXUzMgkJCXRtcDsKKworCWNsa19lbmFibGUobWNzcGktPmljayk7CisJY2xrX2VuYWJsZShtY3NwaS0+ZmNrKTsKKworCW1jc3BpX3dyaXRlX3JlZyhtYXN0ZXIsIE9NQVAyX01DU1BJX1NZU0NPTkZJRywKKwkJCU9NQVAyX01DU1BJX1NZU0NPTkZJR19TT0ZUUkVTRVQpOworCWRvIHsKKwkJdG1wID0gbWNzcGlfcmVhZF9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9TWVNTVEFUVVMpOworCX0gd2hpbGUgKCEodG1wICYgT01BUDJfTUNTUElfU1lTU1RBVFVTX1JFU0VURE9ORSkpOworCisJbWNzcGlfd3JpdGVfcmVnKG1hc3RlciwgT01BUDJfTUNTUElfU1lTQ09ORklHLAorCQkJLyogKDMgPDwgOCkgfCAoMiA8PCAzKSB8ICovCisJCQlPTUFQMl9NQ1NQSV9TWVNDT05GSUdfQVVUT0lETEUpOworCisJb21hcDJfbWNzcGlfc2V0X21hc3Rlcl9tb2RlKG1hc3Rlcik7CisKKwljbGtfZGlzYWJsZShtY3NwaS0+ZmNrKTsKKwljbGtfZGlzYWJsZShtY3NwaS0+aWNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IF9faW5pdGRhdGEgc3BpMV9yeGRtYV9pZCBbXSA9IHsKKwlPTUFQMjRYWF9ETUFfU1BJMV9SWDAsCisJT01BUDI0WFhfRE1BX1NQSTFfUlgxLAorCU9NQVAyNFhYX0RNQV9TUEkxX1JYMiwKKwlPTUFQMjRYWF9ETUFfU1BJMV9SWDMsCit9OworCitzdGF0aWMgdTggX19pbml0ZGF0YSBzcGkxX3R4ZG1hX2lkIFtdID0geworCU9NQVAyNFhYX0RNQV9TUEkxX1RYMCwKKwlPTUFQMjRYWF9ETUFfU1BJMV9UWDEsCisJT01BUDI0WFhfRE1BX1NQSTFfVFgyLAorCU9NQVAyNFhYX0RNQV9TUEkxX1RYMywKK307CisKK3N0YXRpYyB1OCBfX2luaXRkYXRhIHNwaTJfcnhkbWFfaWRbXSA9IHsKKwlPTUFQMjRYWF9ETUFfU1BJMl9SWDAsCisJT01BUDI0WFhfRE1BX1NQSTJfUlgxLAorfTsKKworc3RhdGljIHU4IF9faW5pdGRhdGEgc3BpMl90eGRtYV9pZFtdID0geworCU9NQVAyNFhYX0RNQV9TUEkyX1RYMCwKKwlPTUFQMjRYWF9ETUFfU1BJMl9UWDEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9tY3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyOworCWludAkJCXN0YXR1cyA9IDAsIGk7CisJY29uc3QgdTgJCSpyeGRtYV9pZCwgKnR4ZG1hX2lkOworCXVuc2lnbmVkCQludW1fY2hpcHNlbGVjdDsKKworCXN3aXRjaCAocGRldi0+aWQpIHsKKwljYXNlIDE6CisJCXJ4ZG1hX2lkID0gc3BpMV9yeGRtYV9pZDsKKwkJdHhkbWFfaWQgPSBzcGkxX3R4ZG1hX2lkOworCQludW1fY2hpcHNlbGVjdCA9IDQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcnhkbWFfaWQgPSBzcGkyX3J4ZG1hX2lkOworCQl0eGRtYV9pZCA9IHNwaTJfdHhkbWFfaWQ7CisJCW51bV9jaGlwc2VsZWN0ID0gMjsKKwkJYnJlYWs7CisJLyogUkVWSVNJVCBvbWFwMjQzMCBoYXMgYSB0aGlyZCBNY1NQSSAuLi4gKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqbWNzcGkpOworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtYXN0ZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAocGRldi0+aWQgIT0gLTEpCisJCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCisJbWFzdGVyLT5zZXR1cCA9IG9tYXAyX21jc3BpX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXIgPSBvbWFwMl9tY3NwaV90cmFuc2ZlcjsKKwltYXN0ZXItPmNsZWFudXAgPSBvbWFwMl9tY3NwaV9jbGVhbnVwOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBudW1fY2hpcHNlbGVjdDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtYXN0ZXIpOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJbWNzcGktPm1hc3RlciA9IG1hc3RlcjsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZ290byBlcnIxOworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgKHItPmVuZCAtIHItPnN0YXJ0KSArIDEsCisJCQlwZGV2LT5kZXYuYnVzX2lkKSkgeworCQlzdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyMTsKKwl9CisKKwltY3NwaS0+YmFzZSA9ICh2b2lkIF9faW9tZW0gKikgaW9fcDJ2KHItPnN0YXJ0KTsKKworCUlOSVRfV09SSygmbWNzcGktPndvcmssIG9tYXAyX21jc3BpX3dvcmspOworCisJc3Bpbl9sb2NrX2luaXQoJm1jc3BpLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmbWNzcGktPm1zZ19xdWV1ZSk7CisKKwltY3NwaS0+aWNrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAibWNzcGlfaWNrIik7CisJaWYgKElTX0VSUihtY3NwaS0+aWNrKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgbWNzcGlfaWNrXG4iKTsKKwkJc3RhdHVzID0gUFRSX0VSUihtY3NwaS0+aWNrKTsKKwkJZ290byBlcnIxYTsKKwl9CisJbWNzcGktPmZjayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1jc3BpX2ZjayIpOworCWlmIChJU19FUlIobWNzcGktPmZjaykpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IG1jc3BpX2Zja1xuIik7CisJCXN0YXR1cyA9IFBUUl9FUlIobWNzcGktPmZjayk7CisJCWdvdG8gZXJyMjsKKwl9CisKKwltY3NwaS0+ZG1hX2NoYW5uZWxzID0ga2NhbGxvYyhtYXN0ZXItPm51bV9jaGlwc2VsZWN0LAorCQkJc2l6ZW9mKHN0cnVjdCBvbWFwMl9tY3NwaV9kbWEpLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAobWNzcGktPmRtYV9jaGFubmVscyA9PSBOVUxMKQorCQlnb3RvIGVycjM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoaXBzZWxlY3Q7IGkrKykgeworCQltY3NwaS0+ZG1hX2NoYW5uZWxzW2ldLmRtYV9yeF9jaGFubmVsID0gLTE7CisJCW1jc3BpLT5kbWFfY2hhbm5lbHNbaV0uZG1hX3J4X3N5bmNfZGV2ID0gcnhkbWFfaWRbaV07CisJCW1jc3BpLT5kbWFfY2hhbm5lbHNbaV0uZG1hX3R4X2NoYW5uZWwgPSAtMTsKKwkJbWNzcGktPmRtYV9jaGFubmVsc1tpXS5kbWFfdHhfc3luY19kZXYgPSB0eGRtYV9pZFtpXTsKKwl9CisKKwlpZiAob21hcDJfbWNzcGlfcmVzZXQobWNzcGkpIDwgMCkKKwkJZ290byBlcnI0OworCisJc3RhdHVzID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycjQ7CisKKwlyZXR1cm4gc3RhdHVzOworCitlcnI0OgorCWtmcmVlKG1jc3BpLT5kbWFfY2hhbm5lbHMpOworZXJyMzoKKwljbGtfcHV0KG1jc3BpLT5mY2spOworZXJyMjoKKwljbGtfcHV0KG1jc3BpLT5pY2spOworZXJyMWE6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCAoci0+ZW5kIC0gci0+c3RhcnQpICsgMSk7CitlcnIxOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2V4aXQgb21hcDJfbWNzcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKmRtYV9jaGFubmVsczsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyOworCisJbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWRtYV9jaGFubmVscyA9IG1jc3BpLT5kbWFfY2hhbm5lbHM7CisKKwljbGtfcHV0KG1jc3BpLT5mY2spOworCWNsa19wdXQobWNzcGktPmljayk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxKTsKKworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWtmcmVlKGRtYV9jaGFubmVscyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcDJfbWNzcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0JCSJvbWFwMl9tY3NwaSIsCisJCS5vd25lciA9CVRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZSA9CV9fZXhpdF9wKG9tYXAyX21jc3BpX3JlbW92ZSksCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXAyX21jc3BpX2luaXQodm9pZCkKK3sKKwlvbWFwMl9tY3NwaV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAorCQkJCW9tYXAyX21jc3BpX2RyaXZlci5kcml2ZXIubmFtZSk7CisJaWYgKG9tYXAyX21jc3BpX3dxID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZvbWFwMl9tY3NwaV9kcml2ZXIsIG9tYXAyX21jc3BpX3Byb2JlKTsKK30KK3N1YnN5c19pbml0Y2FsbChvbWFwMl9tY3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG9tYXAyX21jc3BpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcDJfbWNzcGlfZHJpdmVyKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKG9tYXAyX21jc3BpX3dxKTsKK30KK21vZHVsZV9leGl0KG9tYXAyX21jc3BpX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9vbWFwX3V3aXJlLmMgYi9kcml2ZXJzL3NwaS9vbWFwX3V3aXJlLmMKaW5kZXggOTUxODNlMS4uZDI3NWM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvb21hcF91d2lyZS5jCisrKyBiL2RyaXZlcnMvc3BpL29tYXBfdXdpcmUuYwpAQCAtNDQ1LDEwICs0NDUsMTkgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKwogc3RhdGljIGludCB1d2lyZV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCB1d2lyZV9zdGF0ZSAqdXN0ID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwogCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAodXN0ID09IE5VTEwpIHsKIAkJdXN0ID0ga3phbGxvYyhzaXplb2YoKnVzdCksIEdGUF9LRVJORUwpOwogCQlpZiAodXN0ID09IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKaW5kZXggOWYyYzg4Ny4uZTUxMzExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYwpAQCAtMTA2Nyw2ICsxMDY3LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBKQorCiBzdGF0aWMgaW50IHNldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IHB4YTJ4eF9zcGlfY2hpcCAqY2hpcF9pbmZvID0gTlVMTDsKQEAgLTEwOTMsNiArMTA5NiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIE9ubHkgYWxsb2Mgb24gZmlyc3Qgc2V0dXAgKi8KIAljaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CiAJaWYgKCFjaGlwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS5jCmluZGV4IDQ4MzFlZGIuLjAxODg4NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKIApAQCAtMTg1LDcgKzE4Niw3IEBACiB9OwogCiBzdGF0aWMgTElTVF9IRUFEKGJvYXJkX2xpc3QpOwotc3RhdGljIERFQ0xBUkVfTVVURVgoYm9hcmRfbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKGJvYXJkX2xvY2spOwogCiAKIC8qKgpAQCAtMjkyLDkgKzI5Myw5IEBACiAJYmktPm5fYm9hcmRfaW5mbyA9IG47CiAJbWVtY3B5KGJpLT5ib2FyZF9pbmZvLCBpbmZvLCBuICogc2l6ZW9mICppbmZvKTsKIAotCWRvd24oJmJvYXJkX2xvY2spOworCW11dGV4X2xvY2soJmJvYXJkX2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJmJpLT5saXN0LCAmYm9hcmRfbGlzdCk7Ci0JdXAoJmJvYXJkX2xvY2spOworCW11dGV4X3VubG9jaygmYm9hcmRfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwOCw3ICszMDksNyBAQAogCXN0cnVjdCBib2FyZGluZm8JKmJpOwogCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSBtYXN0ZXItPmNkZXYuZGV2OwogCi0JZG93bigmYm9hcmRfbG9jayk7CisJbXV0ZXhfbG9jaygmYm9hcmRfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShiaSwgJmJvYXJkX2xpc3QsIGxpc3QpIHsKIAkJc3RydWN0IHNwaV9ib2FyZF9pbmZvCSpjaGlwID0gYmktPmJvYXJkX2luZm87CiAJCXVuc2lnbmVkCQluOwpAQCAtMzMwLDcgKzMzMSw3IEBACiAJCQkodm9pZCkgc3BpX25ld19kZXZpY2UobWFzdGVyLCBjaGlwKTsKIAkJfQogCX0KLQl1cCgmYm9hcmRfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZib2FyZF9sb2NrKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCmluZGV4IDg4NDI1ZTEuLjBjODVjOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwpAQCAtMTg3LDEyICsxODcsMTAgQEAKIAogCWJpdGJhbmcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCS8qIFJFVklTSVQ6IHNvbWUgc3lzdGVtcyB3aWxsIHdhbnQgdG8gc3VwcG9ydCBkZXZpY2VzIHVzaW5nIGxzYi1maXJzdAotCSAqIGJpdCBlbmNvZGluZ3Mgb24gdGhlIHdpcmUuICBJbiBwdXJlIHNvZnR3YXJlIHRoYXQgd291bGQgYmUgdHJpdmlhbCwKLQkgKiBqdXN0IGJpdGJhbmdfdHhyeF9sZV9jcGhhWCgpIHJvdXRpbmVzIHNoaWZ0aW5nIHRoZSBvdGhlciB3YXksIGFuZAotCSAqIHNvbWUgaGFyZHdhcmUgY29udHJvbGxlcnMgYWxzbyBoYXZlIHRoaXMgc3VwcG9ydC4KKwkvKiBCaXRiYW5nZXJzIGNhbiBzdXBwb3J0IFNQSV9DU19ISUdILCBTUElfM1dJUkUsIGFuZCBzbyBvbjsKKwkgKiBhZGQgdGhvc2UgdG8gbWFzdGVyLT5mbGFncywgYW5kIHByb3ZpZGUgdGhlIG90aGVyIHN1cHBvcnQuCiAJICovCi0JaWYgKChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSAhPSAwKQorCWlmICgoc3BpLT5tb2RlICYgfihTUElfQ1BPTHxTUElfQ1BIQXxiaXRiYW5nLT5mbGFncykpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFjcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2lteC5jIGIvZHJpdmVycy9zcGkvc3BpX2lteC5jCmluZGV4IDY1NmJlNGEuLmFlZTlhZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9pbXguYworKysgYi9kcml2ZXJzL3NwaS9zcGlfaW14LmMKQEAgLTExNjMsNiArMTE2Myw5IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIKQorCiAvKiBPbiBmaXJzdCBzZXR1cCBiYWQgdmFsdWVzIG11c3QgZnJlZSBjaGlwX2RhdGEgbWVtb3J5IHNpbmNlIHdpbGwgY2F1c2UKICAgIHNwaV9uZXdfZGV2aWNlIHRvIGZhaWwuIEJhZCB2YWx1ZSBzZXR1cCBmcm9tIHByb3RvY29sIGRyaXZlciBhcmUgc2ltcGx5IG5vdAogICAgYXBwbGllZCBhbmQgbm90aWZpZWQgdG8gdGhlIGNhbGxpbmcgZHJpdmVyLiAqLwpAQCAtMTE3NCw2ICsxMTc3LDEyIEBACiAJdTMyIHRtcDsKIAlpbnQgc3RhdHVzID0gMDsKIAorCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogR2V0IGNvbnRyb2xsZXIgZGF0YSAqLwogCWNoaXBfaW5mbyA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCkBAIC0xMjQ1LDIxICsxMjU0LDYgQEAKIAogCS8qIFNQSSBtb2RlICovCiAJdG1wID0gc3BpLT5tb2RlOwotCWlmICh0bXAgJiBTUElfTFNCX0ZJUlNUKSB7Ci0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCWlmIChmaXJzdF9zZXR1cCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJInNldHVwIC0gIgotCQkJCSJIVyBkb2Vzbid0IHN1cHBvcnQgTFNCIGZpcnN0IHRyYW5zZmVyXG4iKTsKLQkJCWdvdG8gZXJyX2ZpcnN0X3NldHVwOwotCQl9IGVsc2UgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJInNldHVwIC0gIgotCQkJCSJIVyBkb2Vzbid0IHN1cHBvcnQgTFNCIGZpcnN0IHRyYW5zZmVyLCAiCi0JCQkJImRlZmF1bHQgdG8gTVNCIGZpcnN0XG4iKTsKLQkJCXNwaS0+bW9kZSAmPSB+U1BJX0xTQl9GSVJTVDsKLQkJfQotCX0KIAlpZiAodG1wICYgU1BJX0NTX0hJR0gpIHsKIAkJdTMyX0VESVQoY2hpcC0+Y29udHJvbCwKIAkJCQlTUElfQ09OVFJPTF9TU1BPTCwgU1BJX0NPTlRST0xfU1NQT0xfQUNUX0hJR0gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYyBiL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhNjhhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBzcGlfbG03MGxscC5jIC0gZHJpdmVyIGZvciBsbTcwbGxwIGV2YWwgYm9hcmQgZm9yIHRoZSBMTTcwIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworCisvKgorICogVGhlIExNNzAgY29tbXVuaWNhdGVzIHdpdGggYSBob3N0IHByb2Nlc3NvciB1c2luZyBhIDMtd2lyZSB2YXJpYW50IG9mCisgKiB0aGUgU1BJL01pY3Jvd2lyZSBidXMgaW50ZXJmYWNlLiBUaGlzIGRyaXZlciBzcGVjaWZpY2FsbHkgc3VwcG9ydHMgYW4KKyAqIE5TIExNNzAgTExQIEV2YWx1YXRpb24gQm9hcmQsIGludGVyZmFjaW5nIHRvIGEgUEMgdXNpbmcgaXRzIHBhcmFsbGVsCisgKiBwb3J0IHRvIGJpdGJhbmcgYW4gU1BJLXBhcnBvcnQgYnJpZGdlLiAgQWNjb3JkaW5nbHksIHRoaXMgaXMgYW4gU1BJCisgKiBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIuICBUaGUgaHdtb24vbG03MCBkcml2ZXIgaXMgYSAiU1BJIHByb3RvY29sCisgKiBkcml2ZXIiLCBsYXllcmVkIG9uIHRvcCBvZiB0aGlzIG9uZSBhbmQgdXNhYmxlIHdpdGhvdXQgdGhlIGxtNzBsbHAuCisgKgorICogVGhlIExNNzAgaXMgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcCBmcm9tIE5hdGlvbmFsIFNlbWljb25kdWN0b3I7IGl0cworICogZGF0YXNoZWV0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTcwLmh0bWwKKyAqCisgKiBBbHNvIHNlZSBEb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscC4gIFRoZSBTUEk8LT5wYXJwb3J0IGNvZGUgaGVyZSBpcworICogKGhlYXZpbHkpIGJhc2VkIG9uIHNwaS1idXR0ZXJmbHkgYnkgRGF2aWQgQnJvd25lbGwuCisgKgorICogVGhlIExNNzAgTExQIGNvbm5lY3RzIHRvIHRoZSBQQyBwYXJhbGxlbCBwb3J0IGluIHRoZSBmb2xsb3dpbmcgbWFubmVyOgorICoKKyAqICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCisgKiAgICAgUG9ydCAgICAgIERpcmVjdGlvbiAgIEpQMiBIZWFkZXIKKyAqICAtLS0tLS0tLS0tLSAgLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0KKyAqICAgICAgRDAgICAgMiAgICAgIC0gICAgICAgICAtCisgKiAgICAgIEQxICAgIDMgICAgIC0tPiAgICAgIFYrICAgNQorICogICAgICBEMiAgICA0ICAgICAtLT4gICAgICBWKyAgIDUKKyAqICAgICAgRDMgICAgNSAgICAgLS0+ICAgICAgVisgICA1CisgKiAgICAgIEQ0ICAgIDYgICAgIC0tPiAgICAgIFYrICAgNQorICogICAgICBENSAgICA3ICAgICAtLT4gICAgICBuQ1MgIDgKKyAqICAgICAgRDYgICAgOCAgICAgLS0+ICAgICAgU0NMSyAzCisgKiAgICAgIEQ3ICAgIDkgICAgIC0tPiAgICAgIFNJL08gNQorICogICAgIEdORCAgIDI1ICAgICAgLSAgICAgICBHTkQgIDcKKyAqICAgIFNlbGVjdCAxMyAgICAgPC0tICAgICAgU0kvTyAxCisgKgorICogTm90ZSB0aGF0IHBhcnBvcnQgcGluIDEzIGFjdHVhbGx5IGdldHMgaW52ZXJ0ZWQgYnkgdGhlIHRyYW5zaXN0b3IKKyAqIGFycmFuZ2VtZW50IHdoaWNoIGxldHMgZWl0aGVyIHRoZSBwYXJwb3J0IG9yIHRoZSBMTTcwIGRyaXZlIHRoZQorICogU0kvU08gc2lnbmFsLgorICovCisKKyNkZWZpbmUgRFJWTkFNRQkJInNwaS1sbTcwbGxwIgorCisjZGVmaW5lIGxtNzBfSU5JVAkweEJFCisjZGVmaW5lIFNJTwkJMHgxMAorI2RlZmluZSBuQ1MJCTB4MjAKKyNkZWZpbmUgU0NMSwkJMHg0MAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3Qgc3BpX2xtNzBsbHAgeworCXN0cnVjdCBzcGlfYml0YmFuZwliaXRiYW5nOworCXN0cnVjdCBwYXJwb3J0CQkqcG9ydDsKKwlzdHJ1Y3QgcGFyZGV2aWNlCSpwZDsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpZGV2X2xtNzA7CisJc3RydWN0IHNwaV9ib2FyZF9pbmZvCWluZm87CisJc3RydWN0IGNsYXNzX2RldmljZQkqY2RldjsKK307CisKKy8qIFJFVklTSVQgOiB1Z2x5IGdsb2JhbCA7IHByb3ZpZGVzICJleGNsdXNpdmUgb3BlbiIgZmFjaWxpdHkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX2xtNzBsbHAgKmxtNzBsbHA7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnNwaWRldl90b19wcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBzcGktPmNvbnRyb2xsZXJfZGF0YTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExNNzAgTExQIGV2YWwgYm9hcmQtc3BlY2lmaWMgaW5saW5lcyBmb2xsb3cgKi8KKworLyogTk9URTogIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gcmVyZWFkIHRoZSBvdXRwdXQgdmFsdWVzLCBzaW5jZSB0aGV5J2xsCisgKiBzdGlsbCBiZSB3aGF0IHdlIHdyb3RlIGJlZm9yZS4gIFBsdXMsIGdvaW5nIHRocm91Z2ggcGFycG9ydCBidWlsZHMgaW4KKyAqIGEgfjFtcy9vcGVyYXRpb24gZGVsYXk7IHRoZXNlIFNQSSB0cmFuc2ZlcnMgY291bGQgZWFzaWx5IGJlIGZhc3Rlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZGVhc3NlcnRDUyhzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQoreworCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhIHwgbkNTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFzc2VydENTKHN0cnVjdCBzcGlfbG03MGxscCAqcHApCit7CisJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgJiB+bkNTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsa0hpZ2goc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKK3sKKwl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSB8IFNDTEspOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xrTG93KHN0cnVjdCBzcGlfbG03MGxscCAqcHApCit7CisJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgJiB+U0NMSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEktTE03MC1zcGVjaWZpYyBpbmxpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpZGVsYXkodW5zaWduZWQgZCkKK3sKKwl1ZGVsYXkoZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRzY2soc3RydWN0IHNwaV9kZXZpY2UgKnMsIGludCBpc19vbikKK3sKKwlzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwID0gc3BpZGV2X3RvX3BwKHMpOworCisJaWYgKGlzX29uKQorCQljbGtIaWdoKHBwKTsKKwllbHNlCisJCWNsa0xvdyhwcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRtb3NpKHN0cnVjdCBzcGlfZGV2aWNlICpzLCBpbnQgaXNfb24pCit7CisJLyogRklYTUUgdXBkYXRlIEQ3IC4uLiB0aGlzIHdheSB3ZSBjYW4gcHV0IHRoZSBjaGlwCisJICogaW50byBzaHV0ZG93biBtb2RlIGFuZCByZWFkIHRoZSBtYW51ZmFjdHVyZXIgSUQsCisJICogYnV0IHdlIGNhbid0IHB1dCBpdCBiYWNrIGludG8gb3BlcmF0aW9uYWwgbW9kZS4KKwkgKi8KK30KKworLyoKKyAqIGdldG1pc286CisgKiBXaHkgZG8gd2UgcmV0dXJuIDAgd2hlbiB0aGUgU0lPIGxpbmUgaXMgaGlnaCBhbmQgdmljZS12ZXJzYT8KKyAqIFRoZSBmYWN0IGlzLCB0aGUgbG03MCBldmFsIGJvYXJkIGZyb20gTlMgKHdoaWNoIHRoaXMgZHJpdmVyIGRyaXZlcyksCisgKiBpcyB3aXJlZCBpbiBqdXN0IHN1Y2ggYSB3YXkgOiB3aGVuIHRoZSBsbTcwJ3MgU0lPIGdvZXMgaGlnaCwgYSB0cmFuc2lzdG9yCisgKiBzd2l0Y2hlcyBpdCB0byBsb3cgcmVmbGVjdGluZyB0aGlzIG9uIHRoZSBwYXJwb3J0IChwaW4gMTMpLCBhbmQgdmljZS12ZXJzYS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0bWlzbyhzdHJ1Y3Qgc3BpX2RldmljZSAqcykKK3sKKwlzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwID0gc3BpZGV2X3RvX3BwKHMpOworCXJldHVybiAoKFNJTyA9PSAocGFycG9ydF9yZWFkX3N0YXR1cyhwcC0+cG9ydCkgJiBTSU8pKSA/IDAgOiAxICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBFWFBBTkRfQklUQkFOR19UWFJYIDEKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworc3RhdGljIHZvaWQgbG03MF9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisKKwlpZiAodmFsdWUpCisJCWFzc2VydENTKHBwKTsKKwllbHNlCisJCWRlYXNzZXJ0Q1MocHApOworfQorCisvKgorICogT3VyIGFjdHVhbCBiaXRiYW5nZXIgcm91dGluZS4KKyAqLworc3RhdGljIHUzMiBsbTcwX3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXN0YXRpYyB1MzIgc2lvPTA7CisJc3RhdGljIGludCBmaXJzdF90aW1lPTE7CisKKwkvKiBGaXJzdCB0aW1lOiBwZXJmb3JtIFNQSSBiaXRiYW5nIGFuZCByZXR1cm4gdGhlIExTQiBvZgorCSAqIHRoZSByZXN1bHQgb2YgdGhlIFNQSSBjYWxsLgorCSAqLworCWlmIChmaXJzdF90aW1lKSB7CisJCXNpbyA9IGJpdGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAwLCB3b3JkLCBiaXRzKTsKKwkJZmlyc3RfdGltZT0wOworCQlyZXR1cm4gKHNpbyAmIDB4MDBmZik7CisJfQorCS8qIFJldHVybiB0aGUgTVNCIG9mIHRoZSByZXN1bHQgb2YgdGhlIFNQSSBjYWxsICovCisJZWxzZSB7CisJCWZpcnN0X3RpbWU9MTsKKwkJcmV0dXJuIChzaW8gPj4gOCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcGlfbG03MGxscF9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHBhcmRldmljZQkqcGQ7CisJc3RydWN0IHNwaV9sbTcwbGxwCSpwcDsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCWludAkJCXN0YXR1czsKKworCWlmIChsbTcwbGxwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogc3BpX2xtNzBsbHAgaW5zdGFuY2UgYWxyZWFkeSBsb2FkZWQuIEFib3J0aW5nLlxuIiwKKwkJCURSVk5BTUUpOworCQlyZXR1cm47CisJfQorCisJLyogVE9ETzogIHRoaXMganVzdCBfYXNzdW1lc18gYSBsbTcwIGlzIHRoZXJlIC4uLiBubyBwcm9iZTsKKwkgKiB0aGUgbG03MCBkcml2ZXIgY291bGQgdmVyaWZ5IGl0LCByZWFkaW5nIHRoZSBtYW5mIElELgorCSAqLworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihwLT5waHlzcG9ydC0+ZGV2LCBzaXplb2YgKnBwKTsKKwlpZiAoIW1hc3RlcikgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mYWlsOworCX0KKwlwcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCW1hc3Rlci0+YnVzX251bSA9IC0xOwkvKiBkeW5hbWljIGFsbG9jIG9mIGEgYnVzIG51bWJlciAqLworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAxOworCisJLyoKKwkgKiBTUEkgYW5kIGJpdGJhbmcgaG9va3VwLgorCSAqLworCXBwLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJcHAtPmJpdGJhbmcuY2hpcHNlbGVjdCA9IGxtNzBfY2hpcHNlbGVjdDsKKwlwcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBsbTcwX3R4cng7CisJcHAtPmJpdGJhbmcuZmxhZ3MgPSBTUElfM1dJUkU7CisKKwkvKgorCSAqIFBhcnBvcnQgaG9va3VwCisJICovCisJcHAtPnBvcnQgPSBwOworCXBkID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocCwgRFJWTkFNRSwKKwkJCU5VTEwsIE5VTEwsIE5VTEwsCisJCQlQQVJQT1JUX0ZMQUdfRVhDTCwgcHApOworCWlmICghcGQpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9tYXN0ZXI7CisJfQorCXBwLT5wZCA9IHBkOworCisJc3RhdHVzID0gcGFycG9ydF9jbGFpbShwZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0X3BhcnBvcnRfdW5yZWc7CisKKwkvKgorCSAqIFN0YXJ0IFNQSSAuLi4KKwkgKi8KKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdGFydCgmcHAtPmJpdGJhbmcpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogc3BpX2JpdGJhbmdfc3RhcnQgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLAorCQkJRFJWTkFNRSwgc3RhdHVzKTsKKwkJZ290byBvdXRfb2ZmX2FuZF9yZWxlYXNlOworCX0KKworCS8qCisJICogVGhlIG1vZGFsaWFzIG5hbWUgTVVTVCBtYXRjaCB0aGUgZGV2aWNlX2RyaXZlciBuYW1lCisJICogZm9yIHRoZSBidXMgZ2x1ZSBjb2RlIHRvIG1hdGNoIGFuZCBzdWJzZXF1ZW50bHkgYmluZCB0aGVtLgorCSAqIFdlIGFyZSBiaW5kaW5nIHRvIHRoZSBnZW5lcmljIGRyaXZlcnMvaHdtb24vbG03MC5jIGRldmljZQorCSAqIGRyaXZlci4KKwkgKi8KKwlzdHJjcHkocHAtPmluZm8ubW9kYWxpYXMsICJsbTcwIik7CisJcHAtPmluZm8ubWF4X3NwZWVkX2h6ID0gNiAqIDEwMDAgKiAxMDAwOworCXBwLT5pbmZvLmNoaXBfc2VsZWN0ID0gMDsKKwlwcC0+aW5mby5tb2RlID0gU1BJXzNXSVJFIHwgU1BJX01PREVfMDsKKworCS8qIHBvd2VyIHVwIHRoZSBjaGlwLCBhbmQgbGV0IHRoZSBMTTcwIGNvbnRyb2wgU0kvU08gKi8KKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGxtNzBfSU5JVCk7CisKKwkvKiBFbmFibGUgYWNjZXNzIHRvIG91ciBwcmltYXJ5IGRhdGEgc3RydWN0dXJlIHZpYQorCSAqIHRoZSBib2FyZCBpbmZvJ3MgKHZvaWQgKiljb250cm9sbGVyX2RhdGEuCisJICovCisJcHAtPmluZm8uY29udHJvbGxlcl9kYXRhID0gcHA7CisJcHAtPnNwaWRldl9sbTcwID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm8pOworCWlmIChwcC0+c3BpZGV2X2xtNzApCisJCWRldl9kYmcoJnBwLT5zcGlkZXZfbG03MC0+ZGV2LCAic3BpZGV2X2xtNzAgYXQgJXNcbiIsCisJCQkJcHAtPnNwaWRldl9sbTcwLT5kZXYuYnVzX2lkKTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNwaV9uZXdfZGV2aWNlIGZhaWxlZFxuIiwgRFJWTkFNRSk7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2JpdGJhbmdfc3RvcDsKKwl9CisJcHAtPnNwaWRldl9sbTcwLT5iaXRzX3Blcl93b3JkID0gMTY7CisKKwlsbTcwbGxwID0gcHA7CisKKwlyZXR1cm47CisKK291dF9iaXRiYW5nX3N0b3A6CisJc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOworb3V0X29mZl9hbmRfcmVsZWFzZToKKwkvKiBwb3dlciBkb3duICovCisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKKwltZGVsYXkoMTApOworCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOworb3V0X3BhcnBvcnRfdW5yZWc6CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwZCk7CitvdXRfZnJlZV9tYXN0ZXI6CisJKHZvaWQpIHNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CitvdXRfZmFpbDoKKwlwcl9pbmZvKCIlczogc3BpX2xtNzBsbHAgcHJvYmUgZmFpbCwgc3RhdHVzICVkXG4iLCBEUlZOQU1FLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBzcGlfbG03MGxscF9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHNwaV9sbTcwbGxwCQkqcHA7CisKKwlpZiAoIWxtNzBsbHAgfHwgbG03MGxscC0+cG9ydCAhPSBwKQorCQlyZXR1cm47CisKKwlwcCA9IGxtNzBsbHA7CisJc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOworCisJLyogcG93ZXIgZG93biAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CisJbXNsZWVwKDEwKTsKKworCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPnBkKTsKKworCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChwcC0+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+UFJBTURBQzAsIDB4MDYwOCwgZGFjMF9yZWc2MDgpOwogCiAJTlZfV1IzMihQUkFNREFDLCAweDA1MkMsIHJlZzUyQyk7CiAJTlZfV1IzMihQUkFNREFDLCAweDA2MDgsIHJlZzYwOCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmggYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmgKaW5kZXggMzhmN2NjMC4uMmZkZjc3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfdHlwZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaApAQCAtODYsNiArODYsNyBAQAogCXUzMiB0aW1pbmdWOwogCXUzMiBkaXNwbGF5VjsKIAl1MzIgY3J0Y1N5bmM7CisJdTMyIGNvbnRyb2w7CiB9IFJJVkFfSFdfU1RBVEU7CiAKIHN0cnVjdCByaXZhX3JlZ3MgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwppbmRleCA0MWY2MzY1Li5hN2ZlMjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwpAQCAtNjc0LDYgKzY3NCw3IEBACiAJCWluZm8tPmZib3BzLT5mYl9zeW5jID0gbnZpZGlhZmJfc3luYzsKIAkJaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSA0OwogCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19SRUFEU19GQVNUOwogCQlOVlJlc2V0R3JhcGhpY3MoaW5mbyk7CiAJfSBlbHNlIHsKIAkJaW5mby0+ZmJvcHMtPmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQ7CkBAIC02ODIsNiArNjgzLDcgQEAKIAkJaW5mby0+ZmJvcHMtPmZiX3N5bmMgPSBOVUxMOwogCQlpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiA9IDE7CiAJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX1JFQURTX0ZBU1Q7CiAJfQogCiAJcGFyLT5jdXJzb3JfcmVzZXQgPSAxOwpAQCAtMTE5Myw3ICsxMTk1LDggQEAKIAogCXByaW50ayhLRVJOX0lORk8gUEZYICJEZXZpY2UgSUQ6ICV4IFxuIiwgaWQpOwogCi0JaWYgKChpZCAmIDB4ZmZmMCkgPT0gMHgwMGYwKSB7CisJaWYgKChpZCAmIDB4ZmZmMCkgPT0gMHgwMGYwIHx8CisJICAgIChpZCAmIDB4ZmZmMCkgPT0gMHgwMmUwKSB7CiAJCS8qIHBjaS1lICovCiAJCWlkID0gTlZfUkQzMihwYXItPlJFR1MsIDB4MTgwMCk7CiAKQEAgLTEyMzgsMTggKzEyNDEsMTYgQEAKIAljYXNlIDB4MDA0MDoJCS8qIEdlRm9yY2UgNjgwMCAqLwogCWNhc2UgMHgwMEMwOgkJLyogR2VGb3JjZSA2ODAwICovCiAJY2FzZSAweDAxMjA6CQkvKiBHZUZvcmNlIDY4MDAgKi8KLQljYXNlIDB4MDEzMDoKIAljYXNlIDB4MDE0MDoJCS8qIEdlRm9yY2UgNjYwMCAqLwogCWNhc2UgMHgwMTYwOgkJLyogR2VGb3JjZSA2MjAwICovCiAJY2FzZSAweDAxRDA6CQkvKiBHZUZvcmNlIDcyMDAsIDczMDAsIDc0MDAgKi8KLQljYXNlIDB4MDJFMDoJCS8qIEdlRm9yY2UgNzMwMCBHVCAqLwogCWNhc2UgMHgwMDkwOgkJLyogR2VGb3JjZSA3ODAwICovCiAJY2FzZSAweDAyMTA6CQkvKiBHZUZvcmNlIDY4MDAgKi8KIAljYXNlIDB4MDIyMDoJCS8qIEdlRm9yY2UgNjIwMCAqLwotCWNhc2UgMHgwMjMwOgogCWNhc2UgMHgwMjQwOgkJLyogR2VGb3JjZSA2MTAwICovCiAJY2FzZSAweDAyOTA6CQkvKiBHZUZvcmNlIDc5MDAgKi8KIAljYXNlIDB4MDM5MDoJCS8qIEdlRm9yY2UgNzYwMCAqLworCWNhc2UgMHgwM0QwOgogCQlhcmNoID0gTlZfQVJDSF80MDsKIAkJYnJlYWs7CiAJY2FzZSAweDAwMjA6CQkvKiBUTlQsIFROVDIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb2ZmYi5jIGIvZHJpdmVycy92aWRlby9vZmZiLmMKaW5kZXggODg1YjQyOC4uNDUyNDMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vZmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9vZmZiLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmJfaW5mbykgKyBzaXplb2YodTMyKSAqIDE3OworCXNpemUgPSBzaXplb2Yoc3RydWN0IGZiX2luZm8pICsgc2l6ZW9mKHUzMikgKiAxNjsKIAogCWluZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwogCQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjRkMjViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKQEAgLTAsMCArMSw1OCBAQAorY29uZmlnIEZCX09NQVAKKwl0cmlzdGF0ZSAiT01BUCBmcmFtZSBidWZmZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEZCCisJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAorCWhlbHAKKyAgICAgICAgICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciBPTUFQIGJhc2VkIGJvYXJkcy4KKworY29uZmlnIEZCX09NQVBfQk9PVExPQURFUl9JTklUCisJYm9vbCAiQ2hlY2sgYm9vdGxvYWRlciBpbml0aWFsaXphaW9uIgorCWRlcGVuZHMgb24gRkJfT01BUAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGNoZWNraW5nIGlmIHRoZSBib290bG9hZGVyIGhhcworCSAgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgZGlzcGxheSBjb250cm9sbGVyLiBJbiB0aGlzIGNhc2UgdGhlCisJICBkcml2ZXIgd2lsbCBza2lwIHRoZSBpbml0aWFsaXphdGlvbi4KKworY29uZmlnIEZCX09NQVBfQ09OU0lTVEVOVF9ETUFfU0laRQorCWludCAiQ29uc2lzdGVudCBETUEgbWVtb3J5IHNpemUgKE1CKSIKKwlkZXBlbmRzIG9uIEZCX09NQVAKKwlyYW5nZSAxIDE0CisJZGVmYXVsdCAyCisJaGVscAorCSAgSW5jcmVhc2UgdGhlIERNQSBjb25zaXN0ZW50IG1lbW9yeSBzaXplIGFjY29yZGluZyB0byB5b3VyIHZpZGVvCisJICBtZW1vcnkgbmVlZHMsIGZvciBleGFtcGxlIGlmIHlvdSB3YW50IHRvIHVzZSBtdWx0aXBsZSBwbGFuZXMuCisJICBUaGUgc2l6ZSBtdXN0IGJlIDJNQiBhbGlnbmVkLgorCSAgSWYgdW5zdXJlIHNheSAxLgorCitjb25maWcgRkJfT01BUF9ETUFfVFVORQorICAgICAgICBib29sICJTZXQgRE1BIFNEUkFNIGFjY2VzcyBwcmlvcml0eSBoaWdoIgorICAgICAgICBkZXBlbmRzIG9uIEZCX09NQVAgJiYgQVJDSF9PTUFQMQorICAgICAgICBoZWxwCisgICAgICAgICAgT24gc3lzdGVtcyBpbiB3aGljaCB2aWRlbyBtZW1vcnkgaXMgaW4gc3lzdGVtIG1lbW9yeQorICAgICAgICAgIChTRFJBTSkgdGhpcyB3aWxsIHNwZWVkIHVwIGdyYXBoaWNzIERNQSBvcGVyYXRpb25zLgorICAgICAgICAgIElmIHlvdSBoYXZlIHN1Y2ggYSBzeXN0ZW0gYW5kIHdhbnQgdG8gdXNlIHJvdGF0aW9uCisgICAgICAgICAgYW5zd2VyIHllcy4gQW5zd2VyIG5vIGlmIHlvdSBoYXZlIGEgZGVkaWNhdGVkIHZpZGVvCisgICAgICAgICAgbWVtb3J5LCBvciBkb24ndCB1c2UgYW55IG9mIHRoZSBhY2NlbGVyYXRlZCBmZWF0dXJlcy4KKworY29uZmlnIEZCX09NQVBfTENEQ19FWFRFUk5BTAorCWJvb2wgIkV4dGVybmFsIExDRCBjb250cm9sbGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQl9PTUFQCisJaGVscAorCSAgU2F5IFkgaGVyZSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciBib2FyZHMgd2l0aCBhbgorCSAgZXh0ZXJuYWwgTENEIGNvbnRyb2xsZXIgY29ubmVjdGVkIHRvIHRoZSBTb1NTSS9SRkJJIGludGVyZmFjZS4KKworY29uZmlnIEZCX09NQVBfTENEQ19IV0E3NDIKKwlib29sICJFcHNvbiBIV0E3NDIgTENEIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCX09NQVAgJiYgRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIHN1cHBvcnQgZm9yIHRoZSBleHRlcm5hbAorCSAgRXBzb24gSFdBNzQyIExDRCBjb250cm9sbGVyLgorCitjb25maWcgRkJfT01BUF9MQ0RDX0JMSVpaQVJECisJYm9vbCAiRXBzb24gQmxpenphcmQgTENEIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCX09NQVAgJiYgRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIHN1cHBvcnQgZm9yIHRoZSBleHRlcm5hbAorCSAgRXBzb24gQmxpenphcmQgTENEIGNvbnRyb2xsZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL29tYXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkYThiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZQpAQCAtMCwwICsxLDI5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbmV3IE9NQVAgZnJhbWVidWZmZXIgZGV2aWNlIGRyaXZlcgorIworCitvYmotJChDT05GSUdfRkJfT01BUCkgKz0gb21hcGZiLm8KKworb2Jqcy15eSA6PSBvbWFwZmJfbWFpbi5vCisKK29ianMteSQoQ09ORklHX0FSQ0hfT01BUDEpICs9IGxjZGMubworb2Jqcy15JChDT05GSUdfQVJDSF9PTUFQMikgKz0gZGlzcGMubworCitvYmpzLSQoQ09ORklHX0FSQ0hfT01BUDEpJChDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMKSArPSBzb3NzaS5vCitvYmpzLSQoQ09ORklHX0FSQ0hfT01BUDIpJChDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMKSArPSByZmJpLm8KKworb2Jqcy15JChDT05GSUdfRkJfT01BUF9MQ0RDX0hXQTc0MikgKz0gaHdhNzQyLm8KK29ianMteSQoQ09ORklHX0ZCX09NQVBfTENEQ19CTElaWkFSRCkgKz0gYmxpenphcmQubworCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfSDQpICs9IGxjZF9oNC5vCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfSDMpICs9IGxjZF9oMy5vCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfUEFMTVRFKSArPSBsY2RfcGFsbXRlLm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9QQUxNVFQpICs9IGxjZF9wYWxtdHQubworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX1BBTE1aNzEpICs9IGxjZF9wYWxtejcxLm8KK29ianMtJChDT05GSUdfQVJDSF9PTUFQMTZYWCkkKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKSArPSBsY2RfaW5uMTYxMC5vCitvYmpzLSQoQ09ORklHX0FSQ0hfT01BUDE1WFgpJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gbGNkX2lubjE1MTAubworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX09TSykgKz0gbGNkX29zay5vCitvYmpzLXkkKENPTkZJR19NQUNIX1NYMSkgKz0gbGNkX3N4MS5vCisKK29tYXBmYi1vYmpzIDo9ICQob2Jqcy15eSkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2JsaXp6YXJkLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvYmxpenphcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjgyOTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2JsaXp6YXJkLmMKQEAgLTAsMCArMSwxNTY4IEBACisvKgorICogRXBzb24gQmxpenphcmQgTENEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcnM6ICAgICBKdWhhIFlyam9sYSAgIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgkgICAgICAgIEltcmUgRGVhayAgICAgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKiBZVVYgc3VwcG9ydDogSnVzc2kgTGFha28gICA8anVzc2kubGFha29Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ibGl6emFyZC5oPgorCisjaW5jbHVkZSAiZGlzcGMuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRQkJCQkiYmxpenphcmQiCisKKyNkZWZpbmUgQkxJWlpBUkRfUkVWX0NPREUJCQkweDAwCisjZGVmaW5lIEJMSVpaQVJEX0NPTkZJRwkJCQkweDAyCisjZGVmaW5lIEJMSVpaQVJEX1BMTF9ESVYJCQkweDA0CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9MT0NLX1JBTkdFCQkJMHgwNgorI2RlZmluZSBCTElaWkFSRF9QTExfQ0xPQ0tfU1lOVEhfMAkJMHgwOAorI2RlZmluZSBCTElaWkFSRF9QTExfQ0xPQ0tfU1lOVEhfMQkJMHgwYQorI2RlZmluZSBCTElaWkFSRF9QTExfTU9ERQkJCTB4MGMKKyNkZWZpbmUgQkxJWlpBUkRfQ0xLX1NSQwkJCTB4MGUKKyNkZWZpbmUgQkxJWlpBUkRfTUVNX0JBTkswX0FDVElWQVRFCQkweDEwCisjZGVmaW5lIEJMSVpaQVJEX01FTV9CQU5LMF9TVEFUVVMJCTB4MTQKKyNkZWZpbmUgQkxJWlpBUkRfSERJU1AJCQkJMHgyYQorI2RlZmluZSBCTElaWkFSRF9ITkRQCQkJCTB4MmMKKyNkZWZpbmUgQkxJWlpBUkRfVkRJU1AwCQkJCTB4MmUKKyNkZWZpbmUgQkxJWlpBUkRfVkRJU1AxCQkJCTB4MzAKKyNkZWZpbmUgQkxJWlpBUkRfVk5EUAkJCQkweDMyCisjZGVmaW5lIEJMSVpaQVJEX0hTVwkJCQkweDM0CisjZGVmaW5lIEJMSVpaQVJEX1ZTVwkJCQkweDM4CisjZGVmaW5lIEJMSVpaQVJEX0RJU1BMQVlfTU9ERQkJCTB4NjgKKyNkZWZpbmUgQkxJWlpBUkRfSU5QVVRfV0lOX1hfU1RBUlRfMAkJMHg2YworI2RlZmluZSBCTElaWkFSRF9EQVRBX1NPVVJDRV9TRUxFQ1QJCTB4OGUKKyNkZWZpbmUgQkxJWlpBUkRfRElTUF9NRU1fREFUQV9QT1JUCQkweDkwCisjZGVmaW5lIEJMSVpaQVJEX0RJU1BfTUVNX1JFQURfQUREUjAJCTB4OTIKKyNkZWZpbmUgQkxJWlpBUkRfUE9XRVJfU0FWRQkJCTB4RTYKKyNkZWZpbmUgQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMJCTB4RTgKKworLyogRGF0YSBzb3VyY2Ugc2VsZWN0ICovCisvKiBGb3IgUzFEMTM3NDUgKi8KKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX0xDRF9CQUNLR1JPVU5ECTB4MDAKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX0xDRF9ERVNUUlVDVElWRQkweDAxCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9PVkVSTEFZX0VOQUJMRQkweDA0CisjZGVmaW5lIEJMSVpaQVJEX1NSQ19ESVNBQkxFX09WRVJMQVkJCTB4MDUKKy8qIEZvciBTMUQxMzc0NCAqLworI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENECQkJMHgwMAorI2RlZmluZSBCTElaWkFSRF9TUkNfQkxUX0xDRAkJCTB4MDYKKworI2RlZmluZSBCTElaWkFSRF9DT0xPUl9SR0I1NjUJCQkweDAxCisjZGVmaW5lIEJMSVpaQVJEX0NPTE9SX1lVVjQyMAkJCTB4MDkKKworI2RlZmluZSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ1CQkweDAxCS8qIEhhaWxzdG9ybSAqLworI2RlZmluZSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ0CQkweDAyCS8qIEJsaXp6YXJkICovCisKKyNkZWZpbmUgQkxJWlpBUkRfQVVUT19VUERBVEVfVElNRQkJKEhaIC8gMjApCisKKy8qIFJlc2VydmUgNCByZXF1ZXN0IHNsb3RzIGZvciByZXF1ZXN0cyBpbiBpcnEgY29udGV4dCAqLworI2RlZmluZSBSRVFfUE9PTF9TSVpFCQkJMjQKKyNkZWZpbmUgSVJRX1JFUV9QT09MX1NJWkUJCTQKKworI2RlZmluZSBSRVFfRlJPTV9JUlFfUE9PTCAweDAxCisKKyNkZWZpbmUgUkVRX0NPTVBMRVRFCTAKKyNkZWZpbmUgUkVRX1BFTkRJTkcJMQorCitzdHJ1Y3QgYmxpenphcmRfcmVnX2xpc3QgeworCWludAlzdGFydDsKKwlpbnQJZW5kOworfTsKKworLyogVGhlc2UgbmVlZCB0byBiZSBzYXZlZCAvIHJlc3RvcmVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgcmVzdC4gKi8KK3N0YXRpYyBzdHJ1Y3QgYmxpenphcmRfcmVnX2xpc3QgYmxpenphcmRfcGxsX3JlZ3NbXSA9IHsKKwl7CisJCS5zdGFydAk9IDB4MDQsCQkvKiBEb24ndCBzYXZlIFBMTCBjdHJsICgweDBDKSAqLworCQkuZW5kCT0gMHgwYSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gMHgwZSwJCS8qIENsb2NrIGNvbmZpZ3VyYXRpb24gKi8KKwkJLmVuZAk9IDB4MGUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxpenphcmRfcmVnX2xpc3QgYmxpenphcmRfZ2VuX3JlZ3NbXSA9IHsKKwl7CisJCS5zdGFydAk9IDB4MTgsCQkvKiBTRFJBTSBjb250cm9sICovCisJCS5lbmQJPSAweDIwLAorCX0sCisJeworCQkuc3RhcnQJPSAweDI4LAkJLyogTENEIFBhbmVsIGNvbmZpZ3VyYXRpb24gKi8KKwkJLmVuZAk9IDB4NWEsCQkvKiBIU1NJIGludGVyZmFjZSwgVFYgY29uZmlndXJhdGlvbiAqLworCX0sCit9OworCitzdGF0aWMgdTggYmxpenphcmRfcmVnX2NhY2hlWzB4NWEgLyAyXTsKKworc3RydWN0IHVwZGF0ZV9wYXJhbSB7CisJaW50CXBsYW5lOworCWludAl4LCB5LCB3aWR0aCwgaGVpZ2h0OworCWludAlvdXRfeCwgb3V0X3k7CisJaW50CW91dF93aWR0aCwgb3V0X2hlaWdodDsKKwlpbnQJY29sb3JfbW9kZTsKKwlpbnQJYnBwOworCWludAlmbGFnczsKK307CisKK3N0cnVjdCBibGl6emFyZF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXVuc2lnbmVkIGludAkgZmxhZ3M7CisKKwlpbnQJCSAoKmhhbmRsZXIpKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXEpOworCXZvaWQJCSAoKmNvbXBsZXRlKSh2b2lkICpkYXRhKTsKKwl2b2lkCQkgKmNvbXBsZXRlX2RhdGE7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB1cGRhdGVfcGFyYW0JdXBkYXRlOworCQlzdHJ1Y3QgY29tcGxldGlvbgkqc3luYzsKKwl9IHBhcjsKK307CisKK3N0cnVjdCBwbGFuZV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgcG9zX3gsIHBvc195OworCWludCB3aWR0aCwgaGVpZ2h0OworCWludCBvdXRfd2lkdGgsIG91dF9oZWlnaHQ7CisJaW50IHNjcl93aWR0aDsKKwlpbnQgY29sb3JfbW9kZTsKKwlpbnQgYnBwOworfTsKKworc3RydWN0IGJsaXp6YXJkX3N0cnVjdCB7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGU7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAlhdXRvX3VwZGF0ZV90aW1lcjsKKwlpbnQJCQlzdG9wX2F1dG9fdXBkYXRlOworCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdwlhdXRvX3VwZGF0ZV93aW5kb3c7CisJaW50CQkJZW5hYmxlZF9wbGFuZXM7CisJaW50CQkJdmlkX25vbnN0ZF9jb2xvcjsKKwlpbnQJCQl2aWRfc2NhbGVkOworCWludAkJCWxhc3RfY29sb3JfbW9kZTsKKwlpbnQJCQl6b29tX29uOworCWludAkJCXNjcmVlbl93aWR0aDsKKwlpbnQJCQlzY3JlZW5faGVpZ2h0OworCXVuc2lnbmVkCQl0ZV9jb25uZWN0ZWQ6MTsKKwl1bnNpZ25lZAkJdnN5bmNfb25seToxOworCisJc3RydWN0IHBsYW5lX2luZm8JcGxhbmVbT01BUEZCX1BMQU5FX05VTV07CisKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdAlyZXFfcG9vbFtSRVFfUE9PTF9TSVpFXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBlbmRpbmdfcmVxX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlmcmVlX3JlcV9saXN0OworCXN0cnVjdCBzZW1hcGhvcmUJcmVxX3NlbWE7CisJc3BpbmxvY2tfdAkJcmVxX2xvY2s7CisKKwl1bnNpZ25lZCBsb25nCQlzeXNfY2tfcmF0ZTsKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncwlyZWdfdGltaW5ncywgbHV0X3RpbWluZ3M7CisKKwl1MzIJCQltYXhfdHJhbnNtaXRfc2l6ZTsKKwl1MzIJCQlleHRpZl9jbGtfcGVyaW9kOworCWludAkJCWV4dGlmX2Nsa19kaXY7CisJdW5zaWduZWQgbG9uZwkJcGl4X3R4X3RpbWU7CisJdW5zaWduZWQgbG9uZwkJbGluZV91cGRfdGltZTsKKworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldjsKKwlzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYJKmV4dGlmOworCXN0cnVjdCBsY2RfY3RybAkJKmludF9jdHJsOworCisJdm9pZAkJCSgqcG93ZXJfdXApKHN0cnVjdCBkZXZpY2UgKmRldik7CisJdm9pZAkJCSgqcG93ZXJfZG93bikoc3RydWN0IGRldmljZSAqZGV2KTsKKworCWludAkJCXZlcnNpb247Cit9IGJsaXp6YXJkOworCitzdHJ1Y3QgbGNkX2N0cmwgYmxpenphcmRfY3RybDsKKworc3RhdGljIHU4IGJsaXp6YXJkX3JlYWRfcmVnKHU4IHJlZykKK3sKKwl1OCBkYXRhOworCisJYmxpenphcmQuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSg4KTsKKwlibGl6emFyZC5leHRpZi0+d3JpdGVfY29tbWFuZCgmcmVnLCAxKTsKKwlibGl6emFyZC5leHRpZi0+cmVhZF9kYXRhKCZkYXRhLCAxKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF93cml0ZV9yZWcodTggcmVnLCB1OCB2YWwpCit7CisJYmxpenphcmQuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSg4KTsKKwlibGl6emFyZC5leHRpZi0+d3JpdGVfY29tbWFuZCgmcmVnLCAxKTsKKwlibGl6emFyZC5leHRpZi0+d3JpdGVfZGF0YSgmdmFsLCAxKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfcmVzdGFydF9zZHJhbSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1vOworCisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURSwgMCk7CisJdWRlbGF5KDUwKTsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTUVNX0JBTkswX0FDVElWQVRFLCAxKTsKKwl0bW8gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDApOworCXdoaWxlICghKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX01FTV9CQU5LMF9TVEFUVVMpICYgMHgwMSkpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdG1vKSkgeworCQkJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LAorCQkJCQkiczFkMTM3NHg6IFNEUkFNIG5vdCByZWFkeSIpOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDEpOworCX0KK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfc3RvcF9zZHJhbSh2b2lkKQoreworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUsIDApOworfQorCisvKiBXYWl0IHVudGlsIHRoZSBsYXN0IHdpbmRvdyB3YXMgY29tcGxldGVseSB3cml0dGVuIGludG8gdGhlIGNvbnRyb2xsZXJzCisgKiBTRFJBTSBhbmQgd2UgY2FuIHN0YXJ0IHRyYW5zZmVycmluZyB0aGUgbmV4dCB3aW5kb3cuCisgKi8KK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3dhaXRfbGluZV9idWZmZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDMwKTsKKworCXdoaWxlIChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUykgJiAoMSA8PCA3KSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCQkJInMxZDEzNzR4OiBsaW5lIGJ1ZmZlciBub3QgcmVhZHlcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIFlZQyBjb2xvciBzcGFjZSBjb252ZXJ0ZXIgaXMgaWRsZS4gKi8KK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3dhaXRfeXljKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bW8gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygzMCk7CisKKwl3aGlsZSAoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpICYgKDEgPDwgNCkpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdG1vKSkgeworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJCSJzMWQxMzc0eDogWVlDIG5vdCByZWFkeVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9vdmVybGF5KHZvaWQpCit7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX0RBVEFfU09VUkNFX1NFTEVDVCwKKwkJCQlCTElaWkFSRF9TUkNfRElTQUJMRV9PVkVSTEFZKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3dpbmRvd19yZWdzKGludCB4X3N0YXJ0LCBpbnQgeV9zdGFydCwgaW50IHhfZW5kLCBpbnQgeV9lbmQsCisJCQkgICAgaW50IHhfb3V0X3N0YXJ0LCBpbnQgeV9vdXRfc3RhcnQsCisJCQkgICAgaW50IHhfb3V0X2VuZCwgaW50IHlfb3V0X2VuZCwgaW50IGNvbG9yX21vZGUsCisJCQkgICAgaW50IHpvb21fb2ZmLCBpbnQgZmxhZ3MpCit7CisJdTggdG1wWzE4XTsKKwl1OCBjbWQ7CisKKwl4X2VuZC0tOworCXlfZW5kLS07CisJdG1wWzBdID0geF9zdGFydDsKKwl0bXBbMV0gPSB4X3N0YXJ0ID4+IDg7CisJdG1wWzJdID0geV9zdGFydDsKKwl0bXBbM10gPSB5X3N0YXJ0ID4+IDg7CisJdG1wWzRdID0geF9lbmQ7CisJdG1wWzVdID0geF9lbmQgPj4gODsKKwl0bXBbNl0gPSB5X2VuZDsKKwl0bXBbN10gPSB5X2VuZCA+PiA4OworCisJeF9vdXRfZW5kLS07CisJeV9vdXRfZW5kLS07CisJdG1wWzhdICA9IHhfb3V0X3N0YXJ0OworCXRtcFs5XSAgPSB4X291dF9zdGFydCA+PiA4OworCXRtcFsxMF0gPSB5X291dF9zdGFydDsKKwl0bXBbMTFdID0geV9vdXRfc3RhcnQgPj4gODsKKwl0bXBbMTJdID0geF9vdXRfZW5kOworCXRtcFsxM10gPSB4X291dF9lbmQgPj4gODsKKwl0bXBbMTRdID0geV9vdXRfZW5kOworCXRtcFsxNV0gPSB5X291dF9lbmQgPj4gODsKKworCXRtcFsxNl0gPSBjb2xvcl9tb2RlOworCWlmICh6b29tX29mZiAmJiBibGl6emFyZC52ZXJzaW9uID09IEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDUpCisJCXRtcFsxN10gPSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0JBQ0tHUk9VTkQ7CisJZWxzZSBpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRU5BQkxFX09WRVJMQVkpCisJCXRtcFsxN10gPSBCTElaWkFSRF9TUkNfV1JJVEVfT1ZFUkxBWV9FTkFCTEU7CisJZWxzZQorCQl0bXBbMTddID0gYmxpenphcmQudmVyc2lvbiA9PSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ0ID8KKwkJCQlCTElaWkFSRF9TUkNfV1JJVEVfTENEIDoKKwkJCQlCTElaWkFSRF9TUkNfV1JJVEVfTENEX0RFU1RSVUNUSVZFOworCisJYmxpenphcmQuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSg4KTsKKwljbWQgPSBCTElaWkFSRF9JTlBVVF9XSU5fWF9TVEFSVF8wOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9jb21tYW5kKCZjbWQsIDEpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9kYXRhKHRtcCwgMTgpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfdGVhcnN5bmMoaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNjcmVlbl9oZWlnaHQsCisJCQkgICAgaW50IG91dF9oZWlnaHQsIGludCBmb3JjZV92c3luYykKK3sKKwl1OCBiOworCisJYiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKTsKKwliIHw9IDEgPDwgMzsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMsIGIpOworCisJaWYgKGxpa2VseShibGl6emFyZC52c3luY19vbmx5IHx8IGZvcmNlX3ZzeW5jKSkgeworCQlibGl6emFyZC5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHdpZHRoICogYmxpenphcmQucGl4X3R4X3RpbWUgPCBibGl6emFyZC5saW5lX3VwZF90aW1lKSB7CisJCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHdpZHRoICogYmxpenphcmQucGl4X3R4X3RpbWUgLyAxMDAwKSAqIGhlaWdodCA8CisJICAgICh5ICsgb3V0X2hlaWdodCkgKiAoYmxpenphcmQubGluZV91cGRfdGltZSAvIDEwMDApKSB7CisJCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlibGl6emFyZC5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIHkgKyAxKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV90ZWFyc3luYyh2b2lkKQoreworCXU4IGI7CisKKwlibGl6emFyZC5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDAsIDApOworCWIgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7CisJYiAmPSB+KDEgPDwgMyk7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTLCBiKTsKKwliID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2V4dGlmX3RpbWluZ3MoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICphbGxvY19yZXEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXE7CisJaW50IHJlcV9mbGFncyA9IDA7CisKKwlpZiAoIWluX2ludGVycnVwdCgpKQorCQlkb3duKCZibGl6emFyZC5yZXFfc2VtYSk7CisJZWxzZQorCQlyZXFfZmxhZ3MgPSBSRVFfRlJPTV9JUlFfUE9PTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCUJVR19PTihsaXN0X2VtcHR5KCZibGl6emFyZC5mcmVlX3JlcV9saXN0KSk7CisJcmVxID0gbGlzdF9lbnRyeShibGl6emFyZC5mcmVlX3JlcV9saXN0Lm5leHQsCisJCQkgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QsIGVudHJ5KTsKKwlsaXN0X2RlbCgmcmVxLT5lbnRyeSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKworCUlOSVRfTElTVF9IRUFEKCZyZXEtPmVudHJ5KTsKKwlyZXEtPmZsYWdzID0gcmVxX2ZsYWdzOworCisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcmVxKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCisJbGlzdF9kZWwoJnJlcS0+ZW50cnkpOworCWxpc3RfYWRkKCZyZXEtPmVudHJ5LCAmYmxpenphcmQuZnJlZV9yZXFfbGlzdCk7CisJaWYgKCEocmVxLT5mbGFncyAmIFJFUV9GUk9NX0lSUV9QT09MKSkKKwkJdXAoJmJsaXp6YXJkLnJlcV9zZW1hKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcGVuZGluZ19yZXF1ZXN0cyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmYmxpenphcmQucGVuZGluZ19yZXFfbGlzdCkpIHsKKwkJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcTsKKwkJdm9pZCAoKmNvbXBsZXRlKSh2b2lkICopOworCQl2b2lkICpjb21wbGV0ZV9kYXRhOworCisJCXJlcSA9IGxpc3RfZW50cnkoYmxpenphcmQucGVuZGluZ19yZXFfbGlzdC5uZXh0LAorCQkJCSBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCwgZW50cnkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCisJCWlmIChyZXEtPmhhbmRsZXIocmVxKSA9PSBSRVFfUEVORElORykKKwkJCXJldHVybjsKKworCQljb21wbGV0ZSA9IHJlcS0+Y29tcGxldGU7CisJCWNvbXBsZXRlX2RhdGEgPSByZXEtPmNvbXBsZXRlX2RhdGE7CisJCWZyZWVfcmVxKHJlcSk7CisKKwkJaWYgKGNvbXBsZXRlKQorCQkJY29tcGxldGUoY29tcGxldGVfZGF0YSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc3VibWl0X3JlcV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcHJvY2VzcyA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0KSkpCisJCXByb2Nlc3MgPSAwOworCWxpc3Rfc3BsaWNlX2luaXQoaGVhZCwgYmxpenphcmQucGVuZGluZ19yZXFfbGlzdC5wcmV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCisJaWYgKHByb2Nlc3MpCisJCXByb2Nlc3NfcGVuZGluZ19yZXF1ZXN0cygpOworfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QJKnJlcSA9IChzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqKWRhdGE7CisJdm9pZAkJCSgqY29tcGxldGUpKHZvaWQgKik7CisJdm9pZAkJCSpjb21wbGV0ZV9kYXRhOworCisJY29tcGxldGUgPSByZXEtPmNvbXBsZXRlOworCWNvbXBsZXRlX2RhdGEgPSByZXEtPmNvbXBsZXRlX2RhdGE7CisKKwlmcmVlX3JlcShyZXEpOworCisJaWYgKGNvbXBsZXRlKQorCQljb21wbGV0ZShjb21wbGV0ZV9kYXRhKTsKKworCXByb2Nlc3NfcGVuZGluZ19yZXF1ZXN0cygpOworfQorCisKK3N0YXRpYyBpbnQgZG9fZnVsbF9zY3JlZW5fdXBkYXRlKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IGk7CisJaW50IGZsYWdzOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlzdHJ1Y3QgcGxhbmVfaW5mbyAqcCA9ICZibGl6emFyZC5wbGFuZVtpXTsKKwkJaWYgKCEoYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJiAoMSA8PCBpKSkpIHsKKwkJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJwdyAlZCBwaCAlZFxuIiwKKwkJCXAtPndpZHRoLCBwLT5oZWlnaHQpOworCQlibGl6emFyZC5pbnRfY3RybC0+c2V0dXBfcGxhbmUoaSwKKwkJCQlPTUFQRkJfQ0hBTk5FTF9PVVRfTENELCBwLT5vZmZzZXQsCisJCQkJcC0+c2NyX3dpZHRoLCBwLT5wb3NfeCwgcC0+cG9zX3ksCisJCQkJcC0+d2lkdGgsIHAtPmhlaWdodCwKKwkJCQlwLT5jb2xvcl9tb2RlKTsKKwkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAxKTsKKwl9CisKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJzdyAlZCBzaCAlZFxuIiwKKwkJYmxpenphcmQuc2NyZWVuX3dpZHRoLCBibGl6emFyZC5zY3JlZW5faGVpZ2h0KTsKKwlibGl6emFyZF93YWl0X2xpbmVfYnVmZmVyKCk7CisJZmxhZ3MgPSByZXEtPnBhci51cGRhdGUuZmxhZ3M7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DKQorCQllbmFibGVfdGVhcnN5bmMoMCwgYmxpenphcmQuc2NyZWVuX3dpZHRoLAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQlibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCWZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0ZPUkNFX1ZTWU5DKTsKKwllbHNlCisJCWRpc2FibGVfdGVhcnN5bmMoKTsKKworCXNldF93aW5kb3dfcmVncygwLCAwLCBibGl6emFyZC5zY3JlZW5fd2lkdGgsIGJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkwLCAwLCBibGl6emFyZC5zY3JlZW5fd2lkdGgsIGJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQlCTElaWkFSRF9DT0xPUl9SR0I1NjUsIGJsaXp6YXJkLnpvb21fb24sIGZsYWdzKTsKKwlibGl6emFyZC56b29tX29uID0gMDsKKworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoMTYpOworCS8qIHNldF93aW5kb3dfcmVncyBoYXMgbGVmdCB0aGUgcmVnaXN0ZXIgaW5kZXggYXQgdGhlIHJpZ2h0CisJICogcGxhY2UsIHNvIG5vIG5lZWQgdG8gc2V0IGl0IGhlcmUuCisJICovCisJYmxpenphcmQuZXh0aWYtPnRyYW5zZmVyX2FyZWEoYmxpenphcmQuc2NyZWVuX3dpZHRoLAorCQkJCSAgICAgIGJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJICAgICAgcmVxdWVzdF9jb21wbGV0ZSwgcmVxKTsKKwlyZXR1cm4gUkVRX1BFTkRJTkc7Cit9CisKKy8qIFNldHVwIGFsbCBwbGFuZXMgd2l0aCBhbiBvdmVybGFwcGluZyBhcmVhIHdpdGggdGhlIHVwZGF0ZSB3aW5kb3cuICovCitzdGF0aWMgaW50IGRvX3BhcnRpYWxfdXBkYXRlKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXEsIGludCBwbGFuZSwKKwkJCSAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisJCQkgICAgIGludCB4X291dCwgaW50IHlfb3V0LCBpbnQgd19vdXQsIGludCBoX291dCwKKwkJCSAgICAgaW50IHduZF9jb2xvcl9tb2RlLCBpbnQgYnBwKQoreworCWludCBpOworCWludCBneDEsIGd5MSwgZ3gyLCBneTI7CisJaW50IGd4MV9vdXQsIGd5MV9vdXQsIGd4Ml9vdXQsIGd5Ml9vdXQ7CisJaW50IGNvbG9yX21vZGU7CisJaW50IGZsYWdzOworCWludCB6b29tX29mZjsKKworCS8qIEdsb2JhbCBjb29yZGluYXRlcywgcmVsYXRpdmUgdG8gcGl4ZWwgMCwwIG9mIHRoZSBMQ0QgKi8KKwlneDEgPSB4ICsgYmxpenphcmQucGxhbmVbcGxhbmVdLnBvc194OworCWd5MSA9IHkgKyBibGl6emFyZC5wbGFuZVtwbGFuZV0ucG9zX3k7CisJZ3gyID0gZ3gxICsgdzsKKwlneTIgPSBneTEgKyBoOworCisJZmxhZ3MgPSByZXEtPnBhci51cGRhdGUuZmxhZ3M7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0RPVUJMRSkgeworCQlneDFfb3V0ID0gZ3gxOworCQlneTFfb3V0ID0gZ3kxOworCQlneDJfb3V0ID0gZ3gxICsgdyAqIDI7CisJCWd5Ml9vdXQgPSBneTEgKyBoICogMjsKKwl9IGVsc2UgeworCQlneDFfb3V0ID0geF9vdXQgKyBibGl6emFyZC5wbGFuZVtwbGFuZV0ucG9zX3g7CisJCWd5MV9vdXQgPSB5X291dCArIGJsaXp6YXJkLnBsYW5lW3BsYW5lXS5wb3NfeTsKKwkJZ3gyX291dCA9IGd4MV9vdXQgKyB3X291dDsKKwkJZ3kyX291dCA9IGd5MV9vdXQgKyBoX291dDsKKwl9CisJem9vbV9vZmYgPSBibGl6emFyZC56b29tX29uICYmIGd4MSA9PSAwICYmIGd5MSA9PSAwICYmCisJCXcgPT0gYmxpenphcmQuc2NyZWVuX3dpZHRoICYmIGggPT0gYmxpenphcmQuc2NyZWVuX2hlaWdodDsKKwlibGl6emFyZC56b29tX29uID0gKCF6b29tX29mZiAmJiBibGl6emFyZC56b29tX29uKSB8fAorCQkJICAgKHcgPCB3X291dCB8fCBoIDwgaF9vdXQpOworCisJZm9yIChpID0gMDsgaSA8IE9NQVBGQl9QTEFORV9OVU07IGkrKykgeworCQlzdHJ1Y3QgcGxhbmVfaW5mbyAqcCA9ICZibGl6emFyZC5wbGFuZVtpXTsKKwkJaW50IHB4MSwgcHkxOworCQlpbnQgcHgyLCBweTI7CisJCWludCBwdywgcGg7CisJCWludCBwcG9zeCwgcHBvc3k7CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJCWlmICghKGJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzICYgKDEgPDwgaSkpICB8fAorCQkgICAgKHduZF9jb2xvcl9tb2RlICYmIGkgIT0gcGxhbmUpKSB7CisJCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDApOworCQkJY29udGludWU7CisJCX0KKwkJLyogUGxhbmUgY29vcmRpbmF0ZXMgKi8KKwkJaWYgKGkgPT0gcGxhbmUpIHsKKwkJCS8qIFBsYW5lIGluIHdoaWNoIHdlIGFyZSBkb2luZyB0aGUgdXBkYXRlLgorCQkJICogTG9jYWwgY29vcmRpbmF0ZXMgYXJlIHRoZSBvbmUgaW4gdGhlIHVwZGF0ZQorCQkJICogcmVxdWVzdC4KKwkJCSAqLworCQkJcHgxID0geDsKKwkJCXB5MSA9IHk7CisJCQlweDIgPSB4ICsgdzsKKwkJCXB5MiA9IHkgKyBoOworCQkJcHBvc3ggPSAwOworCQkJcHBvc3kgPSAwOworCQl9IGVsc2UgeworCQkJLyogQ2hlY2sgaWYgdGhpcyBwbGFuZSBoYXMgYW4gb3ZlcmxhcHBpbmcgcGFydCAqLworCQkJcHgxID0gZ3gxIC0gcC0+cG9zX3g7CisJCQlweTEgPSBneTEgLSBwLT5wb3NfeTsKKwkJCXB4MiA9IGd4MiAtIHAtPnBvc194OworCQkJcHkyID0gZ3kyIC0gcC0+cG9zX3k7CisJCQlpZiAocHgxID49IHAtPndpZHRoIHx8IHB5MSA+PSBwLT5oZWlnaHQgfHwKKwkJCSAgICBweDIgPD0gMCB8fCBweTIgPD0gMCkgeworCQkJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBDYWxjdWxhdGUgdGhlIGNvb3JkaW5hdGVzIGZvciB0aGUgb3ZlcmxhcHBpbmcKKwkJCSAqIHBhcnQgaW4gdGhlIHBsYW5lJ3MgbG9jYWwgY29vcmRpbmF0ZXMuCisJCQkgKi8KKwkJCXBwb3N4ID0gLXB4MTsKKwkJCXBwb3N5ID0gLXB5MTsKKwkJCWlmIChweDEgPCAwKQorCQkJCXB4MSA9IDA7CisJCQlpZiAocHkxIDwgMCkKKwkJCQlweTEgPSAwOworCQkJaWYgKHB4MiA+IHAtPndpZHRoKQorCQkJCXB4MiA9IHAtPndpZHRoOworCQkJaWYgKHB5MiA+IHAtPmhlaWdodCkKKwkJCQlweTIgPSBwLT5oZWlnaHQ7CisJCQlpZiAocHBvc3ggPCAwKQorCQkJCXBwb3N4ID0gMDsKKwkJCWlmIChwcG9zeSA8IDApCisJCQkJcHBvc3kgPSAwOworCQl9CisJCXB3ID0gcHgyIC0gcHgxOworCQlwaCA9IHB5MiAtIHB5MTsKKwkJb2Zmc2V0ID0gcC0+b2Zmc2V0ICsgKHAtPnNjcl93aWR0aCAqIHB5MSArIHB4MSkgKiBwLT5icHAgLyA4OworCQlpZiAod25kX2NvbG9yX21vZGUpCisJCQkvKiBXaW5kb3cgZW1iZWRkZWQgaW4gdGhlIHBsYW5lIHdpdGggYSBkaWZmZXJpbmcKKwkJCSAqIGNvbG9yIG1vZGUgLyBicHAuIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIERNQQorCQkJICogdHJhbnNmZXIgZWxlbWVudHMgaW4gdGVybXMgb2YgdGhlIHBsYW5lJ3MgYnBwLgorCQkJICovCisJCQlwdyA9IChwdyArIDEpICogYnBwIC8gcC0+YnBwOworI2lmZGVmIFZFUkJPU0UKKwkJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkJInBsYW5lICVkIG9mZnNldCAlIzA4bHggcHBvc3ggJWQgcHBvc3kgJWQgIgorCQkJInB4MSAlZCBweTEgJWQgcHcgJWQgcGggJWRcbiIsCisJCQlpLCBvZmZzZXQsIHBwb3N4LCBwcG9zeSwgcHgxLCBweTEsIHB3LCBwaCk7CisjZW5kaWYKKwkJYmxpenphcmQuaW50X2N0cmwtPnNldHVwX3BsYW5lKGksCisJCQkJT01BUEZCX0NIQU5ORUxfT1VUX0xDRCwgb2Zmc2V0LAorCQkJCXAtPnNjcl93aWR0aCwKKwkJCQlwcG9zeCwgcHBvc3ksIHB3LCBwaCwKKwkJCQlwLT5jb2xvcl9tb2RlKTsKKworCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDEpOworCX0KKworCXN3aXRjaCAod25kX2NvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCWNvbG9yX21vZGUgPSBCTElaWkFSRF9DT0xPUl9ZVVY0MjA7CisJCS8qIEN1cnJlbnRseSBvbmx5IHRoZSAxNiBiaXRzL3BpeGVsIGN5Y2xlIGZvcm1hdCBpcworCQkgKiBzdXBwb3J0ZWQgb24gdGhlIGV4dGVybmFsIGludGVyZmFjZS4gQWRqdXN0IHRoZSBudW1iZXIKKwkJICogb2YgdHJhbnNmZXIgZWxlbWVudHMgcGVyIGxpbmUgZm9yIDEyYnBwIGZvcm1hdC4KKwkJICovCisJCXcgPSAodyArIDEpICogMyAvIDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvbG9yX21vZGUgPSBCTElaWkFSRF9DT0xPUl9SR0I1NjU7CisJCWJyZWFrOworCX0KKworCWJsaXp6YXJkX3dhaXRfbGluZV9idWZmZXIoKTsKKwlpZiAoYmxpenphcmQubGFzdF9jb2xvcl9tb2RlID09IEJMSVpaQVJEX0NPTE9SX1lVVjQyMCkKKwkJYmxpenphcmRfd2FpdF95eWMoKTsKKwlibGl6emFyZC5sYXN0X2NvbG9yX21vZGUgPSBjb2xvcl9tb2RlOworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQykKKwkJZW5hYmxlX3RlYXJzeW5jKGd5MSwgdywgaCwKKwkJCQlibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCWhfb3V0LAorCQkJCWZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0ZPUkNFX1ZTWU5DKTsKKwllbHNlCisJCWRpc2FibGVfdGVhcnN5bmMoKTsKKworCXNldF93aW5kb3dfcmVncyhneDEsIGd5MSwgZ3gyLCBneTIsIGd4MV9vdXQsIGd5MV9vdXQsIGd4Ml9vdXQsIGd5Ml9vdXQsCisJCQljb2xvcl9tb2RlLCB6b29tX29mZiwgZmxhZ3MpOworCisJYmxpenphcmQuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSgxNik7CisJLyogc2V0X3dpbmRvd19yZWdzIGhhcyBsZWZ0IHRoZSByZWdpc3RlciBpbmRleCBhdCB0aGUgcmlnaHQKKwkgKiBwbGFjZSwgc28gbm8gbmVlZCB0byBzZXQgaXQgaGVyZS4KKwkgKi8KKwlibGl6emFyZC5leHRpZi0+dHJhbnNmZXJfYXJlYSh3LCBoLCByZXF1ZXN0X2NvbXBsZXRlLCByZXEpOworCisJcmV0dXJuIFJFUV9QRU5ESU5HOworfQorCitzdGF0aWMgaW50IHNlbmRfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCB1cGRhdGVfcGFyYW0gKnBhciA9ICZyZXEtPnBhci51cGRhdGU7CisJaW50IHBsYW5lID0gcGFyLT5wbGFuZTsKKworI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJzZW5kX2ZyYW1lOiB4ICVkIHkgJWQgdyAlZCBoICVkICIKKwkJInhfb3V0ICVkIHlfb3V0ICVkIHdfb3V0ICVkIGhfb3V0ICVkICIKKwkJImNvbG9yX21vZGUgJTA0eCBmbGFncyAlMDR4IHBsYW5lcyAlMDF4XG4iLAorCQlwYXItPngsIHBhci0+eSwgcGFyLT53aWR0aCwgcGFyLT5oZWlnaHQsCisJCXBhci0+b3V0X3gsIHBhci0+b3V0X3ksIHBhci0+b3V0X3dpZHRoLCBwYXItPm91dF9oZWlnaHQsCisJCXBhci0+Y29sb3JfbW9kZSwgcGFyLT5mbGFncywgYmxpenphcmQuZW5hYmxlZF9wbGFuZXMpOworI2VuZGlmCisJaWYgKHBhci0+ZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRElTQUJMRV9PVkVSTEFZKQorCQlkaXNhYmxlX292ZXJsYXkoKTsKKworCWlmICgoYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJiBibGl6emFyZC52aWRfbm9uc3RkX2NvbG9yKSB8fAorCSAgICAgKGJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzICYgYmxpenphcmQudmlkX3NjYWxlZCkpCisJCXJldHVybiBkb19mdWxsX3NjcmVlbl91cGRhdGUocmVxKTsKKworCXJldHVybiBkb19wYXJ0aWFsX3VwZGF0ZShyZXEsIHBsYW5lLCBwYXItPngsIHBhci0+eSwKKwkJCQkgcGFyLT53aWR0aCwgcGFyLT5oZWlnaHQsCisJCQkJIHBhci0+b3V0X3gsIHBhci0+b3V0X3ksCisJCQkJIHBhci0+b3V0X3dpZHRoLCBwYXItPm91dF9oZWlnaHQsCisJCQkJIHBhci0+Y29sb3JfbW9kZSwgcGFyLT5icHApOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2ZyYW1lX2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7Cit9CisKKyNkZWZpbmUgQUREX1BSRVEoX3gsIF95LCBfdywgX2gsIF94X291dCwgX3lfb3V0LCBfd19vdXQsIF9oX291dCkgZG8gewlcCisJcmVxID0gYWxsb2NfcmVxKCk7CQkJXAorCXJlcS0+aGFuZGxlcgk9IHNlbmRfZnJhbWVfaGFuZGxlcjsJXAorCXJlcS0+Y29tcGxldGUJPSBzZW5kX2ZyYW1lX2NvbXBsZXRlOwlcCisJcmVxLT5wYXIudXBkYXRlLnBsYW5lID0gcGxhbmVfaWR4OwlcCisJcmVxLT5wYXIudXBkYXRlLnggPSBfeDsJCQlcCisJcmVxLT5wYXIudXBkYXRlLnkgPSBfeTsJCQlcCisJcmVxLT5wYXIudXBkYXRlLndpZHRoICA9IF93OwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5oZWlnaHQgPSBfaDsJCVwKKwlyZXEtPnBhci51cGRhdGUub3V0X3ggPSBfeF9vdXQ7CQlcCisJcmVxLT5wYXIudXBkYXRlLm91dF95ID0gX3lfb3V0OwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRfd2lkdGggPSBfd19vdXQ7CVwKKwlyZXEtPnBhci51cGRhdGUub3V0X2hlaWdodCA9IF9oX291dDsJXAorCXJlcS0+cGFyLnVwZGF0ZS5icHAgPSBicHA7CQlcCisJcmVxLT5wYXIudXBkYXRlLmNvbG9yX21vZGUgPSBjb2xvcl9tb2RlO1wKKwlyZXEtPnBhci51cGRhdGUuZmxhZ3MJICA9IGZsYWdzOwlcCisJbGlzdF9hZGRfdGFpbCgmcmVxLT5lbnRyeSwgcmVxX2hlYWQpOwlcCit9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9yZXFfbGlzdChpbnQgcGxhbmVfaWR4LAorCQkJICAgIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKnJlcV9oZWFkKQoreworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXE7CisJaW50IHggPSB3aW4tPng7CisJaW50IHkgPSB3aW4tPnk7CisJaW50IHdpZHRoID0gd2luLT53aWR0aDsKKwlpbnQgaGVpZ2h0ID0gd2luLT5oZWlnaHQ7CisJaW50IHhfb3V0ID0gd2luLT5vdXRfeDsKKwlpbnQgeV9vdXQgPSB3aW4tPm91dF95OworCWludCB3aWR0aF9vdXQgPSB3aW4tPm91dF93aWR0aDsKKwlpbnQgaGVpZ2h0X291dCA9IHdpbi0+b3V0X2hlaWdodDsKKwlpbnQgY29sb3JfbW9kZTsKKwlpbnQgYnBwOworCWludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgeXN0YXJ0ID0geTsKKwl1bnNpZ25lZCBpbnQgeXNwYW4gPSBoZWlnaHQ7CisJdW5zaWduZWQgaW50IHlzdGFydF9vdXQgPSB5X291dDsKKwl1bnNpZ25lZCBpbnQgeXNwYW5fb3V0ID0gaGVpZ2h0X291dDsKKworCWZsYWdzID0gd2luLT5mb3JtYXQgJiB+T01BUEZCX0ZPUk1BVF9NQVNLOworCWNvbG9yX21vZGUgPSB3aW4tPmZvcm1hdCAmIE9NQVBGQl9GT1JNQVRfTUFTSzsKKwlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCS8qIEVtYmVkZGVkIHdpbmRvdyB3aXRoIGRpZmZlcmVudCBjb2xvciBtb2RlICovCisJCWJwcCA9IDEyOworCQkvKiBYLCBZLCBoZWlnaHQgbXVzdCBiZSBhbGlnbmVkIGF0IDIsIHdpZHRoIGF0IDQgcGl4ZWxzICovCisJCXggJj0gfjE7CisJCXkgJj0gfjE7CisJCWhlaWdodCA9IHlzcGFuID0gaGVpZ2h0ICYgfjE7CisJCXdpZHRoID0gd2lkdGggJiB+MzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogU2FtZSBhcyB0aGUgcGxhbmUgY29sb3IgbW9kZSAqLworCQlicHAgPSBibGl6emFyZC5wbGFuZVtwbGFuZV9pZHhdLmJwcDsKKwkJYnJlYWs7CisJfQorCWlmICh3aWR0aCAqIGhlaWdodCAqIGJwcCAvIDggPiBibGl6emFyZC5tYXhfdHJhbnNtaXRfc2l6ZSkgeworCQl5c3BhbiA9IGJsaXp6YXJkLm1heF90cmFuc21pdF9zaXplIC8gKHdpZHRoICogYnBwIC8gOCk7CisJCXlzcGFuX291dCA9IHlzcGFuICogaGVpZ2h0X291dCAvIGhlaWdodDsKKwkJQUREX1BSRVEoeCwgeXN0YXJ0LCB3aWR0aCwgeXNwYW4sIHhfb3V0LCB5c3RhcnRfb3V0LAorCQkJIHdpZHRoX291dCwgeXNwYW5fb3V0KTsKKwkJeXN0YXJ0ICs9IHlzcGFuOworCQl5c3RhcnRfb3V0ICs9IHlzcGFuX291dDsKKwkJeXNwYW4gPSBoZWlnaHQgLSB5c3BhbjsKKwkJeXNwYW5fb3V0ID0gaGVpZ2h0X291dCAtIHlzcGFuX291dDsKKwkJZmxhZ3MgJj0gfk9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQzsKKwl9CisKKwlBRERfUFJFUSh4LCB5c3RhcnQsIHdpZHRoLCB5c3BhbiwgeF9vdXQsIHlzdGFydF9vdXQsCisJCSB3aWR0aF9vdXQsIHlzcGFuX291dCk7Cit9CisKK3N0YXRpYyB2b2lkIGF1dG9fdXBkYXRlX2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJaWYgKCFibGl6emFyZC5zdG9wX2F1dG9fdXBkYXRlKQorCQltb2RfdGltZXIoJmJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyLAorCQkJICBqaWZmaWVzICsgQkxJWlpBUkRfQVVUT19VUERBVEVfVElNRSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXV0byh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpsYXN0OworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZTsKKworCXBsYW5lID0gYmxpenphcmQuZmJkZXYtPmZiX2luZm9bMF0tPnBhcjsKKwljcmVhdGVfcmVxX2xpc3QocGxhbmUtPmlkeCwKKwkJCSZibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3csICZyZXFfbGlzdCk7CisJbGFzdCA9IGxpc3RfZW50cnkocmVxX2xpc3QucHJldiwgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QsIGVudHJ5KTsKKworCWxhc3QtPmNvbXBsZXRlID0gYXV0b191cGRhdGVfY29tcGxldGU7CisJbGFzdC0+Y29tcGxldGVfZGF0YSA9IE5VTEw7CisKKwlzdWJtaXRfcmVxX2xpc3QoJnJlcV9saXN0KTsKK30KKworaW50IGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5bmMoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQkgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkJIHZvaWQgKCpjb21wbGV0ZV9jYWxsYmFjaykodm9pZCAqYXJnKSwKKwkJCQkgdm9pZCAqY29tcGxldGVfY2FsbGJhY2tfZGF0YSkKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpsYXN0OworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCisJaWYgKHVubGlrZWx5KGJsaXp6YXJkLnVwZGF0ZV9tb2RlICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KCFibGl6emFyZC50ZV9jb25uZWN0ZWQgJiYKKwkJICAgICAod2luLT5mb3JtYXQgJiBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcmVhdGVfcmVxX2xpc3QocGxhbmUtPmlkeCwgd2luLCAmcmVxX2xpc3QpOworCWxhc3QgPSBsaXN0X2VudHJ5KHJlcV9saXN0LnByZXYsIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0LCBlbnRyeSk7CisKKwlsYXN0LT5jb21wbGV0ZSA9IGNvbXBsZXRlX2NhbGxiYWNrOworCWxhc3QtPmNvbXBsZXRlX2RhdGEgPSAodm9pZCAqKWNvbXBsZXRlX2NhbGxiYWNrX2RhdGE7CisKKwlzdWJtaXRfcmVxX2xpc3QoJnJlcV9saXN0KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChibGl6emFyZF91cGRhdGVfd2luZG93X2FzeW5jKTsKKworc3RhdGljIGludCB1cGRhdGVfZnVsbF9zY3JlZW4odm9pZCkKK3sKKwlyZXR1cm4gYmxpenphcmRfdXBkYXRlX3dpbmRvd19hc3luYyhibGl6emFyZC5mYmRldi0+ZmJfaW5mb1swXSwKKwkJCQkgICAgICZibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3csIE5VTEwsIE5VTEwpOworCit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJICBpbnQgY29sb3JfbW9kZSkKK3sKKwlzdHJ1Y3QgcGxhbmVfaW5mbyAqcDsKKworI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSAgICAicGxhbmUgJWQgY2hfb3V0ICVkIG9mZnNldCAlIzA4bHggc2NyX3dpZHRoICVkICIKKwkJICAgICJwb3NfeCAlZCBwb3NfeSAlZCB3aWR0aCAlZCBoZWlnaHQgJWQgY29sb3JfbW9kZSAlZFxuIiwKKwkJICAgIHBsYW5lLCBjaGFubmVsX291dCwgb2Zmc2V0LCBzY3JlZW5fd2lkdGgsCisJCSAgICBwb3NfeCwgcG9zX3ksIHdpZHRoLCBoZWlnaHQsIGNvbG9yX21vZGUpOworI2VuZGlmCisJaWYgKCh1bnNpZ25lZClwbGFuZSA+IE9NQVBGQl9QTEFORV9OVU0pCisJCXJldHVybiAtRUlOVkFMOworCXAgPSAmYmxpenphcmQucGxhbmVbcGxhbmVdOworCisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCWNhc2UgT01BUEZCX0NPTE9SX1lVWTQyMjoKKwkJcC0+YnBwID0gMTY7CisJCWJsaXp6YXJkLnZpZF9ub25zdGRfY29sb3IgJj0gfigxIDw8IHBsYW5lKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQlwLT5icHAgPSAxMjsKKwkJYmxpenphcmQudmlkX25vbnN0ZF9jb2xvciB8PSAxIDw8IHBsYW5lOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I1NjU6CisJCXAtPmJwcCA9IDE2OworCQlibGl6emFyZC52aWRfbm9uc3RkX2NvbG9yICY9IH4oMSA8PCBwbGFuZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXAtPm9mZnNldCA9IG9mZnNldDsKKwlwLT5wb3NfeCA9IHBvc194OworCXAtPnBvc195ID0gcG9zX3k7CisJcC0+d2lkdGggPSB3aWR0aDsKKwlwLT5oZWlnaHQgPSBoZWlnaHQ7CisJcC0+c2NyX3dpZHRoID0gc2NyZWVuX3dpZHRoOworCWlmICghcC0+b3V0X3dpZHRoKQorCQlwLT5vdXRfd2lkdGggPSB3aWR0aDsKKwlpZiAoIXAtPm91dF9oZWlnaHQpCisJCXAtPm91dF9oZWlnaHQgPSBoZWlnaHQ7CisKKwlwLT5jb2xvcl9tb2RlID0gY29sb3JfbW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX3NldF9zY2FsZShpbnQgcGxhbmUsIGludCBvcmlnX3csIGludCBvcmlnX2gsCisJCQkgICAgICBpbnQgb3V0X3csIGludCBvdXRfaCkKK3sKKwlzdHJ1Y3QgcGxhbmVfaW5mbyAqcCA9ICZibGl6emFyZC5wbGFuZVtwbGFuZV07CisJaW50IHI7CisKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJwbGFuZSAlZCBvcmlnX3cgJWQgb3JpZ19oICVkIG91dF93ICVkIG91dF9oICVkXG4iLAorCQlwbGFuZSwgb3JpZ193LCBvcmlnX2gsIG91dF93LCBvdXRfaCk7CisJaWYgKCh1bnNpZ25lZClwbGFuZSA+IE9NQVBGQl9QTEFORV9OVU0pCisJCXJldHVybiAtRU5PREVWOworCisJciA9IGJsaXp6YXJkLmludF9jdHJsLT5zZXRfc2NhbGUocGxhbmUsIG9yaWdfdywgb3JpZ19oLCBvdXRfdywgb3V0X2gpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlwLT53aWR0aCA9IG9yaWdfdzsKKwlwLT5oZWlnaHQgPSBvcmlnX2g7CisJcC0+b3V0X3dpZHRoID0gb3V0X3c7CisJcC0+b3V0X2hlaWdodCA9IG91dF9oOworCWlmIChvcmlnX3cgPT0gb3V0X3cgJiYgb3JpZ19oID09IG91dF9oKQorCQlibGl6emFyZC52aWRfc2NhbGVkICY9IH4oMSA8PCBwbGFuZSk7CisJZWxzZQorCQlibGl6emFyZC52aWRfc2NhbGVkIHw9IDEgPDwgcGxhbmU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibGl6emFyZF9lbmFibGVfcGxhbmUoaW50IHBsYW5lLCBpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCWJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzIHw9IDEgPDwgcGxhbmU7CisJZWxzZQorCQlibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmPSB+KDEgPDwgcGxhbmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3luY19oYW5kbGVyKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXEpCit7CisJY29tcGxldGUocmVxLT5wYXIuc3luYyk7CisJcmV0dXJuIFJFUV9DT01QTEVURTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfc3luYyh2b2lkKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworCisJcmVxID0gYWxsb2NfcmVxKCk7CisKKwlyZXEtPmhhbmRsZXIgPSBzeW5jX2hhbmRsZXI7CisJcmVxLT5jb21wbGV0ZSA9IE5VTEw7CisJaW5pdF9jb21wbGV0aW9uKCZjb21wKTsKKwlyZXEtPnBhci5zeW5jID0gJmNvbXA7CisKKwlsaXN0X2FkZCgmcmVxLT5lbnRyeSwgJnJlcV9saXN0KTsKKwlzdWJtaXRfcmVxX2xpc3QoJnJlcV9saXN0KTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXApOworfQorCisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX2JpbmRfY2xpZW50KHN0cnVjdCBvbWFwZmJfbm90aWZpZXJfYmxvY2sgKm5iKQoreworCWlmIChibGl6emFyZC51cGRhdGVfbW9kZSA9PSBPTUFQRkJfTUFOVUFMX1VQREFURSkgeworCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoYmxpenphcmQuZmJkZXYsIE9NQVBGQl9FVkVOVF9SRUFEWSk7CisJfQorfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX3NldF91cGRhdGVfbW9kZShlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWlmICh1bmxpa2VseShtb2RlICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFICYmCisJCSAgICAgbW9kZSAhPSBPTUFQRkJfQVVUT19VUERBVEUgJiYKKwkJICAgICBtb2RlICE9IE9NQVBGQl9VUERBVEVfRElTQUJMRUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtb2RlID09IGJsaXp6YXJkLnVwZGF0ZV9tb2RlKQorCQlyZXR1cm4gMDsKKworCWRldl9pbmZvKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJzMWQxMzc0eDogc2V0dGluZyB1cGRhdGUgbW9kZSB0byAlc1xuIiwKKwkJCW1vZGUgPT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCA/ICJkaXNhYmxlZCIgOgorCQkJKG1vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFID8gImF1dG8iIDogIm1hbnVhbCIpKTsKKworCXN3aXRjaCAoYmxpenphcmQudXBkYXRlX21vZGUpIHsKKwljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgorCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoYmxpenphcmQuZmJkZXYsIE9NQVBGQl9FVkVOVF9ESVNBQkxFRCk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQlibGl6emFyZC5zdG9wX2F1dG9fdXBkYXRlID0gMTsKKwkJZGVsX3RpbWVyX3N5bmMoJmJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQlicmVhazsKKwl9CisKKwlibGl6emFyZC51cGRhdGVfbW9kZSA9IG1vZGU7CisJYmxpenphcmRfc3luYygpOworCWJsaXp6YXJkLnN0b3BfYXV0b191cGRhdGUgPSAwOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGJsaXp6YXJkLmZiZGV2LCBPTUFQRkJfRVZFTlRfUkVBRFkpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJYmxpenphcmRfdXBkYXRlX3dpbmRvd19hdXRvKDApOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgYmxpenphcmRfZ2V0X3VwZGF0ZV9tb2RlKHZvaWQpCit7CisJcmV0dXJuIGJsaXp6YXJkLnVwZGF0ZV9tb2RlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2V4dGlmX3RpbWluZ3MoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJYmxpenphcmQuZXh0aWYtPnNldF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcm91bmRfdG9fZXh0aWZfdGlja3ModW5zaWduZWQgbG9uZyBwcywgaW50IGRpdikKK3sKKwlpbnQgYnVzX3RpY2sgPSBibGl6emFyZC5leHRpZl9jbGtfcGVyaW9kICogZGl2OworCXJldHVybiAocHMgKyBidXNfdGljayAtIDEpIC8gYnVzX3RpY2sgKiBidXNfdGljazsKK30KKworc3RhdGljIGludCBjYWxjX3JlZ190aW1pbmcodW5zaWduZWQgbG9uZyBzeXNjbGssIGludCBkaXYpCit7CisJc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQ7CisJdW5zaWduZWQgbG9uZyBzeXN0aW07CisKKwkvKiBDU09uVGltZSAwLCBXRU9uVGltZSAyIG5zLCBSRU9uVGltZSAyIG5zLAorCSAqIEFjY2Vzc1RpbWUgMiBucyArIDEyLjIgbnMgKHJlZ3MpLAorCSAqIFdFT2ZmVGltZSA9IFdFT25UaW1lICsgMSBucywKKwkgKiBSRU9mZlRpbWUgPSBSRU9uVGltZSArIDEyIG5zIChyZWdzKSwKKwkgKiBDU09mZlRpbWUgPSBSRU9mZlRpbWUgKyAxIG5zCisJICogUmVhZEN5Y2xlID0gMm5zICsgMipTWVNDTEsgIChyZWdzKSwKKwkgKiBXcml0ZUN5Y2xlID0gMipTWVNDTEsgKyAyIG5zLAorCSAqIENTUHVsc2VXaWR0aCA9IDEwIG5zICovCisKKwlzeXN0aW0gPSAxMDAwMDAwMDAwIC8gKHN5c2NsayAvIDEwMDApOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJICAiQmxpenphcmQgc3lzdGltICVsdSBwcyBleHRpZl9jbGtfcGVyaW9kICV1IGRpdiAlZFxuIiwKKwkJICBzeXN0aW0sIGJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QsIGRpdik7CisKKwl0ID0gJmJsaXp6YXJkLnJlZ190aW1pbmdzOworCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKworCXQtPmNsa19kaXYgPSBkaXY7CisKKwl0LT5jc19vbl90aW1lID0gMDsKKwl0LT53ZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+cmVfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPmFjY2Vzc190aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDEyMjAwLCBkaXYpOworCXQtPndlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+d2Vfb25fdGltZSArIDEwMDAsIGRpdik7CisJdC0+cmVfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgMTMwMDAsIGRpdik7CisJdC0+Y3Nfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vZmZfdGltZSArIDEwMDAsIGRpdik7CisJdC0+d2VfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT53ZV9jeWNsZV90aW1lIDwgdC0+d2Vfb2ZmX3RpbWUpCisJCXQtPndlX2N5Y2xlX3RpbWUgPSB0LT53ZV9vZmZfdGltZTsKKwl0LT5yZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPnJlX2N5Y2xlX3RpbWUgPCB0LT5yZV9vZmZfdGltZSkKKwkJdC0+cmVfY3ljbGVfdGltZSA9IHQtPnJlX29mZl90aW1lOworCXQtPmNzX3B1bHNlX3dpZHRoID0gMDsKKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIltyZWddY3NvbiAlZCBjc29mZiAlZCByZW9uICVkIHJlb2ZmICVkXG4iLAorCQkgdC0+Y3Nfb25fdGltZSwgdC0+Y3Nfb2ZmX3RpbWUsIHQtPnJlX29uX3RpbWUsIHQtPnJlX29mZl90aW1lKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJbcmVnXXdlb24gJWQgd2VvZmYgJWQgcmVjeWMgJWQgd2VjeWMgJWRcbiIsCisJCSB0LT53ZV9vbl90aW1lLCB0LT53ZV9vZmZfdGltZSwgdC0+cmVfY3ljbGVfdGltZSwKKwkJIHQtPndlX2N5Y2xlX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIltyZWddcmRhY2Nlc3MgJWQgY3NwdWxzZSAlZFxuIiwKKwkJIHQtPmFjY2Vzc190aW1lLCB0LT5jc19wdWxzZV93aWR0aCk7CisKKwlyZXR1cm4gYmxpenphcmQuZXh0aWYtPmNvbnZlcnRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGludCBjYWxjX2x1dF90aW1pbmcodW5zaWduZWQgbG9uZyBzeXNjbGssIGludCBkaXYpCit7CisJc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQ7CisJdW5zaWduZWQgbG9uZyBzeXN0aW07CisKKwkvKiBDU09uVGltZSAwLCBXRU9uVGltZSAyIG5zLCBSRU9uVGltZSAyIG5zLAorCSAqIEFjY2Vzc1RpbWUgMiBucyArIDQgKiBTWVNDTEsgKyAyNiAobHV0KSwKKwkgKiBXRU9mZlRpbWUgPSBXRU9uVGltZSArIDEgbnMsCisJICogUkVPZmZUaW1lID0gUkVPblRpbWUgKyA0KlNZU0NMSyArIDI2IG5zIChsdXQpLAorCSAqIENTT2ZmVGltZSA9IFJFT2ZmVGltZSArIDEgbnMKKwkgKiBSZWFkQ3ljbGUgPSAybnMgKyA0KlNZU0NMSyArIDI2IG5zIChsdXQpLAorCSAqIFdyaXRlQ3ljbGUgPSAyKlNZU0NMSyArIDIgbnMsCisJICogQ1NQdWxzZVdpZHRoID0gMTAgbnMgKi8KKworCXN5c3RpbSA9IDEwMDAwMDAwMDAgLyAoc3lzY2xrIC8gMTAwMCk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkiQmxpenphcmQgc3lzdGltICVsdSBwcyBleHRpZl9jbGtfcGVyaW9kICV1IGRpdiAlZFxuIiwKKwkJc3lzdGltLCBibGl6emFyZC5leHRpZl9jbGtfcGVyaW9kLCBkaXYpOworCisJdCA9ICZibGl6emFyZC5sdXRfdGltaW5nczsKKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisKKwl0LT5jbGtfZGl2ID0gZGl2OworCisJdC0+Y3Nfb25fdGltZSA9IDA7CisJdC0+d2Vfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPnJlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5hY2Nlc3NfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyA0ICogc3lzdGltICsKKwkJCQkJICAgICAgMjYwMDAsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT53ZV9vbl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT5yZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyA0ICogc3lzdGltICsKKwkJCQkJICAgICAgMjYwMDAsIGRpdik7CisJdC0+Y3Nfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vZmZfdGltZSArIDEwMDAsIGRpdik7CisJdC0+d2VfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT53ZV9jeWNsZV90aW1lIDwgdC0+d2Vfb2ZmX3RpbWUpCisJCXQtPndlX2N5Y2xlX3RpbWUgPSB0LT53ZV9vZmZfdGltZTsKKwl0LT5yZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMjAwMCArIDQgKiBzeXN0aW0gKyAyNjAwMCwgZGl2KTsKKwlpZiAodC0+cmVfY3ljbGVfdGltZSA8IHQtPnJlX29mZl90aW1lKQorCQl0LT5yZV9jeWNsZV90aW1lID0gdC0+cmVfb2ZmX3RpbWU7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSAwOworCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkgIltsdXRdY3NvbiAlZCBjc29mZiAlZCByZW9uICVkIHJlb2ZmICVkXG4iLAorCQkgdC0+Y3Nfb25fdGltZSwgdC0+Y3Nfb2ZmX3RpbWUsIHQtPnJlX29uX3RpbWUsIHQtPnJlX29mZl90aW1lKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSAiW2x1dF13ZW9uICVkIHdlb2ZmICVkIHJlY3ljICVkIHdlY3ljICVkXG4iLAorCQkgdC0+d2Vfb25fdGltZSwgdC0+d2Vfb2ZmX3RpbWUsIHQtPnJlX2N5Y2xlX3RpbWUsCisJCSB0LT53ZV9jeWNsZV90aW1lKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJbbHV0XXJkYWNjZXNzICVkIGNzcHVsc2UgJWRcbiIsCisJCSB0LT5hY2Nlc3NfdGltZSwgdC0+Y3NfcHVsc2Vfd2lkdGgpOworCisJcmV0dXJuIGJsaXp6YXJkLmV4dGlmLT5jb252ZXJ0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19leHRpZl90aW1pbmdzKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgKmV4dGlmX21lbV9kaXYpCit7CisJaW50IG1heF9jbGtfZGl2OworCWludCBkaXY7CisKKwlibGl6emFyZC5leHRpZi0+Z2V0X2Nsa19pbmZvKCZibGl6emFyZC5leHRpZl9jbGtfcGVyaW9kLCAmbWF4X2Nsa19kaXYpOworCWZvciAoZGl2ID0gMTsgZGl2IDw9IG1heF9jbGtfZGl2OyBkaXYrKykgeworCQlpZiAoY2FsY19yZWdfdGltaW5nKHN5c2NsaywgZGl2KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChkaXYgPiBtYXhfY2xrX2RpdikgeworCQlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJyZWcgdGltaW5nIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKwkqZXh0aWZfbWVtX2RpdiA9IGRpdjsKKworCWZvciAoZGl2ID0gMTsgZGl2IDw9IG1heF9jbGtfZGl2OyBkaXYrKykgeworCQlpZiAoY2FsY19sdXRfdGltaW5nKHN5c2NsaywgZGl2KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGRpdiA+IG1heF9jbGtfZGl2KQorCQlnb3RvIGVycjsKKworCWJsaXp6YXJkLmV4dGlmX2Nsa19kaXYgPSBkaXY7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJjYW4ndCBzZXR1cCB0aW1pbmdzXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfYmxpenphcmRfY2xrX3JhdGVzKHVuc2lnbmVkIGxvbmcgZXh0X2NsaywKKwkJCQl1bnNpZ25lZCBsb25nICpzeXNfY2xrLCB1bnNpZ25lZCBsb25nICpwaXhfY2xrKQoreworCWludCBwaXhfY2xrX3NyYzsKKwlpbnQgc3lzX2RpdiA9IDAsIHN5c19tdWwgPSAwOworCWludCBwaXhfZGl2OworCisJcGl4X2Nsa19zcmMgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9DTEtfU1JDKTsKKwlwaXhfZGl2ID0gKChwaXhfY2xrX3NyYyA+PiAzKSAmIDB4MWYpICsgMTsKKwlpZiAoKHBpeF9jbGtfc3JjICYgKDB4MyA8PCAxKSkgPT0gMCkgeworCQkvKiBTb3VyY2UgaXMgdGhlIFBMTCAqLworCQlzeXNfZGl2ID0gKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9ESVYpICYgMHgzZikgKyAxOworCQlzeXNfbXVsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0NMT0NLX1NZTlRIXzApOworCQlzeXNfbXVsIHw9ICgoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0NMT0NLX1NZTlRIXzEpCisJCQkJJiAweDBmKQk8PCAxMSk7CisJCSpzeXNfY2xrID0gZXh0X2NsayAqIHN5c19tdWwgLyBzeXNfZGl2OworCX0gZWxzZQkvKiBlbHNlIHNvdXJjZSBpcyBleHQgY2xrLCBvciBvc2NpbGxhdG9yICovCisJCSpzeXNfY2xrID0gZXh0X2NsazsKKworCSpwaXhfY2xrID0gKnN5c19jbGsgLyBwaXhfZGl2OwkJCS8qIEhaICovCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkiZXh0X2NsayAlbGQgcGl4X3NyYyAlZCBwaXhfZGl2ICVkIHN5c19kaXYgJWQgc3lzX211bCAlZFxuIiwKKwkJZXh0X2NsaywgcGl4X2Nsa19zcmMgJiAoMHgzIDw8IDEpLCBwaXhfZGl2LCBzeXNfZGl2LCBzeXNfbXVsKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJzeXNfY2xrICVsZCBwaXhfY2xrICVsZFxuIiwKKwkJKnN5c19jbGssICpwaXhfY2xrKTsKK30KKworc3RhdGljIGludCBzZXR1cF90ZWFyc3luYyh1bnNpZ25lZCBsb25nIHBpeF9jbGssIGludCBleHRpZl9kaXYpCit7CisJaW50IGhkaXNwLCB2ZGlzcDsKKwlpbnQgaG5kcCwgdm5kcDsKKwlpbnQgaHN3LCB2c3c7CisJaW50IGhzLCB2czsKKwlpbnQgaHNfcG9sX2ludiwgdnNfcG9sX2ludjsKKwlpbnQgdXNlX2hzdnMsIHVzZV9uZHA7CisJdTggIGI7CisKKwloc3cgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9IU1cpOworCXZzdyA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1ZTVyk7CisJaHNfcG9sX2ludiA9ICEoaHN3ICYgMHg4MCk7CisJdnNfcG9sX2ludiA9ICEodnN3ICYgMHg4MCk7CisJaHN3ID0gaHN3ICYgMHg3ZjsKKwl2c3cgPSB2c3cgJiAweDNmOworCisJaGRpc3AgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9IRElTUCkgKiA4OworCXZkaXNwID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfVkRJU1AwKSArCisJCSgoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfVkRJU1AxKSAmIDB4MykgPDwgOCk7CisKKwlobmRwID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfSE5EUCkgJiAweDNmOworCXZuZHAgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9WTkRQKTsKKworCS8qIHRpbWUgdG8gdHJhbnNmZXIgb25lIHBpeGVsICgxNmJwcCkgaW4gcHMgKi8KKwlibGl6emFyZC5waXhfdHhfdGltZSA9IGJsaXp6YXJkLnJlZ190aW1pbmdzLndlX2N5Y2xlX3RpbWU7CisJaWYgKGJsaXp6YXJkLmV4dGlmLT5nZXRfbWF4X3R4X3JhdGUgIT0gTlVMTCkgeworCQkvKiBUaGUgZXh0ZXJuYWwgaW50ZXJmYWNlIG1pZ2h0IGhhdmUgYSByYXRlIGxpbWl0YXRpb24sCisJCSAqIGlmIHNvLCB3ZSBoYXZlIHRvIG1heGltaXplIG91ciB0cmFuc2ZlciByYXRlLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBtaW5fdHhfdGltZTsKKwkJdW5zaWduZWQgbG9uZyBtYXhfdHhfcmF0ZSA9IGJsaXp6YXJkLmV4dGlmLT5nZXRfbWF4X3R4X3JhdGUoKTsKKworCQlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJtYXhfdHhfcmF0ZSAlbGQgSFpcbiIsCisJCQltYXhfdHhfcmF0ZSk7CisJCW1pbl90eF90aW1lID0gMTAwMDAwMDAwMCAvIChtYXhfdHhfcmF0ZSAvIDEwMDApOyAgLyogcHMgKi8KKwkJaWYgKGJsaXp6YXJkLnBpeF90eF90aW1lIDwgbWluX3R4X3RpbWUpCisJCQlibGl6emFyZC5waXhfdHhfdGltZSA9IG1pbl90eF90aW1lOworCX0KKworCS8qIHRpbWUgdG8gdXBkYXRlIG9uZSBsaW5lIGluIHBzICovCisJYmxpenphcmQubGluZV91cGRfdGltZSA9IChoZGlzcCArIGhuZHApICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7CisJYmxpenphcmQubGluZV91cGRfdGltZSAqPSAxMDAwOworCWlmIChoZGlzcCAqIGJsaXp6YXJkLnBpeF90eF90aW1lID4gYmxpenphcmQubGluZV91cGRfdGltZSkKKwkJLyogdHJhbnNmZXIgc3BlZWQgdG9vIGxvdywgd2UgbWlnaHQgaGF2ZSB0byB1c2UgYm90aAorCQkgKiBIUyBhbmQgVlMgKi8KKwkJdXNlX2hzdnMgPSAxOworCWVsc2UKKwkJLyogZGVjZW50IHRyYW5zZmVyIHNwZWVkLCB3ZSdsbCBhbHdheXMgdXNlIG9ubHkgVlMgKi8KKwkJdXNlX2hzdnMgPSAwOworCisJaWYgKHVzZV9oc3ZzICYmIChoc19wb2xfaW52IHx8IHZzX3BvbF9pbnYpKSB7CisJCS8qIEhTIG9yJ2VkIHdpdGggVlMgZG9lc24ndCB3b3JrLCB1c2UgdGhlIGFjdGl2ZSBoaWdoCisJCSAqIFRFIHNpZ25hbCBiYXNlZCBvbiBITkRQIC8gVk5EUCAqLworCQl1c2VfbmRwID0gMTsKKwkJaHNfcG9sX2ludiA9IDA7CisJCXZzX3BvbF9pbnYgPSAwOworCQlocyA9IGhuZHA7CisJCXZzID0gdm5kcDsKKwl9IGVsc2UgeworCQkvKiBVc2UgSFMgb3InZWQgd2l0aCBWUyBhcyBhIFRFIHNpZ25hbCBpZiBib3RoIGFyZSBuZWVkZWQKKwkJICogb3IgVk5EUCBpZiBvbmx5IHZzeW5jIGlzIG5lZWRlZC4gKi8KKwkJdXNlX25kcCA9IDA7CisJCWhzID0gaHN3OworCQl2cyA9IHZzdzsKKwkJaWYgKCF1c2VfaHN2cykgeworCQkJaHNfcG9sX2ludiA9IDA7CisJCQl2c19wb2xfaW52ID0gMDsKKwkJfQorCX0KKworCWhzID0gaHMgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsJCSAgLyogcHMgKi8KKwlocyAqPSAxMDAwOworCisJdnMgPSB2cyAqIChoZGlzcCArIGhuZHApICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7IC8qIHBzICovCisJdnMgKj0gMTAwMDsKKworCWlmICh2cyA8PSBocykKKwkJcmV0dXJuIC1FRE9NOworCS8qIHNldCBWUyB0byAxMjAlIG9mIEhTIHRvIG1pbmltaXplIFZTIGRldGVjdGlvbiB0aW1lICovCisJdnMgPSBocyAqIDEyIC8gMTA7CisJLyogbWluaW1pemUgSFMgdG9vICovCisJaWYgKGhzID4gMTAwMDApCisJCWhzID0gMTAwMDA7CisKKwliID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpOworCWIgJj0gfjB4MzsKKwliIHw9IHVzZV9oc3ZzID8gMSA6IDA7CisJYiB8PSAodXNlX25kcCAmJiB1c2VfaHN2cykgPyAwIDogMjsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMsIGIpOworCisJYmxpenphcmQudnN5bmNfb25seSA9ICF1c2VfaHN2czsKKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJInBpeF9jbGsgJWxkIEhaIHBpeF90eF90aW1lICVsZCBwcyBsaW5lX3VwZF90aW1lICVsZCBwc1xuIiwKKwkJcGl4X2NsaywgYmxpenphcmQucGl4X3R4X3RpbWUsIGJsaXp6YXJkLmxpbmVfdXBkX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJImhzICVkIHBzIHZzICVkIHBzIG1vZGUgJWQgdnN5bmNfb25seSAlZFxuIiwKKwkJaHMsIHZzLCBiICYgMHgzLCAhdXNlX2hzdnMpOworCisJcmV0dXJuIGJsaXp6YXJkLmV4dGlmLT5zZXR1cF90ZWFyc3luYygxLCBocywgdnMsCisJCQkJCSAgICAgIGhzX3BvbF9pbnYsIHZzX3BvbF9pbnYsCisJCQkJCSAgICAgIGV4dGlmX2Rpdik7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX2dldF9jYXBzKGludCBwbGFuZSwgc3RydWN0IG9tYXBmYl9jYXBzICpjYXBzKQoreworCWJsaXp6YXJkLmludF9jdHJsLT5nZXRfY2FwcyhwbGFuZSwgY2Fwcyk7CisJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19NQU5VQUxfVVBEQVRFIHwKKwkJT01BUEZCX0NBUFNfV0lORE9XX1BJWEVMX0RPVUJMRSB8CisJCU9NQVBGQl9DQVBTX1dJTkRPV19TQ0FMRSB8CisJCU9NQVBGQl9DQVBTX1dJTkRPV19PVkVSTEFZOworCWlmIChibGl6emFyZC50ZV9jb25uZWN0ZWQpCisJCWNhcHMtPmN0cmwgfD0gT01BUEZCX0NBUFNfVEVBUlNZTkM7CisJY2Fwcy0+d25kX2NvbG9yIHw9ICgxIDw8IE9NQVBGQl9DT0xPUl9SR0I1NjUpIHwKKwkJCSAgICgxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjApOworfQorCitzdGF0aWMgdm9pZCBfc2F2ZV9yZWdzKHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCAqbGlzdCwgaW50IGNudCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKywgbGlzdCsrKSB7CisJCWludCByZWc7CisJCWZvciAocmVnID0gbGlzdC0+c3RhcnQ7IHJlZyA8PSBsaXN0LT5lbmQ7IHJlZyArPSAyKQorCQkJYmxpenphcmRfcmVnX2NhY2hlW3JlZyAvIDJdID0gYmxpenphcmRfcmVhZF9yZWcocmVnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9yZXN0b3JlX3JlZ3Moc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0ICpsaXN0LCBpbnQgY250KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBsaXN0KyspIHsKKwkJaW50IHJlZzsKKwkJZm9yIChyZWcgPSBsaXN0LT5zdGFydDsgcmVnIDw9IGxpc3QtPmVuZDsgcmVnICs9IDIpCisJCQlibGl6emFyZF93cml0ZV9yZWcocmVnLCBibGl6emFyZF9yZWdfY2FjaGVbcmVnIC8gMl0pOworCX0KK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfc2F2ZV9hbGxfcmVncyh2b2lkKQoreworCV9zYXZlX3JlZ3MoYmxpenphcmRfcGxsX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfcGxsX3JlZ3MpKTsKKwlfc2F2ZV9yZWdzKGJsaXp6YXJkX2dlbl9yZWdzLCBBUlJBWV9TSVpFKGJsaXp6YXJkX2dlbl9yZWdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3Jlc3RvcmVfcGxsX3JlZ3Modm9pZCkKK3sKKwlfcmVzdG9yZV9yZWdzKGJsaXp6YXJkX3BsbF9yZWdzLCBBUlJBWV9TSVpFKGJsaXp6YXJkX3BsbF9yZWdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3Jlc3RvcmVfZ2VuX3JlZ3Modm9pZCkKK3sKKwlfcmVzdG9yZV9yZWdzKGJsaXp6YXJkX2dlbl9yZWdzLCBBUlJBWV9TSVpFKGJsaXp6YXJkX2dlbl9yZWdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3N1c3BlbmQodm9pZCkKK3sKKwl1MzIgbDsKKwl1bnNpZ25lZCBsb25nIHRtbzsKKworCWlmIChibGl6emFyZC5sYXN0X2NvbG9yX21vZGUpIHsKKwkJdXBkYXRlX2Z1bGxfc2NyZWVuKCk7CisJCWJsaXp6YXJkX3N5bmMoKTsKKwl9CisJYmxpenphcmQudXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQgPSBibGl6emFyZC51cGRhdGVfbW9kZTsKKwkvKiB0aGUgZm9sbG93aW5nIHdpbGwgZGlzYWJsZSBjbG9ja3MgYXMgd2VsbCAqLworCWJsaXp6YXJkX3NldF91cGRhdGVfbW9kZShPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKworCWJsaXp6YXJkX3NhdmVfYWxsX3JlZ3MoKTsKKworCWJsaXp6YXJkX3N0b3Bfc2RyYW0oKTsKKworCWwgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QT1dFUl9TQVZFKTsKKwkvKiBTdGFuZGJ5LCBTbGVlcC4gV2UgYXNzdW1lIHdlIHVzZSBhbiBleHRlcm5hbCBjbG9jay4gKi8KKwlsIHw9IDB4MDM7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX1BPV0VSX1NBVkUsIGwpOworCisJdG1vID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwl3aGlsZSAoIShibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfTU9ERSkgJiAoMSA8PCAxKSkpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdG1vKSkgeworCQkJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LAorCQkJCSJzMWQxMzc0eDogc2xlZXAgdGltZW91dCwgc3RvcHBpbmcgUExMIG1hbnVhbGx5XG4iKTsKKwkJCWwgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfTU9ERSk7CisJCQlsICY9IH4weDAzOworCQkJLyogRGlzYWJsZSBQTEwsIGNvdW50ZXIgZnVuY3Rpb24gKi8KKwkJCWwgfD0gMHgyOworCQkJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX1BMTF9NT0RFLCBsKTsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAoYmxpenphcmQucG93ZXJfZG93biAhPSBOVUxMKQorCQlibGl6emFyZC5wb3dlcl9kb3duKGJsaXp6YXJkLmZiZGV2LT5kZXYpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9yZXN1bWUodm9pZCkKK3sKKwl1MzIgbDsKKworCWlmIChibGl6emFyZC5wb3dlcl91cCAhPSBOVUxMKQorCQlibGl6emFyZC5wb3dlcl91cChibGl6emFyZC5mYmRldi0+ZGV2KTsKKworCWwgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QT1dFUl9TQVZFKTsKKwkvKiBTdGFuZGJ5LCBTbGVlcCAqLworCWwgJj0gfjB4MDM7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX1BPV0VSX1NBVkUsIGwpOworCisJYmxpenphcmRfcmVzdG9yZV9wbGxfcmVncygpOworCWwgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfTU9ERSk7CisJbCAmPSB+MHgwMzsKKwkvKiBFbmFibGUgUExMLCBjb3VudGVyIGZ1bmN0aW9uICovCisJbCB8PSAweDE7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX1BMTF9NT0RFLCBsKTsKKworCXdoaWxlICghKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9ESVYpICYgKDEgPDwgNykpKQorCQltc2xlZXAoMSk7CisKKwlibGl6emFyZF9yZXN0YXJ0X3NkcmFtKCk7CisKKwlibGl6emFyZF9yZXN0b3JlX2dlbl9yZWdzKCk7CisKKwkvKiBFbmFibGUgZGlzcGxheSAqLworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ESVNQTEFZX01PREUsIDB4MDEpOworCisJLyogdGhlIGZvbGxvd2luZyB3aWxsIGVuYWJsZSBjbG9ja3MgYXMgbmVjZXNzYXJ5ICovCisJYmxpenphcmRfc2V0X3VwZGF0ZV9tb2RlKGJsaXp6YXJkLnVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kKTsKKworCS8qIEZvcmNlIGEgYmFja2dyb3VuZCB1cGRhdGUgKi8KKwlibGl6emFyZC56b29tX29uID0gMTsKKwl1cGRhdGVfZnVsbF9zY3JlZW4oKTsKKwlibGl6emFyZF9zeW5jKCk7Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIGludCBleHRfbW9kZSwKKwkJCSBzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfdnJhbSkKK3sKKwlpbnQgciA9IDAsIGk7CisJdTggcmV2LCBjb25mOworCXVuc2lnbmVkIGxvbmcgZXh0X2NsazsKKwlpbnQgZXh0aWZfZGl2OworCXVuc2lnbmVkIGxvbmcgc3lzX2NsaywgcGl4X2NsazsKKwlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKm9tYXBmYl9jb25mOworCXN0cnVjdCBibGl6emFyZF9wbGF0Zm9ybV9kYXRhICpjdHJsX2NvbmY7CisKKwlibGl6emFyZC5mYmRldiA9IGZiZGV2OworCisJQlVHX09OKCFmYmRldi0+ZXh0X2lmIHx8ICFmYmRldi0+aW50X2N0cmwpOworCisJYmxpenphcmQuZmJkZXYgPSBmYmRldjsKKwlibGl6emFyZC5leHRpZiA9IGZiZGV2LT5leHRfaWY7CisJYmxpenphcmQuaW50X2N0cmwgPSBmYmRldi0+aW50X2N0cmw7CisKKwlvbWFwZmJfY29uZiA9IGZiZGV2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJY3RybF9jb25mID0gb21hcGZiX2NvbmYtPmN0cmxfcGxhdGZvcm1fZGF0YTsKKwlpZiAoY3RybF9jb25mID09IE5VTEwgfHwgY3RybF9jb25mLT5nZXRfY2xvY2tfcmF0ZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgInMxZDEzNzR4OiBtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyID0gLUVOT0VOVDsKKwkJZ290byBlcnIxOworCX0KKworCWJsaXp6YXJkLnBvd2VyX2Rvd24gPSBjdHJsX2NvbmYtPnBvd2VyX2Rvd247CisJYmxpenphcmQucG93ZXJfdXAgPSBjdHJsX2NvbmYtPnBvd2VyX3VwOworCisJc3Bpbl9sb2NrX2luaXQoJmJsaXp6YXJkLnJlcV9sb2NrKTsKKworCWlmICgociA9IGJsaXp6YXJkLmludF9jdHJsLT5pbml0KGZiZGV2LCAxLCByZXFfdnJhbSkpIDwgMCkKKwkJZ290byBlcnIxOworCisJaWYgKChyID0gYmxpenphcmQuZXh0aWYtPmluaXQoZmJkZXYpKSA8IDApCisJCWdvdG8gZXJyMjsKKworCWJsaXp6YXJkX2N0cmwuc2V0X2NvbG9yX2tleSA9IGJsaXp6YXJkLmludF9jdHJsLT5zZXRfY29sb3Jfa2V5OworCWJsaXp6YXJkX2N0cmwuZ2V0X2NvbG9yX2tleSA9IGJsaXp6YXJkLmludF9jdHJsLT5nZXRfY29sb3Jfa2V5OworCWJsaXp6YXJkX2N0cmwuc2V0dXBfbWVtID0gYmxpenphcmQuaW50X2N0cmwtPnNldHVwX21lbTsKKwlibGl6emFyZF9jdHJsLm1tYXAgPSBibGl6emFyZC5pbnRfY3RybC0+bW1hcDsKKworCWV4dF9jbGsgPSBjdHJsX2NvbmYtPmdldF9jbG9ja19yYXRlKGZiZGV2LT5kZXYpOworCWlmICgociA9IGNhbGNfZXh0aWZfdGltaW5ncyhleHRfY2xrLCAmZXh0aWZfZGl2KSkgPCAwKQorCQlnb3RvIGVycjM7CisKKwlzZXRfZXh0aWZfdGltaW5ncygmYmxpenphcmQucmVnX3RpbWluZ3MpOworCisJaWYgKGJsaXp6YXJkLnBvd2VyX3VwICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX3VwKGZiZGV2LT5kZXYpOworCisJY2FsY19ibGl6emFyZF9jbGtfcmF0ZXMoZXh0X2NsaywgJnN5c19jbGssICZwaXhfY2xrKTsKKworCWlmICgociA9IGNhbGNfZXh0aWZfdGltaW5ncyhzeXNfY2xrLCAmZXh0aWZfZGl2KSkgPCAwKQorCQlnb3RvIGVycjM7CisJc2V0X2V4dGlmX3RpbWluZ3MoJmJsaXp6YXJkLnJlZ190aW1pbmdzKTsKKworCWlmICghKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9ESVYpICYgMHg4MCkpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJImNvbnRyb2xsZXIgbm90IGluaXRpYWxpemVkIGJ5IHRoZSBib290bG9hZGVyXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMzsKKwl9CisKKwlpZiAoY3RybF9jb25mLT50ZV9jb25uZWN0ZWQpIHsKKwkJaWYgKChyID0gc2V0dXBfdGVhcnN5bmMocGl4X2NsaywgZXh0aWZfZGl2KSkgPCAwKQorCQkJZ290byBlcnIzOworCQlibGl6emFyZC50ZV9jb25uZWN0ZWQgPSAxOworCX0KKworCXJldiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1JFVl9DT0RFKTsKKwljb25mID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfQ09ORklHKTsKKworCXN3aXRjaCAocmV2ICYgMHhmYykgeworCWNhc2UgMHg5YzoKKwkJYmxpenphcmQudmVyc2lvbiA9IEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDQ7CisJCXByX2luZm8oIm9tYXBmYjogczFkMTM3NDQgTENEIGNvbnRyb2xsZXIgcmV2ICVkICIKKwkJCSJpbml0aWFsaXplZCAoQ05GIHBpbnMgJXgpXG4iLCByZXYgJiAweDAzLCBjb25mICYgMHgwNyk7CisJCWJyZWFrOworCWNhc2UgMHhhNDoKKwkJYmxpenphcmQudmVyc2lvbiA9IEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDU7CisJCXByX2luZm8oIm9tYXBmYjogczFkMTM3NDUgTENEIGNvbnRyb2xsZXIgcmV2ICVkICIKKwkJCSJpbml0aWFsaXplZCAoQ05GIHBpbnMgJXgpXG4iLCByZXYgJiAweDAzLCBjb25mICYgMHgwNyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImludmFsaWQgczFkMTM3NHggcmV2aXNpb24gJTAyeFxuIiwKKwkJCXJldik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjM7CisJfQorCisJYmxpenphcmQubWF4X3RyYW5zbWl0X3NpemUgPSBibGl6emFyZC5leHRpZi0+bWF4X3RyYW5zbWl0X3NpemU7CisKKwlibGl6emFyZC51cGRhdGVfbW9kZSA9IE9NQVBGQl9VUERBVEVfRElTQUJMRUQ7CisKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cueCA9IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LnkgPSAwOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy53aWR0aCA9IGZiZGV2LT5wYW5lbC0+eF9yZXM7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LmhlaWdodCA9IGZiZGV2LT5wYW5lbC0+eV9yZXM7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF94ID0gMDsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cub3V0X3ggPSAwOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5vdXRfd2lkdGggPSBmYmRldi0+cGFuZWwtPnhfcmVzOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5vdXRfaGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cuZm9ybWF0ID0gMDsKKworCWJsaXp6YXJkLnNjcmVlbl93aWR0aCA9IGZiZGV2LT5wYW5lbC0+eF9yZXM7CisJYmxpenphcmQuc2NyZWVuX2hlaWdodCA9IGZiZGV2LT5wYW5lbC0+eV9yZXM7CisKKwlpbml0X3RpbWVyKCZibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lcik7CisJYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIuZnVuY3Rpb24gPSBibGl6emFyZF91cGRhdGVfd2luZG93X2F1dG87CisJYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIuZGF0YSA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmYmxpenphcmQuZnJlZV9yZXFfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJsaXp6YXJkLnJlcV9wb29sKTsgaSsrKQorCQlsaXN0X2FkZCgmYmxpenphcmQucmVxX3Bvb2xbaV0uZW50cnksICZibGl6emFyZC5mcmVlX3JlcV9saXN0KTsKKwlCVUdfT04oaSA8PSBJUlFfUkVRX1BPT0xfU0laRSk7CisJc2VtYV9pbml0KCZibGl6emFyZC5yZXFfc2VtYSwgaSAtIElSUV9SRVFfUE9PTF9TSVpFKTsKKworCXJldHVybiAwOworZXJyMzoKKwlpZiAoYmxpenphcmQucG93ZXJfZG93biAhPSBOVUxMKQorCQlibGl6emFyZC5wb3dlcl9kb3duKGZiZGV2LT5kZXYpOworCWJsaXp6YXJkLmV4dGlmLT5jbGVhbnVwKCk7CitlcnIyOgorCWJsaXp6YXJkLmludF9jdHJsLT5jbGVhbnVwKCk7CitlcnIxOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9jbGVhbnVwKHZvaWQpCit7CisJYmxpenphcmRfc2V0X3VwZGF0ZV9tb2RlKE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCWJsaXp6YXJkLmV4dGlmLT5jbGVhbnVwKCk7CisJYmxpenphcmQuaW50X2N0cmwtPmNsZWFudXAoKTsKKwlpZiAoYmxpenphcmQucG93ZXJfZG93biAhPSBOVUxMKQorCQlibGl6emFyZC5wb3dlcl9kb3duKGJsaXp6YXJkLmZiZGV2LT5kZXYpOworfQorCitzdHJ1Y3QgbGNkX2N0cmwgYmxpenphcmRfY3RybCA9IHsKKwkubmFtZQkJCT0gImJsaXp6YXJkIiwKKwkuaW5pdAkJCT0gYmxpenphcmRfaW5pdCwKKwkuY2xlYW51cAkJPSBibGl6emFyZF9jbGVhbnVwLAorCS5iaW5kX2NsaWVudAkJPSBibGl6emFyZF9iaW5kX2NsaWVudCwKKwkuZ2V0X2NhcHMJCT0gYmxpenphcmRfZ2V0X2NhcHMsCisJLnNldF91cGRhdGVfbW9kZQk9IGJsaXp6YXJkX3NldF91cGRhdGVfbW9kZSwKKwkuZ2V0X3VwZGF0ZV9tb2RlCT0gYmxpenphcmRfZ2V0X3VwZGF0ZV9tb2RlLAorCS5zZXR1cF9wbGFuZQkJPSBibGl6emFyZF9zZXR1cF9wbGFuZSwKKwkuc2V0X3NjYWxlCQk9IGJsaXp6YXJkX3NldF9zY2FsZSwKKwkuZW5hYmxlX3BsYW5lCQk9IGJsaXp6YXJkX2VuYWJsZV9wbGFuZSwKKwkudXBkYXRlX3dpbmRvdwkJPSBibGl6emFyZF91cGRhdGVfd2luZG93X2FzeW5jLAorCS5zeW5jCQkJPSBibGl6emFyZF9zeW5jLAorCS5zdXNwZW5kCQk9IGJsaXp6YXJkX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gYmxpenphcmRfcmVzdW1lLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGMyMzQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmMKQEAgLTAsMCArMSwxNTAyIEBACisvKgorICogT01BUDIgZGlzcGxheSBjb250cm9sbGVyIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NyYW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorCisjaW5jbHVkZSAiZGlzcGMuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRQkJCSJkaXNwYyIKKworI2RlZmluZSBEU1NfQkFTRQkJCTB4NDgwNTAwMDAKKyNkZWZpbmUgRFNTX1NZU0NPTkZJRwkJCTB4MDAxMAorCisjZGVmaW5lIERJU1BDX0JBU0UJCQkweDQ4MDUwNDAwCisKKy8qIERJU1BDIGNvbW1vbiAqLworI2RlZmluZSBESVNQQ19SRVZJU0lPTgkJCTB4MDAwMAorI2RlZmluZSBESVNQQ19TWVNDT05GSUcJCQkweDAwMTAKKyNkZWZpbmUgRElTUENfU1lTU1RBVFVTCQkJMHgwMDE0CisjZGVmaW5lIERJU1BDX0lSUVNUQVRVUwkJCTB4MDAxOAorI2RlZmluZSBESVNQQ19JUlFFTkFCTEUJCQkweDAwMUMKKyNkZWZpbmUgRElTUENfQ09OVFJPTAkJCTB4MDA0MAorI2RlZmluZSBESVNQQ19DT05GSUcJCQkweDAwNDQKKyNkZWZpbmUgRElTUENfQ0FQQUJMRQkJCTB4MDA0OAorI2RlZmluZSBESVNQQ19ERUZBVUxUX0NPTE9SMAkJMHgwMDRDCisjZGVmaW5lIERJU1BDX0RFRkFVTFRfQ09MT1IxCQkweDAwNTAKKyNkZWZpbmUgRElTUENfVFJBTlNfQ09MT1IwCQkweDAwNTQKKyNkZWZpbmUgRElTUENfVFJBTlNfQ09MT1IxCQkweDAwNTgKKyNkZWZpbmUgRElTUENfTElORV9TVEFUVVMJCTB4MDA1QworI2RlZmluZSBESVNQQ19MSU5FX05VTUJFUgkJMHgwMDYwCisjZGVmaW5lIERJU1BDX1RJTUlOR19ICQkJMHgwMDY0CisjZGVmaW5lIERJU1BDX1RJTUlOR19WCQkJMHgwMDY4CisjZGVmaW5lIERJU1BDX1BPTF9GUkVRCQkJMHgwMDZDCisjZGVmaW5lIERJU1BDX0RJVklTT1IJCQkweDAwNzAKKyNkZWZpbmUgRElTUENfU0laRV9ESUcJCQkweDAwNzgKKyNkZWZpbmUgRElTUENfU0laRV9MQ0QJCQkweDAwN0MKKworI2RlZmluZSBESVNQQ19EQVRBX0NZQ0xFMQkJMHgwMUQ0CisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUyCQkweDAxRDgKKyNkZWZpbmUgRElTUENfREFUQV9DWUNMRTMJCTB4MDFEQworCisvKiBESVNQQyBHRlggcGxhbmUgKi8KKyNkZWZpbmUgRElTUENfR0ZYX0JBMAkJCTB4MDA4MAorI2RlZmluZSBESVNQQ19HRlhfQkExCQkJMHgwMDg0CisjZGVmaW5lIERJU1BDX0dGWF9QT1NJVElPTgkJMHgwMDg4CisjZGVmaW5lIERJU1BDX0dGWF9TSVpFCQkJMHgwMDhDCisjZGVmaW5lIERJU1BDX0dGWF9BVFRSSUJVVEVTCQkweDAwQTAKKyNkZWZpbmUgRElTUENfR0ZYX0ZJRk9fVEhSRVNIT0xECTB4MDBBNAorI2RlZmluZSBESVNQQ19HRlhfRklGT19TSVpFX1NUQVRVUwkweDAwQTgKKyNkZWZpbmUgRElTUENfR0ZYX1JPV19JTkMJCTB4MDBBQworI2RlZmluZSBESVNQQ19HRlhfUElYRUxfSU5DCQkweDAwQjAKKyNkZWZpbmUgRElTUENfR0ZYX1dJTkRPV19TS0lQCQkweDAwQjQKKyNkZWZpbmUgRElTUENfR0ZYX1RBQkxFX0JBCQkweDAwQjgKKworLyogRElTUEMgVmlkZW8gcGxhbmUgMS8yICovCisjZGVmaW5lIERJU1BDX1ZJRDFfQkFTRQkJCTB4MDBCQworI2RlZmluZSBESVNQQ19WSUQyX0JBU0UJCQkweDAxNEMKKworLyogT2Zmc2V0cyBpbnRvIERJU1BDX1ZJRDEvMl9CQVNFICovCisjZGVmaW5lIERJU1BDX1ZJRF9CQTAJCQkweDAwMDAKKyNkZWZpbmUgRElTUENfVklEX0JBMQkJCTB4MDAwNAorI2RlZmluZSBESVNQQ19WSURfUE9TSVRJT04JCTB4MDAwOAorI2RlZmluZSBESVNQQ19WSURfU0laRQkJCTB4MDAwQworI2RlZmluZSBESVNQQ19WSURfQVRUUklCVVRFUwkJMHgwMDEwCisjZGVmaW5lIERJU1BDX1ZJRF9GSUZPX1RIUkVTSE9MRAkweDAwMTQKKyNkZWZpbmUgRElTUENfVklEX0ZJRk9fU0laRV9TVEFUVVMJMHgwMDE4CisjZGVmaW5lIERJU1BDX1ZJRF9ST1dfSU5DCQkweDAwMUMKKyNkZWZpbmUgRElTUENfVklEX1BJWEVMX0lOQwkJMHgwMDIwCisjZGVmaW5lIERJU1BDX1ZJRF9GSVIJCQkweDAwMjQKKyNkZWZpbmUgRElTUENfVklEX1BJQ1RVUkVfU0laRQkJMHgwMDI4CisjZGVmaW5lIERJU1BDX1ZJRF9BQ0NVMAkJCTB4MDAyQworI2RlZmluZSBESVNQQ19WSURfQUNDVTEJCQkweDAwMzAKKworLyogOCBlbGVtZW50cyBpbiA4IGJ5dGUgaW5jcmVtZW50cyAqLworI2RlZmluZSBESVNQQ19WSURfRklSX0NPRUZfSDAJCTB4MDAzNAorLyogOCBlbGVtZW50cyBpbiA4IGJ5dGUgaW5jcmVtZW50cyAqLworI2RlZmluZSBESVNQQ19WSURfRklSX0NPRUZfSFYwCQkweDAwMzgKKy8qIDUgZWxlbWVudHMgaW4gNCBieXRlIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgRElTUENfVklEX0NPTlZfQ09FRjAJCTB4MDA3NAorCisjZGVmaW5lIERJU1BDX0lSUV9GUkFNRU1BU0sJCTB4MDAwMQorI2RlZmluZSBESVNQQ19JUlFfVlNZTkMJCQkweDAwMDIKKyNkZWZpbmUgRElTUENfSVJRX0VWU1lOQ19FVkVOCQkweDAwMDQKKyNkZWZpbmUgRElTUENfSVJRX0VWU1lOQ19PREQJCTB4MDAwOAorI2RlZmluZSBESVNQQ19JUlFfQUNCSUFTX0NPVU5UX1NUQVQJMHgwMDEwCisjZGVmaW5lIERJU1BDX0lSUV9QUk9HX0xJTkVfTlVNCQkweDAwMjAKKyNkZWZpbmUgRElTUENfSVJRX0dGWF9GSUZPX1VOREVSRkxPVwkweDAwNDAKKyNkZWZpbmUgRElTUENfSVJRX0dGWF9FTkRfV0lOCQkweDAwODAKKyNkZWZpbmUgRElTUENfSVJRX1BBTF9HQU1NQV9NQVNLCTB4MDEwMAorI2RlZmluZSBESVNQQ19JUlFfT0NQX0VSUgkJMHgwMjAwCisjZGVmaW5lIERJU1BDX0lSUV9WSUQxX0ZJRk9fVU5ERVJGTE9XCTB4MDQwMAorI2RlZmluZSBESVNQQ19JUlFfVklEMV9FTkRfV0lOCQkweDA4MDAKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDJfRklGT19VTkRFUkZMT1cJMHgxMDAwCisjZGVmaW5lIERJU1BDX0lSUV9WSUQyX0VORF9XSU4JCTB4MjAwMAorI2RlZmluZSBESVNQQ19JUlFfU1lOQ19MT1NUCQkweDQwMDAKKworI2RlZmluZSBESVNQQ19JUlFfTUFTS19BTEwJCTB4N2ZmZgorCisjZGVmaW5lIERJU1BDX0lSUV9NQVNLX0VSUk9SCQkoRElTUENfSVJRX0dGWF9GSUZPX1VOREVSRkxPVyB8CVwKKwkJCQkJICAgICBESVNQQ19JUlFfVklEMV9GSUZPX1VOREVSRkxPVyB8IFwKKwkJCQkJICAgICBESVNQQ19JUlFfVklEMl9GSUZPX1VOREVSRkxPVyB8IFwKKwkJCQkJICAgICBESVNQQ19JUlFfU1lOQ19MT1NUKQorCisjZGVmaW5lIFJGQklfQ09OVFJPTAkJCTB4NDgwNTAwNDAKKworI2RlZmluZSBNQVhfUEFMRVRURV9TSVpFCQkoMjU2ICogMTYpCisKKyNkZWZpbmUgRkxEX01BU0socG9zLCBsZW4pCSgoKDEgPDwgbGVuKSAtIDEpIDw8IHBvcykKKworI2RlZmluZSBNT0RfUkVHX0ZMRChyZWcsIG1hc2ssIHZhbCkgXAorCWRpc3BjX3dyaXRlX3JlZygocmVnKSwgKGRpc3BjX3JlYWRfcmVnKHJlZykgJiB+KG1hc2spKSB8ICh2YWwpKTsKKworI2RlZmluZSBPTUFQMl9TUkFNX1NUQVJUCQkweDQwMjAwMDAwCisvKiBNYXhpbXVtIHNpemUsIGluIHJlYWxpdHkgdGhpcyBpcyBzbWFsbGVyIGlmIFNSQU0gaXMgcGFydGlhbGx5IGxvY2tlZC4gKi8KKyNkZWZpbmUgT01BUDJfU1JBTV9TSVpFCQkJMHhhMDAwMAkJLyogNjQwayAqLworCisvKiBXZSBzdXBwb3J0IHRoZSBTRFJBTSAvIFNSQU0gdHlwZXMuIFNlZSBPTUFQRkJfUExBTkVfTUVNVFlQRV8qIGluIG9tYXBmYi5oICovCisjZGVmaW5lIERJU1BDX01FTVRZUEVfTlVNCQkyCisKKyNkZWZpbmUgUkVTTUFQX1NJWkUoX3BhZ2VfY250KQkJCQkJCVwKKwkoKF9wYWdlX2NudCArIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSAtIDEpIC8gOCkKKyNkZWZpbmUgUkVTTUFQX1BUUihfcmVzX21hcCwgX3BhZ2VfbnIpCQkJCQlcCisJKCgoX3Jlc19tYXApLT5tYXApICsgKF9wYWdlX25yKSAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSkKKyNkZWZpbmUgUkVTTUFQX01BU0soX3BhZ2VfbnIpCQkJCQkJXAorCSgxIDw8ICgoX3BhZ2VfbnIpICYgKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDggLSAxKSkpCisKK3N0cnVjdCByZXNtYXAgeworCXVuc2lnbmVkIGxvbmcJc3RhcnQ7CisJdW5zaWduZWQJcGFnZV9jbnQ7CisJdW5zaWduZWQgbG9uZwkqbWFwOworfTsKKworc3RhdGljIHN0cnVjdCB7CisJdTMyCQliYXNlOworCisJc3RydWN0IG9tYXBmYl9tZW1fZGVzYwltZW1fZGVzYzsKKwlzdHJ1Y3QgcmVzbWFwCQkqcmVzX21hcFtESVNQQ19NRU1UWVBFX05VTV07CisJYXRvbWljX3QJCW1hcF9jb3VudFtPTUFQRkJfUExBTkVfTlVNXTsKKworCWRtYV9hZGRyX3QJcGFsZXR0ZV9wYWRkcjsKKwl2b2lkCQkqcGFsZXR0ZV92YWRkcjsKKworCWludAkJZXh0X21vZGU7CisKKwl1bnNpZ25lZCBsb25nCWVuYWJsZWRfaXJxczsKKwl2b2lkCQkoKmlycV9jYWxsYmFjaykodm9pZCAqKTsKKwl2b2lkCQkqaXJxX2NhbGxiYWNrX2RhdGE7CisJc3RydWN0IGNvbXBsZXRpb24JZnJhbWVfZG9uZTsKKworCWludAkJZmlyX2hpbmNbT01BUEZCX1BMQU5FX05VTV07CisJaW50CQlmaXJfdmluY1tPTUFQRkJfUExBTkVfTlVNXTsKKworCXN0cnVjdCBjbGsJKmRzc19pY2ssICpkc3MxX2ZjazsKKwlzdHJ1Y3QgY2xrCSpkc3NfNTRtX2ZjazsKKworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCXVwZGF0ZV9tb2RlOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldjsKKworCXN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5CWNvbG9yX2tleTsKK30gZGlzcGM7CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9sY2RfY2xvY2tzKGludCBlbmFibGUpOworCitzdGF0aWMgdm9pZCBpbmxpbmUgZGlzcGNfd3JpdGVfcmVnKGludCBpZHgsIHUzMiB2YWwpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgZGlzcGMuYmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyB1MzIgaW5saW5lIGRpc3BjX3JlYWRfcmVnKGludCBpZHgpCit7CisJdTMyIGwgPSBfX3Jhd19yZWFkbChkaXNwYy5iYXNlICsgaWR4KTsKKwlyZXR1cm4gbDsKK30KKworLyogU2VsZWN0IFJGQkkgb3IgYnlwYXNzIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9yZmJpX21vZGUoaW50IGVuYWJsZSkKK3sKKwl1MzIgbDsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MKTsKKwkvKiBFbmFibGUgUkZCSSwgR1BJTzAvMSAqLworCWwgJj0gfigoMSA8PCAxMSkgfCAoMSA8PCAxNSkgfCAoMSA8PCAxNikpOworCWwgfD0gZW5hYmxlID8gKDEgPDwgMTEpIDogMDsKKwkvKiBSRkJJIEVuOiBHUElPMC8xPTEwICBSRkJJIERpczogR1BJTzAvMT0xMSAqLworCWwgfD0gMSA8PCAxNTsKKwlsIHw9IGVuYWJsZSA/IDAgOiAoMSA8PCAxNik7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wsIGwpOworCisJLyogU2V0IGJ5cGFzcyBtb2RlIGluIFJGQkkgbW9kdWxlICovCisJbCA9IF9fcmF3X3JlYWRsKGlvX3AydihSRkJJX0NPTlRST0wpKTsKKwlsIHw9IGVuYWJsZSA/IDAgOiAoMSA8PCAxKTsKKwlfX3Jhd193cml0ZWwobCwgaW9fcDJ2KFJGQklfQ09OVFJPTCkpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbGNkX2RhdGFfbGluZXMoaW50IGRhdGFfbGluZXMpCit7CisJdTMyIGw7CisJaW50IGNvZGUgPSAwOworCisJc3dpdGNoIChkYXRhX2xpbmVzKSB7CisJY2FzZSAxMjoKKwkJY29kZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWNvZGUgPSAxOworCQlicmVhazsKKwljYXNlIDE4OgorCQljb2RlID0gMjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJY29kZSA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MKTsKKwlsICY9IH4oMHgwMyA8PCA4KTsKKwlsIHw9IGNvZGUgPDwgODsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfQ09OVFJPTCwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sb2FkX21vZGUoaW50IG1vZGUpCit7CisJQlVHX09OKG1vZGUgJiB+KERJU1BDX0xPQURfQ0xVVF9PTkxZIHwgRElTUENfTE9BRF9GUkFNRV9PTkxZIHwKKwkJCURJU1BDX0xPQURfQ0xVVF9PTkNFX0ZSQU1FKSk7CisJTU9EX1JFR19GTEQoRElTUENfQ09ORklHLCAweDAzIDw8IDEsIG1vZGUgPDwgMSk7Cit9CisKK3ZvaWQgb21hcF9kaXNwY19zZXRfbGNkX3NpemUoaW50IHgsIGludCB5KQoreworCUJVR19PTigoeCA+ICgxIDw8IDExKSkgfHwgKHkgPiAoMSA8PCAxMSkpKTsKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19TSVpFX0xDRCwgRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKSwKKwkJCSgoeSAtIDEpIDw8IDE2KSB8ICh4IC0gMSkpOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX3NldF9sY2Rfc2l6ZSk7CisKK3ZvaWQgb21hcF9kaXNwY19zZXRfZGlnaXRfc2l6ZShpbnQgeCwgaW50IHkpCit7CisJQlVHX09OKCh4ID4gKDEgPDwgMTEpKSB8fCAoeSA+ICgxIDw8IDExKSkpOworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKERJU1BDX1NJWkVfRElHLCBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLAorCQkJKCh5IC0gMSkgPDwgMTYpIHwgKHggLSAxKSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfc2V0X2RpZ2l0X3NpemUpOworCitzdGF0aWMgdm9pZCBzZXR1cF9wbGFuZV9maWZvKGludCBwbGFuZSwgaW50IGV4dF9tb2RlKQoreworCWNvbnN0IHUzMiBmdHJzX3JlZ1tdID0geyBESVNQQ19HRlhfRklGT19USFJFU0hPTEQsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0ZJRk9fVEhSRVNIT0xELAorCQkJICAgICAgICBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfRklGT19USFJFU0hPTEQgfTsKKwljb25zdCB1MzIgZnN6X3JlZ1tdID0geyBESVNQQ19HRlhfRklGT19TSVpFX1NUQVRVUywKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklGT19TSVpFX1NUQVRVUywKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfRklGT19TSVpFX1NUQVRVUyB9OworCWludCBsb3csIGhpZ2g7CisJdTMyIGw7CisKKwlCVUdfT04ocGxhbmUgPiAyKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhmc3pfcmVnW3BsYW5lXSk7CisJbCAmPSBGTERfTUFTSygwLCA5KTsKKwlpZiAoZXh0X21vZGUpIHsKKwkJbG93ID0gbCAqIDMgLyA0OworCQloaWdoID0gbDsKKwl9IGVsc2UgeworCQlsb3cgPSBsIC8gNDsKKwkJaGlnaCA9IGwgKiAzIC8gNDsKKwl9CisJTU9EX1JFR19GTEQoZnRyc19yZWdbcGxhbmVdLCBGTERfTUFTSygxNiwgOSkgfCBGTERfTUFTSygwLCA5KSwKKwkJCShoaWdoIDw8IDE2KSB8IGxvdyk7Cit9CisKK3ZvaWQgb21hcF9kaXNwY19lbmFibGVfbGNkX291dChpbnQgZW5hYmxlKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKERJU1BDX0NPTlRST0wsIDEsIGVuYWJsZSA/IDEgOiAwKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19lbmFibGVfbGNkX291dCk7CisKK3ZvaWQgb21hcF9kaXNwY19lbmFibGVfZGlnaXRfb3V0KGludCBlbmFibGUpCit7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfQ09OVFJPTCwgMSA8PCAxLCBlbmFibGUgPyAxIDw8IDEgOiAwKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19lbmFibGVfZGlnaXRfb3V0KTsKKworc3RhdGljIGlubGluZSBpbnQgX3NldHVwX3BsYW5lKGludCBwbGFuZSwgaW50IGNoYW5uZWxfb3V0LAorCQkJCSAgdTMyIHBhZGRyLCBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSAgaW50IHBvc194LCBpbnQgcG9zX3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgIGludCBjb2xvcl9tb2RlKQoreworCWNvbnN0IHUzMiBhdF9yZWdbXSA9IHsgRElTUENfR0ZYX0FUVFJJQlVURVMsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMsCisJCQkgICAgICAgIERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTIH07CisJY29uc3QgdTMyIGJhX3JlZ1tdID0geyBESVNQQ19HRlhfQkEwLCBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfQkEwLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9CQTAgfTsKKwljb25zdCB1MzIgcHNfcmVnW10gPSB7IERJU1BDX0dGWF9QT1NJVElPTiwKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfUE9TSVRJT04sCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX1BPU0lUSU9OIH07CisJY29uc3QgdTMyIHN6X3JlZ1tdID0geyBESVNQQ19HRlhfU0laRSwKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfUElDVFVSRV9TSVpFLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9QSUNUVVJFX1NJWkUgfTsKKwljb25zdCB1MzIgcmlfcmVnW10gPSB7IERJU1BDX0dGWF9ST1dfSU5DLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9ST1dfSU5DLAorCQkJICAgICAgICBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfUk9XX0lOQyB9OworCWNvbnN0IHUzMiB2c19yZWdbXSA9IHsgMCwgRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1NJWkUsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX1NJWkUgfTsKKworCWludCBjaG91dF9zaGlmdCwgYnVyc3Rfc2hpZnQ7CisJaW50IGNob3V0X3ZhbDsKKwlpbnQgY29sb3JfY29kZTsKKwlpbnQgYnBwOworCWludCBjY29udl9lbjsKKwlpbnQgc2V0X3ZzaXplOworCXUzMiBsOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoZGlzcGMuZmJkZXYtPmRldiwgInBsYW5lICVkIGNoYW5uZWwgJWQgcGFkZHIgJSMwOHggc2NyX3dpZHRoICVkIgorCQkgICAgIiBwb3NfeCAlZCBwb3NfeSAlZCB3aWR0aCAlZCBoZWlnaHQgJWQgY29sb3JfbW9kZSAlZFxuIiwKKwkJICAgIHBsYW5lLCBjaGFubmVsX291dCwgcGFkZHIsIHNjcmVlbl93aWR0aCwgcG9zX3gsIHBvc195LAorCQkgICAgd2lkdGgsIGhlaWdodCwgY29sb3JfbW9kZSk7CisjZW5kaWYKKworCXNldF92c2l6ZSA9IDA7CisJc3dpdGNoIChwbGFuZSkgeworCWNhc2UgT01BUEZCX1BMQU5FX0dGWDoKKwkJYnVyc3Rfc2hpZnQgPSA2OworCQljaG91dF9zaGlmdCA9IDg7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1BMQU5FX1ZJRDE6CisJY2FzZSBPTUFQRkJfUExBTkVfVklEMjoKKwkJYnVyc3Rfc2hpZnQgPSAxNDsKKwkJY2hvdXRfc2hpZnQgPSAxNjsKKwkJc2V0X3ZzaXplID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChjaGFubmVsX291dCkgeworCWNhc2UgT01BUEZCX0NIQU5ORUxfT1VUX0xDRDoKKwkJY2hvdXRfdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ0hBTk5FTF9PVVRfRElHSVQ6CisJCWNob3V0X3ZhbCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNjb252X2VuID0gMDsKKwlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I1NjU6CisJCWNvbG9yX2NvZGUgPSBESVNQQ19SR0JfMTZfQlBQOworCQlicHAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQlpZiAocGxhbmUgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQljb2xvcl9jb2RlID0gRElTUENfVVlWWV80MjI7CisJCWNjb252X2VuID0gMTsKKwkJYnBwID0gMTY7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVWTQyMjoKKwkJaWYgKHBsYW5lID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY29sb3JfY29kZSA9IERJU1BDX1lVVjJfNDIyOworCQljY29udl9lbiA9IDE7CisJCWJwcCA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoYXRfcmVnW3BsYW5lXSk7CisKKwlsICY9IH4oMHgwZiA8PCAxKTsKKwlsIHw9IGNvbG9yX2NvZGUgPDwgMTsKKwlsICY9IH4oMSA8PCA5KTsKKwlsIHw9IGNjb252X2VuIDw8IDk7CisKKwlsICY9IH4oMHgwMyA8PCBidXJzdF9zaGlmdCk7CisJbCB8PSBESVNQQ19CVVJTVF84eDMyIDw8IGJ1cnN0X3NoaWZ0OworCisJbCAmPSB+KDEgPDwgY2hvdXRfc2hpZnQpOworCWwgfD0gY2hvdXRfdmFsIDw8IGNob3V0X3NoaWZ0OworCisJZGlzcGNfd3JpdGVfcmVnKGF0X3JlZ1twbGFuZV0sIGwpOworCisJZGlzcGNfd3JpdGVfcmVnKGJhX3JlZ1twbGFuZV0sIHBhZGRyKTsKKwlNT0RfUkVHX0ZMRChwc19yZWdbcGxhbmVdLAorCQkgICAgRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKSwgKHBvc195IDw8IDE2KSB8IHBvc194KTsKKworCU1PRF9SRUdfRkxEKHN6X3JlZ1twbGFuZV0sIEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSksCisJCQkoKGhlaWdodCAtIDEpIDw8IDE2KSB8ICh3aWR0aCAtIDEpKTsKKworCWlmIChzZXRfdnNpemUpIHsKKwkJLyogU2V0IHZpZGVvIHNpemUgaWYgc2V0X3NjYWxlIGhhc24ndCBzZXQgaXQgKi8KKwkJaWYgKCFkaXNwYy5maXJfdmluY1twbGFuZV0pCisJCQlNT0RfUkVHX0ZMRCh2c19yZWdbcGxhbmVdLAorCQkJCUZMRF9NQVNLKDE2LCAxMSksIChoZWlnaHQgLSAxKSA8PCAxNik7CisJCWlmICghZGlzcGMuZmlyX2hpbmNbcGxhbmVdKQorCQkJTU9EX1JFR19GTEQodnNfcmVnW3BsYW5lXSwKKwkJCQlGTERfTUFTSygwLCAxMSksIHdpZHRoIC0gMSk7CisJfQorCisJZGlzcGNfd3JpdGVfcmVnKHJpX3JlZ1twbGFuZV0sIChzY3JlZW5fd2lkdGggLSB3aWR0aCkgKiBicHAgLyA4ICsgMSk7CisKKwlyZXR1cm4gaGVpZ2h0ICogc2NyZWVuX3dpZHRoICogYnBwIC8gODsKK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX3NldHVwX3BsYW5lKGludCBwbGFuZSwgaW50IGNoYW5uZWxfb3V0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSAgaW50IHBvc194LCBpbnQgcG9zX3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgIGludCBjb2xvcl9tb2RlKQoreworCXUzMiBwYWRkcjsKKwlpbnQgcjsKKworCWlmICgodW5zaWduZWQpcGxhbmUgPiBkaXNwYy5tZW1fZGVzYy5yZWdpb25fY250KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwYWRkciA9IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbltwbGFuZV0ucGFkZHIgKyBvZmZzZXQ7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJciA9IF9zZXR1cF9wbGFuZShwbGFuZSwgY2hhbm5lbF9vdXQsIHBhZGRyLAorCQkJc2NyZWVuX3dpZHRoLAorCQkJcG9zX3gsIHBvc195LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcl9tb2RlKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZmlyaF9yZWcoaW50IHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCit7CisJdTMyIGJhc2U7CisKKwlpZiAocGxhbmUgPT0gMSkKKwkJYmFzZSA9IERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSVJfQ09FRl9IMDsKKwllbHNlCisJCWJhc2UgPSBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfRklSX0NPRUZfSDA7CisJZGlzcGNfd3JpdGVfcmVnKGJhc2UgKyByZWcgKiA4LAl2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2Zpcmh2X3JlZyhpbnQgcGxhbmUsIGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgYmFzZTsKKworCWlmIChwbGFuZSA9PSAxKQorCQliYXNlID0gRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0ZJUl9DT0VGX0hWMDsKKwllbHNlCisJCWJhc2UgPSBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfRklSX0NPRUZfSFYwOworCWRpc3BjX3dyaXRlX3JlZyhiYXNlICsgcmVnICogOCwJdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBzZXRfdXBzYW1wbGluZ19jb2VmX3RhYmxlKGludCBwbGFuZSkKK3sKKwljb25zdCB1MzIgY29lZltdWzJdID0geworCQl7IDB4MDA4MDAwMDAsIDB4MDA4MDAwMDAgfSwKKwkJeyAweDBEN0NGODAwLCAweDAzN0IwMkZGIH0sCisJCXsgMHgxRTcwRjVGRiwgMHgwQzZGMDVGRSB9LAorCQl7IDB4MzM1RkY1RkUsIDB4MjA1OTA3RkIgfSwKKwkJeyAweEY3NDk0OUY3LCAweDAwNDA0MDAwIH0sCisJCXsgMHhGNTVGMzNGQiwgMHgwNzU5MjBGRSB9LAorCQl7IDB4RjU3MDFFRkUsIDB4MDU2RjBDRkYgfSwKKwkJeyAweEY4N0MwREZGLCAweDAyN0IwMzAwIH0sCisJfTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJd3JpdGVfZmlyaF9yZWcocGxhbmUsIGksIGNvZWZbaV1bMF0pOworCQl3cml0ZV9maXJodl9yZWcocGxhbmUsIGksIGNvZWZbaV1bMV0pOworCX0KK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX3NldF9zY2FsZShpbnQgcGxhbmUsCisJCQkJaW50IG9yaWdfd2lkdGgsIGludCBvcmlnX2hlaWdodCwKKwkJCQlpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCkKK3sKKwljb25zdCB1MzIgYXRfcmVnW10gID0geyAwLCBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUywKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUyB9OworCWNvbnN0IHUzMiB2c19yZWdbXSAgPSB7IDAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9TSVpFLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9TSVpFIH07CisJY29uc3QgdTMyIGZpcl9yZWdbXSA9IHsgMCwgRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0ZJUiwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfRklSIH07CisKKwl1MzIgbDsKKwlpbnQgZmlyX2hpbmM7CisJaW50IGZpcl92aW5jOworCisJaWYgKCh1bnNpZ25lZClwbGFuZSA+IE9NQVBGQl9QTEFORV9OVU0pCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBsYW5lID09IE9NQVBGQl9QTEFORV9HRlggJiYKKwkgICAgKG91dF93aWR0aCAhPSBvcmlnX3dpZHRoIHx8IG91dF9oZWlnaHQgIT0gb3JpZ19oZWlnaHQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCWlmIChvcmlnX3dpZHRoIDwgb3V0X3dpZHRoKSB7CisJCS8qCisJCSAqIFVwc2FtcGxpbmcuCisJCSAqIEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgc2NhbGUgYm90aCBkaW1lbnNpb25zIGluIG9uZSB3YXkuCisJCSAqLworCQlpZiAob3JpZ19oZWlnaHQgPiBvdXRfaGVpZ2h0IHx8CisJCSAgICBvcmlnX3dpZHRoICogOCA8IG91dF93aWR0aCB8fAorCQkgICAgb3JpZ19oZWlnaHQgKiA4IDwgb3V0X2hlaWdodCkgeworCQkJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzZXRfdXBzYW1wbGluZ19jb2VmX3RhYmxlKHBsYW5lKTsKKwl9IGVsc2UgaWYgKG9yaWdfd2lkdGggPiBvdXRfd2lkdGgpIHsKKwkJLyogRG93bnNhbXBsaW5nIG5vdCB5ZXQgc3VwcG9ydGVkCisJCSovCisKKwkJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIW9yaWdfd2lkdGggfHwgb3JpZ193aWR0aCA9PSBvdXRfd2lkdGgpCisJCWZpcl9oaW5jID0gMDsKKwllbHNlCisJCWZpcl9oaW5jID0gMTAyNCAqIG9yaWdfd2lkdGggLyBvdXRfd2lkdGg7CisJaWYgKCFvcmlnX2hlaWdodCB8fCBvcmlnX2hlaWdodCA9PSBvdXRfaGVpZ2h0KQorCQlmaXJfdmluYyA9IDA7CisJZWxzZQorCQlmaXJfdmluYyA9IDEwMjQgKiBvcmlnX2hlaWdodCAvIG91dF9oZWlnaHQ7CisJZGlzcGMuZmlyX2hpbmNbcGxhbmVdID0gZmlyX2hpbmM7CisJZGlzcGMuZmlyX3ZpbmNbcGxhbmVdID0gZmlyX3ZpbmM7CisKKwlNT0RfUkVHX0ZMRChmaXJfcmVnW3BsYW5lXSwKKwkJICAgIEZMRF9NQVNLKDE2LCAxMikgfCBGTERfTUFTSygwLCAxMiksCisJCSAgICAoKGZpcl92aW5jICYgNDA5NSkgPDwgMTYpIHwKKwkJICAgIChmaXJfaGluYyAmIDQwOTUpKTsKKworCWRldl9kYmcoZGlzcGMuZmJkZXYtPmRldiwgIm91dF93aWR0aCAlZCBvdXRfaGVpZ2h0ICVkIG9yaWdfd2lkdGggJWQgIgorCQkib3JpZ19oZWlnaHQgJWQgZmlyX2hpbmMgICVkIGZpcl92aW5jICVkXG4iLAorCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAorCQlmaXJfaGluYywgZmlyX3ZpbmMpOworCisJTU9EX1JFR19GTEQodnNfcmVnW3BsYW5lXSwKKwkJICAgIEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSksCisJCSAgICAoKG91dF9oZWlnaHQgLSAxKSA8PCAxNikgfCAob3V0X3dpZHRoIC0gMSkpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKGF0X3JlZ1twbGFuZV0pOworCWwgJj0gfigweDAzIDw8IDUpOworCWwgfD0gZmlyX2hpbmMgPyAoMSA8PCA1KSA6IDA7CisJbCB8PSBmaXJfdmluYyA/ICgxIDw8IDYpIDogMDsKKwlkaXNwY193cml0ZV9yZWcoYXRfcmVnW3BsYW5lXSwgbCk7CisKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX2VuYWJsZV9wbGFuZShpbnQgcGxhbmUsIGludCBlbmFibGUpCit7CisJY29uc3QgdTMyIGF0X3JlZ1tdID0geyBESVNQQ19HRlhfQVRUUklCVVRFUywKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUywKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUyB9OworCWlmICgodW5zaWduZWQgaW50KXBsYW5lID4gZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChhdF9yZWdbcGxhbmVdLCAxLCBlbmFibGUgPyAxIDogMCk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX3NldF9jb2xvcl9rZXkoc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgKmNrKQoreworCXUzMiBkZl9yZWcsIHRyX3JlZzsKKwlpbnQgc2hpZnQsIHZhbDsKKworCXN3aXRjaCAoY2stPmNoYW5uZWxfb3V0KSB7CisJY2FzZSBPTUFQRkJfQ0hBTk5FTF9PVVRfTENEOgorCQlkZl9yZWcgPSBESVNQQ19ERUZBVUxUX0NPTE9SMDsKKwkJdHJfcmVnID0gRElTUENfVFJBTlNfQ09MT1IwOworCQlzaGlmdCA9IDEwOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DSEFOTkVMX09VVF9ESUdJVDoKKwkJZGZfcmVnID0gRElTUENfREVGQVVMVF9DT0xPUjE7CisJCXRyX3JlZyA9IERJU1BDX1RSQU5TX0NPTE9SMTsKKwkJc2hpZnQgPSAxMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN3aXRjaCAoY2stPmtleV90eXBlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfS0VZX0RJU0FCTEVEOgorCQl2YWwgPSAwOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9LRVlfR0ZYX0RTVDoKKwkJdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfS0VZX1ZJRF9TUkM6CisJCXZhbCA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05GSUcsIEZMRF9NQVNLKHNoaWZ0LCAyKSwgdmFsIDw8IHNoaWZ0KTsKKworCWlmICh2YWwgIT0gMCkKKwkJZGlzcGNfd3JpdGVfcmVnKHRyX3JlZywgY2stPnRyYW5zX2tleSk7CisJZGlzcGNfd3JpdGVfcmVnKGRmX3JlZywgY2stPmJhY2tncm91bmQpOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCisJZGlzcGMuY29sb3Jfa2V5ID0gKmNrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19nZXRfY29sb3Jfa2V5KHN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjaykKK3sKKwkqY2sgPSBkaXNwYy5jb2xvcl9rZXk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfcGFsZXR0ZSh2b2lkKQoreworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0X3VwZGF0ZV9tb2RlKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaW50IHIgPSAwOworCisJaWYgKG1vZGUgIT0gZGlzcGMudXBkYXRlX21vZGUpIHsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgorCQkJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJCQlvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KDEpOworCQkJZGlzcGMudXBkYXRlX21vZGUgPSBtb2RlOworCQkJYnJlYWs7CisJCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJCWluaXRfY29tcGxldGlvbigmZGlzcGMuZnJhbWVfZG9uZSk7CisJCQlvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KDApOworCQkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRpc3BjLmZyYW1lX2RvbmUsCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpIHsKKwkJCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsCisJCQkJCSAidGltZW91dCB3YWl0aW5nIGZvciBGUkFNRSBET05FXG4iKTsKKwkJCX0KKwkJCWRpc3BjLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwkJCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyID0gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2Rpc3BjX2dldF9jYXBzKGludCBwbGFuZSwgc3RydWN0IG9tYXBmYl9jYXBzICpjYXBzKQoreworCWNhcHMtPmN0cmwgfD0gT01BUEZCX0NBUFNfUExBTkVfUkVMT0NBVEVfTUVNOworCWlmIChwbGFuZSA+IDApCisJCWNhcHMtPmN0cmwgfD0gT01BUEZCX0NBUFNfUExBTkVfU0NBTEU7CisJY2Fwcy0+cGxhbmVfY29sb3IgfD0gKDEgPDwgT01BUEZCX0NPTE9SX1JHQjU2NSkgfAorCQkJICAgICAoMSA8PCBPTUFQRkJfQ09MT1JfWVVWNDIyKSB8CisJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9ZVVk0MjIpOworCWlmIChwbGFuZSA9PSAwKQorCQljYXBzLT5wbGFuZV9jb2xvciB8PSAoMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQKSB8CisJCQkJICAgICAoMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF80QlBQKSB8CisJCQkJICAgICAoMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQKSB8CisJCQkJICAgICAoMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQKSB8CisJCQkJICAgICAoMSA8PCBPTUFQRkJfQ09MT1JfUkdCNDQ0KTsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG9tYXBfZGlzcGNfZ2V0X3VwZGF0ZV9tb2RlKHZvaWQpCit7CisJcmV0dXJuIGRpc3BjLnVwZGF0ZV9tb2RlOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9jb2xvcl9jb252X2NvZWYodm9pZCkKK3sKKwl1MzIgbWFzayA9IEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSk7CisJaW50IGNmMV9yZWcgPSBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfQ09OVl9DT0VGMDsKKwlpbnQgY2YyX3JlZyA9IERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9DT05WX0NPRUYwOworCWludCBhdDFfcmVnID0gRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVM7CisJaW50IGF0Ml9yZWcgPSBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUzsKKwljb25zdCBzdHJ1Y3QgY29sb3JfY29udl9jb2VmIHsKKwkJaW50ICByeSwgIHJjciwgIHJjYiwgICBneSwgIGdjciwgIGdjYiwgICBieSwgIGJjciwgIGJjYjsKKwkJaW50ICBmdWxsX3JhbmdlOworCX0gIGN0YmxfYnQ2MDFfNSA9IHsKKwkJICAgIDI5OCwgIDQwOSwgICAgMCwgIDI5OCwgLTIwOCwgLTEwMCwgIDI5OCwgICAgMCwgIDUxNywgMCwKKwl9OworCWNvbnN0IHN0cnVjdCBjb2xvcl9jb252X2NvZWYgKmN0OworI2RlZmluZSBDVkFMKHgsIHkpCSgoKHggJiAyMDQ3KSA8PCAxNikgfCAoeSAmIDIwNDcpKQorCisJY3QgPSAmY3RibF9idDYwMV81OworCisJTU9EX1JFR19GTEQoY2YxX3JlZywJCW1hc2ssCUNWQUwoY3QtPnJjciwgY3QtPnJ5KSk7CisJTU9EX1JFR19GTEQoY2YxX3JlZyArIDQsCW1hc2ssCUNWQUwoY3QtPmd5LCAgY3QtPnJjYikpOworCU1PRF9SRUdfRkxEKGNmMV9yZWcgKyA4LAltYXNrLAlDVkFMKGN0LT5nY2IsIGN0LT5nY3IpKTsKKwlNT0RfUkVHX0ZMRChjZjFfcmVnICsgMTIsCW1hc2ssCUNWQUwoY3QtPmJjciwgY3QtPmJ5KSk7CisJTU9EX1JFR19GTEQoY2YxX3JlZyArIDE2LAltYXNrLAlDVkFMKDAsCSAgICAgIGN0LT5iY2IpKTsKKworCU1PRF9SRUdfRkxEKGNmMl9yZWcsCQltYXNrLAlDVkFMKGN0LT5yY3IsIGN0LT5yeSkpOworCU1PRF9SRUdfRkxEKGNmMl9yZWcgKyA0LAltYXNrLAlDVkFMKGN0LT5neSwgIGN0LT5yY2IpKTsKKwlNT0RfUkVHX0ZMRChjZjJfcmVnICsgOCwJbWFzaywJQ1ZBTChjdC0+Z2NiLCBjdC0+Z2NyKSk7CisJTU9EX1JFR19GTEQoY2YyX3JlZyArIDEyLAltYXNrLAlDVkFMKGN0LT5iY3IsIGN0LT5ieSkpOworCU1PRF9SRUdfRkxEKGNmMl9yZWcgKyAxNiwJbWFzaywJQ1ZBTCgwLAkgICAgICBjdC0+YmNiKSk7CisjdW5kZWYgQ1ZBTAorCisJTU9EX1JFR19GTEQoYXQxX3JlZywgKDEgPDwgMTEpLCBjdC0+ZnVsbF9yYW5nZSk7CisJTU9EX1JFR19GTEQoYXQyX3JlZywgKDEgPDwgMTEpLCBjdC0+ZnVsbF9yYW5nZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfY2tfZGl2KGludCBpc190ZnQsIGludCBwY2ssIGludCAqbGNrX2RpdiwgaW50ICpwY2tfZGl2KQoreworCXVuc2lnbmVkIGxvbmcgZmNrLCBsY2s7CisKKwkqbGNrX2RpdiA9IDE7CisJcGNrID0gbWF4KDEsIHBjayk7CisJZmNrID0gY2xrX2dldF9yYXRlKGRpc3BjLmRzczFfZmNrKTsKKwlsY2sgPSBmY2s7CisJKnBja19kaXYgPSAobGNrICsgcGNrIC0gMSkgLyBwY2s7CisJaWYgKGlzX3RmdCkKKwkJKnBja19kaXYgPSBtYXgoMiwgKnBja19kaXYpOworCWVsc2UKKwkJKnBja19kaXYgPSBtYXgoMywgKnBja19kaXYpOworCWlmICgqcGNrX2RpdiA+IDI1NSkgeworCQkqcGNrX2RpdiA9IDI1NTsKKwkJbGNrID0gcGNrICogKnBja19kaXY7CisJCSpsY2tfZGl2ID0gZmNrIC8gbGNrOworCQlCVUdfT04oKmxja19kaXYgPCAxKTsKKwkJaWYgKCpsY2tfZGl2ID4gMjU1KSB7CisJCQkqbGNrX2RpdiA9IDI1NTsKKwkJCWRldl93YXJuKGRpc3BjLmZiZGV2LT5kZXYsICJwaXhjbG9jayAlZCBrSHogdG9vIGxvdy5cbiIsCisJCQkJIHBjayAvIDEwMDApOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfbGNkX3RmdF9tb2RlKGludCBlbmFibGUpCit7CisJdTMyIG1hc2s7CisKKwltYXNrID0gMSA8PCAzOworCU1PRF9SRUdfRkxEKERJU1BDX0NPTlRST0wsIG1hc2ssIGVuYWJsZSA/IG1hc2sgOiAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2xjZF90aW1pbmdzKHZvaWQpCit7CisJdTMyIGw7CisJaW50IGxja19kaXYsIHBja19kaXY7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBkaXNwYy5mYmRldi0+cGFuZWw7CisJaW50IGlzX3RmdCA9IHBhbmVsLT5jb25maWcgJiBPTUFQX0xDRENfUEFORUxfVEZUOworCXVuc2lnbmVkIGxvbmcgZmNrOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1RJTUlOR19IKTsKKwlsICY9IH4oRkxEX01BU0soMCwgNikgfCBGTERfTUFTSyg4LCA4KSB8IEZMRF9NQVNLKDIwLCA4KSk7CisJbCB8PSAoIG1heCgxLCAobWluKDY0LCAgcGFuZWwtPmhzdykpKSAtIDEgKSA8PCAwOworCWwgfD0gKCBtYXgoMSwgKG1pbigyNTYsIHBhbmVsLT5oZnApKSkgLSAxICkgPDwgODsKKwlsIHw9ICggbWF4KDEsIChtaW4oMjU2LCBwYW5lbC0+aGJwKSkpIC0gMSApIDw8IDIwOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19USU1JTkdfSCwgbCk7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfVElNSU5HX1YpOworCWwgJj0gfihGTERfTUFTSygwLCA2KSB8IEZMRF9NQVNLKDgsIDgpIHwgRkxEX01BU0soMjAsIDgpKTsKKwlsIHw9ICggbWF4KDEsIChtaW4oNjQsICBwYW5lbC0+dnN3KSkpIC0gMSApIDw8IDA7CisJbCB8PSAoIG1heCgwLCAobWluKDI1NSwgcGFuZWwtPnZmcCkpKSAtIDAgKSA8PCA4OworCWwgfD0gKCBtYXgoMCwgKG1pbigyNTUsIHBhbmVsLT52YnApKSkgLSAwICkgPDwgMjA7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1RJTUlOR19WLCBsKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19QT0xfRlJFUSk7CisJbCAmPSB+RkxEX01BU0soMTIsIDYpOworCWwgfD0gKHBhbmVsLT5jb25maWcgJiBPTUFQX0xDRENfU0lHTkFMX01BU0spIDw8IDEyOworCWwgfD0gcGFuZWwtPmFjYiAmIDB4ZmY7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1BPTF9GUkVRLCBsKTsKKworCWNhbGNfY2tfZGl2KGlzX3RmdCwgcGFuZWwtPnBpeGVsX2Nsb2NrICogMTAwMCwgJmxja19kaXYsICZwY2tfZGl2KTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19ESVZJU09SKTsKKwlsICY9IH4oRkxEX01BU0soMTYsIDgpIHwgRkxEX01BU0soMCwgOCkpOworCWwgfD0gKGxja19kaXYgPDwgMTYpIHwgKHBja19kaXYgPDwgMCk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0RJVklTT1IsIGwpOworCisJLyogdXBkYXRlIHBhbmVsIGluZm8gd2l0aCB0aGUgZXhhY3QgY2xvY2sgKi8KKwlmY2sgPSBjbGtfZ2V0X3JhdGUoZGlzcGMuZHNzMV9mY2spOworCXBhbmVsLT5waXhlbF9jbG9jayA9IGZjayAvIGxja19kaXYgLyBwY2tfZGl2IC8gMTAwMDsKK30KKworaW50IG9tYXBfZGlzcGNfcmVxdWVzdF9pcnEodm9pZCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgciA9IDA7CisKKwlCVUdfT04oY2FsbGJhY2sgPT0gTlVMTCk7CisKKwlpZiAoZGlzcGMuaXJxX2NhbGxiYWNrKQorCQlyID0gLUVCVVNZOworCWVsc2UgeworCQlkaXNwYy5pcnFfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwkJZGlzcGMuaXJxX2NhbGxiYWNrX2RhdGEgPSBkYXRhOworCX0KKworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX3JlcXVlc3RfaXJxKTsKKwordm9pZCBvbWFwX2Rpc3BjX2VuYWJsZV9pcnFzKGludCBpcnFfbWFzaykKK3sKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlkaXNwYy5lbmFibGVkX2lycXMgPSBpcnFfbWFzazsKKwlpcnFfbWFzayB8PSBESVNQQ19JUlFfTUFTS19FUlJPUjsKKwlNT0RfUkVHX0ZMRChESVNQQ19JUlFFTkFCTEUsIDB4N2ZmZiwgaXJxX21hc2spOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX2VuYWJsZV9pcnFzKTsKKwordm9pZCBvbWFwX2Rpc3BjX2Rpc2FibGVfaXJxcyhpbnQgaXJxX21hc2spCit7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJZGlzcGMuZW5hYmxlZF9pcnFzICY9IH5pcnFfbWFzazsKKwlpcnFfbWFzayAmPSB+RElTUENfSVJRX01BU0tfRVJST1I7CisJTU9EX1JFR19GTEQoRElTUENfSVJRRU5BQkxFLCAweDdmZmYsIGlycV9tYXNrKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19kaXNhYmxlX2lycXMpOworCit2b2lkIG9tYXBfZGlzcGNfZnJlZV9pcnEodm9pZCkKK3sKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlvbWFwX2Rpc3BjX2Rpc2FibGVfaXJxcyhESVNQQ19JUlFfTUFTS19BTEwpOworCWRpc3BjLmlycV9jYWxsYmFjayA9IE5VTEw7CisJZGlzcGMuaXJxX2NhbGxiYWNrX2RhdGEgPSBOVUxMOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX2ZyZWVfaXJxKTsKKworc3RhdGljIGlycXJldHVybl90IG9tYXBfZGlzcGNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXUzMiBzdGF0ID0gZGlzcGNfcmVhZF9yZWcoRElTUENfSVJRU1RBVFVTKTsKKworCWlmIChzdGF0ICYgRElTUENfSVJRX0ZSQU1FTUFTSykKKwkJY29tcGxldGUoJmRpc3BjLmZyYW1lX2RvbmUpOworCisJaWYgKHN0YXQgJiBESVNQQ19JUlFfTUFTS19FUlJPUikgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7CisJCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJpcnEgZXJyb3Igc3RhdHVzICUwNHhcbiIsCisJCQkJc3RhdCAmIDB4N2ZmZik7CisJCX0KKwl9CisKKwlpZiAoKHN0YXQgJiBkaXNwYy5lbmFibGVkX2lycXMpICYmIGRpc3BjLmlycV9jYWxsYmFjaykKKwkJZGlzcGMuaXJxX2NhbGxiYWNrKGRpc3BjLmlycV9jYWxsYmFja19kYXRhKTsKKworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19JUlFTVEFUVVMsIHN0YXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGdldF9kc3NfY2xvY2tzKHZvaWQpCit7CisJaWYgKElTX0VSUigoZGlzcGMuZHNzX2ljayA9IGNsa19nZXQoZGlzcGMuZmJkZXYtPmRldiwgImRzc19pY2siKSkpKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBkc3NfaWNrIik7CisJCXJldHVybiBQVFJfRVJSKGRpc3BjLmRzc19pY2spOworCX0KKworCWlmIChJU19FUlIoKGRpc3BjLmRzczFfZmNrID0gY2xrX2dldChkaXNwYy5mYmRldi0+ZGV2LCAiZHNzMV9mY2siKSkpKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBkc3MxX2ZjayIpOworCQljbGtfcHV0KGRpc3BjLmRzc19pY2spOworCQlyZXR1cm4gUFRSX0VSUihkaXNwYy5kc3MxX2Zjayk7CisJfQorCisJaWYgKElTX0VSUigoZGlzcGMuZHNzXzU0bV9mY2sgPQorCQkJCWNsa19nZXQoZGlzcGMuZmJkZXYtPmRldiwgImRzc181NG1fZmNrIikpKSkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzXzU0bV9mY2siKTsKKwkJY2xrX3B1dChkaXNwYy5kc3NfaWNrKTsKKwkJY2xrX3B1dChkaXNwYy5kc3MxX2Zjayk7CisJCXJldHVybiBQVFJfRVJSKGRpc3BjLmRzc181NG1fZmNrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2Rzc19jbG9ja3Modm9pZCkKK3sKKwljbGtfcHV0KGRpc3BjLmRzc181NG1fZmNrKTsKKwljbGtfcHV0KGRpc3BjLmRzczFfZmNrKTsKKwljbGtfcHV0KGRpc3BjLmRzc19pY2spOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfbGNkX2Nsb2NrcyhpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCWNsa19lbmFibGUoZGlzcGMuZHNzMV9mY2spOworCWVsc2UKKwkJY2xrX2Rpc2FibGUoZGlzcGMuZHNzMV9mY2spOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfaW50ZXJmYWNlX2Nsb2NrcyhpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCWNsa19lbmFibGUoZGlzcGMuZHNzX2ljayk7CisJZWxzZQorCQljbGtfZGlzYWJsZShkaXNwYy5kc3NfaWNrKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2RpZ2l0X2Nsb2NrcyhpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCWNsa19lbmFibGUoZGlzcGMuZHNzXzU0bV9mY2spOworCWVsc2UKKwkJY2xrX2Rpc2FibGUoZGlzcGMuZHNzXzU0bV9mY2spOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2Rpc3BjX3N1c3BlbmQodm9pZCkKK3sKKwlpZiAoZGlzcGMudXBkYXRlX21vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFKSB7CisJCWluaXRfY29tcGxldGlvbigmZGlzcGMuZnJhbWVfZG9uZSk7CisJCW9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoMCk7CisJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkaXNwYy5mcmFtZV9kb25lLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpIHsKKwkJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwKKwkJCQkidGltZW91dCB3YWl0aW5nIGZvciBGUkFNRSBET05FXG4iKTsKKwkJfQorCQllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfZGlzcGNfcmVzdW1lKHZvaWQpCit7CisJaWYgKGRpc3BjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwkJaWYgKCFkaXNwYy5leHRfbW9kZSkgeworCQkJc2V0X2xjZF90aW1pbmdzKCk7CisJCQlsb2FkX3BhbGV0dGUoKTsKKwkJfQorCQlvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KDEpOworCX0KK30KKworCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfdXBkYXRlX3dpbmRvdyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCSBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQkgdm9pZCAoKmNvbXBsZXRlX2NhbGxiYWNrKSh2b2lkICphcmcpLAorCQkJCSB2b2lkICpjb21wbGV0ZV9jYWxsYmFja19kYXRhKQoreworCXJldHVybiBkaXNwYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEID8gLUVOT0RFViA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbW1hcF9rZXJuKHN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmVnaW9uKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QJKmt2bWE7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0CXZtYTsKKwlwZ3Byb3RfdAkJcGdwcm90OworCXVuc2lnbmVkIGxvbmcJCXZhZGRyOworCisJa3ZtYSA9IGdldF92bV9hcmVhKHJlZ2lvbi0+c2l6ZSwgVk1fSU9SRU1BUCk7CisJaWYgKGt2bWEgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQga2VybmVsIHZtIGFyZWFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdm1hLnZtX21tID0gJmluaXRfbW07CisKKwl2YWRkciA9ICh1bnNpZ25lZCBsb25nKWt2bWEtPmFkZHI7CisKKwlwZ3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHBncHJvdF9rZXJuZWwpOworCXZtYS52bV9zdGFydCA9IHZhZGRyOworCXZtYS52bV9lbmQgPSB2YWRkciArIHJlZ2lvbi0+c2l6ZTsKKwlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKCZ2bWEsIHZhZGRyLCByZWdpb24tPnBhZGRyID4+IFBBR0VfU0hJRlQsCisJCQkgICByZWdpb24tPnNpemUsIHBncHJvdCkgPCAwKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImtlcm5lbCBtbWFwIGZvciBGQk1FTSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmVnaW9uLT52YWRkciA9ICh2b2lkICopdmFkZHI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbW1hcF91c2VyX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IHBsYW5lID0gKGludCl2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKworCWF0b21pY19pbmMoJmRpc3BjLm1hcF9jb3VudFtwbGFuZV0pOworfQorCitzdGF0aWMgdm9pZCBtbWFwX3VzZXJfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IHBsYW5lID0gKGludCl2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKworCWF0b21pY19kZWMoJmRpc3BjLm1hcF9jb3VudFtwbGFuZV0pOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG1tYXBfdXNlcl9vcHMgPSB7CisJLm9wZW4gPSBtbWFwX3VzZXJfb3BlbiwKKwkuY2xvc2UgPSBtbWFwX3VzZXJfY2xvc2UsCit9OworCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfbW1hcF91c2VyKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGluZm8tPnBhcjsKKwl1bnNpZ25lZCBsb25nIG9mZjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXUzMiBsZW47CisKKwlpZiAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0ID09IDApCisJCXJldHVybiAwOworCWlmICh2bWEtPnZtX3Bnb2ZmID4gKH4wVUwgPj4gUEFHRV9TSElGVCkpCisJCXJldHVybiAtRUlOVkFMOworCW9mZiA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKworCXN0YXJ0ID0gaW5mby0+Zml4LnNtZW1fc3RhcnQ7CisJbGVuID0gaW5mby0+Zml4LnNtZW1fbGVuOworCWlmIChvZmYgPj0gbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCArIG9mZikgPiBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCW9mZiArPSBzdGFydDsKKwl2bWEtPnZtX3Bnb2ZmID0gb2ZmID4+IFBBR0VfU0hJRlQ7CisJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJdm1hLT52bV9vcHMgPSAmbW1hcF91c2VyX29wczsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9ICh2b2lkICopcGxhbmUtPmlkeDsKKwlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgb2ZmID4+IFBBR0VfU0hJRlQsCisJCQkgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwkvKiB2bV9vcHMub3BlbiB3b24ndCBiZSBjYWxsZWQgZm9yIG1tYXAgaXRzZWxmLiAqLworCWF0b21pY19pbmMoJmRpc3BjLm1hcF9jb3VudFtwbGFuZS0+aWR4XSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFwX2tlcm4oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJdnVubWFwKHJlZ2lvbi0+dmFkZHIpOworfQorCitzdGF0aWMgaW50IGFsbG9jX3BhbGV0dGVfcmFtKHZvaWQpCit7CisJZGlzcGMucGFsZXR0ZV92YWRkciA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUoZGlzcGMuZmJkZXYtPmRldiwKKwkJTUFYX1BBTEVUVEVfU0laRSwgJmRpc3BjLnBhbGV0dGVfcGFkZHIsIEdGUF9LRVJORUwpOworCWlmIChkaXNwYy5wYWxldHRlX3ZhZGRyID09IE5VTEwpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIHBhbGV0dGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGFsZXR0ZV9yYW0odm9pZCkKK3sKKwlkbWFfZnJlZV93cml0ZWNvbWJpbmUoZGlzcGMuZmJkZXYtPmRldiwgTUFYX1BBTEVUVEVfU0laRSwKKwkJCWRpc3BjLnBhbGV0dGVfdmFkZHIsIGRpc3BjLnBhbGV0dGVfcGFkZHIpOworfQorCitzdGF0aWMgaW50IGFsbG9jX2ZibWVtKHN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmVnaW9uKQoreworCXJlZ2lvbi0+dmFkZHIgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGRpc3BjLmZiZGV2LT5kZXYsCisJCQlyZWdpb24tPnNpemUsICZyZWdpb24tPnBhZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmIChyZWdpb24tPnZhZGRyID09IE5VTEwpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIEZCIERNQSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwlkbWFfZnJlZV93cml0ZWNvbWJpbmUoZGlzcGMuZmJkZXYtPmRldiwgcmVnaW9uLT5zaXplLAorCQkJICAgICAgcmVnaW9uLT52YWRkciwgcmVnaW9uLT5wYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzbWFwICppbml0X3Jlc21hcCh1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBwYWdlX2NudDsKKwlzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwOworCisJcGFnZV9jbnQgPSBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOworCXJlc19tYXAgPQorCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzbWFwKSArIFJFU01BUF9TSVpFKHBhZ2VfY250KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlc19tYXAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmVzX21hcC0+c3RhcnQgPSBzdGFydDsKKwlyZXNfbWFwLT5wYWdlX2NudCA9IHBhZ2VfY250OworCXJlc19tYXAtPm1hcCA9ICh1bnNpZ25lZCBsb25nICopKHJlc19tYXAgKyAxKTsKKwlyZXR1cm4gcmVzX21hcDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9yZXNtYXAoc3RydWN0IHJlc21hcCAqcmVzX21hcCkKK3sKKwlrZnJlZShyZXNfbWFwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVzbWFwX21lbV90eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnQpCit7CisJaWYgKHN0YXJ0ID49IE9NQVAyX1NSQU1fU1RBUlQgJiYKKwkgICAgc3RhcnQgPCBPTUFQMl9TUkFNX1NUQVJUICsgT01BUDJfU1JBTV9TSVpFKQorCQlyZXR1cm4gT01BUEZCX01FTVRZUEVfU1JBTTsKKwllbHNlCisJCXJldHVybiBPTUFQRkJfTUVNVFlQRV9TRFJBTTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVzbWFwX3BhZ2VfcmVzZXJ2ZWQoc3RydWN0IHJlc21hcCAqcmVzX21hcCwgdW5zaWduZWQgcGFnZV9ucikKK3sKKwlyZXR1cm4gKlJFU01BUF9QVFIocmVzX21hcCwgcGFnZV9ucikgJiBSRVNNQVBfTUFTSyhwYWdlX25yKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzbWFwX3Jlc2VydmVfcGFnZShzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwLCB1bnNpZ25lZCBwYWdlX25yKQoreworCUJVR19PTihyZXNtYXBfcGFnZV9yZXNlcnZlZChyZXNfbWFwLCBwYWdlX25yKSk7CisJKlJFU01BUF9QVFIocmVzX21hcCwgcGFnZV9ucikgfD0gUkVTTUFQX01BU0socGFnZV9ucik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNtYXBfZnJlZV9wYWdlKHN0cnVjdCByZXNtYXAgKnJlc19tYXAsIHVuc2lnbmVkIHBhZ2VfbnIpCit7CisJQlVHX09OKCFyZXNtYXBfcGFnZV9yZXNlcnZlZChyZXNfbWFwLCBwYWdlX25yKSk7CisJKlJFU01BUF9QVFIocmVzX21hcCwgcGFnZV9ucikgJj0gflJFU01BUF9NQVNLKHBhZ2VfbnIpOworfQorCitzdGF0aWMgdm9pZCByZXNtYXBfcmVzZXJ2ZV9yZWdpb24odW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IHNpemUpCit7CisKKwlzdHJ1Y3QgcmVzbWFwCSpyZXNfbWFwOworCXVuc2lnbmVkCXN0YXJ0X3BhZ2U7CisJdW5zaWduZWQJZW5kX3BhZ2U7CisJaW50CQltdHlwZTsKKwl1bnNpZ25lZAlpOworCisJbXR5cGUgPSByZXNtYXBfbWVtX3R5cGUoc3RhcnQpOworCXJlc19tYXAgPSBkaXNwYy5yZXNfbWFwW210eXBlXTsKKwlkZXZfZGJnKGRpc3BjLmZiZGV2LT5kZXYsICJyZXNlcnZlIG1lbSB0eXBlICVkIHN0YXJ0ICUwOGx4IHNpemUgJWRcbiIsCisJCW10eXBlLCBzdGFydCwgc2l6ZSk7CisJc3RhcnRfcGFnZSA9IChzdGFydCAtIHJlc19tYXAtPnN0YXJ0KSAvIFBBR0VfU0laRTsKKwllbmRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOworCWZvciAoaSA9IHN0YXJ0X3BhZ2U7IGkgPCBlbmRfcGFnZTsgaSsrKQorCQlyZXNtYXBfcmVzZXJ2ZV9wYWdlKHJlc19tYXAsIGkpOworfQorCitzdGF0aWMgdm9pZCByZXNtYXBfZnJlZV9yZWdpb24odW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHJlc21hcAkqcmVzX21hcDsKKwl1bnNpZ25lZAlzdGFydF9wYWdlOworCXVuc2lnbmVkCWVuZF9wYWdlOworCXVuc2lnbmVkCWk7CisJaW50CQltdHlwZTsKKworCW10eXBlID0gcmVzbWFwX21lbV90eXBlKHN0YXJ0KTsKKwlyZXNfbWFwID0gZGlzcGMucmVzX21hcFttdHlwZV07CisJZGV2X2RiZyhkaXNwYy5mYmRldi0+ZGV2LCAiZnJlZSBtZW0gdHlwZSAlZCBzdGFydCAlMDhseCBzaXplICVkXG4iLAorCQltdHlwZSwgc3RhcnQsIHNpemUpOworCXN0YXJ0X3BhZ2UgPSAoc3RhcnQgLSByZXNfbWFwLT5zdGFydCkgLyBQQUdFX1NJWkU7CisJZW5kX3BhZ2UgPSBzdGFydF9wYWdlICsgUEFHRV9BTElHTihzaXplKSAvIFBBR0VfU0laRTsKKwlmb3IgKGkgPSBzdGFydF9wYWdlOyBpIDwgZW5kX3BhZ2U7IGkrKykKKwkJcmVzbWFwX2ZyZWVfcGFnZShyZXNfbWFwLCBpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzbWFwX2FsbG9jX3JlZ2lvbihpbnQgbXR5cGUsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgdG90YWw7CisJdW5zaWduZWQgc3RhcnRfcGFnZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXN0cnVjdCByZXNtYXAgKnJlc19tYXAgPSBkaXNwYy5yZXNfbWFwW210eXBlXTsKKworCUJVR19PTihtdHlwZSA+PSBESVNQQ19NRU1UWVBFX05VTSB8fCByZXNfbWFwID09IE5VTEwgfHwgIXNpemUpOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSkgLyBQQUdFX1NJWkU7CisJc3RhcnRfcGFnZSA9IDA7CisJdG90YWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCByZXNfbWFwLT5wYWdlX2NudDsgaSsrKSB7CisJCWlmIChyZXNtYXBfcGFnZV9yZXNlcnZlZChyZXNfbWFwLCBpKSkgeworCQkJc3RhcnRfcGFnZSA9IGkgKyAxOworCQkJdG90YWwgPSAwOworCQl9IGVsc2UgaWYgKCsrdG90YWwgPT0gc2l6ZSkKKwkJCWJyZWFrOworCX0KKwlpZiAodG90YWwgPCBzaXplKQorCQlyZXR1cm4gMDsKKworCXN0YXJ0ID0gcmVzX21hcC0+c3RhcnQgKyBzdGFydF9wYWdlICogUEFHRV9TSVpFOworCXJlc21hcF9yZXNlcnZlX3JlZ2lvbihzdGFydCwgc2l6ZSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4gc3RhcnQ7Cit9CisKKy8qIE5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSB3b3JrIGZvciB1c2VyIG1hcHBpbmdzLCB3ZSBkb24ndCBkZWFsIHdpdGgKKyAqIGtlcm5lbCBtYXBwaW5ncyBoZXJlLCBzbyBmYmNvbiB3aWxsIGtlZXAgdXNpbmcgdGhlIG9sZCByZWdpb24uCisgKi8KK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXR1cF9tZW0oaW50IHBsYW5lLCBzaXplX3Qgc2l6ZSwgaW50IG1lbV90eXBlLAorCQkJCXVuc2lnbmVkIGxvbmcgKnBhZGRyKQoreworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmc7CisJdW5zaWduZWQgbG9uZyBuZXdfYWRkciA9IDA7CisKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1lbV90eXBlID49IERJU1BDX01FTVRZUEVfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGlzcGMucmVzX21hcFttZW1fdHlwZV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmcgPSAmZGlzcGMubWVtX2Rlc2MucmVnaW9uW3BsYW5lXTsKKwlpZiAoc2l6ZSA9PSByZy0+c2l6ZSAmJiBtZW1fdHlwZSA9PSByZy0+dHlwZSkKKwkJcmV0dXJuIDA7CisJaWYgKGF0b21pY19yZWFkKCZkaXNwYy5tYXBfY291bnRbcGxhbmVdKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAocmctPnNpemUgIT0gMCkKKwkJcmVzbWFwX2ZyZWVfcmVnaW9uKHJnLT5wYWRkciwgcmctPnNpemUpOworCWlmIChzaXplICE9IDApIHsKKwkJbmV3X2FkZHIgPSByZXNtYXBfYWxsb2NfcmVnaW9uKG1lbV90eXBlLCBzaXplKTsKKwkJaWYgKCFuZXdfYWRkcikgeworCQkJLyogUmVhbGxvY2F0ZSBvbGQgcmVnaW9uLiAqLworCQkJcmVzbWFwX3Jlc2VydmVfcmVnaW9uKHJnLT5wYWRkciwgcmctPnNpemUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmctPnBhZGRyID0gbmV3X2FkZHI7CisJcmctPnNpemUgPSBzaXplOworCXJnLT50eXBlID0gbWVtX3R5cGU7CisKKwkqcGFkZHIgPSBuZXdfYWRkcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldHVwX2ZibWVtKHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV9tZCkKK3sKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24JKnJnOworCWludCBpOworCWludCByOworCXVuc2lnbmVkIGxvbmcJCQltZW1fc3RhcnRbRElTUENfTUVNVFlQRV9OVU1dOworCXVuc2lnbmVkIGxvbmcJCQltZW1fZW5kW0RJU1BDX01FTVRZUEVfTlVNXTsKKworCWlmICghcmVxX21kLT5yZWdpb25fY250KSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgIm5vIG1lbW9yeSByZWdpb25zIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlyZyA9ICZyZXFfbWQtPnJlZ2lvblswXTsKKwltZW1zZXQobWVtX3N0YXJ0LCAweGZmLCBzaXplb2YobWVtX3N0YXJ0KSk7CisJbWVtc2V0KG1lbV9lbmQsIDAsIHNpemVvZihtZW1fZW5kKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVxX21kLT5yZWdpb25fY250OyBpKyssIHJnKyspIHsKKwkJaW50IG10eXBlOworCQlpZiAocmctPnBhZGRyKSB7CisJCQlyZy0+YWxsb2MgPSAwOworCQkJaWYgKHJnLT52YWRkciA9PSBOVUxMKSB7CisJCQkJcmctPm1hcCA9IDE7CisJCQkJaWYgKChyID0gbW1hcF9rZXJuKHJnKSkgPCAwKQorCQkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChyZy0+dHlwZSAhPSBPTUFQRkJfTUVNVFlQRV9TRFJBTSkgeworCQkJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwKKwkJCQkJInVuc3VwcG9ydGVkIG1lbW9yeSB0eXBlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJnLT5hbGxvYyA9IHJnLT5tYXAgPSAxOworCQkJaWYgKChyID0gYWxsb2NfZmJtZW0ocmcpKSA8IDApCisJCQkJcmV0dXJuIHI7CisJCX0KKwkJbXR5cGUgPSByZy0+dHlwZTsKKworCQlpZiAocmctPnBhZGRyIDwgbWVtX3N0YXJ0W210eXBlXSkKKwkJCW1lbV9zdGFydFttdHlwZV0gPSByZy0+cGFkZHI7CisJCWlmIChyZy0+cGFkZHIgKyByZy0+c2l6ZSA+IG1lbV9lbmRbbXR5cGVdKQorCQkJbWVtX2VuZFttdHlwZV0gPSByZy0+cGFkZHIgKyByZy0+c2l6ZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRElTUENfTUVNVFlQRV9OVU07IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0OworCQlzaXplX3Qgc2l6ZTsKKwkJaWYgKG1lbV9lbmRbaV0gPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzdGFydCA9IG1lbV9zdGFydFtpXTsKKwkJc2l6ZSA9IG1lbV9lbmRbaV0gLSBzdGFydDsKKwkJZGlzcGMucmVzX21hcFtpXSA9IGluaXRfcmVzbWFwKHN0YXJ0LCBzaXplKTsKKwkJciA9IC1FTk9NRU07CisJCWlmIChkaXNwYy5yZXNfbWFwW2ldID09IE5VTEwpCisJCQlnb3RvIGZhaWw7CisJCS8qIEluaXRpYWwgc3RhdGUgaXMgdGhhdCBldmVyeXRoaW5nIGlzIHJlc2VydmVkLiBUaGlzCisJCSAqIGluY2x1ZGVzIHBvc3NpYmxlIGhvbGVzIGFzIHdlbGwsIHdoaWNoIHdpbGwgbmV2ZXIgYmUKKwkJICogZnJlZWQuCisJCSAqLworCQlyZXNtYXBfcmVzZXJ2ZV9yZWdpb24oc3RhcnQsIHNpemUpOworCX0KKworCWRpc3BjLm1lbV9kZXNjID0gKnJlcV9tZDsKKworCXJldHVybiAwOworZmFpbDoKKwlmb3IgKGkgPSAwOyBpIDwgRElTUENfTUVNVFlQRV9OVU07IGkrKykgeworCQlpZiAoZGlzcGMucmVzX21hcFtpXSAhPSBOVUxMKQorCQkJY2xlYW51cF9yZXNtYXAoZGlzcGMucmVzX21hcFtpXSk7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2ZibWVtKHZvaWQpCit7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBESVNQQ19NRU1UWVBFX05VTTsgaSsrKSB7CisJCWlmIChkaXNwYy5yZXNfbWFwW2ldICE9IE5VTEwpCisJCQljbGVhbnVwX3Jlc21hcChkaXNwYy5yZXNfbWFwW2ldKTsKKwl9CisJcmcgPSAmZGlzcGMubWVtX2Rlc2MucmVnaW9uWzBdOworCWZvciAoaSA9IDA7IGkgPCBkaXNwYy5tZW1fZGVzYy5yZWdpb25fY250OyBpKyssIHJnKyspIHsKKwkJaWYgKHJnLT5hbGxvYykKKwkJCWZyZWVfZmJtZW0ocmcpOworCQllbHNlIHsKKwkJCWlmIChyZy0+bWFwKQorCQkJCXVubWFwX2tlcm4ocmcpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIGludCBleHRfbW9kZSwKKwkJCSAgIHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV92cmFtKQoreworCWludCByOworCXUzMiBsOworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gZmJkZXYtPnBhbmVsOworCWludCB0bW8gPSAxMDAwMDsKKwlpbnQgc2tpcF9pbml0ID0gMDsKKwlpbnQgaTsKKworCW1lbXNldCgmZGlzcGMsIDAsIHNpemVvZihkaXNwYykpOworCisJZGlzcGMuYmFzZSA9IGlvX3AydihESVNQQ19CQVNFKTsKKwlkaXNwYy5mYmRldiA9IGZiZGV2OworCWRpc3BjLmV4dF9tb2RlID0gZXh0X21vZGU7CisKKwlpbml0X2NvbXBsZXRpb24oJmRpc3BjLmZyYW1lX2RvbmUpOworCisJaWYgKChyID0gZ2V0X2Rzc19jbG9ja3MoKSkgPCAwKQorCQlyZXR1cm4gcjsKKworCWVuYWJsZV9pbnRlcmZhY2VfY2xvY2tzKDEpOworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfQk9PVExPQURFUl9JTklUCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCS8qIExDRCBlbmFibGVkID8gKi8KKwlpZiAobCAmIDEpIHsKKwkJcHJfaW5mbygib21hcGZiOiBza2lwcGluZyBoYXJkd2FyZSBpbml0aWFsaXphdGlvblxuIik7CisJCXNraXBfaW5pdCA9IDE7CisJfQorI2VuZGlmCisKKwlpZiAoIXNraXBfaW5pdCkgeworCQkvKiBSZXNldCBtb25pdG9yaW5nIHdvcmtzIG9ubHkgdy8gdGhlIDU0TSBjbGsgKi8KKwkJZW5hYmxlX2RpZ2l0X2Nsb2NrcygxKTsKKworCQkvKiBTb2Z0IHJlc2V0ICovCisJCU1PRF9SRUdfRkxEKERJU1BDX1NZU0NPTkZJRywgMSA8PCAxLCAxIDw8IDEpOworCisJCXdoaWxlICghKGRpc3BjX3JlYWRfcmVnKERJU1BDX1NZU1NUQVRVUykgJiAxKSkgeworCQkJaWYgKCEtLXRtbykgeworCQkJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgInNvZnQgcmVzZXQgZmFpbGVkXG4iKTsKKwkJCQlyID0gLUVOT0RFVjsKKwkJCQllbmFibGVfZGlnaXRfY2xvY2tzKDApOworCQkJCWdvdG8gZmFpbDE7CisJCQl9CisJCX0KKworCQllbmFibGVfZGlnaXRfY2xvY2tzKDApOworCX0KKworCS8qIEVuYWJsZSBzbWFydCBpZGxlIGFuZCBhdXRvaWRsZSAqLworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MKTsKKwlsICY9IH4oKDMgPDwgMTIpIHwgKDMgPDwgMykpOworCWwgfD0gKDIgPDwgMTIpIHwgKDIgPDwgMykgfCAoMSA8PCAwKTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfU1lTQ09ORklHLCBsKTsKKwlvbWFwX3dyaXRlbCgxIDw8IDAsIERTU19CQVNFICsgRFNTX1NZU0NPTkZJRyk7CisKKwkvKiBTZXQgZnVuY3Rpb25hbCBjbG9jayBhdXRvZ2F0aW5nICovCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTkZJRyk7CisJbCB8PSAxIDw8IDk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTkZJRywgbCk7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfSVJRU1RBVFVTKTsKKwlkaXNwY193cml0ZV9yZWcobCwgRElTUENfSVJRU1RBVFVTKTsKKworCS8qIEVuYWJsZSB0aG9zZSB0aGF0IHdlIGhhbmRsZSBhbHdheXMgKi8KKwlvbWFwX2Rpc3BjX2VuYWJsZV9pcnFzKERJU1BDX0lSUV9GUkFNRU1BU0spOworCisJaWYgKChyID0gcmVxdWVzdF9pcnEoSU5UXzI0WFhfRFNTX0lSUSwgb21hcF9kaXNwY19pcnFfaGFuZGxlciwKKwkJCSAgIDAsIE1PRFVMRV9OQU1FLCBmYmRldikpIDwgMCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgRFNTIElSUVxuIik7CisJCWdvdG8gZmFpbDE7CisJfQorCisJLyogTDMgZmlyZXdhbGwgc2V0dGluZzogZW5hYmxlIGFjY2VzcyB0byBPQ00gUkFNICovCisJX19yYXdfd3JpdGVsKDB4NDAyMDAwYjAsIGlvX3AydigweDY4MDA1MGEwKSk7CisKKwlpZiAoKHIgPSBhbGxvY19wYWxldHRlX3JhbSgpKSA8IDApCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoKHIgPSBzZXR1cF9mYm1lbShyZXFfdnJhbSkpIDwgMCkKKwkJZ290byBmYWlsMzsKKworCWlmICghc2tpcF9pbml0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBkaXNwYy5tZW1fZGVzYy5yZWdpb25fY250OyBpKyspIHsKKwkJCW1lbXNldChkaXNwYy5tZW1fZGVzYy5yZWdpb25baV0udmFkZHIsIDAsCisJCQkJZGlzcGMubWVtX2Rlc2MucmVnaW9uW2ldLnNpemUpOworCQl9CisKKwkJLyogU2V0IGxvZ2ljIGNsb2NrIHRvIGZjaywgcGl4ZWwgY2xvY2sgdG8gZmNrLzIgZm9yIG5vdyAqLworCQlNT0RfUkVHX0ZMRChESVNQQ19ESVZJU09SLCBGTERfTUFTSygxNiwgOCksIDEgPDwgMTYpOworCQlNT0RfUkVHX0ZMRChESVNQQ19ESVZJU09SLCBGTERfTUFTSygwLCA4KSwgMiA8PCAwKTsKKworCQlzZXR1cF9wbGFuZV9maWZvKDAsIGV4dF9tb2RlKTsKKwkJc2V0dXBfcGxhbmVfZmlmbygxLCBleHRfbW9kZSk7CisJCXNldHVwX3BsYW5lX2ZpZm8oMiwgZXh0X21vZGUpOworCisJCXNldHVwX2NvbG9yX2NvbnZfY29lZigpOworCisJCXNldF9sY2RfdGZ0X21vZGUocGFuZWwtPmNvbmZpZyAmIE9NQVBfTENEQ19QQU5FTF9URlQpOworCQlzZXRfbG9hZF9tb2RlKERJU1BDX0xPQURfRlJBTUVfT05MWSk7CisKKwkJaWYgKCFleHRfbW9kZSkgeworCQkJc2V0X2xjZF9kYXRhX2xpbmVzKHBhbmVsLT5kYXRhX2xpbmVzKTsKKwkJCW9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKHBhbmVsLT54X3JlcywgcGFuZWwtPnlfcmVzKTsKKwkJCXNldF9sY2RfdGltaW5ncygpOworCQl9IGVsc2UKKwkJCXNldF9sY2RfZGF0YV9saW5lcyhwYW5lbC0+YnBwKTsKKwkJZW5hYmxlX3JmYmlfbW9kZShleHRfbW9kZSk7CisJfQorCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1JFVklTSU9OKTsKKwlwcl9pbmZvKCJvbWFwZmI6IERJU1BDIHZlcnNpb24gJWQuJWQgaW5pdGlhbGl6ZWRcbiIsCisJCSBsID4+IDQgJiAweDBmLCBsICYgMHgwZik7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisKKwlyZXR1cm4gMDsKK2ZhaWwzOgorCWZyZWVfcGFsZXR0ZV9yYW0oKTsKK2ZhaWwyOgorCWZyZWVfaXJxKElOVF8yNFhYX0RTU19JUlEsIGZiZGV2KTsKK2ZhaWwxOgorCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCWVuYWJsZV9pbnRlcmZhY2VfY2xvY2tzKDApOworCXB1dF9kc3NfY2xvY2tzKCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgb21hcF9kaXNwY19jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlvbWFwX2Rpc3BjX3NldF91cGRhdGVfbW9kZShPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwkvKiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIGNsb2NrcyB0aGF0IGFyZSBvbiAqLworCWZvciAoaSA9IDA7IGkgPCBkaXNwYy5tZW1fZGVzYy5yZWdpb25fY250OyBpKyspCisJCW9tYXBfZGlzcGNfZW5hYmxlX3BsYW5lKGksIDApOworCWNsZWFudXBfZmJtZW0oKTsKKwlmcmVlX3BhbGV0dGVfcmFtKCk7CisJZnJlZV9pcnEoSU5UXzI0WFhfRFNTX0lSUSwgZGlzcGMuZmJkZXYpOworCWVuYWJsZV9pbnRlcmZhY2VfY2xvY2tzKDApOworCXB1dF9kc3NfY2xvY2tzKCk7Cit9CisKK2NvbnN0IHN0cnVjdCBsY2RfY3RybCBvbWFwMl9pbnRfY3RybCA9IHsKKwkubmFtZQkJCT0gImludGVybmFsIiwKKwkuaW5pdAkJCT0gb21hcF9kaXNwY19pbml0LAorCS5jbGVhbnVwCQk9IG9tYXBfZGlzcGNfY2xlYW51cCwKKwkuZ2V0X2NhcHMJCT0gb21hcF9kaXNwY19nZXRfY2FwcywKKwkuc2V0X3VwZGF0ZV9tb2RlCT0gb21hcF9kaXNwY19zZXRfdXBkYXRlX21vZGUsCisJLmdldF91cGRhdGVfbW9kZQk9IG9tYXBfZGlzcGNfZ2V0X3VwZGF0ZV9tb2RlLAorCS51cGRhdGVfd2luZG93CQk9IG9tYXBfZGlzcGNfdXBkYXRlX3dpbmRvdywKKwkuc3VzcGVuZAkJPSBvbWFwX2Rpc3BjX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gb21hcF9kaXNwY19yZXN1bWUsCisJLnNldHVwX3BsYW5lCQk9IG9tYXBfZGlzcGNfc2V0dXBfcGxhbmUsCisJLnNldHVwX21lbQkJPSBvbWFwX2Rpc3BjX3NldHVwX21lbSwKKwkuc2V0X3NjYWxlCQk9IG9tYXBfZGlzcGNfc2V0X3NjYWxlLAorCS5lbmFibGVfcGxhbmUJCT0gb21hcF9kaXNwY19lbmFibGVfcGxhbmUsCisJLnNldF9jb2xvcl9rZXkJCT0gb21hcF9kaXNwY19zZXRfY29sb3Jfa2V5LAorCS5nZXRfY29sb3Jfa2V5CQk9IG9tYXBfZGlzcGNfZ2V0X2NvbG9yX2tleSwKKwkubW1hcAkJCT0gb21hcF9kaXNwY19tbWFwX3VzZXIsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmggYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjE1MTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBfRElTUENfSAorI2RlZmluZSBfRElTUENfSAorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNkZWZpbmUgRElTUENfUExBTkVfR0ZYCQkJMAorI2RlZmluZSBESVNQQ19QTEFORV9WSUQxCQkxCisjZGVmaW5lIERJU1BDX1BMQU5FX1ZJRDIJCTIKKworI2RlZmluZSBESVNQQ19SR0JfMV9CUFAJCQkweDAwCisjZGVmaW5lIERJU1BDX1JHQl8yX0JQUAkJCTB4MDEKKyNkZWZpbmUgRElTUENfUkdCXzRfQlBQCQkJMHgwMgorI2RlZmluZSBESVNQQ19SR0JfOF9CUFAJCQkweDAzCisjZGVmaW5lIERJU1BDX1JHQl8xMl9CUFAJCTB4MDQKKyNkZWZpbmUgRElTUENfUkdCXzE2X0JQUAkJMHgwNgorI2RlZmluZSBESVNQQ19SR0JfMjRfQlBQCQkweDA4CisjZGVmaW5lIERJU1BDX1JHQl8yNF9CUFBfVU5QQUNLXzMyCTB4MDkKKyNkZWZpbmUgRElTUENfWVVWMl80MjIJCQkweDBhCisjZGVmaW5lIERJU1BDX1VZVllfNDIyCQkJMHgwYgorCisjZGVmaW5lIERJU1BDX0JVUlNUXzR4MzIJCTAKKyNkZWZpbmUgRElTUENfQlVSU1RfOHgzMgkJMQorI2RlZmluZSBESVNQQ19CVVJTVF8xNngzMgkJMgorCisjZGVmaW5lIERJU1BDX0xPQURfQ0xVVF9BTkRfRlJBTUUJMHgwMAorI2RlZmluZSBESVNQQ19MT0FEX0NMVVRfT05MWQkJMHgwMQorI2RlZmluZSBESVNQQ19MT0FEX0ZSQU1FX09OTFkJCTB4MDIKKyNkZWZpbmUgRElTUENfTE9BRF9DTFVUX09OQ0VfRlJBTUUJMHgwMworCisjZGVmaW5lIERJU1BDX1RGVF9EQVRBX0xJTkVTXzEyCQkwCisjZGVmaW5lIERJU1BDX1RGVF9EQVRBX0xJTkVTXzE2CQkxCisjZGVmaW5lIERJU1BDX1RGVF9EQVRBX0xJTkVTXzE4CQkyCisjZGVmaW5lIERJU1BDX1RGVF9EQVRBX0xJTkVTXzI0CQkzCisKK2V4dGVybiB2b2lkIG9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKK2V4dGVybiB2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoaW50IGVuYWJsZSk7CitleHRlcm4gdm9pZCBvbWFwX2Rpc3BjX2VuYWJsZV9kaWdpdF9vdXQoaW50IGVuYWJsZSk7CisKK2V4dGVybiBpbnQgIG9tYXBfZGlzcGNfcmVxdWVzdF9pcnEodm9pZCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBvbWFwX2Rpc3BjX2ZyZWVfaXJxKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9od2E3NDIuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9od2E3NDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ4ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2h3YTc0Mi5jCkBAIC0wLDAgKzEsMTA3NyBAQAorLyoKKyAqIEVwc29uIEhXQTc0MiBMQ0QgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogICAgIEp1aGEgWXJqw7Zsw6QgICA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoJICAgICAgICBJbXJlIERlYWsgICAgIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICogWVVWIHN1cHBvcnQ6IEp1c3NpIExhYWtvICAgPGp1c3NpLmxhYWtvQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaHdhNzQyLmg+CisKKyNkZWZpbmUgSFdBNzQyX1JFVl9DT0RFX1JFRyAgICAgICAweDAKKyNkZWZpbmUgSFdBNzQyX0NPTkZJR19SRUcgICAgICAgICAweDIKKyNkZWZpbmUgSFdBNzQyX1BMTF9ESVZfUkVHICAgICAgICAweDQKKyNkZWZpbmUgSFdBNzQyX1BMTF8wX1JFRyAgICAgICAgICAweDYKKyNkZWZpbmUgSFdBNzQyX1BMTF8xX1JFRyAgICAgICAgICAweDgKKyNkZWZpbmUgSFdBNzQyX1BMTF8yX1JFRyAgICAgICAgICAweGEKKyNkZWZpbmUgSFdBNzQyX1BMTF8zX1JFRyAgICAgICAgICAweGMKKyNkZWZpbmUgSFdBNzQyX1BMTF80X1JFRyAgICAgICAgICAweGUKKyNkZWZpbmUgSFdBNzQyX0NMS19TUkNfUkVHICAgICAgICAweDEyCisjZGVmaW5lIEhXQTc0Ml9QQU5FTF9UWVBFX1JFRyAgICAgMHgxNAorI2RlZmluZSBIV0E3NDJfSF9ESVNQX1JFRyAgICAgICAgIDB4MTYKKyNkZWZpbmUgSFdBNzQyX0hfTkRQX1JFRyAgICAgICAgICAweDE4CisjZGVmaW5lIEhXQTc0Ml9WX0RJU1BfMV9SRUcgICAgICAgMHgxYQorI2RlZmluZSBIV0E3NDJfVl9ESVNQXzJfUkVHICAgICAgIDB4MWMKKyNkZWZpbmUgSFdBNzQyX1ZfTkRQX1JFRyAgICAgICAgICAweDFlCisjZGVmaW5lIEhXQTc0Ml9IU19XX1JFRyAgICAgICAgICAgMHgyMAorI2RlZmluZSBIV0E3NDJfSFBfU19SRUcgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgSFdBNzQyX1ZTX1dfUkVHICAgICAgICAgICAweDI0CisjZGVmaW5lIEhXQTc0Ml9WUF9TX1JFRyAgICAgICAgICAgMHgyNgorI2RlZmluZSBIV0E3NDJfUENMS19QT0xfUkVHICAgICAgIDB4MjgKKyNkZWZpbmUgSFdBNzQyX0lOUFVUX01PREVfUkVHICAgICAweDJhCisjZGVmaW5lIEhXQTc0Ml9UUkFOU0xfTU9ERV9SRUcxICAgMHgyZQorI2RlZmluZSBIV0E3NDJfRElTUF9NT0RFX1JFRyAgICAgIDB4MzQKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19UWVBFICAgICAgICAweDM2CisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWF9TVEFSVF8wICAgMHgzOAorI2RlZmluZSBIV0E3NDJfV0lORE9XX1hfU1RBUlRfMSAgIDB4M2EKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19ZX1NUQVJUXzAgICAweDNjCisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWV9TVEFSVF8xICAgMHgzZQorI2RlZmluZSBIV0E3NDJfV0lORE9XX1hfRU5EXzAgICAgIDB4NDAKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19YX0VORF8xICAgICAweDQyCisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWV9FTkRfMCAgICAgMHg0NAorI2RlZmluZSBIV0E3NDJfV0lORE9XX1lfRU5EXzEgICAgIDB4NDYKKyNkZWZpbmUgSFdBNzQyX01FTU9SWV9XUklURV9MU0IgICAweDQ4CisjZGVmaW5lIEhXQTc0Ml9NRU1PUllfV1JJVEVfTVNCICAgMHg0OQorI2RlZmluZSBIV0E3NDJfTUVNT1JZX1JFQURfMCAgICAgIDB4NGEKKyNkZWZpbmUgSFdBNzQyX01FTU9SWV9SRUFEXzEgICAgICAweDRjCisjZGVmaW5lIEhXQTc0Ml9NRU1PUllfUkVBRF8yICAgICAgMHg0ZQorI2RlZmluZSBIV0E3NDJfUE9XRVJfU0FWRSAgICAgICAgIDB4NTYKKyNkZWZpbmUgSFdBNzQyX05EUF9DVFJMICAgICAgICAgICAweDU4CisKKyNkZWZpbmUgSFdBNzQyX0FVVE9fVVBEQVRFX1RJTUUJCShIWiAvIDIwKQorCisvKiBSZXNlcnZlIDQgcmVxdWVzdCBzbG90cyBmb3IgcmVxdWVzdHMgaW4gaXJxIGNvbnRleHQgKi8KKyNkZWZpbmUgUkVRX1BPT0xfU0laRQkJCTI0CisjZGVmaW5lIElSUV9SRVFfUE9PTF9TSVpFCQk0CisKKyNkZWZpbmUgUkVRX0ZST01fSVJRX1BPT0wgMHgwMQorCisjZGVmaW5lIFJFUV9DT01QTEVURQkwCisjZGVmaW5lIFJFUV9QRU5ESU5HCTEKKworc3RydWN0IHVwZGF0ZV9wYXJhbSB7CisJaW50CXgsIHksIHdpZHRoLCBoZWlnaHQ7CisJaW50CWNvbG9yX21vZGU7CisJaW50CWZsYWdzOworfTsKKworc3RydWN0IGh3YTc0Ml9yZXF1ZXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXVuc2lnbmVkIGludAkgZmxhZ3M7CisKKwlpbnQJCSAoKmhhbmRsZXIpKHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxKTsKKwl2b2lkCQkgKCpjb21wbGV0ZSkodm9pZCAqZGF0YSk7CisJdm9pZAkJICpjb21wbGV0ZV9kYXRhOworCisJdW5pb24geworCQlzdHJ1Y3QgdXBkYXRlX3BhcmFtCXVwZGF0ZTsKKwkJc3RydWN0IGNvbXBsZXRpb24JKnN5bmM7CisJfSBwYXI7Cit9OworCitzdHJ1Y3QgeworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCXVwZGF0ZV9tb2RlOworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCXVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kOworCisJc3RydWN0IHRpbWVyX2xpc3QJYXV0b191cGRhdGVfdGltZXI7CisJaW50CQkJc3RvcF9hdXRvX3VwZGF0ZTsKKwlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cJYXV0b191cGRhdGVfd2luZG93OworCXVuc2lnbmVkCQl0ZV9jb25uZWN0ZWQ6MTsKKwl1bnNpZ25lZAkJdnN5bmNfb25seToxOworCisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0CXJlcV9wb29sW1JFUV9QT09MX1NJWkVdOworCXN0cnVjdCBsaXN0X2hlYWQJcGVuZGluZ19yZXFfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfcmVxX2xpc3Q7CisJc3RydWN0IHNlbWFwaG9yZQlyZXFfc2VtYTsKKwlzcGlubG9ja190CQlyZXFfbG9jazsKKworCXN0cnVjdCBleHRpZl90aW1pbmdzCXJlZ190aW1pbmdzLCBsdXRfdGltaW5nczsKKworCWludAkJCXByZXZfY29sb3JfbW9kZTsKKwlpbnQJCQlwcmV2X2ZsYWdzOworCWludAkJCXdpbmRvd190eXBlOworCisJdTMyCQkJbWF4X3RyYW5zbWl0X3NpemU7CisJdTMyCQkJZXh0aWZfY2xrX3BlcmlvZDsKKwl1bnNpZ25lZCBsb25nCQlwaXhfdHhfdGltZTsKKwl1bnNpZ25lZCBsb25nCQlsaW5lX3VwZF90aW1lOworCisKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7CisJc3RydWN0IGxjZF9jdHJsX2V4dGlmCSpleHRpZjsKKwlzdHJ1Y3QgbGNkX2N0cmwJCSppbnRfY3RybDsKKworCXZvaWQJCQkoKnBvd2VyX3VwKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCXZvaWQJCQkoKnBvd2VyX2Rvd24pKHN0cnVjdCBkZXZpY2UgKmRldik7Cit9IGh3YTc0MjsKKworc3RydWN0IGxjZF9jdHJsIGh3YTc0Ml9jdHJsOworCitzdGF0aWMgdTggaHdhNzQyX3JlYWRfcmVnKHU4IHJlZykKK3sKKwl1OCBkYXRhOworCisJaHdhNzQyLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJaHdhNzQyLmV4dGlmLT53cml0ZV9jb21tYW5kKCZyZWcsIDEpOworCWh3YTc0Mi5leHRpZi0+cmVhZF9kYXRhKCZkYXRhLCAxKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfd3JpdGVfcmVnKHU4IHJlZywgdTggZGF0YSkKK3sKKwlod2E3NDIuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSg4KTsKKwlod2E3NDIuZXh0aWYtPndyaXRlX2NvbW1hbmQoJnJlZywgMSk7CisJaHdhNzQyLmV4dGlmLT53cml0ZV9kYXRhKCZkYXRhLCAxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3dpbmRvd19yZWdzKGludCB4X3N0YXJ0LCBpbnQgeV9zdGFydCwgaW50IHhfZW5kLCBpbnQgeV9lbmQpCit7CisJdTggdG1wWzhdOworCXU4IGNtZDsKKworCXhfZW5kLS07CisJeV9lbmQtLTsKKwl0bXBbMF0gPSB4X3N0YXJ0OworCXRtcFsxXSA9IHhfc3RhcnQgPj4gODsKKwl0bXBbMl0gPSB5X3N0YXJ0OworCXRtcFszXSA9IHlfc3RhcnQgPj4gODsKKwl0bXBbNF0gPSB4X2VuZDsKKwl0bXBbNV0gPSB4X2VuZCA+PiA4OworCXRtcFs2XSA9IHlfZW5kOworCXRtcFs3XSA9IHlfZW5kID4+IDg7CisKKwlod2E3NDIuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSg4KTsKKwljbWQgPSBIV0E3NDJfV0lORE9XX1hfU1RBUlRfMDsKKworCWh3YTc0Mi5leHRpZi0+d3JpdGVfY29tbWFuZCgmY21kLCAxKTsKKworCWh3YTc0Mi5leHRpZi0+d3JpdGVfZGF0YSh0bXAsIDgpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZm9ybWF0X3JlZ3MoaW50IGNvbnYsIGludCB0cmFuc2wsIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRE9VQkxFKSB7CisJCWh3YTc0Mi53aW5kb3dfdHlwZSA9ICgoaHdhNzQyLndpbmRvd190eXBlICYgMHhmYykgfCAweDAxKTsKKyNpZmRlZiBWRVJCT1NFCisJCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJod2E3NDI6IGVuYWJsZWQgcGl4ZWwgZG91YmxpbmdcbiIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaHdhNzQyLndpbmRvd190eXBlID0gKGh3YTc0Mi53aW5kb3dfdHlwZSAmIDB4ZmMpOworI2lmZGVmIFZFUkJPU0UKKwkJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgImh3YTc0MjogZGlzYWJsZWQgcGl4ZWwgZG91YmxpbmdcbiIpOworI2VuZGlmCisJfQorCisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfSU5QVVRfTU9ERV9SRUcsIGNvbnYpOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX1RSQU5TTF9NT0RFX1JFRzEsIHRyYW5zbCk7CisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfV0lORE9XX1RZUEUsIGh3YTc0Mi53aW5kb3dfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV90ZWFyc3luYyhpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuX2hlaWdodCwKKwkJCSAgICBpbnQgZm9yY2VfdnN5bmMpCit7CisJdTggYjsKKworCWIgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX05EUF9DVFJMKTsKKwliIHw9IDEgPDwgMjsKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9ORFBfQ1RSTCwgYik7CisKKwlpZiAobGlrZWx5KGh3YTc0Mi52c3luY19vbmx5IHx8IGZvcmNlX3ZzeW5jKSkgeworCQlod2E3NDIuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh3aWR0aCAqIGh3YTc0Mi5waXhfdHhfdGltZSA8IGh3YTc0Mi5saW5lX3VwZF90aW1lKSB7CisJCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKCh3aWR0aCAqIGh3YTc0Mi5waXhfdHhfdGltZSAvIDEwMDApICogaGVpZ2h0IDwKKwkgICAgKHkgKyBoZWlnaHQpICogKGh3YTc0Mi5saW5lX3VwZF90aW1lIC8gMTAwMCkpIHsKKwkJaHdhNzQyLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlod2E3NDIuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCB5ICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfdGVhcnN5bmModm9pZCkKK3sKKwl1OCBiOworCisJaHdhNzQyLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMCwgMCk7CisKKwliID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9ORFBfQ1RSTCk7CisJYiAmPSB+KDEgPDwgMik7CisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfTkRQX0NUUkwsIGIpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqYWxsb2NfcmVxKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcTsKKwlpbnQgcmVxX2ZsYWdzID0gMDsKKworCWlmICghaW5faW50ZXJydXB0KCkpCisJCWRvd24oJmh3YTc0Mi5yZXFfc2VtYSk7CisJZWxzZQorCQlyZXFfZmxhZ3MgPSBSRVFfRlJPTV9JUlFfUE9PTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKwlCVUdfT04obGlzdF9lbXB0eSgmaHdhNzQyLmZyZWVfcmVxX2xpc3QpKTsKKwlyZXEgPSBsaXN0X2VudHJ5KGh3YTc0Mi5mcmVlX3JlcV9saXN0Lm5leHQsCisJCQkgc3RydWN0IGh3YTc0Ml9yZXF1ZXN0LCBlbnRyeSk7CisJbGlzdF9kZWwoJnJlcS0+ZW50cnkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+ZW50cnkpOworCXJlcS0+ZmxhZ3MgPSByZXFfZmxhZ3M7CisKKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9yZXEoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZGVsKCZyZXEtPmVudHJ5KTsKKwlsaXN0X2FkZCgmcmVxLT5lbnRyeSwgJmh3YTc0Mi5mcmVlX3JlcV9saXN0KTsKKwlpZiAoIShyZXEtPmZsYWdzICYgUkVRX0ZST01fSVJRX1BPT0wpKQorCQl1cCgmaHdhNzQyLnJlcV9zZW1hKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZod2E3NDIucGVuZGluZ19yZXFfbGlzdCkpIHsKKwkJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXE7CisJCXZvaWQgKCpjb21wbGV0ZSkodm9pZCAqKTsKKwkJdm9pZCAqY29tcGxldGVfZGF0YTsKKworCQlyZXEgPSBsaXN0X2VudHJ5KGh3YTc0Mi5wZW5kaW5nX3JlcV9saXN0Lm5leHQsCisJCQkJIHN0cnVjdCBod2E3NDJfcmVxdWVzdCwgZW50cnkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKworCQlpZiAocmVxLT5oYW5kbGVyKHJlcSkgPT0gUkVRX1BFTkRJTkcpCisJCQlyZXR1cm47CisKKwkJY29tcGxldGUgPSByZXEtPmNvbXBsZXRlOworCQljb21wbGV0ZV9kYXRhID0gcmVxLT5jb21wbGV0ZV9kYXRhOworCQlmcmVlX3JlcShyZXEpOworCisJCWlmIChjb21wbGV0ZSkKKwkJCWNvbXBsZXRlKGNvbXBsZXRlX2RhdGEpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc3VibWl0X3JlcV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcHJvY2VzcyA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisJaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QpKSkKKwkJcHJvY2VzcyA9IDA7CisJbGlzdF9zcGxpY2VfaW5pdChoZWFkLCBod2E3NDIucGVuZGluZ19yZXFfbGlzdC5wcmV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKworCWlmIChwcm9jZXNzKQorCQlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHMoKTsKK30KKworc3RhdGljIHZvaWQgcmVxdWVzdF9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBod2E3NDJfcmVxdWVzdAkqcmVxID0gKHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqKWRhdGE7CisJdm9pZAkJCSgqY29tcGxldGUpKHZvaWQgKik7CisJdm9pZAkJCSpjb21wbGV0ZV9kYXRhOworCisJY29tcGxldGUgPSByZXEtPmNvbXBsZXRlOworCWNvbXBsZXRlX2RhdGEgPSByZXEtPmNvbXBsZXRlX2RhdGE7CisKKwlmcmVlX3JlcShyZXEpOworCisJaWYgKGNvbXBsZXRlKQorCQljb21wbGV0ZShjb21wbGV0ZV9kYXRhKTsKKworCXByb2Nlc3NfcGVuZGluZ19yZXF1ZXN0cygpOworfQorCitzdGF0aWMgaW50IHNlbmRfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdXBkYXRlX3BhcmFtICpwYXIgPSAmcmVxLT5wYXIudXBkYXRlOworCWludCB4ID0gcGFyLT54OworCWludCB5ID0gcGFyLT55OworCWludCB3ID0gcGFyLT53aWR0aDsKKwlpbnQgaCA9IHBhci0+aGVpZ2h0OworCWludCBicHA7CisJaW50IGNvbnYsIHRyYW5zbDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgY29sb3JfbW9kZSA9IHBhci0+Y29sb3JfbW9kZTsKKwlpbnQgZmxhZ3MgPSBwYXItPmZsYWdzOworCWludCBzY3Jfd2lkdGggPSBod2E3NDIuZmJkZXYtPnBhbmVsLT54X3JlczsKKwlpbnQgc2NyX2hlaWdodCA9IGh3YTc0Mi5mYmRldi0+cGFuZWwtPnlfcmVzOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJ4ICVkIHkgJWQgdyAlZCBoICVkIHNjcl93aWR0aCAlZCAiCisJCSJjb2xvcl9tb2RlICVkIGZsYWdzICVkXG4iLAorCQl4LCB5LCB3LCBoLCBzY3Jfd2lkdGgsIGNvbG9yX21vZGUsIGZsYWdzKTsKKyNlbmRpZgorCisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQlicHAgPSAxNjsKKwkJY29udiA9IDB4MDg7CisJCXRyYW5zbCA9IDB4MjU7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJYnBwID0gMTI7CisJCWNvbnYgPSAweDA5OworCQl0cmFuc2wgPSAweDI1OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I1NjU6CisJCWJwcCA9IDE2OworCQljb252ID0gMHgwMTsKKwkJdHJhbnNsID0gMHgwNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGh3YTc0Mi5wcmV2X2ZsYWdzICE9IGZsYWdzIHx8CisJICAgIGh3YTc0Mi5wcmV2X2NvbG9yX21vZGUgIT0gY29sb3JfbW9kZSkgeworCQlzZXRfZm9ybWF0X3JlZ3MoY29udiwgdHJhbnNsLCBmbGFncyk7CisJCWh3YTc0Mi5wcmV2X2NvbG9yX21vZGUgPSBjb2xvcl9tb2RlOworCQlod2E3NDIucHJldl9mbGFncyA9IGZsYWdzOworCX0KKwlmbGFncyA9IHJlcS0+cGFyLnVwZGF0ZS5mbGFnczsKKwlpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMpCisJCWVuYWJsZV90ZWFyc3luYyh5LCBzY3Jfd2lkdGgsIGgsIHNjcl9oZWlnaHQsCisJCQkJZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpOworCWVsc2UKKwkJZGlzYWJsZV90ZWFyc3luYygpOworCisJc2V0X3dpbmRvd19yZWdzKHgsIHksIHggKyB3LCB5ICsgaCk7CisKKwlvZmZzZXQgPSAoc2NyX3dpZHRoICogeSArIHgpICogYnBwIC8gODsKKworCWh3YTc0Mi5pbnRfY3RybC0+c2V0dXBfcGxhbmUoT01BUEZCX1BMQU5FX0dGWCwKKwkJCU9NQVBGQl9DSEFOTkVMX09VVF9MQ0QsIG9mZnNldCwgc2NyX3dpZHRoLCAwLCAwLCB3LCBoLAorCQkJY29sb3JfbW9kZSk7CisKKwlod2E3NDIuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSgxNik7CisKKwlod2E3NDIuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShPTUFQRkJfUExBTkVfR0ZYLCAxKTsKKwlod2E3NDIuZXh0aWYtPnRyYW5zZmVyX2FyZWEodywgaCwgcmVxdWVzdF9jb21wbGV0ZSwgcmVxKTsKKworCXJldHVybiBSRVFfUEVORElORzsKK30KKworc3RhdGljIHZvaWQgc2VuZF9mcmFtZV9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworCWh3YTc0Mi5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKE9NQVBGQl9QTEFORV9HRlgsIDApOworfQorCisjZGVmaW5lIEFERF9QUkVRKF94LCBfeSwgX3csIF9oKSBkbyB7CQlcCisJcmVxID0gYWxsb2NfcmVxKCk7CQkJXAorCXJlcS0+aGFuZGxlcgk9IHNlbmRfZnJhbWVfaGFuZGxlcjsJXAorCXJlcS0+Y29tcGxldGUJPSBzZW5kX2ZyYW1lX2NvbXBsZXRlOwlcCisJcmVxLT5wYXIudXBkYXRlLnggPSBfeDsJCQlcCisJcmVxLT5wYXIudXBkYXRlLnkgPSBfeTsJCQlcCisJcmVxLT5wYXIudXBkYXRlLndpZHRoICA9IF93OwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5oZWlnaHQgPSBfaDsJCVwKKwlyZXEtPnBhci51cGRhdGUuY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7XAorCXJlcS0+cGFyLnVwZGF0ZS5mbGFncwkgID0gZmxhZ3M7CVwKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmVudHJ5LCByZXFfaGVhZCk7CVwKK30gd2hpbGUoMCkKKworc3RhdGljIHZvaWQgY3JlYXRlX3JlcV9saXN0KHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKnJlcV9oZWFkKQoreworCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxOworCWludCB4ID0gd2luLT54OworCWludCB5ID0gd2luLT55OworCWludCB3aWR0aCA9IHdpbi0+d2lkdGg7CisJaW50IGhlaWdodCA9IHdpbi0+aGVpZ2h0OworCWludCBjb2xvcl9tb2RlOworCWludCBmbGFnczsKKworCWZsYWdzID0gd2luLT5mb3JtYXQgJiB+T01BUEZCX0ZPUk1BVF9NQVNLOworCWNvbG9yX21vZGUgPSB3aW4tPmZvcm1hdCAmIE9NQVBGQl9GT1JNQVRfTUFTSzsKKworCWlmICh4ICYgMSkgeworCQlBRERfUFJFUSh4LCB5LCAxLCBoZWlnaHQpOworCQl3aWR0aC0tOworCQl4Kys7CisJCWZsYWdzICY9IH5PTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkM7CisJfQorCWlmICh3aWR0aCAmIH4xKSB7CisJCXVuc2lnbmVkIGludCB4c3BhbiA9IHdpZHRoICYgfjE7CisJCXVuc2lnbmVkIGludCB5c3RhcnQgPSB5OworCQl1bnNpZ25lZCBpbnQgeXNwYW4gPSBoZWlnaHQ7CisKKwkJaWYgKHhzcGFuICogaGVpZ2h0ICogMiA+IGh3YTc0Mi5tYXhfdHJhbnNtaXRfc2l6ZSkgeworCQkJeXNwYW4gPSBod2E3NDIubWF4X3RyYW5zbWl0X3NpemUgLyAoeHNwYW4gKiAyKTsKKwkJCUFERF9QUkVRKHgsIHlzdGFydCwgeHNwYW4sIHlzcGFuKTsKKwkJCXlzdGFydCArPSB5c3BhbjsKKwkJCXlzcGFuID0gaGVpZ2h0IC0geXNwYW47CisJCQlmbGFncyAmPSB+T01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DOworCQl9CisKKwkJQUREX1BSRVEoeCwgeXN0YXJ0LCB4c3BhbiwgeXNwYW4pOworCQl4ICs9IHhzcGFuOworCQl3aWR0aCAtPSB4c3BhbjsKKwkJZmxhZ3MgJj0gfk9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQzsKKwl9CisJaWYgKHdpZHRoKQorCQlBRERfUFJFUSh4LCB5LCAxLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBhdXRvX3VwZGF0ZV9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworCWlmICghaHdhNzQyLnN0b3BfYXV0b191cGRhdGUpCisJCW1vZF90aW1lcigmaHdhNzQyLmF1dG9fdXBkYXRlX3RpbWVyLAorCQkJICBqaWZmaWVzICsgSFdBNzQyX0FVVE9fVVBEQVRFX1RJTUUpOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfdXBkYXRlX3dpbmRvd19hdXRvKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpsYXN0OworCisJY3JlYXRlX3JlcV9saXN0KCZod2E3NDIuYXV0b191cGRhdGVfd2luZG93LCAmcmVxX2xpc3QpOworCWxhc3QgPSBsaXN0X2VudHJ5KHJlcV9saXN0LnByZXYsIHN0cnVjdCBod2E3NDJfcmVxdWVzdCwgZW50cnkpOworCisJbGFzdC0+Y29tcGxldGUgPSBhdXRvX3VwZGF0ZV9jb21wbGV0ZTsKKwlsYXN0LT5jb21wbGV0ZV9kYXRhID0gTlVMTDsKKworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworfQorCitpbnQgaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXN5bmMoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQkgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkJIHZvaWQgKCpjb21wbGV0ZV9jYWxsYmFjaykodm9pZCAqYXJnKSwKKwkJCQkgdm9pZCAqY29tcGxldGVfY2FsbGJhY2tfZGF0YSkKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqbGFzdDsKKwlpbnQgciA9IDA7CisKKwlpZiAoaHdhNzQyLnVwZGF0ZV9tb2RlICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFKSB7CisJCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJpbnZhbGlkIHVwZGF0ZSBtb2RlXG4iKTsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAodW5saWtlbHkod2luLT5mb3JtYXQgJgorCSAgICB+KDB4MDMgfCBPTUFQRkJfRk9STUFUX0ZMQUdfRE9VQkxFIHwKKwkgICAgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DIHwgT01BUEZCX0ZPUk1BVF9GTEFHX0ZPUkNFX1ZTWU5DKSkpIHsKKwkJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgImludmFsaWQgd2luZG93IGZsYWciKTsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWNyZWF0ZV9yZXFfbGlzdCh3aW4sICZyZXFfbGlzdCk7CisJbGFzdCA9IGxpc3RfZW50cnkocmVxX2xpc3QucHJldiwgc3RydWN0IGh3YTc0Ml9yZXF1ZXN0LCBlbnRyeSk7CisKKwlsYXN0LT5jb21wbGV0ZSA9IGNvbXBsZXRlX2NhbGxiYWNrOworCWxhc3QtPmNvbXBsZXRlX2RhdGEgPSAodm9pZCAqKWNvbXBsZXRlX2NhbGxiYWNrX2RhdGE7CisKKwlzdWJtaXRfcmVxX2xpc3QoJnJlcV9saXN0KTsKKworb3V0OgorCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChod2E3NDJfdXBkYXRlX3dpbmRvd19hc3luYyk7CisKK3N0YXRpYyBpbnQgaHdhNzQyX3NldHVwX3BsYW5lKGludCBwbGFuZSwgaW50IGNoYW5uZWxfb3V0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBzY3JlZW5fd2lkdGgsCisJCQkJICBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgaW50IGNvbG9yX21vZGUpCit7CisJaWYgKHBsYW5lICE9IE9NQVBGQl9QTEFORV9HRlggfHwKKwkgICAgY2hhbm5lbF9vdXQgIT0gT01BUEZCX0NIQU5ORUxfT1VUX0xDRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBod2E3NDJfZW5hYmxlX3BsYW5lKGludCBwbGFuZSwgaW50IGVuYWJsZSkKK3sKKwlpZiAocGxhbmUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlod2E3NDIuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShwbGFuZSwgZW5hYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5bmNfaGFuZGxlcihzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcSkKK3sKKwljb21wbGV0ZShyZXEtPnBhci5zeW5jKTsKKwlyZXR1cm4gUkVRX0NPTVBMRVRFOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfc3luYyh2b2lkKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKKworCXJlcSA9IGFsbG9jX3JlcSgpOworCisJcmVxLT5oYW5kbGVyID0gc3luY19oYW5kbGVyOworCXJlcS0+Y29tcGxldGUgPSBOVUxMOworCWluaXRfY29tcGxldGlvbigmY29tcCk7CisJcmVxLT5wYXIuc3luYyA9ICZjb21wOworCisJbGlzdF9hZGQoJnJlcS0+ZW50cnksICZyZXFfbGlzdCk7CisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wKTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX2JpbmRfY2xpZW50KHN0cnVjdCBvbWFwZmJfbm90aWZpZXJfYmxvY2sgKm5iKQoreworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJ1cGRhdGVfbW9kZSAlZFxuIiwgaHdhNzQyLnVwZGF0ZV9tb2RlKTsKKwlpZiAoaHdhNzQyLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9NQU5VQUxfVVBEQVRFKSB7CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhod2E3NDIuZmJkZXYsIE9NQVBGQl9FVkVOVF9SRUFEWSk7CisJfQorfQorCitzdGF0aWMgaW50IGh3YTc0Ml9zZXRfdXBkYXRlX21vZGUoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpZiAobW9kZSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSAmJiBtb2RlICE9IE9NQVBGQl9BVVRPX1VQREFURSAmJgorCSAgICBtb2RlICE9IE9NQVBGQl9VUERBVEVfRElTQUJMRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1vZGUgPT0gaHdhNzQyLnVwZGF0ZV9tb2RlKQorCQlyZXR1cm4gMDsKKworCWRldl9pbmZvKGh3YTc0Mi5mYmRldi0+ZGV2LCAiSFdBNzQyOiBzZXR0aW5nIHVwZGF0ZSBtb2RlIHRvICVzXG4iLAorCQkJbW9kZSA9PSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEID8gImRpc2FibGVkIiA6CisJCQkobW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUgPyAiYXV0byIgOiAibWFudWFsIikpOworCisJc3dpdGNoIChod2E3NDIudXBkYXRlX21vZGUpIHsKKwljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgorCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoaHdhNzQyLmZiZGV2LCBPTUFQRkJfRVZFTlRfRElTQUJMRUQpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJaHdhNzQyLnN0b3BfYXV0b191cGRhdGUgPSAxOworCQlkZWxfdGltZXJfc3luYygmaHdhNzQyLmF1dG9fdXBkYXRlX3RpbWVyKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQlicmVhazsKKwl9CisKKwlod2E3NDIudXBkYXRlX21vZGUgPSBtb2RlOworCWh3YTc0Ml9zeW5jKCk7CisJaHdhNzQyLnN0b3BfYXV0b191cGRhdGUgPSAwOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGh3YTc0Mi5mYmRldiwgT01BUEZCX0VWRU5UX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWh3YTc0Ml91cGRhdGVfd2luZG93X2F1dG8oMCk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBod2E3NDJfZ2V0X3VwZGF0ZV9tb2RlKHZvaWQpCit7CisJcmV0dXJuIGh3YTc0Mi51cGRhdGVfbW9kZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcm91bmRfdG9fZXh0aWZfdGlja3ModW5zaWduZWQgbG9uZyBwcywgaW50IGRpdikKK3sKKwlpbnQgYnVzX3RpY2sgPSBod2E3NDIuZXh0aWZfY2xrX3BlcmlvZCAqIGRpdjsKKwlyZXR1cm4gKHBzICsgYnVzX3RpY2sgLSAxKSAvIGJ1c190aWNrICogYnVzX3RpY2s7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19yZWdfdGltaW5nKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgZGl2KQoreworCXN0cnVjdCBleHRpZl90aW1pbmdzICp0OworCXVuc2lnbmVkIGxvbmcgc3lzdGltOworCisJLyogQ1NPblRpbWUgMCwgV0VPblRpbWUgMiBucywgUkVPblRpbWUgMiBucywKKwkgKiBBY2Nlc3NUaW1lIDIgbnMgKyAxMi4yIG5zIChyZWdzKSwKKwkgKiBXRU9mZlRpbWUgPSBXRU9uVGltZSArIDEgbnMsCisJICogUkVPZmZUaW1lID0gUkVPblRpbWUgKyAxNiBucyAocmVncyksCisJICogQ1NPZmZUaW1lID0gUkVPZmZUaW1lICsgMSBucworCSAqIFJlYWRDeWNsZSA9IDJucyArIDIqU1lTQ0xLICAocmVncyksCisJICogV3JpdGVDeWNsZSA9IDIqU1lTQ0xLICsgMiBucywKKwkgKiBDU1B1bHNlV2lkdGggPSAxMCBucyAqLworCXN5c3RpbSA9IDEwMDAwMDAwMDAgLyAoc3lzY2xrIC8gMTAwMCk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIkhXQTc0MiBzeXN0aW0gJWx1IHBzIGV4dGlmX2Nsa19wZXJpb2QgJXUgcHMiCisJCSAgImV4dGlmX2Nsa19kaXYgJWRcbiIsIHN5c3RpbSwgaHdhNzQyLmV4dGlmX2Nsa19wZXJpb2QsIGRpdik7CisKKwl0ID0gJmh3YTc0Mi5yZWdfdGltaW5nczsKKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisJdC0+Y2xrX2RpdiA9IGRpdjsKKwl0LT5jc19vbl90aW1lID0gMDsKKwl0LT53ZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+cmVfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPmFjY2Vzc190aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDEyMjAwLCBkaXYpOworCXQtPndlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+d2Vfb25fdGltZSArIDEwMDAsIGRpdik7CisJdC0+cmVfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgMTYwMDAsIGRpdik7CisJdC0+Y3Nfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vZmZfdGltZSArIDEwMDAsIGRpdik7CisJdC0+d2VfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT53ZV9jeWNsZV90aW1lIDwgdC0+d2Vfb2ZmX3RpbWUpCisJCXQtPndlX2N5Y2xlX3RpbWUgPSB0LT53ZV9vZmZfdGltZTsKKwl0LT5yZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPnJlX2N5Y2xlX3RpbWUgPCB0LT5yZV9vZmZfdGltZSkKKwkJdC0+cmVfY3ljbGVfdGltZSA9IHQtPnJlX29mZl90aW1lOworCXQtPmNzX3B1bHNlX3dpZHRoID0gMDsKKworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbcmVnXWNzb24gJWQgY3NvZmYgJWQgcmVvbiAlZCByZW9mZiAlZFxuIiwKKwkJIHQtPmNzX29uX3RpbWUsIHQtPmNzX29mZl90aW1lLCB0LT5yZV9vbl90aW1lLCB0LT5yZV9vZmZfdGltZSk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltyZWddd2VvbiAlZCB3ZW9mZiAlZCByZWN5YyAlZCB3ZWN5YyAlZFxuIiwKKwkJIHQtPndlX29uX3RpbWUsIHQtPndlX29mZl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCQkgdC0+d2VfY3ljbGVfdGltZSk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltyZWddcmRhY2Nlc3MgJWQgY3NwdWxzZSAlZFxuIiwKKwkJIHQtPmFjY2Vzc190aW1lLCB0LT5jc19wdWxzZV93aWR0aCk7CisKKwlyZXR1cm4gaHdhNzQyLmV4dGlmLT5jb252ZXJ0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19sdXRfdGltaW5nKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgZGl2KQoreworCXN0cnVjdCBleHRpZl90aW1pbmdzICp0OworCXVuc2lnbmVkIGxvbmcgc3lzdGltOworCisJLyogQ1NPblRpbWUgMCwgV0VPblRpbWUgMiBucywgUkVPblRpbWUgMiBucywKKwkgKiBBY2Nlc3NUaW1lIDIgbnMgKyA0ICogU1lTQ0xLICsgMjYgKGx1dCksCisJICogV0VPZmZUaW1lID0gV0VPblRpbWUgKyAxIG5zLAorCSAqIFJFT2ZmVGltZSA9IFJFT25UaW1lICsgNCpTWVNDTEsgKyAyNiBucyAobHV0KSwKKwkgKiBDU09mZlRpbWUgPSBSRU9mZlRpbWUgKyAxIG5zCisJICogUmVhZEN5Y2xlID0gMm5zICsgNCpTWVNDTEsgKyAyNiBucyAobHV0KSwKKwkgKiBXcml0ZUN5Y2xlID0gMipTWVNDTEsgKyAyIG5zLAorCSAqIENTUHVsc2VXaWR0aCA9IDEwIG5zCisJICovCisJc3lzdGltID0gMTAwMDAwMDAwMCAvIChzeXNjbGsgLyAxMDAwKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiSFdBNzQyIHN5c3RpbSAlbHUgcHMgZXh0aWZfY2xrX3BlcmlvZCAldSBwcyIKKwkJICAiZXh0aWZfY2xrX2RpdiAlZFxuIiwgc3lzdGltLCBod2E3NDIuZXh0aWZfY2xrX3BlcmlvZCwgZGl2KTsKKworCXQgPSAmaHdhNzQyLmx1dF90aW1pbmdzOworCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKworCXQtPmNsa19kaXYgPSBkaXY7CisKKwl0LT5jc19vbl90aW1lID0gMDsKKwl0LT53ZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+cmVfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPmFjY2Vzc190aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDQgKiBzeXN0aW0gKworCQkJCQkgICAgICAyNjAwMCwgZGl2KTsKKwl0LT53ZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndlX29uX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDQgKiBzeXN0aW0gKworCQkJCQkgICAgICAyNjAwMCwgZGl2KTsKKwl0LT5jc19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9vZmZfdGltZSkKKwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyMDAwICsgNCAqIHN5c3RpbSArIDI2MDAwLCBkaXYpOworCWlmICh0LT5yZV9jeWNsZV90aW1lIDwgdC0+cmVfb2ZmX3RpbWUpCisJCXQtPnJlX2N5Y2xlX3RpbWUgPSB0LT5yZV9vZmZfdGltZTsKKwl0LT5jc19wdWxzZV93aWR0aCA9IDA7CisKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW2x1dF1jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIsCisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwgdC0+cmVfb25fdGltZSwgdC0+cmVfb2ZmX3RpbWUpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbbHV0XXdlb24gJWQgd2VvZmYgJWQgcmVjeWMgJWQgd2VjeWMgJWRcbiIsCisJCSB0LT53ZV9vbl90aW1lLCB0LT53ZV9vZmZfdGltZSwgdC0+cmVfY3ljbGVfdGltZSwKKwkJIHQtPndlX2N5Y2xlX3RpbWUpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbbHV0XXJkYWNjZXNzICVkIGNzcHVsc2UgJWRcbiIsCisJCSB0LT5hY2Nlc3NfdGltZSwgdC0+Y3NfcHVsc2Vfd2lkdGgpOworCisJcmV0dXJuIGh3YTc0Mi5leHRpZi0+Y29udmVydF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW50IGNhbGNfZXh0aWZfdGltaW5ncyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50ICpleHRpZl9tZW1fZGl2KQoreworCWludCBtYXhfY2xrX2RpdjsKKwlpbnQgZGl2OworCisJaHdhNzQyLmV4dGlmLT5nZXRfY2xrX2luZm8oJmh3YTc0Mi5leHRpZl9jbGtfcGVyaW9kLCAmbWF4X2Nsa19kaXYpOworCWZvciAoZGl2ID0gMTsgZGl2IDwgbWF4X2Nsa19kaXY7IGRpdisrKSB7CisJCWlmIChjYWxjX3JlZ190aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGRpdiA+IG1heF9jbGtfZGl2KQorCQlnb3RvIGVycjsKKworCSpleHRpZl9tZW1fZGl2ID0gZGl2OworCisJZm9yIChkaXYgPSAxOyBkaXYgPCBtYXhfY2xrX2RpdjsgZGl2KyspIHsKKwkJaWYgKGNhbGNfbHV0X3RpbWluZyhzeXNjbGssIGRpdikgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChkaXYgPiBtYXhfY2xrX2RpdikKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWRldl9lcnIoaHdhNzQyLmZiZGV2LT5kZXYsICJjYW4ndCBzZXR1cCB0aW1pbmdzXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfaHdhNzQyX2Nsa19yYXRlcyh1bnNpZ25lZCBsb25nIGV4dF9jbGssCisJCQkJdW5zaWduZWQgbG9uZyAqc3lzX2NsaywgdW5zaWduZWQgbG9uZyAqcGl4X2NsaykKK3sKKwlpbnQgcGl4X2Nsa19zcmM7CisJaW50IHN5c19kaXYgPSAwLCBzeXNfbXVsID0gMDsKKwlpbnQgcGl4X2RpdjsKKworCXBpeF9jbGtfc3JjID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9DTEtfU1JDX1JFRyk7CisJcGl4X2RpdiA9ICgocGl4X2Nsa19zcmMgPj4gMykgJiAweDFmKSArIDE7CisJaWYgKChwaXhfY2xrX3NyYyAmICgweDMgPDwgMSkpID09IDApIHsKKwkJLyogU291cmNlIGlzIHRoZSBQTEwgKi8KKwkJc3lzX2RpdiA9IChod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1BMTF9ESVZfUkVHKSAmIDB4M2YpICsgMTsKKwkJc3lzX211bCA9IChod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1BMTF80X1JFRykgJiAweDdmKSArIDE7CisJCSpzeXNfY2xrID0gZXh0X2NsayAqIHN5c19tdWwgLyBzeXNfZGl2OworCX0gZWxzZQkvKiBlbHNlIHNvdXJjZSBpcyBleHQgY2xrLCBvciBvc2NpbGxhdG9yICovCisJCSpzeXNfY2xrID0gZXh0X2NsazsKKworCSpwaXhfY2xrID0gKnN5c19jbGsgLyBwaXhfZGl2OwkJCS8qIEhaICovCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwKKwkJImV4dF9jbGsgJWxkIHBpeF9zcmMgJWQgcGl4X2RpdiAlZCBzeXNfZGl2ICVkIHN5c19tdWwgJWRcbiIsCisJCWV4dF9jbGssIHBpeF9jbGtfc3JjICYgKDB4MyA8PCAxKSwgcGl4X2Rpdiwgc3lzX2Rpdiwgc3lzX211bCk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgInN5c19jbGsgJWxkIHBpeF9jbGsgJWxkXG4iLAorCQkqc3lzX2NsaywgKnBpeF9jbGspOworfQorCisKK3N0YXRpYyBpbnQgc2V0dXBfdGVhcnN5bmModW5zaWduZWQgbG9uZyBwaXhfY2xrLCBpbnQgZXh0aWZfZGl2KQoreworCWludCBoZGlzcCwgdmRpc3A7CisJaW50IGhuZHAsIHZuZHA7CisJaW50IGhzdywgdnN3OworCWludCBocywgdnM7CisJaW50IGhzX3BvbF9pbnYsIHZzX3BvbF9pbnY7CisJaW50IHVzZV9oc3ZzLCB1c2VfbmRwOworCXU4ICBiOworCisJaHN3ID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9IU19XX1JFRyk7CisJdnN3ID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9WU19XX1JFRyk7CisJaHNfcG9sX2ludiA9ICEoaHN3ICYgMHg4MCk7CisJdnNfcG9sX2ludiA9ICEodnN3ICYgMHg4MCk7CisJaHN3ID0gaHN3ICYgMHg3ZjsKKwl2c3cgPSB2c3cgJiAweDNmOworCisJaGRpc3AgPSAoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9IX0RJU1BfUkVHKSAmIDB4N2YpICogODsKKwl2ZGlzcCA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfVl9ESVNQXzFfUkVHKSArCisJCSgoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9WX0RJU1BfMl9SRUcpICYgMHgzKSA8PCA4KTsKKworCWhuZHAgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0hfTkRQX1JFRykgJiAweDdmOworCXZuZHAgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1ZfTkRQX1JFRyk7CisKKwkvKiB0aW1lIHRvIHRyYW5zZmVyIG9uZSBwaXhlbCAoMTZicHApIGluIHBzICovCisJaHdhNzQyLnBpeF90eF90aW1lID0gaHdhNzQyLnJlZ190aW1pbmdzLndlX2N5Y2xlX3RpbWU7CisJaWYgKGh3YTc0Mi5leHRpZi0+Z2V0X21heF90eF9yYXRlICE9IE5VTEwpIHsKKwkJLyoKKwkJICogVGhlIGV4dGVybmFsIGludGVyZmFjZSBtaWdodCBoYXZlIGEgcmF0ZSBsaW1pdGF0aW9uLAorCQkgKiBpZiBzbywgd2UgaGF2ZSB0byBtYXhpbWl6ZSBvdXIgdHJhbnNmZXIgcmF0ZS4KKwkJICovCisJCXVuc2lnbmVkIGxvbmcgbWluX3R4X3RpbWU7CisJCXVuc2lnbmVkIGxvbmcgbWF4X3R4X3JhdGUgPSBod2E3NDIuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSgpOworCisJCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJtYXhfdHhfcmF0ZSAlbGQgSFpcbiIsCisJCQltYXhfdHhfcmF0ZSk7CisJCW1pbl90eF90aW1lID0gMTAwMDAwMDAwMCAvIChtYXhfdHhfcmF0ZSAvIDEwMDApOyAgLyogcHMgKi8KKwkJaWYgKGh3YTc0Mi5waXhfdHhfdGltZSA8IG1pbl90eF90aW1lKQorCQkJaHdhNzQyLnBpeF90eF90aW1lID0gbWluX3R4X3RpbWU7CisJfQorCisJLyogdGltZSB0byB1cGRhdGUgb25lIGxpbmUgaW4gcHMgKi8KKwlod2E3NDIubGluZV91cGRfdGltZSA9IChoZGlzcCArIGhuZHApICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7CisJaHdhNzQyLmxpbmVfdXBkX3RpbWUgKj0gMTAwMDsKKwlpZiAoaGRpc3AgKiBod2E3NDIucGl4X3R4X3RpbWUgPiBod2E3NDIubGluZV91cGRfdGltZSkKKwkJLyoKKwkJICogdHJhbnNmZXIgc3BlZWQgdG9vIGxvdywgd2UgbWlnaHQgaGF2ZSB0byB1c2UgYm90aAorCQkgKiBIUyBhbmQgVlMKKwkJICovCisJCXVzZV9oc3ZzID0gMTsKKwllbHNlCisJCS8qIGRlY2VudCB0cmFuc2ZlciBzcGVlZCwgd2UnbGwgYWx3YXlzIHVzZSBvbmx5IFZTICovCisJCXVzZV9oc3ZzID0gMDsKKworCWlmICh1c2VfaHN2cyAmJiAoaHNfcG9sX2ludiB8fCB2c19wb2xfaW52KSkgeworCQkvKgorCQkgKiBIUyBvcidlZCB3aXRoIFZTIGRvZXNuJ3Qgd29yaywgdXNlIHRoZSBhY3RpdmUgaGlnaAorCQkgKiBURSBzaWduYWwgYmFzZWQgb24gSE5EUCAvIFZORFAKKwkJICovCisJCXVzZV9uZHAgPSAxOworCQloc19wb2xfaW52ID0gMDsKKwkJdnNfcG9sX2ludiA9IDA7CisJCWhzID0gaG5kcDsKKwkJdnMgPSB2bmRwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFVzZSBIUyBvcidlZCB3aXRoIFZTIGFzIGEgVEUgc2lnbmFsIGlmIGJvdGggYXJlIG5lZWRlZAorCQkgKiBvciBWTkRQIGlmIG9ubHkgdnN5bmMgaXMgbmVlZGVkLgorCQkgKi8KKwkJdXNlX25kcCA9IDA7CisJCWhzID0gaHN3OworCQl2cyA9IHZzdzsKKwkJaWYgKCF1c2VfaHN2cykgeworCQkJaHNfcG9sX2ludiA9IDA7CisJCQl2c19wb2xfaW52ID0gMDsKKwkJfQorCX0KKworCWhzID0gaHMgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsJCQkvKiBwcyAqLworCWhzICo9IDEwMDA7CisKKwl2cyA9IHZzICogKGhkaXNwICsgaG5kcCkgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsJLyogcHMgKi8KKwl2cyAqPSAxMDAwOworCisJaWYgKHZzIDw9IGhzKQorCQlyZXR1cm4gLUVET007CisJLyogc2V0IFZTIHRvIDEyMCUgb2YgSFMgdG8gbWluaW1pemUgVlMgZGV0ZWN0aW9uIHRpbWUgKi8KKwl2cyA9IGhzICogMTIgLyAxMDsKKwkvKiBtaW5pbWl6ZSBIUyB0b28gKi8KKwlocyA9IDEwMDAwOworCisJYiA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfTkRQX0NUUkwpOworCWIgJj0gfjB4MzsKKwliIHw9IHVzZV9oc3ZzID8gMSA6IDA7CisJYiB8PSAodXNlX25kcCAmJiB1c2VfaHN2cykgPyAwIDogMjsKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9ORFBfQ1RSTCwgYik7CisKKwlod2E3NDIudnN5bmNfb25seSA9ICF1c2VfaHN2czsKKworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsCisJCSJwaXhfY2xrICVsZCBIWiBwaXhfdHhfdGltZSAlbGQgcHMgbGluZV91cGRfdGltZSAlbGQgcHNcbiIsCisJCXBpeF9jbGssIGh3YTc0Mi5waXhfdHhfdGltZSwgaHdhNzQyLmxpbmVfdXBkX3RpbWUpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsCisJCSJocyAlZCBwcyB2cyAlZCBwcyBtb2RlICVkIHZzeW5jX29ubHkgJWRcbiIsCisJCWhzLCB2cywgKGIgJiAweDMpLCAhdXNlX2hzdnMpOworCisJcmV0dXJuIGh3YTc0Mi5leHRpZi0+c2V0dXBfdGVhcnN5bmMoMSwgaHMsIHZzLAorCQkJCQkgICAgaHNfcG9sX2ludiwgdnNfcG9sX2ludiwgZXh0aWZfZGl2KTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX2dldF9jYXBzKGludCBwbGFuZSwgc3RydWN0IG9tYXBmYl9jYXBzICpjYXBzKQoreworCWh3YTc0Mi5pbnRfY3RybC0+Z2V0X2NhcHMocGxhbmUsIGNhcHMpOworCWNhcHMtPmN0cmwgfD0gT01BUEZCX0NBUFNfTUFOVUFMX1VQREFURSB8CisJCSAgICAgIE9NQVBGQl9DQVBTX1dJTkRPV19QSVhFTF9ET1VCTEU7CisJaWYgKGh3YTc0Mi50ZV9jb25uZWN0ZWQpCisJCWNhcHMtPmN0cmwgfD0gT01BUEZCX0NBUFNfVEVBUlNZTkM7CisJY2Fwcy0+d25kX2NvbG9yIHw9ICgxIDw8IE9NQVBGQl9DT0xPUl9SR0I1NjUpIHwKKwkJCSAgICgxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjApOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfc3VzcGVuZCh2b2lkKQoreworCWh3YTc0Mi51cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZCA9IGh3YTc0Mi51cGRhdGVfbW9kZTsKKwlod2E3NDJfc2V0X3VwZGF0ZV9tb2RlKE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCS8qIEVuYWJsZSBzbGVlcCBtb2RlICovCisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfUE9XRVJfU0FWRSwgMSA8PCAxKTsKKwlpZiAoaHdhNzQyLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJaHdhNzQyLnBvd2VyX2Rvd24oaHdhNzQyLmZiZGV2LT5kZXYpOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfcmVzdW1lKHZvaWQpCit7CisJaWYgKGh3YTc0Mi5wb3dlcl91cCAhPSBOVUxMKQorCQlod2E3NDIucG93ZXJfdXAoaHdhNzQyLmZiZGV2LT5kZXYpOworCS8qIERpc2FibGUgc2xlZXAgbW9kZSAqLworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX1BPV0VSX1NBVkUsIDApOworCXdoaWxlICgxKSB7CisJCS8qIExvb3AgdW50aWwgUExMIG91dHB1dCBpcyBzdGFiaWxpemVkICovCisJCWlmIChod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1BMTF9ESVZfUkVHKSAmICgxIDw8IDcpKQorCQkJYnJlYWs7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDUpKTsKKwl9CisJaHdhNzQyX3NldF91cGRhdGVfbW9kZShod2E3NDIudXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQpOworfQorCitzdGF0aWMgaW50IGh3YTc0Ml9pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IGV4dF9tb2RlLAorCQkgICAgICAgc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX3ZyYW0pCit7CisJaW50IHIgPSAwLCBpOworCXU4IHJldiwgY29uZjsKKwl1bnNpZ25lZCBsb25nIGV4dF9jbGs7CisJdW5zaWduZWQgbG9uZyBzeXNfY2xrLCBwaXhfY2xrOworCWludCBleHRpZl9tZW1fZGl2OworCXN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqb21hcGZiX2NvbmY7CisJc3RydWN0IGh3YTc0Ml9wbGF0Zm9ybV9kYXRhICpjdHJsX2NvbmY7CisKKwlCVUdfT04oIWZiZGV2LT5leHRfaWYgfHwgIWZiZGV2LT5pbnRfY3RybCk7CisKKwlod2E3NDIuZmJkZXYgPSBmYmRldjsKKwlod2E3NDIuZXh0aWYgPSBmYmRldi0+ZXh0X2lmOworCWh3YTc0Mi5pbnRfY3RybCA9IGZiZGV2LT5pbnRfY3RybDsKKworCW9tYXBmYl9jb25mID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwljdHJsX2NvbmYgPSBvbWFwZmJfY29uZi0+Y3RybF9wbGF0Zm9ybV9kYXRhOworCisJaWYgKGN0cmxfY29uZiA9PSBOVUxMIHx8IGN0cmxfY29uZi0+Z2V0X2Nsb2NrX3JhdGUgPT0gTlVMTCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJIV0E3NDI6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGVycjE7CisJfQorCisJaHdhNzQyLnBvd2VyX2Rvd24gPSBjdHJsX2NvbmYtPnBvd2VyX2Rvd247CisJaHdhNzQyLnBvd2VyX3VwID0gY3RybF9jb25mLT5wb3dlcl91cDsKKworCXNwaW5fbG9ja19pbml0KCZod2E3NDIucmVxX2xvY2spOworCisJaWYgKChyID0gaHdhNzQyLmludF9jdHJsLT5pbml0KGZiZGV2LCAxLCByZXFfdnJhbSkpIDwgMCkKKwkJZ290byBlcnIxOworCisJaWYgKChyID0gaHdhNzQyLmV4dGlmLT5pbml0KGZiZGV2KSkgPCAwKQorCQlnb3RvIGVycjI7CisKKwlleHRfY2xrID0gY3RybF9jb25mLT5nZXRfY2xvY2tfcmF0ZShmYmRldi0+ZGV2KTsKKwlpZiAoKHIgPSBjYWxjX2V4dGlmX3RpbWluZ3MoZXh0X2NsaywgJmV4dGlmX21lbV9kaXYpKSA8IDApCisJCWdvdG8gZXJyMzsKKwlod2E3NDIuZXh0aWYtPnNldF90aW1pbmdzKCZod2E3NDIucmVnX3RpbWluZ3MpOworCWlmIChod2E3NDIucG93ZXJfdXAgIT0gTlVMTCkKKwkJaHdhNzQyLnBvd2VyX3VwKGZiZGV2LT5kZXYpOworCisJY2FsY19od2E3NDJfY2xrX3JhdGVzKGV4dF9jbGssICZzeXNfY2xrLCAmcGl4X2Nsayk7CisJaWYgKChyID0gY2FsY19leHRpZl90aW1pbmdzKHN5c19jbGssICZleHRpZl9tZW1fZGl2KSkgPCAwKQorCQlnb3RvIGVycjQ7CisJaHdhNzQyLmV4dGlmLT5zZXRfdGltaW5ncygmaHdhNzQyLnJlZ190aW1pbmdzKTsKKworCXJldiA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUkVWX0NPREVfUkVHKTsKKwlpZiAoKHJldiAmIDB4ZmMpICE9IDB4ODApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiSFdBNzQyOiBpbnZhbGlkIHJldmlzaW9uICUwMnhcbiIsIHJldik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjQ7CisJfQorCisKKwlpZiAoIShod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1BMTF9ESVZfUkVHKSAmIDB4ODApKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJICAgICAgIkhXQTc0MjogY29udHJvbGxlciBub3QgaW5pdGlhbGl6ZWQgYnkgdGhlIGJvb3Rsb2FkZXJcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnI0OworCX0KKworCWlmIChjdHJsX2NvbmYtPnRlX2Nvbm5lY3RlZCkgeworCQlpZiAoKHIgPSBzZXR1cF90ZWFyc3luYyhwaXhfY2xrLCBleHRpZl9tZW1fZGl2KSkgPCAwKSB7CisJCQlkZXZfZXJyKGh3YTc0Mi5mYmRldi0+ZGV2LAorCQkJICAgICAgICJIV0E3NDI6IGNhbid0IHNldHVwIHRlYXJpbmcgc3luY2hyb25pemF0aW9uXG4iKTsKKwkJCWdvdG8gZXJyNDsKKwkJfQorCQlod2E3NDIudGVfY29ubmVjdGVkID0gMTsKKwl9CisKKwlod2E3NDIubWF4X3RyYW5zbWl0X3NpemUgPSBod2E3NDIuZXh0aWYtPm1heF90cmFuc21pdF9zaXplOworCisJaHdhNzQyLnVwZGF0ZV9tb2RlID0gT01BUEZCX1VQREFURV9ESVNBQkxFRDsKKworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cueCA9IDA7CisJaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdy55ID0gMDsKKwlod2E3NDIuYXV0b191cGRhdGVfd2luZG93LndpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlod2E3NDIuYXV0b191cGRhdGVfd2luZG93LmhlaWdodCA9IGZiZGV2LT5wYW5lbC0+eV9yZXM7CisJaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdy5mb3JtYXQgPSAwOworCisJaW5pdF90aW1lcigmaHdhNzQyLmF1dG9fdXBkYXRlX3RpbWVyKTsKKwlod2E3NDIuYXV0b191cGRhdGVfdGltZXIuZnVuY3Rpb24gPSBod2E3NDJfdXBkYXRlX3dpbmRvd19hdXRvOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lci5kYXRhID0gMDsKKworCWh3YTc0Mi5wcmV2X2NvbG9yX21vZGUgPSAtMTsKKwlod2E3NDIucHJldl9mbGFncyA9IDA7CisKKwlod2E3NDIuZmJkZXYgPSBmYmRldjsKKworCUlOSVRfTElTVF9IRUFEKCZod2E3NDIuZnJlZV9yZXFfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmh3YTc0Mi5wZW5kaW5nX3JlcV9saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShod2E3NDIucmVxX3Bvb2wpOyBpKyspCisJCWxpc3RfYWRkKCZod2E3NDIucmVxX3Bvb2xbaV0uZW50cnksICZod2E3NDIuZnJlZV9yZXFfbGlzdCk7CisJQlVHX09OKGkgPD0gSVJRX1JFUV9QT09MX1NJWkUpOworCXNlbWFfaW5pdCgmaHdhNzQyLnJlcV9zZW1hLCBpIC0gSVJRX1JFUV9QT09MX1NJWkUpOworCisJY29uZiA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfQ09ORklHX1JFRyk7CisJZGV2X2luZm8oZmJkZXYtPmRldiwgIjogRXBzb24gSFdBNzQyIExDRCBjb250cm9sbGVyIHJldiAlZCAiCisJCQkiaW5pdGlhbGl6ZWQgKENORiBwaW5zICV4KVxuIiwgcmV2ICYgMHgwMywgY29uZiAmIDB4MDcpOworCisJcmV0dXJuIDA7CitlcnI0OgorCWlmIChod2E3NDIucG93ZXJfZG93biAhPSBOVUxMKQorCQlod2E3NDIucG93ZXJfZG93bihmYmRldi0+ZGV2KTsKK2VycjM6CisJaHdhNzQyLmV4dGlmLT5jbGVhbnVwKCk7CitlcnIyOgorCWh3YTc0Mi5pbnRfY3RybC0+Y2xlYW51cCgpOworZXJyMToKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX2NsZWFudXAodm9pZCkKK3sKKwlod2E3NDJfc2V0X3VwZGF0ZV9tb2RlKE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCWh3YTc0Mi5leHRpZi0+Y2xlYW51cCgpOworCWh3YTc0Mi5pbnRfY3RybC0+Y2xlYW51cCgpOworCWlmIChod2E3NDIucG93ZXJfZG93biAhPSBOVUxMKQorCQlod2E3NDIucG93ZXJfZG93bihod2E3NDIuZmJkZXYtPmRldik7Cit9CisKK3N0cnVjdCBsY2RfY3RybCBod2E3NDJfY3RybCA9IHsKKwkubmFtZQkJCT0gImh3YTc0MiIsCisJLmluaXQJCQk9IGh3YTc0Ml9pbml0LAorCS5jbGVhbnVwCQk9IGh3YTc0Ml9jbGVhbnVwLAorCS5iaW5kX2NsaWVudAkJPSBod2E3NDJfYmluZF9jbGllbnQsCisJLmdldF9jYXBzCQk9IGh3YTc0Ml9nZXRfY2FwcywKKwkuc2V0X3VwZGF0ZV9tb2RlCT0gaHdhNzQyX3NldF91cGRhdGVfbW9kZSwKKwkuZ2V0X3VwZGF0ZV9tb2RlCT0gaHdhNzQyX2dldF91cGRhdGVfbW9kZSwKKwkuc2V0dXBfcGxhbmUJCT0gaHdhNzQyX3NldHVwX3BsYW5lLAorCS5lbmFibGVfcGxhbmUJCT0gaHdhNzQyX2VuYWJsZV9wbGFuZSwKKwkudXBkYXRlX3dpbmRvdwkJPSBod2E3NDJfdXBkYXRlX3dpbmRvd19hc3luYywKKwkuc3luYwkJCT0gaHdhNzQyX3N5bmMsCisJLnN1c3BlbmQJCT0gaHdhNzQyX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gaHdhNzQyX3Jlc3VtZSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgwN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oMy5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQIEgzIGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdHBzNjUwMTAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2RlZmluZSBNT0RVTEVfTkFNRQkib21hcGZiLWxjZF9oMyIKKworI2RlZmluZSBwcl9lcnIoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgTU9EVUxFX05BTUUgIjogIiBmbXQsICMjIGFyZ3MpCisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoM19wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IGgzX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlpbnQgciA9IDA7CisKKwkvKiBHUElPMSBhbmQgR1BJTzIgb2YgVFBTNjUwMTAgc2VuZCBMQ0RfRU5CS0wgYW5kIExDRF9FTlZERCBzaWduYWxzICovCisJciA9IHRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMSwgSElHSCk7CisJaWYgKCFyKQorCQlyID0gdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU8yLCBISUdIKTsKKwlpZiAocikKKwkJcHJfZXJyKCJVbmFibGUgdG8gdHVybiBvbiBMQ0QgcGFuZWxcbiIpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGgzX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJaW50IHIgPSAwOworCisJLyogR1BJTzEgYW5kIEdQSU8yIG9mIFRQUzY1MDEwIHNlbmQgTENEX0VOQktMIGFuZCBMQ0RfRU5WREQgc2lnbmFscyAqLworCXIgPSB0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzEsIExPVyk7CisJaWYgKCFyKQorCQl0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzIsIExPVyk7CisJaWYgKHIpCisJCXByX2VycigiVW5hYmxlIHRvIHR1cm4gb2ZmIExDRCBwYW5lbFxuIik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGgzX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIGgzX3BhbmVsID0geworCS5uYW1lCQk9ICJoMyIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAorCisJLmRhdGFfbGluZXMJPSAxNiwKKwkuYnBwCQk9IDE2LAorCS54X3JlcwkJPSAyNDAsCisJLnlfcmVzCQk9IDMyMCwKKwkucGl4ZWxfY2xvY2sJPSAxMjAwMCwKKwkuaHN3CQk9IDEyLAorCS5oZnAJCT0gMTQsCisJLmhicAkJPSA3MiAtIDEyLAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAwLAorCS5wY2QJCT0gMCwKKworCS5pbml0CQk9IGgzX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBoM19wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gaDNfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaDNfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBoM19wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmgzX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoM19wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoM19wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgzX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGgzX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaDNfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBoM19wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBoM19wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaDNfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfaDMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBoM19wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmgzX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGgzX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmgzX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGgzX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KGgzX3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oNC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNmYwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIE9NQVAgSDQgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IGg0X3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaDRfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIGludCBoNF9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGg0X3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGg0X3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIGg0X3BhbmVsID0geworCS5uYW1lCQk9ICJoNCIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAorCisJLmJwcAkJPSAxNiwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS54X3JlcwkJPSAyNDAsCisJLnlfcmVzCQk9IDMyMCwKKwkucGl4ZWxfY2xvY2sJPSA2MjUwLAorCS5oc3cJCT0gMTUsCisJLmhmcAkJPSAxNSwKKwkuaGJwCQk9IDYwLAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAxLAorCisJLmluaXQJCT0gaDRfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IGg0X3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBoNF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBoNF9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IGg0X3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBoNF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmaDRfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGg0X3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGg0X3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaDRfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBoNF9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IGg0X3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGg0X3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBoNF9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9oNCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IGg0X3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaDRfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgaDRfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaDRfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaDRfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoaDRfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE1MTAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTUxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MWYzODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE1MTAuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUDE1MTAgSW5ub3ZhdG9yIGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCisJCQkJICAgIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCWZwZ2Ffd3JpdGUoMHg3LCBPTUFQMTUxMF9GUEdBX0xDRF9QQU5FTF9DT05UUk9MKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCWZwZ2Ffd3JpdGUoMHgwLCBPTUFQMTUxMF9GUEdBX0xDRF9QQU5FTF9DT05UUk9MKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5ub3ZhdG9yMTUxMF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBpbm5vdmF0b3IxNTEwX3BhbmVsID0geworCS5uYW1lCQk9ICJpbm4xNTEwIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuYnBwCQk9IDE2LAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLnhfcmVzCQk9IDI0MCwKKwkueV9yZXMJCT0gMzIwLAorCS5waXhlbF9jbG9jawk9IDEyNTAwLAorCS5oc3cJCT0gNDAsCisJLmhmcAkJPSA0MCwKKwkuaGJwCQk9IDcyLAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAwLAorCS5wY2QJCT0gMTIsCisKKwkuaW5pdAkJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGlubm92YXRvcjE1MTBfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZpbm5vdmF0b3IxNTEwX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICAgICBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlubm92YXRvcjE1MTBfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX2lubjE1MTAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNTEwX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlubm92YXRvcjE1MTBfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChpbm5vdmF0b3IxNTEwX3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNjEwLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE2MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTYwNGNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNjEwLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIE9NQVAxNjEwIElubm92YXRvciBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmItbGNkX2gzIgorCisjZGVmaW5lIHByX2VycihmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBNT0RVTEVfTkFNRSAiOiAiIGZtdCwgIyMgYXJncykKKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCisJCQkJICAgIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgciA9IDA7CisKKwlpZiAob21hcF9yZXF1ZXN0X2dwaW8oMTQpKSB7CisJCXByX2VycigiY2FuJ3QgcmVxdWVzdCBHUElPIDE0XG4iKTsKKwkJciA9IC0xOworCQlnb3RvIGV4aXQ7CisJfQorCWlmIChvbWFwX3JlcXVlc3RfZ3BpbygxNSkpIHsKKwkJcHJfZXJyKCJjYW4ndCByZXF1ZXN0IEdQSU8gMTVcbiIpOworCQlvbWFwX2ZyZWVfZ3BpbygxNCk7CisJCXIgPSAtMTsKKwkJZ290byBleGl0OworCX0KKwkvKiBjb25maWd1cmUgR1BJTygxNCwgMTUpIGFzIG91dHB1dHMgKi8KKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigxNCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMTUsIDApOworZXhpdDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCW9tYXBfZnJlZV9ncGlvKDE1KTsKKwlvbWFwX2ZyZWVfZ3BpbygxNCk7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJLyogc2V0IEdQSU8xNCBhbmQgR1BJTzE1IGhpZ2ggKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMTQsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxNSwgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE2MTBfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwkvKiBzZXQgR1BJTzEzLCBHUElPMTQgYW5kIEdQSU8xNSBsb3cgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMTQsIDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxNSwgMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlubm92YXRvcjE2MTBfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgaW5ub3ZhdG9yMTYxMF9wYW5lbCA9IHsKKwkubmFtZQkJPSAiaW5uMTYxMCIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAorCisJLmJwcAkJPSAxNiwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS54X3JlcwkJPSAzMjAsCisJLnlfcmVzCQk9IDI0MCwKKwkucGl4ZWxfY2xvY2sJPSAxMjUwMCwKKwkuaHN3CQk9IDQwLAorCS5oZnAJCT0gNDAsCisJLmhicAkJPSA3MiwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMCwKKwkucGNkCQk9IDEyLAorCisJLmluaXQJCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmaW5ub3ZhdG9yMTYxMF9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgICAgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbm5vdmF0b3IxNjEwX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IGlubm92YXRvcjE2MTBfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9pbm4xNjEwIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlubm92YXRvcjE2MTBfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpbm5vdmF0b3IxNjEwX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlubm92YXRvcjE2MTBfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODAzODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQIE9TSyBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKiBBZGFwdGVkIGZvciBPU0sgYnkgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBvc2tfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvc2tfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIGludCBvc2tfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCS8qIGNvbmZpZ3VyZSBQV0wgcGluICovCisJb21hcF9jZmdfcmVnKFBXTCk7CisKKwkvKiBFbmFibGUgUFdMIHVuaXQgKi8KKwlvbWFwX3dyaXRlYigweDAxLCBPTUFQX1BXTF9DTEtfRU5BQkxFKTsKKworCS8qIFNldCBQV0wgbGV2ZWwgKi8KKwlvbWFwX3dyaXRlYigweEZGLCBPTUFQX1BXTF9FTkFCTEUpOworCisJLyogY29uZmlndXJlIEdQSU8yIGFzIG91dHB1dCAqLworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDIsIDApOworCisJLyogc2V0IEdQSU8yIGhpZ2ggKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3NrX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJLyogU2V0IFBXTCBsZXZlbCB0byB6ZXJvICovCisJb21hcF93cml0ZWIoMHgwMCwgT01BUF9QV0xfRU5BQkxFKTsKKworCS8qIERpc2FibGUgUFdMIHVuaXQgKi8KKwlvbWFwX3dyaXRlYigweDAwLCBPTUFQX1BXTF9DTEtfRU5BQkxFKTsKKworCS8qIHNldCBHUElPMiBsb3cgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMiwgMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9za19wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBvc2tfcGFuZWwgPSB7CisJLm5hbWUJCT0gIm9zayIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAorCisJLmJwcAkJPSAxNiwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS54X3JlcwkJPSAyNDAsCisJLnlfcmVzCQk9IDMyMCwKKwkucGl4ZWxfY2xvY2sJPSAxMjUwMCwKKwkuaHN3CQk9IDQwLAorCS5oZnAJCT0gNDAsCisJLmhicAkJPSA3MiwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMCwKKwkucGNkCQk9IDEyLAorCisJLmluaXQJCT0gb3NrX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBvc2tfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IG9za19wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBvc2tfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBvc2tfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IG9za19wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmb3NrX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvc2tfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9za19wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG9za19wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IG9za19wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBvc2tfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG9za19wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9vc2siLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBvc2tfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvc2tfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgb3NrX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9za19wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvc2tfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQob3NrX3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdGUuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiZGZkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXRlLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFBhbG0gVHVuZ3N0ZW4gRQorICoKKyAqIE9yaWdpbmFsIHZlcnNpb24gOiBSb21haW4gR295ZXQgPHIuZ295ZXRAZ21haWwuY29tPgorICogQ3VycmVudCB2ZXJzaW9uIDogTGF1cmVudCBHb256YWxleiA8cGFsbXRlLmxpbnV4QGZyZWUuZnI+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCisJCQkJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWxtdGVfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWxtdGVfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFsbXRlX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIHBhbG10ZV9wYW5lbCA9IHsKKwkubmFtZQkJPSAicGFsbXRlIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQgfCBPTUFQX0xDRENfSU5WX1ZTWU5DIHwKKwkJCSAgT01BUF9MQ0RDX0lOVl9IU1lOQyB8IE9NQVBfTENEQ19IU1ZTX1JJU0lOR19FREdFIHwKKwkJCSAgT01BUF9MQ0RDX0hTVlNfT1BQT1NJVEUsCisKKwkuZGF0YV9saW5lcwk9IDE2LAorCS5icHAJCT0gOCwKKwkucGl4ZWxfY2xvY2sJPSAxMjAwMCwKKwkueF9yZXMJCT0gMzIwLAorCS55X3JlcwkJPSAzMjAsCisJLmhzdwkJPSA0LAorCS5oZnAJCT0gOCwKKwkuaGJwCQk9IDI4LAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDgsCisJLnZicAkJPSA3LAorCS5wY2QJCT0gMCwKKworCS5pbml0CQk9IHBhbG10ZV9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gcGFsbXRlX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBwYWxtdGVfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gcGFsbXRlX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gcGFsbXRlX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJnBhbG10ZV9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYWxtdGVfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBwYWxtdGVfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBwYWxtdGVfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gcGFsbXRlX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwYWxtdGVfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfcGFsbXRlIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGFsbXRlX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10ZV9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwYWxtdGVfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFsbXRlX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KHBhbG10ZV9wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXR0LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjM0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10dC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIFBhbG0gVHVuZ3N0ZW58VAorICogQ3VycmVudCB2ZXJzaW9uIDogTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4KKyAqCisgKiBNb2RpZmllZCBmcm9tIGxjZF9pbm4xNTEwLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKgorR1BJTzExIC0gYmFja2xpZ2h0CitHUElPMTIgLSBzY3JlZW4gYmxhbmtpbmcKK0dQSU8xMyAtIHNjcmVlbiBibGFua2luZworKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWxtdHRfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWxtdHRfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFsbXR0X3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiBPTUFQRkJfQ0FQU19TRVRfQkFDS0xJR0hUOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIHBhbG10dF9wYW5lbCA9IHsKKwkubmFtZQkJPSAicGFsbXR0IiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQgfCBPTUFQX0xDRENfSU5WX1ZTWU5DIHwKKwkJCU9NQVBfTENEQ19JTlZfSFNZTkMgfCBPTUFQX0xDRENfSFNWU19SSVNJTkdfRURHRSB8CisJCQlPTUFQX0xDRENfSFNWU19PUFBPU0lURSwKKwkuYnBwCQk9IDE2LAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLnhfcmVzCQk9IDMyMCwKKwkueV9yZXMJCT0gMzIwLAorCS5waXhlbF9jbG9jawk9IDEwMDAwLAorCS5oc3cJCT0gNCwKKwkuaGZwCQk9IDgsCisJLmhicAkJPSAyOCwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSA4LAorCS52YnAJCT0gNywKKwkucGNkCQk9IDAsCisKKwkuaW5pdAkJPSBwYWxtdHRfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IHBhbG10dF9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gcGFsbXR0X3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHBhbG10dF9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IHBhbG10dF9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZwYWxtdHRfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGFsbXR0X3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcGFsbXR0X3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gcGFsbXR0X3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHBhbG10dF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGFsbXR0X3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX3BhbG10dCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBhbG10dF9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBwYWxtdHRfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGFsbXR0X3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBhbG10dF9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChwYWxtdHRfcGFuZWxfZHJ2X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtejcxLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG16NzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTYxNzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtejcxLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFBhbG0gWmlyZTcxCisgKgorICogT3JpZ2luYWwgdmVyc2lvbiA6IFJvbWFpbiBHb3lldAorICogQ3VycmVudCB2ZXJzaW9uIDogTGF1cmVudCBHb256YWxlegorICogTW9kaWZpZWQgZm9yIHppcmU3MSA6IE1hcmVrIFZhc3V0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCisJCQkgICAgICBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG16NzFfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKworfQorCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWxtejcxX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhbG16NzFfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIE9NQVBGQl9DQVBTX1NFVF9CQUNLTElHSFQ7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgcGFsbXo3MV9wYW5lbCA9IHsKKwkubmFtZQkJPSAicGFsbXo3MSIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8CisJCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMgfCBPTUFQX0xDRENfSFNWU19SSVNJTkdfRURHRSB8CisJCQkgIE9NQVBfTENEQ19IU1ZTX09QUE9TSVRFLAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLmJwcAkJPSAxNiwKKwkucGl4ZWxfY2xvY2sJPSAyNDAwMCwKKwkueF9yZXMJCT0gMzIwLAorCS55X3JlcwkJPSAzMjAsCisJLmhzdwkJPSA0LAorCS5oZnAJCT0gOCwKKwkuaGJwCQk9IDI4LAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDgsCisJLnZicAkJPSA3LAorCS5wY2QJCT0gMCwKKworCS5pbml0CQk9IHBhbG16NzFfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IHBhbG16NzFfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IHBhbG16NzFfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gcGFsbXo3MV9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IHBhbG16NzFfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJnBhbG16NzFfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGFsbXo3MV9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBhbG16NzFfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBwYWxtejcxX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHBhbG16NzFfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHBhbG16NzFfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfcGFsbXo3MSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwYWxtejcxX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG16NzFfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGFsbXo3MV9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwYWxtejcxX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KHBhbG16NzFfcGFuZWxfZHJ2X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9zeDEuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfc3gxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmMzA2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfc3gxLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFNpZW1lbnMgU1gxIG1vYmlsZSBwaG9uZQorICoKKyAqIEN1cnJlbnQgdmVyc2lvbiA6IFZvdmFuODg4QGdtYWlsLmNvbSwgZ3JlYXQgaGVscCBmcm9tIEZDQTAwMDAwCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tY2JzcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorCisvKgorICogT01BUDMxMCBHUElPIHJlZ2lzdGVycworICovCisjZGVmaW5lIEdQSU9fREFUQV9JTlBVVAkJMHhmZmZjZTAwMAorI2RlZmluZSBHUElPX0RBVEFfT1VUUFVUCTB4ZmZmY2UwMDQKKyNkZWZpbmUgR1BJT19ESVJfQ09OVFJPTAkweGZmZmNlMDA4CisjZGVmaW5lIEdQSU9fSU5UX0NPTlRST0wJMHhmZmZjZTAwYworI2RlZmluZSBHUElPX0lOVF9NQVNLCQkweGZmZmNlMDEwCisjZGVmaW5lIEdQSU9fSU5UX1NUQVRVUwkJMHhmZmZjZTAxNAorI2RlZmluZSBHUElPX1BJTl9DT05UUk9MCTB4ZmZmY2UwMTgKKworCisjZGVmaW5lIEFfTENEX1NTQ19SRAkzCisjZGVmaW5lIEFfTENEX1NTQ19TRAk3CisjZGVmaW5lIF9BX0xDRF9SRVNFVAk5CisjZGVmaW5lIF9BX0xDRF9TU0NfQ1MJMTIKKyNkZWZpbmUgX0FfTENEX1NTQ19BMAkxMworCisjZGVmaW5lIERTUF9SRUcJCTB4RTEwMTcwMjQKKworY29uc3QgdW5zaWduZWQgY2hhciBJTklUXzFbMTJdID0geworCTB4MUMsIDB4MDIsIDB4ODgsIDB4MDAsIDB4MUUsIDB4RTAsIDB4MDAsIDB4REMsIDB4MDAsIDB4MDIsIDB4MDAKK307CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgSU5JVF8yWzEyN10gPSB7CisJMHgxNSwgMHgwMCwgMHgyOSwgMHgwMCwgMHgzRSwgMHgwMCwgMHg1MSwgMHgwMCwKKwkweDY1LCAweDAwLCAweDdBLCAweDAwLCAweDhELCAweDAwLCAweEExLCAweDAwLAorCTB4QjYsIDB4MDAsIDB4QzcsIDB4MDAsIDB4RDgsIDB4MDAsIDB4RUIsIDB4MDAsCisJMHhGQiwgMHgwMCwgMHgwQiwgMHgwMSwgMHgxQiwgMHgwMSwgMHgyNywgMHgwMSwKKwkweDM0LCAweDAxLCAweDQxLCAweDAxLCAweDRDLCAweDAxLCAweDU1LCAweDAxLAorCTB4NUYsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzgsIDB4MDEsCisJMHg3RSwgMHgwMSwgMHg4NiwgMHgwMSwgMHg4QywgMHgwMSwgMHg5NCwgMHgwMSwKKwkweDlCLCAweDAxLCAweEExLCAweDAxLCAweEE0LCAweDAxLCAweEE5LCAweDAxLAorCTB4QUQsIDB4MDEsIDB4QjIsIDB4MDEsIDB4QjcsIDB4MDEsIDB4QkMsIDB4MDEsCisJMHhDMCwgMHgwMSwgMHhDNCwgMHgwMSwgMHhDOCwgMHgwMSwgMHhDQiwgMHgwMSwKKwkweENGLCAweDAxLCAweEQyLCAweDAxLCAweEQ1LCAweDAxLCAweEQ4LCAweDAxLAorCTB4REIsIDB4MDEsIDB4RTAsIDB4MDEsIDB4RTMsIDB4MDEsIDB4RTYsIDB4MDEsCisJMHhFOCwgMHgwMSwgMHhFQiwgMHgwMSwgMHhFRSwgMHgwMSwgMHhGMSwgMHgwMSwKKwkweEYzLCAweDAxLCAweEY4LCAweDAxLCAweEY5LCAweDAxLCAweEZDLCAweDAxLAorCTB4MDAsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDcsIDB4MDIsIDB4MDksIDB4MDIsCisJMHgwRSwgMHgwMiwgMHgxMywgMHgwMiwgMHgxQywgMHgwMiwgMHgwMAorfTsKKworY29uc3QgdW5zaWduZWQgY2hhciBJTklUXzNbMTVdID0geworCTB4MTQsIDB4MjYsIDB4MzMsIDB4M0QsIDB4NDUsIDB4NEQsIDB4NTMsIDB4NTksCisJMHg1RSwgMHg2MywgMHg2NywgMHg2RCwgMHg3MSwgMHg3OCwgMHhGRgorfTsKKworc3RhdGljIHZvaWQgZXBzb25fc2VuZGJ5dGUoaW50IGZsYWcsIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKwlpbnQgaSwgc2hpZnRlciA9IDB4ODA7CisKKwlpZiAoIWZsYWcpCisJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0EwLCAwKTsKKwltZGVsYXkoMik7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19SRCwgMSk7CisKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCBmbGFnKTsKKworCU9NQVBfTUNCU1BfV1JJVEUoT01BUDE1MTBfTUNCU1AzX0JBU0UsIFBDUjAsIDB4MjIwMCk7CisJT01BUF9NQ0JTUF9XUklURShPTUFQMTUxMF9NQ0JTUDNfQkFTRSwgUENSMCwgMHgyMjAyKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCU9NQVBfTUNCU1BfV1JJVEUoT01BUDE1MTBfTUNCU1AzX0JBU0UsIFBDUjAsIDB4MjIwMCk7CisJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfU0QsIHNoaWZ0ZXIgJiBieXRlKTsKKwkJT01BUF9NQ0JTUF9XUklURShPTUFQMTUxMF9NQ0JTUDNfQkFTRSwgUENSMCwgMHgyMjAyKTsKKwkJc2hpZnRlciA+Pj0gMTsKKwl9CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQTAsIDEpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3N5c3RlbSh2b2lkKQoreworCW9tYXBfbWNic3BfcmVxdWVzdChPTUFQX01DQlNQMyk7CisJb21hcF9tY2JzcF9zdG9wKE9NQVBfTUNCU1AzKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfR1BJTyh2b2lkKQoreworCS8qIG5ldyB3YXZlICovCisJb21hcF9yZXF1ZXN0X2dwaW8oQV9MQ0RfU1NDX1JEKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbyhBX0xDRF9TU0NfU0QpOworCW9tYXBfcmVxdWVzdF9ncGlvKF9BX0xDRF9SRVNFVCk7CisJb21hcF9yZXF1ZXN0X2dwaW8oX0FfTENEX1NTQ19DUyk7CisJb21hcF9yZXF1ZXN0X2dwaW8oX0FfTENEX1NTQ19BMCk7CisKKwkvKiBzZXQgYWxsIEdQSU9zIHRvIG91dHB1dCAqLworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKEFfTENEX1NTQ19SRCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oQV9MQ0RfU1NDX1NELCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihfQV9MQ0RfUkVTRVQsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKF9BX0xDRF9TU0NfQ1MsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKF9BX0xDRF9TU0NfQTAsIDApOworCisJLyogc2V0IEdQSU8gZGF0YSAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfUkQsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfU0QsIDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfUkVTRVQsIDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19BMCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfaW5pdCh2b2lkKQoreworCWludCBpOworCisJb21hcF9jZmdfcmVnKE1DQlNQM19DTEtYKTsKKworCW1kZWxheSgyKTsKKwlzZXR1cF9HUElPKCk7CisJbWRlbGF5KDIpOworCisJLyogcmVzZXQgTENEICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19TRCwgMSk7CisJZXBzb25fc2VuZGJ5dGUoMCwgMHgyNSk7CisKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1JFU0VULCAwKTsKKwltZGVsYXkoMTApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfUkVTRVQsIDEpOworCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW1kZWxheSgyKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCwgcGhhc2UgMSAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4Q0EpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQllcHNvbl9zZW5kYnl0ZSgxLCBJTklUXzFbaV0pOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSAyICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhDQik7CisJZm9yIChpID0gMDsgaSA8IDEyNTsgaSsrKQorCQllcHNvbl9zZW5kYnl0ZSgxLCBJTklUXzJbaV0pOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSAyYSAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4Q0MpOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQorCQllcHNvbl9zZW5kYnl0ZSgxLCBJTklUXzNbaV0pOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSAzICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhCQyk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwOCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDQgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweDA3KTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDA1KTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgNSAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4OTQpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA2ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhDNik7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHg4MCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW1kZWxheSgxMDApOyAvKiB1c2VkIHRvIGJlIDEwMDAgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA3ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHgxNik7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMik7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMCk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHhCMSk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDggKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweDc2KTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAwKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAwKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweERCKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgOSAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4QUYpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeDFfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIHZvaWQgc3gxX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiU1gxOiBMQ0QgcGFuZWwgZGlzYWJsZVxuIik7CisJc3gxX3NldG1taXBvd2VyKDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKworCWVwc29uX3NlbmRieXRlKDAsIDB4MjUpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCWVwc29uX3NlbmRieXRlKDAsIDB4QUUpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwltZGVsYXkoMTAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwllcHNvbl9zZW5kYnl0ZSgwLCAweDk1KTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7Cit9CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJsY2Rfc3gxOiBMQ0QgcGFuZWwgZW5hYmxlXG4iKTsKKwlpbml0X3N5c3RlbSgpOworCWRpc3BsYXlfaW5pdCgpOworCisJc3gxX3NldG1taXBvd2VyKDEpOworCXN4MV9zZXRiYWNrbGlnaHQoMHgxOCk7CisJc3gxX3NldGtleWxpZ2h0ICgweDA2KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzeDFfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgc3gxX3BhbmVsID0geworCS5uYW1lCQk9ICJzeDEiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCB8IE9NQVBfTENEQ19JTlZfVlNZTkMgfAorCQkJICBPTUFQX0xDRENfSU5WX0hTWU5DIHwgT01BUF9MQ0RDX0lOVl9QSVhfQ0xPQ0sgfAorCQkJICBPTUFQX0xDRENfSU5WX09VVFBVVF9FTiwKKworCS54X3JlcwkJPSAxNzYsCisJLnlfcmVzCQk9IDIyMCwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS5icHAJCT0gMTYsCisJLmhzdwkJPSA1LAorCS5oZnAJCT0gNSwKKwkuaGJwCQk9IDUsCisJLnZzdwkJPSAyLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDEsCisJLnBpeGVsX2Nsb2NrCT0gMTUwMCwKKworCS5pbml0CQk9IHN4MV9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gc3gxX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBzeDFfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gc3gxX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gc3gxX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBzeDFfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJnN4MV9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN4MV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN4MV9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzeDFfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBzeDFfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBzeDFfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gc3gxX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzeDFfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImxjZF9zeDEiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBzeDFfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzeDFfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgc3gxX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN4MV9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzeDFfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoc3gxX3BhbmVsX2Rydl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwODUxODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jCkBAIC0wLDAgKzEsODkzIEBACisvKgorICogT01BUDEgaW50ZXJuYWwgTENEIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNkZWZpbmUgTU9EVUxFX05BTUUJCQkibGNkYyIKKworI2RlZmluZSBPTUFQX0xDRENfQkFTRQkJCTB4ZmZmZWMwMDAKKyNkZWZpbmUgT01BUF9MQ0RDX1NJWkUJCQkyNTYKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUQkJCUlOVF9MQ0RfQ1RSTAorCisjZGVmaW5lIE9NQVBfTENEQ19DT05UUk9MCQkoT01BUF9MQ0RDX0JBU0UgKyAweDAwKQorI2RlZmluZSBPTUFQX0xDRENfVElNSU5HMAkJKE9NQVBfTENEQ19CQVNFICsgMHgwNCkKKyNkZWZpbmUgT01BUF9MQ0RDX1RJTUlORzEJCShPTUFQX0xDRENfQkFTRSArIDB4MDgpCisjZGVmaW5lIE9NQVBfTENEQ19USU1JTkcyCQkoT01BUF9MQ0RDX0JBU0UgKyAweDBjKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVFVTCQkoT01BUF9MQ0RDX0JBU0UgKyAweDEwKQorI2RlZmluZSBPTUFQX0xDRENfU1VCUEFORUwJCShPTUFQX0xDRENfQkFTRSArIDB4MTQpCisjZGVmaW5lIE9NQVBfTENEQ19MSU5FX0lOVAkJKE9NQVBfTENEQ19CQVNFICsgMHgxOCkKKyNkZWZpbmUgT01BUF9MQ0RDX0RJU1BMQVlfU1RBVFVTCShPTUFQX0xDRENfQkFTRSArIDB4MWMpCisKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfRE9ORQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfVlNZTkMJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX1NZTkNfTE9TVAkoMSA8PCAyKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9BQkMJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0xJTkVfSU5UCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9GVUYJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0xPQURFRF9QQUxFVFRFCSgxIDw8IDYpCisKKyNkZWZpbmUgT01BUF9MQ0RDX0NUUkxfTENEX0VOCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQX0xDRENfQ1RSTF9MQ0RfVEZUCQkoMSA8PCA3KQorI2RlZmluZSBPTUFQX0xDRENfQ1RSTF9MSU5FX0lSUV9DTFJfU0VMCSgxIDw8IDEwKQorCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfVlNZTkMJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfRE9ORQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9MT0FERURfUEFMRVRURQkoMSA8PCA0KQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0xJTkVfTklSUQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9MSU5FCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQX0xDRENfSVJRX01BU0sJCSgoKDEgPDwgNSkgLSAxKSA8PCAyKQorCisjZGVmaW5lIE1BWF9QQUxFVFRFX1NJWkUJCVBBR0VfU0laRQorCitlbnVtIGxjZGNfbG9hZF9tb2RlIHsKKwlPTUFQX0xDRENfTE9BRF9QQUxFVFRFLAorCU9NQVBfTENEQ19MT0FEX0ZSQU1FLAorCU9NQVBfTENEQ19MT0FEX1BBTEVUVEVfQU5EX0ZSQU1FCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbnRyb2xsZXIgeworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCXVwZGF0ZV9tb2RlOworCWludAkJCWV4dF9tb2RlOworCisJdW5zaWduZWQgbG9uZwkJZnJhbWVfb2Zmc2V0OworCWludAkJCXNjcmVlbl93aWR0aDsKKwlpbnQJCQl4cmVzOworCWludAkJCXlyZXM7CisKKwllbnVtIG9tYXBmYl9jb2xvcl9mb3JtYXQJY29sb3JfbW9kZTsKKwlpbnQJCQlicHA7CisJdm9pZAkJCSpwYWxldHRlX3ZpcnQ7CisJZG1hX2FkZHJfdAkJcGFsZXR0ZV9waHlzOworCWludAkJCXBhbGV0dGVfY29kZTsKKwlpbnQJCQlwYWxldHRlX3NpemU7CisKKwl1bnNpZ25lZCBpbnQJCWlycV9tYXNrOworCXN0cnVjdCBjb21wbGV0aW9uCWxhc3RfZnJhbWVfY29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24JcGFsZXR0ZV9sb2FkX2NvbXBsZXRlOworCXN0cnVjdCBjbGsJCSpsY2RfY2s7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworCisJdm9pZAkJCSgqZG1hX2NhbGxiYWNrKSh2b2lkICpkYXRhKTsKKwl2b2lkCQkJKmRtYV9jYWxsYmFja19kYXRhOworCisJaW50CQkJZmJtZW1fYWxsb2NhdGVkOworCWRtYV9hZGRyX3QJCXZyYW1fcGh5czsKKwl2b2lkCQkJKnZyYW1fdmlydDsKKwl1bnNpZ25lZCBsb25nCQl2cmFtX3NpemU7Cit9IGxjZGM7CisKK3N0YXRpYyB2b2lkIGlubGluZSBlbmFibGVfaXJxcyhpbnQgbWFzaykKK3sKKwlsY2RjLmlycV9tYXNrIHw9IG1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIGlubGluZSBkaXNhYmxlX2lycXMoaW50IG1hc2spCit7CisJbGNkYy5pcnFfbWFzayAmPSB+bWFzazsKK30KKworc3RhdGljIHZvaWQgc2V0X2xvYWRfbW9kZShlbnVtIGxjZGNfbG9hZF9tb2RlIG1vZGUpCit7CisJdTMyIGw7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfQ09OVFJPTCk7CisJbCAmPSB+KDMgPDwgMjApOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgT01BUF9MQ0RDX0xPQURfUEFMRVRURToKKwkJbCB8PSAxIDw8IDIwOworCQlicmVhazsKKwljYXNlIE9NQVBfTENEQ19MT0FEX0ZSQU1FOgorCQlsIHw9IDIgPDwgMjA7CisJCWJyZWFrOworCWNhc2UgT01BUF9MQ0RDX0xPQURfUEFMRVRURV9BTkRfRlJBTUU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9jb250cm9sbGVyKHZvaWQpCit7CisJdTMyIGw7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfQ09OVFJPTCk7CisJbCB8PSBPTUFQX0xDRENfQ1RSTF9MQ0RfRU47CisJbCAmPSB+T01BUF9MQ0RDX0lSUV9NQVNLOworCWwgfD0gbGNkYy5pcnFfbWFzayB8IE9NQVBfTENEQ19JUlFfRE9ORTsJLyogZW5hYmxlZCBJUlFzICovCisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbnRyb2xsZXJfYXN5bmModm9pZCkKK3sKKwl1MzIgbDsKKwl1MzIgbWFzazsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19DT05UUk9MKTsKKwltYXNrID0gT01BUF9MQ0RDX0NUUkxfTENEX0VOIHwgT01BUF9MQ0RDX0lSUV9NQVNLOworCS8qCisJICogUHJlc2VydmUgdGhlIERPTkUgbWFzaywgc2luY2Ugd2Ugc3RpbGwgd2FudCB0byBnZXQgdGhlCisJICogZmluYWwgRE9ORSBpcnEuIEl0IHdpbGwgYmUgZGlzYWJsZWQgaW4gdGhlIElSUSBoYW5kbGVyLgorCSAqLworCW1hc2sgJj0gfk9NQVBfTENEQ19JUlFfRE9ORTsKKwlsICY9IH5tYXNrOworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb250cm9sbGVyKHZvaWQpCit7CisJaW5pdF9jb21wbGV0aW9uKCZsY2RjLmxhc3RfZnJhbWVfY29tcGxldGUpOworCWRpc2FibGVfY29udHJvbGxlcl9hc3luYygpOworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZsY2RjLmxhc3RfZnJhbWVfY29tcGxldGUsCisJCQkJbXNlY3NfdG9famlmZmllcyg1MDApKSkKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIEZSQU1FIERPTkVcbiIpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9jb250cm9sbGVyKHUzMiBzdGF0dXMpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzZXRfY291bnQ7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCisJZGlzYWJsZV9jb250cm9sbGVyX2FzeW5jKCk7CisJcmVzZXRfY291bnQrKzsKKwlpZiAocmVzZXRfY291bnQgPT0gMSB8fCB0aW1lX2FmdGVyKGppZmZpZXMsIGxhc3RfamlmZmllcyArIEhaKSkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwKKwkJCSAgInJlc2V0dGluZyAoc3RhdHVzICUjMDEweCxyZXNldCBjb3VudCAlbHUpXG4iLAorCQkJICBzdGF0dXMsIHJlc2V0X2NvdW50KTsKKwkJbGFzdF9qaWZmaWVzID0gamlmZmllczsKKwl9CisJaWYgKHJlc2V0X2NvdW50IDwgMTAwKSB7CisJCWVuYWJsZV9jb250cm9sbGVyKCk7CisJfSBlbHNlIHsKKwkJcmVzZXRfY291bnQgPSAwOworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwKKwkJCSJ0b28gbWFueSByZXNldCBhdHRlbXB0cywgZ2l2aW5nIHVwLlxuIik7CisJfQorfQorCisvKgorICogQ29uZmlndXJlIHRoZSBMQ0QgRE1BIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBtb2RlIHNwZWNpZmllZCBieSBwYXJhbWV0ZXJzCisgKiBpbiBsY2RjLmZiZGV2IGFuZCBmYmRldi0+dmFyLgorICovCitzdGF0aWMgdm9pZCBzZXR1cF9sY2RfZG1hKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGludCBkbWFfZWxlbV90eXBlW10gPSB7CisJCTAsCisJCU9NQVBfRE1BX0RBVEFfVFlQRV9TOCwKKwkJT01BUF9ETUFfREFUQV9UWVBFX1MxNiwKKwkJMCwKKwkJT01BUF9ETUFfREFUQV9UWVBFX1MzMiwKKwl9OworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGxjZGMuZmJkZXYtPmZiX2luZm9bMF0tPnBhcjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZsY2RjLmZiZGV2LT5mYl9pbmZvWzBdLT52YXI7CisJdW5zaWduZWQgbG9uZwlzcmM7CisJaW50CQllc2l6ZSwgeGVsZW0sIHllbGVtOworCisJc3JjID0gbGNkYy52cmFtX3BoeXMgKyBsY2RjLmZyYW1lX29mZnNldDsKKworCXN3aXRjaCAodmFyLT5yb3RhdGUpIHsKKwljYXNlIDA6CisJCWlmIChwbGFuZS0+aW5mby5taXJyb3IgfHwgKHNyYyAmIDMpIHx8CisJCSAgICBsY2RjLmNvbG9yX21vZGUgPT0gT01BUEZCX0NPTE9SX1lVVjQyMCB8fAorCQkgICAgKGxjZGMueHJlcyAmIDEpKQorCQkJZXNpemUgPSAyOworCQllbHNlCisJCQllc2l6ZSA9IDQ7CisJCXhlbGVtID0gbGNkYy54cmVzICogbGNkYy5icHAgLyA4IC8gZXNpemU7CisJCXllbGVtID0gbGNkYy55cmVzOworCQlicmVhazsKKwljYXNlIDkwOgorCWNhc2UgMTgwOgorCWNhc2UgMjcwOgorCQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJCUJVRygpOworCQl9CisJCWVzaXplID0gMjsKKwkJeGVsZW0gPSBsY2RjLnlyZXMgKiBsY2RjLmJwcCAvIDE2OworCQl5ZWxlbSA9IGxjZGMueHJlczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LAorCQkgInNldHVwX2RtYTogc3JjICUjMDEwbHggZXNpemUgJWQgeGVsZW0gJWQgeWVsZW0gJWRcbiIsCisJCSBzcmMsIGVzaXplLCB4ZWxlbSwgeWVsZW0pOworI2VuZGlmCisJb21hcF9zZXRfbGNkX2RtYV9iMShzcmMsIHhlbGVtLCB5ZWxlbSwgZG1hX2VsZW1fdHlwZVtlc2l6ZV0pOworCWlmICghY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJaW50IGJwcCA9IGxjZGMuYnBwOworCisJCS8qCisJCSAqIFlVViBzdXBwb3J0IGlzIG9ubHkgZm9yIGV4dGVybmFsIG1vZGUgd2hlbiB3ZSBoYXZlIHRoZQorCQkgKiBZVVYgd2luZG93IGVtYmVkZGVkIGluIGEgMTZicHAgZnJhbWUgYnVmZmVyLgorCQkgKi8KKwkJaWYgKGxjZGMuY29sb3JfbW9kZSA9PSBPTUFQRkJfQ09MT1JfWVVWNDIwKQorCQkJYnBwID0gMTY7CisJCS8qIFNldCB2aXJ0dWFsIHhyZXMgZWxlbSBzaXplICovCisJCW9tYXBfc2V0X2xjZF9kbWFfYjFfdnhyZXMoCisJCQlsY2RjLnNjcmVlbl93aWR0aCAqIGJwcCAvIDggLyBlc2l6ZSk7CisJCS8qIFNldHVwIHRyYW5zZm9ybWF0aW9ucyAqLworCQlvbWFwX3NldF9sY2RfZG1hX2IxX3JvdGF0aW9uKHZhci0+cm90YXRlKTsKKwkJb21hcF9zZXRfbGNkX2RtYV9iMV9taXJyb3IocGxhbmUtPmluZm8ubWlycm9yKTsKKwl9CisJb21hcF9zZXR1cF9sY2RfZG1hKCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBsY2RjX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gb21hcF9yZWFkbChPTUFQX0xDRENfU1RBVFVTKTsKKworCWlmIChzdGF0dXMgJiAoT01BUF9MQ0RDX1NUQVRfRlVGIHwgT01BUF9MQ0RDX1NUQVRfU1lOQ19MT1NUKSkKKwkJcmVzZXRfY29udHJvbGxlcihzdGF0dXMpOworCWVsc2UgeworCQlpZiAoc3RhdHVzICYgT01BUF9MQ0RDX1NUQVRfRE9ORSkgeworCQkJdTMyIGw7CisKKwkJCS8qCisJCQkgKiBEaXNhYmxlIElSUV9ET05FLiBUaGUgc3RhdHVzIGJpdCB3aWxsIGJlIGNsZWFyZWQKKwkJCSAqIG9ubHkgd2hlbiB0aGUgY29udHJvbGxlciBpcyByZWVuYWJsZWQgYW5kIHdlIGRvbid0CisJCQkgKiB3YW50IHRvIGdldCBtb3JlIGludGVycnVwdHMuCisJCQkgKi8KKwkJCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19DT05UUk9MKTsKKwkJCWwgJj0gfk9NQVBfTENEQ19JUlFfRE9ORTsKKwkJCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKKwkJCWNvbXBsZXRlKCZsY2RjLmxhc3RfZnJhbWVfY29tcGxldGUpOworCQl9CisJCWlmIChzdGF0dXMgJiBPTUFQX0xDRENfU1RBVF9MT0FERURfUEFMRVRURSkgeworCQkJZGlzYWJsZV9jb250cm9sbGVyX2FzeW5jKCk7CisJCQljb21wbGV0ZSgmbGNkYy5wYWxldHRlX2xvYWRfY29tcGxldGUpOworCQl9CisJfQorCisJLyoKKwkgKiBDbGVhciB0aGVzZSBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMuCisJICogU3luY19sb3N0LCBGVUYgYml0cyB3ZXJlIGNsZWFyZWQgYnkgZGlzYWJsaW5nIHRoZSBMQ0QgY29udHJvbGxlcgorCSAqIExPQURFRF9QQUxFVFRFIGNhbiBiZSBjbGVhcmVkIHRoaXMgd2F5IG9ubHkgaW4gcGFsZXR0ZSBvbmx5CisJICogbG9hZCBtb2RlLiBJbiBvdGhlciBsb2FkIG1vZGVzIGl0J3MgY2xlYXJlZCBieSBkaXNhYmxpbmcgdGhlCisJICogY29udHJvbGxlci4KKwkgKi8KKwlzdGF0dXMgJj0gfihPTUFQX0xDRENfU1RBVF9WU1lOQyB8CisJCSAgICBPTUFQX0xDRENfU1RBVF9MT0FERURfUEFMRVRURSB8CisJCSAgICBPTUFQX0xDRENfU1RBVF9BQkMgfAorCQkgICAgT01BUF9MQ0RDX1NUQVRfTElORV9JTlQpOworCW9tYXBfd3JpdGVsKHN0YXR1cywgT01BUF9MQ0RDX1NUQVRVUyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogQ2hhbmdlIHRvIGEgbmV3IHZpZGVvIG1vZGUuIFdlIGRlZmVyIHRoaXMgdG8gYSBsYXRlciB0aW1lIHRvIGF2b2lkIGFueQorICogZmxpY2tlciBhbmQgbm90IHRvIG1lc3MgdXAgdGhlIGN1cnJlbnQgTENEIERNQSBjb250ZXh0LiBGb3IgdGhpcyB3ZSBkaXNhYmxlCisgKiB0aGUgTENEIGNvbnRyb2xlciwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIERPTkUgaXJxIGFmdGVyIHRoZSBsYXN0IGZyYW1lIGhhcworICogYmVlbiB0cmFuc2ZlcnJlZC4gVGhlbiBpdCdsbCBiZSBzYWZlIHRvIHJlY29uZmlndXJlIGJvdGggdGhlIExDRCBjb250cm9sbGVyCisgKiBhcyB3ZWxsIGFzIHRoZSBMQ0QgRE1BLgorICovCitzdGF0aWMgaW50IG9tYXBfbGNkY19zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBzY3JlZW5fd2lkdGgsCisJCQkJIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJIGludCBjb2xvcl9tb2RlKQoreworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmxjZGMuZmJkZXYtPmZiX2luZm9bMF0tPnZhcjsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGxjZGMuZmJkZXYtPnBhbmVsOworCWludCByb3RfeCwgcm90X3k7CisKKwlpZiAodmFyLT5yb3RhdGUgPT0gMCkgeworCQlyb3RfeCA9IHBhbmVsLT54X3JlczsKKwkJcm90X3kgPSBwYW5lbC0+eV9yZXM7CisJfSBlbHNlIHsKKwkJcm90X3ggPSBwYW5lbC0+eV9yZXM7CisJCXJvdF95ID0gcGFuZWwtPnhfcmVzOworCX0KKwlpZiAocGxhbmUgIT0gMCB8fCBjaGFubmVsX291dCAhPSAwIHx8IHBvc194ICE9IDAgfHwgcG9zX3kgIT0gMCB8fAorCSAgICB3aWR0aCA+IHJvdF94IHx8IGhlaWdodCA+IHJvdF95KSB7CisjaWZkZWYgVkVSQk9TRQorCQlkZXZfZGJnKGxjZGMuZmJkZXYtPmRldiwKKwkJCSJpbnZhbGlkIHBsYW5lIHBhcmFtcyBwbGFuZSAlZCBwb3NfeCAlZCBwb3NfeSAlZCAiCisJCQkidyAlZCBoICVkXG4iLCBwbGFuZSwgcG9zX3gsIHBvc195LCB3aWR0aCwgaGVpZ2h0KTsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsY2RjLmZyYW1lX29mZnNldCA9IG9mZnNldDsKKwlsY2RjLnhyZXMgPSB3aWR0aDsKKwlsY2RjLnlyZXMgPSBoZWlnaHQ7CisJbGNkYy5zY3JlZW5fd2lkdGggPSBzY3JlZW5fd2lkdGg7CisJbGNkYy5jb2xvcl9tb2RlID0gY29sb3JfbW9kZTsKKworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfOEJQUDoKKwkJbGNkYy5icHAgPSA4OworCQlsY2RjLnBhbGV0dGVfY29kZSA9IDB4MzAwMDsKKwkJbGNkYy5wYWxldHRlX3NpemUgPSA1MTI7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwkJbGNkYy5icHAgPSAxNjsKKwkJbGNkYy5wYWxldHRlX2NvZGUgPSAweDQwMDA7CisJCWxjZGMucGFsZXR0ZV9zaXplID0gMzI7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjQ0NDoKKwkJbGNkYy5icHAgPSAxNjsKKwkJbGNkYy5wYWxldHRlX2NvZGUgPSAweDQwMDA7CisJCWxjZGMucGFsZXR0ZV9zaXplID0gMzI7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJaWYgKGxjZGMuZXh0X21vZGUpIHsKKwkJCWxjZGMuYnBwID0gMTI7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwkJaWYgKGxjZGMuZXh0X21vZGUpIHsKKwkJCWxjZGMuYnBwID0gMTY7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCS8qIEZJWE1FOiBvdGhlciBCUFBzLgorCQkgKiBicHAxOiBjb2RlICAwLCAgICAgc2l6ZSAyNTYKKwkJICogYnBwMjogY29kZSAgMHgxMDAwIHNpemUgMjU2CisJCSAqIGJwcDQ6IGNvZGUgIDB4MjAwMCBzaXplIDI1NgorCQkgKiBicHAxMjogY29kZSAweDQwMDAgc2l6ZSAzMgorCQkgKi8KKwkJZGV2X2RiZyhsY2RjLmZiZGV2LT5kZXYsICJpbnZhbGlkIGNvbG9yIG1vZGUgJWRcbiIsIGNvbG9yX21vZGUpOworCQlCVUcoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChsY2RjLmV4dF9tb2RlKSB7CisJCXNldHVwX2xjZF9kbWEoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxjZGMudXBkYXRlX21vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFKSB7CisJCWRpc2FibGVfY29udHJvbGxlcigpOworCQlvbWFwX3N0b3BfbGNkX2RtYSgpOworCQlzZXR1cF9sY2RfZG1hKCk7CisJCWVuYWJsZV9jb250cm9sbGVyKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9sY2RjX2VuYWJsZV9wbGFuZShpbnQgcGxhbmUsIGludCBlbmFibGUpCit7CisJZGV2X2RiZyhsY2RjLmZiZGV2LT5kZXYsCisJCSJwbGFuZSAlZCBlbmFibGUgJWQgdXBkYXRlX21vZGUgJWQgZXh0X21vZGUgJWRcbiIsCisJCXBsYW5lLCBlbmFibGUsIGxjZGMudXBkYXRlX21vZGUsIGxjZGMuZXh0X21vZGUpOworCWlmIChwbGFuZSAhPSBPTUFQRkJfUExBTkVfR0ZYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29uZmlndXJlIHRoZSBMQ0QgRE1BIGZvciBhIHBhbGV0dGUgbG9hZCBvcGVyYXRpb24gYW5kIGRvIHRoZSBwYWxldHRlCisgKiBkb3dubG9hZGluZyBzeW5jaHJvbm91c2x5LiBXZSBkb24ndCB1c2UgdGhlIGZyYW1lK3BhbGV0dGUgbG9hZCBtb2RlIG9mCisgKiB0aGUgY29udHJvbGxlciwgc2luY2UgdGhlIHBhbGV0dGUgY2FuIGFsd2F5cyBiZSBkb3dubG9hZGVkIHNlcGVyYXRlbHkuCisgKi8KK3N0YXRpYyB2b2lkIGxvYWRfcGFsZXR0ZSh2b2lkKQoreworCXUxNgkqcGFsZXR0ZTsKKworCXBhbGV0dGUgPSAodTE2ICopbGNkYy5wYWxldHRlX3ZpcnQ7CisKKwkqKHUxNiAqKXBhbGV0dGUgJj0gMHgwZmZmOworCSoodTE2ICopcGFsZXR0ZSB8PSBsY2RjLnBhbGV0dGVfY29kZTsKKworCW9tYXBfc2V0X2xjZF9kbWFfYjEobGNkYy5wYWxldHRlX3BoeXMsCisJCWxjZGMucGFsZXR0ZV9zaXplIC8gNCArIDEsIDEsIE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIpOworCisJb21hcF9zZXRfbGNkX2RtYV9zaW5nbGVfdHJhbnNmZXIoMSk7CisJb21hcF9zZXR1cF9sY2RfZG1hKCk7CisKKwlpbml0X2NvbXBsZXRpb24oJmxjZGMucGFsZXR0ZV9sb2FkX2NvbXBsZXRlKTsKKwllbmFibGVfaXJxcyhPTUFQX0xDRENfSVJRX0xPQURFRF9QQUxFVFRFKTsKKwlzZXRfbG9hZF9tb2RlKE9NQVBfTENEQ19MT0FEX1BBTEVUVEUpOworCWVuYWJsZV9jb250cm9sbGVyKCk7CisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmxjZGMucGFsZXR0ZV9sb2FkX2NvbXBsZXRlLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpCisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBGUkFNRSBET05FXG4iKTsKKwkvKiBUaGUgY29udHJvbGxlciBnZXRzIGRpc2FibGVkIGluIHRoZSBpcnEgaGFuZGxlciAqLworCWRpc2FibGVfaXJxcyhPTUFQX0xDRENfSVJRX0xPQURFRF9QQUxFVFRFKTsKKwlvbWFwX3N0b3BfbGNkX2RtYSgpOworCisJb21hcF9zZXRfbGNkX2RtYV9zaW5nbGVfdHJhbnNmZXIobGNkYy5leHRfbW9kZSk7Cit9CisKKy8qIFVzZWQgb25seSBpbiBpbnRlcm5hbCBjb250cm9sbGVyIG1vZGUgKi8KK3N0YXRpYyBpbnQgb21hcF9sY2RjX3NldGNvbHJlZyh1X2ludCByZWdubywgdTE2IHJlZCwgdTE2IGdyZWVuLCB1MTYgYmx1ZSwKKwkJCSAgICAgICB1MTYgdHJhbnNwLCBpbnQgdXBkYXRlX2h3X3BhbCkKK3sKKwl1MTYgKnBhbGV0dGU7CisKKwlpZiAobGNkYy5jb2xvcl9tb2RlICE9IE9NQVBGQl9DT0xPUl9DTFVUXzhCUFAgfHwgcmVnbm8gPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFsZXR0ZSA9ICh1MTYgKilsY2RjLnBhbGV0dGVfdmlydDsKKworCXBhbGV0dGVbcmVnbm9dICY9IH4weDBmZmY7CisJcGFsZXR0ZVtyZWdub10gfD0gKChyZWQgPj4gMTIpIDw8IDgpIHwgKChncmVlbiA+PiAxMikgPDwgNCApIHwKKwkJCSAgIChibHVlID4+IDEyKTsKKworCWlmICh1cGRhdGVfaHdfcGFsKSB7CisJCWRpc2FibGVfY29udHJvbGxlcigpOworCQlvbWFwX3N0b3BfbGNkX2RtYSgpOworCQlsb2FkX3BhbGV0dGUoKTsKKwkJc2V0dXBfbGNkX2RtYSgpOworCQlzZXRfbG9hZF9tb2RlKE9NQVBfTENEQ19MT0FEX0ZSQU1FKTsKKwkJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2FsY19ja19kaXYoaW50IGlzX3RmdCwgaW50IHBjaywgaW50ICpwY2tfZGl2KQoreworCXVuc2lnbmVkIGxvbmcgbGNrOworCisJcGNrID0gbWF4KDEsIHBjayk7CisJbGNrID0gY2xrX2dldF9yYXRlKGxjZGMubGNkX2NrKTsKKwkqcGNrX2RpdiA9IChsY2sgKyBwY2sgLSAxKSAvIHBjazsKKwlpZiAoaXNfdGZ0KQorCQkqcGNrX2RpdiA9IG1heCgyLCAqcGNrX2Rpdik7CisJZWxzZQorCQkqcGNrX2RpdiA9IG1heCgzLCAqcGNrX2Rpdik7CisJaWYgKCpwY2tfZGl2ID4gMjU1KSB7CisJCS8qIEZJWE1FOiB0cnkgdG8gYWRqdXN0IGxvZ2ljIGNsb2NrIGRpdmlkZXIgYXMgd2VsbCAqLworCQkqcGNrX2RpdiA9IDI1NTsKKwkJZGV2X3dhcm4obGNkYy5mYmRldi0+ZGV2LCAicGl4Y2xvY2sgJWQga0h6IHRvbyBsb3cuXG4iLAorCQkJIHBjayAvIDEwMDApOworCX0KK30KKworc3RhdGljIHZvaWQgaW5saW5lIHNldHVwX3JlZ3Modm9pZCkKK3sKKwl1MzIgbDsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGxjZGMuZmJkZXYtPnBhbmVsOworCWludCBpc190ZnQgPSBwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1BBTkVMX1RGVDsKKwl1bnNpZ25lZCBsb25nIGxjazsKKwlpbnQgcGNkOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCWwgJj0gfk9NQVBfTENEQ19DVFJMX0xDRF9URlQ7CisJbCB8PSBpc190ZnQgPyBPTUFQX0xDRENfQ1RSTF9MQ0RfVEZUIDogMDsKKyNpZmRlZiBDT05GSUdfTUFDSF9PTUFQX1BBTE1URQorLyogRklYTUU6aWYgKG1hY2hpbmVfaXNfb21hcF9wYWxtdGUoKSkgeyAqLworCQkvKiBQYWxtVEUgdXNlcyBhbHRlcm5hdGUgVEZUIHNldHRpbmcgaW4gOEJQUCBtb2RlICovCisJCWwgfD0gKGlzX3RmdCAmJiBwYW5lbC0+YnBwID09IDgpID8gMHg4MTAwMDAgOiAwOworLyoJfSAqLworI2VuZGlmCisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX1RJTUlORzIpOworCWwgJj0gfigoKDEgPDwgNikgLSAxKSA8PCAyMCk7CisJbCB8PSAocGFuZWwtPmNvbmZpZyAmIE9NQVBfTENEQ19TSUdOQUxfTUFTSykgPDwgMjA7CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX1RJTUlORzIpOworCisJbCA9IHBhbmVsLT54X3JlcyAtIDE7CisJbCB8PSAocGFuZWwtPmhzdyAtIDEpIDw8IDEwOworCWwgfD0gKHBhbmVsLT5oZnAgLSAxKSA8PCAxNjsKKwlsIHw9IChwYW5lbC0+aGJwIC0gMSkgPDwgMjQ7CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX1RJTUlORzApOworCisJbCA9IHBhbmVsLT55X3JlcyAtIDE7CisJbCB8PSAocGFuZWwtPnZzdyAtIDEpIDw8IDEwOworCWwgfD0gcGFuZWwtPnZmcCA8PCAxNjsKKwlsIHw9IHBhbmVsLT52YnAgPDwgMjQ7CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX1RJTUlORzEpOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX1RJTUlORzIpOworCWwgJj0gfjB4ZmY7CisKKwlsY2sgPSBjbGtfZ2V0X3JhdGUobGNkYy5sY2RfY2spOworCisJaWYgKCFwYW5lbC0+cGNkKQorCQljYWxjX2NrX2Rpdihpc190ZnQsIHBhbmVsLT5waXhlbF9jbG9jayAqIDEwMDAsICZwY2QpOworCWVsc2UgeworCQlkZXZfd2FybihsY2RjLmZiZGV2LT5kZXYsCisJCSAgICAiUGl4ZWwgY2xvY2sgZGl2aWRlciB2YWx1ZSBpcyBvYnNvbGV0ZS5cbiIKKwkJICAgICJUcnkgdG8gc2V0IHBpeGVsX2Nsb2NrIHRvICVsdSBhbmQgcGNkIHRvIDAgIgorCQkgICAgImluIGRyaXZlcnMvdmlkZW8vb21hcC9sY2RfJXMuYyBhbmQgc3VibWl0IGEgcGF0Y2guXG4iLAorCQkJbGNrIC8gcGFuZWwtPnBjZCAvIDEwMDAsIHBhbmVsLT5uYW1lKTsKKworCQlwY2QgPSBwYW5lbC0+cGNkOworCX0KKwlsIHw9IHBjZCAmIDB4ZmY7CisJbCB8PSBwYW5lbC0+YWNiIDw8IDg7CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX1RJTUlORzIpOworCisJLyogdXBkYXRlIHBhbmVsIGluZm8gd2l0aCB0aGUgZXhhY3QgY2xvY2sgKi8KKwlwYW5lbC0+cGl4ZWxfY2xvY2sgPSBsY2sgLyBwY2QgLyAxMDAwOworfQorCisvKgorICogQ29uZmlndXJlIHRoZSBMQ0QgY29udHJvbGxlciwgZG93bmxvYWQgdGhlIGNvbG9yIHBhbGV0dGUgYW5kIHN0YXJ0IGEgbG9vcGVkCisgKiBETUEgdHJhbnNmZXIgb2YgdGhlIGZyYW1lIGltYWdlIGRhdGEuIENhbGxlZCBvbmx5IGluIGludGVybmFsCisgKiBjb250cm9sbGVyIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgb21hcF9sY2RjX3NldF91cGRhdGVfbW9kZShlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWludCByID0gMDsKKworCWlmIChtb2RlICE9IGxjZGMudXBkYXRlX21vZGUpIHsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQkJc2V0dXBfcmVncygpOworCQkJbG9hZF9wYWxldHRlKCk7CisKKwkJCS8qIFNldHVwIGFuZCBzdGFydCBMQ0QgRE1BICovCisJCQlzZXR1cF9sY2RfZG1hKCk7CisKKwkJCXNldF9sb2FkX21vZGUoT01BUF9MQ0RDX0xPQURfRlJBTUUpOworCQkJZW5hYmxlX2lycXMoT01BUF9MQ0RDX0lSUV9ET05FKTsKKwkJCS8qIFRoaXMgd2lsbCBzdGFydCB0aGUgYWN0dWFsIERNQSB0cmFuc2ZlciAqLworCQkJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwkJCWxjZGMudXBkYXRlX21vZGUgPSBtb2RlOworCQkJYnJlYWs7CisJCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJCWRpc2FibGVfY29udHJvbGxlcigpOworCQkJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwkJCWxjZGMudXBkYXRlX21vZGUgPSBtb2RlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyID0gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgb21hcF9sY2RjX2dldF91cGRhdGVfbW9kZSh2b2lkKQoreworCXJldHVybiBsY2RjLnVwZGF0ZV9tb2RlOworfQorCisvKiBQTSBjb2RlIGNhbGxlZCBvbmx5IGluIGludGVybmFsIGNvbnRyb2xsZXIgbW9kZSAqLworc3RhdGljIHZvaWQgb21hcF9sY2RjX3N1c3BlbmQodm9pZCkKK3sKKwlpZiAobGNkYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJZGlzYWJsZV9jb250cm9sbGVyKCk7CisJCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbWFwX2xjZGNfcmVzdW1lKHZvaWQpCit7CisJaWYgKGxjZGMudXBkYXRlX21vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFKSB7CisJCXNldHVwX3JlZ3MoKTsKKwkJbG9hZF9wYWxldHRlKCk7CisJCXNldHVwX2xjZF9kbWEoKTsKKwkJc2V0X2xvYWRfbW9kZShPTUFQX0xDRENfTE9BRF9GUkFNRSk7CisJCWVuYWJsZV9pcnFzKE9NQVBfTENEQ19JUlFfRE9ORSk7CisJCWVuYWJsZV9jb250cm9sbGVyKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbWFwX2xjZGNfZ2V0X2NhcHMoaW50IHBsYW5lLCBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJcmV0dXJuOworfQorCitpbnQgb21hcF9sY2RjX3NldF9kbWFfY2FsbGJhY2sodm9pZCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlCVUdfT04oY2FsbGJhY2sgPT0gTlVMTCk7CisKKwlpZiAobGNkYy5kbWFfY2FsbGJhY2spCisJCXJldHVybiAtRUJVU1k7CisJZWxzZSB7CisJCWxjZGMuZG1hX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJCWxjZGMuZG1hX2NhbGxiYWNrX2RhdGEgPSBkYXRhOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9sY2RjX3NldF9kbWFfY2FsbGJhY2spOworCit2b2lkIG9tYXBfbGNkY19mcmVlX2RtYV9jYWxsYmFjayh2b2lkKQoreworCWxjZGMuZG1hX2NhbGxiYWNrID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9sY2RjX2ZyZWVfZG1hX2NhbGxiYWNrKTsKKworc3RhdGljIHZvaWQgbGNkY19kbWFfaGFuZGxlcih1MTYgc3RhdHVzLCB2b2lkICpkYXRhKQoreworCWlmIChsY2RjLmRtYV9jYWxsYmFjaykKKwkJbGNkYy5kbWFfY2FsbGJhY2sobGNkYy5kbWFfY2FsbGJhY2tfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbW1hcF9rZXJuKHZvaWQpCit7CisJc3RydWN0IHZtX3N0cnVjdAkqa3ZtYTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QJdm1hOworCXBncHJvdF90CQlwZ3Byb3Q7CisJdW5zaWduZWQgbG9uZwkJdmFkZHI7CisKKwlrdm1hID0gZ2V0X3ZtX2FyZWEobGNkYy52cmFtX3NpemUsIFZNX0lPUkVNQVApOworCWlmIChrdm1hID09IE5VTEwpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQga2VybmVsIHZtIGFyZWFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdm1hLnZtX21tID0gJmluaXRfbW07CisKKwl2YWRkciA9ICh1bnNpZ25lZCBsb25nKWt2bWEtPmFkZHI7CisJdm1hLnZtX3N0YXJ0ID0gdmFkZHI7CisJdm1hLnZtX2VuZCA9IHZhZGRyICsgbGNkYy52cmFtX3NpemU7CisKKwlwZ3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHBncHJvdF9rZXJuZWwpOworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2UoJnZtYSwgdmFkZHIsCisJCQkgICBsY2RjLnZyYW1fcGh5cyA+PiBQQUdFX1NISUZULAorCQkJICAgbGNkYy52cmFtX3NpemUsIHBncHJvdCkgPCAwKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAia2VybmVsIG1tYXAgZm9yIEZCIG1lbW9yeSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlsY2RjLnZyYW1fdmlydCA9ICh2b2lkICopdmFkZHI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5tYXBfa2Vybih2b2lkKQoreworCXZ1bm1hcChsY2RjLnZyYW1fdmlydCk7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfcGFsZXR0ZV9yYW0odm9pZCkKK3sKKwlsY2RjLnBhbGV0dGVfdmlydCA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUobGNkYy5mYmRldi0+ZGV2LAorCQlNQVhfUEFMRVRURV9TSVpFLCAmbGNkYy5wYWxldHRlX3BoeXMsIEdGUF9LRVJORUwpOworCWlmIChsY2RjLnBhbGV0dGVfdmlydCA9PSBOVUxMKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIHBhbGV0dGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChsY2RjLnBhbGV0dGVfdmlydCwgMCwgTUFYX1BBTEVUVEVfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYWxldHRlX3JhbSh2b2lkKQoreworCWRtYV9mcmVlX3dyaXRlY29tYmluZShsY2RjLmZiZGV2LT5kZXYsIE1BWF9QQUxFVFRFX1NJWkUsCisJCQlsY2RjLnBhbGV0dGVfdmlydCwgbGNkYy5wYWxldHRlX3BoeXMpOworfQorCitzdGF0aWMgaW50IGFsbG9jX2ZibWVtKHN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmVnaW9uKQoreworCWludCBicHA7CisJaW50IGZyYW1lX3NpemU7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBsY2RjLmZiZGV2LT5wYW5lbDsKKworCWJwcCA9IHBhbmVsLT5icHA7CisJaWYgKGJwcCA9PSAxMikKKwkJYnBwID0gMTY7CisJZnJhbWVfc2l6ZSA9IFBBR0VfQUxJR04ocGFuZWwtPnhfcmVzICogYnBwIC8gOCAqIHBhbmVsLT55X3Jlcyk7CisJaWYgKHJlZ2lvbi0+c2l6ZSA+IGZyYW1lX3NpemUpCisJCWZyYW1lX3NpemUgPSByZWdpb24tPnNpemU7CisJbGNkYy52cmFtX3NpemUgPSBmcmFtZV9zaXplOworCWxjZGMudnJhbV92aXJ0ID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShsY2RjLmZiZGV2LT5kZXYsCisJCQlsY2RjLnZyYW1fc2l6ZSwgJmxjZGMudnJhbV9waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAobGNkYy52cmFtX3ZpcnQgPT0gTlVMTCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBGQiBETUEgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJlZ2lvbi0+c2l6ZSA9IGZyYW1lX3NpemU7CisJcmVnaW9uLT5wYWRkciA9IGxjZGMudnJhbV9waHlzOworCXJlZ2lvbi0+dmFkZHIgPSBsY2RjLnZyYW1fdmlydDsKKwlyZWdpb24tPmFsbG9jID0gMTsKKworCW1lbXNldChsY2RjLnZyYW1fdmlydCwgMCwgbGNkYy52cmFtX3NpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZmJtZW0odm9pZCkKK3sKKwlkbWFfZnJlZV93cml0ZWNvbWJpbmUobGNkYy5mYmRldi0+ZGV2LCBsY2RjLnZyYW1fc2l6ZSwKKwkJCSAgICAgIGxjZGMudnJhbV92aXJ0LCBsY2RjLnZyYW1fcGh5cyk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX21kKQoreworCWludCByOworCisJaWYgKCFyZXFfbWQtPnJlZ2lvbl9jbnQpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJubyBtZW1vcnkgcmVnaW9ucyBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcV9tZC0+cmVnaW9uX2NudCA+IDEpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJvbmx5IG9uZSBwbGFuZSBpcyBzdXBwb3J0ZWRcbiIpOworCQlyZXFfbWQtPnJlZ2lvbl9jbnQgPSAxOworCX0KKworCWlmIChyZXFfbWQtPnJlZ2lvblswXS5wYWRkciA9PSAwKSB7CisJCWxjZGMuZmJtZW1fYWxsb2NhdGVkID0gMTsKKwkJaWYgKChyID0gYWxsb2NfZmJtZW0oJnJlcV9tZC0+cmVnaW9uWzBdKSkgPCAwKQorCQkJcmV0dXJuIHI7CisJCXJldHVybiAwOworCX0KKworCWxjZGMudnJhbV9waHlzID0gcmVxX21kLT5yZWdpb25bMF0ucGFkZHI7CisJbGNkYy52cmFtX3NpemUgPSByZXFfbWQtPnJlZ2lvblswXS5zaXplOworCisJaWYgKChyID0gbW1hcF9rZXJuKCkpIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlkZXZfZGJnKGxjZGMuZmJkZXYtPmRldiwgInZyYW0gYXQgJTA4eCBzaXplICUwOGx4IG1hcHBlZCB0byAweCVwXG4iLAorCQkgbGNkYy52cmFtX3BoeXMsIGxjZGMudnJhbV9zaXplLCBsY2RjLnZyYW1fdmlydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9mYm1lbSh2b2lkKQoreworCWlmIChsY2RjLmZibWVtX2FsbG9jYXRlZCkKKwkJZnJlZV9mYm1lbSgpOworCWVsc2UKKwkJdW5tYXBfa2VybigpOworfQorCitzdGF0aWMgaW50IG9tYXBfbGNkY19pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IGV4dF9tb2RlLAorCQkJICBzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfdnJhbSkKK3sKKwlpbnQgcjsKKwl1MzIgbDsKKwlpbnQgcmF0ZTsKKwlzdHJ1Y3QgY2xrICp0Y19jazsKKworCWxjZGMuaXJxX21hc2sgPSAwOworCisJbGNkYy5mYmRldiA9IGZiZGV2OworCWxjZGMuZXh0X21vZGUgPSBleHRfbW9kZTsKKworCWwgPSAwOworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKKworCS8qIEZJWE1FOgorCSAqIEFjY29yZGluZyB0byBlcnJhdGEgc29tZSBwbGF0Zm9ybXMgaGF2ZSBhIGNsb2NrIHJhdGUgbGltaXRpYXRpb24KKwkgKi8KKwlsY2RjLmxjZF9jayA9IGNsa19nZXQoTlVMTCwgImxjZF9jayIpOworCWlmIChJU19FUlIobGNkYy5sY2RfY2spKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byBhY2Nlc3MgTENEIGNsb2NrXG4iKTsKKwkJciA9IFBUUl9FUlIobGNkYy5sY2RfY2spOworCQlnb3RvIGZhaWwwOworCX0KKworCXRjX2NrID0gY2xrX2dldChOVUxMLCAidGNfY2siKTsKKwlpZiAoSVNfRVJSKHRjX2NrKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWNjZXNzIFRDIGNsb2NrXG4iKTsKKwkJciA9IFBUUl9FUlIodGNfY2spOworCQlnb3RvIGZhaWwxOworCX0KKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUodGNfY2spOworCWNsa19wdXQodGNfY2spOworCisJaWYgKG1hY2hpbmVfaXNfYW1zX2RlbHRhKCkpCisJCXJhdGUgLz0gNDsKKwlpZiAobWFjaGluZV9pc19vbWFwX2gzKCkpCisJCXJhdGUgLz0gMzsKKwlyID0gY2xrX3NldF9yYXRlKGxjZGMubGNkX2NrLCByYXRlKTsKKwlpZiAocikgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJmYWlsZWQgdG8gYWRqdXN0IExDRCByYXRlXG4iKTsKKwkJZ290byBmYWlsMTsKKwl9CisJY2xrX2VuYWJsZShsY2RjLmxjZF9jayk7CisKKwlyID0gcmVxdWVzdF9pcnEoT01BUF9MQ0RDX0lSUSwgbGNkY19pcnFfaGFuZGxlciwgMCwgTU9EVUxFX05BTUUsIGZiZGV2KTsKKwlpZiAocikgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IElSUVxuIik7CisJCWdvdG8gZmFpbDI7CisJfQorCisJciA9IG9tYXBfcmVxdWVzdF9sY2RfZG1hKGxjZGNfZG1hX2hhbmRsZXIsIE5VTEwpOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgTENEIERNQVxuIik7CisJCWdvdG8gZmFpbDM7CisJfQorCisJb21hcF9zZXRfbGNkX2RtYV9zaW5nbGVfdHJhbnNmZXIoZXh0X21vZGUpOworCW9tYXBfc2V0X2xjZF9kbWFfZXh0X2NvbnRyb2xsZXIoZXh0X21vZGUpOworCisJaWYgKCFleHRfbW9kZSkKKwkJaWYgKChyID0gYWxsb2NfcGFsZXR0ZV9yYW0oKSkgPCAwKQorCQkJZ290byBmYWlsNDsKKworCWlmICgociA9IHNldHVwX2ZibWVtKHJlcV92cmFtKSkgPCAwKQorCQlnb3RvIGZhaWw1OworCisJcHJfaW5mbygib21hcGZiOiBMQ0RDIGluaXRpYWxpemVkXG4iKTsKKworCXJldHVybiAwOworZmFpbDU6CisJaWYgKCFleHRfbW9kZSkKKwkJZnJlZV9wYWxldHRlX3JhbSgpOworZmFpbDQ6CisJb21hcF9mcmVlX2xjZF9kbWEoKTsKK2ZhaWwzOgorCWZyZWVfaXJxKE9NQVBfTENEQ19JUlEsIGxjZGMuZmJkZXYpOworZmFpbDI6CisJY2xrX2Rpc2FibGUobGNkYy5sY2RfY2spOworZmFpbDE6CisJY2xrX3B1dChsY2RjLmxjZF9jayk7CitmYWlsMDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgb21hcF9sY2RjX2NsZWFudXAodm9pZCkKK3sKKwlpZiAoIWxjZGMuZXh0X21vZGUpCisJCWZyZWVfcGFsZXR0ZV9yYW0oKTsKKwljbGVhbnVwX2ZibWVtKCk7CisJb21hcF9mcmVlX2xjZF9kbWEoKTsKKwlmcmVlX2lycShPTUFQX0xDRENfSVJRLCBsY2RjLmZiZGV2KTsKKwljbGtfZGlzYWJsZShsY2RjLmxjZF9jayk7CisJY2xrX3B1dChsY2RjLmxjZF9jayk7Cit9CisKK2NvbnN0IHN0cnVjdCBsY2RfY3RybCBvbWFwMV9pbnRfY3RybCA9IHsKKwkubmFtZQkJCT0gImludGVybmFsIiwKKwkuaW5pdAkJCT0gb21hcF9sY2RjX2luaXQsCisJLmNsZWFudXAJCT0gb21hcF9sY2RjX2NsZWFudXAsCisJLmdldF9jYXBzCQk9IG9tYXBfbGNkY19nZXRfY2FwcywKKwkuc2V0X3VwZGF0ZV9tb2RlCT0gb21hcF9sY2RjX3NldF91cGRhdGVfbW9kZSwKKwkuZ2V0X3VwZGF0ZV9tb2RlCT0gb21hcF9sY2RjX2dldF91cGRhdGVfbW9kZSwKKwkudXBkYXRlX3dpbmRvdwkJPSBOVUxMLAorCS5zdXNwZW5kCQk9IG9tYXBfbGNkY19zdXNwZW5kLAorCS5yZXN1bWUJCQk9IG9tYXBfbGNkY19yZXN1bWUsCisJLnNldHVwX3BsYW5lCQk9IG9tYXBfbGNkY19zZXR1cF9wbGFuZSwKKwkuZW5hYmxlX3BsYW5lCQk9IG9tYXBfbGNkY19lbmFibGVfcGxhbmUsCisJLnNldGNvbHJlZwkJPSBvbWFwX2xjZGNfc2V0Y29scmVnLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmggYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjczMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBMQ0RDX0gKKyNkZWZpbmUgTENEQ19ICisKK2ludCBvbWFwX2xjZGNfc2V0X2RtYV9jYWxsYmFjayh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKK3ZvaWQgb21hcF9sY2RjX2ZyZWVfZG1hX2NhbGxiYWNrKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jIGIvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkMGY3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCkBAIC0wLDAgKzEsMTk0MSBAQAorLyoKKyAqIEZyYW1lYnVmZmVyIGRyaXZlciBmb3IgVEkgT01BUCBib2FyZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIEFja25vd2xlZGdlbWVudHM6CisgKiAgIEFsZXggTWNNYWlucyA8YWFtQHJpZGdlcnVuLmNvbT4gICAgICAgLSBPcmlnaW5hbCBkcml2ZXIKKyAqICAgSnVoYSBZcmpvbGEgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4gICAtIE9yaWdpbmFsIGRyaXZlciBhbmQgaW1wcm92ZW1lbnRzCisgKiAgIERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPiAgLSBjaGFuZ2VzIGZvciAyLjYga2VybmVsIEFQSQorICogICBUZXhhcyBJbnN0cnVtZW50cyAgICAgICAgICAgICAgICAgICAgIC0gSDMgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2RlZmluZSBNT0RVTEVfTkFNRQkib21hcGZiIgorCitzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9hY2NlbDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nCWRlZl92cmFtW09NQVBGQl9QTEFORV9OVU1dOworc3RhdGljIGludAkJZGVmX3ZyYW1fY250Oworc3RhdGljIHVuc2lnbmVkIGxvbmcJZGVmX3Z4cmVzOworc3RhdGljIHVuc2lnbmVkIGxvbmcJZGVmX3Z5cmVzOworc3RhdGljIHVuc2lnbmVkIGludAlkZWZfcm90YXRlOworc3RhdGljIHVuc2lnbmVkIGludAlkZWZfbWlycm9yOworCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTUFOVUFMX1VQREFURQorc3RhdGljIGludAkJbWFudWFsX3VwZGF0ZSA9IDE7CisjZWxzZQorc3RhdGljIGludAkJbWFudWFsX3VwZGF0ZTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZQkqZmJkZXZfcGRldjsKK3N0YXRpYyBzdHJ1Y3QgbGNkX3BhbmVsCQkqZmJkZXZfcGFuZWw7CitzdGF0aWMgc3RydWN0IG9tYXBmYl9kZXZpY2UJKm9tYXBmYl9kZXY7CisKK3N0cnVjdCBjYXBzX3RhYmxlX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IGNhcHNfdGFibGVfc3RydWN0IGN0cmxfY2Fwc1tdID0geworCXsgT01BUEZCX0NBUFNfTUFOVUFMX1VQREFURSwgICJtYW51YWwgdXBkYXRlIiB9LAorCXsgT01BUEZCX0NBUFNfVEVBUlNZTkMsICAgICAgICJ0ZWFyaW5nIHN5bmNocm9uaXphdGlvbiIgfSwKKwl7IE9NQVBGQl9DQVBTX1BMQU5FX1JFTE9DQVRFX01FTSwgInJlbG9jYXRlIHBsYW5lIG1lbW9yeSIgfSwKKwl7IE9NQVBGQl9DQVBTX1BMQU5FX1NDQUxFLCAgICAic2NhbGUgcGxhbmUiIH0sCisJeyBPTUFQRkJfQ0FQU19XSU5ET1dfUElYRUxfRE9VQkxFLCAicGl4ZWwgZG91YmxlIHdpbmRvdyIgfSwKKwl7IE9NQVBGQl9DQVBTX1dJTkRPV19TQ0FMRSwgICAic2NhbGUgd2luZG93IiB9LAorCXsgT01BUEZCX0NBUFNfV0lORE9XX09WRVJMQVksICJvdmVybGF5IHdpbmRvdyIgfSwKKwl7IE9NQVBGQl9DQVBTX1NFVF9CQUNLTElHSFQsICAiYmFja2xpZ2h0IHNldHRpbmciIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNhcHNfdGFibGVfc3RydWN0IGNvbG9yX2NhcHNbXSA9IHsKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1JHQjU2NSwJIlJHQjU2NSIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjIsCSJZVVY0MjIiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfWVVWNDIwLAkiWVVWNDIwIiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfOEJQUCwJIkNMVVQ4IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfNEJQUCwJIkNMVVQ0IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfMkJQUCwJIkNMVVQyIiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfMUJQUCwJIkNMVVQxIiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1JHQjQ0NCwJIlJHQjQ0NCIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9ZVVk0MjIsCSJZVVk0MjIiLCB9LAorfTsKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTENEIHBhbmVsCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBvbWFwMV9pbnRfY3RybDsKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgb21hcDJfaW50X2N0cmw7CitleHRlcm4gc3RydWN0IGxjZF9jdHJsIGh3YTc0Ml9jdHJsOworZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBibGl6emFyZF9jdHJsOworCitzdGF0aWMgc3RydWN0IGxjZF9jdHJsICpjdHJsc1tdID0geworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCisJJm9tYXAxX2ludF9jdHJsLAorI2Vsc2UKKwkmb21hcDJfaW50X2N0cmwsCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX0xDRENfSFdBNzQyCisJJmh3YTc0Ml9jdHJsLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19CTElaWkFSRAorCSZibGl6emFyZF9jdHJsLAorI2VuZGlmCit9OworCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCitleHRlcm4gc3RydWN0IGxjZF9jdHJsX2V4dGlmIG9tYXAxX2V4dF9pZjsKKyNlbHNlCitleHRlcm4gc3RydWN0IGxjZF9jdHJsX2V4dGlmIG9tYXAyX2V4dF9pZjsKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG9tYXBmYl9ycXVldWVfbG9jayhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJbXV0ZXhfbG9jaygmZmJkZXYtPnJxdWV1ZV9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl9ycXVldWVfdW5sb2NrKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwltdXRleF91bmxvY2soJmZiZGV2LT5ycXVldWVfbXV0ZXgpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMQ0QgY29udHJvbGxlciBhbmQgTENEIERNQQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIExvb2t1cCB0YWJsZSB0byBtYXAgZWxlbSBzaXplIHRvIGVsZW0gdHlwZS4gKi8KK3N0YXRpYyBjb25zdCBpbnQgZG1hX2VsZW1fdHlwZVtdID0geworCTAsCisJT01BUF9ETUFfREFUQV9UWVBFX1M4LAorCU9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCisJMCwKKwlPTUFQX0RNQV9EQVRBX1RZUEVfUzMyLAorfTsKKworLyoKKyAqIEFsbG9jYXRlIHJlc291cmNlcyBuZWVkZWQgZm9yIExDRCBjb250cm9sbGVyIGFuZCBMQ0QgRE1BIG9wZXJhdGlvbnMuIFZpZGVvCisgKiBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20gc3lzdGVtIG1lbW9yeSBhY2NvcmRpbmcgdG8gdGhlIHZpcnR1YWwgZGlzcGxheQorICogc2l6ZSwgZXhjZXB0IGlmIGEgYmlnZ2VyIG1lbW9yeSBzaXplIGlzIHNwZWNpZmllZCBleHBsaWNpdGx5IGFzIGEga2VybmVsCisgKiBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQgY3RybF9pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgcjsKKwlpbnQgaTsKKworCS8qIGtlcm5lbC9tb2R1bGUgdnJhbSBwYXJhbWV0ZXJzIG92ZXJyaWRlIGJvb3QgdGFncy9ib2FyZCBjb25maWcgKi8KKwlpZiAoZGVmX3ZyYW1fY250KSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZWZfdnJhbV9jbnQ7IGkrKykKKwkJCWZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0uc2l6ZSA9CisJCQkJUEFHRV9BTElHTihkZWZfdnJhbVtpXSk7CisJCWZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250ID0gaTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKmNvbmY7CisKKwkJY29uZiA9IGZiZGV2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJCWZiZGV2LT5tZW1fZGVzYyA9IGNvbmYtPm1lbV9kZXNjOworCX0KKworCWlmICghZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQpIHsKKwkJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisJCWludCBkZWZfc2l6ZTsKKwkJaW50IGJwcCA9IHBhbmVsLT5icHA7CisKKwkJLyogMTIgYnBwIGlzIHBhY2tlZCBpbiAxNiBiaXRzICovCisJCWlmIChicHAgPT0gMTIpCisJCQlicHAgPSAxNjsKKwkJZGVmX3NpemUgPSBkZWZfdnhyZXMgKiBkZWZfdnlyZXMgKiBicHAgLyA4OworCQlmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudCA9IDE7CisJCWZiZGV2LT5tZW1fZGVzYy5yZWdpb25bMF0uc2l6ZSA9IFBBR0VfQUxJR04oZGVmX3NpemUpOworCX0KKwlyID0gZmJkZXYtPmN0cmwtPmluaXQoZmJkZXYsIDAsICZmYmRldi0+bWVtX2Rlc2MpOworCWlmIChyIDwgMCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJjb250cm9sbGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCAoJWQpXG4iLAorCQkJcik7CisJCXJldHVybiByOworCX0KKworI2lmZGVmIERFQlVHCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250OyBpKyspIHsKKwkJZGV2X2RiZyhmYmRldi0+ZGV2LCAicmVnaW9uJWQgcGh5cyAlMDh4IHZpcnQgJXAgc2l6ZT0lbHVcbiIsCisJCQkgaSwKKwkJCSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnBhZGRyLAorCQkJIGZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0udmFkZHIsCisJCQkgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS5zaXplKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3RybF9jbGVhbnVwKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlmYmRldi0+Y3RybC0+Y2xlYW51cCgpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGZiZGV2LT5ycXVldWVfbXV0ZXggaGVsZC4gKi8KK3N0YXRpYyBpbnQgY3RybF9jaGFuZ2VfbW9kZShzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCWludCByOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPnZhcjsKKworCW9mZnNldCA9IHZhci0+eW9mZnNldCAqIGZiaS0+Zml4LmxpbmVfbGVuZ3RoICsKKwkJIHZhci0+eG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OworCisJaWYgKGZiZGV2LT5jdHJsLT5zeW5jKQorCQlmYmRldi0+Y3RybC0+c3luYygpOworCXIgPSBmYmRldi0+Y3RybC0+c2V0dXBfcGxhbmUocGxhbmUtPmlkeCwgcGxhbmUtPmluZm8uY2hhbm5lbF9vdXQsCisJCQkJIG9mZnNldCwgdmFyLT54cmVzX3ZpcnR1YWwsCisJCQkJIHBsYW5lLT5pbmZvLnBvc194LCBwbGFuZS0+aW5mby5wb3NfeSwKKwkJCQkgdmFyLT54cmVzLCB2YXItPnlyZXMsIHBsYW5lLT5jb2xvcl9tb2RlKTsKKwlpZiAoZmJkZXYtPmN0cmwtPnNldF9zY2FsZSAhPSBOVUxMKQorCQlyID0gZmJkZXYtPmN0cmwtPnNldF9zY2FsZShwbGFuZS0+aWR4LAorCQkJCSAgIHZhci0+eHJlcywgdmFyLT55cmVzLAorCQkJCSAgIHBsYW5lLT5pbmZvLm91dF93aWR0aCwKKwkJCQkgICBwbGFuZS0+aW5mby5vdXRfaGVpZ2h0KTsKKworCXJldHVybiByOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYmRldiBmcmFtZXdvcmsgY2FsbGJhY2tzIGFuZCB0aGUgaW9jdGwgaW50ZXJmYWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogQ2FsbGVkIGVhY2ggdGltZSB0aGUgb21hcGZiIGRldmljZSBpcyBvcGVuZWQgKi8KK3N0YXRpYyBpbnQgb21hcGZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisKKy8qIENhbGxlZCB3aGVuIHRoZSBvbWFwZmIgZGV2aWNlIGlzIGNsb3NlZC4gV2UgbWFrZSBzdXJlIHRoYXQgYW55IHBlbmRpbmcKKyAqIGdmeCBETUEgb3BlcmF0aW9ucyBhcmUgZW5kZWQsIGJlZm9yZSB3ZSByZXR1cm4uICovCitzdGF0aWMgaW50IG9tYXBmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKK3sKKwlvbWFwZmJfc3luYyhpbmZvKTsKKwlyZXR1cm4gMDsKK30KKworLyogU3RvcmUgYSBzaW5nbGUgY29sb3IgcGFsZXR0ZSBlbnRyeSBpbnRvIGEgcHNldWRvIHBhbGV0dGUgb3IgdGhlIGhhcmR3YXJlCisgKiBwYWxldHRlIGlmIG9uZSBpcyBhdmFpbGFibGUuIEZvciBub3cgd2Ugc3VwcG9ydCBvbmx5IDE2YnBwIGFuZCB0aHVzIHN0b3JlCisgKiB0aGUgZW50cnkgb25seSB0byB0aGUgcHNldWRvIHBhbGV0dGUuCisgKi8KK3N0YXRpYyBpbnQgX3NldGNvbHJlZyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sCisJCQl1X2ludCBibHVlLCB1X2ludCB0cmFuc3AsIGludCB1cGRhdGVfaHdfcGFsKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGluZm8tPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOworCWludCByID0gMDsKKworCXN3aXRjaCAocGxhbmUtPmNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCWNhc2UgT01BUEZCX0NPTE9SX1lVWTQyMjoKKwkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfOEJQUDoKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzRCUFA6CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQOgorCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfMUJQUDoKKwkJaWYgKGZiZGV2LT5jdHJsLT5zZXRjb2xyZWcpCisJCQlyID0gZmJkZXYtPmN0cmwtPnNldGNvbHJlZyhyZWdubywgcmVkLCBncmVlbiwgYmx1ZSwKKwkJCQkJCQl0cmFuc3AsIHVwZGF0ZV9od19wYWwpOworCQkvKiBGYWxsdGhyb3VnaCAqLworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I0NDQ6CisJCWlmIChyICE9IDApCisJCQlicmVhazsKKworCQlpZiAocmVnbm8gPCAwKSB7CisJCQlyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJlZ25vIDwgMTYpIHsKKwkJCXUxNiBwYWw7CisJCQlwYWwgPSAoKHJlZCA+PiAoMTYgLSB2YXItPnJlZC5sZW5ndGgpKSA8PAorCQkJCQl2YXItPnJlZC5vZmZzZXQpIHwKKwkJCSAgICAgICgoZ3JlZW4gPj4gKDE2IC0gdmFyLT5ncmVlbi5sZW5ndGgpKSA8PAorCQkJCQl2YXItPmdyZWVuLm9mZnNldCkgfAorCQkJICAgICAgKGJsdWUgPj4gKDE2IC0gdmFyLT5ibHVlLmxlbmd0aCkpOworCQkJKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSBwYWw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCisJCQkgICAgdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gX3NldGNvbHJlZyhpbmZvLCByZWdubywgcmVkLCBncmVlbiwgYmx1ZSwgdHJhbnNwLCAxKTsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0Y21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IGNvdW50LCBpbmRleCwgcjsKKwl1MTYgKnJlZCwgKmdyZWVuLCAqYmx1ZSwgKnRyYW5zcDsKKwl1MTYgdHJhbnMgPSAweGZmZmY7CisKKwlyZWQgICAgID0gY21hcC0+cmVkOworCWdyZWVuICAgPSBjbWFwLT5ncmVlbjsKKwlibHVlICAgID0gY21hcC0+Ymx1ZTsKKwl0cmFuc3AgID0gY21hcC0+dHJhbnNwOworCWluZGV4ICAgPSBjbWFwLT5zdGFydDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGNtYXAtPmxlbjsgY291bnQrKykgeworCQlpZiAodHJhbnNwKQorCQkJdHJhbnMgPSAqdHJhbnNwKys7CisJCXIgPSBfc2V0Y29scmVnKGluZm8sIGluZGV4KyssICpyZWQrKywgKmdyZWVuKyssICpibHVlKyssIHRyYW5zLAorCQkJCWNvdW50ID09IGNtYXAtPmxlbiAtIDEpOworCQlpZiAociAhPSAwKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3VwZGF0ZV9mdWxsX3NjcmVlbihzdHJ1Y3QgZmJfaW5mbyAqZmJpKTsKKworc3RhdGljIGludCBvbWFwZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgZG9fdXBkYXRlID0gMDsKKwlpbnQgciA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXN3aXRjaCAoYmxhbmspIHsKKwljYXNlIFZFU0FfTk9fQkxBTktJTkc6CisJCWlmIChmYmRldi0+c3RhdGUgPT0gT01BUEZCX1NVU1BFTkRFRCkgeworCQkJaWYgKGZiZGV2LT5jdHJsLT5yZXN1bWUpCisJCQkJZmJkZXYtPmN0cmwtPnJlc3VtZSgpOworCQkJZmJkZXYtPnBhbmVsLT5lbmFibGUoZmJkZXYtPnBhbmVsKTsKKwkJCWZiZGV2LT5zdGF0ZSA9IE9NQVBGQl9BQ1RJVkU7CisJCQlpZiAoZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpID09CisJCQkJCU9NQVBGQl9NQU5VQUxfVVBEQVRFKQorCQkJCWRvX3VwZGF0ZSA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWRVNBX1BPV0VSRE9XTjoKKwkJaWYgKGZiZGV2LT5zdGF0ZSA9PSBPTUFQRkJfQUNUSVZFKSB7CisJCQlmYmRldi0+cGFuZWwtPmRpc2FibGUoZmJkZXYtPnBhbmVsKTsKKwkJCWlmIChmYmRldi0+Y3RybC0+c3VzcGVuZCkKKwkJCQlmYmRldi0+Y3RybC0+c3VzcGVuZCgpOworCQkJZmJkZXYtPnN0YXRlID0gT01BUEZCX1NVU1BFTkRFRDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyID0gLUVJTlZBTDsKKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJaWYgKHIgPT0gMCAmJiBkb191cGRhdGUpCisJCXIgPSBvbWFwZmJfdXBkYXRlX2Z1bGxfc2NyZWVuKGZiaSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgb21hcGZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmIChmYmRldi0+Y3RybC0+c3luYykKKwkJZmJkZXYtPmN0cmwtPnN5bmMoKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7Cit9CisKKy8qCisgKiBTZXQgZmJfaW5mby5maXggZmllbGRzIGFuZCBhbHNvIHVwZGF0ZXMgZmJkZXYuCisgKiBXaGVuIGNhbGxpbmcgdGhpcyBmYl9pbmZvLnZhciBtdXN0IGJlIHNldCB1cCBhbHJlYWR5LgorICovCitzdGF0aWMgdm9pZCBzZXRfZmJfZml4KHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXggPSAmZmJpLT5maXg7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZmJpLT52YXI7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZzsKKwlpbnQgYnBwOworCisJcmcgPSAmcGxhbmUtPmZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF07CisJZmJpLT5zY3JlZW5fYmFzZQk9IChjaGFyIF9faW9tZW0gKilyZy0+dmFkZHI7CisJZml4LT5zbWVtX3N0YXJ0CQk9IHJnLT5wYWRkcjsKKwlmaXgtPnNtZW1fbGVuCQk9IHJnLT5zaXplOworCisJZml4LT50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOworCWJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJaWYgKHZhci0+bm9uc3RkKQorCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKwllbHNlIHN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMTY6CisJY2FzZSAxMjoKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCQkvKiAxMmJwcCBpcyBzdG9yZWQgaW4gMTYgYml0cyAqLworCQlicHAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDQ6CisJY2FzZSA4OgorCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKwkJYnJlYWs7CisJfQorCWZpeC0+YWNjZWwJCT0gRkJfQUNDRUxfT01BUDE2MTA7CisJZml4LT5saW5lX2xlbmd0aAk9IHZhci0+eHJlc192aXJ0dWFsICogYnBwIC8gODsKK30KKworc3RhdGljIGludCBzZXRfY29sb3JfbW9kZShzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUsCisJCQkgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoreworCXN3aXRjaCAodmFyLT5ub25zdGQpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDE2OworCQlwbGFuZS0+Y29sb3JfbW9kZSA9IHZhci0+bm9uc3RkOworCQlyZXR1cm4gMDsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxMjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSB2YXItPm5vbnN0ZDsKKwkJcmV0dXJuIDA7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gdmFyLT5ub25zdGQ7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMToKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQOworCQlyZXR1cm4gMDsKKwljYXNlIDI6CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01BUEZCX0NPTE9SX0NMVVRfMkJQUDsKKwkJcmV0dXJuIDA7CisJY2FzZSA0OgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzRCUFA7CisJCXJldHVybiAwOworCWNhc2UgODoKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQOworCQlyZXR1cm4gMDsKKwljYXNlIDEyOgorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01BUEZCX0NPTE9SX1JHQjQ0NDsKKwkJcmV0dXJuIDA7CisJY2FzZSAxNjoKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfUkdCNTY1OworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qCisgKiBDaGVjayB0aGUgdmFsdWVzIGluIHZhciBhZ2FpbnN0IG91ciBjYXBhYmlsaXRpZXMgYW5kIGluIGNhc2Ugb2Ygb3V0IG9mCisgKiBib3VuZCB2YWx1ZXMgdHJ5IHRvIGFkanVzdCB0aGVtLgorICovCitzdGF0aWMgaW50IHNldF9mYl92YXIoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJICAgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisJaW50CQlicHA7CisJdW5zaWduZWQgbG9uZwltYXhfZnJhbWVfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCWxpbmVfc2l6ZTsKKwlpbnQJCXhyZXNfbWluLCB4cmVzX21heDsKKwlpbnQJCXlyZXNfbWluLCB5cmVzX21heDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisKKwlpZiAoc2V0X2NvbG9yX21vZGUocGxhbmUsIHZhcikgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJaWYgKHBsYW5lLT5jb2xvcl9tb2RlID09IE9NQVBGQl9DT0xPUl9SR0I0NDQpCisJCWJwcCA9IDE2OworCisJc3dpdGNoICh2YXItPnJvdGF0ZSkgeworCWNhc2UgMDoKKwljYXNlIDE4MDoKKwkJeHJlc19taW4gPSBPTUFQRkJfUExBTkVfWFJFU19NSU47CisJCXhyZXNfbWF4ID0gcGFuZWwtPnhfcmVzOworCQl5cmVzX21pbiA9IE9NQVBGQl9QTEFORV9ZUkVTX01JTjsKKwkJeXJlc19tYXggPSBwYW5lbC0+eV9yZXM7CisJCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgeworCQkJdmFyLT54cmVzID0gcGFuZWwtPnhfcmVzOworCQkJdmFyLT55cmVzID0gcGFuZWwtPnlfcmVzOworCQl9CisJCWJyZWFrOworCWNhc2UgOTA6CisJY2FzZSAyNzA6CisJCXhyZXNfbWluID0gT01BUEZCX1BMQU5FX1lSRVNfTUlOOworCQl4cmVzX21heCA9IHBhbmVsLT55X3JlczsKKwkJeXJlc19taW4gPSBPTUFQRkJfUExBTkVfWFJFU19NSU47CisJCXlyZXNfbWF4ID0gcGFuZWwtPnhfcmVzOworCQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJCXZhci0+eHJlcyA9IHBhbmVsLT55X3JlczsKKwkJCXZhci0+eXJlcyA9IHBhbmVsLT54X3JlczsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodmFyLT54cmVzIDwgeHJlc19taW4pCisJCXZhci0+eHJlcyA9IHhyZXNfbWluOworCWlmICh2YXItPnlyZXMgPCB5cmVzX21pbikKKwkJdmFyLT55cmVzID0geXJlc19taW47CisJaWYgKHZhci0+eHJlcyA+IHhyZXNfbWF4KQorCQl2YXItPnhyZXMgPSB4cmVzX21heDsKKwlpZiAodmFyLT55cmVzID4geXJlc19tYXgpCisJCXZhci0+eXJlcyA9IHlyZXNfbWF4OworCisJaWYgKHZhci0+eHJlc192aXJ0dWFsIDwgdmFyLT54cmVzKQorCQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKKwlpZiAodmFyLT55cmVzX3ZpcnR1YWwgPCB2YXItPnlyZXMpCisJCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOworCW1heF9mcmFtZV9zaXplID0gZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltwbGFuZS0+aWR4XS5zaXplOworCWxpbmVfc2l6ZSA9IHZhci0+eHJlc192aXJ0dWFsICogYnBwIC8gODsKKwlpZiAobGluZV9zaXplICogdmFyLT55cmVzX3ZpcnR1YWwgPiBtYXhfZnJhbWVfc2l6ZSkgeworCQkvKiBUcnkgdG8ga2VlcCB5cmVzX3ZpcnR1YWwgZmlyc3QgKi8KKwkJbGluZV9zaXplID0gbWF4X2ZyYW1lX3NpemUgLyB2YXItPnlyZXNfdmlydHVhbDsKKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSBsaW5lX3NpemUgKiA4IC8gYnBwOworCQlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpIHsKKwkJCS8qIFN0aWxsIGRvZXNuJ3QgZml0LiBTaHJpbmsgeXJlc192aXJ0dWFsIHRvbyAqLworCQkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CisJCQlsaW5lX3NpemUgPSB2YXItPnhyZXMgKiBicHAgLyA4OworCQkJdmFyLT55cmVzX3ZpcnR1YWwgPSBtYXhfZnJhbWVfc2l6ZSAvIGxpbmVfc2l6ZTsKKwkJfQorCQkvKiBSZWNoZWNrIHRoaXMsIGFzIHRoZSB2aXJ0dWFsIHNpemUgY2hhbmdlZC4gKi8KKwkJaWYgKHZhci0+eHJlc192aXJ0dWFsIDwgdmFyLT54cmVzKQorCQkJdmFyLT54cmVzID0gdmFyLT54cmVzX3ZpcnR1YWw7CisJCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZhci0+eXJlcykKKwkJCXZhci0+eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsOworCQlpZiAodmFyLT54cmVzIDwgeHJlc19taW4gfHwgdmFyLT55cmVzIDwgeXJlc19taW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHZhci0+eHJlcyArIHZhci0+eG9mZnNldCA+IHZhci0+eHJlc192aXJ0dWFsKQorCQl2YXItPnhvZmZzZXQgPSB2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlczsKKwlpZiAodmFyLT55cmVzICsgdmFyLT55b2Zmc2V0ID4gdmFyLT55cmVzX3ZpcnR1YWwpCisJCXZhci0+eW9mZnNldCA9IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzOworCWxpbmVfc2l6ZSA9IHZhci0+eHJlcyAqIGJwcCAvIDg7CisKKwlpZiAocGxhbmUtPmNvbG9yX21vZGUgPT0gT01BUEZCX0NPTE9SX1JHQjQ0NCkgeworCQl2YXItPnJlZC5vZmZzZXQJICA9IDg7IHZhci0+cmVkLmxlbmd0aAkgPSA0OworCQkJCQkJdmFyLT5yZWQubXNiX3JpZ2h0ICAgPSAwOworCQl2YXItPmdyZWVuLm9mZnNldCA9IDQ7IHZhci0+Z3JlZW4ubGVuZ3RoID0gNDsKKwkJCQkJCXZhci0+Z3JlZW4ubXNiX3JpZ2h0ID0gMDsKKwkJdmFyLT5ibHVlLm9mZnNldCAgPSAwOyB2YXItPmJsdWUubGVuZ3RoICA9IDQ7CisJCQkJCQl2YXItPmJsdWUubXNiX3JpZ2h0ICA9IDA7CisJfSBlbHNlIHsKKwkJdmFyLT5yZWQub2Zmc2V0CSA9IDExOyB2YXItPnJlZC5sZW5ndGgJID0gNTsKKwkJCQkJCXZhci0+cmVkLm1zYl9yaWdodCAgID0gMDsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OyAgdmFyLT5ncmVlbi5sZW5ndGggPSA2OworCQkJCQkJdmFyLT5ncmVlbi5tc2JfcmlnaHQgPSAwOworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsgIHZhci0+Ymx1ZS5sZW5ndGggID0gNTsKKwkJCQkJCXZhci0+Ymx1ZS5tc2JfcmlnaHQgID0gMDsKKwl9CisKKwl2YXItPmhlaWdodAkJPSAtMTsKKwl2YXItPndpZHRoCQk9IC0xOworCXZhci0+Z3JheXNjYWxlCQk9IDA7CisKKwkvKiBwaXhjbG9jayBpbiBwcywgdGhlIHJlc3QgaW4gcGl4Y2xvY2sgKi8KKwl2YXItPnBpeGNsb2NrCQk9IDEwMDAwMDAwIC8gKHBhbmVsLT5waXhlbF9jbG9jayAvIDEwMCk7CisJdmFyLT5sZWZ0X21hcmdpbgk9IHBhbmVsLT5oZnA7CisJdmFyLT5yaWdodF9tYXJnaW4JPSBwYW5lbC0+aGJwOworCXZhci0+dXBwZXJfbWFyZ2luCT0gcGFuZWwtPnZmcDsKKwl2YXItPmxvd2VyX21hcmdpbgk9IHBhbmVsLT52YnA7CisJdmFyLT5oc3luY19sZW4JCT0gcGFuZWwtPmhzdzsKKwl2YXItPnZzeW5jX2xlbgkJPSBwYW5lbC0+dnN3OworCisJLyogVE9ETzogZ2V0IHRoZXNlIGZyb20gcGFuZWwtPmNvbmZpZyAqLworCXZhci0+dm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKKwl2YXItPnN5bmMJCT0gMDsKKworCXJldHVybiAwOworfQorCisKKy8qIFNldCByb3RhdGlvbiAoMCwgOTAsIDE4MCwgMjcwIGRlZ3JlZSksIGFuZCBzd2l0Y2ggdG8gdGhlIG5ldyBtb2RlLiAqLworc3RhdGljIHZvaWQgb21hcGZiX3JvdGF0ZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBpbnQgcm90YXRlKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKGNwdV9pc19vbWFwMTV4eCgpICYmIHJvdGF0ZSAhPSBmYmktPnZhci5yb3RhdGUpIHsKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpuZXdfdmFyID0gJmZiZGV2LT5uZXdfdmFyOworCisJCW1lbWNweShuZXdfdmFyLCAmZmJpLT52YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQluZXdfdmFyLT5yb3RhdGUgPSByb3RhdGU7CisJCWlmIChzZXRfZmJfdmFyKGZiaSwgbmV3X3ZhcikgPT0gMCAmJgorCQkgICAgbWVtY21wKG5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKCpuZXdfdmFyKSkpIHsKKwkJCW1lbWNweSgmZmJpLT52YXIsIG5ld192YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQkJY3RybF9jaGFuZ2VfbW9kZShmYmkpOworCQl9CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKK30KKworLyoKKyAqIFNldCBuZXcgeCx5IG9mZnNldHMgaW4gdGhlIHZpcnR1YWwgZGlzcGxheSBmb3IgdGhlIHZpc2libGUgYXJlYSBhbmQgc3dpdGNoCisgKiB0byB0aGUgbmV3IG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgb21hcGZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKHZhci0+eG9mZnNldCAhPSBmYmktPnZhci54b2Zmc2V0IHx8CisJICAgIHZhci0+eW9mZnNldCAhPSBmYmktPnZhci55b2Zmc2V0KSB7CisJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqbmV3X3ZhciA9ICZmYmRldi0+bmV3X3ZhcjsKKworCQltZW1jcHkobmV3X3ZhciwgJmZiaS0+dmFyLCBzaXplb2YoKm5ld192YXIpKTsKKwkJbmV3X3Zhci0+eG9mZnNldCA9IHZhci0+eG9mZnNldDsKKwkJbmV3X3Zhci0+eW9mZnNldCA9IHZhci0+eW9mZnNldDsKKwkJaWYgKHNldF9mYl92YXIoZmJpLCBuZXdfdmFyKSkKKwkJCXIgPSAtRUlOVkFMOworCQllbHNlIHsKKwkJCW1lbWNweSgmZmJpLT52YXIsIG5ld192YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQkJY3RybF9jaGFuZ2VfbW9kZShmYmkpOworCQl9CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKiBTZXQgbWlycm9yIHRvIHZlcnRpY2FsIGF4aXMgYW5kIHN3aXRjaCB0byB0aGUgbmV3IG1vZGUuICovCitzdGF0aWMgaW50IG9tYXBmYl9taXJyb3Ioc3RydWN0IGZiX2luZm8gKmZiaSwgaW50IG1pcnJvcikKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IHIgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwltaXJyb3IgPSBtaXJyb3IgPyAxIDogMDsKKwlpZiAoY3B1X2lzX29tYXAxNXh4KCkpCisJCXIgPSAtRUlOVkFMOworCWVsc2UgaWYgKG1pcnJvciAhPSBwbGFuZS0+aW5mby5taXJyb3IpIHsKKwkJcGxhbmUtPmluZm8ubWlycm9yID0gbWlycm9yOworCQlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmkpOworCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIENoZWNrIHZhbHVlcyBpbiB2YXIsIHRyeSB0byBhZGp1c3QgdGhlbSBpbiBjYXNlIG9mIG91dCBvZiBib3VuZCB2YWx1ZXMgaWYKKyAqIHBvc3NpYmxlLCBvciByZXR1cm4gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgb21hcGZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IHI7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmIChmYmRldi0+Y3RybC0+c3luYyAhPSBOVUxMKQorCQlmYmRldi0+Y3RybC0+c3luYygpOworCXIgPSBzZXRfZmJfdmFyKGZiaSwgdmFyKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBtb2RlLiBUaGUgcGFyYW1ldGVycyBmb3IgaXQgaGFzIGJlZW4gY2hlY2sgYWxyZWFkeSBieQorICogb21hcGZiX2NoZWNrX3Zhci4KKyAqLworc3RhdGljIGludCBvbWFwZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgciA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXNldF9mYl9maXgoZmJpKTsKKwlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmkpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitpbnQgb21hcGZiX3VwZGF0ZV93aW5kb3dfYXN5bmMoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQl2b2lkICgqY2FsbGJhY2spKHZvaWQgKiksCisJCQkJdm9pZCAqY2FsbGJhY2tfZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXI7CisKKwl2YXIgPSAmZmJpLT52YXI7CisJaWYgKHdpbi0+eCA+PSB2YXItPnhyZXMgfHwgd2luLT55ID49IHZhci0+eXJlcyB8fAorCSAgICB3aW4tPm91dF94ID4gdmFyLT54cmVzIHx8IHdpbi0+b3V0X3kgPj0gdmFyLT55cmVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3cgfHwKKwkgICAgZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICh3aW4tPnggKyB3aW4tPndpZHRoID49IHZhci0+eHJlcykKKwkJd2luLT53aWR0aCA9IHZhci0+eHJlcyAtIHdpbi0+eDsKKwlpZiAod2luLT55ICsgd2luLT5oZWlnaHQgPj0gdmFyLT55cmVzKQorCQl3aW4tPmhlaWdodCA9IHZhci0+eXJlcyAtIHdpbi0+eTsKKwkvKiBUaGUgb3V0IHNpemVzIHNob3VsZCBiZSBjcm9wcGVkIHRvIHRoZSBMQ0Qgc2l6ZSAqLworCWlmICh3aW4tPm91dF94ICsgd2luLT5vdXRfd2lkdGggPiBmYmRldi0+cGFuZWwtPnhfcmVzKQorCQl3aW4tPm91dF93aWR0aCA9IGZiZGV2LT5wYW5lbC0+eF9yZXMgLSB3aW4tPm91dF94OworCWlmICh3aW4tPm91dF95ICsgd2luLT5vdXRfaGVpZ2h0ID4gZmJkZXYtPnBhbmVsLT55X3JlcykKKwkJd2luLT5vdXRfaGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlcyAtIHdpbi0+b3V0X3k7CisJaWYgKCF3aW4tPndpZHRoIHx8ICF3aW4tPmhlaWdodCB8fCAhd2luLT5vdXRfd2lkdGggfHwgIXdpbi0+b3V0X2hlaWdodCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3coZmJpLCB3aW4sIGNhbGxiYWNrLCBjYWxsYmFja19kYXRhKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX3VwZGF0ZV93aW5kb3dfYXN5bmMpOworCitzdGF0aWMgaW50IG9tYXBmYl91cGRhdGVfd2luKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4pCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJaW50IHJldDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhwbGFuZS0+ZmJkZXYpOworCXJldCA9IG9tYXBmYl91cGRhdGVfd2luZG93X2FzeW5jKGZiaSwgd2luLCBOVUxMLCAwKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhwbGFuZS0+ZmJkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvbWFwZmJfdXBkYXRlX2Z1bGxfc2NyZWVuKHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyB3aW47CisJaW50IHI7CisKKwlpZiAoIWZiZGV2LT5jdHJsLT51cGRhdGVfd2luZG93IHx8CisJICAgIGZiZGV2LT5jdHJsLT5nZXRfdXBkYXRlX21vZGUoKSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aW4ueCA9IDA7CisJd2luLnkgPSAwOworCXdpbi53aWR0aCA9IGZiaS0+dmFyLnhyZXM7CisJd2luLmhlaWdodCA9IGZiaS0+dmFyLnlyZXM7CisJd2luLm91dF94ID0gMDsKKwl3aW4ub3V0X3kgPSAwOworCXdpbi5vdXRfd2lkdGggPSBmYmktPnZhci54cmVzOworCXdpbi5vdXRfaGVpZ2h0ID0gZmJpLT52YXIueXJlczsKKwl3aW4uZm9ybWF0ID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT51cGRhdGVfd2luZG93KGZiaSwgJndpbiwgTlVMTCwgMCk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldHVwX3BsYW5lKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbyAqcGkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gZmJkZXYtPnBhbmVsOworCXN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbyBvbGRfaW5mbzsKKwlpbnQgciA9IDA7CisKKwlpZiAocGktPnBvc194ICsgcGktPm91dF93aWR0aCA+IHBhbmVsLT54X3JlcyB8fAorCSAgICBwaS0+cG9zX3kgKyBwaS0+b3V0X2hlaWdodCA+IHBhbmVsLT55X3JlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmIChwaS0+ZW5hYmxlZCAmJiAhZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltwbGFuZS0+aWR4XS5zaXplKSB7CisJCS8qCisJCSAqIFRoaXMgcGxhbmUncyBtZW1vcnkgd2FzIGZyZWVkLCBjYW4ndCBlbmFibGUgaXQKKwkJICogdW50aWwgaXQncyByZWFsbG9jYXRlZC4KKwkJICovCisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJb2xkX2luZm8gPSBwbGFuZS0+aW5mbzsKKwlwbGFuZS0+aW5mbyA9ICpwaTsKKwlpZiAocGktPmVuYWJsZWQpIHsKKwkJciA9IGN0cmxfY2hhbmdlX21vZGUoZmJpKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlwbGFuZS0+aW5mbyA9IG9sZF9pbmZvOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJciA9IGZiZGV2LT5jdHJsLT5lbmFibGVfcGxhbmUocGxhbmUtPmlkeCwgcGktPmVuYWJsZWQpOworCWlmIChyIDwgMCkgeworCQlwbGFuZS0+aW5mbyA9IG9sZF9pbmZvOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9xdWVyeV9wbGFuZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8gKnBpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCisJKnBpID0gcGxhbmUtPmluZm87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldHVwX21lbShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvICptaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZyA9ICZmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdOworCXNpemVfdCBzaXplOworCWludCByID0gMDsKKworCWlmIChmYmRldi0+Y3RybC0+c2V0dXBfbWVtID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWlmIChtaS0+dHlwZSA+IE9NQVBGQl9NRU1UWVBFX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplID0gUEFHRV9BTElHTihtaS0+c2l6ZSk7CisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAocGxhbmUtPmluZm8uZW5hYmxlZCkgeworCQlyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJnLT5zaXplICE9IHNpemUgfHwgcmctPnR5cGUgIT0gbWktPnR5cGUpIHsKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpuZXdfdmFyID0gJmZiZGV2LT5uZXdfdmFyOworCQl1bnNpZ25lZCBsb25nIG9sZF9zaXplID0gcmctPnNpemU7CisJCXU4CSAgICAgIG9sZF90eXBlID0gcmctPnR5cGU7CisJCXVuc2lnbmVkIGxvbmcgcGFkZHI7CisKKwkJcmctPnNpemUgPSBzaXplOworCQlyZy0+dHlwZSA9IG1pLT50eXBlOworCQkvKgorCQkgKiBzaXplID09IDAgaXMgYSBzcGVjaWFsIGNhc2UsIGZvciB3aGljaCB3ZQorCQkgKiBkb24ndCBjaGVjayAvIGFkanVzdCB0aGUgc2NyZWVuIHBhcmFtZXRlcnMuCisJCSAqIFRoaXMgaXNuJ3QgYSBwcm9ibGVtIHNpbmNlIHRoZSBwbGFuZSBjYW4ndAorCQkgKiBiZSByZWVuYWJsZWQgdW5sZXNzIGl0cyBzaXplIGlzID4gMC4KKwkJICovCisJCWlmIChvbGRfc2l6ZSAhPSBzaXplICYmIHNpemUpIHsKKwkJCWlmIChzaXplKSB7CisJCQkJbWVtY3B5KG5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCQkJciA9IHNldF9mYl92YXIoZmJpLCBuZXdfdmFyKTsKKwkJCQlpZiAociA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJaWYgKGZiZGV2LT5jdHJsLT5zeW5jKQorCQkJZmJkZXYtPmN0cmwtPnN5bmMoKTsKKwkJciA9IGZiZGV2LT5jdHJsLT5zZXR1cF9tZW0ocGxhbmUtPmlkeCwgc2l6ZSwgbWktPnR5cGUsICZwYWRkcik7CisJCWlmIChyIDwgMCkgeworCQkJLyogUmV2ZXJ0IGNoYW5nZXMuICovCisJCQlyZy0+c2l6ZSA9IG9sZF9zaXplOworCQkJcmctPnR5cGUgPSBvbGRfdHlwZTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJnLT5wYWRkciA9IHBhZGRyOworCisJCWlmIChvbGRfc2l6ZSAhPSBzaXplKSB7CisJCQlpZiAoc2l6ZSkgeworCQkJCW1lbWNweSgmZmJpLT52YXIsIG5ld192YXIsIHNpemVvZihmYmktPnZhcikpOworCQkJCXNldF9mYl9maXgoZmJpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlc2UgZXhwbGljaXRseSB0byBpbmRpY2F0ZSB0aGF0IHRoZQorCQkJCSAqIHBsYW5lIG1lbW9yeSBpcyBkZWFsbG9jZSdkLCB0aGUgb3RoZXIKKwkJCQkgKiBzY3JlZW4gcGFyYW1ldGVycyBpbiB2YXIgLyBmaXggYXJlIGludmFsaWQuCisJCQkJICovCisJCQkJZmJpLT5maXguc21lbV9zdGFydCA9IDA7CisJCQkJZmJpLT5maXguc21lbV9sZW4gPSAwOworCQkJfQorCQl9CisJfQorb3V0OgorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9xdWVyeV9tZW0oc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IG9tYXBmYl9tZW1faW5mbyAqbWkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmc7CisKKwlyZyA9ICZmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdOworCW1lbXNldChtaSwgMCwgc2l6ZW9mKCptaSkpOworCW1pLT5zaXplID0gcmctPnNpemU7CisJbWktPnR5cGUgPSByZy0+dHlwZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfY29sb3Jfa2V5KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQlzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spCit7CisJaW50IHI7CisKKwlpZiAoIWZiZGV2LT5jdHJsLT5zZXRfY29sb3Jfa2V5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5zZXRfY29sb3Jfa2V5KGNrKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfZ2V0X2NvbG9yX2tleShzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsCisJCQkJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgKmNrKQoreworCWludCByOworCisJaWYgKCFmYmRldi0+Y3RybC0+Z2V0X2NvbG9yX2tleSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXIgPSBmYmRldi0+Y3RybC0+Z2V0X2NvbG9yX2tleShjayk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBvbWFwZmJfY2xpZW50X2xpc3RbT01BUEZCX1BMQU5FX05VTV07CitzdGF0aWMgaW50IG5vdGlmaWVyX2luaXRlZDsKKworc3RhdGljIHZvaWQgb21hcGZiX2luaXRfbm90aWZpZXIodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQRkJfUExBTkVfTlVNOyBpKyspCisJCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmb21hcGZiX2NsaWVudF9saXN0W2ldKTsKK30KKworaW50IG9tYXBmYl9yZWdpc3Rlcl9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqb21hcGZiX25iLAorCQkJCW9tYXBmYl9ub3RpZmllcl9jYWxsYmFja190IGNhbGxiYWNrLAorCQkJCXZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisJaW50IHI7CisKKwlpZiAoKHVuc2lnbmVkKW9tYXBmYl9uYi0+cGxhbmVfaWR4ID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW5vdGlmaWVyX2luaXRlZCkgeworCQlvbWFwZmJfaW5pdF9ub3RpZmllcigpOworCQlub3RpZmllcl9pbml0ZWQgPSAxOworCX0KKworCW9tYXBmYl9uYi0+bmIubm90aWZpZXJfY2FsbCA9IChpbnQgKCopKHN0cnVjdCBub3RpZmllcl9ibG9jayAqLAorCQkJCQl1bnNpZ25lZCBsb25nLCB2b2lkICopKWNhbGxiYWNrOworCW9tYXBmYl9uYi0+ZGF0YSA9IGNhbGxiYWNrX2RhdGE7CisJciA9IGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKAorCQkJCSZvbWFwZmJfY2xpZW50X2xpc3Rbb21hcGZiX25iLT5wbGFuZV9pZHhdLAorCQkJCSZvbWFwZmJfbmItPm5iKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJaWYgKG9tYXBmYl9kZXYgIT0gTlVMTCAmJgorCSAgICBvbWFwZmJfZGV2LT5jdHJsICYmIG9tYXBmYl9kZXYtPmN0cmwtPmJpbmRfY2xpZW50KSB7CisJCW9tYXBmYl9kZXYtPmN0cmwtPmJpbmRfY2xpZW50KG9tYXBmYl9uYik7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBmYl9yZWdpc3Rlcl9jbGllbnQpOworCitpbnQgb21hcGZiX3VucmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBvbWFwZmJfbm90aWZpZXJfYmxvY2sgKm9tYXBmYl9uYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigKKwkJJm9tYXBmYl9jbGllbnRfbGlzdFtvbWFwZmJfbmItPnBsYW5lX2lkeF0sICZvbWFwZmJfbmItPm5iKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX3VucmVnaXN0ZXJfY2xpZW50KTsKKwordm9pZCBvbWFwZmJfbm90aWZ5X2NsaWVudHMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCB1bnNpZ25lZCBsb25nIGV2ZW50KQoreworCWludCBpOworCisJaWYgKCFub3RpZmllcl9pbml0ZWQpCisJCS8qIG5vIGNsaWVudCByZWdpc3RlcmVkIHlldCAqLworCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgT01BUEZCX1BMQU5FX05VTTsgaSsrKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZvbWFwZmJfY2xpZW50X2xpc3RbaV0sIGV2ZW50LAorCQkJCSAgICBmYmRldi0+ZmJfaW5mb1tpXSk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBmYl9ub3RpZnlfY2xpZW50cyk7CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldF91cGRhdGVfbW9kZShzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsCisJCQkJICAgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5zZXRfdXBkYXRlX21vZGUobW9kZSk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBvbWFwZmJfZ2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5nZXRfdXBkYXRlX21vZGUoKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgb21hcGZiX2dldF9jYXBzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IHBsYW5lLAorCQkJCSAgICAgc3RydWN0IG9tYXBmYl9jYXBzICpjYXBzKQoreworCW1lbXNldChjYXBzLCAwLCBzaXplb2YoKmNhcHMpKTsKKwlmYmRldi0+Y3RybC0+Z2V0X2NhcHMocGxhbmUsIGNhcHMpOworCWNhcHMtPmN0cmwgfD0gZmJkZXYtPnBhbmVsLT5nZXRfY2FwcyhmYmRldi0+cGFuZWwpOworfQorCisvKiBGb3IgbGNkIHRlc3RpbmcgKi8KK3ZvaWQgb21hcGZiX3dyaXRlX2ZpcnN0X3BpeGVsKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgdTE2IHBpeHZhbCkKK3sKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCSoodTE2ICopZmJkZXYtPm1lbV9kZXNjLnJlZ2lvblswXS52YWRkciA9IHBpeHZhbDsKKwlpZiAoZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpID09IE9NQVBGQl9NQU5VQUxfVVBEQVRFKSB7CisJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyB3aW47CisKKwkJbWVtc2V0KCZ3aW4sIDAsIHNpemVvZih3aW4pKTsKKwkJd2luLndpZHRoID0gMjsKKwkJd2luLmhlaWdodCA9IDI7CisJCXdpbi5vdXRfd2lkdGggPSAyOworCQl3aW4ub3V0X2hlaWdodCA9IDI7CisJCWZiZGV2LT5jdHJsLT51cGRhdGVfd2luZG93KGZiZGV2LT5mYl9pbmZvWzBdLCAmd2luLCBOVUxMLCAwKTsKKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfd3JpdGVfZmlyc3RfcGl4ZWwpOworCisvKgorICogSW9jdGwgaW50ZXJmYWNlLiBQYXJ0IG9mIHRoZSBrZXJuZWwgbW9kZSBmcmFtZSBidWZmZXIgQVBJIGlzIGR1cGxpY2F0ZWQKKyAqIGhlcmUgdG8gYmUgYWNjZXNzaWJsZSBieSB1c2VyIG1vZGUgY29kZS4KKyAqLworc3RhdGljIGludCBvbWFwZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmZiaSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfb3BzCQkqb3BzID0gZmJpLT5mYm9wczsKKwl1bmlvbiB7CisJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdwl1cGRhdGVfd2luZG93OworCQlzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8JcGxhbmVfaW5mbzsKKwkJc3RydWN0IG9tYXBmYl9tZW1faW5mbwkJbWVtX2luZm87CisJCXN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5CQljb2xvcl9rZXk7CisJCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCQl1cGRhdGVfbW9kZTsKKwkJc3RydWN0IG9tYXBmYl9jYXBzCQljYXBzOworCQl1bnNpZ25lZCBpbnQJCW1pcnJvcjsKKwkJaW50CQkJcGxhbmVfb3V0OworCQlpbnQJCQllbmFibGVfcGxhbmU7CisJfSBwOworCWludCByID0gMDsKKworCUJVR19PTighb3BzKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT01BUEZCX01JUlJPUjoKKwkJaWYgKGdldF91c2VyKHAubWlycm9yLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJb21hcGZiX21pcnJvcihmYmksIHAubWlycm9yKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfU1lOQ19HRlg6CisJCW9tYXBmYl9zeW5jKGZiaSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1ZTWU5DOgorCQlicmVhazsKKwljYXNlIE9NQVBGQl9TRVRfVVBEQVRFX01PREU6CisJCWlmIChnZXRfdXNlcihwLnVwZGF0ZV9tb2RlLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXRfdXBkYXRlX21vZGUoZmJkZXYsIHAudXBkYXRlX21vZGUpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9HRVRfVVBEQVRFX01PREU6CisJCXAudXBkYXRlX21vZGUgPSBvbWFwZmJfZ2V0X3VwZGF0ZV9tb2RlKGZiZGV2KTsKKwkJaWYgKHB1dF91c2VyKHAudXBkYXRlX21vZGUsCisJCQkJCShlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBfX3VzZXIgKilhcmcpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9XSU5ET1dfT0xEOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAudXBkYXRlX3dpbmRvdywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3dfb2xkKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZSB7CisJCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKnUgPSAmcC51cGRhdGVfd2luZG93OworCQkJdS0+b3V0X3ggPSB1LT54OworCQkJdS0+b3V0X3kgPSB1LT55OworCQkJdS0+b3V0X3dpZHRoID0gdS0+d2lkdGg7CisJCQl1LT5vdXRfaGVpZ2h0ID0gdS0+aGVpZ2h0OworCQkJbWVtc2V0KHUtPnJlc2VydmVkLCAwLCBzaXplb2YodS0+cmVzZXJ2ZWQpKTsKKwkJCXIgPSBvbWFwZmJfdXBkYXRlX3dpbihmYmksIHUpOworCQl9CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9XSU5ET1c6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC51cGRhdGVfd2luZG93LCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHAudXBkYXRlX3dpbmRvdykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXIgPSBvbWFwZmJfdXBkYXRlX3dpbihmYmksICZwLnVwZGF0ZV93aW5kb3cpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TRVRVUF9QTEFORToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLnBsYW5lX2luZm8sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC5wbGFuZV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXR1cF9wbGFuZShmYmksICZwLnBsYW5lX2luZm8pOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9RVUVSWV9QTEFORToKKwkJaWYgKChyID0gb21hcGZiX3F1ZXJ5X3BsYW5lKGZiaSwgJnAucGxhbmVfaW5mbykpIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnAucGxhbmVfaW5mbywKKwkJCQkgICBzaXplb2YocC5wbGFuZV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfU0VUVVBfTUVNOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAubWVtX2luZm8sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC5tZW1faW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXIgPSBvbWFwZmJfc2V0dXBfbWVtKGZiaSwgJnAubWVtX2luZm8pOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9RVUVSWV9NRU06CisJCWlmICgociA9IG9tYXBmYl9xdWVyeV9tZW0oZmJpLCAmcC5tZW1faW5mbykpIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnAubWVtX2luZm8sCisJCQkJICAgc2l6ZW9mKHAubWVtX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TRVRfQ09MT1JfS0VZOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAuY29sb3Jfa2V5LCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHAuY29sb3Jfa2V5KSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXRfY29sb3Jfa2V5KGZiZGV2LCAmcC5jb2xvcl9rZXkpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9HRVRfQ09MT1JfS0VZOgorCQlpZiAoKHIgPSBvbWFwZmJfZ2V0X2NvbG9yX2tleShmYmRldiwgJnAuY29sb3Jfa2V5KSkgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5jb2xvcl9rZXksCisJCQkJIHNpemVvZihwLmNvbG9yX2tleSkpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0dFVF9DQVBTOgorCQlvbWFwZmJfZ2V0X2NhcHMoZmJkZXYsIHBsYW5lLT5pZHgsICZwLmNhcHMpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnAuY2Fwcywgc2l6ZW9mKHAuY2FwcykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0xDRF9URVNUOgorCQl7CisJCQlpbnQgdGVzdF9udW07CisKKwkJCWlmIChnZXRfdXNlcih0ZXN0X251bSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQkJciA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWZiZGV2LT5wYW5lbC0+cnVuX3Rlc3QpIHsKKwkJCQlyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXIgPSBmYmRldi0+cGFuZWwtPnJ1bl90ZXN0KGZiZGV2LT5wYW5lbCwgdGVzdF9udW0pOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9NQVBGQl9DVFJMX1RFU1Q6CisJCXsKKwkJCWludCB0ZXN0X251bTsKKworCQkJaWYgKGdldF91c2VyKHRlc3RfbnVtLCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCQlyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghZmJkZXYtPmN0cmwtPnJ1bl90ZXN0KSB7CisJCQkJciA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyID0gZmJkZXYtPmN0cmwtPnJ1bl90ZXN0KHRlc3RfbnVtKTsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGluZm8tPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IHI7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXIgPSBmYmRldi0+Y3RybC0+bW1hcChpbmZvLCB2bWEpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKgorICogQ2FsbGJhY2sgdGFibGUgZm9yIHRoZSBmcmFtZSBidWZmZXIgZnJhbWV3b3JrLiBTb21lIG9mIHRoZXNlIHBvaW50ZXJzCisgKiB3aWxsIGJlIGNoYW5nZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgZmJfaW5mby0+YWNjZWxfZmxhZ3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIG9tYXBmYl9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5mYl9vcGVuICAgICAgICA9IG9tYXBmYl9vcGVuLAorCS5mYl9yZWxlYXNlICAgICA9IG9tYXBmYl9yZWxlYXNlLAorCS5mYl9zZXRjb2xyZWcJPSBvbWFwZmJfc2V0Y29scmVnLAorCS5mYl9zZXRjbWFwCT0gb21hcGZiX3NldGNtYXAsCisJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfYmxhbmsgICAgICAgPSBvbWFwZmJfYmxhbmssCisJLmZiX2lvY3RsCT0gb21hcGZiX2lvY3RsLAorCS5mYl9jaGVja192YXIJPSBvbWFwZmJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyCT0gb21hcGZiX3NldF9wYXIsCisJLmZiX3JvdGF0ZQk9IG9tYXBmYl9yb3RhdGUsCisJLmZiX3Bhbl9kaXNwbGF5ID0gb21hcGZiX3Bhbl9kaXNwbGF5LAorfTsKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3lzZnMgaW50ZXJmYWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogb21hcGZiWCBzeXNmcyBlbnRyaWVzICovCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19jYXBzX251bShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcGxhbmU7CisJc2l6ZV90IHNpemU7CisJc3RydWN0IG9tYXBmYl9jYXBzIGNhcHM7CisKKwlwbGFuZSA9IDA7CisJc2l6ZSA9IDA7CisJd2hpbGUgKHNpemUgPCBQQUdFX1NJWkUgJiYgcGxhbmUgPCBPTUFQRkJfUExBTkVfTlVNKSB7CisJCW9tYXBmYl9nZXRfY2FwcyhmYmRldiwgcGxhbmUsICZjYXBzKTsKKwkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJInBsYW5lIyVkICUjMDEweCAlIzAxMHggJSMwMTB4XG4iLAorCQkJcGxhbmUsIGNhcHMuY3RybCwgY2Fwcy5wbGFuZV9jb2xvciwgY2Fwcy53bmRfY29sb3IpOworCQlwbGFuZSsrOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfY2Fwc190ZXh0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgb21hcGZiX2NhcHMgY2FwczsKKwlpbnQgcGxhbmU7CisJc2l6ZV90IHNpemU7CisKKwlwbGFuZSA9IDA7CisJc2l6ZSA9IDA7CisJd2hpbGUgKHNpemUgPCBQQUdFX1NJWkUgJiYgcGxhbmUgPCBPTUFQRkJfUExBTkVfTlVNKSB7CisJCW9tYXBmYl9nZXRfY2FwcyhmYmRldiwgcGxhbmUsICZjYXBzKTsKKwkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJCSAicGxhbmUjJWQ6XG4iLCBwbGFuZSk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0cmxfY2FwcykgJiYKKwkJICAgICBzaXplIDwgUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChjdHJsX2NhcHNbaV0uZmxhZyAmIGNhcHMuY3RybCkKKwkJCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJCSIgJXNcbiIsIGN0cmxfY2Fwc1tpXS5uYW1lKTsKKwkJfQorCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJICIgcGxhbmUgY29sb3JzOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbG9yX2NhcHMpICYmCisJCSAgICAgc2l6ZSA8IFBBR0VfU0laRTsgaSsrKSB7CisJCQlpZiAoY29sb3JfY2Fwc1tpXS5mbGFnICYgY2Fwcy5wbGFuZV9jb2xvcikKKwkJCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJCSIgICVzXG4iLCBjb2xvcl9jYXBzW2ldLm5hbWUpOworCQl9CisJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkgIiB3aW5kb3cgY29sb3JzOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbG9yX2NhcHMpICYmCisJCSAgICAgc2l6ZSA8IFBBR0VfU0laRTsgaSsrKSB7CisJCQlpZiAoY29sb3JfY2Fwc1tpXS5mbGFnICYgY2Fwcy53bmRfY29sb3IpCisJCQkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJCQkiICAlc1xuIiwgY29sb3JfY2Fwc1tpXS5uYW1lKTsKKwkJfQorCisJCXBsYW5lKys7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY2Fwc19udW0sIDA0NDQsIG9tYXBmYl9zaG93X2NhcHNfbnVtLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXBzX3RleHQsIDA0NDQsIG9tYXBmYl9zaG93X2NhcHNfdGV4dCwgTlVMTCk7CisKKy8qIHBhbmVsIHN5c2ZzIGVudHJpZXMgKi8KK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X3BhbmVsX25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBmYmRldi0+cGFuZWwtPm5hbWUpOworfQorCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19ia2xpZ2h0X2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisJaW50IHI7CisKKwlpZiAoZmJkZXYtPnBhbmVsLT5nZXRfYmtsaWdodF9sZXZlbCkgeworCQlyID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJCSAgICAgZmJkZXYtPnBhbmVsLT5nZXRfYmtsaWdodF9sZXZlbChmYmRldi0+cGFuZWwpKTsKKwl9IGVsc2UKKwkJciA9IC1FTk9ERVY7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zdG9yZV9ia2xpZ2h0X2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisJaW50IHI7CisKKwlpZiAoZmJkZXYtPnBhbmVsLT5zZXRfYmtsaWdodF9sZXZlbCkgeworCQl1bnNpZ25lZCBpbnQgbGV2ZWw7CisKKwkJaWYgKHNzY2FuZihidWYsICIlMTBkIiwgJmxldmVsKSA9PSAxKSB7CisJCQlyID0gZmJkZXYtPnBhbmVsLT5zZXRfYmtsaWdodF9sZXZlbChmYmRldi0+cGFuZWwsCisJCQkJCQkJICAgIGxldmVsKTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwl9IGVsc2UKKwkJciA9IC1FTk9ERVY7CisJcmV0dXJuIHIgPyByIDogc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfYmtsaWdodF9tYXgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisJaW50IHI7CisKKwlpZiAoZmJkZXYtPnBhbmVsLT5nZXRfYmtsaWdodF9sZXZlbCkgeworCQlyID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJCSAgICAgZmJkZXYtPnBhbmVsLT5nZXRfYmtsaWdodF9tYXgoZmJkZXYtPnBhbmVsKSk7CisJfSBlbHNlCisJCXIgPSAtRU5PREVWOworCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfcGFuZWxfbmFtZSA9CisJX19BVFRSKG5hbWUsIDA0NDQsIG9tYXBmYl9zaG93X3BhbmVsX25hbWUsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGJhY2tsaWdodF9sZXZlbCwgMDY2NCwKKwkJICAgb21hcGZiX3Nob3dfYmtsaWdodF9sZXZlbCwgb21hcGZiX3N0b3JlX2JrbGlnaHRfbGV2ZWwpOworc3RhdGljIERFVklDRV9BVFRSKGJhY2tsaWdodF9tYXgsIDA0NDQsIG9tYXBmYl9zaG93X2JrbGlnaHRfbWF4LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBhbmVsX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3BhbmVsX25hbWUuYXR0ciwKKwkmZGV2X2F0dHJfYmFja2xpZ2h0X2xldmVsLmF0dHIsCisJJmRldl9hdHRyX2JhY2tsaWdodF9tYXguYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcGFuZWxfYXR0cl9ncnAgPSB7CisJLm5hbWUgID0gInBhbmVsIiwKKwkuYXR0cnMgPSBwYW5lbF9hdHRycywKK307CisKKy8qIGN0cmwgc3lzZnMgZW50cmllcyAqLworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfY3RybF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBmYmRldi0+Y3RybC0+bmFtZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9jdHJsX25hbWUgPQorCV9fQVRUUihuYW1lLCAwNDQ0LCBvbWFwZmJfc2hvd19jdHJsX25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY3RybF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9jdHJsX25hbWUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY3RybF9hdHRyX2dycCA9IHsKKwkubmFtZSAgPSAiY3RybCIsCisJLmF0dHJzID0gY3RybF9hdHRycywKK307CisKK3N0YXRpYyBpbnQgb21hcGZiX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgcjsKKworCWlmICgociA9IGRldmljZV9jcmVhdGVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc19udW0pKSkKKwkJZ290byBmYWlsMDsKKworCWlmICgociA9IGRldmljZV9jcmVhdGVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc190ZXh0KSkpCisJCWdvdG8gZmFpbDE7CisKKwlpZiAoKHIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZwYW5lbF9hdHRyX2dycCkpKQorCQlnb3RvIGZhaWwyOworCisJaWYgKChyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZmYmRldi0+ZGV2LT5rb2JqLCAmY3RybF9hdHRyX2dycCkpKQorCQlnb3RvIGZhaWwzOworCisJcmV0dXJuIDA7CitmYWlsMzoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZwYW5lbF9hdHRyX2dycCk7CitmYWlsMjoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJkZXYtPmRldiwgJmRldl9hdHRyX2NhcHNfdGV4dCk7CitmYWlsMToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJkZXYtPmRldiwgJmRldl9hdHRyX2NhcHNfbnVtKTsKK2ZhaWwwOgorCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciBzeXNmcyBpbnRlcmZhY2VcbiIpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfdW5yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZmYmRldi0+ZGV2LT5rb2JqLCAmY3RybF9hdHRyX2dycCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZmYmRldi0+ZGV2LT5rb2JqLCAmcGFuZWxfYXR0cl9ncnApOworCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc19udW0pOworCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc190ZXh0KTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTERNIGNhbGxiYWNrcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIEluaXRpYWxpemUgc3lzdGVtIGZiX2luZm8gb2JqZWN0IGFuZCBzZXQgdGhlIGRlZmF1bHQgdmlkZW8gbW9kZS4KKyAqIFRoZSBmcmFtZSBidWZmZXIgbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkIGJ5IGxjZGRtYV9pbml0CisgKi8KK3N0YXRpYyBpbnQgZmJpbmZvX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8JKnZhciA9ICZpbmZvLT52YXI7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvCSpmaXggPSAmaW5mby0+Zml4OworCWludAkJCQlyID0gMDsKKworCWluZm8tPmZib3BzID0gJm9tYXBmYl9vcHM7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOworCisJc3RybmNweShmaXgtPmlkLCBNT0RVTEVfTkFNRSwgc2l6ZW9mKGZpeC0+aWQpKTsKKworCWluZm8tPnBzZXVkb19wYWxldHRlID0gZmJkZXYtPnBzZXVkb19wYWxldHRlOworCisJdmFyLT5hY2NlbF9mbGFncyAgPSBkZWZfYWNjZWwgPyBGQl9BQ0NFTEZfVEVYVCA6IDA7CisJdmFyLT54cmVzID0gZGVmX3Z4cmVzOworCXZhci0+eXJlcyA9IGRlZl92eXJlczsKKwl2YXItPnhyZXNfdmlydHVhbCA9IGRlZl92eHJlczsKKwl2YXItPnlyZXNfdmlydHVhbCA9IGRlZl92eXJlczsKKwl2YXItPnJvdGF0ZQkgID0gZGVmX3JvdGF0ZTsKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gZmJkZXYtPnBhbmVsLT5icHA7CisKKwlzZXRfZmJfdmFyKGluZm8sIHZhcik7CisJc2V0X2ZiX2ZpeChpbmZvKTsKKworCXIgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAxNiwgMCk7CisJaWYgKHIgIT0gMCkKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGNvbG9yIG1hcCBtZW1vcnlcbiIpOworCisJcmV0dXJuIHI7Cit9CisKKy8qIFJlbGVhc2UgdGhlIGZiX2luZm8gb2JqZWN0ICovCitzdGF0aWMgdm9pZCBmYmluZm9fY2xlYW51cChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJZmJfZGVhbGxvY19jbWFwKCZmYmktPmNtYXApOworfQorCitzdGF0aWMgdm9pZCBwbGFuZXNfY2xlYW51cChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQlpZiAoZmJkZXYtPmZiX2luZm9baV0gPT0gTlVMTCkKKwkJCWJyZWFrOworCQlmYmluZm9fY2xlYW51cChmYmRldiwgZmJkZXYtPmZiX2luZm9baV0pOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGZiZGV2LT5mYl9pbmZvW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGxhbmVzX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXN0cnVjdCBmYl9pbmZvICpmYmk7CisJaW50IGk7CisJaW50IHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmU7CisJCWZiaSA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCksCisJCQkJCWZiZGV2LT5kZXYpOworCQlpZiAoZmJpID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGxhbmUgaW5mb1xuIik7CisJCQlwbGFuZXNfY2xlYW51cChmYmRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlwbGFuZSA9IGZiaS0+cGFyOworCQlwbGFuZS0+aWR4ID0gaTsKKwkJcGxhbmUtPmZiZGV2ID0gZmJkZXY7CisJCXBsYW5lLT5pbmZvLm1pcnJvciA9IGRlZl9taXJyb3I7CisJCWZiZGV2LT5mYl9pbmZvW2ldID0gZmJpOworCisJCWlmICgociA9IGZiaW5mb19pbml0KGZiZGV2LCBmYmkpKSA8IDApIHsKKwkJCWZyYW1lYnVmZmVyX3JlbGVhc2UoZmJpKTsKKwkJCXBsYW5lc19jbGVhbnVwKGZiZGV2KTsKKwkJCXJldHVybiByOworCQl9CisJCXBsYW5lLT5pbmZvLm91dF93aWR0aCA9IGZiaS0+dmFyLnhyZXM7CisJCXBsYW5lLT5pbmZvLm91dF9oZWlnaHQgPSBmYmktPnZhci55cmVzOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgZHJpdmVyIHJlc291cmNlcy4gQ2FuIGJlIGNhbGxlZCB0byByb2xsYmFjayBhbiBhYm9ydGVkIGluaXRpYWxpemF0aW9uCisgKiBzZXF1ZW5jZS4KKyAqLworc3RhdGljIHZvaWQgb21hcGZiX2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IHN0YXRlKQoreworCWludCBpOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgT01BUEZCX0FDVElWRToKKwkJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250OyBpKyspCisJCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiZGV2LT5mYl9pbmZvW2ldKTsKKwljYXNlIDc6CisJCW9tYXBmYl91bnJlZ2lzdGVyX3N5c2ZzKGZiZGV2KTsKKwljYXNlIDY6CisJCWZiZGV2LT5wYW5lbC0+ZGlzYWJsZShmYmRldi0+cGFuZWwpOworCWNhc2UgNToKKwkJb21hcGZiX3NldF91cGRhdGVfbW9kZShmYmRldiwgT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJY2FzZSA0OgorCQlwbGFuZXNfY2xlYW51cChmYmRldik7CisJY2FzZSAzOgorCQljdHJsX2NsZWFudXAoZmJkZXYpOworCWNhc2UgMjoKKwkJZmJkZXYtPnBhbmVsLT5jbGVhbnVwKGZiZGV2LT5wYW5lbCk7CisJY2FzZSAxOgorCQlkZXZfc2V0X2RydmRhdGEoZmJkZXYtPmRldiwgTlVMTCk7CisJCWtmcmVlKGZiZGV2KTsKKwljYXNlIDA6CisJCS8qIG5vdGhpbmcgdG8gZnJlZSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX2ZpbmRfY3RybChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhICpjb25mOworCWNoYXIgbmFtZVsxN107CisJaW50IGk7CisKKwljb25mID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKworCWZiZGV2LT5jdHJsID0gTlVMTDsKKworCXN0cm5jcHkobmFtZSwgY29uZi0+bGNkLmN0cmxfbmFtZSwgc2l6ZW9mKG5hbWUpIC0gMSk7CisJbmFtZVtzaXplb2YobmFtZSkgLSAxXSA9ICdcMCc7CisKKwlpZiAoc3RyY21wKG5hbWUsICJpbnRlcm5hbCIpID09IDApIHsKKwkJZmJkZXYtPmN0cmwgPSBmYmRldi0+aW50X2N0cmw7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0cmxzKTsgaSsrKSB7CisJCWRldl9kYmcoZmJkZXYtPmRldiwgImN0cmwgJXNcbiIsIGN0cmxzW2ldLT5uYW1lKTsKKwkJaWYgKHN0cmNtcChjdHJsc1tpXS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJZmJkZXYtPmN0cmwgPSBjdHJsc1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZiZGV2LT5jdHJsID09IE5VTEwpIHsKKwkJZGV2X2RiZyhmYmRldi0+ZGV2LCAiY3RybCAlcyBub3Qgc3VwcG9ydGVkXG4iLCBuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19yZXF1aXJlZF9jYWxsYmFja3Moc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworI2RlZmluZSBfQyh4KSAoZmJkZXYtPmN0cmwtPnggIT0gTlVMTCkKKyNkZWZpbmUgX1AoeCkgKGZiZGV2LT5wYW5lbC0+eCAhPSBOVUxMKQorCUJVR19PTihmYmRldi0+Y3RybCA9PSBOVUxMIHx8IGZiZGV2LT5wYW5lbCA9PSBOVUxMKTsKKwlCVUdfT04oIShfQyhpbml0KSAmJiBfQyhjbGVhbnVwKSAmJiBfQyhnZXRfY2FwcykgJiYKKwkJIF9DKHNldF91cGRhdGVfbW9kZSkgJiYgX0Moc2V0dXBfcGxhbmUpICYmIF9DKGVuYWJsZV9wbGFuZSkgJiYKKwkJIF9QKGluaXQpICYmIF9QKGNsZWFudXApICYmIF9QKGVuYWJsZSkgJiYgX1AoZGlzYWJsZSkgJiYKKwkJIF9QKGdldF9jYXBzKSkpOworI3VuZGVmIF9QCisjdW5kZWYgX0MKK30KKworLyoKKyAqIENhbGxlZCBieSBMRE0gYmluZGluZyB0byBwcm9iZSBhbmQgYXR0YWNoIGEgbmV3IGRldmljZS4KKyAqIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlOgorICogICAxLiBhbGxvY2F0ZSBzeXN0ZW0gb21hcGZiX2RldmljZSBzdHJ1Y3R1cmUKKyAqICAgMi4gc2VsZWN0IGNvbnRyb2xsZXIgdHlwZSBhY2NvcmRpbmcgdG8gcGxhdGZvcm0gY29uZmlndXJhdGlvbgorICogICAgICBpbml0IExDRCBwYW5lbAorICogICAzLiBpbml0IExDRCBjb250cm9sbGVyIGFuZCBMQ0QgRE1BCisgKiAgIDQuIGluaXQgc3lzdGVtIGZiX2luZm8gc3RydWN0dXJlIGZvciBhbGwgcGxhbmVzCisgKiAgIDUuIHNldHVwIHZpZGVvIG1vZGUgZm9yIGZpcnN0IHBsYW5lIGFuZCBlbmFibGUgaXQKKyAqICAgNi4gZW5hYmxlIExDRCBwYW5lbAorICogICA3LiByZWdpc3RlciBzeXNmcyBhdHRyaWJ1dGVzCisgKiAgIE9NQVBGQl9BQ1RJVkU6IHJlZ2lzdGVyIHN5c3RlbSBmYl9pbmZvIHN0cnVjdHVyZSBmb3IgYWxsIHBsYW5lcworICovCitzdGF0aWMgaW50IG9tYXBmYl9kb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldiA9IE5VTEw7CisJaW50CQkJaW5pdF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nCQlwaHosIGhoeiwgdmh6OworCXVuc2lnbmVkIGxvbmcJCXZyYW07CisJaW50CQkJaTsKKwlpbnQJCQlyID0gMDsKKworCWluaXRfc3RhdGUgPSAwOworCisJaWYgKHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwcm9iZWQgZm9yIGFuIHVua25vd24gZGV2aWNlXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyID0gLUVOT0VOVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWZiZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBmYl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZmJkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlIGluZm9cbiIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlpbml0X3N0YXRlKys7CisKKwlmYmRldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlmYmRldi0+cGFuZWwgPSBwYW5lbDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmYmRldik7CisKKwltdXRleF9pbml0KCZmYmRldi0+cnF1ZXVlX211dGV4KTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCisJZmJkZXYtPmludF9jdHJsID0gJm9tYXAxX2ludF9jdHJsOworI2lmZGVmIENPTkZJR19GQl9PTUFQX0xDRENfRVhURVJOQUwKKwlmYmRldi0+ZXh0X2lmID0gJm9tYXAxX2V4dF9pZjsKKyNlbmRpZgorI2Vsc2UJLyogT01BUDIgKi8KKwlmYmRldi0+aW50X2N0cmwgPSAmb21hcDJfaW50X2N0cmw7CisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTAorCWZiZGV2LT5leHRfaWYgPSAmb21hcDJfZXh0X2lmOworI2VuZGlmCisjZW5kaWYKKwlpZiAob21hcGZiX2ZpbmRfY3RybChmYmRldikgPCAwKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJCSJMQ0QgY29udHJvbGxlciBub3QgZm91bmQsIGJvYXJkIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXIgPSBmYmRldi0+cGFuZWwtPmluaXQoZmJkZXYtPnBhbmVsLCBmYmRldik7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKworCXByX2luZm8oIm9tYXBmYjogY29uZmlndXJlZCBmb3IgcGFuZWwgJXNcbiIsIGZiZGV2LT5wYW5lbC0+bmFtZSk7CisKKwlkZWZfdnhyZXMgPSBkZWZfdnhyZXMgPyA6IGZiZGV2LT5wYW5lbC0+eF9yZXM7CisJZGVmX3Z5cmVzID0gZGVmX3Z5cmVzID8gOiBmYmRldi0+cGFuZWwtPnlfcmVzOworCisJaW5pdF9zdGF0ZSsrOworCisJciA9IGN0cmxfaW5pdChmYmRldik7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoZmJkZXYtPmN0cmwtPm1tYXAgIT0gTlVMTCkKKwkJb21hcGZiX29wcy5mYl9tbWFwID0gb21hcGZiX21tYXA7CisJaW5pdF9zdGF0ZSsrOworCisJY2hlY2tfcmVxdWlyZWRfY2FsbGJhY2tzKGZiZGV2KTsKKworCXIgPSBwbGFuZXNfaW5pdChmYmRldik7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKwlpbml0X3N0YXRlKys7CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9ETUFfVFVORQorCS8qIFNldCBETUEgcHJpb3JpdHkgZm9yIEVNSUZGIGFjY2VzcyB0byBoaWdoZXN0ICovCisJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKQorCQlvbWFwX3NldF9kbWFfcHJpb3JpdHkoMCwgT01BUF9ETUFfUE9SVF9FTUlGRiwgMTUpOworI2VuZGlmCisKKwlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmRldi0+ZmJfaW5mb1swXSk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAibW9kZSBzZXR0aW5nIGZhaWxlZFxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBHRlggcGxhbmUgaXMgZW5hYmxlZCBieSBkZWZhdWx0ICovCisJciA9IGZiZGV2LT5jdHJsLT5lbmFibGVfcGxhbmUoT01BUEZCX1BMQU5FX0dGWCwgMSk7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKworCW9tYXBmYl9zZXRfdXBkYXRlX21vZGUoZmJkZXYsIG1hbnVhbF91cGRhdGUgPworCQkJCSAgIE9NQVBGQl9NQU5VQUxfVVBEQVRFIDogT01BUEZCX0FVVE9fVVBEQVRFKTsKKwlpbml0X3N0YXRlKys7CisKKwlyID0gZmJkZXYtPnBhbmVsLT5lbmFibGUoZmJkZXYtPnBhbmVsKTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWluaXRfc3RhdGUrKzsKKworCXIgPSBvbWFwZmJfcmVnaXN0ZXJfc3lzZnMoZmJkZXYpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7CisJaW5pdF9zdGF0ZSsrOworCisJdnJhbSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250OyBpKyspIHsKKwkJciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiZGV2LT5mYl9pbmZvW2ldKTsKKwkJaWYgKHIgIT0gMCkgeworCQkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJCSJyZWdpc3RlcmluZyBmcmFtZWJ1ZmZlciAlZCBmYWlsZWRcbiIsIGkpOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXZyYW0gKz0gZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS5zaXplOworCX0KKworCWZiZGV2LT5zdGF0ZSA9IE9NQVBGQl9BQ1RJVkU7CisKKwlwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKwlwaHogPSBwYW5lbC0+cGl4ZWxfY2xvY2sgKiAxMDAwOworCWhoeiA9IHBoeiAqIDEwIC8gKHBhbmVsLT5oZnAgKyBwYW5lbC0+eF9yZXMgKyBwYW5lbC0+aGJwICsgcGFuZWwtPmhzdyk7CisJdmh6ID0gaGh6IC8gKHBhbmVsLT52ZnAgKyBwYW5lbC0+eV9yZXMgKyBwYW5lbC0+dmJwICsgcGFuZWwtPnZzdyk7CisKKwlvbWFwZmJfZGV2ID0gZmJkZXY7CisKKwlwcl9pbmZvKCJvbWFwZmI6IEZyYW1lYnVmZmVyIGluaXRpYWxpemVkLiBUb3RhbCB2cmFtICVsdSBwbGFuZXMgJWRcbiIsCisJCQl2cmFtLCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudCk7CisJcHJfaW5mbygib21hcGZiOiBQaXhjbG9jayAlbHUga0h6IGhmcmVxICVsdS4lbHUga0h6ICIKKwkJCSJ2ZnJlcSAlbHUuJWx1IEh6XG4iLAorCQkJcGh6IC8gMTAwMCwgaGh6IC8gMTAwMDAsIGhoeiAlIDEwLCB2aHogLyAxMCwgdmh6ICUgMTApOworCisJcmV0dXJuIDA7CisKK2NsZWFudXA6CisJb21hcGZiX2ZyZWVfcmVzb3VyY2VzKGZiZGV2LCBpbml0X3N0YXRlKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCUJVR19PTihmYmRldl9wZGV2ICE9IE5VTEwpOworCisJLyogRGVsYXkgYWN0dWFsIGluaXRpYWxpemF0aW9uIHVudGlsIHRoZSBMQ0QgaXMgcmVnaXN0ZXJlZCAqLworCWZiZGV2X3BkZXYgPSBwZGV2OworCWlmIChmYmRldl9wYW5lbCAhPSBOVUxMKQorCQlvbWFwZmJfZG9fcHJvYmUoZmJkZXZfcGRldiwgZmJkZXZfcGFuZWwpOworCXJldHVybiAwOworfQorCit2b2lkIG9tYXBmYl9yZWdpc3Rlcl9wYW5lbChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlCVUdfT04oZmJkZXZfcGFuZWwgIT0gTlVMTCk7CisKKwlmYmRldl9wYW5lbCA9IHBhbmVsOworCWlmIChmYmRldl9wZGV2ICE9IE5VTEwpCisJCW9tYXBmYl9kb19wcm9iZShmYmRldl9wZGV2LCBmYmRldl9wYW5lbCk7Cit9CisKKy8qIENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMgYmVpbmcgZGV0YWNoZWQgZnJvbSB0aGUgZHJpdmVyICovCitzdGF0aWMgaW50IG9tYXBmYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwllbnVtIG9tYXBmYl9zdGF0ZSBzYXZlZF9zdGF0ZSA9IGZiZGV2LT5zdGF0ZTsKKworCS8qIEZJWE1FOiB3YWl0IHRpbGwgY29tcGxldGlvbiBvZiBwZW5kaW5nIGV2ZW50cyAqLworCisJZmJkZXYtPnN0YXRlID0gT01BUEZCX0RJU0FCTEVEOworCW9tYXBmYl9mcmVlX3Jlc291cmNlcyhmYmRldiwgc2F2ZWRfc3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBNIHN1c3BlbmQgKi8KK3N0YXRpYyBpbnQgb21hcGZiX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlvbWFwZmJfYmxhbmsoVkVTQV9QT1dFUkRPV04sIGZiZGV2LT5mYl9pbmZvWzBdKTsKKworCXJldHVybiAwOworfQorCisvKiBQTSByZXN1bWUgKi8KK3N0YXRpYyBpbnQgb21hcGZiX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJb21hcGZiX2JsYW5rKFZFU0FfTk9fQkxBTktJTkcsIGZiZGV2LT5mYl9pbmZvWzBdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcGZiX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb21hcGZiX3Byb2JlLAorCS5yZW1vdmUJCT0gb21hcGZiX3JlbW92ZSwKKwkuc3VzcGVuZAk9IG9tYXBmYl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gb21hcGZiX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBNT0RVTEVfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKKyNpZm5kZWYgTU9EVUxFCisKKy8qIFByb2Nlc3Mga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IF9faW5pdCBvbWFwZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICp0aGlzX29wdCA9IE5VTEw7CisJaW50IHIgPSAwOworCisJcHJfZGVidWcoIm9tYXBmYjogb3B0aW9ucyAlc1xuIiwgb3B0aW9ucyk7CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICghciAmJiAodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiYWNjZWwiLCA1KSkKKwkJCWRlZl9hY2NlbCA9IDE7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnJhbToiLCA1KSkgeworCQkJY2hhciAqc3VmZml4OworCQkJdW5zaWduZWQgbG9uZyB2cmFtOworCQkJdnJhbSA9IChzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsICZzdWZmaXgsIDApKTsKKwkJCXN3aXRjaCAoc3VmZml4WzBdKSB7CisJCQljYXNlICdcMCc6CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCWNhc2UgJ00nOgorCQkJCXZyYW0gKj0gMTAyNDsKKwkJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgJ2snOgorCQkJY2FzZSAnSyc6CisJCQkJdnJhbSAqPSAxMDI0OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcl9kZWJ1Zygib21hcGZiOiBpbnZhbGlkIHZyYW0gc3VmZml4ICVjXG4iLAorCQkJCQkgc3VmZml4WzBdKTsKKwkJCQlyID0gLTE7CisJCQl9CisJCQlkZWZfdnJhbVtkZWZfdnJhbV9jbnQrK10gPSB2cmFtOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnhyZXM6IiwgNikpCisJCQlkZWZfdnhyZXMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDYsIE5VTEwsIDApOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZ5cmVzOiIsIDYpKQorCQkJZGVmX3Z5cmVzID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA2LCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJyb3RhdGU6IiwgNykpCisJCQlkZWZfcm90YXRlID0gKHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNywgTlVMTCwgMCkpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm1pcnJvcjoiLCA3KSkKKwkJCWRlZl9taXJyb3IgPSAoc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWFudWFsX3VwZGF0ZSIsIDEzKSkKKwkJCW1hbnVhbF91cGRhdGUgPSAxOworCQllbHNlIHsKKwkJCXByX2RlYnVnKCJvbWFwZmI6IGludmFsaWQgb3B0aW9uXG4iKTsKKwkJCXIgPSAtMTsKKwkJfQorCX0KKworCXJldHVybiByOworfQorCisjZW5kaWYKKworLyogUmVnaXN0ZXIgYm90aCB0aGUgZHJpdmVyIGFuZCB0aGUgZGV2aWNlICovCitzdGF0aWMgaW50IF9faW5pdCBvbWFwZmJfaW5pdCh2b2lkKQoreworI2lmbmRlZiBNT0RVTEUKKwljaGFyICpvcHRpb247CisKKwlpZiAoZmJfZ2V0X29wdGlvbnMoIm9tYXBmYiIsICZvcHRpb24pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlvbWFwZmJfc2V0dXAob3B0aW9uKTsKKyNlbmRpZgorCS8qIFJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCBMRE0gKi8KKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwZmJfZHJpdmVyKSkgeworCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIHJlZ2lzdGVyIG9tYXBmYiBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBmYl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBmYl9kcml2ZXIpOworfQorCittb2R1bGVfcGFyYW1fbmFtZWQoYWNjZWwsIGRlZl9hY2NlbCwgdWludCwgMDY2NCk7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQodnJhbSwgZGVmX3ZyYW0sIHVsb25nLCAmZGVmX3ZyYW1fY250LCAwNjY0KTsKK21vZHVsZV9wYXJhbV9uYW1lZCh2eHJlcywgZGVmX3Z4cmVzLCBsb25nLCAwNjY0KTsKK21vZHVsZV9wYXJhbV9uYW1lZCh2eXJlcywgZGVmX3Z5cmVzLCBsb25nLCAwNjY0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChyb3RhdGUsIGRlZl9yb3RhdGUsIHVpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKG1pcnJvciwgZGVmX21pcnJvciwgdWludCwgMDY2NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobWFudWFsX3VwZGF0ZSwgbWFudWFsX3VwZGF0ZSwgYm9vbCwgMDY2NCk7CisKK21vZHVsZV9pbml0KG9tYXBmYl9pbml0KTsKK21vZHVsZV9leGl0KG9tYXBmYl9jbGVhbnVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBPTUFQIGZyYW1lYnVmZmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9yZmJpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0MjY5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9yZmJpLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qCisgKiBPTUFQMiBSZW1vdGUgRnJhbWUgQnVmZmVyIEludGVyZmFjZSBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgkgICBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2luY2x1ZGUgImRpc3BjLmgiCisKKy8qIFRvIHdvcmsgYXJvdW5kIGFuIFJGQkkgdHJhbnNmZXIgcmF0ZSBsaW1pdGF0aW9uICovCisjZGVmaW5lIE9NQVBfUkZCSV9SQVRFX0xJTUlUCTEKKworI2RlZmluZSBSRkJJX0JBU0UJCTB4NDgwNTA4MDAKKyNkZWZpbmUgUkZCSV9SRVZJU0lPTgkJMHgwMDAwCisjZGVmaW5lIFJGQklfU1lTQ09ORklHCQkweDAwMTAKKyNkZWZpbmUgUkZCSV9TWVNTVEFUVVMJCTB4MDAxNAorI2RlZmluZSBSRkJJX0NPTlRST0wJCTB4MDA0MAorI2RlZmluZSBSRkJJX1BJWEVMX0NOVAkJMHgwMDQ0CisjZGVmaW5lIFJGQklfTElORV9OVU1CRVIJMHgwMDQ4CisjZGVmaW5lIFJGQklfQ01ECQkweDAwNGMKKyNkZWZpbmUgUkZCSV9QQVJBTQkJMHgwMDUwCisjZGVmaW5lIFJGQklfREFUQQkJMHgwMDU0CisjZGVmaW5lIFJGQklfUkVBRAkJMHgwMDU4CisjZGVmaW5lIFJGQklfU1RBVFVTCQkweDAwNWMKKyNkZWZpbmUgUkZCSV9DT05GSUcwCQkweDAwNjAKKyNkZWZpbmUgUkZCSV9PTk9GRl9USU1FMAkweDAwNjQKKyNkZWZpbmUgUkZCSV9DWUNMRV9USU1FMAkweDAwNjgKKyNkZWZpbmUgUkZCSV9EQVRBX0NZQ0xFMV8wCTB4MDA2YworI2RlZmluZSBSRkJJX0RBVEFfQ1lDTEUyXzAJMHgwMDcwCisjZGVmaW5lIFJGQklfREFUQV9DWUNMRTNfMAkweDAwNzQKKyNkZWZpbmUgUkZCSV9WU1lOQ19XSURUSAkweDAwOTAKKyNkZWZpbmUgUkZCSV9IU1lOQ19XSURUSAkweDAwOTQKKworI2RlZmluZSBESVNQQ19CQVNFCQkweDQ4MDUwNDAwCisjZGVmaW5lIERJU1BDX0NPTlRST0wJCTB4MDA0MAorCitzdGF0aWMgc3RydWN0IHsKKwl1MzIJCWJhc2U7CisJdm9pZAkJKCpsY2RjX2NhbGxiYWNrKSh2b2lkICpkYXRhKTsKKwl2b2lkCQkqbGNkY19jYWxsYmFja19kYXRhOworCXVuc2lnbmVkIGxvbmcJbDRfa2h6OworCWludAkJYml0c19wZXJfY3ljbGU7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2OworCXN0cnVjdCBjbGsJKmRzc19pY2s7CisJc3RydWN0IGNsawkqZHNzMV9mY2s7CisJdW5zaWduZWQJdGVhcnN5bmNfcGluX2NudDsKKwl1bnNpZ25lZAl0ZWFyc3luY19tb2RlOworfSByZmJpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmZiaV93cml0ZV9yZWcoaW50IGlkeCwgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCByZmJpLmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiByZmJpX3JlYWRfcmVnKGludCBpZHgpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKHJmYmkuYmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyBpbnQgcmZiaV9nZXRfY2xvY2tzKHZvaWQpCit7CisJaWYgKElTX0VSUigocmZiaS5kc3NfaWNrID0gY2xrX2dldChyZmJpLmZiZGV2LT5kZXYsICJkc3NfaWNrIikpKSkgeworCQlkZXZfZXJyKHJmYmkuZmJkZXYtPmRldiwgImNhbid0IGdldCBkc3NfaWNrIik7CisJCXJldHVybiBQVFJfRVJSKHJmYmkuZHNzX2ljayk7CisJfQorCisJaWYgKElTX0VSUigocmZiaS5kc3MxX2ZjayA9IGNsa19nZXQocmZiaS5mYmRldi0+ZGV2LCAiZHNzMV9mY2siKSkpKSB7CisJCWRldl9lcnIocmZiaS5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzczFfZmNrIik7CisJCWNsa19wdXQocmZiaS5kc3NfaWNrKTsKKwkJcmV0dXJuIFBUUl9FUlIocmZiaS5kc3MxX2Zjayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfcHV0X2Nsb2Nrcyh2b2lkKQoreworCWNsa19wdXQocmZiaS5kc3MxX2Zjayk7CisJY2xrX3B1dChyZmJpLmRzc19pY2spOworfQorCitzdGF0aWMgdm9pZCByZmJpX2VuYWJsZV9jbG9ja3MoaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKSB7CisJCWNsa19lbmFibGUocmZiaS5kc3NfaWNrKTsKKwkJY2xrX2VuYWJsZShyZmJpLmRzczFfZmNrKTsKKwl9IGVsc2UgeworCQljbGtfZGlzYWJsZShyZmJpLmRzczFfZmNrKTsKKwkJY2xrX2Rpc2FibGUocmZiaS5kc3NfaWNrKTsKKwl9Cit9CisKKworI2lmZGVmIFZFUkJPU0UKK3N0YXRpYyB2b2lkIHJmYmlfcHJpbnRfdGltaW5ncyh2b2lkKQoreworCXUzMiBsOworCXUzMiB0aW1lOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcwKTsKKwl0aW1lID0gMTAwMDAwMDAwMCAvIHJmYmkubDRfa2h6OworCWlmIChsICYgKDEgPDwgNCkpCisJCXRpbWUgKj0gMjsKKworCWRldl9kYmcocmZiaS5mYmRldi0+ZGV2LCAiVGljayB0aW1lICV1IHBzXG4iLCB0aW1lKTsKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX09OT0ZGX1RJTUUwKTsKKwlkZXZfZGJnKHJmYmkuZmJkZXYtPmRldiwKKwkJIkNTT05USU1FICVkLCBDU09GRlRJTUUgJWQsIFdFT05USU1FICVkLCBXRU9GRlRJTUUgJWQsICIKKwkJIlJFT05USU1FICVkLCBSRU9GRlRJTUUgJWRcbiIsCisJCWwgJiAweDBmLCAobCA+PiA0KSAmIDB4M2YsIChsID4+IDEwKSAmIDB4MGYsIChsID4+IDE0KSAmIDB4M2YsCisJCShsID4+IDIwKSAmIDB4MGYsIChsID4+IDI0KSAmIDB4M2YpOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DWUNMRV9USU1FMCk7CisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsCisJCSJXRUNZQ0xFVElNRSAlZCwgUkVDWUNMRVRJTUUgJWQsIENTUFVMU0VXSURUSCAlZCwgIgorCQkiQUNDRVNTVElNRSAlZFxuIiwKKwkJKGwgJiAweDNmKSwgKGwgPj4gNikgJiAweDNmLCAobCA+PiAxMikgJiAweDNmLAorCQkobCA+PiAyMikgJiAweDNmKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCByZmJpX3ByaW50X3RpbWluZ3Modm9pZCkge30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZmJpX3NldF90aW1pbmdzKGNvbnN0IHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCXUzMiBsOworCisJQlVHX09OKCF0LT5jb252ZXJ0ZWQpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfT05PRkZfVElNRTAsIHQtPnRpbVswXSk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DWUNMRV9USU1FMCwgdC0+dGltWzFdKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJbCAmPSB+KDEgPDwgNCk7CisJbCB8PSAodC0+dGltWzJdID8gMSA6IDApIDw8IDQ7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05GSUcwLCBsKTsKKworCXJmYmlfcHJpbnRfdGltaW5ncygpOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV9nZXRfY2xrX2luZm8odTMyICpjbGtfcGVyaW9kLCB1MzIgKm1heF9jbGtfZGl2KQoreworCSpjbGtfcGVyaW9kID0gMTAwMDAwMDAwMCAvIHJmYmkubDRfa2h6OworCSptYXhfY2xrX2RpdiA9IDI7Cit9CisKK3N0YXRpYyBpbnQgcHNfdG9fcmZiaV90aWNrcyhpbnQgdGltZSwgaW50IGRpdikKK3sKKwl1bnNpZ25lZCBsb25nIHRpY2tfcHM7CisJaW50IHJldDsKKworCS8qIENhbGN1bGF0ZSBpbiBwaWNvc2VjcyB0byB5aWVsZCBtb3JlIGV4YWN0IHJlc3VsdHMgKi8KKwl0aWNrX3BzID0gMTAwMDAwMDAwMCAvIChyZmJpLmw0X2toeikgKiBkaXY7CisKKwlyZXQgPSAodGltZSArIHRpY2tfcHMgLSAxKSAvIHRpY2tfcHM7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgT01BUF9SRkJJX1JBVEVfTElNSVQKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJmYmlfZ2V0X21heF90eF9yYXRlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZwlsNF9yYXRlLCBkc3MxX3JhdGU7CisJaW50CQltaW5fbDRfdGlja3MgPSAwOworCWludAkJaTsKKworCS8qIEFjY29yZGluZyB0byBUSSB0aGlzIGNhbid0IGJlIGNhbGN1bGF0ZWQgc28gbWFrZSB0aGUKKwkgKiBhZGp1c3RtZW50cyBmb3IgYSBjb3VwbGUgb2Yga25vd24gZnJlcXVlbmNpZXMgYW5kIHdhcm4gZm9yCisJICogb3RoZXJzLgorCSAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIGw0X2NsazsJCS8qIEhaICovCisJCXVuc2lnbmVkIGxvbmcgZHNzMV9jbGs7CQkvKiBIWiAqLworCQl1bnNpZ25lZCBsb25nIG1pbl9sNF90aWNrczsKKwl9IGZ0YWJbXSA9IHsKKwkJeyA1NSwJMTMyLAk3LCB9LAkJLyogNy44NiBNUGl4L3MgKi8KKwkJeyAxMTAsCTExMCwJMTIsIH0sCQkvKiA5LjE2IE1QaXgvcyAqLworCQl7IDExMCwJMTMyLAkxMCwgfSwJCS8qIDExICAgTXBpeC9zICovCisJCXsgMTIwLAkxMjAsCTEwLCB9LAkJLyogMTIgICBNcGl4L3MgKi8KKwkJeyAxMzMsCTEzMywJMTAsIH0sCQkvKiAxMy4zIE1waXgvcyAqLworCX07CisKKwlsNF9yYXRlID0gcmZiaS5sNF9raHogLyAxMDAwOworCWRzczFfcmF0ZSA9IGNsa19nZXRfcmF0ZShyZmJpLmRzczFfZmNrKSAvIDEwMDAwMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmdGFiKTsgaSsrKSB7CisJCS8qIFVzZSBhIHdpbmRvdyBpbnN0ZWFkIG9mIGFuIGV4YWN0IG1hdGNoLCB0byBhY2NvdW50CisJCSAqIGZvciBkaWZmZXJlbnQgRFBMTCBtdWx0aXBsaWVyIC8gZGl2aWRlciBwYWlycy4KKwkJICovCisJCWlmIChhYnMoZnRhYltpXS5sNF9jbGsgLSBsNF9yYXRlKSA8IDMgJiYKKwkJICAgIGFicyhmdGFiW2ldLmRzczFfY2xrIC0gZHNzMV9yYXRlKSA8IDMpIHsKKwkJCW1pbl9sNF90aWNrcyA9IGZ0YWJbaV0ubWluX2w0X3RpY2tzOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gQVJSQVlfU0laRShmdGFiKSkgeworCQkvKiBDYW4ndCBiZSBzdXJlLCByZXR1cm4gYW55d2F5IHRoZSBtYXhpbXVtIG5vdAorCQkgKiByYXRlLWxpbWl0ZWQuIFRoaXMgbWlnaHQgY2F1c2UgYSBwcm9ibGVtIG9ubHkgZm9yIHRoZQorCQkgKiB0ZWFyaW5nIHN5bmNocm9uaXNhdGlvbi4KKwkJICovCisJCWRldl9lcnIocmZiaS5mYmRldi0+ZGV2LAorCQkJImNhbid0IGRldGVybWluZSBtYXhpbXVtIFJGQkkgdHJhbnNmZXIgcmF0ZVxuIik7CisJCXJldHVybiByZmJpLmw0X2toeiAqIDEwMDA7CisJfQorCXJldHVybiByZmJpLmw0X2toeiAqIDEwMDAgLyBtaW5fbDRfdGlja3M7Cit9CisjZWxzZQorc3RhdGljIGludCByZmJpX2dldF9tYXhfdHhfcmF0ZSh2b2lkKQoreworCXJldHVybiByZmJpLmw0X2toeiAqIDEwMDA7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IHJmYmlfY29udmVydF90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCXUzMiBsOworCWludCByZW9uLCByZW9mZiwgd2Vvbiwgd2VvZmYsIGNzb24sIGNzb2ZmLCBjc19wdWxzZTsKKwlpbnQgYWN0aW0sIHJlY3ljLCB3ZWN5YzsKKwlpbnQgZGl2ID0gdC0+Y2xrX2RpdjsKKworCWlmIChkaXYgPD0gMCB8fCBkaXYgPiAyKQorCQlyZXR1cm4gLTE7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCBhZnRlciBjb252ZXJzaW9uIGl0IHN0aWxsIGhvbGRzIHRoYXQ6CisJICogd2VvZmYgPiB3ZW9uLCByZW9mZiA+IHJlb24sIHJlY3ljID49IHJlb2ZmLCB3ZWN5YyA+PSB3ZW9mZiwKKwkgKiBjc29mZiA+IGNzb24sIGNzb2ZmID49IG1heCh3ZW9mZiwgcmVvZmYpLCBhY3RpbSA+IHJlb24KKwkgKi8KKwl3ZW9uID0gcHNfdG9fcmZiaV90aWNrcyh0LT53ZV9vbl90aW1lLCBkaXYpOworCXdlb2ZmID0gcHNfdG9fcmZiaV90aWNrcyh0LT53ZV9vZmZfdGltZSwgZGl2KTsKKwlpZiAod2VvZmYgPD0gd2VvbikKKwkJd2VvZmYgPSB3ZW9uICsgMTsKKwlpZiAod2VvbiA+IDB4MGYpCisJCXJldHVybiAtMTsKKwlpZiAod2VvZmYgPiAweDNmKQorCQlyZXR1cm4gLTE7CisKKwlyZW9uID0gcHNfdG9fcmZiaV90aWNrcyh0LT5yZV9vbl90aW1lLCBkaXYpOworCXJlb2ZmID0gcHNfdG9fcmZiaV90aWNrcyh0LT5yZV9vZmZfdGltZSwgZGl2KTsKKwlpZiAocmVvZmYgPD0gcmVvbikKKwkJcmVvZmYgPSByZW9uICsgMTsKKwlpZiAocmVvbiA+IDB4MGYpCisJCXJldHVybiAtMTsKKwlpZiAocmVvZmYgPiAweDNmKQorCQlyZXR1cm4gLTE7CisKKwljc29uID0gcHNfdG9fcmZiaV90aWNrcyh0LT5jc19vbl90aW1lLCBkaXYpOworCWNzb2ZmID0gcHNfdG9fcmZiaV90aWNrcyh0LT5jc19vZmZfdGltZSwgZGl2KTsKKwlpZiAoY3NvZmYgPD0gY3NvbikKKwkJY3NvZmYgPSBjc29uICsgMTsKKwlpZiAoY3NvZmYgPCBtYXgod2VvZmYsIHJlb2ZmKSkKKwkJY3NvZmYgPSBtYXgod2VvZmYsIHJlb2ZmKTsKKwlpZiAoY3NvbiA+IDB4MGYpCisJCXJldHVybiAtMTsKKwlpZiAoY3NvZmYgPiAweDNmKQorCQlyZXR1cm4gLTE7CisKKwlsID0gIGNzb247CisJbCB8PSBjc29mZiA8PCA0OworCWwgfD0gd2VvbiAgPDwgMTA7CisJbCB8PSB3ZW9mZiA8PCAxNDsKKwlsIHw9IHJlb24gIDw8IDIwOworCWwgfD0gcmVvZmYgPDwgMjQ7CisKKwl0LT50aW1bMF0gPSBsOworCisJYWN0aW0gPSBwc190b19yZmJpX3RpY2tzKHQtPmFjY2Vzc190aW1lLCBkaXYpOworCWlmIChhY3RpbSA8PSByZW9uKQorCQlhY3RpbSA9IHJlb24gKyAxOworCWlmIChhY3RpbSA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCXdlY3ljID0gcHNfdG9fcmZiaV90aWNrcyh0LT53ZV9jeWNsZV90aW1lLCBkaXYpOworCWlmICh3ZWN5YyA8IHdlb2ZmKQorCQl3ZWN5YyA9IHdlb2ZmOworCWlmICh3ZWN5YyA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCXJlY3ljID0gcHNfdG9fcmZiaV90aWNrcyh0LT5yZV9jeWNsZV90aW1lLCBkaXYpOworCWlmIChyZWN5YyA8IHJlb2ZmKQorCQlyZWN5YyA9IHJlb2ZmOworCWlmIChyZWN5YyA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWNzX3B1bHNlID0gcHNfdG9fcmZiaV90aWNrcyh0LT5jc19wdWxzZV93aWR0aCwgZGl2KTsKKwlpZiAoY3NfcHVsc2UgPiAweDNmKQorCQlyZXR1cm4gLTE7CisKKwlsID0gIHdlY3ljOworCWwgfD0gcmVjeWMgICAgPDwgNjsKKwlsIHw9IGNzX3B1bHNlIDw8IDEyOworCWwgfD0gYWN0aW0gICAgPDwgMjI7CisKKwl0LT50aW1bMV0gPSBsOworCisJdC0+dGltWzJdID0gZGl2IC0gMTsKKworCXQtPmNvbnZlcnRlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmJpX3NldHVwX3RlYXJzeW5jKHVuc2lnbmVkIHBpbl9jbnQsCisJCQkgICAgICAgdW5zaWduZWQgaHNfcHVsc2VfdGltZSwgdW5zaWduZWQgdnNfcHVsc2VfdGltZSwKKwkJCSAgICAgICBpbnQgaHNfcG9sX2ludiwgaW50IHZzX3BvbF9pbnYsIGludCBleHRpZl9kaXYpCit7CisJaW50IGhzLCB2czsKKwlpbnQgbWluOworCXUzMiBsOworCisJaWYgKHBpbl9jbnQgIT0gMSAmJiBwaW5fY250ICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJaHMgPSBwc190b19yZmJpX3RpY2tzKGhzX3B1bHNlX3RpbWUsIDEpOworCXZzID0gcHNfdG9fcmZiaV90aWNrcyh2c19wdWxzZV90aW1lLCAxKTsKKwlpZiAoaHMgPCAyKQorCQlyZXR1cm4gLUVET007CisJaWYgKHBpbl9jbnQgPT0gMikKKwkJbWluID0gMjsKKwllbHNlCisJCW1pbiA9IDQ7CisJaWYgKHZzIDwgbWluKQorCQlyZXR1cm4gLUVET007CisJaWYgKHZzID09IGhzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZmJpLnRlYXJzeW5jX3Bpbl9jbnQgPSBwaW5fY250OworCWRldl9kYmcocmZiaS5mYmRldi0+ZGV2LAorCQkic2V0dXBfdGVhcnN5bmM6IHBpbnMgJWQgaHMgJWQgdnMgJWQgaHNfaW52ICVkIHZzX2ludiAlZFxuIiwKKwkJcGluX2NudCwgaHMsIHZzLCBoc19wb2xfaW52LCB2c19wb2xfaW52KTsKKworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0hTWU5DX1dJRFRILCBocyk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9WU1lOQ19XSURUSCwgdnMpOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcwKTsKKwlpZiAoaHNfcG9sX2ludikKKwkJbCAmPSB+KDEgPDwgMjEpOworCWVsc2UKKwkJbCB8PSAxIDw8IDIxOworCWlmICh2c19wb2xfaW52KQorCQlsICY9IH4oMSA8PCAyMCk7CisJZWxzZQorCQlsIHw9IDEgPDwgMjA7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZiaV9lbmFibGVfdGVhcnN5bmMoaW50IGVuYWJsZSwgdW5zaWduZWQgbGluZSkKK3sKKwl1MzIgbDsKKworCWRldl9kYmcocmZiaS5mYmRldi0+ZGV2LCAidGVhcnN5bmMgJWQgbGluZSAlZCBtb2RlICVkXG4iLAorCQllbmFibGUsIGxpbmUsIHJmYmkudGVhcnN5bmNfbW9kZSk7CisJaWYgKGxpbmUgPiAoMSA8PCAxMSkgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCWwgJj0gfigweDMgPDwgMik7CisJaWYgKGVuYWJsZSkgeworCQlyZmJpLnRlYXJzeW5jX21vZGUgPSByZmJpLnRlYXJzeW5jX3Bpbl9jbnQ7CisJCWwgfD0gcmZiaS50ZWFyc3luY19tb2RlIDw8IDI7CisJfSBlbHNlCisJCXJmYmkudGVhcnN5bmNfbW9kZSA9IDA7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05GSUcwLCBsKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0xJTkVfTlVNQkVSLCBsaW5lKTsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZiaV93cml0ZV9jb21tYW5kKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJaWYgKHJmYmkuYml0c19wZXJfY3ljbGUgPT0gMTYpIHsKKwkJY29uc3QgdTE2ICp3ID0gYnVmOworCQlCVUdfT04obGVuICYgMSk7CisJCWZvciAoOyBsZW47IGxlbiAtPSAyKQorCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9DTUQsICp3KyspOworCX0gZWxzZSB7CisJCWNvbnN0IHU4ICpiID0gYnVmOworCQlCVUdfT04ocmZiaS5iaXRzX3Blcl9jeWNsZSAhPSA4KTsKKwkJZm9yICg7IGxlbjsgbGVuLS0pCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX0NNRCwgKmIrKyk7CisJfQorCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV9yZWFkX2RhdGEodm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAocmZiaS5iaXRzX3Blcl9jeWNsZSA9PSAxNikgeworCQl1MTYgKncgPSBidWY7CisJCUJVR19PTihsZW4gJiB+MSk7CisJCWZvciAoOyBsZW47IGxlbiAtPSAyKSB7CisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1JFQUQsIDApOworCQkJKncrKyA9IHJmYmlfcmVhZF9yZWcoUkZCSV9SRUFEKTsKKwkJfQorCX0gZWxzZSB7CisJCXU4ICpiID0gYnVmOworCQlCVUdfT04ocmZiaS5iaXRzX3Blcl9jeWNsZSAhPSA4KTsKKwkJZm9yICg7IGxlbjsgbGVuLS0pIHsKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUkVBRCwgMCk7CisJCQkqYisrID0gcmZiaV9yZWFkX3JlZyhSRkJJX1JFQUQpOworCQl9CisJfQorCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV93cml0ZV9kYXRhKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJaWYgKHJmYmkuYml0c19wZXJfY3ljbGUgPT0gMTYpIHsKKwkJY29uc3QgdTE2ICp3ID0gYnVmOworCQlCVUdfT04obGVuICYgMSk7CisJCWZvciAoOyBsZW47IGxlbiAtPSAyKQorCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9QQVJBTSwgKncrKyk7CisJfSBlbHNlIHsKKwkJY29uc3QgdTggKmIgPSBidWY7CisJCUJVR19PTihyZmJpLmJpdHNfcGVyX2N5Y2xlICE9IDgpOworCQlmb3IgKDsgbGVuOyBsZW4tLSkKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUEFSQU0sICpiKyspOworCX0KKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfdHJhbnNmZXJfYXJlYShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJdm9pZCAoY2FsbGJhY2spKHZvaWQgKiBkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwl1MzIgdzsKKworCUJVR19PTihjYWxsYmFjayA9PSBOVUxMKTsKKworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlvbWFwX2Rpc3BjX3NldF9sY2Rfc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKworCXJmYmkubGNkY19jYWxsYmFjayA9IGNhbGxiYWNrOworCXJmYmkubGNkY19jYWxsYmFja19kYXRhID0gZGF0YTsKKworCXJmYmlfd3JpdGVfcmVnKFJGQklfUElYRUxfQ05ULCB3aWR0aCAqIGhlaWdodCk7CisKKwl3ID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTlRST0wpOworCXcgfD0gMTsJCQkJLyogZW5hYmxlICovCisJaWYgKCFyZmJpLnRlYXJzeW5jX21vZGUpCisJCXcgfD0gMSA8PCA0OwkJLyogaW50ZXJuYWwgdHJpZ2dlciwgcmVzZXQgYnkgSFcgKi8KKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTlRST0wsIHcpOworCisJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9zdG9wX3RyYW5zZmVyKHZvaWQpCit7CisJdTMyIHc7CisKKwl3ID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTlRST0wpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09OVFJPTCwgdyAmIH4oMSA8PCAwKSk7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX2RtYV9jYWxsYmFjayh2b2lkICpkYXRhKQoreworCV9zdG9wX3RyYW5zZmVyKCk7CisJcmZiaS5sY2RjX2NhbGxiYWNrKHJmYmkubGNkY19jYWxsYmFja19kYXRhKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV9zZXRfYml0c19wZXJfY3ljbGUoaW50IGJwYykKK3sKKwl1MzIgbDsKKworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCWwgJj0gfigweDAzIDw8IDApOworCisJc3dpdGNoIChicGMpIHsKKwljYXNlIDg6CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWwgfD0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09ORklHMCwgbCk7CisJcmZiaS5iaXRzX3Blcl9jeWNsZSA9IGJwYzsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyBpbnQgcmZiaV9pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwl1MzIgbDsKKwlpbnQgcjsKKworCXJmYmkuZmJkZXYgPSBmYmRldjsKKwlyZmJpLmJhc2UgPSBpb19wMnYoUkZCSV9CQVNFKTsKKworCWlmICgociA9IHJmYmlfZ2V0X2Nsb2NrcygpKSA8IDApCisJCXJldHVybiByOworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKworCXJmYmkubDRfa2h6ID0gY2xrX2dldF9yYXRlKHJmYmkuZHNzX2ljaykgLyAxMDAwOworCisJLyogUmVzZXQgKi8KKwlyZmJpX3dyaXRlX3JlZyhSRkJJX1NZU0NPTkZJRywgMSA8PCAxKTsKKwl3aGlsZSAoIShyZmJpX3JlYWRfcmVnKFJGQklfU1lTU1RBVFVTKSAmICgxIDw8IDApKSk7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX1NZU0NPTkZJRyk7CisJLyogRW5hYmxlIGF1dG9pZGxlIGFuZCBzbWFydC1pZGxlICovCisJbCB8PSAoMSA8PCAwKSB8ICgyIDw8IDMpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfU1lTQ09ORklHLCBsKTsKKworCS8qIDE2LWJpdCBpbnRlcmZhY2UsIElURSB0cmlnZ2VyIG1vZGUsIDE2LWJpdCBkYXRhICovCisJbCA9ICgweDAzIDw8IDApIHwgKDB4MDAgPDwgMikgfCAoMHgwMSA8PCA1KSB8ICgweDAyIDw8IDcpOworCWwgfD0gKDAgPDwgOSkgfCAoMSA8PCAyMCkgfCAoMSA8PCAyMSk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05GSUcwLCBsKTsKKworCXJmYmlfd3JpdGVfcmVnKFJGQklfREFUQV9DWUNMRTFfMCwgMHgwMDAwMDAxMCk7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTlRST0wpOworCS8qIFNlbGVjdCBDUzAsIGNsZWFyIGJ5cGFzcyBtb2RlICovCisJbCA9ICgweDAxIDw8IDIpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09OVFJPTCwgbCk7CisKKwlpZiAoKHIgPSBvbWFwX2Rpc3BjX3JlcXVlc3RfaXJxKHJmYmlfZG1hX2NhbGxiYWNrLCBOVUxMKSkgPCAwKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNhbid0IGdldCBESVNQQyBpcnFcbiIpOworCQlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7CisJCXJldHVybiByOworCX0KKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfUkVWSVNJT04pOworCXByX2luZm8oIm9tYXBmYjogUkZCSSB2ZXJzaW9uICVkLiVkIGluaXRpYWxpemVkXG4iLAorCQkobCA+PiA0KSAmIDB4MGYsIGwgJiAweDBmKTsKKworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZmJpX2NsZWFudXAodm9pZCkKK3sKKwlvbWFwX2Rpc3BjX2ZyZWVfaXJxKCk7CisJcmZiaV9wdXRfY2xvY2tzKCk7Cit9CisKK2NvbnN0IHN0cnVjdCBsY2RfY3RybF9leHRpZiBvbWFwMl9leHRfaWYgPSB7CisJLmluaXQJCQk9IHJmYmlfaW5pdCwKKwkuY2xlYW51cAkJPSByZmJpX2NsZWFudXAsCisJLmdldF9jbGtfaW5mbwkJPSByZmJpX2dldF9jbGtfaW5mbywKKwkuZ2V0X21heF90eF9yYXRlCT0gcmZiaV9nZXRfbWF4X3R4X3JhdGUsCisJLnNldF9iaXRzX3Blcl9jeWNsZQk9IHJmYmlfc2V0X2JpdHNfcGVyX2N5Y2xlLAorCS5jb252ZXJ0X3RpbWluZ3MJPSByZmJpX2NvbnZlcnRfdGltaW5ncywKKwkuc2V0X3RpbWluZ3MJCT0gcmZiaV9zZXRfdGltaW5ncywKKwkud3JpdGVfY29tbWFuZAkJPSByZmJpX3dyaXRlX2NvbW1hbmQsCisJLnJlYWRfZGF0YQkJPSByZmJpX3JlYWRfZGF0YSwKKwkud3JpdGVfZGF0YQkJPSByZmJpX3dyaXRlX2RhdGEsCisJLnRyYW5zZmVyX2FyZWEJCT0gcmZiaV90cmFuc2Zlcl9hcmVhLAorCS5zZXR1cF90ZWFyc3luYwkJPSByZmJpX3NldHVwX3RlYXJzeW5jLAorCS5lbmFibGVfdGVhcnN5bmMJPSByZmJpX2VuYWJsZV90ZWFyc3luYywKKworCS5tYXhfdHJhbnNtaXRfc2l6ZQk9ICh1MzIpIH4wLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL3Nvc3NpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvc29zc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRiY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL3Nvc3NpLmMKQEAgLTAsMCArMSw2ODYgQEAKKy8qCisgKiBPTUFQMSBTcGVjaWFsIE9wdGltaVNlZCBTY3JlZW4gSW50ZXJmYWNlIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNpbmNsdWRlICJsY2RjLmgiCisKKyNkZWZpbmUgTU9EVUxFX05BTUUJCSJvbWFwZmItc29zc2kiCisKKyNkZWZpbmUgT01BUF9TT1NTSV9CQVNFICAgICAgICAgMHhmZmZiYWMwMAorI2RlZmluZSBTT1NTSV9JRF9SRUcJCTB4MDAKKyNkZWZpbmUgU09TU0lfSU5JVDFfUkVHCQkweDA0CisjZGVmaW5lIFNPU1NJX0lOSVQyX1JFRwkJMHgwOAorI2RlZmluZSBTT1NTSV9JTklUM19SRUcJCTB4MGMKKyNkZWZpbmUgU09TU0lfRklGT19SRUcJCTB4MTAKKyNkZWZpbmUgU09TU0lfUkVPVEFCTEVfUkVHCTB4MTQKKyNkZWZpbmUgU09TU0lfVEVBUklOR19SRUcJMHgxOAorI2RlZmluZSBTT1NTSV9JTklUMUJfUkVHCTB4MWMKKyNkZWZpbmUgU09TU0lfRklGT0JfUkVHCQkweDIwCisKKyNkZWZpbmUgRE1BX0dTQ1IgICAgICAgICAgMHhmZmZlZGMwNAorI2RlZmluZSBETUFfTENEX0NDUiAgICAgICAweGZmZmVlM2MyCisjZGVmaW5lIERNQV9MQ0RfQ1RSTCAgICAgIDB4ZmZmZWUzYzQKKyNkZWZpbmUgRE1BX0xDRF9MQ0hfQ1RSTCAgMHhmZmZlZTNlYQorCisjZGVmaW5lIENPTkZfU09TU0lfUkVTRVRfUiAgICAgICgxIDw8IDIzKQorCisjZGVmaW5lIFJEX0FDQ0VTUwkJMAorI2RlZmluZSBXUl9BQ0NFU1MJCTEKKworI2RlZmluZSBTT1NTSV9NQVhfWE1JVF9CWVRFUwkoNTEyICogMTAyNCkKKworc3RhdGljIHN0cnVjdCB7CisJdm9pZCBfX2lvbWVtCSpiYXNlOworCXN0cnVjdCBjbGsJKmZjazsKKwl1bnNpZ25lZCBsb25nCWZja19oejsKKwlzcGlubG9ja190CWxvY2s7CisJaW50CQlidXNfcGlja19jb3VudDsKKwlpbnQJCWJ1c19waWNrX3dpZHRoOworCWludAkJdGVhcnN5bmNfbW9kZTsKKwlpbnQJCXRlYXJzeW5jX2xpbmU7CisJdm9pZAkJKCpsY2RjX2NhbGxiYWNrKSh2b2lkICpkYXRhKTsKKwl2b2lkCQkqbGNkY19jYWxsYmFja19kYXRhOworCWludAkJdnN5bmNfZG1hX3BlbmRpbmc7CisJLyogdGltaW5nIGZvciByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgKi8KKwlpbnQJCWNsa19kaXY7CisJdTgJCWNsa190dzBbMl07CisJdTgJCWNsa190dzFbMl07CisJLyoKKwkgKiBpZiBsYXN0X2FjY2VzcyBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IHdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCisJICogdGhlIHRpbWluZ3MKKwkgKi8KKwlpbnQJCWxhc3RfYWNjZXNzOworCisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworfSBzb3NzaTsKKworc3RhdGljIGlubGluZSB1MzIgc29zc2lfcmVhZF9yZWcoaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNvc3NpX3JlYWRfcmVnMTYoaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZHcoc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggc29zc2lfcmVhZF9yZWc4KGludCByZWcpCit7CisJcmV0dXJuIHJlYWRiKHNvc3NpLmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc29zc2lfd3JpdGVfcmVnKGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIHNvc3NpLmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc29zc2lfd3JpdGVfcmVnMTYoaW50IHJlZywgdTE2IHZhbHVlKQoreworCXdyaXRldyh2YWx1ZSwgc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3NzaV93cml0ZV9yZWc4KGludCByZWcsIHU4IHZhbHVlKQoreworCXdyaXRlYih2YWx1ZSwgc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3NldF9iaXRzKGludCByZWcsIHUzMiBiaXRzKQoreworCXNvc3NpX3dyaXRlX3JlZyhyZWcsIHNvc3NpX3JlYWRfcmVnKHJlZykgfCBiaXRzKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfY2xlYXJfYml0cyhpbnQgcmVnLCB1MzIgYml0cykKK3sKKwlzb3NzaV93cml0ZV9yZWcocmVnLCBzb3NzaV9yZWFkX3JlZyhyZWcpICYgfmJpdHMpOworfQorCisjZGVmaW5lIEhaX1RPX1BTKHgpCSgxMDAwMDAwMDAwIC8gKHggLyAxMDAwKSkKKworc3RhdGljIHUzMiBwc190b19zb3NzaV90aWNrcyh1MzIgcHMsIGludCBkaXYpCit7CisJdTMyIGNsa19wZXJpb2QgPSBIWl9UT19QUyhzb3NzaS5mY2tfaHopICogZGl2OworCXJldHVybiAoY2xrX3BlcmlvZCArIHBzIC0gMSkgLyBjbGtfcGVyaW9kOworfQorCitzdGF0aWMgaW50IGNhbGNfcmRfdGltaW5ncyhzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwl1MzIgdHcwLCB0dzE7CisJaW50IHJlb24sIHJlb2ZmLCByZWN5YywgYWN0aW07CisJaW50IGRpdiA9IHQtPmNsa19kaXY7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IGFmdGVyIGNvbnZlcnNpb24gaXQgc3RpbGwgaG9sZHMgdGhhdDoKKwkgKiByZW9mZiA+IHJlb24sIHJlY3ljID49IHJlb2ZmLCBhY3RpbSA+IHJlb24KKwkgKi8KKwlyZW9uID0gcHNfdG9fc29zc2lfdGlja3ModC0+cmVfb25fdGltZSwgZGl2KTsKKwkvKiByZW9uIHdpbGwgYmUgZXhhY3RseSBvbmUgc29zc2kgdGljayAqLworCWlmIChyZW9uID4gMSkKKwkJcmV0dXJuIC0xOworCisJcmVvZmYgPSBwc190b19zb3NzaV90aWNrcyh0LT5yZV9vZmZfdGltZSwgZGl2KTsKKworCWlmIChyZW9mZiA8PSByZW9uKQorCQlyZW9mZiA9IHJlb24gKyAxOworCisJdHcwID0gcmVvZmYgLSByZW9uOworCWlmICh0dzAgPiAweDEwKQorCQlyZXR1cm4gLTE7CisKKwlyZWN5YyA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPnJlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHJlY3ljIDw9IHJlb2ZmKQorCQlyZWN5YyA9IHJlb2ZmICsgMTsKKworCXR3MSA9IHJlY3ljIC0gdHcwOworCS8qIHZhbHVlcyBsZXNzIHRoZW4gMyByZXN1bHQgaW4gdGhlIFNPU1NJIGJsb2NrIHJlc2V0dGluZyBpdHNlbGYgKi8KKwlpZiAodHcxIDwgMykKKwkJdHcxID0gMzsKKwlpZiAodHcxID4gMHg0MCkKKwkJcmV0dXJuIC0xOworCisJYWN0aW0gPSBwc190b19zb3NzaV90aWNrcyh0LT5hY2Nlc3NfdGltZSwgZGl2KTsKKwlpZiAoYWN0aW0gPCByZW9mZikKKwkJYWN0aW0rKzsKKwkvKgorCSAqIGFjY2VzcyB0aW1lIChkYXRhIGhvbGQgdGltZSkgd2lsbCBiZSBleGFjdGx5IG9uZSBzb3NzaQorCSAqIHRpY2sKKwkgKi8KKwlpZiAoYWN0aW0gLSByZW9mZiA+IDEpCisJCXJldHVybiAtMTsKKworCXQtPnRpbVswXSA9IHR3MCAtIDE7CisJdC0+dGltWzFdID0gdHcxIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbGNfd3JfdGltaW5ncyhzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwl1MzIgdHcwLCB0dzE7CisJaW50IHdlb24sIHdlb2ZmLCB3ZWN5YzsKKwlpbnQgZGl2ID0gdC0+Y2xrX2RpdjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgYWZ0ZXIgY29udmVyc2lvbiBpdCBzdGlsbCBob2xkcyB0aGF0OgorCSAqIHdlb2ZmID4gd2Vvbiwgd2VjeWMgPj0gd2VvZmYKKwkgKi8KKwl3ZW9uID0gcHNfdG9fc29zc2lfdGlja3ModC0+d2Vfb25fdGltZSwgZGl2KTsKKwkvKiB3ZW9uIHdpbGwgYmUgZXhhY3RseSBvbmUgc29zc2kgdGljayAqLworCWlmICh3ZW9uID4gMSkKKwkJcmV0dXJuIC0xOworCisJd2VvZmYgPSBwc190b19zb3NzaV90aWNrcyh0LT53ZV9vZmZfdGltZSwgZGl2KTsKKwlpZiAod2VvZmYgPD0gd2VvbikKKwkJd2VvZmYgPSB3ZW9uICsgMTsKKwl0dzAgPSB3ZW9mZiAtIHdlb247CisJaWYgKHR3MCA+IDB4MTApCisJCXJldHVybiAtMTsKKworCXdlY3ljID0gcHNfdG9fc29zc2lfdGlja3ModC0+d2VfY3ljbGVfdGltZSwgZGl2KTsKKwlpZiAod2VjeWMgPD0gd2VvZmYpCisJCXdlY3ljID0gd2VvZmYgKyAxOworCisJdHcxID0gd2VjeWMgLSB0dzA7CisJLyogdmFsdWVzIGxlc3MgdGhlbiAzIHJlc3VsdCBpbiB0aGUgU09TU0kgYmxvY2sgcmVzZXR0aW5nIGl0c2VsZiAqLworCWlmICh0dzEgPCAzKQorCQl0dzEgPSAzOworCWlmICh0dzEgPiAweDQwKQorCQlyZXR1cm4gLTE7CisKKwl0LT50aW1bMl0gPSB0dzAgLSAxOworCXQtPnRpbVszXSA9IHR3MSAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX3NldF90aW1pbmcoaW50IGRpdiwgaW50IHR3MCwgaW50IHR3MSkKK3sKKwl1MzIgbDsKKworI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKHNvc3NpLmZiZGV2LT5kZXYsICJVc2luZyBUVzAgPSAlZCwgVFcxID0gJWQsIGRpdiA9ICVkXG4iLAorCQkgdHcwICsgMSwgdHcxICsgMSwgZGl2KTsKKyNlbmRpZgorCisJY2xrX3NldF9yYXRlKHNvc3NpLmZjaywgc29zc2kuZmNrX2h6IC8gZGl2KTsKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lOSVQxX1JFRyk7CisJbCAmPSB+KCgweDBmIDw8IDIwKSB8ICgweDNmIDw8IDI0KSk7CisJbCB8PSAodHcwIDw8IDIwKSB8ICh0dzEgPDwgMjQpOworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUMV9SRUcsIGwpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRfYml0c19wZXJfY3ljbGUoaW50IGJ1c19waWNrX2NvdW50LCBpbnQgYnVzX3BpY2tfd2lkdGgpCit7CisJdTMyIGw7CisKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSU5JVDNfUkVHKTsKKwlsICY9IH4weDNmZjsKKwlsIHw9ICgoYnVzX3BpY2tfY291bnQgLSAxKSA8PCA1KSB8ICgoYnVzX3BpY2tfd2lkdGggLSAxKSAmIDB4MWYpOworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUM19SRUcsIGwpOworfQorCitzdGF0aWMgdm9pZCBfc2V0X3RlYXJzeW5jX21vZGUoaW50IG1vZGUsIHVuc2lnbmVkIGxpbmUpCit7CisJdTMyIGw7CisKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfVEVBUklOR19SRUcpOworCWwgJj0gfigoKDEgPDwgMTEpIC0gMSkgPDwgMTUpOworCWwgfD0gbGluZSA8PCAxNTsKKwlsICY9IH4oMHgzIDw8IDI2KTsKKwlsIHw9IG1vZGUgPDwgMjY7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX1RFQVJJTkdfUkVHLCBsKTsKKwlpZiAobW9kZSkKKwkJc29zc2lfc2V0X2JpdHMoU09TU0lfSU5JVDJfUkVHLCAxIDw8IDYpOwkvKiBURSBsb2dpYyAqLworCWVsc2UKKwkJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMl9SRUcsIDEgPDwgNik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGltaW5nKGludCBhY2Nlc3MpCit7CisJaWYgKGFjY2VzcyAhPSBzb3NzaS5sYXN0X2FjY2VzcykgeworCQlzb3NzaS5sYXN0X2FjY2VzcyA9IGFjY2VzczsKKwkJX3NldF90aW1pbmcoc29zc2kuY2xrX2RpdiwKKwkJCSAgICBzb3NzaS5jbGtfdHcwW2FjY2Vzc10sIHNvc3NpLmNsa190dzFbYWNjZXNzXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zdGFydF90cmFuc2Zlcih2b2lkKQoreworCS8qIFdFICovCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMl9SRUcsIDEgPDwgNCk7CisJLyogQ1MgYWN0aXZlIGxvdyAqLworCXNvc3NpX2NsZWFyX2JpdHMoU09TU0lfSU5JVDFfUkVHLCAxIDw8IDMwKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfc3RvcF90cmFuc2Zlcih2b2lkKQoreworCS8qIFdFICovCisJc29zc2lfc2V0X2JpdHMoU09TU0lfSU5JVDJfUkVHLCAxIDw8IDQpOworCS8qIENTIGFjdGl2ZSBsb3cgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMzApOworfQorCitzdGF0aWMgdm9pZCB3YWl0X2VuZF9vZl93cml0ZSh2b2lkKQoreworCS8qIEJlZm9yZSByZWFkaW5nIHdlIG11c3QgY2hlY2sgaWYgc29tZSB3cml0aW5ncyBhcmUgZ29pbmcgb24gKi8KKwl3aGlsZSAoIShzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUMl9SRUcpICYgKDEgPDwgMykpKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9kYXRhKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9GSUZPX1JFRywgKihjb25zdCB1MzIgKikgZGF0YSk7CisJCWxlbiAtPSA0OworCQlkYXRhICs9IDQ7CisJfQorCXdoaWxlIChsZW4gPj0gMikgeworCQlzb3NzaV93cml0ZV9yZWcxNihTT1NTSV9GSUZPX1JFRywgKihjb25zdCB1MTYgKikgZGF0YSk7CisJCWxlbiAtPSAyOworCQlkYXRhICs9IDI7CisJfQorCXdoaWxlIChsZW4pIHsKKwkJc29zc2lfd3JpdGVfcmVnOChTT1NTSV9GSUZPX1JFRywgKihjb25zdCB1OCAqKSBkYXRhKTsKKwkJbGVuLS07CisJCWRhdGErKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jeWNsZXModW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIG5yX2N5Y2xlcyA9IGxlbiAvIChzb3NzaS5idXNfcGlja193aWR0aCAvIDgpOworCisJQlVHX09OKChucl9jeWNsZXMgLSAxKSAmIH4weDNmZmZmKTsKKworCXNvc3NpX2NsZWFyX2JpdHMoU09TU0lfSU5JVDFfUkVHLCAweDNmZmZmKTsKKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIChucl9jeWNsZXMgLSAxKSAmIDB4M2ZmZmYpOworfQorCitzdGF0aWMgaW50IHNvc3NpX2NvbnZlcnRfdGltaW5ncyhzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwlpbnQgciA9IDA7CisJaW50IGRpdiA9IHQtPmNsa19kaXY7CisKKwl0LT5jb252ZXJ0ZWQgPSAwOworCisJaWYgKGRpdiA8PSAwIHx8IGRpdiA+IDgpCisJCXJldHVybiAtMTsKKworCS8qIG5vIENTIG9uIFNPU1NJLCBzbyBpZ25vcmUgY3NvbiwgY3NvZmYsIGNzX3B1bHNld2lkdGggKi8KKwlpZiAoKHIgPSBjYWxjX3JkX3RpbWluZ3ModCkpIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlpZiAoKHIgPSBjYWxjX3dyX3RpbWluZ3ModCkpIDwgMCkKKwkJcmV0dXJuIHI7CisKKwl0LT50aW1bNF0gPSBkaXY7CisKKwl0LT5jb252ZXJ0ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3NldF90aW1pbmdzKGNvbnN0IHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCUJVR19PTighdC0+Y29udmVydGVkKTsKKworCXNvc3NpLmNsa190dzBbUkRfQUNDRVNTXSA9IHQtPnRpbVswXTsKKwlzb3NzaS5jbGtfdHcxW1JEX0FDQ0VTU10gPSB0LT50aW1bMV07CisKKwlzb3NzaS5jbGtfdHcwW1dSX0FDQ0VTU10gPSB0LT50aW1bMl07CisJc29zc2kuY2xrX3R3MVtXUl9BQ0NFU1NdID0gdC0+dGltWzNdOworCisJc29zc2kuY2xrX2RpdiA9IHQtPnRpbVs0XTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfZ2V0X2Nsa19pbmZvKHUzMiAqY2xrX3BlcmlvZCwgdTMyICptYXhfY2xrX2RpdikKK3sKKwkqY2xrX3BlcmlvZCA9IEhaX1RPX1BTKHNvc3NpLmZja19oeik7CisJKm1heF9jbGtfZGl2ID0gODsKK30KKworc3RhdGljIHZvaWQgc29zc2lfc2V0X2JpdHNfcGVyX2N5Y2xlKGludCBicGMpCit7CisJaW50IGJ1c19waWNrX2NvdW50LCBidXNfcGlja193aWR0aDsKKworCS8qCisJICogV2Ugc2V0IGV4cGxpY2l0bHkgdGhlIHRoZSBidXNfcGlja19jb3VudCBhcyB3ZWxsLCBhbHRob3VnaAorCSAqIHdpdGggcmVtYXBwaW5nL3Jlb3JkZXJpbmcgZGlzYWJsZWQgaXQgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IEhXCisJICogYXMgKDMyIC8gYnVzX3BpY2tfd2lkdGgpLgorCSAqLworCXN3aXRjaCAoYnBjKSB7CisJY2FzZSA4OgorCQlidXNfcGlja19jb3VudCA9IDQ7CisJCWJ1c19waWNrX3dpZHRoID0gODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJYnVzX3BpY2tfY291bnQgPSAyOworCQlidXNfcGlja193aWR0aCA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKwlzb3NzaS5idXNfcGlja193aWR0aCA9IGJ1c19waWNrX3dpZHRoOworCXNvc3NpLmJ1c19waWNrX2NvdW50ID0gYnVzX3BpY2tfY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc29zc2lfc2V0dXBfdGVhcnN5bmModW5zaWduZWQgcGluX2NudCwKKwkJCQl1bnNpZ25lZCBoc19wdWxzZV90aW1lLCB1bnNpZ25lZCB2c19wdWxzZV90aW1lLAorCQkJCWludCBoc19wb2xfaW52LCBpbnQgdnNfcG9sX2ludiwgaW50IGRpdikKK3sKKwlpbnQgaHMsIHZzOworCXUzMiBsOworCisJaWYgKHBpbl9jbnQgIT0gMSB8fCBkaXYgPCAxIHx8IGRpdiA+IDgpCisJCXJldHVybiAtRUlOVkFMOworCisJaHMgPSBwc190b19zb3NzaV90aWNrcyhoc19wdWxzZV90aW1lLCBkaXYpOworCXZzID0gcHNfdG9fc29zc2lfdGlja3ModnNfcHVsc2VfdGltZSwgZGl2KTsKKwlpZiAodnMgPCA4IHx8IHZzIDw9IGhzIHx8IHZzID49ICgxIDw8IDEyKSkKKwkJcmV0dXJuIC1FRE9NOworCXZzIC89IDg7CisJdnMtLTsKKwlpZiAoaHMgPiA4KQorCQlocyA9IDg7CisJaWYgKGhzKQorCQlocy0tOworCisJZGV2X2RiZyhzb3NzaS5mYmRldi0+ZGV2LAorCQkic2V0dXBfdGVhcnN5bmM6IGhzICVkIHZzICVkIGhzX2ludiAlZCB2c19pbnYgJWRcbiIsCisJCWhzLCB2cywgaHNfcG9sX2ludiwgdnNfcG9sX2ludik7CisKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX1RFQVJJTkdfUkVHKTsKKwlsICY9IH4oKDEgPDwgMTUpIC0gMSk7CisJbCB8PSB2cyA8PCAzOworCWwgfD0gaHM7CisJaWYgKGhzX3BvbF9pbnYpCisJCWwgfD0gMSA8PCAyOTsKKwllbHNlCisJCWwgJj0gfigxIDw8IDI5KTsKKwlpZiAodnNfcG9sX2ludikKKwkJbCB8PSAxIDw8IDI4OworCWVsc2UKKwkJbCAmPSB+KDEgPDwgMjgpOworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9URUFSSU5HX1JFRywgbCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvc3NpX2VuYWJsZV90ZWFyc3luYyhpbnQgZW5hYmxlLCB1bnNpZ25lZCBsaW5lKQoreworCWludCBtb2RlOworCisJZGV2X2RiZyhzb3NzaS5mYmRldi0+ZGV2LCAidGVhcnN5bmMgJWQgbGluZSAlZFxuIiwgZW5hYmxlLCBsaW5lKTsKKwlpZiAobGluZSA+PSAxIDw8IDExKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZW5hYmxlKSB7CisJCWlmIChsaW5lKQorCQkJbW9kZSA9IDI7CQkvKiBIUyBvciBWUyAqLworCQllbHNlCisJCQltb2RlID0gMzsJCS8qIFZTIG9ubHkgKi8KKwl9IGVsc2UKKwkJbW9kZSA9IDA7CisJc29zc2kudGVhcnN5bmNfbGluZSA9IGxpbmU7CisJc29zc2kudGVhcnN5bmNfbW9kZSA9IG1vZGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29zc2lfd3JpdGVfY29tbWFuZChjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlzZXRfdGltaW5nKFdSX0FDQ0VTUyk7CisJX3NldF9iaXRzX3Blcl9jeWNsZShzb3NzaS5idXNfcGlja19jb3VudCwgc29zc2kuYnVzX3BpY2tfd2lkdGgpOworCS8qIENNRCMvREFUQSAqLworCXNvc3NpX2NsZWFyX2JpdHMoU09TU0lfSU5JVDFfUkVHLCAxIDw8IDE4KTsKKwlzZXRfY3ljbGVzKGxlbik7CisJc29zc2lfc3RhcnRfdHJhbnNmZXIoKTsKKwlzZW5kX2RhdGEoZGF0YSwgbGVuKTsKKwlzb3NzaV9zdG9wX3RyYW5zZmVyKCk7CisJd2FpdF9lbmRfb2Zfd3JpdGUoKTsKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV93cml0ZV9kYXRhKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCXNldF90aW1pbmcoV1JfQUNDRVNTKTsKKwlfc2V0X2JpdHNfcGVyX2N5Y2xlKHNvc3NpLmJ1c19waWNrX2NvdW50LCBzb3NzaS5idXNfcGlja193aWR0aCk7CisJLyogQ01EIy9EQVRBICovCisJc29zc2lfc2V0X2JpdHMoU09TU0lfSU5JVDFfUkVHLCAxIDw8IDE4KTsKKwlzZXRfY3ljbGVzKGxlbik7CisJc29zc2lfc3RhcnRfdHJhbnNmZXIoKTsKKwlzZW5kX2RhdGEoZGF0YSwgbGVuKTsKKwlzb3NzaV9zdG9wX3RyYW5zZmVyKCk7CisJd2FpdF9lbmRfb2Zfd3JpdGUoKTsKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV90cmFuc2Zlcl9hcmVhKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl2b2lkIChjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpCit7CisJQlVHX09OKGNhbGxiYWNrID09IE5VTEwpOworCisJc29zc2kubGNkY19jYWxsYmFjayA9IGNhbGxiYWNrOworCXNvc3NpLmxjZGNfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CisKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJc2V0X3RpbWluZyhXUl9BQ0NFU1MpOworCV9zZXRfYml0c19wZXJfY3ljbGUoc29zc2kuYnVzX3BpY2tfY291bnQsIHNvc3NpLmJ1c19waWNrX3dpZHRoKTsKKwlfc2V0X3RlYXJzeW5jX21vZGUoc29zc2kudGVhcnN5bmNfbW9kZSwgc29zc2kudGVhcnN5bmNfbGluZSk7CisJLyogQ01EIy9EQVRBICovCisJc29zc2lfc2V0X2JpdHMoU09TU0lfSU5JVDFfUkVHLCAxIDw8IDE4KTsKKwlzZXRfY3ljbGVzKHdpZHRoICogaGVpZ2h0ICogc29zc2kuYnVzX3BpY2tfd2lkdGggLyA4KTsKKworCXNvc3NpX3N0YXJ0X3RyYW5zZmVyKCk7CisJaWYgKHNvc3NpLnRlYXJzeW5jX21vZGUpIHsKKwkJLyoKKwkJICogV2FpdCBmb3IgdGhlIHN5bmMgc2lnbmFsIGFuZCBzdGFydCB0aGUgdHJhbnNmZXIgb25seQorCQkgKiB0aGVuLiBXZSBjYW4ndCBzZWVtIHRvIGJlIGFibGUgdG8gdXNlIEhXIHN5bmMgRE1BIGZvcgorCQkgKiB0aGlzIHNpbmNlIExDRCBETUEgc2hvd3MgaHVnZSBsYXRlbmNpZXMsIGFzIGlmIGl0CisJCSAqIHdvdWxkIGlnbm9yZSBzb21lIG9mIHRoZSBETUEgcmVxdWVzdHMgZnJvbSBTb1NTSS4KKwkJICovCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNvc3NpLmxvY2ssIGZsYWdzKTsKKwkJc29zc2kudnN5bmNfZG1hX3BlbmRpbmcrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29zc2kubG9jaywgZmxhZ3MpOworCX0gZWxzZQorCQkvKiBKdXN0IHN0YXJ0IHRoZSB0cmFuc2ZlciByaWdodCBhd2F5LiAqLworCQlvbWFwX2VuYWJsZV9sY2RfZG1hKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX2RtYV9jYWxsYmFjayh2b2lkICpkYXRhKQoreworCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisJc29zc2lfc3RvcF90cmFuc2ZlcigpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7CisJc29zc2kubGNkY19jYWxsYmFjayhzb3NzaS5sY2RjX2NhbGxiYWNrX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9yZWFkX2RhdGEodm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJc2V0X3RpbWluZyhSRF9BQ0NFU1MpOworCV9zZXRfYml0c19wZXJfY3ljbGUoc29zc2kuYnVzX3BpY2tfY291bnQsIHNvc3NpLmJ1c19waWNrX3dpZHRoKTsKKwkvKiBDTUQjL0RBVEEgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMobGVuKTsKKwlzb3NzaV9zdGFydF90cmFuc2ZlcigpOworCXdoaWxlIChsZW4gPj0gNCkgeworCQkqKHUzMiAqKSBkYXRhID0gc29zc2lfcmVhZF9yZWcoU09TU0lfRklGT19SRUcpOworCQlsZW4gLT0gNDsKKwkJZGF0YSArPSA0OworCX0KKwl3aGlsZSAobGVuID49IDIpIHsKKwkJKih1MTYgKikgZGF0YSA9IHNvc3NpX3JlYWRfcmVnMTYoU09TU0lfRklGT19SRUcpOworCQlsZW4gLT0gMjsKKwkJZGF0YSArPSAyOworCX0KKwl3aGlsZSAobGVuKSB7CisJCSoodTggKikgZGF0YSA9IHNvc3NpX3JlYWRfcmVnOChTT1NTSV9GSUZPX1JFRyk7CisJCWxlbi0tOworCQlkYXRhKys7CisJfQorCXNvc3NpX3N0b3BfdHJhbnNmZXIoKTsKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc29zc2lfbWF0Y2hfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzb3NzaS5sb2NrLCBmbGFncyk7CisJaWYgKHNvc3NpLnZzeW5jX2RtYV9wZW5kaW5nKSB7CisJCXNvc3NpLnZzeW5jX2RtYV9wZW5kaW5nLS07CisJCW9tYXBfZW5hYmxlX2xjZF9kbWEoKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29zc2kubG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzb3NzaV9pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwl1MzIgbCwgazsKKwlzdHJ1Y3QgY2xrICpmY2s7CisJc3RydWN0IGNsayAqZHBsbDFvdXRfY2s7CisJaW50IHI7CisKKwlzb3NzaS5iYXNlID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoT01BUF9TT1NTSV9CQVNFKTsKKwlzb3NzaS5mYmRldiA9IGZiZGV2OworCXNwaW5fbG9ja19pbml0KCZzb3NzaS5sb2NrKTsKKworCWRwbGwxb3V0X2NrID0gY2xrX2dldChmYmRldi0+ZGV2LCAiY2tfZHBsbDFvdXQiKTsKKwlpZiAoSVNfRVJSKGRwbGwxb3V0X2NrKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJjYW4ndCBnZXQgRFBMTDFPVVQgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkcGxsMW91dF9jayk7CisJfQorCS8qCisJICogV2UgbmVlZCB0aGUgcGFyZW50IGNsb2NrIHJhdGUsIHdoaWNoIHdlIG1pZ2h0IGRpdmlkZSBmdXJ0aGVyCisJICogZGVwZW5kaW5nIG9uIHRoZSB0aW1pbmcgcmVxdWlyZW1lbnRzIG9mIHRoZSBjb250cm9sbGVyLiBTZWUKKwkgKiBfc2V0X3RpbWluZ3MuCisJICovCisJc29zc2kuZmNrX2h6ID0gY2xrX2dldF9yYXRlKGRwbGwxb3V0X2NrKTsKKwljbGtfcHV0KGRwbGwxb3V0X2NrKTsKKworCWZjayA9IGNsa19nZXQoZmJkZXYtPmRldiwgImNrX3Nvc3NpIik7CisJaWYgKElTX0VSUihmY2spKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNhbid0IGdldCBTb1NTSSBmdW5jdGlvbmFsIGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZmNrKTsKKwl9CisJc29zc2kuZmNrID0gZmNrOworCisJLyogUmVzZXQgYW5kIGVuYWJsZSB0aGUgU29TU0kgbW9kdWxlICovCisJbCA9IG9tYXBfcmVhZGwoTU9EX0NPTkZfQ1RSTF8xKTsKKwlsIHw9IENPTkZfU09TU0lfUkVTRVRfUjsKKwlvbWFwX3dyaXRlbChsLCBNT0RfQ09ORl9DVFJMXzEpOworCWwgJj0gfkNPTkZfU09TU0lfUkVTRVRfUjsKKwlvbWFwX3dyaXRlbChsLCBNT0RfQ09ORl9DVFJMXzEpOworCisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCWwgPSBvbWFwX3JlYWRsKEFSTV9JRExFQ1QyKTsKKwlsICY9IH4oMSA8PCA4KTsJCQkvKiBETUFDS19SRVEgKi8KKwlvbWFwX3dyaXRlbChsLCBBUk1fSURMRUNUMik7CisKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSU5JVDJfUkVHKTsKKwkvKiBFbmFibGUgYW5kIHJlc2V0IHRoZSBTb1NTSSBibG9jayAqLworCWwgfD0gKDEgPDwgMCkgfCAoMSA8PCAxKTsKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfSU5JVDJfUkVHLCBsKTsKKwkvKiBUYWtlIFNvU1NJIG91dCBvZiByZXNldCAqLworCWwgJj0gfigxIDw8IDEpOworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUMl9SRUcsIGwpOworCisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lEX1JFRywgMCk7CisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lEX1JFRyk7CisJayA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lEX1JFRyk7CisKKwlpZiAobCAhPSAweDU1NTU1NTU1IHx8IGsgIT0gMHhhYWFhYWFhYSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkiaW52YWxpZCBTb1NTSSBzeW5jIHBhdHRlcm46ICUwOHgsICUwOHhcbiIsIGwsIGspOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKChyID0gb21hcF9sY2RjX3NldF9kbWFfY2FsbGJhY2soc29zc2lfZG1hX2NhbGxiYWNrLCBOVUxMKSkgPCAwKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNhbid0IGdldCBMQ0RDIElSUVxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSURfUkVHKTsgLyogQ29tcG9uZW50IGNvZGUgKi8KKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSURfUkVHKTsKKwlkZXZfaW5mbyhmYmRldi0+ZGV2LCAiU29TU0kgdmVyc2lvbiAlZC4lZCBpbml0aWFsaXplZFxuIiwKKwkJbCA+PiAxNiwgbCAmIDB4ZmZmZik7CisKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSU5JVDFfUkVHKTsKKwlsIHw9ICgxIDw8IDE5KTsgLyogRE1BX01PREUgKi8KKwlsICY9IH4oMSA8PCAzMSk7IC8qIFJFT1JERVJJTkcgKi8KKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfSU5JVDFfUkVHLCBsKTsKKworCWlmICgociA9IHJlcXVlc3RfaXJxKElOVF8xNjEwX1NvU1NJX01BVENILCBzb3NzaV9tYXRjaF9pcnEsCisJCQkgICAgIElSUVRfRkFMTElORywKKwkgICAgICJzb3NzaV9tYXRjaCIsIHNvc3NpLmZiZGV2LT5kZXYpKSA8IDApIHsKKwkJZGV2X2Vycihzb3NzaS5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IFNvU1NJIG1hdGNoIElSUVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7CisJcmV0dXJuIDA7CisKK2VycjoKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworCWNsa19wdXQoc29zc2kuZmNrKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgc29zc2lfY2xlYW51cCh2b2lkKQoreworCW9tYXBfbGNkY19mcmVlX2RtYV9jYWxsYmFjaygpOworCWNsa19wdXQoc29zc2kuZmNrKTsKK30KKworc3RydWN0IGxjZF9jdHJsX2V4dGlmIG9tYXAxX2V4dF9pZiA9IHsKKwkuaW5pdAkJCT0gc29zc2lfaW5pdCwKKwkuY2xlYW51cAkJPSBzb3NzaV9jbGVhbnVwLAorCS5nZXRfY2xrX2luZm8JCT0gc29zc2lfZ2V0X2Nsa19pbmZvLAorCS5jb252ZXJ0X3RpbWluZ3MJPSBzb3NzaV9jb252ZXJ0X3RpbWluZ3MsCisJLnNldF90aW1pbmdzCQk9IHNvc3NpX3NldF90aW1pbmdzLAorCS5zZXRfYml0c19wZXJfY3ljbGUJPSBzb3NzaV9zZXRfYml0c19wZXJfY3ljbGUsCisJLnNldHVwX3RlYXJzeW5jCQk9IHNvc3NpX3NldHVwX3RlYXJzeW5jLAorCS5lbmFibGVfdGVhcnN5bmMJPSBzb3NzaV9lbmFibGVfdGVhcnN5bmMsCisJLndyaXRlX2NvbW1hbmQJCT0gc29zc2lfd3JpdGVfY29tbWFuZCwKKwkucmVhZF9kYXRhCQk9IHNvc3NpX3JlYWRfZGF0YSwKKwkud3JpdGVfZGF0YQkJPSBzb3NzaV93cml0ZV9kYXRhLAorCS50cmFuc2Zlcl9hcmVhCQk9IHNvc3NpX3RyYW5zZmVyX2FyZWEsCisKKwkubWF4X3RyYW5zbWl0X3NpemUJPSBTT1NTSV9NQVhfWE1JVF9CWVRFUywKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jIGIvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKaW5kZXggZTY0ZjhiNS4uODUwM2U3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAlzdHJ1Y3QgewogCQlfX3U4IHJlZCwgZ3JlZW4sIGJsdWU7CiAJfQkJCQlwYWxldHRlWzI1Nl07Ci0JdTMyCQkJCXBzZXVkb19wYWxldHRlWzE3XTsKKwl1MzIJCQkJcHNldWRvX3BhbGV0dGVbMTZdOwogCQogCXZvbGF0aWxlIHN0cnVjdCBjbWFwX3JlZ3MJX19pb21lbSAqY21hcF9yZWdzOwogCXVuc2lnbmVkIGxvbmcJCQljbWFwX3JlZ3NfcGh5czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG0yZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG0yZmIuYwppbmRleCAwYTA0NDgzLi4xMGMwY2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTJmYi5jCkBAIC0yNCw3ICsyNCw3IEBACiAgKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKLSAqIAorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+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+aW50ZXJwX2VsZl9leC5lX2VudHJ5OworCQkJfQorCQl9CiAJCWlmIChCQURfQUREUihlbGZfZW50cnkpKSB7CiAJCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJCQlyZXR2YWwgPSBJU19FUlIoKHZvaWQgKillbGZfZW50cnkpID8KZGlmZiAtLWdpdCBhL2ZzL2Jsb2NrX2Rldi5jIGIvZnMvYmxvY2tfZGV2LmMKaW5kZXggYjNlOWJmYS4uMzYzNTMxNSAxMDA2NDQKLS0tIGEvZnMvYmxvY2tfZGV2LmMKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTU4OCwxMiArNTg4LDEwIEBACiAKIGxvbmcgbnJfYmxvY2tkZXZfcGFnZXModm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJbG9uZyByZXQgPSAwOwogCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZhbGxfYmRldnMpIHsKLQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKLQkJYmRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsb2NrX2RldmljZSwgYmRfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiZGV2LCAmYWxsX2JkZXZzLCBiZF9saXN0KSB7CiAJCXJldCArPSBiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzOwogCX0KIAlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKQEAgLTg3NCw3ICs4NzIsNyBAQAogICovCiBzdGF0aWMgaW50IGFkZF9iZF9ob2xkZXIoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGJkX2hvbGRlciAqYm8pCiB7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCiAJaWYgKCFibykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04ODIsMTUgKzg4MCwxOCBAQAogCWlmICghYmRfaG9sZGVyX2dyYWJfZGlycyhiZGV2LCBibykpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlyZXQgPSBhZGRfc3ltbGluayhiby0+c2RpciwgYm8tPnNkZXYpOwotCWlmIChyZXQgPT0gMCkgewotCQlyZXQgPSBhZGRfc3ltbGluayhiby0+aGRpciwgYm8tPmhkZXYpOwotCQlpZiAocmV0KQotCQkJZGVsX3N5bWxpbmsoYm8tPnNkaXIsIGJvLT5zZGV2KTsKKwllcnIgPSBhZGRfc3ltbGluayhiby0+c2RpciwgYm8tPnNkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBhZGRfc3ltbGluayhiby0+aGRpciwgYm8tPmhkZXYpOworCWlmIChlcnIpIHsKKwkJZGVsX3N5bWxpbmsoYm8tPnNkaXIsIGJvLT5zZGV2KTsKKwkJcmV0dXJuIGVycjsKIAl9Ci0JaWYgKHJldCA9PSAwKQotCQlsaXN0X2FkZF90YWlsKCZiby0+bGlzdCwgJmJkZXYtPmJkX2hvbGRlcl9saXN0KTsKLQlyZXR1cm4gcmV0OworCisJbGlzdF9hZGRfdGFpbCgmYm8tPmxpc3QsICZiZGV2LT5iZF9ob2xkZXJfbGlzdCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtOTQ4LDcgKzk0OSw3IEBACiBzdGF0aWMgaW50IGJkX2NsYWltX2J5X2tvYmplY3Qoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdm9pZCAqaG9sZGVyLAogCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqKQogewotCWludCByZXM7CisJaW50IGVycjsKIAlzdHJ1Y3QgYmRfaG9sZGVyICpibywgKmZvdW5kOwogCiAJaWYgKCFrb2JqKQpAQCAtOTU5LDIxICs5NjAsMjQgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7Ci0JcmVzID0gYmRfY2xhaW0oYmRldiwgaG9sZGVyKTsKLQlpZiAocmVzID09IDApIHsKLQkJZm91bmQgPSBmaW5kX2JkX2hvbGRlcihiZGV2LCBibyk7Ci0JCWlmIChmb3VuZCA9PSBOVUxMKSB7Ci0JCQlyZXMgPSBhZGRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKLQkJCWlmIChyZXMpCi0JCQkJYmRfcmVsZWFzZShiZGV2KTsKLQkJfQotCX0KIAotCWlmIChyZXMgfHwgZm91bmQpCi0JCWZyZWVfYmRfaG9sZGVyKGJvKTsKKwllcnIgPSBiZF9jbGFpbShiZGV2LCBob2xkZXIpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCWZvdW5kID0gZmluZF9iZF9ob2xkZXIoYmRldiwgYm8pOworCWlmIChmb3VuZCkKKwkJZ290byBmYWlsOworCisJZXJyID0gYWRkX2JkX2hvbGRlcihiZGV2LCBibyk7CisJaWYgKGVycikKKwkJYmRfcmVsZWFzZShiZGV2KTsKKwllbHNlCisJCWJvID0gTlVMTDsKK2ZhaWw6CiAJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7Ci0KLQlyZXR1cm4gcmVzOworCWZyZWVfYmRfaG9sZGVyKGJvKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioKQEAgLTk4NywxNSArOTkxLDEyIEBACiBzdGF0aWMgdm9pZCBiZF9yZWxlYXNlX2Zyb21fa29iamVjdChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKLQlzdHJ1Y3QgYmRfaG9sZGVyICpibzsKLQogCWlmICgha29iaikKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCWJkX3JlbGVhc2UoYmRldik7Ci0JaWYgKChibyA9IGRlbF9iZF9ob2xkZXIoYmRldiwga29iaikpKQotCQlmcmVlX2JkX2hvbGRlcihibyk7CisJZnJlZV9iZF9ob2xkZXIoZGVsX2JkX2hvbGRlcihiZGV2LCBrb2JqKSk7CiAJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggYWE2ODIwNi4uMGY5MDA2NyAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCWZvcl9lYWNoX29ubGluZV9wZ2RhdChwZ2RhdCkgewogCQl6b25lcyA9IHBnZGF0LT5ub2RlX3pvbmVsaXN0c1tnZnBfem9uZShHRlBfTk9GUyldLnpvbmVzOwogCQlpZiAoKnpvbmVzKQotCQkJdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZXMsIEdGUF9OT0ZTKTsKKwkJCXRyeV90b19mcmVlX3BhZ2VzKHpvbmVzLCAwLCBHRlBfTk9GUyk7CiAJfQogfQogCkBAIC02NzYsNiArNjc2LDM5IEBACiBFWFBPUlRfU1lNQk9MKG1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKTsKIAogLyoKKyAqIE1hcmsgdGhlIHBhZ2UgZGlydHksIGFuZCBzZXQgaXQgZGlydHkgaW4gdGhlIHJhZGl4IHRyZWUsIGFuZCBtYXJrIHRoZSBpbm9kZQorICogZGlydHkuCisgKgorICogSWYgd2FybiBpcyB0cnVlLCB0aGVuIGVtaXQgYSB3YXJuaW5nIGlmIHRoZSBwYWdlIGlzIG5vdCB1cHRvZGF0ZSBhbmQgaGFzCisgKiBub3QgYmVlbiB0cnVuY2F0ZWQuCisgKi8KK3N0YXRpYyBpbnQgX19zZXRfcGFnZV9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGludCB3YXJuKQoreworCWlmICh1bmxpa2VseSghbWFwcGluZykpCisJCXJldHVybiAhVGVzdFNldFBhZ2VEaXJ0eShwYWdlKTsKKworCWlmIChUZXN0U2V0UGFnZURpcnR5KHBhZ2UpKQorCQlyZXR1cm4gMDsKKworCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCWlmIChwYWdlLT5tYXBwaW5nKSB7CS8qIFJhY2Ugd2l0aCB0cnVuY2F0ZT8gKi8KKwkJV0FSTl9PTl9PTkNFKHdhcm4gJiYgIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisKKwkJaWYgKG1hcHBpbmdfY2FwX2FjY291bnRfZGlydHkobWFwcGluZykpIHsKKwkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKKwkJCXRhc2tfaW9fYWNjb3VudF93cml0ZShQQUdFX0NBQ0hFX1NJWkUpOworCQl9CisJCXJhZGl4X3RyZWVfdGFnX3NldCgmbWFwcGluZy0+cGFnZV90cmVlLAorCQkJCXBhZ2VfaW5kZXgocGFnZSksIFBBR0VDQUNIRV9UQUdfRElSVFkpOworCX0KKwl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCV9fbWFya19pbm9kZV9kaXJ0eShtYXBwaW5nLT5ob3N0LCBJX0RJUlRZX1BBR0VTKTsKKworCXJldHVybiAxOworfQorCisvKgogICogQWRkIGEgcGFnZSB0byB0aGUgZGlydHkgcGFnZSBsaXN0LgogICoKICAqIEl0IGlzIGEgc2FkIGZhY3Qgb2YgbGlmZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gc2V2ZXJhbCBwbGFjZXMKQEAgLTcwMiw3ICs3MzUsNyBAQAogICovCiBpbnQgX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICogY29uc3QgbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKIAogCWlmICh1bmxpa2VseSghbWFwcGluZykpCiAJCXJldHVybiAhVGVzdFNldFBhZ2VEaXJ0eShwYWdlKTsKQEAgLTcxOSwyMSArNzUyLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJm1hcHBpbmctPnByaXZhdGVfbG9jayk7CiAKLQlpZiAoVGVzdFNldFBhZ2VEaXJ0eShwYWdlKSkKLQkJcmV0dXJuIDA7Ci0KLQl3cml0ZV9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQlpZiAocGFnZS0+bWFwcGluZykgewkvKiBSYWNlIHdpdGggdHJ1bmNhdGU/ICovCi0JCWlmIChtYXBwaW5nX2NhcF9hY2NvdW50X2RpcnR5KG1hcHBpbmcpKSB7Ci0JCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9ESVJUWSk7Ci0JCQl0YXNrX2lvX2FjY291bnRfd3JpdGUoUEFHRV9DQUNIRV9TSVpFKTsKLQkJfQotCQlyYWRpeF90cmVlX3RhZ19zZXQoJm1hcHBpbmctPnBhZ2VfdHJlZSwKLQkJCQlwYWdlX2luZGV4KHBhZ2UpLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQlfX21hcmtfaW5vZGVfZGlydHkobWFwcGluZy0+aG9zdCwgSV9ESVJUWV9QQUdFUyk7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIF9fc2V0X3BhZ2VfZGlydHkocGFnZSwgbWFwcGluZywgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycyk7CiAKQEAgLTk4Miw3ICsxMDAxLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCiAJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCi0JCW1hcHBpbmdfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZykgJiB+X19HRlBfRlMpOworCQkobWFwcGluZ19nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nKSAmIH5fX0dGUF9GUyl8X19HRlBfTU9WQUJMRSk7CiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTAyNiwxMSArMTA0NSw2IEBACiAvKgogICogQ3JlYXRlIGJ1ZmZlcnMgZm9yIHRoZSBzcGVjaWZpZWQgYmxvY2sgZGV2aWNlIGJsb2NrJ3MgcGFnZS4gIElmCiAgKiB0aGF0IHBhZ2Ugd2FzIGRpcnR5LCB0aGUgYnVmZmVycyBhcmUgc2V0IGRpcnR5IGFsc28uCi0gKgotICogRXhjZXB0IHRoYXQncyBhIGJ1Zy4gIEF0dGFjaGluZyBkaXJ0eSBidWZmZXJzIHRvIGEgZGlydHkKLSAqIGJsb2NrZGV2J3MgcGFnZSBjYW4gcmVzdWx0IGluIGZpbGVzeXN0ZW0gY29ycnVwdGlvbiwgYmVjYXVzZQotICogc29tZSBvZiB0aG9zZSBidWZmZXJzIG1heSBiZSBhbGlhc2VzIG9mIGZpbGVzeXN0ZW0gZGF0YS4KLSAqIGdyb3dfZGV2X3BhZ2UoKSB3aWxsIGdvIEJVRygpIGlmIHRoaXMgaGFwcGVucy4KICAqLwogc3RhdGljIGludAogZ3Jvd19idWZmZXJzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGJsb2NrLCBpbnQgc2l6ZSkKQEAgLTExMzcsOCArMTE1MSw5IEBACiAgKi8KIHZvaWQgZmFzdGNhbGwgbWFya19idWZmZXJfZGlydHkoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKKwlXQVJOX09OX09OQ0UoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOwogCWlmICghYnVmZmVyX2RpcnR5KGJoKSAmJiAhdGVzdF9zZXRfYnVmZmVyX2RpcnR5KGJoKSkKLQkJX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMoYmgtPmJfcGFnZSk7CisJCV9fc2V0X3BhZ2VfZGlydHkoYmgtPmJfcGFnZSwgcGFnZV9tYXBwaW5nKGJoLT5iX3BhZ2UpLCAwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IDhiMGNiZjQuLmJkMGYyZjIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtODQ5LDYgKzg0OSw3IEBACiAJX191MTYgIG5ldGZpZDsKIAlpbnQgcmM7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZG8gewogCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKSAKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jb25uZWN0LmMgYi9mcy9jaWZzL2Nvbm5lY3QuYwppbmRleCBmNGU5MjY2Li4wYTFiOGJkIDEwMDY0NAotLS0gYS9mcy9jaWZzL2Nvbm5lY3QuYworKysgYi9mcy9jaWZzL2Nvbm5lY3QuYwpAQCAtMzYzLDYgKzM2Myw3IEBACiAJCQlHRlBfS0VSTkVMKTsKIAl9CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJaWYgKHRyeV90b19mcmVlemUoKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9leHBvcnQuYyBiL2ZzL2NpZnMvZXhwb3J0LmMKaW5kZXggMWQ3MTYzOS4uOTZkZjFkNSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9leHBvcnQuYworKysgYi9mcy9jaWZzL2V4cG9ydC5jCkBAIC0yOSw2ICsyOSw3IEBACiAgICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAgCiAjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCiAgCmRpZmYgLS1naXQgYS9mcy9jb21wYXRfaW9jdGwuYyBiL2ZzL2NvbXBhdF9pb2N0bC5jCmluZGV4IDZiNDRjZGMuLmU0NDBhN2IgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdF9pb2N0bC5jCisrKyBiL2ZzL2NvbXBhdF9pb2N0bC5jCkBAIC02Myw2ICs2Myw3IEBACiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9hdGFsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3RyYWNlX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvb3AuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2kuaD4KQEAgLTM0ODksNiArMzQ5MCw5IEBACiAKIElHTk9SRV9JT0NUTChWRkFUX0lPQ1RMX1JFQURESVJfQk9USDMyKQogSUdOT1JFX0lPQ1RMKFZGQVRfSU9DVExfUkVBRERJUl9TSE9SVDMyKQorCisvKiBsb29wICovCitJR05PUkVfSU9DVEwoTE9PUF9DTFJfRkQpCiB9OwogCiAjZGVmaW5lIElPQ1RMX0hBU0hTSVpFIDI1NgpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvY29uZmlnZnNfaW50ZXJuYWwuaCBiL2ZzL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2ludGVybmFsLmgKaW5kZXggN2I0OGMwMy4uM2IwMTg1ZiAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvY29uZmlnZnNfaW50ZXJuYWwuaAorKysgYi9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oCkBAIC0yOSwxMCArMjksMTEgQEAKIAogc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCB7CiAJYXRvbWljX3QJCXNfY291bnQ7CisJaW50CQkJc19kZXBlbmRlbnRfY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZAlzX3NpYmxpbmc7CiAJc3RydWN0IGxpc3RfaGVhZAlzX2NoaWxkcmVuOwogCXN0cnVjdCBsaXN0X2hlYWQJc19saW5rczsKLQl2b2lkIAkJCSogc19lbGVtZW50OworCXZvaWQJCQkqIHNfZWxlbWVudDsKIAlpbnQJCQlzX3R5cGU7CiAJdW1vZGVfdAkJCXNfbW9kZTsKIAlzdHJ1Y3QgZGVudHJ5CQkqIHNfZGVudHJ5OwpAQCAtNDEsOCArNDIsOCBAQAogCiAjZGVmaW5lIENPTkZJR0ZTX1JPT1QJCTB4MDAwMQogI2RlZmluZSBDT05GSUdGU19ESVIJCTB4MDAwMgotI2RlZmluZSBDT05GSUdGU19JVEVNX0FUVFIgCTB4MDAwNAotI2RlZmluZSBDT05GSUdGU19JVEVNX0xJTksgCTB4MDAyMAorI2RlZmluZSBDT05GSUdGU19JVEVNX0FUVFIJMHgwMDA0CisjZGVmaW5lIENPTkZJR0ZTX0lURU1fTElOSwkweDAwMjAKICNkZWZpbmUgQ09ORklHRlNfVVNFVF9ESVIJMHgwMDQwCiAjZGVmaW5lIENPTkZJR0ZTX1VTRVRfREVGQVVMVAkweDAwODAKICNkZWZpbmUgQ09ORklHRlNfVVNFVF9EUk9QUElORwkweDAxMDAKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2Rpci5jIGIvZnMvY29uZmlnZnMvZGlyLmMKaW5kZXggNWU2ZTM3ZS4uMmY0MzZkNCAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvZGlyLmMKKysrIGIvZnMvY29uZmlnZnMvZGlyLmMKQEAgLTM1NSw2ICszNTUsMTAgQEAKIAkJCS8qIE1hcmsgdGhhdCB3ZSd2ZSB0YWtlbiBpX211dGV4ICovCiAJCQlzZC0+c190eXBlIHw9IENPTkZJR0ZTX1VTRVRfRFJPUFBJTkc7CiAKKwkJCS8qCisJCQkgKiBZdXAsIHJlY3Vyc2l2ZS4gIElmIHRoZXJlJ3MgYSBwcm9ibGVtLCBibGFtZQorCQkJICogZGVlcCBuZXN0aW5nIG9mIGRlZmF1bHRfZ3JvdXBzCisJCQkgKi8KIAkJCXJldCA9IGNvbmZpZ2ZzX2RldGFjaF9wcmVwKHNkLT5zX2RlbnRyeSk7CiAJCQlpZiAoIXJldCkKIAkJCQljb250aW51ZTsKQEAgLTU2Miw3ICs1NjYsNyBAQAogCiAvKgogICogQWxsIG9mIGxpbmtfb2JqL3VubGlua19vYmovbGlua19ncm91cC91bmxpbmtfZ3JvdXAgcmVxdWlyZSB0aGF0Ci0gKiBzdWJzeXMtPnN1X3NlbSBpcyBoZWxkLgorICogc3Vic3lzLT5zdV9tdXRleCBpcyBoZWxkLgogICovCiAKIHN0YXRpYyB2b2lkIHVubGlua19vYmooc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQpAQCAtNzE0LDYgKzcxOCwyOCBAQAogfQogCiAvKgorICogQWZ0ZXIgdGhlIGl0ZW0gaGFzIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgZmlsZXN5c3RlbSB2aWV3LCB3ZSBhcmUKKyAqIHJlYWR5IHRvIHRlYXIgaXQgb3V0IG9mIHRoZSBoaWVyYXJjaHkuICBOb3RpZnkgdGhlIGNsaWVudCBiZWZvcmUKKyAqIHdlIGRvIHRoYXQgc28gdGhleSBjYW4gcGVyZm9ybSBhbnkgY2xlYW51cCB0aGF0IHJlcXVpcmVzCisgKiBuYXZpZ2F0aW5nIHRoZSBoaWVyYXJjaHkuICBBIGNsaWVudCBkb2VzIG5vdCBuZWVkIHRvIHByb3ZpZGUgdGhpcworICogY2FsbGJhY2suICBUaGUgc3Vic3lzdGVtIHNlbWFwaG9yZSBNVVNUIGJlIGhlbGQgYnkgdGhlIGNhbGxlciwgYW5kCisgKiByZWZlcmVuY2VzIG11c3QgYmUgdmFsaWQgZm9yIGJvdGggaXRlbXMuICBJdCBhbHNvIGFzc3VtZXMgdGhlCisgKiBjYWxsZXIgaGFzIHZhbGlkYXRlZCBjaV90eXBlLgorICovCitzdGF0aWMgdm9pZCBjbGllbnRfZGlzY29ubmVjdF9ub3RpZnkoc3RydWN0IGNvbmZpZ19pdGVtICpwYXJlbnRfaXRlbSwKKwkJCQkgICAgIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKK3sKKwlzdHJ1Y3QgY29uZmlnX2l0ZW1fdHlwZSAqdHlwZTsKKworCXR5cGUgPSBwYXJlbnRfaXRlbS0+Y2lfdHlwZTsKKwlCVUdfT04oIXR5cGUpOworCisJaWYgKHR5cGUtPmN0X2dyb3VwX29wcyAmJiB0eXBlLT5jdF9ncm91cF9vcHMtPmRpc2Nvbm5lY3Rfbm90aWZ5KQorCQl0eXBlLT5jdF9ncm91cF9vcHMtPmRpc2Nvbm5lY3Rfbm90aWZ5KHRvX2NvbmZpZ19ncm91cChwYXJlbnRfaXRlbSksCisJCQkJCQkgICAgICBpdGVtKTsKK30KKworLyoKICAqIERyb3AgdGhlIGluaXRpYWwgcmVmZXJlbmNlIGZyb20gbWFrZV9pdGVtKCkvbWFrZV9ncm91cCgpCiAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCByZWZlcmVuY2UgaXMgaGVsZCBvbiBpdGVtCiAgKiBhbmQgdGhhdCBpdGVtIGhvbGRzIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQuICBBbHNvLCBpdApAQCAtNzMzLDExICs3NTksMjQ0IEBACiAJICovCiAJaWYgKHR5cGUtPmN0X2dyb3VwX29wcyAmJiB0eXBlLT5jdF9ncm91cF9vcHMtPmRyb3BfaXRlbSkKIAkJdHlwZS0+Y3RfZ3JvdXBfb3BzLT5kcm9wX2l0ZW0odG9fY29uZmlnX2dyb3VwKHBhcmVudF9pdGVtKSwKLQkJCQkJCWl0ZW0pOworCQkJCQkgICAgICBpdGVtKTsKIAllbHNlCiAJCWNvbmZpZ19pdGVtX3B1dChpdGVtKTsKIH0KIAorI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBjb25maWdmc19kdW1wX29uZShzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpzZCwgaW50IGxldmVsKQoreworCXByaW50ayhLRVJOX0lORk8gIiUqc1wiJXNcIjpcbiIsIGxldmVsLCAiICIsIGNvbmZpZ2ZzX2dldF9uYW1lKHNkKSk7CisKKyNkZWZpbmUgdHlwZV9wcmludChfdHlwZSkgaWYgKHNkLT5zX3R5cGUgJiBfdHlwZSkgcHJpbnRrKEtFUk5fSU5GTyAiJSpzICVzXG4iLCBsZXZlbCwgIiAiLCAjX3R5cGUpOworCXR5cGVfcHJpbnQoQ09ORklHRlNfUk9PVCk7CisJdHlwZV9wcmludChDT05GSUdGU19ESVIpOworCXR5cGVfcHJpbnQoQ09ORklHRlNfSVRFTV9BVFRSKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX0lURU1fTElOSyk7CisJdHlwZV9wcmludChDT05GSUdGU19VU0VUX0RJUik7CisJdHlwZV9wcmludChDT05GSUdGU19VU0VUX0RFRkFVTFQpOworCXR5cGVfcHJpbnQoQ09ORklHRlNfVVNFVF9EUk9QUElORyk7CisjdW5kZWYgdHlwZV9wcmludAorfQorCitzdGF0aWMgaW50IGNvbmZpZ2ZzX2R1bXAoc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqc2QsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpjaGlsZF9zZDsKKwlpbnQgcmV0ID0gMDsKKworCWNvbmZpZ2ZzX2R1bXBfb25lKHNkLCBsZXZlbCk7CisKKwlpZiAoIShzZC0+c190eXBlICYgKENPTkZJR0ZTX0RJUnxDT05GSUdGU19ST09UKSkpCisJCXJldHVybiAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZF9zZCwgJnNkLT5zX2NoaWxkcmVuLCBzX3NpYmxpbmcpIHsKKwkJcmV0ID0gY29uZmlnZnNfZHVtcChjaGlsZF9zZCwgbGV2ZWwgKyAyKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworCisvKgorICogY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBhbmQgY29uZmlnZnNfdW5kZXBlbmRfaXRlbSgpCisgKgorICogV0FSTklORzogRG8gbm90IGNhbGwgdGhlc2UgZnJvbSBhIGNvbmZpZ2ZzIGNhbGxiYWNrIQorICoKKyAqIFRoaXMgZGVzY3JpYmVzIHRoZXNlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgaGVscGVycy4KKyAqCisgKiBBbGxvdyBhbm90aGVyIGtlcm5lbCBzeXN0ZW0gdG8gZGVwZW5kIG9uIGEgY29uZmlnX2l0ZW0uICBJZiB0aGlzCisgKiBoYXBwZW5zLCB0aGUgaXRlbSBjYW5ub3QgZ28gYXdheSB1bnRpbCB0aGUgZGVwZW5kYW50IGNhbiBsaXZlIHdpdGhvdXQKKyAqIGl0LiAgVGhlIGlkZWEgaXMgdG8gZ2l2ZSBjbGllbnQgbW9kdWxlcyBhcyBzaW1wbGUgYW4gaW50ZXJmYWNlIGFzCisgKiBwb3NzaWJsZS4gIFdoZW4gYSBzeXN0ZW0gYXNrcyB0aGVtIHRvIGRlcGVuZCBvbiBhbiBpdGVtLCB0aGV5IGp1c3QKKyAqIGNhbGwgY29uZmlnZnNfZGVwZW5kX2l0ZW0oKS4gIElmIHRoZSBpdGVtIGlzIGxpdmUgYW5kIHRoZSBjbGllbnQKKyAqIGRyaXZlciBpcyBpbiBnb29kIHNoYXBlLCB3ZSdsbCBoYXBwaWx5IGRvIHRoZSB3b3JrIGZvciB0aGVtLgorICoKKyAqIFdoeSBpcyB0aGUgbG9ja2luZyBjb21wbGV4PyAgQmVjYXVzZSBjb25maWdmcyB1c2VzIHRoZSBWRlMgdG8gaGFuZGxlCisgKiBhbGwgbG9ja2luZywgYnV0IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG91dHNpZGUgdGhlIG5vcm1hbAorICogVkZTLT5jb25maWdmcyBwYXRoLiAgU28gaXQgbXVzdCB0YWtlIFZGUyBsb2NrcyB0byBwcmV2ZW50IHRoZQorICogVkZTLT5jb25maWdmcyBzdHVmZiAoY29uZmlnZnNfbWtkaXIoKSwgY29uZmlnZnNfcm1kaXIoKSwgZXRjKS4gIFRoaXMgaXMKKyAqIHdoeSB5b3UgY2FuJ3QgY2FsbCB0aGVzZSBmdW5jdGlvbnMgdW5kZXJuZWF0aCBjb25maWdmcyBjYWxsYmFja3MuCisgKgorICogTm90ZSwgYnR3LCB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBhdCAqYW55KiB0aW1lLCBldmVuIHdoZW4gYSBjb25maWdmcworICogc3Vic3lzdGVtIGlzbid0IHJlZ2lzdGVyZWQsIG9yIHdoZW4gY29uZmlnZnMgaXMgbG9hZGluZyBvciB1bmxvYWRpbmcuCisgKiBKdXN0IGxpa2UgY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCkuICBTbyB3ZSB0YWtlIHRoZSBzYW1lCisgKiBwcmVjYXV0aW9ucy4gIFdlIHBpbiB0aGUgZmlsZXN5c3RlbS4gIFdlIGxvY2sgZWFjaCBpX211dGV4IF9pbl9vcmRlcl8KKyAqIG9uIG91ciB3YXkgZG93biB0aGUgdHJlZS4gIElmIHdlIGNhbiBmaW5kIHRoZSB0YXJnZXQgaXRlbSBpbiB0aGUKKyAqIGNvbmZpZ2ZzIHRyZWUsIGl0IG11c3QgYmUgcGFydCBvZiB0aGUgc3Vic3lzdGVtIHRyZWUgYXMgd2VsbCwgc28gd2UKKyAqIGRvIG5vdCBuZWVkIHRoZSBzdWJzeXN0ZW0gc2VtYXBob3JlLiAgSG9sZGluZyB0aGUgaV9tdXRleCBjaGFpbiBsb2NrcworICogb3V0IG1rZGlyKCkgYW5kIHJtZGlyKCksIHdobyBtaWdodCBiZSByYWNpbmcgdXMuCisgKi8KKworLyoKKyAqIGNvbmZpZ2ZzX2RlcGVuZF9wcmVwKCkKKyAqCisgKiBPbmx5IHN1YmRpcmVjdG9yaWVzIGNvdW50IGhlcmUuICBGaWxlcyAoQ09ORklHRlNfTk9UX1BJTk5FRCkgYXJlCisgKiBhdHRyaWJ1dGVzLiAgVGhpcyBpcyBzaW1pbGFyIGJ1dCBub3QgdGhlIHNhbWUgdG8gY29uZmlnZnNfZGV0YWNoX3ByZXAoKS4KKyAqIE5vdGUgdGhhdCBjb25maWdmc19kZXRhY2hfcHJlcCgpIGV4cGVjdHMgdGhlIHBhcmVudCB0byBiZSBsb2NrZWQgd2hlbiBpdAorICogaXMgY2FsbGVkLCBidXQgd2UgbG9jayB0aGUgcGFyZW50ICppbnNpZGUqIGNvbmZpZ2ZzX2RlcGVuZF9wcmVwKCkuICBXZQorICogZG8gdGhhdCBzbyB3ZSBjYW4gdW5sb2NrIGl0IGlmIHdlIGZpbmQgbm90aGluZy4KKyAqCisgKiBIZXJlIHdlIGRvIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIG9mIHRoZSBkZW50cnkgaGllcmFyY2h5IGxvb2tpbmcgZm9yCisgKiBvdXIgb2JqZWN0LiAgV2UgdGFrZSBpX211dGV4IG9uIGVhY2ggc3RlcCBvZiB0aGUgd2F5IGRvd24uICBJVCBJUworICogRVNTRU5USUFMIFRIQVQgaV9tdXRleCBMT0NLSU5HIElTIE9SREVSRUQuICBJZiB3ZSBjb21lIGJhY2sgdXAgYSBicmFuY2gsCisgKiB3ZSdsbCBkcm9wIHRoZSBpX211dGV4LgorICoKKyAqIElmIHRoZSB0YXJnZXQgaXMgbm90IGZvdW5kLCAtRU5PRU5UIGlzIGJ1YmJsZWQgdXAgYW5kIHdlIGhhdmUgcmVsZWFzZWQKKyAqIGFsbCBsb2Nrcy4gIElmIHRoZSB0YXJnZXQgd2FzIGZvdW5kLCB0aGUgbG9ja3Mgd2lsbCBiZSBjbGVhcmVkIGJ5CisgKiBjb25maWdmc19kZXBlbmRfcm9sbGJhY2soKS4KKyAqCisgKiBUaGlzIGFkZHMgYSByZXF1aXJlbWVudCB0aGF0IGFsbCBjb25maWdfaXRlbXMgYmUgdW5pcXVlIQorICoKKyAqIFRoaXMgaXMgcmVjdXJzaXZlIGJlY2F1c2UgdGhlIGxvY2tpbmcgdHJhdmVyc2FsIGlzIHRyaWNreS4gIFRoZXJlIGlzbid0CisgKiBtdWNoIG9uIHRoZSBzdGFjaywgdGhvdWdoLCBzbyBmb2xrcyB0aGF0IG5lZWQgdGhpcyBmdW5jdGlvbiAtIGJlIGNhcmVmdWwKKyAqIGFib3V0IHlvdXIgc3RhY2shICBQYXRjaGVzIHdpbGwgYmUgYWNjZXB0ZWQgdG8gbWFrZSBpdCBpdGVyYXRpdmUuCisgKi8KK3N0YXRpYyBpbnQgY29uZmlnZnNfZGVwZW5kX3ByZXAoc3RydWN0IGRlbnRyeSAqb3JpZ2luLAorCQkJCXN0cnVjdCBjb25maWdfaXRlbSAqdGFyZ2V0KQoreworCXN0cnVjdCBjb25maWdmc19kaXJlbnQgKmNoaWxkX3NkLCAqc2QgPSBvcmlnaW4tPmRfZnNkYXRhOworCWludCByZXQgPSAwOworCisJQlVHX09OKCFvcmlnaW4gfHwgIXNkKTsKKworCS8qIExvY2sgdGhpcyBndXkgb24gdGhlIHdheSBkb3duICovCisJbXV0ZXhfbG9jaygmc2QtPnNfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwlpZiAoc2QtPnNfZWxlbWVudCA9PSB0YXJnZXQpICAvKiBCb28teWFoICovCisJCWdvdG8gb3V0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZF9zZCwgJnNkLT5zX2NoaWxkcmVuLCBzX3NpYmxpbmcpIHsKKwkJaWYgKGNoaWxkX3NkLT5zX3R5cGUgJiBDT05GSUdGU19ESVIpIHsKKwkJCXJldCA9IGNvbmZpZ2ZzX2RlcGVuZF9wcmVwKGNoaWxkX3NkLT5zX2RlbnRyeSwKKwkJCQkJCSAgIHRhcmdldCk7CisJCQlpZiAoIXJldCkKKwkJCQlnb3RvIG91dDsgIC8qIENoaWxkIHBhdGggYm9vLXlhaCAqLworCQl9CisJfQorCisJLyogV2UgbG9vcGVkIGFsbCBvdXIgY2hpbGRyZW4gYW5kIGRpZG4ndCBmaW5kIHRhcmdldCAqLworCW11dGV4X3VubG9jaygmc2QtPnNfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwlyZXQgPSAtRU5PRU5UOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgaXMgT05MWSBjYWxsZWQgaWYgY29uZmlnZnNfZGVwZW5kX3ByZXAoKSBkaWQgaXRzIGpvYi4gIFNvIHdlIGNhbgorICogdHJ1c3QgdGhlIGVudGlyZSBwYXRoIGZyb20gaXRlbSBiYWNrIHVwIHRvIG9yaWdpbi4KKyAqCisgKiBXZSB3YWxrIGJhY2t3YXJkcyBmcm9tIGl0ZW0sIHVubG9ja2luZyBlYWNoIGlfbXV0ZXguICBXZSBmaW5pc2ggYnkKKyAqIHVubG9ja2luZyBvcmlnaW4uCisgKi8KK3N0YXRpYyB2b2lkIGNvbmZpZ2ZzX2RlcGVuZF9yb2xsYmFjayhzdHJ1Y3QgZGVudHJ5ICpvcmlnaW4sCisJCQkJICAgICBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gaXRlbS0+Y2lfZGVudHJ5OworCisJd2hpbGUgKGRlbnRyeSAhPSBvcmlnaW4pIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCQlkZW50cnkgPSBkZW50cnktPmRfcGFyZW50OworCX0KKworCW11dGV4X3VubG9jaygmb3JpZ2luLT5kX2lub2RlLT5pX211dGV4KTsKK30KKworaW50IGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cywKKwkJCSBzdHJ1Y3QgY29uZmlnX2l0ZW0gKnRhcmdldCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjb25maWdmc19kaXJlbnQgKnAsICpyb290X3NkLCAqc3Vic3lzX3NkID0gTlVMTDsKKwlzdHJ1Y3QgY29uZmlnX2l0ZW0gKnNfaXRlbSA9ICZzdWJzeXMtPnN1X2dyb3VwLmNnX2l0ZW07CisKKwkvKgorCSAqIFBpbiB0aGUgY29uZmlnZnMgZmlsZXN5c3RlbS4gIFRoaXMgbWVhbnMgd2UgY2FuIHNhZmVseSBhY2Nlc3MKKwkgKiB0aGUgcm9vdCBvZiB0aGUgY29uZmlnZnMgZmlsZXN5c3RlbS4KKwkgKi8KKwlyZXQgPSBjb25maWdmc19waW5fZnMoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBOZXh0LCBsb2NrIHRoZSByb290IGRpcmVjdG9yeS4gIFdlJ3JlIGdvaW5nIHRvIGNoZWNrIHRoYXQgdGhlCisJICogc3Vic3lzdGVtIGlzIHJlYWxseSByZWdpc3RlcmVkLCBhbmQgc28gd2UgbmVlZCB0byBsb2NrIG91dAorCSAqIGNvbmZpZ2ZzX1t1bl1yZWdpc3Rlcl9zdWJzeXN0ZW0oKS4KKwkgKi8KKwltdXRleF9sb2NrKCZjb25maWdmc19zYi0+c19yb290LT5kX2lub2RlLT5pX211dGV4KTsKKworCXJvb3Rfc2QgPSBjb25maWdmc19zYi0+c19yb290LT5kX2ZzZGF0YTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnJvb3Rfc2QtPnNfY2hpbGRyZW4sIHNfc2libGluZykgeworCQlpZiAocC0+c190eXBlICYgQ09ORklHRlNfRElSKSB7CisJCQlpZiAocC0+c19lbGVtZW50ID09IHNfaXRlbSkgeworCQkJCXN1YnN5c19zZCA9IHA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXN1YnN5c19zZCkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dF91bmxvY2tfZnM7CisJfQorCisJLyogT2ssIG5vdyB3ZSBjYW4gdHJ1c3Qgc3Vic3lzL3NfaXRlbSAqLworCisJLyogU2NhbiB0aGUgdHJlZSwgbG9ja2luZyBpX211dGV4IHJlY3Vyc2l2ZWx5LCByZXR1cm4gMCBpZiBmb3VuZCAqLworCXJldCA9IGNvbmZpZ2ZzX2RlcGVuZF9wcmVwKHN1YnN5c19zZC0+c19kZW50cnksIHRhcmdldCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5sb2NrX2ZzOworCisJLyogV2UgaG9sZCBhbGwgaV9tdXRleGVzIGZyb20gdGhlIHN1YnN5c3RlbSBkb3duIHRvIHRoZSB0YXJnZXQgKi8KKwlwID0gdGFyZ2V0LT5jaV9kZW50cnktPmRfZnNkYXRhOworCXAtPnNfZGVwZW5kZW50X2NvdW50ICs9IDE7CisKKwljb25maWdmc19kZXBlbmRfcm9sbGJhY2soc3Vic3lzX3NkLT5zX2RlbnRyeSwgdGFyZ2V0KTsKKworb3V0X3VubG9ja19mczoKKwltdXRleF91bmxvY2soJmNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJLyoKKwkgKiBJZiB3ZSBzdWNjZWVkZWQsIHRoZSBmcyBpcyBwaW5uZWQgdmlhIG90aGVyIG1ldGhvZHMuICBJZiBub3QsCisJICogd2UncmUgZG9uZSB3aXRoIGl0IGFueXdheS4gIFNvIHJlbGVhc2VfZnMoKSBpcyBhbHdheXMgcmlnaHQuCisJICovCisJY29uZmlnZnNfcmVsZWFzZV9mcygpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY29uZmlnZnNfZGVwZW5kX2l0ZW0pOworCisvKgorICogUmVsZWFzZSB0aGUgZGVwZW5kZW50IGxpbmthZ2UuICBUaGlzIGlzIG11Y2ggc2ltcGxlciB0aGFuCisgKiBjb25maWdmc19kZXBlbmRfaXRlbSgpIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoYXQgdGhlIGNsaWVudCBkcml2ZXIgaXMKKyAqIHBpbm5lZCwgdGh1cyB0aGUgc3Vic3lzdGVtIGlzIHBpbm5lZCwgYW5kIHRoZXJlZm9yZSBjb25maWdmcyBpcyBwaW5uZWQuCisgKi8KK3ZvaWQgY29uZmlnZnNfdW5kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMsCisJCQkgICAgc3RydWN0IGNvbmZpZ19pdGVtICp0YXJnZXQpCit7CisJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqc2Q7CisKKwkvKgorCSAqIFNpbmNlIHdlIGNhbiB0cnVzdCBldmVyeXRoaW5nIGlzIHBpbm5lZCwgd2UganVzdCBuZWVkIGlfbXV0ZXgKKwkgKiBvbiB0aGUgaXRlbS4KKwkgKi8KKwltdXRleF9sb2NrKCZ0YXJnZXQtPmNpX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisKKwlzZCA9IHRhcmdldC0+Y2lfZGVudHJ5LT5kX2ZzZGF0YTsKKwlCVUdfT04oc2QtPnNfZGVwZW5kZW50X2NvdW50IDwgMSk7CisKKwlzZC0+c19kZXBlbmRlbnRfY291bnQgLT0gMTsKKworCS8qCisJICogQWZ0ZXIgdGhpcyB1bmxvY2ssIHdlIGNhbm5vdCB0cnVzdCB0aGUgaXRlbSB0byBzdGF5IGFsaXZlIQorCSAqIERPIE5PVCBSRUZFUkVOQ0UgaXRlbSBhZnRlciB0aGlzIHVubG9jay4KKwkgKi8KKwltdXRleF91bmxvY2soJnRhcmdldC0+Y2lfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woY29uZmlnZnNfdW5kZXBlbmRfaXRlbSk7CiAKIHN0YXRpYyBpbnQgY29uZmlnZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCiB7CkBAIC03ODMsNyArMTA0Miw3IEBACiAKIAlzbnByaW50ZihuYW1lLCBkZW50cnktPmRfbmFtZS5sZW4gKyAxLCAiJXMiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAotCWRvd24oJnN1YnN5cy0+c3Vfc2VtKTsKKwltdXRleF9sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKIAlncm91cCA9IE5VTEw7CiAJaXRlbSA9IE5VTEw7CiAJaWYgKHR5cGUtPmN0X2dyb3VwX29wcy0+bWFrZV9ncm91cCkgewpAQCAtNzk3LDcgKzEwNTYsNyBAQAogCQlpZiAoaXRlbSkKIAkJCWxpbmtfb2JqKHBhcmVudF9pdGVtLCBpdGVtKTsKIAl9Ci0JdXAoJnN1YnN5cy0+c3Vfc2VtKTsKKwltdXRleF91bmxvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOwogCiAJa2ZyZWUobmFtZSk7CiAJaWYgKCFpdGVtKSB7CkBAIC04NDEsMTMgKzExMDAsMTYgQEAKIG91dF91bmxpbms6CiAJaWYgKHJldCkgewogCQkvKiBUZWFyIGRvd24gZXZlcnl0aGluZyB3ZSBidWlsdCB1cCAqLwotCQlkb3duKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2xvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOworCisJCWNsaWVudF9kaXNjb25uZWN0X25vdGlmeShwYXJlbnRfaXRlbSwgaXRlbSk7CiAJCWlmIChncm91cCkKIAkJCXVubGlua19ncm91cChncm91cCk7CiAJCWVsc2UKIAkJCXVubGlua19vYmooaXRlbSk7CiAJCWNsaWVudF9kcm9wX2l0ZW0ocGFyZW50X2l0ZW0sIGl0ZW0pOwotCQl1cCgmc3Vic3lzLT5zdV9zZW0pOworCisJCW11dGV4X3VubG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CiAKIAkJaWYgKG1vZHVsZV9nb3QpCiAJCQltb2R1bGVfcHV0KG93bmVyKTsKQEAgLTg4MSw2ICsxMTQzLDEzIEBACiAJaWYgKHNkLT5zX3R5cGUgJiBDT05GSUdGU19VU0VUX0RFRkFVTFQpCiAJCXJldHVybiAtRVBFUk07CiAKKwkvKgorCSAqIEhlcmUncyB3aGVyZSB3ZSBjaGVjayBmb3IgZGVwZW5kZW50cy4gIFdlJ3JlIHByb3RlY3RlZCBieQorCSAqIGlfbXV0ZXguCisJICovCisJaWYgKHNkLT5zX2RlcGVuZGVudF9jb3VudCkKKwkJcmV0dXJuIC1FQlVTWTsKKwogCS8qIEdldCBhIHdvcmtpbmcgcmVmIHVudGlsIHdlIGhhdmUgdGhlIGNoaWxkICovCiAJcGFyZW50X2l0ZW0gPSBjb25maWdmc19nZXRfY29uZmlnX2l0ZW0oZGVudHJ5LT5kX3BhcmVudCk7CiAJc3Vic3lzID0gdG9fY29uZmlnX2dyb3VwKHBhcmVudF9pdGVtKS0+Y2dfc3Vic3lzOwpAQCAtOTEwLDE3ICsxMTc5LDE5IEBACiAJaWYgKHNkLT5zX3R5cGUgJiBDT05GSUdGU19VU0VUX0RJUikgewogCQljb25maWdmc19kZXRhY2hfZ3JvdXAoaXRlbSk7CiAKLQkJZG93bigmc3Vic3lzLT5zdV9zZW0pOworCQltdXRleF9sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKKwkJY2xpZW50X2Rpc2Nvbm5lY3Rfbm90aWZ5KHBhcmVudF9pdGVtLCBpdGVtKTsKIAkJdW5saW5rX2dyb3VwKHRvX2NvbmZpZ19ncm91cChpdGVtKSk7CiAJfSBlbHNlIHsKIAkJY29uZmlnZnNfZGV0YWNoX2l0ZW0oaXRlbSk7CiAKLQkJZG93bigmc3Vic3lzLT5zdV9zZW0pOworCQltdXRleF9sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKKwkJY2xpZW50X2Rpc2Nvbm5lY3Rfbm90aWZ5KHBhcmVudF9pdGVtLCBpdGVtKTsKIAkJdW5saW5rX29iaihpdGVtKTsKIAl9CiAKIAljbGllbnRfZHJvcF9pdGVtKHBhcmVudF9pdGVtLCBpdGVtKTsKLQl1cCgmc3Vic3lzLT5zdV9zZW0pOworCW11dGV4X3VubG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CiAKIAkvKiBEcm9wIG91ciByZWZlcmVuY2UgZnJvbSBhYm92ZSAqLwogCWNvbmZpZ19pdGVtX3B1dChpdGVtKTsKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYyBiL2ZzL2NvbmZpZ2ZzL2ZpbGUuYwppbmRleCAzNTI3YzdjLi5hMzY1OGY5IDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9maWxlLmMKKysrIGIvZnMvY29uZmlnZnMvZmlsZS5jCkBAIC0yNywxOSArMjcsMjYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnZnMuaD4KICNpbmNsdWRlICJjb25maWdmc19pbnRlcm5hbC5oIgogCisvKgorICogQSBzaW1wbGUgYXR0cmlidXRlIGNhbiBvbmx5IGJlIDQwOTYgY2hhcmFjdGVycy4gIFdoeSA0az8gIEJlY2F1c2UgdGhlCisgKiBvcmlnaW5hbCBjb2RlIGxpbWl0ZWQgaXQgdG8gUEFHRV9TSVpFLiAgVGhhdCdzIGEgYmFkIGlkZWEsIHRob3VnaCwKKyAqIGJlY2F1c2UgYW4gYXR0cmlidXRlIG9mIDE2ayBvbiBpYTY0IHdvbid0IHdvcmsgb24geDg2LiAgU28gd2UgbGltaXQgdG8KKyAqIDRrLCBvdXIgbWluaW11bSBjb21tb24gcGFnZSBzaXplLgorICovCisjZGVmaW5lIFNJTVBMRV9BVFRSX1NJWkUgNDA5NgogCiBzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyIHsKIAlzaXplX3QJCQljb3VudDsKIAlsb2ZmX3QJCQlwb3M7CiAJY2hhcgkJCSogcGFnZTsKIAlzdHJ1Y3QgY29uZmlnZnNfaXRlbV9vcGVyYXRpb25zCSogb3BzOwotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJaW50CQkJbmVlZHNfcmVhZF9maWxsOwogfTsKIApAQCAtNjksNyArNzYsNyBAQAogCiAJY291bnQgPSBvcHMtPnNob3dfYXR0cmlidXRlKGl0ZW0sYXR0cixidWZmZXItPnBhZ2UpOwogCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMDsKLQlCVUdfT04oY291bnQgPiAoc3NpemVfdClQQUdFX1NJWkUpOworCUJVR19PTihjb3VudCA+IChzc2l6ZV90KVNJTVBMRV9BVFRSX1NJWkUpOwogCWlmIChjb3VudCA+PSAwKQogCQlidWZmZXItPmNvdW50ID0gY291bnQ7CiAJZWxzZQpAQCAtMTAyLDcgKzEwOSw3IEBACiAJc3RydWN0IGNvbmZpZ2ZzX2J1ZmZlciAqIGJ1ZmZlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzc2l6ZV90IHJldHZhbCA9IDA7CiAKLQlkb3duKCZidWZmZXItPnNlbSk7CisJbXV0ZXhfbG9jaygmYnVmZmVyLT5tdXRleCk7CiAJaWYgKGJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsKSB7CiAJCWlmICgocmV0dmFsID0gZmlsbF9yZWFkX2J1ZmZlcihmaWxlLT5mX3BhdGguZGVudHJ5LGJ1ZmZlcikpKQogCQkJZ290byBvdXQ7CkBAIC0xMTIsNyArMTE5LDcgQEAKIAlyZXR2YWwgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBidWZmZXItPnBhZ2UsCiAJCQkJCSBidWZmZXItPmNvdW50KTsKIG91dDoKLQl1cCgmYnVmZmVyLT5zZW0pOworCW11dGV4X3VubG9jaygmYnVmZmVyLT5tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTM3LDggKzE0NCw4IEBACiAJaWYgKCFidWZmZXItPnBhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKGNvdW50ID49IFBBR0VfU0laRSkKLQkJY291bnQgPSBQQUdFX1NJWkUgLSAxOworCWlmIChjb3VudCA+PSBTSU1QTEVfQVRUUl9TSVpFKQorCQljb3VudCA9IFNJTVBMRV9BVFRSX1NJWkUgLSAxOwogCWVycm9yID0gY29weV9mcm9tX3VzZXIoYnVmZmVyLT5wYWdlLGJ1Zixjb3VudCk7CiAJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAxOwogCS8qIGlmIGJ1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gYSBzdHJpbmcsIHRlcm1pbmF0ZSBpdCBieSBcMCwKQEAgLTE5MywxMyArMjAwLDEzIEBACiAJc3RydWN0IGNvbmZpZ2ZzX2J1ZmZlciAqIGJ1ZmZlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzc2l6ZV90IGxlbjsKIAotCWRvd24oJmJ1ZmZlci0+c2VtKTsKKwltdXRleF9sb2NrKCZidWZmZXItPm11dGV4KTsKIAlsZW4gPSBmaWxsX3dyaXRlX2J1ZmZlcihidWZmZXIsIGJ1ZiwgY291bnQpOwogCWlmIChsZW4gPiAwKQogCQlsZW4gPSBmbHVzaF93cml0ZV9idWZmZXIoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgYnVmZmVyLCBjb3VudCk7CiAJaWYgKGxlbiA+IDApCiAJCSpwcG9zICs9IGxlbjsKLQl1cCgmYnVmZmVyLT5zZW0pOworCW11dGV4X3VubG9jaygmYnVmZmVyLT5tdXRleCk7CiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtMjUzLDcgKzI2MCw3IEBACiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBFbm9tZW07CiAJfQotCWluaXRfTVVURVgoJmJ1ZmZlci0+c2VtKTsKKwltdXRleF9pbml0KCZidWZmZXItPm11dGV4KTsKIAlidWZmZXItPm5lZWRzX3JlYWRfZmlsbCA9IDE7CiAJYnVmZmVyLT5vcHMgPSBvcHM7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnVmZmVyOwpAQCAtMjkyLDYgKzI5OSw3IEBACiAJaWYgKGJ1ZmZlcikgewogCQlpZiAoYnVmZmVyLT5wYWdlKQogCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1ZmZlci0+cGFnZSk7CisJCW11dGV4X2Rlc3Ryb3koJmJ1ZmZlci0+bXV0ZXgpOwogCQlrZnJlZShidWZmZXIpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2l0ZW0uYyBiL2ZzL2NvbmZpZ2ZzL2l0ZW0uYwppbmRleCAyNDQyMTIwLi43NmRjNGMzIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9pdGVtLmMKKysrIGIvZnMvY29uZmlnZnMvaXRlbS5jCkBAIC02Miw3ICs2Miw2IEBACiAgKglkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5nIHRoYXQgQGl0ZW0tPmNpX25hbWUgcG9pbnRzIHRvLgogICoJT3RoZXJ3aXNlLCB1c2UgdGhlIHN0YXRpYyBAaXRlbS0+Y2lfbmFtZWJ1ZiBhcnJheS4KICAqLwotCiBpbnQgY29uZmlnX2l0ZW1fc2V0X25hbWUoc3RydWN0IGNvbmZpZ19pdGVtICogaXRlbSwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQogewogCWludCBlcnJvciA9IDA7CkBAIC0xMzksMTIgKzEzOCw3IEBACiAJcmV0dXJuIGl0ZW07CiB9CiAKLS8qKgotICoJY29uZmlnX2l0ZW1fY2xlYW51cCAtIGZyZWUgY29uZmlnX2l0ZW0gcmVzb3VyY2VzLgotICoJQGl0ZW06CWl0ZW0uCi0gKi8KLQotdm9pZCBjb25maWdfaXRlbV9jbGVhbnVwKHN0cnVjdCBjb25maWdfaXRlbSAqIGl0ZW0pCitzdGF0aWMgdm9pZCBjb25maWdfaXRlbV9jbGVhbnVwKHN0cnVjdCBjb25maWdfaXRlbSAqIGl0ZW0pCiB7CiAJc3RydWN0IGNvbmZpZ19pdGVtX3R5cGUgKiB0ID0gaXRlbS0+Y2lfdHlwZTsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwICogcyA9IGl0ZW0tPmNpX2dyb3VwOwpAQCAtMTc5LDM5ICsxNzMsMzUgQEAKIAkJa3JlZl9wdXQoJml0ZW0tPmNpX2tyZWYsIGNvbmZpZ19pdGVtX3JlbGVhc2UpOwogfQogCi0KIC8qKgogICoJY29uZmlnX2dyb3VwX2luaXQgLSBpbml0aWFsaXplIGEgZ3JvdXAgZm9yIHVzZQogICoJQGs6CWdyb3VwCiAgKi8KLQogdm9pZCBjb25maWdfZ3JvdXBfaW5pdChzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCkKIHsKIAljb25maWdfaXRlbV9pbml0KCZncm91cC0+Y2dfaXRlbSk7CiAJSU5JVF9MSVNUX0hFQUQoJmdyb3VwLT5jZ19jaGlsZHJlbik7CiB9CiAKLQogLyoqCi0gKgljb25maWdfZ3JvdXBfZmluZF9vYmogLSBzZWFyY2ggZm9yIGl0ZW0gaW4gZ3JvdXAuCisgKgljb25maWdfZ3JvdXBfZmluZF9pdGVtIC0gc2VhcmNoIGZvciBpdGVtIGluIGdyb3VwLgogICoJQGdyb3VwOglncm91cCB3ZSdyZSBsb29raW5nIGluLgogICoJQG5hbWU6CWl0ZW0ncyBuYW1lLgogICoKLSAqCUxvY2sgZ3JvdXAgdmlhIEBncm91cC0+Y2dfc3Vic3lzLCBhbmQgaXRlcmF0ZSBvdmVyIEBncm91cC0+Y2dfbGlzdCwKLSAqCWxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgY29uZmlnX2l0ZW0uIElmIG1hdGNoaW5nIGl0ZW0gaXMgZm91bmQKLSAqCXRha2UgYSByZWZlcmVuY2UgYW5kIHJldHVybiB0aGUgaXRlbS4KKyAqCUl0ZXJhdGUgb3ZlciBAZ3JvdXAtPmNnX2xpc3QsIGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgY29uZmlnX2l0ZW0uCisgKglJZiBtYXRjaGluZyBpdGVtIGlzIGZvdW5kIHRha2UgYSByZWZlcmVuY2UgYW5kIHJldHVybiB0aGUgaXRlbS4KKyAqCUNhbGxlciBtdXN0IGhhdmUgbG9ja2VkIGdyb3VwIHZpYSBAZ3JvdXAtPmNnX3N1YnN5cy0+c3VfbXR4LgogICovCi0KLXN0cnVjdCBjb25maWdfaXRlbSAqIGNvbmZpZ19ncm91cF9maW5kX29iaihzdHJ1Y3QgY29uZmlnX2dyb3VwICogZ3JvdXAsIGNvbnN0IGNoYXIgKiBuYW1lKQorc3RydWN0IGNvbmZpZ19pdGVtICpjb25maWdfZ3JvdXBfZmluZF9pdGVtKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLAorCQkJCQkgICBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKiBlbnRyeTsKIAlzdHJ1Y3QgY29uZmlnX2l0ZW0gKiByZXQgPSBOVUxMOwogCi0gICAgICAgIC8qIFhYWCBMT0NLSU5HISAqLwogCWxpc3RfZm9yX2VhY2goZW50cnksJmdyb3VwLT5jZ19jaGlsZHJlbikgewogCQlzdHJ1Y3QgY29uZmlnX2l0ZW0gKiBpdGVtID0gdG9faXRlbShlbnRyeSk7CiAJCWlmIChjb25maWdfaXRlbV9uYW1lKGl0ZW0pICYmCi0gICAgICAgICAgICAgICAgICAgICFzdHJjbXAoY29uZmlnX2l0ZW1fbmFtZShpdGVtKSwgbmFtZSkpIHsKKwkJICAgICFzdHJjbXAoY29uZmlnX2l0ZW1fbmFtZShpdGVtKSwgbmFtZSkpIHsKIAkJCXJldCA9IGNvbmZpZ19pdGVtX2dldChpdGVtKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMTksOSArMjA5LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KIEVYUE9SVF9TWU1CT0woY29uZmlnX2l0ZW1faW5pdCk7CiBFWFBPUlRfU1lNQk9MKGNvbmZpZ19ncm91cF9pbml0KTsKIEVYUE9SVF9TWU1CT0woY29uZmlnX2l0ZW1fZ2V0KTsKIEVYUE9SVF9TWU1CT0woY29uZmlnX2l0ZW1fcHV0KTsKLUVYUE9SVF9TWU1CT0woY29uZmlnX2dyb3VwX2ZpbmRfb2JqKTsKK0VYUE9SVF9TWU1CT0woY29uZmlnX2dyb3VwX2ZpbmRfaXRlbSk7CmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IDBlNzNhYTAuLmNiOWQwNTAgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC04ODMsNiArODgzLDExIEBACiAJcmV0dXJuIChkZW50cnlfc3RhdC5ucl91bnVzZWQgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKIH0KIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciBkY2FjaGVfc2hyaW5rZXIgPSB7CisJLnNocmluayA9IHNocmlua19kY2FjaGVfbWVtb3J5LAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OworCiAvKioKICAqIGRfYWxsb2MJLQlhbGxvY2F0ZSBhIGRjYWNoZSBlbnRyeQogICogQHBhcmVudDogcGFyZW50IG9mIGVudHJ5IHRvIGFsbG9jYXRlCkBAIC0yMTE1LDcgKzIxMjAsNyBAQAogCWRlbnRyeV9jYWNoZSA9IEtNRU1fQ0FDSEUoZGVudHJ5LAogCQlTTEFCX1JFQ0xBSU1fQUNDT1VOVHxTTEFCX1BBTklDfFNMQUJfTUVNX1NQUkVBRCk7CiAJCi0Jc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHNocmlua19kY2FjaGVfbWVtb3J5KTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmZGNhY2hlX3Nocmlua2VyKTsKIAogCS8qIEhhc2ggbWF5IGhhdmUgYmVlbiBzZXQgdXAgaW4gZGNhY2hlX2luaXRfZWFybHkgKi8KIAlpZiAoIWhhc2hkaXN0KQpkaWZmIC0tZ2l0IGEvZnMvZGxtL2NvbmZpZy5jIGIvZnMvZGxtL2NvbmZpZy5jCmluZGV4IDUwNjliMmMuLjJmOGUzYzggMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9jb25maWcuYworKysgYi9mcy9kbG0vY29uZmlnLmMKQEAgLTEzMywxNCArMTMzLDYgQEAKIAlyZXR1cm4gbGVuOwogfQogCi0jZGVmaW5lIF9fQ09ORklHRlNfQVRUUihfbmFtZSxfbW9kZSxfcmVhZCxfd3JpdGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JLmF0dHIgICA9IHsgLmNhX25hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIC5jYV9tb2RlID0gX21vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICAuY2Ffb3duZXIgPSBUSElTX01PRFVMRSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCS5zaG93ICAgPSBfcmVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JLnN0b3JlICA9IF93cml0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQogI2RlZmluZSBDTFVTVEVSX0FUVFIobmFtZSwgY2hlY2tfemVybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIHNzaXplX3QgbmFtZSMjX3dyaXRlKHN0cnVjdCBjbHVzdGVyICpjbCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKSAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjE1LDcgKzYwNyw3IEBACiBpbnQgZGxtX2NvbmZpZ19pbml0KHZvaWQpCiB7CiAJY29uZmlnX2dyb3VwX2luaXQoJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X2dyb3VwKTsKLQlpbml0X01VVEVYKCZjbHVzdGVyc19yb290LnN1YnN5cy5zdV9zZW0pOworCW11dGV4X2luaXQoJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X211dGV4KTsKIAlyZXR1cm4gY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCZjbHVzdGVyc19yb290LnN1YnN5cyk7CiB9CiAKQEAgLTc1OSw5ICs3NTEsOSBAQAogCWlmICghc3BhY2VfbGlzdCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlkb3duKCZzcGFjZV9saXN0LT5jZ19zdWJzeXMtPnN1X3NlbSk7Ci0JaSA9IGNvbmZpZ19ncm91cF9maW5kX29iaihzcGFjZV9saXN0LCBuYW1lKTsKLQl1cCgmc3BhY2VfbGlzdC0+Y2dfc3Vic3lzLT5zdV9zZW0pOworCW11dGV4X2xvY2soJnNwYWNlX2xpc3QtPmNnX3N1YnN5cy0+c3VfbXV0ZXgpOworCWkgPSBjb25maWdfZ3JvdXBfZmluZF9pdGVtKHNwYWNlX2xpc3QsIG5hbWUpOworCW11dGV4X3VubG9jaygmc3BhY2VfbGlzdC0+Y2dfc3Vic3lzLT5zdV9tdXRleCk7CiAKIAlyZXR1cm4gdG9fc3BhY2UoaSk7CiB9CkBAIC03ODAsNyArNzcyLDcgQEAKIAlpZiAoIWNvbW1fbGlzdCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlkb3duKCZjbHVzdGVyc19yb290LnN1YnN5cy5zdV9zZW0pOworCW11dGV4X2xvY2soJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmNvbW1fbGlzdC0+Y2dfY2hpbGRyZW4sIGNpX2VudHJ5KSB7CiAJCWNtID0gdG9fY29tbShpKTsKQEAgLTgwMCw3ICs3OTIsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JdXAoJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbHVzdGVyc19yb290LnN1YnN5cy5zdV9tdXRleCk7CiAKIAlpZiAoIWZvdW5kKQogCQljbSA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9kcXVvdC5jIGIvZnMvZHF1b3QuYwppbmRleCA4ODE5ZDI4Li43ZTI3MzE1IDEwMDY0NAotLS0gYS9mcy9kcXVvdC5jCisrKyBiL2ZzL2RxdW90LmMKQEAgLTUzOCw2ICs1MzgsMTEgQEAKIAlyZXR1cm4gKGRxc3RhdHMuZnJlZV9kcXVvdHMgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKIH0KIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciBkcWNhY2hlX3Nocmlua2VyID0geworCS5zaHJpbmsgPSBzaHJpbmtfZHFjYWNoZV9tZW1vcnksCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKIC8qCiAgKiBQdXQgcmVmZXJlbmNlIHRvIGRxdW90CiAgKiBOT1RFOiBJZiB5b3UgY2hhbmdlIHRoaXMgZnVuY3Rpb24gcGxlYXNlIGNoZWNrIHdoZXRoZXIgZHFwdXRfYmxvY2tzKCkgd29ya3MgcmlnaHQuLi4KQEAgLTE4NzAsNyArMTg3NSw3IEBACiAJcHJpbnRrKCJEcXVvdC1jYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6ICVsZCAob3JkZXIgJWxkLCAlbGQgYnl0ZXMpXG4iLAogCQkJbnJfaGFzaCwgb3JkZXIsIChQQUdFX1NJWkUgPDwgb3JkZXIpKTsKIAotCXNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBzaHJpbmtfZHFjYWNoZV9tZW1vcnkpOworCXJlZ2lzdGVyX3Nocmlua2VyKCZkcWNhY2hlX3Nocmlua2VyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmMKaW5kZXggMDNlYTc2OS4uNTkzNzVlZiAxMDA2NDQKLS0tIGEvZnMvZHJvcF9jYWNoZXMuYworKysgYi9mcy9kcm9wX2NhY2hlcy5jCkBAIC0yMCw3ICsyMCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJnNiLT5zX2lub2RlcywgaV9zYl9saXN0KSB7CiAJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIChJX0ZSRUVJTkd8SV9XSUxMX0ZSRUUpKQogCQkJY29udGludWU7Ci0JCWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwLCAtMSk7CisJCV9faW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDAsIC0xLCB0cnVlKTsKIAl9CiAJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvaW5vZGUuYyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKaW5kZXggODNlOTRmZS4uZTc3YTJlYyAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvaW5vZGUuYworKysgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7CiAJc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQ7CiAJY2hhciAqZW5jb2RlZF9uYW1lOwotCXVuc2lnbmVkIGludCBlbmNvZGVkX25hbWVsZW47CisJaW50IGVuY29kZWRfbmFtZWxlbjsKIAlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCA9IE5VTEw7CiAJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQ7CiAJY2hhciAqcGFnZV92aXJ0ID0gTlVMTDsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2Rpcl9kZW50cnk7CiAJdW1vZGVfdCBtb2RlOwogCWNoYXIgKmVuY29kZWRfc3ltbmFtZTsKLQl1bnNpZ25lZCBpbnQgZW5jb2RlZF9zeW1sZW47CisJaW50IGVuY29kZWRfc3ltbGVuOwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKIAogCWxvd2VyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnkpOwpkaWZmIC0tZ2l0IGEvZnMvZWZzL25hbWVpLmMgYi9mcy9lZnMvbmFtZWkuYwppbmRleCBlZDRhMjA3Li41Mjc2YjE5IDEwMDY0NAotLS0gYS9mcy9lZnMvbmFtZWkuYworKysgYi9mcy9lZnMvbmFtZWkuYwpAQCAtNzUsNiArNzUsMzggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RydWN0IGRlbnRyeSAqZWZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdm9ianApCit7CisJX191MzIgKm9ianAgPSB2b2JqcDsKKwl1bnNpZ25lZCBsb25nIGlubyA9IG9ianBbMF07CisJX191MzIgZ2VuZXJhdGlvbiA9IG9ianBbMV07CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7CisKKwlpZiAoaW5vID09IDApCisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCWlub2RlID0gaWdldChzYiwgaW5vKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSB8fAorCSAgICAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pKSB7CisJICAgIAlyZXN1bHQgPSBFUlJfUFRSKC1FU1RBTEUpOworCQlnb3RvIG91dF9pcHV0OworCX0KKworCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJcmVzdWx0ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXRfaXB1dDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKKworIG91dF9pcHV0OgorCWlwdXQoaW5vZGUpOworCXJldHVybiByZXN1bHQ7Cit9CisKIHN0cnVjdCBkZW50cnkgKmVmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQogewogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKZGlmZiAtLWdpdCBhL2ZzL2Vmcy9zdXBlci5jIGIvZnMvZWZzL3N1cGVyLmMKaW5kZXggZTBhNjgzOS4uZDM2MGM4MSAxMDA2NDQKLS0tIGEvZnMvZWZzL3N1cGVyLmMKKysrIGIvZnMvZWZzL3N1cGVyLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lZnNfdmguaD4KICNpbmNsdWRlIDxsaW51eC9lZnNfZnNfc2IuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgpAQCAtMTEzLDYgKzExNCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGVmc19leHBvcnRfb3BzID0geworCS5nZXRfZGVudHJ5CT0gZWZzX2dldF9kZW50cnksCiAJLmdldF9wYXJlbnQJPSBlZnNfZ2V0X3BhcmVudCwKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2V4cG9ydGZzL2V4cGZzLmMgYi9mcy9leHBvcnRmcy9leHBmcy5jCmluZGV4IGU5OGY2Y2QuLjhhZGIzMmEgMTAwNjQ0Ci0tLSBhL2ZzL2V4cG9ydGZzL2V4cGZzLmMKKysrIGIvZnMvZXhwb3J0ZnMvZXhwZnMuYwpAQCAtMSwxNSArMSw0NSBAQAogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAKLXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHBvcnRfb3BfZGVmYXVsdDsKLQotI2RlZmluZQlDQUxMKG9wcyxmdW4pICgob3BzLT5mdW4pPyhvcHMtPmZ1bik6ZXhwb3J0X29wX2RlZmF1bHQuZnVuKQotCiAjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKSBkb3t9d2hpbGUoMCkKIAorCitzdGF0aWMgaW50IGdldF9uYW1lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqbmFtZSwKKwkJc3RydWN0IGRlbnRyeSAqY2hpbGQpOworCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHBvcnRmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQgPSBFUlJfUFRSKC1FU1RBTEUpOworCisJaWYgKHNiLT5zX2V4cG9ydF9vcC0+Z2V0X2RlbnRyeSkgeworCQlyZXN1bHQgPSBzYi0+c19leHBvcnRfb3AtPmdldF9kZW50cnkoc2IsIG9iaik7CisJCWlmICghcmVzdWx0KQorCQkJcmVzdWx0ID0gRVJSX1BUUigtRVNUQUxFKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGV4cG9ydGZzX2dldF9uYW1lKHN0cnVjdCBkZW50cnkgKmRpciwgY2hhciAqbmFtZSwKKwkJc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBkaXItPmRfc2ItPnNfZXhwb3J0X29wOworCisJaWYgKG5vcC0+Z2V0X25hbWUpCisJCXJldHVybiBub3AtPmdldF9uYW1lKGRpciwgbmFtZSwgY2hpbGQpOworCWVsc2UKKwkJcmV0dXJuIGdldF9uYW1lKGRpciwgbmFtZSwgY2hpbGQpOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlIGRlbnRyeSBvciBhbnkgb2YgaXQncyBhbGlhc2VzIGlzIGFjY2VwdGFibGUuCisgKi8KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKIGZpbmRfYWNjZXB0YWJsZV9hbGlhcyhzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQsCiAJCWludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSksCkBAIC0xNyw2ICs0Nyw5IEBACiB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqdG9wdXQgPSBOVUxMOwogCisJaWYgKGFjY2VwdGFibGUoY29udGV4dCwgcmVzdWx0KSkKKwkJcmV0dXJuIHJlc3VsdDsKKwogCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVudHJ5LCAmcmVzdWx0LT5kX2lub2RlLT5pX2RlbnRyeSwgZF9hbGlhcykgewogCQlkZ2V0X2xvY2tlZChkZW50cnkpOwpAQCAtMzcsNiArNzAsMTUwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKy8qCisgKiBGaW5kIHJvb3Qgb2YgYSBkaXNjb25uZWN0ZWQgc3VidHJlZSBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGl0LgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCitmaW5kX2Rpc2Nvbm5lY3RlZF9yb290KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlkZ2V0KGRlbnRyeSk7CisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJd2hpbGUgKCFJU19ST09UKGRlbnRyeSkgJiYKKwkgICAgICAgKGRlbnRyeS0+ZF9wYXJlbnQtPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCQlkZ2V0KHBhcmVudCk7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWRwdXQoZGVudHJ5KTsKKwkJZGVudHJ5ID0gcGFyZW50OworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlyZXR1cm4gZGVudHJ5OworfQorCisKKy8qCisgKiBNYWtlIHN1cmUgdGFyZ2V0X2RpciBpcyBmdWxseSBjb25uZWN0ZWQgdG8gdGhlIGRlbnRyeSB0cmVlLgorICoKKyAqIEl0IG1heSBhbHJlYWR5IGJlLCBhcyB0aGUgZmxhZyBpc24ndCBhbHdheXMgdXBkYXRlZCB3aGVuIGNvbm5lY3Rpb24gaGFwcGVucy4KKyAqLworc3RhdGljIGludAorcmVjb25uZWN0X3BhdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGRlbnRyeSAqdGFyZ2V0X2RpcikKK3sKKwljaGFyIG5idWZbTkFNRV9NQVgrMV07CisJaW50IG5vcHJvZ3Jlc3MgPSAwOworCWludCBlcnIgPSAtRVNUQUxFOworCisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgY29uZnVzZWQgZmlsZSBzeXN0ZW0gbWlnaHQgbm90IGxldCB1cyBjb21wbGV0ZQorCSAqIHRoZSBwYXRoIHRvIHRoZSByb290LiAgRm9yIGV4YW1wbGUsIGlmIGdldF9wYXJlbnQgcmV0dXJucyBhIGRpcmVjdG9yeQorCSAqIGluIHdoaWNoIHdlIGNhbm5vdCBmaW5kIGEgbmFtZSBmb3IgdGhlIGNoaWxkLiAgV2hpbGUgdGhpcyBpbXBsaWVzIGEKKwkgKiB2ZXJ5IHNpY2sgZmlsZXN5c3RlbSB3ZSBkb24ndCB3YW50IGl0IHRvIGNhdXNlIGtuZnNkIHRvIHNwaW4uICBIZW5jZQorCSAqIHRoZSBub3Byb2dyZXNzIGNvdW50ZXIuICBJZiB3ZSBnbyB0aHJvdWdoIHRoZSBsb29wIDEwIHRpbWVzICgyIGlzCisJICogcHJvYmFibHkgZW5vdWdoKSB3aXRob3V0IGdldHRpbmcgYW55d2hlcmUsIHdlIGp1c3QgZ2l2ZSB1cAorCSAqLworCXdoaWxlICh0YXJnZXRfZGlyLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCAmJiBub3Byb2dyZXNzKysgPCAxMCkgeworCQlzdHJ1Y3QgZGVudHJ5ICpwZCA9IGZpbmRfZGlzY29ubmVjdGVkX3Jvb3QodGFyZ2V0X2Rpcik7CisKKwkJaWYgKCFJU19ST09UKHBkKSkgeworCQkJLyogbXVzdCBoYXZlIGZvdW5kIGEgY29ubmVjdGVkIHBhcmVudCAtIGdyZWF0ICovCisJCQlzcGluX2xvY2soJnBkLT5kX2xvY2spOworCQkJcGQtPmRfZmxhZ3MgJj0gfkRDQUNIRV9ESVNDT05ORUNURUQ7CisJCQlzcGluX3VubG9jaygmcGQtPmRfbG9jayk7CisJCQlub3Byb2dyZXNzID0gMDsKKwkJfSBlbHNlIGlmIChwZCA9PSBzYi0+c19yb290KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImV4cG9ydDogRWVlayBmaWxlc3lzdGVtIHJvb3QgaXMgbm90IGNvbm5lY3RlZCwgaW1wb3NzaWJsZVxuIik7CisJCQlzcGluX2xvY2soJnBkLT5kX2xvY2spOworCQkJcGQtPmRfZmxhZ3MgJj0gfkRDQUNIRV9ESVNDT05ORUNURUQ7CisJCQlzcGluX3VubG9jaygmcGQtPmRfbG9jayk7CisJCQlub3Byb2dyZXNzID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGhpdCB0aGUgdG9wIG9mIGEgZGlzY29ubmVjdGVkIHBhdGgsIHRyeSB0bworCQkJICogZmluZCBwYXJlbnQgYW5kIGNvbm5lY3QuCisJCQkgKgorCQkJICogUmFjaW5nIHdpdGggc29tZSBvdGhlciBwcm9jZXNzIHJlbmFtaW5nIGEgZGlyZWN0b3J5CisJCQkgKiBpc24ndCBtdWNoIG9mIGEgcHJvYmxlbSBoZXJlLiAgSWYgc29tZW9uZSByZW5hbWVzCisJCQkgKiB0aGUgZGlyZWN0b3J5LCBpdCB3aWxsIGVuZCB1cCBwcm9wZXJseSBjb25uZWN0ZWQsCisJCQkgKiB3aGljaCBpcyB3aGF0IHdlIHdhbnQKKwkJCSAqCisJCQkgKiBHZXR0aW5nIHRoZSBwYXJlbnQgY2FuJ3QgYmUgc3VwcG9ydGVkIGdlbmVyaWNhbGx5LAorCQkJICogdGhlIGxvY2tpbmcgaXMgdG9vIGlja3kuCisJCQkgKgorCQkJICogSW5zdGVhZCB3ZSBqdXN0IHJldHVybiBFQUNDRVMuICBJZiBzZXJ2ZXIgcmVib290cworCQkJICogb3IgaW5vZGVzIGdldCBmbHVzaGVkLCB5b3UgbG9zZQorCQkJICovCisJCQlzdHJ1Y3QgZGVudHJ5ICpwcGQgPSBFUlJfUFRSKC1FQUNDRVMpOworCQkJc3RydWN0IGRlbnRyeSAqbnBkOworCisJCQltdXRleF9sb2NrKCZwZC0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCQlpZiAoc2ItPnNfZXhwb3J0X29wLT5nZXRfcGFyZW50KQorCQkJCXBwZCA9IHNiLT5zX2V4cG9ydF9vcC0+Z2V0X3BhcmVudChwZCk7CisJCQltdXRleF91bmxvY2soJnBkLT5kX2lub2RlLT5pX211dGV4KTsKKworCQkJaWYgKElTX0VSUihwcGQpKSB7CisJCQkJZXJyID0gUFRSX0VSUihwcGQpOworCQkJCWRwcmludGsoIiVzOiBnZXRfcGFyZW50IG9mICVsZCBmYWlsZWQsIGVyciAlZFxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBwZC0+ZF9pbm9kZS0+aV9pbm8sIGVycik7CisJCQkJZHB1dChwZCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRwcmludGsoIiVzOiBmaW5kIG5hbWUgb2YgJWx1IGluICVsdVxuIiwgX19GVU5DVElPTl9fLAorCQkJCXBkLT5kX2lub2RlLT5pX2lubywgcHBkLT5kX2lub2RlLT5pX2lubyk7CisJCQllcnIgPSBleHBvcnRmc19nZXRfbmFtZShwcGQsIG5idWYsIHBkKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlkcHV0KHBwZCk7CisJCQkJZHB1dChwZCk7CisJCQkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJCQkvKiBzb21lIHJhY2UgYmV0d2VlbiBnZXRfcGFyZW50IGFuZAorCQkJCQkgKiBnZXRfbmFtZT8gIGp1c3QgdHJ5IGFnYWluCisJCQkJCSAqLworCQkJCQljb250aW51ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRwcmludGsoIiVzOiBmb3VuZCBuYW1lOiAlc1xuIiwgX19GVU5DVElPTl9fLCBuYnVmKTsKKwkJCW11dGV4X2xvY2soJnBwZC0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCQlucGQgPSBsb29rdXBfb25lX2xlbihuYnVmLCBwcGQsIHN0cmxlbihuYnVmKSk7CisJCQltdXRleF91bmxvY2soJnBwZC0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCQlpZiAoSVNfRVJSKG5wZCkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKG5wZCk7CisJCQkJZHByaW50aygiJXM6IGxvb2t1cCBmYWlsZWQ6ICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZHB1dChwcGQpOworCQkJCWRwdXQocGQpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogd2UgZGlkbid0IHJlYWxseSB3YW50IG5wZCwgd2UgcmVhbGx5IHdhbnRlZAorCQkJICogYSBzaWRlLWVmZmVjdCBvZiB0aGUgbG9va3VwLgorCQkJICogaG9wZWZ1bGx5LCBucGQgPT0gcGQsIHRob3VnaCBpdCBpc24ndCByZWFsbHkKKwkJCSAqIGEgcHJvYmxlbSBpZiBpdCBpc24ndAorCQkJICovCisJCQlpZiAobnBkID09IHBkKQorCQkJCW5vcHJvZ3Jlc3MgPSAwOworCQkJZWxzZQorCQkJCXByaW50aygiJXM6IG5wZCAhPSBwZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwdXQobnBkKTsKKwkJCWRwdXQocHBkKTsKKwkJCWlmIChJU19ST09UKHBkKSkgeworCQkJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nLCB3ZSBoYXZlIHRvIGdpdmUgdXAgKi8KKwkJCQlkcHV0KHBkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlkcHV0KHBkKTsKKwl9CisKKwlpZiAodGFyZ2V0X2Rpci0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpIHsKKwkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcgLSBvaC13ZWxsICovCisJCWlmICghZXJyKQorCQkJZXJyID0gLUVTVEFMRTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBmaW5kX2V4cG9ydGVkX2RlbnRyeSAtIGhlbHBlciByb3V0aW5lIHRvIGltcGxlbWVudCBleHBvcnRfb3BlcmF0aW9ucy0+ZGVjb2RlX2ZoCiAgKiBAc2I6CQlUaGUgJnN1cGVyX2Jsb2NrIGlkZW50aWZ5aW5nIHRoZSBmaWxlc3lzdGVtCkBAIC03NCwxODQgKzI1MSw1OCBAQAogCQkgICAgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKIAkJICAgICB2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBkZW50cnkgKnJlc3VsdCA9IE5VTEw7Ci0Jc3RydWN0IGRlbnRyeSAqdGFyZ2V0X2RpcjsKLQlpbnQgZXJyOwotCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wcyA9IHNiLT5zX2V4cG9ydF9vcDsKLQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKLQlpbnQgbm9wcm9ncmVzczsKLQljaGFyIG5idWZbTkFNRV9NQVgrMV07CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0LCAqYWxpYXM7CisJaW50IGVyciA9IC1FU1RBTEU7CiAKIAkvKgogCSAqIEF0dGVtcHQgdG8gZmluZCB0aGUgaW5vZGUuCiAJICovCi0JcmVzdWx0ID0gQ0FMTChzYi0+c19leHBvcnRfb3AsZ2V0X2RlbnRyeSkoc2Isb2JqKTsKLQllcnIgPSAtRVNUQUxFOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJZ290byBlcnJfb3V0OwotCWlmIChJU19FUlIocmVzdWx0KSkgewotCQllcnIgPSBQVFJfRVJSKHJlc3VsdCk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0JaWYgKFNfSVNESVIocmVzdWx0LT5kX2lub2RlLT5pX21vZGUpICYmCi0JICAgIChyZXN1bHQtPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKSkgewotCQkvKiBpdCBpcyBhbiB1bmNvbm5lY3RlZCBkaXJlY3RvcnksIHdlIG11c3QgY29ubmVjdCBpdCAqLwotCQk7Ci0JfSBlbHNlIHsKLQkJaWYgKGFjY2VwdGFibGUoY29udGV4dCwgcmVzdWx0KSkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChTX0lTRElSKHJlc3VsdC0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCXJlc3VsdCA9IGV4cG9ydGZzX2dldF9kZW50cnkoc2IsIG9iaik7CisJaWYgKElTX0VSUihyZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCisJaWYgKFNfSVNESVIocmVzdWx0LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCWlmICghKHJlc3VsdC0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKSB7CisJCQlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQorCQkJCXJldHVybiByZXN1bHQ7CiAJCQllcnIgPSAtRUFDQ0VTOwogCQkJZ290byBlcnJfcmVzdWx0OwogCQl9CiAKKwkJZXJyID0gcmVjb25uZWN0X3BhdGgoc2IsIHJlc3VsdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9yZXN1bHQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRlbnRyeSAqdGFyZ2V0X2RpciwgKm5yZXN1bHQ7CisJCWNoYXIgbmJ1ZltOQU1FX01BWCsxXTsKKwogCQlhbGlhcyA9IGZpbmRfYWNjZXB0YWJsZV9hbGlhcyhyZXN1bHQsIGFjY2VwdGFibGUsIGNvbnRleHQpOwogCQlpZiAoYWxpYXMpCiAJCQlyZXR1cm4gYWxpYXM7Ci0JfQkJCQogCi0JLyogSXQncyBhIGRpcmVjdG9yeSwgb3Igd2UgYXJlIHJlcXVpcmVkIHRvIGNvbmZpcm0gdGhlIGZpbGUncwotCSAqIGxvY2F0aW9uIGluIHRoZSB0cmVlIGJhc2VkIG9uIHRoZSBwYXJlbnQgaW5mb3JtYXRpb24KLSAJICovCi0JZHByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IG5lZWQgdG8gbG9vayBoYXJkZXIgZm9yICVzLyVkXG4iLHNiLT5zX2lkLCooaW50KilvYmopOwotCWlmIChTX0lTRElSKHJlc3VsdC0+ZF9pbm9kZS0+aV9tb2RlKSkKLQkJdGFyZ2V0X2RpciA9IGRnZXQocmVzdWx0KTsKLQllbHNlIHsKIAkJaWYgKHBhcmVudCA9PSBOVUxMKQogCQkJZ290byBlcnJfcmVzdWx0OwogCi0JCXRhcmdldF9kaXIgPSBDQUxMKHNiLT5zX2V4cG9ydF9vcCxnZXRfZGVudHJ5KShzYixwYXJlbnQpOwotCQlpZiAoSVNfRVJSKHRhcmdldF9kaXIpKQorCQl0YXJnZXRfZGlyID0gZXhwb3J0ZnNfZ2V0X2RlbnRyeShzYixwYXJlbnQpOworCQlpZiAoSVNfRVJSKHRhcmdldF9kaXIpKSB7CiAJCQllcnIgPSBQVFJfRVJSKHRhcmdldF9kaXIpOwotCQlpZiAodGFyZ2V0X2RpciA9PSBOVUxMIHx8IElTX0VSUih0YXJnZXRfZGlyKSkKIAkJCWdvdG8gZXJyX3Jlc3VsdDsKLQl9Ci0JLyoKLQkgKiBOb3cgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0YXJnZXRfZGlyIGlzIHByb3Blcmx5IGNvbm5lY3RlZC4KLQkgKiBJdCBtYXkgYWxyZWFkeSBiZSwgYXMgdGhlIGZsYWcgaXNuJ3QgYWx3YXlzIHVwZGF0ZWQgd2hlbiBjb25uZWN0aW9uCi0JICogaGFwcGVucy4KLQkgKiBTbywgd2Ugd2FsayB1cCBwYXJlbnQgbGlua3MgdW50aWwgd2UgZmluZCBhIGNvbm5lY3RlZCBkaXJlY3RvcnksCi0JICogb3Igd2UgcnVuIG91dCBvZiBkaXJlY3Rvcmllcy4gIFRoZW4gd2UgZmluZCB0aGUgcGFyZW50LCBmaW5kCi0JICogdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGluIHRoYXQgcGFyZW50LCBhbmQgZG8gYSBsb29rdXAuCi0JICogVGhpcyBzaG91bGQgY29ubmVjdCB0aGUgY2hpbGQgaW50byB0aGUgcGFyZW50Ci0JICogV2UgdGhlbiByZXBlYXQuCi0JICovCi0KLQkvKiBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgY29uZnVzZWQgZmlsZSBzeXN0ZW0gbWlnaHQgbm90IGxldCB1cyBjb21wbGV0ZSAKLQkgKiB0aGUgcGF0aCB0byB0aGUgcm9vdC4gIEZvciBleGFtcGxlLCBpZiBnZXRfcGFyZW50IHJldHVybnMgYSBkaXJlY3RvcnkKLQkgKiBpbiB3aGljaCB3ZSBjYW5ub3QgZmluZCBhIG5hbWUgZm9yIHRoZSBjaGlsZC4gIFdoaWxlIHRoaXMgaW1wbGllcyBhCi0JICogdmVyeSBzaWNrIGZpbGVzeXN0ZW0gd2UgZG9uJ3Qgd2FudCBpdCB0byBjYXVzZSBrbmZzZCB0byBzcGluLiAgSGVuY2UKLQkgKiB0aGUgbm9wcm9ncmVzcyBjb3VudGVyLiAgSWYgd2UgZ28gdGhyb3VnaCB0aGUgbG9vcCAxMCB0aW1lcyAoMiBpcwotCSAqIHByb2JhYmx5IGVub3VnaCkgd2l0aG91dCBnZXR0aW5nIGFueXdoZXJlLCB3ZSBqdXN0IGdpdmUgdXAKLQkgKi8KLQlub3Byb2dyZXNzPSAwOwotCXdoaWxlICh0YXJnZXRfZGlyLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCAmJiBub3Byb2dyZXNzKysgPCAxMCkgewotCQlzdHJ1Y3QgZGVudHJ5ICpwZCA9IHRhcmdldF9kaXI7Ci0KLQkJZGdldChwZCk7Ci0JCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7Ci0JCXdoaWxlICghSVNfUk9PVChwZCkgJiYKLQkJCQkocGQtPmRfcGFyZW50LT5kX2ZsYWdzJkRDQUNIRV9ESVNDT05ORUNURUQpKSB7Ci0JCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBwZC0+ZF9wYXJlbnQ7Ci0KLQkJCWRnZXQocGFyZW50KTsKLQkJCXNwaW5fdW5sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJCWRwdXQocGQpOwotCQkJcGQgPSBwYXJlbnQ7Ci0JCQlzcGluX2xvY2soJnBkLT5kX2xvY2spOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZwZC0+ZF9sb2NrKTsKIAotCQlpZiAoIUlTX1JPT1QocGQpKSB7Ci0JCQkvKiBtdXN0IGhhdmUgZm91bmQgYSBjb25uZWN0ZWQgcGFyZW50IC0gZ3JlYXQgKi8KLQkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7Ci0JCQlwZC0+ZF9mbGFncyAmPSB+RENBQ0hFX0RJU0NPTk5FQ1RFRDsKLQkJCXNwaW5fdW5sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJCW5vcHJvZ3Jlc3MgPSAwOwotCQl9IGVsc2UgaWYgKHBkID09IHNiLT5zX3Jvb3QpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZXhwb3J0OiBFZWVrIGZpbGVzeXN0ZW0gcm9vdCBpcyBub3QgY29ubmVjdGVkLCBpbXBvc3NpYmxlXG4iKTsKLQkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7Ci0JCQlwZC0+ZF9mbGFncyAmPSB+RENBQ0hFX0RJU0NPTk5FQ1RFRDsKLQkJCXNwaW5fdW5sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJCW5vcHJvZ3Jlc3MgPSAwOwotCQl9IGVsc2UgewotCQkJLyogd2UgaGF2ZSBoaXQgdGhlIHRvcCBvZiBhIGRpc2Nvbm5lY3RlZCBwYXRoLiAgVHJ5Ci0JCQkgKiB0byBmaW5kIHBhcmVudCBhbmQgY29ubmVjdAotCQkJICogbm90ZTogcmFjaW5nIHdpdGggc29tZSBvdGhlciBwcm9jZXNzIHJlbmFtaW5nIGEKLQkJCSAqIGRpcmVjdG9yeSBpc24ndCBtdWNoIG9mIGEgcHJvYmxlbSBoZXJlLiAgSWYgc29tZW9uZQotCQkJICogcmVuYW1lcyB0aGUgZGlyZWN0b3J5LCBpdCB3aWxsIGVuZCB1cCBwcm9wZXJseQotCQkJICogY29ubmVjdGVkLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQKLQkJCSAqLwotCQkJc3RydWN0IGRlbnRyeSAqcHBkOwotCQkJc3RydWN0IGRlbnRyeSAqbnBkOwotCi0JCQltdXRleF9sb2NrKCZwZC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlwcGQgPSBDQUxMKG5vcHMsZ2V0X3BhcmVudCkocGQpOwotCQkJbXV0ZXhfdW5sb2NrKCZwZC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0KLQkJCWlmIChJU19FUlIocHBkKSkgewotCQkJCWVyciA9IFBUUl9FUlIocHBkKTsKLQkJCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogZ2V0X3BhcmVudCBvZiAlbGQgZmFpbGVkLCBlcnIgJWRcbiIsCi0JCQkJCXBkLT5kX2lub2RlLT5pX2lubywgZXJyKTsKLQkJCQlkcHV0KHBkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBmaW5kIG5hbWUgb2YgJWx1IGluICVsdVxuIiwgcGQtPmRfaW5vZGUtPmlfaW5vLCBwcGQtPmRfaW5vZGUtPmlfaW5vKTsKLQkJCWVyciA9IENBTEwobm9wcyxnZXRfbmFtZSkocHBkLCBuYnVmLCBwZCk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJZHB1dChwcGQpOwotCQkJCWRwdXQocGQpOwotCQkJCWlmIChlcnIgPT0gLUVOT0VOVCkKLQkJCQkJLyogc29tZSByYWNlIGJldHdlZW4gZ2V0X3BhcmVudCBhbmQKLQkJCQkJICogZ2V0X25hbWU/ICBqdXN0IHRyeSBhZ2FpbgotCQkJCQkgKi8KLQkJCQkJY29udGludWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogZm91bmQgbmFtZTogJXNcbiIsIG5idWYpOwotCQkJbXV0ZXhfbG9jaygmcHBkLT5kX2lub2RlLT5pX211dGV4KTsKLQkJCW5wZCA9IGxvb2t1cF9vbmVfbGVuKG5idWYsIHBwZCwgc3RybGVuKG5idWYpKTsKLQkJCW11dGV4X3VubG9jaygmcHBkLT5kX2lub2RlLT5pX211dGV4KTsKLQkJCWlmIChJU19FUlIobnBkKSkgewotCQkJCWVyciA9IFBUUl9FUlIobnBkKTsKLQkJCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogbG9va3VwIGZhaWxlZDogJWRcbiIsIGVycik7Ci0JCQkJZHB1dChwcGQpOwotCQkJCWRwdXQocGQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogd2UgZGlkbid0IHJlYWxseSB3YW50IG5wZCwgd2UgcmVhbGx5IHdhbnRlZAotCQkJICogYSBzaWRlLWVmZmVjdCBvZiB0aGUgbG9va3VwLgotCQkJICogaG9wZWZ1bGx5LCBucGQgPT0gcGQsIHRob3VnaCBpdCBpc24ndCByZWFsbHkKLQkJCSAqIGEgcHJvYmxlbSBpZiBpdCBpc24ndAotCQkJICovCi0JCQlpZiAobnBkID09IHBkKQotCQkJCW5vcHJvZ3Jlc3MgPSAwOwotCQkJZWxzZQotCQkJCXByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IG5wZCAhPSBwZFxuIik7Ci0JCQlkcHV0KG5wZCk7Ci0JCQlkcHV0KHBwZCk7Ci0JCQlpZiAoSVNfUk9PVChwZCkpIHsKLQkJCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZywgd2UgaGF2ZSB0byBnaXZlIHVwICovCi0JCQkJZHB1dChwZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCWVyciA9IHJlY29ubmVjdF9wYXRoKHNiLCB0YXJnZXRfZGlyKTsKKwkJaWYgKGVycikgeworCQkJZHB1dCh0YXJnZXRfZGlyKTsKKwkJCWdvdG8gZXJyX3Jlc3VsdDsKIAkJfQotCQlkcHV0KHBkKTsKLQl9CiAKLQlpZiAodGFyZ2V0X2Rpci0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpIHsKLQkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcgLSBvaC13ZWxsICovCi0JCWlmICghZXJyKQotCQkJZXJyID0gLUVTVEFMRTsKLQkJZ290byBlcnJfdGFyZ2V0OwotCX0KLQkvKiBpZiB3ZSB3ZXJlbid0IGFmdGVyIGEgZGlyZWN0b3J5LCBoYXZlIG9uZSBtb3JlIHN0ZXAgdG8gZ28gKi8KLQlpZiAocmVzdWx0ICE9IHRhcmdldF9kaXIpIHsKLQkJc3RydWN0IGRlbnRyeSAqbnJlc3VsdDsKLQkJZXJyID0gQ0FMTChub3BzLGdldF9uYW1lKSh0YXJnZXRfZGlyLCBuYnVmLCByZXN1bHQpOworCQkvKgorCQkgKiBBcyB3ZSB3ZXJlbid0IGFmdGVyIGEgZGlyZWN0b3J5LCBoYXZlIG9uZSBtb3JlIHN0ZXAgdG8gZ28uCisJCSAqLworCQllcnIgPSBleHBvcnRmc19nZXRfbmFtZSh0YXJnZXRfZGlyLCBuYnVmLCByZXN1bHQpOwogCQlpZiAoIWVycikgewogCQkJbXV0ZXhfbG9jaygmdGFyZ2V0X2Rpci0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlucmVzdWx0ID0gbG9va3VwX29uZV9sZW4obmJ1ZiwgdGFyZ2V0X2Rpciwgc3RybGVuKG5idWYpKTsKKwkJCW5yZXN1bHQgPSBsb29rdXBfb25lX2xlbihuYnVmLCB0YXJnZXRfZGlyLAorCQkJCQkJIHN0cmxlbihuYnVmKSk7CiAJCQltdXRleF91bmxvY2soJnRhcmdldF9kaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQkJaWYgKCFJU19FUlIobnJlc3VsdCkpIHsKIAkJCQlpZiAobnJlc3VsdC0+ZF9pbm9kZSkgewpAQCAtMjYxLDExICszMTIsOCBAQAogCQkJCQlkcHV0KG5yZXN1bHQpOwogCQkJfQogCQl9CisJCWRwdXQodGFyZ2V0X2Rpcik7CiAJfQotCWRwdXQodGFyZ2V0X2Rpcik7Ci0JLyogbm93IHJlc3VsdCBpcyBwcm9wZXJseSBjb25uZWN0ZWQsIGl0IGlzIG91ciBiZXN0IGJldCAqLwotCWlmIChhY2NlcHRhYmxlKGNvbnRleHQsIHJlc3VsdCkpCi0JCXJldHVybiByZXN1bHQ7CiAKIAlhbGlhcyA9IGZpbmRfYWNjZXB0YWJsZV9hbGlhcyhyZXN1bHQsIGFjY2VwdGFibGUsIGNvbnRleHQpOwogCWlmIChhbGlhcykKQEAgLTI3NSwzMiArMzIzLDE2IEBACiAJZHB1dChyZXN1bHQpOwogCS8qIEl0IG1pZ2h0IGJlIGp1c3RpZmlhYmxlIHRvIHJldHVybiBFU1RBTEUgaGVyZSwKIAkgKiBidXQgdGhlIGZpbGVoYW5kbGUgYXQtbGVhc3QgbG9va3MgcmVhc29uYWJsZSBnb29kCi0JICogYW5kIGl0IGp1c3QgYmUgYSBwZXJtaXNzaW9uIHByb2JsZW0sIHNvIHJldHVybmluZworCSAqIGFuZCBpdCBtYXkganVzdCBiZSBhIHBlcm1pc3Npb24gcHJvYmxlbSwgc28gcmV0dXJuaW5nCiAJICogLUVBQ0NFU1MgaXMgc2FmZXIKIAkgKi8KIAlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAotIGVycl90YXJnZXQ6Ci0JZHB1dCh0YXJnZXRfZGlyKTsKICBlcnJfcmVzdWx0OgogCWRwdXQocmVzdWx0KTsKLSBlcnJfb3V0OgogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLQotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKLXsKLQkvKiBnZXRfcGFyZW50IGNhbm5vdCBiZSBzdXBwb3J0ZWQgZ2VuZXJpY2FsbHksIHRoZSBsb2NraW5nCi0JICogaXMgdG9vIGlja3kuCi0JICogaW5zdGVhZCwgd2UganVzdCByZXR1cm4gRUFDQ0VTLiAgSWYgc2VydmVyIHJlYm9vdHMgb3IgaW5vZGVzCi0JICogZ2V0IGZsdXNoZWQsIHlvdSBsb3NlCi0JICovCi0JcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7Ci19Ci0KLQogc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrIHsKIAljaGFyICpuYW1lOwkJLyogbmFtZSB0aGF0IHdhcyBmb3VuZC4gSXQgYWxyZWFkeSBwb2ludHMgdG8gYQogCQkJCSAgIGJ1ZmZlciBOQU1FX01BWCsxIGlzIHNpemUgKi8KQEAgLTM5MCw2MSArNDIyLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmV4cG9ydF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vLCBfX3UzMiBnZW5lcmF0aW9uKQotewotCi0JLyogaWdldCBpc24ndCByZWFsbHkgcmlnaHQgaWYgdGhlIGlub2RlIGlzIGN1cnJlbnRseSB1bmFsbG9jYXRlZCEhCi0JICogVGhpcyBzaG91bGQgcmVhbGx5IGFsbCBiZSBkb25lIGluc2lkZSBlYWNoIGZpbGVzeXN0ZW0KLQkgKgotCSAqIGV4dDJmcycgcmVhZF9pbm9kZSBoYXMgYmVlbiBzdHJlbmd0aGVkIHRvIHJldHVybiBhIGJhZF9pbm9kZSBpZgotCSAqIHRoZSBpbm9kZSBoYWQgYmVlbiBkZWxldGVkLgotCSAqCi0JICogQ3VycmVudGx5IHdlIGRvbid0IGtub3cgdGhlIGdlbmVyYXRpb24gZm9yIHBhcmVudCBkaXJlY3RvcnksIHNvCi0JICogYSBnZW5lcmF0aW9uIG9mIDAgbWVhbnMgImFjY2VwdCBhbnkiCi0JICovCi0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7Ci0JaWYgKGlubyA9PSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKLQlpbm9kZSA9IGlnZXQoc2IsIGlubyk7Ci0JaWYgKGlub2RlID09IE5VTEwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpCi0JICAgIHx8IChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikKLQkJKSB7Ci0JCS8qIHdlIGRpZG4ndCBmaW5kIHRoZSByaWdodCBpbm9kZS4uICovCi0JCWRwcmludGsoImZoX3ZlcmlmeTogSW5vZGUgJWx1LCBCYWQgY291bnQ6ICVkICVkIG9yIHZlcnNpb24gICV1ICV1XG4iLAotCQkJaW5vZGUtPmlfaW5vLAotCQkJaW5vZGUtPmlfbmxpbmssIGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCksCi0JCQlpbm9kZS0+aV9nZW5lcmF0aW9uLAotCQkJZ2VuZXJhdGlvbik7Ci0KLQkJaXB1dChpbm9kZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwotCX0KLQkvKiBub3cgdG8gZmluZCBhIGRlbnRyeS4KLQkgKiBJZiBwb3NzaWJsZSwgZ2V0IGEgd2VsbC1jb25uZWN0ZWQgb25lCi0JICovCi0JcmVzdWx0ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKLQlpZiAoIXJlc3VsdCkgewotCQlpcHV0KGlub2RlKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF9vYmplY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdm9ianApCi17Ci0JX191MzIgKm9ianAgPSB2b2JqcDsKLQl1bnNpZ25lZCBsb25nIGlubyA9IG9ianBbMF07Ci0JX191MzIgZ2VuZXJhdGlvbiA9IG9ianBbMV07Ci0KLQlyZXR1cm4gZXhwb3J0X2lnZXQoc2IsIGlubywgZ2VuZXJhdGlvbik7Ci19Ci0KLQogLyoqCiAgKiBleHBvcnRfZW5jb2RlX2ZoIC0gZGVmYXVsdCBleHBvcnRfb3BlcmF0aW9ucy0+ZW5jb2RlX2ZoIGZ1bmN0aW9uCiAgKiBAZGVudHJ5OiAgdGhlIGRlbnRyeSB0byBlbmNvZGUKQEAgLTUxNywxNiArNDk0LDQwIEBACiAJCQkJICAgYWNjZXB0YWJsZSwgY29udGV4dCk7CiB9CiAKLXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHBvcnRfb3BfZGVmYXVsdCA9IHsKLQkuZGVjb2RlX2ZoCT0gZXhwb3J0X2RlY29kZV9maCwKLQkuZW5jb2RlX2ZoCT0gZXhwb3J0X2VuY29kZV9maCwKK2ludCBleHBvcnRmc19lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqZmgsIGludCAqbWF4X2xlbiwKKwkJaW50IGNvbm5lY3RhYmxlKQoreworIAlzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgKm5vcCA9IGRlbnRyeS0+ZF9zYi0+c19leHBvcnRfb3A7CisJaW50IGVycm9yOwogCi0JLmdldF9uYW1lCT0gZ2V0X25hbWUsCi0JLmdldF9wYXJlbnQJPSBnZXRfcGFyZW50LAotCS5nZXRfZGVudHJ5CT0gZ2V0X29iamVjdCwKLX07CisJaWYgKG5vcC0+ZW5jb2RlX2ZoKQorCQllcnJvciA9IG5vcC0+ZW5jb2RlX2ZoKGRlbnRyeSwgZmgsIG1heF9sZW4sIGNvbm5lY3RhYmxlKTsKKwllbHNlCisJCWVycm9yID0gZXhwb3J0X2VuY29kZV9maChkZW50cnksIGZoLCBtYXhfbGVuLCBjb25uZWN0YWJsZSk7CiAKLUVYUE9SVF9TWU1CT0woZXhwb3J0X29wX2RlZmF1bHQpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4cG9ydGZzX2VuY29kZV9maCk7CisKK3N0cnVjdCBkZW50cnkgKmV4cG9ydGZzX2RlY29kZV9maChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgX191MzIgKmZoLCBpbnQgZmhfbGVuLAorCQlpbnQgZmlsZWlkX3R5cGUsIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKiwgc3RydWN0IGRlbnRyeSAqKSwKKwkJdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgKm5vcCA9IG1udC0+bW50X3NiLT5zX2V4cG9ydF9vcDsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7CisKKwlpZiAobm9wLT5kZWNvZGVfZmgpIHsKKwkJcmVzdWx0ID0gbm9wLT5kZWNvZGVfZmgobW50LT5tbnRfc2IsIGZoLCBmaF9sZW4sIGZpbGVpZF90eXBlLAorCQkJYWNjZXB0YWJsZSwgY29udGV4dCk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gZXhwb3J0X2RlY29kZV9maChtbnQtPm1udF9zYiwgZmgsIGZoX2xlbiwgZmlsZWlkX3R5cGUsCisJCQlhY2NlcHRhYmxlLCBjb250ZXh0KTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXhwb3J0ZnNfZGVjb2RlX2ZoKTsKKwogRVhQT1JUX1NZTUJPTChmaW5kX2V4cG9ydGVkX2RlbnRyeSk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZmlsZS5jIGIvZnMvZXh0Mi9maWxlLmMKaW5kZXggMDRhZmVlYy4uYWI3OTYxMiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9maWxlLmMKKysrIGIvZnMvZXh0Mi9maWxlLmMKQEAgLTI0LDkgKzI0LDkgQEAKICNpbmNsdWRlICJhY2wuaCIKIAogLyoKLSAqIENhbGxlZCB3aGVuIGFuIGlub2RlIGlzIHJlbGVhc2VkLiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQKLSAqIGZyb20gZXh0Ml9vcGVuX2ZpbGU6IG9wZW4gZ2V0cyBjYWxsZWQgYXQgZXZlcnkgb3BlbiwgYnV0IHJlbGVhc2UKLSAqIGdldHMgY2FsbGVkIG9ubHkgd2hlbiAvYWxsLyB0aGUgZmlsZXMgYXJlIGNsb3NlZC4KKyAqIENhbGxlZCB3aGVuIGZpbHAgaXMgcmVsZWFzZWQuIFRoaXMgaGFwcGVucyB3aGVuIGFsbCBmaWxlIGRlc2NyaXB0b3JzCisgKiBmb3IgYSBzaW5nbGUgc3RydWN0IGZpbGUgYXJlIGNsb3NlZC4gTm90ZSB0aGF0IGRpZmZlcmVudCBvcGVuKCkgY2FsbHMKKyAqIGZvciB0aGUgc2FtZSBmaWxlIHlpZWxkIGRpZmZlcmVudCBzdHJ1Y3QgZmlsZSBzdHJ1Y3R1cmVzLgogICovCiBzdGF0aWMgaW50IGV4dDJfcmVsZWFzZV9maWxlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQogewpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDVkZTUwNjEuLjNlZWZhOTcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMTA5OSwxNSArMTEwMCwxOCBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CiAJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwotCXVuc2lnbmVkIGxvbmcgb3ZlcmhlYWQ7Ci0JaW50IGk7CiAJdTY0IGZzaWQ7CiAKIAlpZiAodGVzdF9vcHQgKHNiLCBNSU5JWF9ERikpCi0JCW92ZXJoZWFkID0gMDsKLQllbHNlIHsKKwkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSAwOworCWVsc2UgaWYgKHNiaS0+c19ibG9ja3NfbGFzdCAhPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCXVuc2lnbmVkIGxvbmcgaSwgb3ZlcmhlYWQgPSAwOworCQlzbXBfcm1iKCk7CisKIAkJLyoKLQkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpCisJCSAqIENvbXB1dGUgdGhlIG92ZXJoZWFkIChGUyBzdHJ1Y3R1cmVzKS4gVGhpcyBpcyBjb25zdGFudAorCQkgKiBmb3IgYSBnaXZlbiBmaWxlc3lzdGVtIHVubGVzcyB0aGUgbnVtYmVyIG9mIGJsb2NrIGdyb3VwcworCQkgKiBjaGFuZ2VzIHNvIHdlIGNhY2hlIHRoZSBwcmV2aW91cyB2YWx1ZSB1bnRpbCBpdCBkb2VzLgogCQkgKi8KIAogCQkvKgpAQCAtMTEzMSwxNyArMTEzNSwyMiBAQAogCQkgKi8KIAkJb3ZlcmhlYWQgKz0gKHNiaS0+c19ncm91cHNfY291bnQgKgogCQkJICAgICAoMiArIHNiaS0+c19pdGJfcGVyX2dyb3VwKSk7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gb3ZlcmhlYWQ7CisJCXNtcF93bWIoKTsKKwkJc2JpLT5zX2Jsb2Nrc19sYXN0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKIAl9CiAKIAlidWYtPmZfdHlwZSA9IEVYVDJfU1VQRVJfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWJ1Zi0+Zl9ibG9ja3MgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0gb3ZlcmhlYWQ7CisJYnVmLT5mX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBzYmktPnNfb3ZlcmhlYWRfbGFzdDsKIAlidWYtPmZfYmZyZWUgPSBleHQyX2NvdW50X2ZyZWVfYmxvY2tzKHNiKTsKKwllcy0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9iZnJlZSk7CiAJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZSAtIGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KTsKIAlpZiAoYnVmLT5mX2JmcmVlIDwgbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpKQogCQlidWYtPmZfYmF2YWlsID0gMDsKIAlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpOwogCWJ1Zi0+Zl9mZnJlZSA9IGV4dDJfY291bnRfZnJlZV9pbm9kZXMoc2IpOworCWVzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2ZmcmVlKTsKIAlidWYtPmZfbmFtZWxlbiA9IEVYVDJfTkFNRV9MRU47CiAJZnNpZCA9IGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQpIF4KIAkgICAgICAgbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCArIHNpemVvZih1NjQpKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaW5vZGUuYyBiL2ZzL2V4dDMvaW5vZGUuYwppbmRleCAyYTg1ZGRlLi5kZTRlMzE2IDEwMDY0NAotLS0gYS9mcy9leHQzL2lub2RlLmMKKysrIGIvZnMvZXh0My9pbm9kZS5jCkBAIC0zMTk1LDcgKzMxOTUsNyBAQAogCSAqLwogCiAJam91cm5hbCA9IEVYVDNfSk9VUk5BTChpbm9kZSk7Ci0JaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSB8fCBJU19SRE9OTFkoaW5vZGUpKQorCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCiAJCXJldHVybiAtRVJPRlM7CiAKIAlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCA5YmIwNDZkLi4xNTg2ODA3IDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC0xMDE5LDYgKzEwMTksMTEgQEAKIAogCQlpZiAoIWlub2RlKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKwkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJCX0KIAl9CiAJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwogfQpAQCAtMTA1NCw2ICsxMDU5LDExIEBACiAJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CiAKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJfQorCiAJcGFyZW50ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKIAlpZiAoIXBhcmVudCkgewogCQlpcHV0KGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvc3VwZXIuYyBiL2ZzL2V4dDMvc3VwZXIuYwppbmRleCA2ZTMwNjI5Li40Zjg0ZGM4IDEwMDY0NAotLS0gYS9mcy9leHQzL3N1cGVyLmMKKysrIGIvZnMvZXh0My9zdXBlci5jCkBAIC0yOSwxMiArMjksMTQgQEAKICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTQ1OSw2ICs0NjEsMTQgQEAKIAogc3RhdGljIHZvaWQgZXh0M19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJaWYgKCFsaXN0X2VtcHR5KCYoRVhUM19JKGlub2RlKS0+aV9vcnBoYW4pKSkgeworCQlwcmludGsoIkVYVDMgSW5vZGUgJXA6IG9ycGhhbiBsaXN0IGNoZWNrIGZhaWxlZCFcbiIsCisJCQlFWFQzX0koaW5vZGUpKTsKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAiIiwgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsCisJCQkJRVhUM19JKGlub2RlKSwgc2l6ZW9mKHN0cnVjdCBleHQzX2lub2RlX2luZm8pLAorCQkJCWZhbHNlKTsKKwkJZHVtcF9zdGFjaygpOworCX0KIAlrbWVtX2NhY2hlX2ZyZWUoZXh0M19pbm9kZV9jYWNoZXAsIEVYVDNfSShpbm9kZSkpOwogfQogCkBAIC0xNTY2LDcgKzE1NzYsNyBAQAogCQlzYmktPnNfaW5vZGVfc2l6ZSA9IGxlMTZfdG9fY3B1KGVzLT5zX2lub2RlX3NpemUpOwogCQlzYmktPnNfZmlyc3RfaW5vID0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfaW5vKTsKIAkJaWYgKChzYmktPnNfaW5vZGVfc2l6ZSA8IEVYVDNfR09PRF9PTERfSU5PREVfU0laRSkgfHwKLQkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSAmIChzYmktPnNfaW5vZGVfc2l6ZSAtIDEpKSB8fAorCQkgICAgKCFpc19wb3dlcl9vZl8yKHNiaS0+c19pbm9kZV9zaXplKSkgfHwKIAkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKIAkJCXByaW50ayAoS0VSTl9FUlIKIAkJCQkiRVhUMy1mczogdW5zdXBwb3J0ZWQgaW5vZGUgc2l6ZTogJWRcbiIsCkBAIC0yMDc1LDYgKzIwODUsNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGludCBqb3VybmFsX2ludW0pCiB7CiAJam91cm5hbF90ICpqb3VybmFsOworCWludCBlcnI7CiAKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiByZWFkb25seSBmaWxlc3lzdGVtIHdoZW4gdHJ5aW5nIHRvICIKQEAgLTIwODIsMTMgKzIwOTMsMTUgQEAKIAkJcmV0dXJuIC1FUk9GUzsKIAl9CiAKLQlpZiAoIShqb3VybmFsID0gZXh0M19nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKSkpCisJam91cm5hbCA9IGV4dDNfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSk7CisJaWYgKCFqb3VybmFsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IGNyZWF0aW5nIG5ldyBqb3VybmFsIG9uIGlub2RlICV1XG4iLAogCSAgICAgICBqb3VybmFsX2ludW0pOwogCi0JaWYgKGpvdXJuYWxfY3JlYXRlKGpvdXJuYWwpKSB7CisJZXJyID0gam91cm5hbF9jcmVhdGUoam91cm5hbCk7CisJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGVycm9yIGNyZWF0aW5nIGpvdXJuYWwuXG4iKTsKIAkJam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTIxMzksMTIgKzIxNTIsMTQgQEAKIAogCWpvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOwogCWpvdXJuYWxfZmx1c2goam91cm5hbCk7CisJbG9ja19zdXBlcihzYik7CiAJaWYgKEVYVDNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSAmJgogCSAgICBzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewogCQlFWFQzX0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAkJc2ItPnNfZGlydCA9IDA7CiAJCWV4dDNfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CiAJfQorCXVubG9ja19zdXBlcihzYik7CiAJam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKIH0KIApAQCAtMjMzMyw3ICsyMzQ4LDEzIEBACiAJCQkgICAgKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDNfVkFMSURfRlMpKQogCQkJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYoc2JpLT5zX21vdW50X3N0YXRlKTsKIAorCQkJLyoKKwkJCSAqIFdlIGhhdmUgdG8gdW5sb2NrIHN1cGVyIHNvIHRoYXQgd2UgY2FuIHdhaXQgZm9yCisJCQkgKiB0cmFuc2FjdGlvbnMuCisJCQkgKi8KKwkJCXVubG9ja19zdXBlcihzYik7CiAJCQlleHQzX21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKKwkJCWxvY2tfc3VwZXIoc2IpOwogCQl9IGVsc2UgewogCQkJX19sZTMyIHJldDsKIAkJCWlmICgocmV0ID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCkBAIC0yNDA2LDE5ICsyNDI3LDE5IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7Ci0JZXh0M19mc2Jsa190IG92ZXJoZWFkOwotCWludCBpOwogCXU2NCBmc2lkOwogCi0JaWYgKHRlc3Rfb3B0IChzYiwgTUlOSVhfREYpKQotCQlvdmVyaGVhZCA9IDA7Ci0JZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgbmdyb3VwczsKLQkJbmdyb3VwcyA9IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKKwlpZiAodGVzdF9vcHQoc2IsIE1JTklYX0RGKSkgeworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IDA7CisJfSBlbHNlIGlmIChzYmktPnNfYmxvY2tzX2xhc3QgIT0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgeworCQl1bnNpZ25lZCBsb25nIG5ncm91cHMgPSBzYmktPnNfZ3JvdXBzX2NvdW50LCBpOworCQlleHQzX2ZzYmxrX3Qgb3ZlcmhlYWQgPSAwOwogCQlzbXBfcm1iKCk7CiAKIAkJLyoKLQkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpCisJCSAqIENvbXB1dGUgdGhlIG92ZXJoZWFkIChGUyBzdHJ1Y3R1cmVzKS4gIFRoaXMgaXMgY29uc3RhbnQKKwkJICogZm9yIGEgZ2l2ZW4gZmlsZXN5c3RlbSB1bmxlc3MgdGhlIG51bWJlciBvZiBibG9jayBncm91cHMKKwkJICogY2hhbmdlcyBzbyB3ZSBjYWNoZSB0aGUgcHJldmlvdXMgdmFsdWUgdW50aWwgaXQgZG9lcy4KIAkJICovCiAKIAkJLyoKQEAgLTI0NDIsMTggKzI0NjMsMjMgQEAKIAkJICogRXZlcnkgYmxvY2sgZ3JvdXAgaGFzIGFuIGlub2RlIGJpdG1hcCwgYSBibG9jawogCQkgKiBiaXRtYXAsIGFuZCBhbiBpbm9kZSB0YWJsZS4KIAkJICovCi0JCW92ZXJoZWFkICs9IChuZ3JvdXBzICogKDIgKyBFWFQzX1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSk7CisJCW92ZXJoZWFkICs9IG5ncm91cHMgKiAoMiArIHNiaS0+c19pdGJfcGVyX2dyb3VwKTsKKwkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSBvdmVyaGVhZDsKKwkJc21wX3dtYigpOworCQlzYmktPnNfYmxvY2tzX2xhc3QgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOwogCX0KIAogCWJ1Zi0+Zl90eXBlID0gRVhUM19TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7Ci0JYnVmLT5mX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBvdmVyaGVhZDsKKwlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtIHNiaS0+c19vdmVyaGVhZF9sYXN0OwogCWJ1Zi0+Zl9iZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJZXMtPnNfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfYmZyZWUpOwogCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgLSBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCk7CiAJaWYgKGJ1Zi0+Zl9iZnJlZSA8IGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KSkKIAkJYnVmLT5mX2JhdmFpbCA9IDA7CiAJYnVmLT5mX2ZpbGVzID0gbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KTsKIAlidWYtPmZfZmZyZWUgPSBwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCWVzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2ZmcmVlKTsKIAlidWYtPmZfbmFtZWxlbiA9IEVYVDNfTkFNRV9MRU47CiAJZnNpZCA9IGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQpIF4KIAkgICAgICAgbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCArIHNpemVvZih1NjQpKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYmFsbG9jLmMgYi9mcy9leHQ0L2JhbGxvYy5jCmluZGV4IDNiNjRiYjEuLjlkZTU0YWUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9iYWxsb2MuYwpAQCAtMTU4NSw3ICsxNTg1LDcgQEAKIAlyZXRfYmxvY2sgPSBncnBfYWxsb2NfYmxrICsgZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZ3JvdXBfbm8pOwogCiAJaWYgKGluX3JhbmdlKGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApLCByZXRfYmxvY2ssIG51bSkgfHwKLQkgICAgaW5fcmFuZ2UoZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCksIHJldF9ibG9jaywgbnVtKSB8fAorCSAgICBpbl9yYW5nZShleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKSwgcmV0X2Jsb2NrLCBudW0pIHx8CiAJICAgIGluX3JhbmdlKHJldF9ibG9jaywgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSwKIAkJICAgICBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSB8fAogCSAgICBpbl9yYW5nZShyZXRfYmxvY2sgKyBudW0gLSAxLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9uYW1laS5jIGIvZnMvZXh0NC9uYW1laS5jCmluZGV4IDI4MTFlNTcuLjJkZTMzOWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbmFtZWkuYworKysgYi9mcy9leHQ0L25hbWVpLmMKQEAgLTEwMTcsNiArMTAxNywxMSBAQAogCiAJCWlmICghaW5vZGUpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKworCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJfQogCX0KIAlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CkBAIC0xMDUyLDYgKzEwNTcsMTEgQEAKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAorCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwl9CisKIAlwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwogCWlmICghcGFyZW50KSB7CiAJCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IDE3NWI2OGMuLmI4MDZlNjggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgpAQCAtNTEwLDYgKzUxMSwxNCBAQAogCiBzdGF0aWMgdm9pZCBleHQ0X2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlpZiAoIWxpc3RfZW1wdHkoJihFWFQ0X0koaW5vZGUpLT5pX29ycGhhbikpKSB7CisJCXByaW50aygiRVhUNCBJbm9kZSAlcDogb3JwaGFuIGxpc3QgY2hlY2sgZmFpbGVkIVxuIiwKKwkJCUVYVDRfSShpbm9kZSkpOworCQlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICIiLCBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwKKwkJCQlFWFQ0X0koaW5vZGUpLCBzaXplb2Yoc3RydWN0IGV4dDRfaW5vZGVfaW5mbyksCisJCQkJdHJ1ZSk7CisJCWR1bXBfc3RhY2soKTsKKwl9CiAJa21lbV9jYWNoZV9mcmVlKGV4dDRfaW5vZGVfY2FjaGVwLCBFWFQ0X0koaW5vZGUpKTsKIH0KIApAQCAtMjE1MCw2ICsyMTU5LDcgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtKQogewogCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgZXJyOwogCiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogcmVhZG9ubHkgZmlsZXN5c3RlbSB3aGVuIHRyeWluZyB0byAiCkBAIC0yMTU3LDEzICsyMTY3LDE1IEBACiAJCXJldHVybiAtRVJPRlM7CiAJfQogCi0JaWYgKCEoam91cm5hbCA9IGV4dDRfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSkpKQorCWpvdXJuYWwgPSBleHQ0X2dldF9qb3VybmFsKHNiLCBqb3VybmFsX2ludW0pOworCWlmICgham91cm5hbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBjcmVhdGluZyBuZXcgam91cm5hbCBvbiBpbm9kZSAldVxuIiwKIAkgICAgICAgam91cm5hbF9pbnVtKTsKIAotCWlmIChqYmQyX2pvdXJuYWxfY3JlYXRlKGpvdXJuYWwpKSB7CisJZXJyID0gamJkMl9qb3VybmFsX2NyZWF0ZShqb3VybmFsKTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXJyb3IgY3JlYXRpbmcgam91cm5hbC5cbiIpOwogCQlqYmQyX2pvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0yMjE0LDEyICsyMjI2LDE0IEBACiAKIAlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOwogCWpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwlsb2NrX3N1cGVyKHNiKTsKIAlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpICYmCiAJICAgIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CiAJCUVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwogCQlzYi0+c19kaXJ0ID0gMDsKIAkJZXh0NF9jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKIAl9CisJdW5sb2NrX3N1cGVyKHNiKTsKIAlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiB9CiAKQEAgLTI0MDgsNyArMjQyMiwxMyBAQAogCQkJICAgIChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQ0X1ZBTElEX0ZTKSkKIAkJCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7CiAKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHRvIHVubG9jayBzdXBlciBzbyB0aGF0IHdlIGNhbiB3YWl0IGZvcgorCQkJICogdHJhbnNhY3Rpb25zLgorCQkJICovCisJCQl1bmxvY2tfc3VwZXIoc2IpOwogCQkJZXh0NF9tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiLCBlcyk7CisJCQlsb2NrX3N1cGVyKHNiKTsKIAkJfSBlbHNlIHsKIAkJCV9fbGUzMiByZXQ7CiAJCQlpZiAoKHJldCA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLApAQCAtMjQ4MSwxOSArMjUwMSwxOSBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwotCWV4dDRfZnNibGtfdCBvdmVyaGVhZDsKLQlpbnQgaTsKIAl1NjQgZnNpZDsKIAotCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKLQkJb3ZlcmhlYWQgPSAwOwotCWVsc2UgewotCQl1bnNpZ25lZCBsb25nIG5ncm91cHM7Ci0JCW5ncm91cHMgPSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJaWYgKHRlc3Rfb3B0KHNiLCBNSU5JWF9ERikpIHsKKwkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSAwOworCX0gZWxzZSBpZiAoc2JpLT5zX2Jsb2Nrc19sYXN0ICE9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJdW5zaWduZWQgbG9uZyBuZ3JvdXBzID0gc2JpLT5zX2dyb3Vwc19jb3VudCwgaTsKKwkJZXh0NF9mc2Jsa190IG92ZXJoZWFkID0gMDsKIAkJc21wX3JtYigpOwogCiAJCS8qCi0JCSAqIENvbXB1dGUgdGhlIG92ZXJoZWFkIChGUyBzdHJ1Y3R1cmVzKQorCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykuICBUaGlzIGlzIGNvbnN0YW50CisJCSAqIGZvciBhIGdpdmVuIGZpbGVzeXN0ZW0gdW5sZXNzIHRoZSBudW1iZXIgb2YgYmxvY2sgZ3JvdXBzCisJCSAqIGNoYW5nZXMgc28gd2UgY2FjaGUgdGhlIHByZXZpb3VzIHZhbHVlIHVudGlsIGl0IGRvZXMuCiAJCSAqLwogCiAJCS8qCkBAIC0yNTE3LDE4ICsyNTM3LDIzIEBACiAJCSAqIEV2ZXJ5IGJsb2NrIGdyb3VwIGhhcyBhbiBpbm9kZSBiaXRtYXAsIGEgYmxvY2sKIAkJICogYml0bWFwLCBhbmQgYW4gaW5vZGUgdGFibGUuCiAJCSAqLwotCQlvdmVyaGVhZCArPSAobmdyb3VwcyAqICgyICsgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkpOworCQlvdmVyaGVhZCArPSBuZ3JvdXBzICogKDIgKyBzYmktPnNfaXRiX3Blcl9ncm91cCk7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gb3ZlcmhlYWQ7CisJCXNtcF93bWIoKTsKKwkJc2JpLT5zX2Jsb2Nrc19sYXN0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKIAl9CiAKIAlidWYtPmZfdHlwZSA9IEVYVDRfU1VQRVJfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWJ1Zi0+Zl9ibG9ja3MgPSBleHQ0X2Jsb2Nrc19jb3VudChlcykgLSBvdmVyaGVhZDsKKwlidWYtPmZfYmxvY2tzID0gZXh0NF9ibG9ja3NfY291bnQoZXMpIC0gc2JpLT5zX292ZXJoZWFkX2xhc3Q7CiAJYnVmLT5mX2JmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwllcy0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9iZnJlZSk7CiAJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZSAtIGV4dDRfcl9ibG9ja3NfY291bnQoZXMpOwogCWlmIChidWYtPmZfYmZyZWUgPCBleHQ0X3JfYmxvY2tzX2NvdW50KGVzKSkKIAkJYnVmLT5mX2JhdmFpbCA9IDA7CiAJYnVmLT5mX2ZpbGVzID0gbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KTsKIAlidWYtPmZfZmZyZWUgPSBwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCWVzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2ZmcmVlKTsKIAlidWYtPmZfbmFtZWxlbiA9IEVYVDRfTkFNRV9MRU47CiAJZnNpZCA9IGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQpIF4KIAkgICAgICAgbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCArIHNpemVvZih1NjQpKTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9kaXIuYyBiL2ZzL2ZhdC9kaXIuYwppbmRleCBjY2YxNjFkLi43MmNiY2Q2IDEwMDY0NAotLS0gYS9mcy9mYXQvZGlyLmMKKysrIGIvZnMvZmF0L2Rpci5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIAl3Y2hhcl90IGJ1ZnVuYW1lWzE0XTsKIAl1bnNpZ25lZCBjaGFyIHhsYXRlX2xlbiwgbnJfc2xvdHM7CiAJd2NoYXJfdCAqdW5pY29kZSA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciB3b3JrWzhdLCBidWZuYW1lWzI2MF07CS8qIDI1NiArIDQgKi8KKwl1bnNpZ25lZCBjaGFyIHdvcmtbTVNET1NfTkFNRV0sIGJ1Zm5hbWVbMjYwXTsJLyogMjU2ICsgNCAqLwogCWludCB1bmlfeGxhdGUgPSBzYmktPm9wdGlvbnMudW5pY29kZV94bGF0ZTsKIAlpbnQgdXRmOCA9IHNiaS0+b3B0aW9ucy51dGY4OwogCWludCBhbnljYXNlID0gKHNiaS0+b3B0aW9ucy5uYW1lX2NoZWNrICE9ICdzJyk7CkBAIC0zNTEsNyArMzUxLDggQEAKIAkJaWYgKHdvcmtbMF0gPT0gMHgwNSkKIAkJCXdvcmtbMF0gPSAweEU1OwogCQlmb3IgKGkgPSAwLCBqID0gMCwgbGFzdF91ID0gMDsgaSA8IDg7KSB7Ci0JCQlpZiAoIXdvcmtbaV0pIGJyZWFrOworCQkJaWYgKCF3b3JrW2ldKQorCQkJCWJyZWFrOwogCQkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZ3b3JrW2ldLCA4IC0gaSwKIAkJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAogCQkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9CQVNFKTsKQEAgLTM2NSwxMyArMzY2LDE1IEBACiAJCX0KIAkJaiA9IGxhc3RfdTsKIAkJZmF0X3Nob3J0MnVuaShubHNfZGlzaywgIi4iLCAxLCAmYnVmdW5hbWVbaisrXSk7Ci0JCWZvciAoaSA9IDA7IGkgPCAzOykgewotCQkJaWYgKCFkZS0+ZXh0W2ldKSBicmVhazsKLQkJCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmZGUtPmV4dFtpXSwgMyAtIGksCisJCWZvciAoaSA9IDg7IGkgPCBNU0RPU19OQU1FOykgeworCQkJaWYgKCF3b3JrW2ldKQorCQkJCWJyZWFrOworCQkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZ3b3JrW2ldLAorCQkJCQkJTVNET1NfTkFNRSAtIGksCiAJCQkJCQkmYnVmdW5hbWVbaisrXSwgb3B0X3Nob3J0bmFtZSwKIAkJCQkJCWRlLT5sY2FzZSAmIENBU0VfTE9XRVJfRVhUKTsKIAkJCWlmIChjaGwgPD0gMSkgewotCQkJCWlmIChkZS0+ZXh0W2ldICE9ICcgJykKKwkJCQlpZiAod29ya1tpXSAhPSAnICcpCiAJCQkJCWxhc3RfdSA9IGo7CiAJCQl9IGVsc2UgewogCQkJCWxhc3RfdSA9IGo7CkBAIC00NDUsNyArNDQ4LDcgQEAKIAlpbnQgZmlsbF9sZW47CiAJd2NoYXJfdCBidWZ1bmFtZVsxNF07CiAJd2NoYXJfdCAqdW5pY29kZSA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciBjLCB3b3JrWzhdLCBidWZuYW1lWzU2XSwgKnB0bmFtZSA9IGJ1Zm5hbWU7CisJdW5zaWduZWQgY2hhciBjLCB3b3JrW01TRE9TX05BTUVdLCBidWZuYW1lWzU2XSwgKnB0bmFtZSA9IGJ1Zm5hbWU7CiAJdW5zaWduZWQgbG9uZyBscG9zLCBkdW1teSwgKmZ1cnJmdSA9ICZscG9zOwogCWludCB1bmlfeGxhdGUgPSBzYmktPm9wdGlvbnMudW5pY29kZV94bGF0ZTsKIAlpbnQgaXN2ZmF0ID0gc2JpLT5vcHRpb25zLmlzdmZhdDsKQEAgLTUyNyw3ICs1MzAsOCBAQAogCWlmICh3b3JrWzBdID09IDB4MDUpCiAJCXdvcmtbMF0gPSAweEU1OwogCWZvciAoaSA9IDAsIGogPSAwLCBsYXN0ID0gMCwgbGFzdF91ID0gMDsgaSA8IDg7KSB7Ci0JCWlmICghKGMgPSB3b3JrW2ldKSkgYnJlYWs7CisJCWlmICghKGMgPSB3b3JrW2ldKSkKKwkJCWJyZWFrOwogCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJndvcmtbaV0sIDggLSBpLAogCQkJCQkmYnVmdW5hbWVbaisrXSwgb3B0X3Nob3J0bmFtZSwKIAkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9CQVNFKTsKQEAgLTU0OSw5ICs1NTMsMTAgQEAKIAlqID0gbGFzdF91OwogCWZhdF9zaG9ydDJ1bmkobmxzX2Rpc2ssICIuIiwgMSwgJmJ1ZnVuYW1lW2orK10pOwogCXB0bmFtZVtpKytdID0gJy4nOwotCWZvciAoaTIgPSAwOyBpMiA8IDM7KSB7Ci0JCWlmICghKGMgPSBkZS0+ZXh0W2kyXSkpIGJyZWFrOwotCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJmRlLT5leHRbaTJdLCAzIC0gaTIsCisJZm9yIChpMiA9IDg7IGkyIDwgTVNET1NfTkFNRTspIHsKKwkJaWYgKCEoYyA9IHdvcmtbaTJdKSkKKwkJCWJyZWFrOworCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJndvcmtbaTJdLCBNU0RPU19OQU1FIC0gaTIsCiAJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAogCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0VYVCk7CiAJCWlmIChjaGwgPD0gMSkgewpAQCAtNTYzLDggKzU2OCw4IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlsYXN0X3UgPSBqOwotCQkJZm9yIChjaGkgPSAwOyBjaGkgPCBjaGwgJiYgaTIgPCAzOyBjaGkrKykgewotCQkJCXB0bmFtZVtpKytdID0gZGUtPmV4dFtpMisrXTsKKwkJCWZvciAoY2hpID0gMDsgY2hpIDwgY2hsICYmIGkyIDwgTVNET1NfTkFNRTsgY2hpKyspIHsKKwkJCQlwdG5hbWVbaSsrXSA9IHdvcmtbaTIrK107CiAJCQkJbGFzdCA9IGk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2ZhdC9mYXRlbnQuYyBiL2ZzL2ZhdC9mYXRlbnQuYwppbmRleCBhYjE3MWVhLi4yYzFiNzNmIDEwMDY0NAotLS0gYS9mcy9mYXQvZmF0ZW50LmMKKysrIGIvZnMvZmF0L2ZhdGVudC5jCkBAIC0xNyw2ICsxNyw4IEBACiAJaW50ICgqZW50X25leHQpKHN0cnVjdCBmYXRfZW50cnkgKik7CiB9OwogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZhdDEyX2VudHJ5X2xvY2spOworCiBzdGF0aWMgdm9pZCBmYXQxMl9lbnRfYmxvY2tucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZW50cnksCiAJCQkgICAgICBpbnQgKm9mZnNldCwgc2VjdG9yX3QgKmJsb2NrbnIpCiB7CkBAIC0xMTYsMTAgKzExOCwxMyBAQAogCXU4ICoqZW50MTJfcCA9IGZhdGVudC0+dS5lbnQxMl9wOwogCWludCBuZXh0OwogCisJc3Bpbl9sb2NrKCZmYXQxMl9lbnRyeV9sb2NrKTsKIAlpZiAoZmF0ZW50LT5lbnRyeSAmIDEpCiAJCW5leHQgPSAoKmVudDEyX3BbMF0gPj4gNCkgfCAoKmVudDEyX3BbMV0gPDwgNCk7CiAJZWxzZQogCQluZXh0ID0gKCplbnQxMl9wWzFdIDw8IDgpIHwgKmVudDEyX3BbMF07CisJc3Bpbl91bmxvY2soJmZhdDEyX2VudHJ5X2xvY2spOworCiAJbmV4dCAmPSAweDBmZmY7CiAJaWYgKG5leHQgPj0gQkFEX0ZBVDEyKQogCQluZXh0ID0gRkFUX0VOVF9FT0Y7CkBAIC0xNTEsNiArMTU2LDcgQEAKIAlpZiAobmV3ID09IEZBVF9FTlRfRU9GKQogCQluZXcgPSBFT0ZfRkFUMTI7CiAKKwlzcGluX2xvY2soJmZhdDEyX2VudHJ5X2xvY2spOwogCWlmIChmYXRlbnQtPmVudHJ5ICYgMSkgewogCQkqZW50MTJfcFswXSA9IChuZXcgPDwgNCkgfCAoKmVudDEyX3BbMF0gJiAweDBmKTsKIAkJKmVudDEyX3BbMV0gPSBuZXcgPj4gNDsKQEAgLTE1OCw2ICsxNjQsNyBAQAogCQkqZW50MTJfcFswXSA9IG5ldyAmIDB4ZmY7CiAJCSplbnQxMl9wWzFdID0gKCplbnQxMl9wWzFdICYgMHhmMCkgfCAobmV3ID4+IDgpOwogCX0KKwlzcGluX3VubG9jaygmZmF0MTJfZW50cnlfbG9jayk7CiAKIAltYXJrX2J1ZmZlcl9kaXJ0eShmYXRlbnQtPmJoc1swXSk7CiAJaWYgKGZhdGVudC0+bnJfYmhzID09IDIpCmRpZmYgLS1naXQgYS9mcy9mYXQvaW5vZGUuYyBiL2ZzL2ZhdC9pbm9kZS5jCmluZGV4IDQ3OTcyMmQuLjBhN2RkYjMgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9pbm9kZS5jCisrKyBiL2ZzL2ZhdC9pbm9kZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CkBAIC0zNTQsOCArMzU1LDcgQEAKIAl9IGVsc2UgeyAvKiBub3QgYSBkaXJlY3RvcnkgKi8KIAkJaW5vZGUtPmlfZ2VuZXJhdGlvbiB8PSAxOwogCQlpbm9kZS0+aV9tb2RlID0gTVNET1NfTUtNT0RFKGRlLT5hdHRyLAotCQkgICAgKChzYmktPm9wdGlvbnMuc2hvd2V4ZWMgJiYKLQkJCSFpc19leGVjKGRlLT5leHQpKQorCQkgICAgKChzYmktPm9wdGlvbnMuc2hvd2V4ZWMgJiYgIWlzX2V4ZWMoZGUtPm5hbWUgKyA4KSkKIAkJCT8gU19JUlVHT3xTX0lXVUdPIDogU19JUldYVUdPKQogCQkgICAgJiB+c2JpLT5vcHRpb25zLmZzX2ZtYXNrKSB8IFNfSUZSRUc7CiAJCU1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0ID0gbGUxNl90b19jcHUoZGUtPnN0YXJ0KTsKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmggYi9mcy9mcmVldnhmcy92eGZzX2Rpci5oCmluZGV4IDhhNGRmZWYuLjNjOTZkNmUgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmgKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaApAQCAtODAsNyArODAsNyBAQAogICoJYSBkX25hbWUgd2l0aCBzaXplIGxlbi4KICAqLwogI2RlZmluZSBWWEZTX0RJUlBBRAkJNAotI2RlZmluZSBWWEZTX05BTUVNSU4JCSgoaW50KSgoc3RydWN0IHZ4ZnNfZGlyZWN0ICopMCktPmRfbmFtZSkKKyNkZWZpbmUgVlhGU19OQU1FTUlOCQlvZmZzZXRvZihzdHJ1Y3Qgdnhmc19kaXJlY3QsIGRfbmFtZSkKICNkZWZpbmUgVlhGU19ESVJST1VORChsZW4pCSgoVlhGU19ESVJQQUQgKyAobGVuKSAtIDEpICYgfihWWEZTX0RJUlBBRCAtMSkpCiAjZGVmaW5lIFZYRlNfRElSTEVOKGxlbikJKFZYRlNfRElSUk9VTkQoVlhGU19OQU1FTUlOICsgKGxlbikpKQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2Vhb3BzLmMgYi9mcy9nZnMyL2Vhb3BzLmMKaW5kZXggYzFmNDQwMC4uMWFiM2U5ZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9lYW9wcy5jCisrKyBiL2ZzL2dmczIvZWFvcHMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KICNpbmNsdWRlIDxsaW51eC9sbV9pbnRlcmZhY2UuaD4KZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2V4cG9ydC5jIGIvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKaW5kZXggOTllYTU2NS4uYjgzMTJlZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKKysrIGIvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2xtX2ludGVyZmFjZS5oPgpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9idHJlZS5jIGIvZnMvaGZzcGx1cy9idHJlZS5jCmluZGV4IDkwZWJhYjcuLjA1MGQyOWMgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYnRyZWUuYworKysgYi9mcy9oZnNwbHVzL2J0cmVlLmMKQEAgLTYyLDggKzYyLDEwIEBACiAJCWlmICgoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX0hGU1gpICYmCiAJCSAgICAoaGVhZC0+a2V5X3R5cGUgPT0gSEZTUExVU19LRVlfQklOQVJZKSkKIAkJCXRyZWUtPmtleWNtcCA9IGhmc3BsdXNfY2F0X2Jpbl9jbXBfa2V5OwotCQllbHNlCisJCWVsc2UgewogCQkJdHJlZS0+a2V5Y21wID0gaGZzcGx1c19jYXRfY2FzZV9jbXBfa2V5OworCQkJSEZTUExVU19TQihzYikuZmxhZ3MgfD0gSEZTUExVU19TQl9DQVNFRk9MRDsKKwkJfQogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bmtub3duIEIqVHJlZSByZXF1ZXN0ZWRcbiIpOwogCQlnb3RvIGZhaWxfcGFnZTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZGlyLmMgYi9mcy9oZnNwbHVzL2Rpci5jCmluZGV4IDgwYjU2ODIuLjE5NTVlZTYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvZGlyLmMKKysrIGIvZnMvaGZzcGx1cy9kaXIuYwpAQCAtMzYsNiArMzYsOCBAQAogCXUxNiB0eXBlOwogCiAJc2IgPSBkaXItPmlfc2I7CisKKwlkZW50cnktPmRfb3AgPSAmaGZzcGx1c19kZW50cnlfb3BlcmF0aW9uczsKIAlkZW50cnktPmRfZnNkYXRhID0gTlVMTDsKIAloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlLCAmZmQpOwogCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgJmRlbnRyeS0+ZF9uYW1lKTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKaW5kZXggMzkxNTYzNS4uZDlmNWVkYSAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKKysrIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKQEAgLTE1MCw2ICsxNTAsNyBAQAogI2RlZmluZSBIRlNQTFVTX1NCX05PREVDT01QT1NFCTB4MDAwMgogI2RlZmluZSBIRlNQTFVTX1NCX0ZPUkNFCTB4MDAwNAogI2RlZmluZSBIRlNQTFVTX1NCX0hGU1gJCTB4MDAwOAorI2RlZmluZSBIRlNQTFVTX1NCX0NBU0VGT0xECTB4MDAxMAogCiAKIHN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8gewpAQCAtMzIxLDYgKzMyMiw3IEBACiAvKiBpbm9kZS5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNwbHVzX2FvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNwbHVzX2J0cmVlX2FvcHM7CitleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGhmc3BsdXNfZGVudHJ5X29wZXJhdGlvbnM7CiAKIHZvaWQgaGZzcGx1c19pbm9kZV9yZWFkX2Zvcmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3ICopOwogdm9pZCBoZnNwbHVzX2lub2RlX3dyaXRlX2Zvcmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3ICopOwpAQCAtMzUzLDYgKzM1NSw4IEBACiBpbnQgaGZzcGx1c19zdHJjbXAoY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICosIGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqKTsKIGludCBoZnNwbHVzX3VuaTJhc2Moc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjaGFyICosIGludCAqKTsKIGludCBoZnNwbHVzX2FzYzJ1bmkoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjb25zdCBjaGFyICosIGludCk7CitpbnQgaGZzcGx1c19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpzdHIpOworaW50IGhmc3BsdXNfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqczEsIHN0cnVjdCBxc3RyICpzMik7CiAKIC8qIHdyYXBwZXIuYyAqLwogaW50IGhmc3BsdXNfcmVhZF93cmFwcGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaW5vZGUuYyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwppbmRleCA0MDljZTU0Li42ZjdjNjYyIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2lub2RlLmMKKysrIGIvZnMvaGZzcGx1cy9pbm9kZS5jCkBAIC0xMzEsNiArMTMxLDExIEBACiAJLndyaXRlcGFnZXMJPSBoZnNwbHVzX3dyaXRlcGFnZXMsCiB9OwogCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaGZzcGx1c19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoICAgICAgID0gaGZzcGx1c19oYXNoX2RlbnRyeSwKKwkuZF9jb21wYXJlICAgID0gaGZzcGx1c19jb21wYXJlX2RlbnRyeSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZnNwbHVzX2ZpbGVfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKaW5kZXggZWJkMWIzOC4uNmQ4N2EyYSAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9zdXBlci5jCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtMjgzLDExICsyODMsMTAgQEAKIAlzdHJ1Y3QgbmxzX3RhYmxlICpubHMgPSBOVUxMOwogCWludCBlcnIgPSAtRUlOVkFMOwogCi0Jc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQoc2JpLCAwLCBzaXplb2YoSEZTUExVU19TQihzYikpKTsKIAlzYi0+c19mc19pbmZvID0gc2JpOwogCUlOSVRfSExJU1RfSEVBRCgmc2JpLT5yc3JjX2lub2Rlcyk7CiAJaGZzcGx1c19maWxsX2RlZmF1bHRzKHNiaSk7CkBAIC0zODEsNiArMzgwLDcgQEAKIAkJaXB1dChyb290KTsKIAkJZ290byBjbGVhbnVwOwogCX0KKwlzYi0+c19yb290LT5kX29wID0gJmhmc3BsdXNfZGVudHJ5X29wZXJhdGlvbnM7CiAKIAlzdHIubGVuID0gc2l6ZW9mKEhGU1BfSElEREVORElSX05BTUUpIC0gMTsKIAlzdHIubmFtZSA9IEhGU1BfSElEREVORElSX05BTUU7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3VuaWNvZGUuYyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCmluZGV4IDY4OWM4YmQuLjllMTBmOTQgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvdW5pY29kZS5jCisrKyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCkBAIC0yMzksNjEgKzIzOSwyMDEgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgaGZzcGx1c19hc2MydW5pKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqdXN0ciwgY29uc3QgY2hhciAqYXN0ciwgaW50IGxlbikKKy8qCisgKiBDb252ZXJ0IG9uZSBvciBtb3JlIEFTQ0lJIGNoYXJhY3RlcnMgaW50byBhIHNpbmdsZSB1bmljb2RlIGNoYXJhY3Rlci4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBBU0NJSSBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuaWNvZGUgY2hhci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXNjMnVuaWNoYXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqYXN0ciwgaW50IGxlbiwKKwkJCSAgICAgIHdjaGFyX3QgKnVjKQogewotCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IEhGU1BMVVNfU0Ioc2IpLm5sczsKLQlpbnQgc2l6ZSwgb2ZmLCBkZWNvbXBvc2U7CisJaW50IHNpemUgPSBIRlNQTFVTX1NCKHNiKS5ubHMtPmNoYXIydW5pKGFzdHIsIGxlbiwgdWMpOworCWlmIChzaXplIDw9IDApIHsKKwkJKnVjID0gJz8nOworCQlzaXplID0gMTsKKwl9CisJc3dpdGNoICgqdWMpIHsKKwljYXNlIDB4MjQwMDoKKwkJKnVjID0gMDsKKwkJYnJlYWs7CisJY2FzZSAnOic6CisJCSp1YyA9ICcvJzsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzaXplOworfQorCisvKiBEZWNvbXBvc2VzIGEgc2luZ2xlIHVuaWNvZGUgY2hhcmFjdGVyLiAqLworc3RhdGljIGlubGluZSB1MTYgKmRlY29tcG9zZV91bmljaGFyKHdjaGFyX3QgdWMsIGludCAqc2l6ZSkKK3sKKwlpbnQgb2ZmOworCisJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbKHVjID4+IDEyKSAmIDB4Zl07CisJaWYgKG9mZiA9PSAwIHx8IG9mZiA9PSAweGZmZmYpCisJCXJldHVybiBOVUxMOworCisJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKCh1YyA+PiA4KSAmIDB4ZildOworCWlmICghb2ZmKQorCQlyZXR1cm4gTlVMTDsKKworCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArICgodWMgPj4gNCkgJiAweGYpXTsKKwlpZiAoIW9mZikKKwkJcmV0dXJuIE5VTEw7CisKKwlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAodWMgJiAweGYpXTsKKwkqc2l6ZSA9IG9mZiAmIDM7CisJaWYgKCpzaXplID09IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiBoZnNwbHVzX2RlY29tcG9zZV90YWJsZSArIChvZmYgLyA0KTsKK30KKworaW50IGhmc3BsdXNfYXNjMnVuaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnVzdHIsCisJCSAgICBjb25zdCBjaGFyICphc3RyLCBpbnQgbGVuKQoreworCWludCBzaXplLCBkc2l6ZSwgZGVjb21wb3NlOworCXUxNiAqZHN0ciwgb3V0bGVuID0gMDsKIAl3Y2hhcl90IGM7Ci0JdTE2IG91dGxlbiA9IDA7CiAKIAlkZWNvbXBvc2UgPSAhKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9OT0RFQ09NUE9TRSk7Ci0KIAl3aGlsZSAob3V0bGVuIDwgSEZTUExVU19NQVhfU1RSTEVOICYmIGxlbiA+IDApIHsKLQkJc2l6ZSA9IG5scy0+Y2hhcjJ1bmkoYXN0ciwgbGVuLCAmYyk7Ci0JCWlmIChzaXplIDw9IDApIHsKLQkJCWMgPSAnPyc7Ci0JCQlzaXplID0gMTsKLQkJfQotCQlhc3RyICs9IHNpemU7Ci0JCWxlbiAtPSBzaXplOwotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAweDI0MDA6Ci0JCQljID0gMDsKLQkJCWJyZWFrOwotCQljYXNlICc6JzoKLQkJCWMgPSAnLyc7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYyA+PSAweGMwICYmIGRlY29tcG9zZSkgewotCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbKGMgPj4gMTIpICYgMHhmXTsKLQkJCWlmICghb2ZmKQotCQkJCWdvdG8gZG9uZTsKLQkJCWlmIChvZmYgPT0gMHhmZmZmKSB7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKChjID4+IDgpICYgMHhmKV07Ci0JCQlpZiAoIW9mZikKLQkJCQlnb3RvIGRvbmU7Ci0JCQlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAoKGMgPj4gNCkgJiAweGYpXTsKLQkJCWlmICghb2ZmKQotCQkJCWdvdG8gZG9uZTsKLQkJCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArIChjICYgMHhmKV07Ci0JCQlzaXplID0gb2ZmICYgMzsKLQkJCWlmICghc2l6ZSkKLQkJCQlnb3RvIGRvbmU7Ci0JCQlvZmYgLz0gNDsKLQkJCWlmIChvdXRsZW4gKyBzaXplID4gSEZTUExVU19NQVhfU1RSTEVOKQorCQlzaXplID0gYXNjMnVuaWNoYXIoc2IsIGFzdHIsIGxlbiwgJmMpOworCisJCWlmIChkZWNvbXBvc2UgJiYgKGRzdHIgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUpKSkgeworCQkJaWYgKG91dGxlbiArIGRzaXplID4gSEZTUExVU19NQVhfU1RSTEVOKQogCQkJCWJyZWFrOwogCQkJZG8gewotCQkJCXVzdHItPnVuaWNvZGVbb3V0bGVuKytdID0gY3B1X3RvX2JlMTYoaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmKytdKTsKLQkJCX0gd2hpbGUgKC0tc2l6ZSA+IDApOwotCQkJY29udGludWU7Ci0JCX0KLQlkb25lOgotCQl1c3RyLT51bmljb2RlW291dGxlbisrXSA9IGNwdV90b19iZTE2KGMpOworCQkJCXVzdHItPnVuaWNvZGVbb3V0bGVuKytdID0gY3B1X3RvX2JlMTYoKmRzdHIrKyk7CisJCQl9IHdoaWxlICgtLWRzaXplID4gMCk7CisJCX0gZWxzZQorCQkJdXN0ci0+dW5pY29kZVtvdXRsZW4rK10gPSBjcHVfdG9fYmUxNihjKTsKKworCQlhc3RyICs9IHNpemU7CisJCWxlbiAtPSBzaXplOwogCX0KIAl1c3RyLT5sZW5ndGggPSBjcHVfdG9fYmUxNihvdXRsZW4pOwogCWlmIChsZW4gPiAwKQogCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAlyZXR1cm4gMDsKIH0KKworLyoKKyAqIEhhc2ggYSBzdHJpbmcgdG8gYW4gaW50ZWdlciBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIEhGUysgZmlsZXN5c3RlbS4KKyAqIENvbXBvc2VkIHVuaWNvZGUgY2hhcmFjdGVycyBhcmUgZGVjb21wb3NlZCBhbmQgY2FzZS1mb2xkaW5nIGlzIHBlcmZvcm1lZAorICogaWYgdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlICh1bilzZXQgb24gdGhlIHN1cGVyYmxvY2suCisgKi8KK2ludCBoZnNwbHVzX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnN0cikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOworCWNvbnN0IGNoYXIgKmFzdHI7CisJY29uc3QgdTE2ICpkc3RyOworCWludCBjYXNlZm9sZCwgZGVjb21wb3NlLCBzaXplLCBkc2l6ZSwgbGVuOworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwl3Y2hhcl90IGM7CisJdTE2IGMyOworCisJY2FzZWZvbGQgPSAoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX0NBU0VGT0xEKTsKKwlkZWNvbXBvc2UgPSAhKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9OT0RFQ09NUE9TRSk7CisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJYXN0ciA9IHN0ci0+bmFtZTsKKwlsZW4gPSBzdHItPmxlbjsKKwl3aGlsZSAobGVuID4gMCkgeworCQlzaXplID0gYXNjMnVuaWNoYXIoc2IsIGFzdHIsIGxlbiwgJmMpOworCQlhc3RyICs9IHNpemU7CisJCWxlbiAtPSBzaXplOworCisJCWlmIChkZWNvbXBvc2UgJiYgKGRzdHIgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUpKSkgeworCQkJZG8geworCQkJCWMyID0gKmRzdHIrKzsKKwkJCQlpZiAoIWNhc2Vmb2xkIHx8IChjMiA9IGNhc2VfZm9sZChjMikpKQorCQkJCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYzIsIGhhc2gpOworCQkJfSB3aGlsZSAoLS1kc2l6ZSA+IDApOworCQl9IGVsc2UgeworCQkJYzIgPSBjOworCQkJaWYgKCFjYXNlZm9sZCB8fCAoYzIgPSBjYXNlX2ZvbGQoYzIpKSkKKwkJCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYzIsIGhhc2gpOworCQl9CisJfQorCXN0ci0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbXBhcmUgc3RyaW5ncyB3aXRoIEhGUysgZmlsZW5hbWUgb3JkZXJpbmcuCisgKiBDb21wb3NlZCB1bmljb2RlIGNoYXJhY3RlcnMgYXJlIGRlY29tcG9zZWQgYW5kIGNhc2UtZm9sZGluZyBpcyBwZXJmb3JtZWQKKyAqIGlmIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSAodW4pc2V0IG9uIHRoZSBzdXBlcmJsb2NrLgorICovCitpbnQgaGZzcGx1c19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpzMSwgc3RydWN0IHFzdHIgKnMyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisJaW50IGNhc2Vmb2xkLCBkZWNvbXBvc2UsIHNpemU7CisJaW50IGRzaXplMSwgZHNpemUyLCBsZW4xLCBsZW4yOworCWNvbnN0IHUxNiAqZHN0cjEsICpkc3RyMjsKKwljb25zdCBjaGFyICphc3RyMSwgKmFzdHIyOworCXUxNiBjMSwgYzI7CisJd2NoYXJfdCBjOworCisJY2FzZWZvbGQgPSAoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX0NBU0VGT0xEKTsKKwlkZWNvbXBvc2UgPSAhKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9OT0RFQ09NUE9TRSk7CisJYXN0cjEgPSBzMS0+bmFtZTsKKwlsZW4xID0gczEtPmxlbjsKKwlhc3RyMiA9IHMyLT5uYW1lOworCWxlbjIgPSBzMi0+bGVuOworCWRzaXplMSA9IGRzaXplMiA9IDA7CisJZHN0cjEgPSBkc3RyMiA9IE5VTEw7CisKKwl3aGlsZSAobGVuMSA+IDAgJiYgbGVuMiA+IDApIHsKKwkJaWYgKCFkc2l6ZTEpIHsKKwkJCXNpemUgPSBhc2MydW5pY2hhcihzYiwgYXN0cjEsIGxlbjEsICZjKTsKKwkJCWFzdHIxICs9IHNpemU7CisJCQlsZW4xIC09IHNpemU7CisKKwkJCWlmICghZGVjb21wb3NlIHx8ICEoZHN0cjEgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUxKSkpIHsKKwkJCQljMSA9IGM7CisJCQkJZHN0cjEgPSAmYzE7CisJCQkJZHNpemUxID0gMTsKKwkJCX0KKwkJfQorCisJCWlmICghZHNpemUyKSB7CisJCQlzaXplID0gYXNjMnVuaWNoYXIoc2IsIGFzdHIyLCBsZW4yLCAmYyk7CisJCQlhc3RyMiArPSBzaXplOworCQkJbGVuMiAtPSBzaXplOworCisJCQlpZiAoIWRlY29tcG9zZSB8fCAhKGRzdHIyID0gZGVjb21wb3NlX3VuaWNoYXIoYywgJmRzaXplMikpKSB7CisJCQkJYzIgPSBjOworCQkJCWRzdHIyID0gJmMyOworCQkJCWRzaXplMiA9IDE7CisJCQl9CisJCX0KKworCQljMSA9ICpkc3RyMTsKKwkJYzIgPSAqZHN0cjI7CisJCWlmIChjYXNlZm9sZCkgeworCQkJaWYgICghKGMxID0gY2FzZV9mb2xkKGMxKSkpIHsKKwkJCQlkc3RyMSsrOworCQkJCWRzaXplMS0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCEoYzIgPSBjYXNlX2ZvbGQoYzIpKSkgeworCQkJCWRzdHIyKys7CisJCQkJZHNpemUyLS07CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKGMxIDwgYzIpCisJCQlyZXR1cm4gLTE7CisJCWVsc2UgaWYgKGMxID4gYzIpCisJCQlyZXR1cm4gMTsKKworCQlkc3RyMSsrOworCQlkc2l6ZTEtLTsKKwkJZHN0cjIrKzsKKwkJZHNpemUyLS07CisJfQorCisJaWYgKGxlbjEgPCBsZW4yKQorCQlyZXR1cm4gLTE7CisJaWYgKGxlbjEgPiBsZW4yKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKaW5kZXggZTZiNDZiMy4uZDE0NWNiNyAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTEzLDE1ICsxMywxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ3LDYgKzUwLDIxIEBACiAKIGludCBzeXNjdGxfaHVnZXRsYl9zaG1fZ3JvdXA7CiAKK2VudW0geworCU9wdF9zaXplLCBPcHRfbnJfaW5vZGVzLAorCU9wdF9tb2RlLCBPcHRfdWlkLCBPcHRfZ2lkLAorCU9wdF9lcnIsCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJe09wdF9zaXplLAkic2l6ZT0lcyJ9LAorCXtPcHRfbnJfaW5vZGVzLAkibnJfaW5vZGVzPSVzIn0sCisJe09wdF9tb2RlLAkibW9kZT0lbyJ9LAorCXtPcHRfdWlkLAkidWlkPSV1In0sCisJe09wdF9naWQsCSJnaWQ9JXUifSwKKwl7T3B0X2VyciwJTlVMTH0sCit9OworCiBzdGF0aWMgdm9pZCBodWdlX3BhZ2V2ZWNfcmVsZWFzZShzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKIHsKIAlpbnQgaTsKQEAgLTU5NCw0NiArNjEyLDczIEBACiBzdGF0aWMgaW50CiBodWdldGxiZnNfcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3QgaHVnZXRsYmZzX2NvbmZpZyAqcGNvbmZpZykKIHsKLQljaGFyICpvcHQsICp2YWx1ZSwgKnJlc3Q7CisJY2hhciAqcCwgKnJlc3Q7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCBvcHRpb247CiAKIAlpZiAoIW9wdGlvbnMpCiAJCXJldHVybiAwOwotCXdoaWxlICgob3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghKm9wdCkKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCiAJCQljb250aW51ZTsKIAotCQl2YWx1ZSA9IHN0cmNocihvcHQsICc9Jyk7Ci0JCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQllbHNlCi0JCQkqdmFsdWUrKyA9ICdcMCc7CisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF91aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKyAJCQkJZ290byBiYWRfdmFsOworCQkJcGNvbmZpZy0+dWlkID0gb3B0aW9uOworCQkJYnJlYWs7CiAKLQkJaWYgKCFzdHJjbXAob3B0LCAidWlkIikpCi0JCQlwY29uZmlnLT51aWQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKLQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJnaWQiKSkKLQkJCXBjb25maWctPmdpZCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOwotCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm1vZGUiKSkKLQkJCXBjb25maWctPm1vZGUgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwmdmFsdWUsMCkgJiAwNzc3VTsKLQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJzaXplIikpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gbWVtcGFyc2UodmFsdWUsICZyZXN0KTsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisgCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCXBjb25maWctPmdpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCisJCWNhc2UgT3B0X21vZGU6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZvcHRpb24pKQorIAkJCQlnb3RvIGJhZF92YWw7CisJCQlwY29uZmlnLT5tb2RlID0gb3B0aW9uICYgMDc3N1U7CisJCQlicmVhazsKKworCQljYXNlIE9wdF9zaXplOiB7CisgCQkJdW5zaWduZWQgbG9uZyBsb25nIHNpemU7CisJCQkvKiBtZW1wYXJzZSgpIHdpbGwgYWNjZXB0IGEgSy9NL0cgd2l0aG91dCBhIGRpZ2l0ICovCisJCQlpZiAoIWlzZGlnaXQoKmFyZ3NbMF0uZnJvbSkpCisJCQkJZ290byBiYWRfdmFsOworCQkJc2l6ZSA9IG1lbXBhcnNlKGFyZ3NbMF0uZnJvbSwgJnJlc3QpOwogCQkJaWYgKCpyZXN0ID09ICclJykgewogCQkJCXNpemUgPDw9IEhQQUdFX1NISUZUOwogCQkJCXNpemUgKj0gbWF4X2h1Z2VfcGFnZXM7CiAJCQkJZG9fZGl2KHNpemUsIDEwMCk7Ci0JCQkJcmVzdCsrOwogCQkJfQogCQkJcGNvbmZpZy0+bnJfYmxvY2tzID0gKHNpemUgPj4gSFBBR0VfU0hJRlQpOwotCQkJdmFsdWUgPSByZXN0OwotCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCJucl9pbm9kZXMiKSkgewotCQkJcGNvbmZpZy0+bnJfaW5vZGVzID0gbWVtcGFyc2UodmFsdWUsICZyZXN0KTsKLQkJCXZhbHVlID0gcmVzdDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAKLQkJaWYgKCp2YWx1ZSkKKwkJY2FzZSBPcHRfbnJfaW5vZGVzOgorCQkJLyogbWVtcGFyc2UoKSB3aWxsIGFjY2VwdCBhIEsvTS9HIHdpdGhvdXQgYSBkaWdpdCAqLworCQkJaWYgKCFpc2RpZ2l0KCphcmdzWzBdLmZyb20pKQorCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCXBjb25maWctPm5yX2lub2RlcyA9IG1lbXBhcnNlKGFyZ3NbMF0uZnJvbSwgJnJlc3QpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiaHVnZXRsYmZzOiBCYWQgbW91bnQgb3B0aW9uOiBcIiVzXCJcbiIsCisJCQkJIHApOwogCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQogCX0KIAlyZXR1cm4gMDsKKworYmFkX3ZhbDoKKyAJcHJpbnRrKEtFUk5fRVJSICJodWdldGxiZnM6IEJhZCB2YWx1ZSAnJXMnIGZvciBtb3VudCBvcHRpb24gJyVzJ1xuIiwKKwkgICAgICAgYXJnc1swXS5mcm9tLCBwKTsKKyAJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTY1MSw3ICs2OTYsNiBAQAogCWNvbmZpZy5naWQgPSBjdXJyZW50LT5mc2dpZDsKIAljb25maWcubW9kZSA9IDA3NTU7CiAJcmV0ID0gaHVnZXRsYmZzX3BhcnNlX29wdGlvbnMoZGF0YSwgJmNvbmZpZyk7Ci0KIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCA5YTAxMmNjLi4zMjBlMDg4IDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQltYXBwaW5nLT5hX29wcyA9ICZlbXB0eV9hb3BzOwogIAkJbWFwcGluZy0+aG9zdCA9IGlub2RlOwogCQltYXBwaW5nLT5mbGFncyA9IDA7Ci0JCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9ISUdIVVNFUik7CisJCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9ISUdIVVNFUl9QQUdFQ0FDSEUpOwogCQltYXBwaW5nLT5hc3NvY19tYXBwaW5nID0gTlVMTDsKIAkJbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CiAKQEAgLTQ2Miw2ICs0NjIsMTEgQEAKIAlyZXR1cm4gKGlub2Rlc19zdGF0Lm5yX3VudXNlZCAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOwogfQogCitzdGF0aWMgc3RydWN0IHNocmlua2VyIGljYWNoZV9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gc2hyaW5rX2ljYWNoZV9tZW1vcnksCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKIHN0YXRpYyB2b2lkIF9fd2FpdF9vbl9mcmVlaW5nX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogLyoKICAqIENhbGxlZCB3aXRoIHRoZSBpbm9kZSBsb2NrIGhlbGQuCkBAIC01MTksNyArNTI0LDEzIEBACiAgKgluZXdfaW5vZGUgCS0gb2J0YWluIGFuIGlub2RlCiAgKglAc2I6IHN1cGVyYmxvY2sKICAqCi0gKglBbGxvY2F0ZXMgYSBuZXcgaW5vZGUgZm9yIGdpdmVuIHN1cGVyYmxvY2suCisgKglBbGxvY2F0ZXMgYSBuZXcgaW5vZGUgZm9yIGdpdmVuIHN1cGVyYmxvY2suIFRoZSBkZWZhdWx0IGdmcF9tYXNrCisgKglmb3IgYWxsb2NhdGlvbnMgcmVsYXRlZCB0byBpbm9kZS0+aV9tYXBwaW5nIGlzIEdGUF9ISUdIVVNFUl9QQUdFQ0FDSEUuCisgKglJZiBISUdITUVNIHBhZ2VzIGFyZSB1bnN1aXRhYmxlIG9yIGl0IGlzIGtub3duIHRoYXQgcGFnZXMgYWxsb2NhdGVkCisgKglmb3IgdGhlIHBhZ2UgY2FjaGUgYXJlIG5vdCByZWNsYWltYWJsZSBvciBtaWdyYXRhYmxlLAorICoJbWFwcGluZ19zZXRfZ2ZwX21hc2soKSBtdXN0IGJlIGNhbGxlZCB3aXRoIHN1aXRhYmxlIGZsYWdzIG9uIHRoZQorICoJbmV3bHkgY3JlYXRlZCBpbm9kZSdzIG1hcHBpbmcKKyAqCiAgKi8KIHN0cnVjdCBpbm9kZSAqbmV3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC0xMzc5LDcgKzEzOTAsNyBAQAogCQkJCQkgU0xBQl9NRU1fU1BSRUFEKSwKIAkJCQkJIGluaXRfb25jZSwKIAkJCQkJIE5VTEwpOwotCXNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBzaHJpbmtfaWNhY2hlX21lbW9yeSk7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmljYWNoZV9zaHJpbmtlcik7CiAKIAkvKiBIYXNoIG1heSBoYXZlIGJlZW4gc2V0IHVwIGluIGlub2RlX2luaXRfZWFybHkgKi8KIAlpZiAoIWhhc2hkaXN0KQpkaWZmIC0tZ2l0IGEvZnMvaW9jdGwuYyBiL2ZzL2lvY3RsLmMKaW5kZXggOGM5MGNiYy4uYzJhNzczZSAxMDA2NDQKLS0tIGEvZnMvaW9jdGwuYworKysgYi9mcy9pb2N0bC5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KQEAgLTIxLDcgKzIwLDYgQEAKIAkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJaW50IGVycm9yID0gLUVOT1RUWTsKLQl2b2lkICpmOwogCiAJaWYgKCFmaWxwLT5mX29wKQogCQlnb3RvIG91dDsKQEAgLTMxLDE2ICsyOSwxMCBAQAogCQlpZiAoZXJyb3IgPT0gLUVOT0lPQ1RMQ01EKQogCQkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKChmID0gZmlscC0+Zl9vcC0+aW9jdGwpKSB7CisJfSBlbHNlIGlmIChmaWxwLT5mX29wLT5pb2N0bCkgewogCQlsb2NrX2tlcm5lbCgpOwotCQlpZiAoIWZpbHAtPmZfb3AtPmlvY3RsKSB7Ci0JCQlwcmludGsoIiVzOiBpb2N0bCAlcCBkaXNhcHBlYXJlZFxuIiwgX19GVU5DVElPTl9fLCBmKTsKLQkJCXByaW50X3N5bWJvbCgic3ltYm9sOiAlc1xuIiwgKHVuc2lnbmVkIGxvbmcpZik7Ci0JCQlkdW1wX3N0YWNrKCk7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvciA9IGZpbHAtPmZfb3AtPmlvY3RsKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsCi0JCQkJCQkgIGZpbHAsIGNtZCwgYXJnKTsKLQkJfQorCQllcnJvciA9IGZpbHAtPmZfb3AtPmlvY3RsKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsCisJCQkJCSAgZmlscCwgY21kLCBhcmcpOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJfQogCkBAIC0xODIsMTEgKzE3NCwzIEBACiAgb3V0OgogCXJldHVybiBlcnJvcjsKIH0KLQotLyoKLSAqIFBsYXRmb3JtcyBpbXBsZW1lbnRpbmcgMzIgYml0IGNvbXBhdGliaWxpdHkgaW9jdGwgaGFuZGxlcnMgaW4KLSAqIG1vZHVsZXMgbmVlZCB0aGlzIGV4cG9ydGVkCi0gKi8KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1FWFBPUlRfU1lNQk9MKHN5c19pb2N0bCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2Rpci5jIGIvZnMvaXNvZnMvZGlyLmMKaW5kZXggMGU5NGMzMS4uMWJhNDA3YyAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvZGlyLmMKKysrIGIvZnMvaXNvZnMvZGlyLmMKQEAgLTcsMzQgKzcsMTggQEAKICAqCiAgKiAgU3RldmUgQmV5bm9uCQkgICAgICAgOiBNaXNzaW5nIGxhc3QgZGlyZWN0b3J5IGVudHJpZXMgZml4ZWQKICAqICAoc3RlcGhlbkBhc2tvbmUuZGVtb24uY28udWspICAgICAgOiAyMXN0IEp1bmUgMTk5NgotICogCisgKgogICogIGlzb2ZzIGRpcmVjdG9yeSBoYW5kbGluZyBmdW5jdGlvbnMKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSAiaXNvZnMuaCIKIAotc3RhdGljIGludCBpc29mc19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpc29mc19kaXJfb3BlcmF0aW9ucyA9Ci17Ci0JLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKLQkucmVhZGRpcgk9IGlzb2ZzX3JlYWRkaXIsCi19OwotCi0vKgotICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KLSAqLwotY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaXNvZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPQotewotCS5sb29rdXAJCT0gaXNvZnNfbG9va3VwLAotfTsKLQogaW50IGlzb2ZzX25hbWVfdHJhbnNsYXRlKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqZGUsIGNoYXIgKm5ldywgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAljaGFyICogb2xkID0gZGUtPm5hbWU7CiAJaW50IGxlbiA9IGRlLT5uYW1lX2xlblswXTsKIAlpbnQgaTsKLQkJCQorCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAJCXVuc2lnbmVkIGNoYXIgYyA9IG9sZFtpXTsKIAkJaWYgKCFjKQpAQCAtNjIsMjIgKzQ2LDI3IEBACiB9CiAKIC8qIEFjb3JuIGV4dGVuc2lvbnMgd3JpdHRlbiBieSBNYXR0aGV3IFdpbGNveCA8d2lsbHlAYm9maC5haT4gMTk5OCAqLwotaW50IGdldF9hY29ybl9maWxlbmFtZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZSwKLQkJCSAgICBjaGFyICogcmV0bmFtZSwgc3RydWN0IGlub2RlICogaW5vZGUpCitpbnQgZ2V0X2Fjb3JuX2ZpbGVuYW1lKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqZGUsCisJCQkgICAgY2hhciAqcmV0bmFtZSwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlpbnQgc3RkOwotCXVuc2lnbmVkIGNoYXIgKiBjaHI7CisJdW5zaWduZWQgY2hhciAqY2hyOwogCWludCByZXRuYW1sZW4gPSBpc29mc19uYW1lX3RyYW5zbGF0ZShkZSwgcmV0bmFtZSwgaW5vZGUpOwotCWlmIChyZXRuYW1sZW4gPT0gMCkgcmV0dXJuIDA7CisKKwlpZiAocmV0bmFtbGVuID09IDApCisJCXJldHVybiAwOwogCXN0ZCA9IHNpemVvZihzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQpICsgZGUtPm5hbWVfbGVuWzBdOwotCWlmIChzdGQgJiAxKSBzdGQrKzsKLQlpZiAoKCooKHVuc2lnbmVkIGNoYXIgKikgZGUpIC0gc3RkKSAhPSAzMikgcmV0dXJuIHJldG5hbWxlbjsKKwlpZiAoc3RkICYgMSkKKwkJc3RkKys7CisJaWYgKCgqKCh1bnNpZ25lZCBjaGFyICopIGRlKSAtIHN0ZCkgIT0gMzIpCisJCXJldHVybiByZXRuYW1sZW47CiAJY2hyID0gKCh1bnNpZ25lZCBjaGFyICopIGRlKSArIHN0ZDsKLQlpZiAoc3RybmNtcChjaHIsICJBUkNISU1FREVTIiwgMTApKSByZXR1cm4gcmV0bmFtbGVuOwotCWlmICgoKnJldG5hbWUgPT0gJ18nKSAmJiAoKGNoclsxOV0gJiAxKSA9PSAxKSkgKnJldG5hbWUgPSAnISc7CisJaWYgKHN0cm5jbXAoY2hyLCAiQVJDSElNRURFUyIsIDEwKSkKKwkJcmV0dXJuIHJldG5hbWxlbjsKKwlpZiAoKCpyZXRuYW1lID09ICdfJykgJiYgKChjaHJbMTldICYgMSkgPT0gMSkpCisJCSpyZXRuYW1lID0gJyEnOwogCWlmICgoKGRlLT5mbGFnc1swXSAmIDIpID09IDApICYmIChjaHJbMTNdID09IDB4ZmYpCi0JCSYmICgoY2hyWzEyXSAmIDB4ZjApID09IDB4ZjApKQotCXsKKwkJJiYgKChjaHJbMTJdICYgMHhmMCkgPT0gMHhmMCkpIHsKIAkJcmV0bmFtZVtyZXRuYW1sZW5dID0gJywnOwogCQlzcHJpbnRmKHJldG5hbWUrcmV0bmFtbGVuKzEsICIlMy4zeCIsCiAJCQkoKGNoclsxMl0gJiAweGYpIDw8IDgpIHwgY2hyWzExXSk7CkBAIC05MSw3ICs4MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZG9faXNvZnNfcmVhZGRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpciwKLQkJY2hhciAqIHRtcG5hbWUsIHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIHRtcGRlKQorCQljaGFyICp0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKnRtcGRlKQogewogCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmJpdHMgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7CkBAIC0xMjEsOSArMTEwLDExIEBACiAKIAkJZGVfbGVuID0gKih1bnNpZ25lZCBjaGFyICopIGRlOwogCi0JCS8qIElmIHRoZSBsZW5ndGggYnl0ZSBpcyB6ZXJvLCB3ZSBzaG91bGQgbW92ZSBvbiB0byB0aGUgbmV4dAotCQkgICBDRFJPTSBzZWN0b3IuICBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5LCB3ZQotCQkgICBraWNrIG91dCBvZiB0aGUgd2hpbGUgbG9vcC4gKi8KKwkJLyoKKwkJICogSWYgdGhlIGxlbmd0aCBieXRlIGlzIHplcm8sIHdlIHNob3VsZCBtb3ZlIG9uIHRvIHRoZSBuZXh0CisJCSAqIENEUk9NIHNlY3Rvci4gIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnksIHdlCisJCSAqIGtpY2sgb3V0IG9mIHRoZSB3aGlsZSBsb29wLgorCQkgKi8KIAogCQlpZiAoZGVfbGVuID09IDApIHsKIAkJCWJyZWxzZShiaCk7CkBAIC0xNTcsMTEgKzE0OCwxMCBAQAogCiAJCWlmIChmaXJzdF9kZSkgewogCQkJaXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoZGUsCi0JCQkJCQkJICZibG9ja19zYXZlZCwKLQkJCQkJCQkgJm9mZnNldF9zYXZlZCk7CisJCQkJCQkJJmJsb2NrX3NhdmVkLAorCQkJCQkJCSZvZmZzZXRfc2F2ZWQpOwogCQkJaW5vZGVfbnVtYmVyID0gaXNvZnNfZ2V0X2lubyhibG9ja19zYXZlZCwKLQkJCQkJCSAgICAgb2Zmc2V0X3NhdmVkLAotCQkJCQkJICAgICBidWZiaXRzKTsKKwkJCQkJCQlvZmZzZXRfc2F2ZWQsIGJ1ZmJpdHMpOwogCQl9CiAKIAkJaWYgKGRlLT5mbGFnc1stc2JpLT5zX2hpZ2hfc2llcnJhXSAmIDB4ODApIHsKQEAgLTE5OSw3ICsxODksNyBAQAogCQkgKi8KIAkJaWYgKChzYmktPnNfaGlkZSA9PSAneScgJiYKIAkJCQkoZGUtPmZsYWdzWy1zYmktPnNfaGlnaF9zaWVycmFdICYgMSkpIHx8Ci0JCSAgICAgIChzYmktPnNfc2hvd2Fzc29jID09J24nICYmCisJCQkJKHNiaS0+c19zaG93YXNzb2MgPT0nbicgJiYKIAkJCQkoZGUtPmZsYWdzWy1zYmktPnNfaGlnaF9zaWVycmFdICYgNCkpKSB7CiAJCQlmaWxwLT5mX3BvcyArPSBkZV9sZW47CiAJCQljb250aW51ZTsKQEAgLTI0MCw3ICsyMzAsOCBAQAogCiAJCWNvbnRpbnVlOwogCX0KLQlpZiAoYmgpIGJyZWxzZShiaCk7CisJaWYgKGJoKQorCQlicmVsc2UoYmgpOwogCXJldHVybiAwOwogfQogCkBAIC0yNTMsOCArMjQ0LDggQEAKIAkJdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlpbnQgcmVzdWx0OwotCWNoYXIgKiB0bXBuYW1lOwotCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIHRtcGRlOworCWNoYXIgKnRtcG5hbWU7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICp0bXBkZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCXRtcG5hbWUgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKQEAgLTI3MCwzICsyNjEsMTkgQEAKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpc29mc19kaXJfb3BlcmF0aW9ucyA9Cit7CisJLnJlYWQgPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyID0gaXNvZnNfcmVhZGRpciwKK307CisKKy8qCisgKiBkaXJlY3RvcmllcyBjYW4gaGFuZGxlIG1vc3Qgb3BlcmF0aW9ucy4uLgorICovCitjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBpc29mc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmxvb2t1cCA9IGlzb2ZzX2xvb2t1cCwKK307CisKKwpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvaW5vZGUuYyBiL2ZzL2lzb2ZzL2lub2RlLmMKaW5kZXggNWMzZWVjZi4uNGY1NDE4YiAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvaW5vZGUuYworKysgYi9mcy9pc29mcy9pbm9kZS5jCkBAIC03MywyMCArNzMsMjAgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoaXNvZnNfaW5vZGVfY2FjaGVwLCBJU09GU19JKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gZm9vOwogCiAJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKIH0KLSAKKwogc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKIHsKIAlpc29mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXNvZnNfaW5vZGVfY2FjaGUiLAotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLAotCQkJCQkgICAgIDAsIChTTEFCX1JFQ0xBSU1fQUNDT1VOVHwKLQkJCQkJCVNMQUJfTUVNX1NQUkVBRCksCi0JCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpc29faW5vZGVfaW5mbyksCisJCQkJCTAsIChTTEFCX1JFQ0xBSU1fQUNDT1VOVHwKKwkJCQkJU0xBQl9NRU1fU1BSRUFEKSwKKwkJCQkJaW5pdF9vbmNlLCBOVUxMKTsKIAlpZiAoaXNvZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXJldHVybiAwOwpAQCAtMTUwLDkgKzE1MCw5IEBACiAJdWlkX3QgdWlkOwogCWNoYXIgKmlvY2hhcnNldDsKIAl1bnNpZ25lZCBjaGFyIHV0Zjg7Ci0gICAgICAgIC8qIExWRSAqLwotICAgICAgICBzMzIgc2Vzc2lvbjsKLSAgICAgICAgczMyIHNic2VjdG9yOworCS8qIExWRSAqLworCXMzMiBzZXNzaW9uOworCXMzMiBzYnNlY3RvcjsKIH07CiAKIC8qCkBAIC0xOTcsNyArMTk3LDcgQEAKIAloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKIAl3aGlsZSAobGVuLS0pIHsKIAkJYyA9IHRvbG93ZXIoKm5hbWUrKyk7Ci0JCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaCh0b2xvd2VyKGMpLCBoYXNoKTsKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGMsIGhhc2gpOwogCX0KIAlxc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKIApAQCAtMzYwLDEwICszNjAsMTIgQEAKIAlwb3B0LT5jaGVjayA9ICd1JzsJCS8qIHVuc2V0ICovCiAJcG9wdC0+bm9jb21wcmVzcyA9IDA7CiAJcG9wdC0+YmxvY2tzaXplID0gMTAyNDsKLQlwb3B0LT5tb2RlID0gU19JUlVHTyB8IFNfSVhVR087IC8qIHIteCBmb3IgYWxsLiAgVGhlIGRpc2MgY291bGQKLQkJCQkJICAgYmUgc2hhcmVkIHdpdGggRE9TIG1hY2hpbmVzIHNvCi0JCQkJCSAgIHZpcnR1YWxseSBhbnl0aGluZyBjb3VsZCBiZQotCQkJCQkgICBhIHZhbGlkIGV4ZWN1dGFibGUuICovCisJcG9wdC0+bW9kZSA9IFNfSVJVR08gfCBTX0lYVUdPOyAvKgorCQkJCQkgKiByLXggZm9yIGFsbC4gIFRoZSBkaXNjIGNvdWxkCisJCQkJCSAqIGJlIHNoYXJlZCB3aXRoIERPUyBtYWNoaW5lcyBzbworCQkJCQkgKiB2aXJ0dWFsbHkgYW55dGhpbmcgY291bGQgYmUKKwkJCQkJICogYSB2YWxpZCBleGVjdXRhYmxlLgorCQkJCQkgKi8KIAlwb3B0LT5naWQgPSAwOwogCXBvcHQtPnVpZCA9IDA7CiAJcG9wdC0+aW9jaGFyc2V0ID0gTlVMTDsKQEAgLTUwMywzMCArNTA1LDMwIEBACiAJCVRlLmNkdGVfZm9ybWF0PUNEUk9NX0xCQTsKIAkJaSA9IGlvY3RsX2J5X2JkZXYoYmRldiwgQ0RST01SRUFEVE9DRU5UUlksICh1bnNpZ25lZCBsb25nKSAmVGUpOwogCQlpZiAoIWkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJTZXNzaW9uICVkIHN0YXJ0ICVkIHR5cGUgJWRcbiIsCi0JCQkgICAgICAgc2Vzc2lvbiwgVGUuY2R0ZV9hZGRyLmxiYSwKLQkJCSAgICAgICBUZS5jZHRlX2N0cmwmQ0RST01fREFUQV9UUkFDSyk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IFNlc3Npb24gJWQgc3RhcnQgJWQgdHlwZSAlZFxuIiwKKwkJCQlzZXNzaW9uLCBUZS5jZHRlX2FkZHIubGJhLAorCQkJCVRlLmNkdGVfY3RybCZDRFJPTV9EQVRBX1RSQUNLKTsKIAkJCWlmICgoVGUuY2R0ZV9jdHJsJkNEUk9NX0RBVEFfVFJBQ0spID09IDQpCiAJCQkJcmV0dXJuIFRlLmNkdGVfYWRkci5sYmE7CiAJCX0KLQkJCQotCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgc2Vzc2lvbiBudW1iZXIgb3IgdHlwZSBvZiB0cmFja1xuIik7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJJU09GUzogSW52YWxpZCBzZXNzaW9uIG51bWJlciBvciB0eXBlIG9mIHRyYWNrXG4iKTsKIAl9CiAJaSA9IGlvY3RsX2J5X2JkZXYoYmRldiwgQ0RST01NVUxUSVNFU1NJT04sICh1bnNpZ25lZCBsb25nKSAmbXNfaW5mbyk7CiAJaWYgKHNlc3Npb24gPiAwKQotCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgc2Vzc2lvbiBudW1iZXJcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIklTT0ZTOiBJbnZhbGlkIHNlc3Npb24gbnVtYmVyXG4iKTsKICNpZiAwCi0JcHJpbnRrKCJpc29mcy5pbm9kZTogQ0RST01NVUxUSVNFU1NJT046IHJjPSVkXG4iLGkpOworCXByaW50ayhLRVJOX0RFQlVHICJpc29mcy5pbm9kZTogQ0RST01NVUxUSVNFU1NJT046IHJjPSVkXG4iLGkpOwogCWlmIChpPT0wKSB7Ci0JCXByaW50aygiaXNvZnMuaW5vZGU6IFhBIGRpc2s6ICVzXG4iLG1zX2luZm8ueGFfZmxhZz8ieWVzIjoibm8iKTsKLQkJcHJpbnRrKCJpc29mcy5pbm9kZTogdm9sX2Rlc2Nfc3RhcnQgPSAlZFxuIiwgbXNfaW5mby5hZGRyLmxiYSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJpc29mcy5pbm9kZTogWEEgZGlzazogJXNcbiIsbXNfaW5mby54YV9mbGFnPyJ5ZXMiOiJubyIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaXNvZnMuaW5vZGU6IHZvbF9kZXNjX3N0YXJ0ID0gJWRcbiIsIG1zX2luZm8uYWRkci5sYmEpOwogCX0KICNlbmRpZgogCWlmIChpPT0wKQogI2lmIFdFX09CRVlfVEhFX1dSSVRURU5fU1RBTkRBUkRTCi0gICAgICAgIGlmIChtc19pbmZvLnhhX2ZsYWcpIC8qIG5lY2Vzc2FyeSBmb3IgYSB2YWxpZCBtc19pbmZvLmFkZHIgKi8KKwkJaWYgKG1zX2luZm8ueGFfZmxhZykgLyogbmVjZXNzYXJ5IGZvciBhIHZhbGlkIG1zX2luZm8uYWRkciAqLwogI2VuZGlmCi0JCXZvbF9kZXNjX3N0YXJ0PW1zX2luZm8uYWRkci5sYmE7CisJCQl2b2xfZGVzY19zdGFydD1tc19pbmZvLmFkZHIubGJhOwogCXJldHVybiB2b2xfZGVzY19zdGFydDsKIH0KIApAQCAtNTM4LDIwICs1NDAsMjAgQEAKICAqLwogc3RhdGljIGludCBpc29mc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJICAgICAgKiBiaCA9IE5VTEwsICpwcmlfYmggPSBOVUxMOwotCXN0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgICogaF9wcmkgPSBOVUxMOwotCXN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICogcHJpID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTCwgKnByaV9iaCA9IE5VTEw7CisJc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciAqaF9wcmkgPSBOVUxMOworCXN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICpwcmkgPSBOVUxMOwogCXN0cnVjdCBpc29fc3VwcGxlbWVudGFyeV9kZXNjcmlwdG9yICpzZWMgPSBOVUxMOwotCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAgICogcm9vdHA7Ci0JaW50CQkJCWpvbGlldF9sZXZlbCA9IDA7Ci0JaW50CQkJCWlzb19ibGtudW0sIGJsb2NrOwotCWludAkJCQlvcmlnX3pvbmVzaXplOwotCWludAkJCQl0YWJsZTsKLQl1bnNpZ25lZCBpbnQJCQl2b2xfZGVzY19zdGFydDsKLQl1bnNpZ25lZCBsb25nCQkJZmlyc3RfZGF0YV96b25lOwotCXN0cnVjdCBpbm9kZQkJICAgICAgKiBpbm9kZTsKLQlzdHJ1Y3QgaXNvOTY2MF9vcHRpb25zCQlvcHQ7Ci0Jc3RydWN0IGlzb2ZzX3NiX2luZm8JICAgICAgKiBzYmk7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpyb290cDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBpc285NjYwX29wdGlvbnMgb3B0OworCXN0cnVjdCBpc29mc19zYl9pbmZvICpzYmk7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9kYXRhX3pvbmU7CisJaW50IGpvbGlldF9sZXZlbCA9IDA7CisJaW50IGlzb19ibGtudW0sIGJsb2NrOworCWludCBvcmlnX3pvbmVzaXplOworCWludCB0YWJsZTsKKwl1bnNpZ25lZCBpbnQgdm9sX2Rlc2Nfc3RhcnQ7CiAKIAlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCkBAIC01NzcsNzIgKzU3OSw3MyBAQAogCXZvbF9kZXNjX3N0YXJ0ID0gKG9wdC5zYnNlY3RvciAhPSAtMSkgPwogCQlvcHQuc2JzZWN0b3IgOiBpc29mc19nZXRfbGFzdF9zZXNzaW9uKHMsb3B0LnNlc3Npb24pOwogCi0gIAlmb3IgKGlzb19ibGtudW0gPSB2b2xfZGVzY19zdGFydCsxNjsKLSAgICAgICAgICAgICBpc29fYmxrbnVtIDwgdm9sX2Rlc2Nfc3RhcnQrMTAwOyBpc29fYmxrbnVtKyspCi0JewotCSAgICBzdHJ1Y3QgaHNfdm9sdW1lX2Rlc2NyaXB0b3IgICAqIGhkcDsKLQkgICAgc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAgKiB2ZHA7CisJZm9yIChpc29fYmxrbnVtID0gdm9sX2Rlc2Nfc3RhcnQrMTY7CisJCWlzb19ibGtudW0gPCB2b2xfZGVzY19zdGFydCsxMDA7IGlzb19ibGtudW0rKykgeworCQlzdHJ1Y3QgaHNfdm9sdW1lX2Rlc2NyaXB0b3IgKmhkcDsKKwkJc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAgKnZkcDsKIAotCSAgICBibG9jayA9IGlzb19ibGtudW0gPDwgKElTT0ZTX0JMT0NLX0JJVFMgLSBzLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkgICAgaWYgKCEoYmggPSBzYl9icmVhZChzLCBibG9jaykpKQotCQlnb3RvIG91dF9ub19yZWFkOworCQlibG9jayA9IGlzb19ibGtudW0gPDwgKElTT0ZTX0JMT0NLX0JJVFMgLSBzLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJaWYgKCEoYmggPSBzYl9icmVhZChzLCBibG9jaykpKQorCQkJZ290byBvdXRfbm9fcmVhZDsKIAotCSAgICB2ZHAgPSAoc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAqKWJoLT5iX2RhdGE7Ci0JICAgIGhkcCA9IChzdHJ1Y3QgaHNfdm9sdW1lX2Rlc2NyaXB0b3IgKiliaC0+Yl9kYXRhOwotCSAgICAKLQkgICAgLyogRHVlIHRvIHRoZSBvdmVybGFwcGluZyBwaHlzaWNhbCBsb2NhdGlvbiBvZiB0aGUgZGVzY3JpcHRvcnMsIAotCSAgICAgKiBJU08gQ0RzIGNhbiBtYXRjaCBoZHAtPmlkPT1IU19TVEFOREFSRF9JRCBhcyB3ZWxsLiBUbyBlbnN1cmUgCi0JICAgICAqIHByb3BlciBpZGVudGlmaWNhdGlvbiBpbiB0aGlzIGNhc2UsIHdlIGZpcnN0IGNoZWNrIGZvciBJU08uCi0JICAgICAqLwotCSAgICBpZiAoc3RybmNtcCAodmRwLT5pZCwgSVNPX1NUQU5EQVJEX0lELCBzaXplb2YgdmRwLT5pZCkgPT0gMCkgewotCQlpZiAoaXNvbnVtXzcxMSAodmRwLT50eXBlKSA9PSBJU09fVkRfRU5EKQotCQkgICAgYnJlYWs7Ci0JCWlmIChpc29udW1fNzExICh2ZHAtPnR5cGUpID09IElTT19WRF9QUklNQVJZKSB7Ci0JCSAgICBpZiAocHJpID09IE5VTEwpIHsKLQkJCXByaSA9IChzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqKXZkcDsKLQkJCS8qIFNhdmUgdGhlIGJ1ZmZlciBpbiBjYXNlIHdlIG5lZWQgaXQgLi4uICovCi0JCQlwcmlfYmggPSBiaDsKLQkJCWJoID0gTlVMTDsKLQkJICAgIH0KLQkJfQotI2lmZGVmIENPTkZJR19KT0xJRVQKLQkJZWxzZSBpZiAoaXNvbnVtXzcxMSAodmRwLT50eXBlKSA9PSBJU09fVkRfU1VQUExFTUVOVEFSWSkgewotCQkgICAgc2VjID0gKHN0cnVjdCBpc29fc3VwcGxlbWVudGFyeV9kZXNjcmlwdG9yICopdmRwOwotCQkgICAgaWYgKHNlYy0+ZXNjYXBlWzBdID09IDB4MjUgJiYgc2VjLT5lc2NhcGVbMV0gPT0gMHgyZikgewotCQkJaWYgKG9wdC5qb2xpZXQgPT0gJ3knKSB7Ci0JCQkgICAgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDApIHsKLQkJCQlqb2xpZXRfbGV2ZWwgPSAxOwotCQkJICAgIH0gZWxzZSBpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0MykgewotCQkJCWpvbGlldF9sZXZlbCA9IDI7Ci0JCQkgICAgfSBlbHNlIGlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQ1KSB7Ci0JCQkJam9saWV0X2xldmVsID0gMzsKLQkJCSAgICB9Ci0JCQkgICAgcHJpbnRrKEtFUk5fREVCVUciSVNPIDk2NjAgRXh0ZW5zaW9uczogTWljcm9zb2Z0IEpvbGlldCBMZXZlbCAlZFxuIiwKLQkJCQkgICBqb2xpZXRfbGV2ZWwpOworCQl2ZHAgPSAoc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAqKWJoLT5iX2RhdGE7CisJCWhkcCA9IChzdHJ1Y3QgaHNfdm9sdW1lX2Rlc2NyaXB0b3IgKiliaC0+Yl9kYXRhOworCisJCS8qCisJCSAqIER1ZSB0byB0aGUgb3ZlcmxhcHBpbmcgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIGRlc2NyaXB0b3JzLAorCQkgKiBJU08gQ0RzIGNhbiBtYXRjaCBoZHAtPmlkPT1IU19TVEFOREFSRF9JRCBhcyB3ZWxsLiBUbyBlbnN1cmUKKwkJICogcHJvcGVyIGlkZW50aWZpY2F0aW9uIGluIHRoaXMgY2FzZSwgd2UgZmlyc3QgY2hlY2sgZm9yIElTTy4KKwkJICovCisJCWlmIChzdHJuY21wICh2ZHAtPmlkLCBJU09fU1RBTkRBUkRfSUQsIHNpemVvZiB2ZHAtPmlkKSA9PSAwKSB7CisJCQlpZiAoaXNvbnVtXzcxMSh2ZHAtPnR5cGUpID09IElTT19WRF9FTkQpCisJCQkJYnJlYWs7CisJCQlpZiAoaXNvbnVtXzcxMSh2ZHAtPnR5cGUpID09IElTT19WRF9QUklNQVJZKSB7CisJCQkJaWYgKHByaSA9PSBOVUxMKSB7CisJCQkJCXByaSA9IChzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqKXZkcDsKKwkJCQkJLyogU2F2ZSB0aGUgYnVmZmVyIGluIGNhc2Ugd2UgbmVlZCBpdCAuLi4gKi8KKwkJCQkJcHJpX2JoID0gYmg7CisJCQkJCWJoID0gTlVMTDsKKwkJCQl9CiAJCQl9Ci0JCQlnb3RvIHJvb3RfZm91bmQ7Ci0JCSAgICB9IGVsc2UgewotCQkJLyogVW5rbm93biBzdXBwbGVtZW50YXJ5IHZvbHVtZSBkZXNjcmlwdG9yICovCi0JCQlzZWMgPSBOVUxMOwotCQkgICAgfQotCQl9CisjaWZkZWYgQ09ORklHX0pPTElFVAorCQkJZWxzZSBpZiAoaXNvbnVtXzcxMSh2ZHAtPnR5cGUpID09IElTT19WRF9TVVBQTEVNRU5UQVJZKSB7CisJCQkJc2VjID0gKHN0cnVjdCBpc29fc3VwcGxlbWVudGFyeV9kZXNjcmlwdG9yICopdmRwOworCQkJCWlmIChzZWMtPmVzY2FwZVswXSA9PSAweDI1ICYmIHNlYy0+ZXNjYXBlWzFdID09IDB4MmYpIHsKKwkJCQkJaWYgKG9wdC5qb2xpZXQgPT0gJ3knKSB7CisJCQkJCQlpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0MCkKKwkJCQkJCQlqb2xpZXRfbGV2ZWwgPSAxOworCQkJCQkJZWxzZSBpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0MykKKwkJCQkJCQlqb2xpZXRfbGV2ZWwgPSAyOworCQkJCQkJZWxzZSBpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0NSkKKwkJCQkJCQlqb2xpZXRfbGV2ZWwgPSAzOworCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNPIDk2NjAgRXh0ZW5zaW9uczogIgorCQkJCQkJCSJNaWNyb3NvZnQgSm9saWV0IExldmVsICVkXG4iLAorCQkJCQkJCWpvbGlldF9sZXZlbCk7CisJCQkJCX0KKwkJCQkJZ290byByb290X2ZvdW5kOworCQkJCX0gZWxzZSB7CisJCQkJLyogVW5rbm93biBzdXBwbGVtZW50YXJ5IHZvbHVtZSBkZXNjcmlwdG9yICovCisJCQkJc2VjID0gTlVMTDsKKwkJCQl9CisJCQl9CiAjZW5kaWYKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIGlmIChzdHJuY21wIChoZHAtPmlkLCBIU19TVEFOREFSRF9JRCwgc2l6ZW9mIGhkcC0+aWQpID09IDApIHsKLQkJICAgIGlmIChpc29udW1fNzExIChoZHAtPnR5cGUpICE9IElTT19WRF9QUklNQVJZKQotCQkgICAgICAgIGdvdG8gb3V0X2ZyZWViaDsKLQkJCi0JCSAgICBzYmktPnNfaGlnaF9zaWVycmEgPSAxOwotCQkgICAgb3B0LnJvY2sgPSAnbic7Ci0JCSAgICBoX3ByaSA9IChzdHJ1Y3QgaHNfcHJpbWFyeV9kZXNjcmlwdG9yICopdmRwOwotCQkgICAgZ290byByb290X2ZvdW5kOworCQl9IGVsc2UgeworCQkJaWYgKHN0cm5jbXAgKGhkcC0+aWQsIEhTX1NUQU5EQVJEX0lELCBzaXplb2YgaGRwLT5pZCkgPT0gMCkgeworCQkJCWlmIChpc29udW1fNzExKGhkcC0+dHlwZSkgIT0gSVNPX1ZEX1BSSU1BUlkpCisJCQkJCWdvdG8gb3V0X2ZyZWViaDsKKworCQkJCXNiaS0+c19oaWdoX3NpZXJyYSA9IDE7CisJCQkJb3B0LnJvY2sgPSAnbic7CisJCQkJaF9wcmkgPSAoc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciAqKXZkcDsKKwkJCQlnb3RvIHJvb3RfZm91bmQ7CisJCQl9CiAJCX0KLQkgICAgfQogCi0gICAgICAgICAgICAvKiBKdXN0IHNraXAgYW55IHZvbHVtZSBkZXNjcmlwdG9ycyB3ZSBkb24ndCByZWNvZ25pemUgKi8KKwkJLyogSnVzdCBza2lwIGFueSB2b2x1bWUgZGVzY3JpcHRvcnMgd2UgZG9uJ3QgcmVjb2duaXplICovCiAKLQkgICAgYnJlbHNlKGJoKTsKLQkgICAgYmggPSBOVUxMOworCQlicmVsc2UoYmgpOworCQliaCA9IE5VTEw7CiAJfQogCS8qCiAJICogSWYgd2UgZmFsbCB0aHJvdWdoLCBlaXRoZXIgbm8gdm9sdW1lIGRlc2NyaXB0b3Igd2FzIGZvdW5kLApAQCAtNjU3LDI0ICs2NjAsMjQgQEAKIHJvb3RfZm91bmQ6CiAKIAlpZiAoam9saWV0X2xldmVsICYmIChwcmkgPT0gTlVMTCB8fCBvcHQucm9jayA9PSAnbicpKSB7Ci0JICAgIC8qIFRoaXMgaXMgdGhlIGNhc2Ugb2YgSm9saWV0IHdpdGggdGhlIG5vcm9jayBtb3VudCBmbGFnLgotCSAgICAgKiBBIGRpc2Mgd2l0aCBib3RoIEpvbGlldCBhbmQgUm9jayBSaWRnZSBpcyBoYW5kbGVkIGxhdGVyCi0JICAgICAqLwotCSAgICBwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKikgc2VjOworCQkvKiBUaGlzIGlzIHRoZSBjYXNlIG9mIEpvbGlldCB3aXRoIHRoZSBub3JvY2sgbW91bnQgZmxhZy4KKwkJICogQSBkaXNjIHdpdGggYm90aCBKb2xpZXQgYW5kIFJvY2sgUmlkZ2UgaXMgaGFuZGxlZCBsYXRlcgorCQkgKi8KKwkJcHJpID0gKHN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICopIHNlYzsKIAl9CiAKIAlpZihzYmktPnNfaGlnaF9zaWVycmEpewotCSAgcm9vdHAgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIGhfcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7Ci0JICBzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyAoaF9wcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKLQkgIHNiaS0+c19sb2dfem9uZV9zaXplID0gaXNvbnVtXzcyMyAoaF9wcmktPmxvZ2ljYWxfYmxvY2tfc2l6ZSk7Ci0JICBzYmktPnNfbWF4X3NpemUgPSBpc29udW1fNzMzKGhfcHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJCXJvb3RwID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKSBoX3ByaS0+cm9vdF9kaXJlY3RvcnlfcmVjb3JkOworCQlzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyhoX3ByaS0+dm9sdW1lX3NwYWNlX3NpemUpOworCQlzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMoaF9wcmktPmxvZ2ljYWxfYmxvY2tfc2l6ZSk7CisJCXNiaS0+c19tYXhfc2l6ZSA9IGlzb251bV83MzMoaF9wcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKIAl9IGVsc2UgewotCSAgaWYgKCFwcmkpCi0JICAgIGdvdG8gb3V0X2ZyZWViaDsKLQkgIHJvb3RwID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKSBwcmktPnJvb3RfZGlyZWN0b3J5X3JlY29yZDsKLQkgIHNiaS0+c19uem9uZXMgPSBpc29udW1fNzMzIChwcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKLQkgIHNiaS0+c19sb2dfem9uZV9zaXplID0gaXNvbnVtXzcyMyAocHJpLT5sb2dpY2FsX2Jsb2NrX3NpemUpOwotCSAgc2JpLT5zX21heF9zaXplID0gaXNvbnVtXzczMyhwcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKKwkJaWYgKCFwcmkpCisJCQlnb3RvIG91dF9mcmVlYmg7CisJCXJvb3RwID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKSBwcmktPnJvb3RfZGlyZWN0b3J5X3JlY29yZDsKKwkJc2JpLT5zX256b25lcyA9IGlzb251bV83MzMocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJCXNiaS0+c19sb2dfem9uZV9zaXplID0gaXNvbnVtXzcyMyhwcmktPmxvZ2ljYWxfYmxvY2tfc2l6ZSk7CisJCXNiaS0+c19tYXhfc2l6ZSA9IGlzb251bV83MzMocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CiAJfQogCiAJc2JpLT5zX25pbm9kZXMgPSAwOyAvKiBObyB3YXkgdG8gZmlndXJlIHRoaXMgb3V0IGVhc2lseSAqLwpAQCAtNjg3LDQyICs2OTAsNDMgQEAKIAkgKiBibG9ja3MgdGhhdCB3ZXJlIDUxMiBieXRlcyAod2hpY2ggc2hvdWxkIG9ubHkgdmVyeSByYXJlbHkKIAkgKiBoYXBwZW4uKQogCSAqLwotCWlmKG9yaWdfem9uZXNpemUgPCBvcHQuYmxvY2tzaXplKQorCWlmIChvcmlnX3pvbmVzaXplIDwgb3B0LmJsb2Nrc2l6ZSkKIAkJZ290byBvdXRfYmFkX3NpemU7CiAKIAkvKiBSREU6IGNvbnZlcnQgbG9nIHpvbmUgc2l6ZSB0byBiaXQgc2hpZnQgKi8KLQlzd2l0Y2ggKHNiaS0+c19sb2dfem9uZV9zaXplKQotCSAgeyBjYXNlICA1MTI6IHNiaS0+c19sb2dfem9uZV9zaXplID0gIDk7IGJyZWFrOwotCSAgICBjYXNlIDEwMjQ6IHNiaS0+c19sb2dfem9uZV9zaXplID0gMTA7IGJyZWFrOwotCSAgICBjYXNlIDIwNDg6IHNiaS0+c19sb2dfem9uZV9zaXplID0gMTE7IGJyZWFrOworCXN3aXRjaCAoc2JpLT5zX2xvZ196b25lX3NpemUpIHsKKwljYXNlICA1MTI6IHNiaS0+c19sb2dfem9uZV9zaXplID0gIDk7IGJyZWFrOworCWNhc2UgMTAyNDogc2JpLT5zX2xvZ196b25lX3NpemUgPSAxMDsgYnJlYWs7CisJY2FzZSAyMDQ4OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDExOyBicmVhazsKIAotCSAgICBkZWZhdWx0OgorCWRlZmF1bHQ6CiAJCWdvdG8gb3V0X2JhZF96b25lX3NpemU7Ci0JICB9CisJfQogCiAJcy0+c19tYWdpYyA9IElTT0ZTX1NVUEVSX01BR0lDOwogCXMtPnNfbWF4Ynl0ZXMgPSAweGZmZmZmZmZmOyAvKiBXZSBjYW4gaGFuZGxlIGZpbGVzIHVwIHRvIDQgR0IgKi8KIAotCS8qIFRoZSBDRFJPTSBpcyByZWFkLW9ubHksIGhhcyBubyBub2RlcyAoZGV2aWNlcykgb24gaXQsIGFuZCBzaW5jZQotCSAgIGFsbCBvZiB0aGUgZmlsZXMgYXBwZWFyIHRvIGJlIG93bmVkIGJ5IHJvb3QsIHdlIHJlYWxseSBkbyBub3Qgd2FudAotCSAgIHRvIGFsbG93IHN1aWQuICAoc3VpZCBvciBkZXZpY2VzIHdpbGwgbm90IHNob3cgdXAgdW5sZXNzIHdlIGhhdmUKLQkgICBSb2NrIFJpZGdlIGV4dGVuc2lvbnMpICovCisJLyoKKwkgKiBUaGUgQ0RST00gaXMgcmVhZC1vbmx5LCBoYXMgbm8gbm9kZXMgKGRldmljZXMpIG9uIGl0LCBhbmQgc2luY2UKKwkgKiBhbGwgb2YgdGhlIGZpbGVzIGFwcGVhciB0byBiZSBvd25lZCBieSByb290LCB3ZSByZWFsbHkgZG8gbm90IHdhbnQKKwkgKiB0byBhbGxvdyBzdWlkLiAgKHN1aWQgb3IgZGV2aWNlcyB3aWxsIG5vdCBzaG93IHVwIHVubGVzcyB3ZSBoYXZlCisJICogUm9jayBSaWRnZSBleHRlbnNpb25zKQorCSAqLwogCiAJcy0+c19mbGFncyB8PSBNU19SRE9OTFkgLyogfCBNU19OT0RFViB8IE1TX05PU1VJRCAqLzsKIAogCS8qIFNldCB0aGlzIGZvciByZWZlcmVuY2UuIEl0cyBub3QgY3VycmVudGx5IHVzZWQgZXhjZXB0IG9uIHdyaXRlCiAJICAgd2hpY2ggd2UgZG9uJ3QgaGF2ZSAuLiAqLwotCSAgIAotCWZpcnN0X2RhdGFfem9uZSA9IGlzb251bV83MzMgKHJvb3RwLT5leHRlbnQpICsKLQkJCSAgaXNvbnVtXzcxMSAocm9vdHAtPmV4dF9hdHRyX2xlbmd0aCk7CisKKwlmaXJzdF9kYXRhX3pvbmUgPSBpc29udW1fNzMzKHJvb3RwLT5leHRlbnQpICsKKwkJCSAgaXNvbnVtXzcxMShyb290cC0+ZXh0X2F0dHJfbGVuZ3RoKTsKIAlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZpcnN0X2RhdGFfem9uZTsKICNpZm5kZWYgQkVRVUlFVAotCXByaW50ayhLRVJOX0RFQlVHICJNYXggc2l6ZTolbGQgICBMb2cgem9uZSBzaXplOiVsZFxuIiwKLQkgICAgICAgc2JpLT5zX21heF9zaXplLAotCSAgICAgICAxVUwgPDwgc2JpLT5zX2xvZ196b25lX3NpemUpOwotCXByaW50ayhLRVJOX0RFQlVHICJGaXJzdCBkYXRhem9uZTolbGRcbiIsIHNiaS0+c19maXJzdGRhdGF6b25lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IE1heCBzaXplOiVsZCAgIExvZyB6b25lIHNpemU6JWxkXG4iLAorCQlzYmktPnNfbWF4X3NpemUsIDFVTCA8PCBzYmktPnNfbG9nX3pvbmVfc2l6ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBGaXJzdCBkYXRhem9uZTolbGRcbiIsIHNiaS0+c19maXJzdGRhdGF6b25lKTsKIAlpZihzYmktPnNfaGlnaF9zaWVycmEpCi0JCXByaW50ayhLRVJOX0RFQlVHICJEaXNjIGluIEhpZ2ggU2llcnJhIGZvcm1hdC5cbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IERpc2MgaW4gSGlnaCBTaWVycmEgZm9ybWF0LlxuIik7CiAjZW5kaWYKIAogCS8qCkBAIC03MzcsOCArNzQxLDggQEAKIAkJcHJpID0gKHN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICopIHNlYzsKIAkJcm9vdHAgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopCiAJCQlwcmktPnJvb3RfZGlyZWN0b3J5X3JlY29yZDsKLQkJZmlyc3RfZGF0YV96b25lID0gaXNvbnVtXzczMyAocm9vdHAtPmV4dGVudCkgKwotCQkJICAJaXNvbnVtXzcxMSAocm9vdHAtPmV4dF9hdHRyX2xlbmd0aCk7CisJCWZpcnN0X2RhdGFfem9uZSA9IGlzb251bV83MzMocm9vdHAtPmV4dGVudCkgKworCQkJCWlzb251bV83MTEocm9vdHAtPmV4dF9hdHRyX2xlbmd0aCk7CiAJfQogCiAJLyoKQEAgLTc3MSw3ICs3NzUsNyBAQAogCiAjaWZkZWYgQ09ORklHX0pPTElFVAogCWlmIChqb2xpZXRfbGV2ZWwgJiYgb3B0LnV0ZjggPT0gMCkgewotCQljaGFyICogcCA9IG9wdC5pb2NoYXJzZXQgPyBvcHQuaW9jaGFyc2V0IDogQ09ORklHX05MU19ERUZBVUxUOworCQljaGFyICpwID0gb3B0LmlvY2hhcnNldCA/IG9wdC5pb2NoYXJzZXQgOiBDT05GSUdfTkxTX0RFRkFVTFQ7CiAJCXNiaS0+c19ubHNfaW9jaGFyc2V0ID0gbG9hZF9ubHMocCk7CiAJCWlmICghIHNiaS0+c19ubHNfaW9jaGFyc2V0KSB7CiAJCQkvKiBGYWlsIG9ubHkgaWYgZXhwbGljaXQgY2hhcnNldCBzcGVjaWZpZWQgKi8KQEAgLTgyMSw3ICs4MjUsNyBAQAogCQlzYmktPnNfcm9jayA9IDA7CiAJCWlmIChzYmktPnNfZmlyc3RkYXRhem9uZSAhPSBmaXJzdF9kYXRhX3pvbmUpIHsKIAkJCXNiaS0+c19maXJzdGRhdGF6b25lID0gZmlyc3RfZGF0YV96b25lOwotCQkJcHJpbnRrKEtFUk5fREVCVUcgCisJCQlwcmludGsoS0VSTl9ERUJVRwogCQkJCSJJU09GUzogY2hhbmdpbmcgdG8gc2Vjb25kYXJ5IHJvb3RcbiIpOwogCQkJaXB1dChpbm9kZSk7CiAJCQlpbm9kZSA9IGlzb2ZzX2lnZXQocywgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUsIDApOwpAQCAtODMwLDggKzgzNCwxMCBAQAogCiAJaWYgKG9wdC5jaGVjayA9PSAndScpIHsKIAkJLyogT25seSBKb2xpZXQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBieSBkZWZhdWx0ICovCi0JCWlmIChqb2xpZXRfbGV2ZWwpIG9wdC5jaGVjayA9ICdyJzsKLQkJZWxzZSBvcHQuY2hlY2sgPSAncyc7CisJCWlmIChqb2xpZXRfbGV2ZWwpCisJCQlvcHQuY2hlY2sgPSAncic7CisJCWVsc2UKKwkJCW9wdC5jaGVjayA9ICdzJzsKIAl9CiAJc2JpLT5zX2pvbGlldF9sZXZlbCA9IGpvbGlldF9sZXZlbDsKIApAQCAtODQ2LDggKzg1MiwxMCBAQAogCQlnb3RvIG91dF9ub19yb290OwogCiAJdGFibGUgPSAwOwotCWlmIChqb2xpZXRfbGV2ZWwpIHRhYmxlICs9IDI7Ci0JaWYgKG9wdC5jaGVjayA9PSAncicpIHRhYmxlKys7CisJaWYgKGpvbGlldF9sZXZlbCkKKwkJdGFibGUgKz0gMjsKKwlpZiAob3B0LmNoZWNrID09ICdyJykKKwkJdGFibGUrKzsKIAlzLT5zX3Jvb3QtPmRfb3AgPSAmaXNvZnNfZGVudHJ5X29wc1t0YWJsZV07CiAKIAlrZnJlZShvcHQuaW9jaGFyc2V0KTsKQEAgLTg1OCwxMCArODY2LDEwIEBACiAJICogRGlzcGxheSBlcnJvciBtZXNzYWdlcyBhbmQgZnJlZSByZXNvdXJjZXMuCiAJICovCiBvdXRfYmFkX3Jvb3Q6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiaXNvZnNfZmlsbF9zdXBlcjogcm9vdCBpbm9kZSBub3QgaW5pdGlhbGl6ZWRcbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByb290IGlub2RlIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOwogCWdvdG8gb3V0X2lwdXQ7CiBvdXRfbm9fcm9vdDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICJpc29mc19maWxsX3N1cGVyOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIG91dF9pcHV0OgogCWlwdXQoaW5vZGUpOwogI2lmZGVmIENPTkZJR19KT0xJRVQKQEAgLTg3MCwyMSArODc4LDIwIEBACiAjZW5kaWYKIAlnb3RvIG91dF9mcmVlc2JpOwogb3V0X25vX3JlYWQ6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiaXNvZnNfZmlsbF9zdXBlcjogIgotCQkiYnJlYWQgZmFpbGVkLCBkZXY9JXMsIGlzb19ibGtudW09JWQsIGJsb2NrPSVkXG4iLAotCQlzLT5zX2lkLCBpc29fYmxrbnVtLCBibG9jayk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJyZWFkIGZhaWxlZCwgZGV2PSVzLCBpc29fYmxrbnVtPSVkLCBibG9jaz0lZFxuIiwKKwkJX19mdW5jX18sIHMtPnNfaWQsIGlzb19ibGtudW0sIGJsb2NrKTsKIAlnb3RvIG91dF9mcmVlc2JpOwogb3V0X2JhZF96b25lX3NpemU6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiQmFkIGxvZ2ljYWwgem9uZSBzaXplICVsZFxuIiwKKwlwcmludGsoS0VSTl9XQVJOSU5HICJJU09GUzogQmFkIGxvZ2ljYWwgem9uZSBzaXplICVsZFxuIiwKIAkJc2JpLT5zX2xvZ196b25lX3NpemUpOwogCWdvdG8gb3V0X2ZyZWViaDsKIG91dF9iYWRfc2l6ZToKLQlwcmludGsoS0VSTl9XQVJOSU5HICJMb2dpY2FsIHpvbmUgc2l6ZSglZCkgPCBoYXJkd2FyZSBibG9ja3NpemUoJXUpXG4iLAorCXByaW50ayhLRVJOX1dBUk5JTkcgIklTT0ZTOiBMb2dpY2FsIHpvbmUgc2l6ZSglZCkgPCBoYXJkd2FyZSBibG9ja3NpemUoJXUpXG4iLAogCQlvcmlnX3pvbmVzaXplLCBvcHQuYmxvY2tzaXplKTsKIAlnb3RvIG91dF9mcmVlYmg7CiBvdXRfdW5rbm93bl9mb3JtYXQ6CiAJaWYgKCFzaWxlbnQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBpZGVudGlmeSBDRC1ST00gZm9ybWF0LlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTT0ZTOiBVbmFibGUgdG8gaWRlbnRpZnkgQ0QtUk9NIGZvcm1hdC5cbiIpOwogCiBvdXRfZnJlZWJoOgogCWJyZWxzZShiaCk7CkBAIC05MDIsNyArOTA5LDcgQEAKIAlidWYtPmZfdHlwZSA9IElTT0ZTX1NVUEVSX01BR0lDOwogCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAlidWYtPmZfYmxvY2tzID0gKElTT0ZTX1NCKHNiKS0+c19uem9uZXMKLSAgICAgICAgICAgICAgICAgIDw8IChJU09GU19TQihzYiktPnNfbG9nX3pvbmVfc2l6ZSAtIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSk7CisJCTw8IChJU09GU19TQihzYiktPnNfbG9nX3pvbmVfc2l6ZSAtIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSk7CiAJYnVmLT5mX2JmcmVlID0gMDsKIAlidWYtPmZfYmF2YWlsID0gMDsKIAlidWYtPmZfZmlsZXMgPSBJU09GU19TQihzYiktPnNfbmlub2RlczsKQEAgLTkzMSwyMCArOTM4LDIwIEBACiAKIAlydiA9IDA7CiAJaWYgKGlibG9jayA8IDAgfHwgaWJsb2NrICE9IGlibG9ja19zKSB7Ci0JCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2sgbnVtYmVyIHRvbyBsYXJnZVxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmxvY2sgbnVtYmVyIHRvbyBsYXJnZVxuIiwgX19mdW5jX18pOwogCQlnb3RvIGFib3J0OwogCX0KIAogCWJfb2ZmID0gaWJsb2NrOwotCQotCW9mZnNldCAgICA9IDA7Ci0JZmlyc3RleHQgID0gZWktPmlfZmlyc3RfZXh0ZW50OwotCXNlY3Rfc2l6ZSA9IGVpLT5pX3NlY3Rpb25fc2l6ZSA+PiBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7Ci0JbmV4dGJsayAgID0gZWktPmlfbmV4dF9zZWN0aW9uX2Jsb2NrOwotCW5leHRvZmYgICA9IGVpLT5pX25leHRfc2VjdGlvbl9vZmZzZXQ7Ci0Jc2VjdGlvbiAgID0gMDsKIAotCXdoaWxlICggbmJsb2NrcyApIHsKKwlvZmZzZXQgPSAwOworCWZpcnN0ZXh0ID0gZWktPmlfZmlyc3RfZXh0ZW50OworCXNlY3Rfc2l6ZSA9IGVpLT5pX3NlY3Rpb25fc2l6ZSA+PiBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7CisJbmV4dGJsayA9IGVpLT5pX25leHRfc2VjdGlvbl9ibG9jazsKKwluZXh0b2ZmID0gZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldDsKKwlzZWN0aW9uID0gMDsKKworCXdoaWxlIChuYmxvY2tzKSB7CiAJCS8qIElmIHdlIGFyZSAqd2F5KiBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgcHJpbnQgYSBtZXNzYWdlLgogCQkgKiBBY2Nlc3MgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUgdXAgdG8gdGhlIG5leHQgcGFnZSBib3VuZGFyeQogCQkgKiBpcyBub3JtYWwsIGhvd2V2ZXIgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBwYWdlIGNhY2hlIHdvcmtzLgpAQCAtOTUzLDExICs5NjAsMTEgQEAKIAkJICogSS9PIGVycm9ycy4KIAkJICovCiAJCWlmIChiX29mZiA+ICgoaW5vZGUtPmlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKSkpIHsKLQkJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2sgPj0gRU9GICglbGQsICVsZClcbiIsCi0JCQkgICAgICAgaWJsb2NrLCAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfc2l6ZSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJsb2NrID49IEVPRiAoJWxkLCAlbGQpXG4iLAorCQkJCV9fZnVuY19fLCBpYmxvY2ssICh1bnNpZ25lZCBsb25nKSBpbm9kZS0+aV9zaXplKTsKIAkJCWdvdG8gYWJvcnQ7CiAJCX0KLQkJCisKIAkJLyogT24gdGhlIGxhc3Qgc2VjdGlvbiwgbmV4dGJsayA9PSAwLCBzZWN0aW9uIHNpemUgaXMgbGlrZWx5IHRvCiAJCSAqIGV4Y2VlZCBzZWN0X3NpemUgYnkgYSBwYXJ0aWFsIGJsb2NrLCBhbmQgYWNjZXNzIGJleW9uZCB0aGUKIAkJICogZW5kIG9mIHRoZSBmaWxlIHdpbGwgcmVhY2ggYmV5b25kIHRoZSBzZWN0aW9uIHNpemUsIHRvby4KQEAgLTk3NiwyMCArOTgzLDIxIEBACiAJCQlpcHV0KG5pbm9kZSk7CiAKIAkJCWlmICgrK3NlY3Rpb24gPiAxMDApIHsKLQkJCQlwcmludGsoImlzb2ZzX2dldF9ibG9ja3M6IE1vcmUgdGhhbiAxMDAgZmlsZSBzZWN0aW9ucyA/IT8sIGFib3J0aW5nLi4uXG4iKTsKLQkJCQlwcmludGsoImlzb2ZzX2dldF9ibG9ja3M6IGJsb2NrPSVsZCBmaXJzdGV4dD0ldSBzZWN0X3NpemU9JXUgIgotCQkJCSAgICAgICAibmV4dGJsaz0lbHUgbmV4dG9mZj0lbHVcbiIsCi0JCQkJICAgICAgIGlibG9jaywgZmlyc3RleHQsICh1bnNpZ25lZCkgc2VjdF9zaXplLAotCQkJCSAgICAgICBuZXh0YmxrLCBuZXh0b2ZmKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1vcmUgdGhhbiAxMDAgZmlsZSBzZWN0aW9ucyA/IT8iCisJCQkJCSIgYWJvcnRpbmcuLi5cbiIsIF9fZnVuY19fKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJsb2NrPSVsZCBmaXJzdGV4dD0ldSBzZWN0X3NpemU9JXUgIgorCQkJCQkibmV4dGJsaz0lbHUgbmV4dG9mZj0lbHVcbiIsIF9fZnVuY19fLAorCQkJCQlpYmxvY2ssIGZpcnN0ZXh0LCAodW5zaWduZWQpIHNlY3Rfc2l6ZSwKKwkJCQkJbmV4dGJsaywgbmV4dG9mZik7CiAJCQkJZ290byBhYm9ydDsKIAkJCX0KIAkJfQotCQkKLQkJaWYgKCAqYmggKSB7CisKKwkJaWYgKCpiaCkgewogCQkJbWFwX2JoKCpiaCwgaW5vZGUtPmlfc2IsIGZpcnN0ZXh0ICsgYl9vZmYgLSBvZmZzZXQpOwogCQl9IGVsc2UgewogCQkJKmJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBmaXJzdGV4dCtiX29mZi1vZmZzZXQpOwotCQkJaWYgKCAhKmJoICkKKwkJCWlmICghKmJoKQogCQkJCWdvdG8gYWJvcnQ7CiAJCX0KIAkJYmgrKzsJLyogTmV4dCBidWZmZXIgaGVhZCAqLwpAQCAtMTAxMCw3ICsxMDE4LDcgQEAKIAkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQogewogCWlmIChjcmVhdGUpIHsKLQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2s6IEtlcm5lbCB0cmllcyB0byBhbGxvY2F0ZSBhIGJsb2NrXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBLZXJuZWwgdHJpZXMgdG8gYWxsb2NhdGUgYSBibG9ja1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVST0ZTOwogCX0KIApAQCAtMTA3MCwxMSArMTA3OCwxMSBAQAogewogCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKIAlpbnQgaGlnaF9zaWVycmEgPSBJU09GU19TQihpbm9kZS0+aV9zYiktPnNfaGlnaF9zaWVycmE7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldCwgYmxvY2tfc2F2ZWQsIG9mZnNldF9zYXZlZDsKIAlpbnQgaSA9IDA7CiAJaW50IG1vcmVfZW50cmllcyA9IDA7Ci0Jc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGUgPSBOVUxMOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqdG1wZGUgPSBOVUxMOwogCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWkgPSBJU09GU19JKGlub2RlKTsKIAogCWlub2RlLT5pX3NpemUgPSAwOwpAQCAtMTA4OSw3ICsxMDk3LDcgQEAKIAlvZmZzZXQgPSBlaS0+aV9pZ2V0NV9vZmZzZXQ7CiAKIAlkbyB7Ci0JCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIGRlOworCQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlOwogCQl1bnNpZ25lZCBpbnQgZGVfbGVuOwogCiAJCWlmICghYmgpIHsKQEAgLTExNjMsMTAgKzExNzEsOSBAQAogCXJldHVybiAtRUlPOwogCiBvdXRfdG9vbWFueToKLQlwcmludGsoS0VSTl9JTkZPICJpc29mc19yZWFkX2xldmVsM19zaXplOiAiCi0JCSJNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/LCBhYm9ydGluZy4uLlxuIgotCSAgCSJpc29mc19yZWFkX2xldmVsM19zaXplOiBpbm9kZT0lbHVcbiIsCi0JCWlub2RlLT5pX2lubyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vcmUgdGhhbiAxMDAgZmlsZSBzZWN0aW9ucyA/IT8sIGFib3J0aW5nLi4uXG4iCisJCSJpc29mc19yZWFkX2xldmVsM19zaXplOiBpbm9kZT0lbHVcbiIsCisJCV9fZnVuY19fLCBpbm9kZS0+aV9pbm8pOwogCWdvdG8gb3V0OwogfQogCkBAIC0xMTc3LDkgKzExODQsOSBAQAogCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKIAl1bnNpZ25lZCBsb25nIGJsb2NrOwogCWludCBoaWdoX3NpZXJyYSA9IHNiaS0+c19oaWdoX3NpZXJyYTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7Ci0Jc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGU7Ci0Jc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGUgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqZGU7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICp0bXBkZSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGRlX2xlbjsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gSVNPRlNfSShpbm9kZSk7CkBAIC0xMTk5LDcgKzEyMDYsNyBAQAogCiAJCXRtcGRlID0ga21hbGxvYyhkZV9sZW4sIEdGUF9LRVJORUwpOwogCQlpZiAodG1wZGUgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXNvZnNfcmVhZF9pbm9kZTogb3V0IG9mIG1lbW9yeVxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQkJZ290byBmYWlsOwogCQl9CiAJCW1lbWNweSh0bXBkZSwgYmgtPmJfZGF0YSArIG9mZnNldCwgZnJhZzEpOwpAQCAtMTIxMiwyNCArMTIxOSwyNiBAQAogCX0KIAogCWlub2RlLT5pX2lubyA9IGlzb2ZzX2dldF9pbm8oZWktPmlfaWdldDVfYmxvY2ssCi0JCQkJICAgICBlaS0+aV9pZ2V0NV9vZmZzZXQsCi0JCQkJICAgICBJU09GU19CVUZGRVJfQklUUyhpbm9kZSkpOworCQkJCQllaS0+aV9pZ2V0NV9vZmZzZXQsCisJCQkJCUlTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKSk7CiAKIAkvKiBBc3N1bWUgaXQgaXMgYSBub3JtYWwtZm9ybWF0IGZpbGUgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlICovCiAJZWktPmlfZmlsZV9mb3JtYXQgPSBpc29mc19maWxlX25vcm1hbDsKIAogCWlmIChkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSAmIDIpIHsKIAkJaW5vZGUtPmlfbW9kZSA9IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JRkRJUjsKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOyAvKiBTZXQgdG8gMS4gIFdlIGtub3cgdGhlcmUgYXJlIDIsIGJ1dAotCQkJCSAgICAgICB0aGUgZmluZCB1dGlsaXR5IHRyaWVzIHRvIG9wdGltaXplCi0JCQkJICAgICAgIGlmIGl0IGlzIDIsIGFuZCBpdCBzY3Jld3MgdXAuICBJdCBpcwotCQkJCSAgICAgICBlYXNpZXIgdG8gZ2l2ZSAxIHdoaWNoIHRlbGxzIGZpbmQgdG8KLQkJCQkgICAgICAgZG8gaXQgdGhlIGhhcmQgd2F5LiAqLworCQlpbm9kZS0+aV9ubGluayA9IDE7CS8qCisJCQkJCSAqIFNldCB0byAxLiAgV2Uga25vdyB0aGVyZSBhcmUgMiwgYnV0CisJCQkJCSAqIHRoZSBmaW5kIHV0aWxpdHkgdHJpZXMgdG8gb3B0aW1pemUKKwkJCQkJICogaWYgaXQgaXMgMiwgYW5kIGl0IHNjcmV3cyB1cC4gIEl0IGlzCisJCQkJCSAqIGVhc2llciB0byBnaXZlIDEgd2hpY2ggdGVsbHMgZmluZCB0bworCQkJCQkgKiBkbyBpdCB0aGUgaGFyZCB3YXkuCisJCQkJCSAqLwogCX0gZWxzZSB7Ci0gCQkvKiBFdmVyeWJvZHkgZ2V0cyB0byByZWFkIHRoZSBmaWxlLiAqLworCQkvKiBFdmVyeWJvZHkgZ2V0cyB0byByZWFkIHRoZSBmaWxlLiAqLwogCQlpbm9kZS0+aV9tb2RlID0gc2JpLT5zX21vZGU7CiAJCWlub2RlLT5pX25saW5rID0gMTsKLQkgICAgICAgIGlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOwogCX0KIAlpbm9kZS0+aV91aWQgPSBzYmktPnNfdWlkOwogCWlub2RlLT5pX2dpZCA9IHNiaS0+c19naWQ7CkBAIC0xMjM5LDEzICsxMjQ4LDE0IEBACiAJZWktPmlfZm9ybWF0X3Bhcm1bMV0gPSAwOwogCWVpLT5pX2Zvcm1hdF9wYXJtWzJdID0gMDsKIAotCWVpLT5pX3NlY3Rpb25fc2l6ZSA9IGlzb251bV83MzMgKGRlLT5zaXplKTsKKwllaS0+aV9zZWN0aW9uX3NpemUgPSBpc29udW1fNzMzKGRlLT5zaXplKTsKIAlpZiAoZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0gJiAweDgwKSB7Ci0JCWlmKGlzb2ZzX3JlYWRfbGV2ZWwzX3NpemUoaW5vZGUpKSBnb3RvIGZhaWw7CisJCWlmKGlzb2ZzX3JlYWRfbGV2ZWwzX3NpemUoaW5vZGUpKQorCQkJZ290byBmYWlsOwogCX0gZWxzZSB7CiAJCWVpLT5pX25leHRfc2VjdGlvbl9ibG9jayA9IDA7CiAJCWVpLT5pX25leHRfc2VjdGlvbl9vZmZzZXQgPSAwOwotCQlpbm9kZS0+aV9zaXplID0gaXNvbnVtXzczMyAoZGUtPnNpemUpOworCQlpbm9kZS0+aV9zaXplID0gaXNvbnVtXzczMyhkZS0+c2l6ZSk7CiAJfQogCiAJLyoKQEAgLTEyNTgsMjMgKzEyNjgsMjQgQEAKIAkJaW5vZGUtPmlfc2l6ZSAmPSAweDAwZmZmZmZmOwogCiAJaWYgKGRlLT5pbnRlcmxlYXZlWzBdKSB7Ci0JCXByaW50aygiSW50ZXJsZWF2ZWQgZmlsZXMgbm90ICh5ZXQpIHN1cHBvcnRlZC5cbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IEludGVybGVhdmVkIGZpbGVzIG5vdCAoeWV0KSBzdXBwb3J0ZWQuXG4iKTsKIAkJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJfQogCiAJLyogSSBoYXZlIG5vIGlkZWEgd2hhdCBmaWxlX3VuaXRfc2l6ZSBpcyB1c2VkIGZvciwgc28KIAkgICB3ZSB3aWxsIGZsYWcgaXQgZm9yIG5vdyAqLwogCWlmIChkZS0+ZmlsZV91bml0X3NpemVbMF0gIT0gMCkgewotCQlwcmludGsoIkZpbGUgdW5pdCBzaXplICE9IDAgZm9yIElTTyBmaWxlICglbGQpLlxuIiwKLQkJICAgICAgIGlub2RlLT5pX2lubyk7CisJCXByaW50ayhLRVJOX0RFQlVHICJJU09GUzogRmlsZSB1bml0IHNpemUgIT0gMCBmb3IgSVNPIGZpbGUgKCVsZCkuXG4iLAorCQkJaW5vZGUtPmlfaW5vKTsKIAl9CiAKIAkvKiBJIGhhdmUgbm8gaWRlYSB3aGF0IG90aGVyIGZsYWcgYml0cyBhcmUgdXNlZCBmb3IsIHNvCiAJICAgd2Ugd2lsbCBmbGFnIGl0IGZvciBub3cgKi8KICNpZmRlZiBERUJVRwogCWlmKChkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSAmIH4yKSE9IDApewotCQlwcmludGsoIlVudXN1YWwgZmxhZyBzZXR0aW5ncyBmb3IgSVNPIGZpbGUgKCVsZCAleCkuXG4iLAotCQkgICAgICAgaW5vZGUtPmlfaW5vLCBkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJJU09GUzogVW51c3VhbCBmbGFnIHNldHRpbmdzIGZvciBJU08gZmlsZSAiCisJCQkJIiglbGQgJXgpLlxuIiwKKwkJCWlub2RlLT5pX2lubywgZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0pOwogCX0KICNlbmRpZgogCkBAIC0xMjg1LDExICsxMjk2LDExIEBACiAJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9CiAJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CiAKLQllaS0+aV9maXJzdF9leHRlbnQgPSAoaXNvbnVtXzczMyAoZGUtPmV4dGVudCkgKwotCQkJICAgICAgaXNvbnVtXzcxMSAoZGUtPmV4dF9hdHRyX2xlbmd0aCkpOworCWVpLT5pX2ZpcnN0X2V4dGVudCA9IChpc29udW1fNzMzKGRlLT5leHRlbnQpICsKKwkJCWlzb251bV83MTEoZGUtPmV4dF9hdHRyX2xlbmd0aCkpOwogCiAJLyogU2V0IHRoZSBudW1iZXIgb2YgYmxvY2tzIGZvciBzdGF0KCkgLSBzaG91bGQgYmUgZG9uZSBiZWZvcmUgUlIgKi8KLQlpbm9kZS0+aV9ibG9ja3MgID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CiAKIAkvKgogCSAqIE5vdyB0ZXN0IGZvciBwb3NzaWJsZSBSb2NrIFJpZGdlIGV4dGVuc2lvbnMgd2hpY2ggd2lsbCBvdmVycmlkZQpAQCAtMTMwNiw3ICsxMzE3LDcgQEAKIAkvKiBJbnN0YWxsIHRoZSBpbm9kZSBvcGVyYXRpb25zIHZlY3RvciAqLwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CiAJCWlub2RlLT5pX2ZvcCA9ICZnZW5lcmljX3JvX2ZvcHM7Ci0JCXN3aXRjaCAoIGVpLT5pX2ZpbGVfZm9ybWF0ICkgeworCQlzd2l0Y2ggKGVpLT5pX2ZpbGVfZm9ybWF0KSB7CiAjaWZkZWYgQ09ORklHX1pJU09GUwogCQljYXNlIGlzb2ZzX2ZpbGVfY29tcHJlc3NlZDoKIAkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmemlzb2ZzX2FvcHM7CkBAIC0xMzUwLDcgKzEzNjEsNyBAQAogCXN0cnVjdCBpc29mc19pZ2V0NV9jYWxsYmFja19kYXRhICpkID0KIAkJKHN0cnVjdCBpc29mc19pZ2V0NV9jYWxsYmFja19kYXRhKilkYXRhOwogCXJldHVybiAoaS0+aV9pZ2V0NV9ibG9jayA9PSBkLT5ibG9jaykKLQkgICAgICAgJiYgKGktPmlfaWdldDVfb2Zmc2V0ID09IGQtPm9mZnNldCk7CisJCSYmIChpLT5pX2lnZXQ1X29mZnNldCA9PSBkLT5vZmZzZXQpOwogfQogCiBzdGF0aWMgaW50IGlzb2ZzX2lnZXQ1X3NldChzdHJ1Y3QgaW5vZGUgKmlubywgdm9pZCAqZGF0YSkKQEAgLTEzODQsNyArMTM5NSw3IEBACiAJaGFzaHZhbCA9IChibG9jayA8PCBzYi0+c19ibG9ja3NpemVfYml0cykgfCBvZmZzZXQ7CiAKIAlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgaGFzaHZhbCwgJmlzb2ZzX2lnZXQ1X3Rlc3QsCi0JCQkgICAgICZpc29mc19pZ2V0NV9zZXQsICZkYXRhKTsKKwkJCQkmaXNvZnNfaWdldDVfc2V0LCAmZGF0YSk7CiAKIAlpZiAoaW5vZGUgJiYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKSB7CiAJCXNiLT5zX29wLT5yZWFkX2lub2RlKGlub2RlKTsKQEAgLTEzOTgsNyArMTQwOSw3IEBACiAJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7CiAJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaXNvZnNfZmlsbF9zdXBlciwKLQkJCSAgIG1udCk7CisJCQkJbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGlzbzk2NjBfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2lzb2ZzLmggYi9mcy9pc29mcy9pc29mcy5oCmluZGV4IGVmZTI4NzIuLmEwN2U2N2IgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2lzb2ZzLmgKKysrIGIvZnMvaXNvZnMvaXNvZnMuaApAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pc29fZnMuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2pvbGlldC5jIGIvZnMvaXNvZnMvam9saWV0LmMKaW5kZXggZmI4ZmU3YS4uOTJjMTRiOCAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvam9saWV0LmMKKysrIGIvZnMvaXNvZnMvam9saWV0LmMKQEAgLTgwLDIyICs4MCwyMCBAQAogCiAJaWYgKHV0ZjgpIHsKIAkJbGVuID0gd2NzbnRvbWJzX2JlKG91dG5hbWUsIGRlLT5uYW1lLAotCQkJCSAgIGRlLT5uYW1lX2xlblswXSA+PiAxLCBQQUdFX1NJWkUpOworCQkJCWRlLT5uYW1lX2xlblswXSA+PiAxLCBQQUdFX1NJWkUpOwogCX0gZWxzZSB7CiAJCWxlbiA9IHVuaTE2X3RvX3g4KG91dG5hbWUsIChfX2JlMTYgKikgZGUtPm5hbWUsCi0JCQkJICBkZS0+bmFtZV9sZW5bMF0gPj4gMSwgbmxzKTsKKwkJCQlkZS0+bmFtZV9sZW5bMF0gPj4gMSwgbmxzKTsKIAl9Ci0JaWYgKChsZW4gPiAyKSAmJiAob3V0bmFtZVtsZW4tMl0gPT0gJzsnKSAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJzEnKSkgeworCWlmICgobGVuID4gMikgJiYgKG91dG5hbWVbbGVuLTJdID09ICc7JykgJiYgKG91dG5hbWVbbGVuLTFdID09ICcxJykpCiAJCWxlbiAtPSAyOwotCX0KIAogCS8qCiAJICogV2luZG93cyBkb2Vzbid0IGxpa2UgcGVyaW9kcyBhdCB0aGUgZW5kIG9mIGEgbmFtZSwKIAkgKiBzbyBuZWl0aGVyIGRvIHdlCiAJICovCi0Jd2hpbGUgKGxlbiA+PSAyICYmIChvdXRuYW1lW2xlbi0xXSA9PSAnLicpKSB7CisJd2hpbGUgKGxlbiA+PSAyICYmIChvdXRuYW1lW2xlbi0xXSA9PSAnLicpKQogCQlsZW4tLTsKLQl9CiAKIAlyZXR1cm4gbGVuOwogfQpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvbmFtZWkuYyBiL2ZzL2lzb2ZzL25hbWVpLmMKaW5kZXggYzA0YjNhMS4uYzhjN2U1MSAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvbmFtZWkuYworKysgYi9mcy9pc29mcy9uYW1laS5jCkBAIC0xNSw3ICsxNSw3IEBACiAgKiBzb21lIHNhbml0eSB0ZXN0cy4KICAqLwogc3RhdGljIGludAotaXNvZnNfY21wKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNvbnN0IGNoYXIgKiBjb21wYXJlLCBpbnQgZGxlbikKK2lzb2ZzX2NtcChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKmNvbXBhcmUsIGludCBkbGVuKQogewogCXN0cnVjdCBxc3RyIHFzdHI7CiAKQEAgLTQ4LDI0ICs0OCwyNCBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaXNvZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCXVuc2lnbmVkIGxvbmcgKmJsb2NrX3J2LCB1bnNpZ25lZCBsb25nKiBvZmZzZXRfcnYsCi0JY2hhciAqIHRtcG5hbWUsIHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIHRtcGRlKQorCXVuc2lnbmVkIGxvbmcgKmJsb2NrX3J2LCB1bnNpZ25lZCBsb25nICpvZmZzZXRfcnYsCisJY2hhciAqdG1wbmFtZSwgc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICp0bXBkZSkKIHsKIAl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShkaXIpOwogCXVuc2lnbmVkIGNoYXIgYnVmYml0cyA9IElTT0ZTX0JVRkZFUl9CSVRTKGRpcik7CiAJdW5zaWduZWQgbG9uZyBibG9jaywgZl9wb3MsIG9mZnNldCwgYmxvY2tfc2F2ZWQsIG9mZnNldF9zYXZlZDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJc3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKGRpci0+aV9zYik7CiAKIAlpZiAoIUlTT0ZTX0koZGlyKS0+aV9maXJzdF9leHRlbnQpCiAJCXJldHVybiAwOwotICAKKwogCWZfcG9zID0gMDsKIAlvZmZzZXQgPSAwOwogCWJsb2NrID0gMDsKIAogCXdoaWxlIChmX3BvcyA8IGRpci0+aV9zaXplKSB7Ci0JCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIGRlOworCQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlOwogCQlpbnQgZGVfbGVuLCBtYXRjaCwgaSwgZGxlbjsKIAkJY2hhciAqZHBudDsKIApAQCAtMTE0LDcgKzExNCw3IEBACiAKIAkJaWYgKHNiaS0+c19yb2NrICYmCiAJCSAgICAoKGkgPSBnZXRfcm9ja19yaWRnZV9maWxlbmFtZShkZSwgdG1wbmFtZSwgZGlyKSkpKSB7Ci0JCQlkbGVuID0gaTsgCS8qIHBvc3NpYmx5IC0xICovCisJCQlkbGVuID0gaTsJLyogcG9zc2libHkgLTEgKi8KIAkJCWRwbnQgPSB0bXBuYW1lOwogI2lmZGVmIENPTkZJR19KT0xJRVQKIAkJfSBlbHNlIGlmIChzYmktPnNfam9saWV0X2xldmVsKSB7CkBAIC0xNDUsOCArMTQ1LDggQEAKIAkJCWlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLAogCQkJCQkJCSAmYmxvY2tfc2F2ZWQsCiAJCQkJCQkJICZvZmZzZXRfc2F2ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmJsb2NrX3J2ID0gYmxvY2tfc2F2ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0X3J2ID0gb2Zmc2V0X3NhdmVkOworCQkJKmJsb2NrX3J2ID0gYmxvY2tfc2F2ZWQ7CisJCQkqb2Zmc2V0X3J2ID0gb2Zmc2V0X3NhdmVkOwogCQkJYnJlbHNlKGJoKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xNTUsNyArMTU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGRlbnRyeSAqaXNvZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdHJ1Y3QgZGVudHJ5ICppc29mc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJaW50IGZvdW5kOwogCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKQEAgLTE3MCw5ICsxNzAsOSBAQAogCiAJbG9ja19rZXJuZWwoKTsKIAlmb3VuZCA9IGlzb2ZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnksCi0JCQkJICZibG9jaywgJm9mZnNldCwKLQkJCQkgcGFnZV9hZGRyZXNzKHBhZ2UpLAotCQkJCSAxMDI0ICsgcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJCQkmYmxvY2ssICZvZmZzZXQsCisJCQkJcGFnZV9hZGRyZXNzKHBhZ2UpLAorCQkJCTEwMjQgKyBwYWdlX2FkZHJlc3MocGFnZSkpOwogCV9fZnJlZV9wYWdlKHBhZ2UpOwogCiAJaW5vZGUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvamJkL2NvbW1pdC5jIGIvZnMvamJkL2NvbW1pdC5jCmluZGV4IDFmYWNmYWYuLmEwMDNkNTAgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9jb21taXQuYworKysgYi9mcy9qYmQvY29tbWl0LmMKQEAgLTg4Nyw3ICs4ODcsOCBAQAogCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAKLQlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMKSB7CisJaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCAmJgorCSAgICBjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID09IE5VTEwpIHsKIAkJX19qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKIAl9IGVsc2UgewogCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9mcy9qYmQvcmV2b2tlLmMgYi9mcy9qYmQvcmV2b2tlLmMKaW5kZXggODI0ZTNiNy4uOGRiMmZhMiAxMDA2NDQKLS0tIGEvZnMvamJkL3Jldm9rZS5jCisrKyBiL2ZzL2piZC9yZXZva2UuYwpAQCAtNjgsNiArNjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcmV2b2tlX3JlY29yZF9jYWNoZTsKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcmV2b2tlX3RhYmxlX2NhY2hlOwpAQCAtMjExLDcgKzIxMiw3IEBACiAJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXTsKIAogCS8qIENoZWNrIHRoYXQgdGhlIGhhc2hfc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLwotCUpfQVNTRVJUICgoaGFzaF9zaXplICYgKGhhc2hfc2l6ZS0xKSkgPT0gMCk7CisJSl9BU1NFUlQoaXNfcG93ZXJfb2ZfMihoYXNoX3NpemUpKTsKIAogCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CiAKQEAgLTIzOCw3ICsyMzksNyBAQAogCWpvdXJuYWwtPmpfcmV2b2tlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMV07CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBoYXNoX3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KLQlKX0FTU0VSVCAoKGhhc2hfc2l6ZSAmIChoYXNoX3NpemUtMSkpID09IDApOworCUpfQVNTRVJUKGlzX3Bvd2VyX29mXzIoaGFzaF9zaXplKSk7CiAKIAlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOwogCmRpZmYgLS1naXQgYS9mcy9qYmQyL2NvbW1pdC5jIGIvZnMvamJkMi9jb21taXQuYwppbmRleCAyODU2ZTExLi5jMGY1OWQxIDEwMDY0NAotLS0gYS9mcy9qYmQyL2NvbW1pdC5jCisrKyBiL2ZzL2piZDIvY29tbWl0LmMKQEAgLTg5Niw3ICs4OTYsOCBAQAogCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAKLQlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMKSB7CisJaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCAmJgorCSAgICBjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID09IE5VTEwpIHsKIAkJX19qYmQyX2pvdXJuYWxfZHJvcF90cmFuc2FjdGlvbihqb3VybmFsLCBjb21taXRfdHJhbnNhY3Rpb24pOwogCX0gZWxzZSB7CiAJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvcmV2b2tlLmMgYi9mcy9qYmQyL3Jldm9rZS5jCmluZGV4IDkyNDZlNzYuLjI4Y2FjMDQgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvcmV2b2tlLmMKKysrIGIvZnMvamJkMi9yZXZva2UuYwpAQCAtNjgsNiArNjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9yZXZva2VfcmVjb3JkX2NhY2hlOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpqYmQyX3Jldm9rZV90YWJsZV9jYWNoZTsKQEAgLTIxMiw3ICsyMTMsNyBAQAogCWpvdXJuYWwtPmpfcmV2b2tlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF07CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBoYXNoX3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KLQlKX0FTU0VSVCAoKGhhc2hfc2l6ZSAmIChoYXNoX3NpemUtMSkpID09IDApOworCUpfQVNTRVJUKGlzX3Bvd2VyX29mXzIoaGFzaF9zaXplKSk7CiAKIAlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOwogCkBAIC0yMzksNyArMjQwLDcgQEAKIAlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOwogCiAJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCi0JSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKwlKX0FTU0VSVChpc19wb3dlcl9vZl8yKGhhc2hfc2l6ZSkpOwogCiAJam91cm5hbC0+al9yZXZva2UtPmhhc2hfc2l6ZSA9IGhhc2hfc2l6ZTsKIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvYmFja2dyb3VuZC5jIGIvZnMvamZmczIvYmFja2dyb3VuZC5jCmluZGV4IDBjODJkZmMuLjE0M2M1NTMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2JhY2tncm91bmQuYworKysgYi9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKQEAgLTgxLDYgKzgxLDcgQEAKIAogCXNldF91c2VyX25pY2UoY3VycmVudCwgMTApOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJYWxsb3dfc2lnbmFsKFNJR0hVUCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW5vZGUuaCBiL2ZzL2pmcy9qZnNfaW5vZGUuaAppbmRleCAyMzc0YjU5Li5mMGVjNzJiIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2lub2RlLmgKKysrIGIvZnMvamZzL2pmc19pbm9kZS5oCkBAIC0zMiw2ICszMiw3IEBACiBleHRlcm4gdm9pZCBqZnNfZnJlZV96ZXJvX2xpbmsoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmpmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiBleHRlcm4gdm9pZCBqZnNfZ2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqKTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpqZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCk7CiBleHRlcm4gdm9pZCBqZnNfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgamZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwogCmRpZmYgLS1naXQgYS9mcy9qZnMvbmFtZWkuYyBiL2ZzL2pmcy9uYW1laS5jCmluZGV4IDI1MTYxYzQuLjkzMjc5N2IgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9uYW1laS5jCisrKyBiL2ZzL2pmcy9uYW1laS5jCkBAIC0xNDc3LDYgKzE0NzcsMzggQEAKIAlyZXR1cm4gZGVudHJ5OwogfQogCitzdHJ1Y3QgZGVudHJ5ICpqZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKK3sKKwlfX3UzMiAqb2JqcCA9IHZvYmpwOworCXVuc2lnbmVkIGxvbmcgaW5vID0gb2JqcFswXTsKKwlfX3UzMiBnZW5lcmF0aW9uID0gb2JqcFsxXTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKKworCWlmIChpbm8gPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisJaW5vZGUgPSBpZ2V0KHNiLCBpbm8pOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8CisJICAgIChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikpIHsKKwkgICAgCXJlc3VsdCA9IEVSUl9QVFIoLUVTVEFMRSk7CisJCWdvdG8gb3V0X2lwdXQ7CisJfQorCisJcmVzdWx0ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKKwlpZiAoIXJlc3VsdCkgeworCQlyZXN1bHQgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dF9pcHV0OworCX0KKwlyZXR1cm4gcmVzdWx0OworCisgb3V0X2lwdXQ6CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogc3RydWN0IGRlbnRyeSAqamZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfaW5vZGUtPmlfc2I7CmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDIwZTRhYzEuLjkyOWZjZWMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKQEAgLTczNyw2ICs3MzgsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBqZnNfZXhwb3J0X29wZXJhdGlvbnMgPSB7CisJLmdldF9kZW50cnkJPSBqZnNfZ2V0X2RlbnRyeSwKIAkuZ2V0X3BhcmVudAk9IGpmc19nZXRfcGFyZW50LAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjLmMgYi9mcy9sb2NrZC9zdmMuYwppbmRleCAyNjgwOTMyLi44MmUyMTkyIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmMuYworKysgYi9mcy9sb2NrZC9zdmMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KQEAgLTc1LDE4ICs3NiwzMSBAQAogCiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKiBubG1fc3lzY3RsX3RhYmxlOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfZ3JhY2VfcGVyaW9kKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbG9ja2RfZ3JhY2VfcGVyaW9kKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBncmFjZV9wZXJpb2Q7Ci0KIAkvKiBOb3RlOiBubG1fdGltZW91dCBzaG91bGQgYWx3YXlzIGJlIG5vbnplcm8gKi8KIAlpZiAobmxtX2dyYWNlX3BlcmlvZCkKLQkJZ3JhY2VfcGVyaW9kID0gKChubG1fZ3JhY2VfcGVyaW9kICsgbmxtX3RpbWVvdXQgLSAxKQotCQkJCS8gbmxtX3RpbWVvdXQpICogbmxtX3RpbWVvdXQgKiBIWjsKKwkJcmV0dXJuIHJvdW5kdXAobmxtX2dyYWNlX3BlcmlvZCwgbmxtX3RpbWVvdXQpICogSFo7CiAJZWxzZQotCQlncmFjZV9wZXJpb2QgPSBubG1fdGltZW91dCAqIDUgKiBIWjsKKwkJcmV0dXJuIG5sbV90aW1lb3V0ICogNSAqIEhaOworfQorCit1bnNpZ25lZCBsb25nIGdldF9uZnNfZ3JhY2VfcGVyaW9kKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb2NrZGdyYWNlID0gZ2V0X2xvY2tkX2dyYWNlX3BlcmlvZCgpOworCXVuc2lnbmVkIGxvbmcgbmZzZGdyYWNlID0gMDsKKworCWlmIChubG1zdmNfb3BzKQorCQluZnNkZ3JhY2UgPSBubG1zdmNfb3BzLT5nZXRfZ3JhY2VfcGVyaW9kKCk7CisKKwlyZXR1cm4gbWF4KGxvY2tkZ3JhY2UsIG5mc2RncmFjZSk7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9uZnNfZ3JhY2VfcGVyaW9kKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X2dyYWNlX3BlcmlvZCh2b2lkKQorewogCW5sbXN2Y19ncmFjZV9wZXJpb2QgPSAxOwotCXJldHVybiBncmFjZV9wZXJpb2QgKyBqaWZmaWVzOworCXJldHVybiBnZXRfbmZzX2dyYWNlX3BlcmlvZCgpICsgamlmZmllczsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2dyYWNlX3BlcmlvZCh2b2lkKQpAQCAtMTE5LDYgKzEzMyw3IEBACiAJY29tcGxldGUoJmxvY2tkX3N0YXJ0X2RvbmUpOwogCiAJZGFlbW9uaXplKCJsb2NrZCIpOworCXNldF9mcmVlemFibGUoKTsKIAogCS8qIFByb2Nlc3MgcmVxdWVzdCB3aXRoIHNpZ25hbHMgYmxvY2tlZCwgYnV0IGFsbG93IFNJR0tJTEwuICAqLwogCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKZGlmZiAtLWdpdCBhL2ZzL21iY2FjaGUuYyBiL2ZzL21iY2FjaGUuYwppbmRleCBkZWViOWRjLi5mYmIxZDAyIDEwMDY0NAotLS0gYS9mcy9tYmNhY2hlLmMKKysrIGIvZnMvbWJjYWNoZS5jCkBAIC0xMDAsNyArMTAwLDYgQEAKIHN0YXRpYyBMSVNUX0hFQUQobWJfY2FjaGVfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKG1iX2NhY2hlX2xydV9saXN0KTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWJfY2FjaGVfc3BpbmxvY2spOwotc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqbWJfc2hyaW5rZXI7CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBtYl9jYWNoZV9pbmRleGVzKHN0cnVjdCBtYl9jYWNoZSAqY2FjaGUpCkBAIC0xMTgsNiArMTE3LDEwIEBACiAKIHN0YXRpYyBpbnQgbWJfY2FjaGVfc2hyaW5rX2ZuKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzayk7CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgbWJfY2FjaGVfc2hyaW5rZXIgPSB7CisJLnNocmluayA9IG1iX2NhY2hlX3Nocmlua19mbiwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKIAogc3RhdGljIGlubGluZSBpbnQKIF9fbWJfY2FjaGVfZW50cnlfaXNfaGFzaGVkKHN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2UpCkBAIC02NjIsMTMgKzY2NSwxMyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X21iY2FjaGUodm9pZCkKIHsKLQltYl9zaHJpbmtlciA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBtYl9jYWNoZV9zaHJpbmtfZm4pOworCXJlZ2lzdGVyX3Nocmlua2VyKCZtYl9jYWNoZV9zaHJpbmtlcik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X21iY2FjaGUodm9pZCkKIHsKLQlyZW1vdmVfc2hyaW5rZXIobWJfc2hyaW5rZXIpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJm1iX2NhY2hlX3Nocmlua2VyKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9tYmNhY2hlKQpkaWZmIC0tZ2l0IGEvZnMvbmFtZXNwYWNlLmMgYi9mcy9uYW1lc3BhY2UuYwppbmRleCBiNjk2ZTNhLi40MTk4MDAzIDEwMDY0NAotLS0gYS9mcy9uYW1lc3BhY2UuYworKysgYi9mcy9uYW1lc3BhY2UuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgInBub2RlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyogc3BpbmxvY2sgZm9yIHZmc21vdW50IHJlbGF0ZWQgb3BlcmF0aW9ucywgaW5wbGFjZSBvZiBkY2FjaGVfbG9jayAqLwogX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKHZmc21vdW50X2xvY2spOwpAQCAtMzIwLDIyICszMjEsMTYgQEAKIHN0YXRpYyB2b2lkICptX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IG1udF9uYW1lc3BhY2UgKm4gPSBtLT5wcml2YXRlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7Ci0JbG9mZl90IGwgPSAqcG9zOwogCiAJZG93bl9yZWFkKCZuYW1lc3BhY2Vfc2VtKTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZuLT5saXN0KQotCQlpZiAoIWwtLSkKLQkJCXJldHVybiBsaXN0X2VudHJ5KHAsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2xpc3QpOwotCXJldHVybiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmbi0+bGlzdCwgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICptX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCA9ICgoc3RydWN0IHZmc21vdW50ICopdiktPm1udF9saXN0Lm5leHQ7Ci0JKCpwb3MpKys7Ci0JcmV0dXJuIHAgPT0gJm4tPmxpc3QgPyBOVUxMIDogbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9saXN0KTsKKworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZuLT5saXN0LCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBtX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQpAQCAtMzUwLDcgKzM0NSw3IEBACiAKIHN0YXRpYyBpbnQgc2hvd192ZnNtbnQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gdjsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGxpc3RfZW50cnkodiwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CiAJaW50IGVyciA9IDA7CiAJc3RhdGljIHN0cnVjdCBwcm9jX2ZzX2luZm8gewogCQlpbnQgZmxhZzsKQEAgLTQwNSw3ICs0MDAsNyBAQAogCiBzdGF0aWMgaW50IHNob3dfdmZzc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IHZmc21vdW50ICptbnQgPSB2OworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9saXN0KTsKIAlpbnQgZXJyID0gMDsKIAogCS8qIGRldmljZSAqLwpAQCAtMTQ1Nyw3ICsxNDUyLDcgQEAKIAogCW5ld19ucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbnRfbmFtZXNwYWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfbnMpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWF0b21pY19zZXQoJm5ld19ucy0+Y291bnQsIDEpOwogCUlOSVRfTElTVF9IRUFEKCZuZXdfbnMtPmxpc3QpOwpAQCAtMTQ3MSw3ICsxNDY2LDcgQEAKIAlpZiAoIW5ld19ucy0+cm9vdCkgewogCQl1cF93cml0ZSgmbmFtZXNwYWNlX3NlbSk7CiAJCWtmcmVlKG5ld19ucyk7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTs7CiAJfQogCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmbmV3X25zLT5saXN0LCAmbmV3X25zLT5yb290LT5tbnRfbGlzdCk7CkBAIC0xNTE1LDcgKzE1MTAsNyBAQAogCXJldHVybiBuZXdfbnM7CiB9CiAKLXN0cnVjdCBtbnRfbmFtZXNwYWNlICpjb3B5X21udF9ucyhpbnQgZmxhZ3MsIHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucywKK3N0cnVjdCBtbnRfbmFtZXNwYWNlICpjb3B5X21udF9ucyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMsCiAJCXN0cnVjdCBmc19zdHJ1Y3QgKm5ld19mcykKIHsKIAlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbmV3X25zOwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvZmlsZS5jIGIvZnMvbmNwZnMvZmlsZS5jCmluZGV4IGQzMTUyZjguLjJiMTQ1ZGUgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2ZpbGUuYworKysgYi9mcy9uY3Bmcy9maWxlLmMKQEAgLTIwMyw3ICsyMDMsNiBAQAogCiAJaWYgKHBvcyArIGNvdW50ID4gTUFYX05PTl9MRlMgJiYgIShmaWxlLT5mX2ZsYWdzJk9fTEFSR0VGSUxFKSkgewogCQlpZiAocG9zID49IE1BWF9OT05fTEZTKSB7Ci0JCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKIAkJCXJldHVybiAtRUZCSUc7CiAJCX0KIAkJaWYgKGNvdW50ID4gTUFYX05PTl9MRlMgLSAodTMyKXBvcykgewpAQCAtMjEyLDcgKzIxMSw2IEBACiAJfQogCWlmIChwb3MgPj0gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKIAkJaWYgKGNvdW50IHx8IHBvcyA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7Ci0JCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKIAkJCXJldHVybiAtRUZCSUc7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2suYyBiL2ZzL25mcy9jYWxsYmFjay5jCmluZGV4IDc1ZjMwOWMuLmE3OTZiZTUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFjay5jCisrKyBiL2ZzL25mcy9jYWxsYmFjay5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KIApAQCAtNjcsNiArNjgsNyBAQAogCWRhZW1vbml6ZSgibmZzdjQtc3ZjIik7CiAJLyogUHJvY2VzcyByZXF1ZXN0IHdpdGggc2lnbmFscyBibG9ja2VkLCBidXQgYWxsb3cgU0lHS0lMTC4gICovCiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCXNldF9mcmVlemFibGUoKTsKIAogCWNvbXBsZXRlKCZuZnNfY2FsbGJhY2tfaW5mby5zdGFydGVkKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IGNjYjQ1NTAuLmE0OWY5ZmUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTEyMDYsMjMgKzEyMDYsOSBAQAogICovCiBzdGF0aWMgdm9pZCAqbmZzX3NlcnZlcl9saXN0X3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKLQogCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KIAlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7Ci0KLQkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCi0JaWYgKCFwb3MpCi0JCXJldHVybiBTRVFfU1RBUlRfVE9LRU47Ci0JcG9zLS07Ci0KLQkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmbmZzX2NsaWVudF9saXN0KQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJm5mc19jbGllbnRfbGlzdCA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnRfaGVhZCgmbmZzX2NsaWVudF9saXN0LCAqX3Bvcyk7CiB9CiAKIC8qCkBAIC0xMjMwLDE0ICsxMjE2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgKm5mc19zZXJ2ZXJfbGlzdF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQkoKnBvcykrKzsKLQotCV9wID0gdjsKLQlfcCA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyBuZnNfY2xpZW50X2xpc3QubmV4dCA6IF9wLT5uZXh0OwotCi0JcmV0dXJuIF9wICE9ICZuZnNfY2xpZW50X2xpc3QgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJm5mc19jbGllbnRfbGlzdCwgcG9zKTsKIH0KIAogLyoKQEAgLTEyNTYsNyArMTIzNSw3IEBACiAJc3RydWN0IG5mc19jbGllbnQgKmNscDsKIAogCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCWlmICh2ID09ICZuZnNfY2xpZW50X2xpc3QpIHsKIAkJc2VxX3B1dHMobSwgIk5WIFNFUlZFUiAgIFBPUlQgVVNFIEhPU1ROQU1FXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTI5NywyMyArMTI3Niw5IEBACiAgKi8KIHN0YXRpYyB2b2lkICpuZnNfdm9sdW1lX2xpc3Rfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwotCiAJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwogCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZuZnNfdm9sdW1lX2xpc3QpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmbmZzX3ZvbHVtZV9saXN0ID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZuZnNfdm9sdW1lX2xpc3QsICpfcG9zKTsKIH0KIAogLyoKQEAgLTEzMjEsMTQgKzEyODYsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqbmZzX3ZvbHVtZV9saXN0X25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQotCSgqcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IG5mc192b2x1bWVfbGlzdC5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJm5mc192b2x1bWVfbGlzdCA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmbmZzX3ZvbHVtZV9saXN0LCBwb3MpOwogfQogCiAvKgpAQCAtMTM0OSw3ICsxMzA3LDcgQEAKIAljaGFyIGRldls4XSwgZnNpZFsxN107CiAKIAkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwlpZiAodiA9PSAmbmZzX3ZvbHVtZV9saXN0KSB7CiAJCXNlcV9wdXRzKG0sICJOViBTRVJWRVIgICBQT1JUIERFViAgICAgRlNJRFxuIik7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBlci5jIGIvZnMvbmZzL3N1cGVyLmMKaW5kZXggYTJiMWFmOC4uYWRmZmUxNiAxMDA2NDQKLS0tIGEvZnMvbmZzL3N1cGVyLmMKKysrIGIvZnMvbmZzL3N1cGVyLmMKQEAgLTMwMCw3ICszMDAsMTAgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqYWNsX3Nocmlua2VyOworc3RhdGljIHN0cnVjdCBzaHJpbmtlciBhY2xfc2hyaW5rZXIgPSB7CisJLnNocmluawkJPSBuZnNfYWNjZXNzX2NhY2hlX3Nocmlua2VyLAorCS5zZWVrcwkJPSBERUZBVUxUX1NFRUtTLAorfTsKIAogLyoKICAqIFJlZ2lzdGVyIHRoZSBORlMgZmlsZXN5c3RlbXMKQEAgLTMyMSw3ICszMjQsNyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yXzI7CiAjZW5kaWYKLQlhY2xfc2hyaW5rZXIgPSBzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgbmZzX2FjY2Vzc19jYWNoZV9zaHJpbmtlcik7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmFjbF9zaHJpbmtlcik7CiAJcmV0dXJuIDA7CiAKICNpZmRlZiBDT05GSUdfTkZTX1Y0CkBAIC0zMzksOCArMzQyLDcgQEAKICAqLwogdm9pZCBfX2V4aXQgdW5yZWdpc3Rlcl9uZnNfZnModm9pZCkKIHsKLQlpZiAoYWNsX3Nocmlua2VyICE9IE5VTEwpCi0JCXJlbW92ZV9zaHJpbmtlcihhY2xfc2hyaW5rZXIpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmFjbF9zaHJpbmtlcik7CiAjaWZkZWYgQ09ORklHX05GU19WNAogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzNF9mc190eXBlKTsKIAluZnNfdW5yZWdpc3Rlcl9zeXNjdGwoKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvYXV0aC5jIGIvZnMvbmZzZC9hdXRoLmMKaW5kZXggNmU5MmIwZi4uY2Y2MWRjOCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9hdXRoLmMKKysrIGIvZnMvbmZzZC9hdXRoLmMKQEAgLTEyLDE3ICsxMiwzMSBAQAogCiAjZGVmaW5lCUNBUF9ORlNEX01BU0sgKENBUF9GU19NQVNLfENBUF9UT19NQVNLKENBUF9TWVNfUkVTT1VSQ0UpKQogCitzdGF0aWMgaW50IG5mc2V4cF9mbGFncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQoreworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmY7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZW5kID0gZXhwLT5leF9mbGF2b3JzICsgZXhwLT5leF9uZmxhdm9yczsKKworCWZvciAoZiA9IGV4cC0+ZXhfZmxhdm9yczsgZiA8IGVuZDsgZisrKSB7CisJCWlmIChmLT5wc2V1ZG9mbGF2b3IgPT0gcnFzdHAtPnJxX2ZsYXZvcikKKwkJCXJldHVybiBmLT5mbGFnczsKKwl9CisJcmV0dXJuIGV4cC0+ZXhfZmxhZ3M7CisKK30KKwogaW50IG5mc2Rfc2V0dXNlcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQogewogCXN0cnVjdCBzdmNfY3JlZAljcmVkID0gcnFzdHAtPnJxX2NyZWQ7CiAJaW50IGk7CisJaW50IGZsYWdzID0gbmZzZXhwX2ZsYWdzKHJxc3RwLCBleHApOwogCWludCByZXQ7CiAKLQlpZiAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9BTExTUVVBU0gpIHsKKwlpZiAoZmxhZ3MgJiBORlNFWFBfQUxMU1FVQVNIKSB7CiAJCWNyZWQuY3JfdWlkID0gZXhwLT5leF9hbm9uX3VpZDsKIAkJY3JlZC5jcl9naWQgPSBleHAtPmV4X2Fub25fZ2lkOwogCQljcmVkLmNyX2dyb3VwX2luZm8gPSBncm91cHNfYWxsb2MoMCk7Ci0JfSBlbHNlIGlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX1JPT1RTUVVBU0gpIHsKKwl9IGVsc2UgaWYgKGZsYWdzICYgTkZTRVhQX1JPT1RTUVVBU0gpIHsKIAkJc3RydWN0IGdyb3VwX2luZm8gKmdpOwogCQlpZiAoIWNyZWQuY3JfdWlkKQogCQkJY3JlZC5jcl91aWQgPSBleHAtPmV4X2Fub25fdWlkOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9leHBvcnQuYyBiL2ZzL25mc2QvZXhwb3J0LmMKaW5kZXggNzliZDAzYi4uYzdiYmY0NiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9leHBvcnQuYworKysgYi9mcy9uZnNkL2V4cG9ydC5jCkBAIC0yNiwxMiArMjYsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZmguaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9iaW5kLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL21zZ19wcm90Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19hcGkuaD4KIAogI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCU5GU0REQkdfRVhQT1JUCiAKQEAgLTQ1MSw4ICs0NTQsNDggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHNlY2luZm9fcGFyc2UoY2hhciAqKm1lc2csIGNoYXIgKmJ1Ziwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3sKKwlpbnQgbGlzdHNpemUsIGVycjsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICpmOworCisJZXJyID0gZ2V0X2ludChtZXNnLCAmbGlzdHNpemUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKGxpc3RzaXplIDwgMCB8fCBsaXN0c2l6ZSA+IE1BWF9TRUNJTkZPX0xJU1QpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChmID0gZXhwLT5leF9mbGF2b3JzOyBmIDwgZXhwLT5leF9mbGF2b3JzICsgbGlzdHNpemU7IGYrKykgeworCQllcnIgPSBnZXRfaW50KG1lc2csICZmLT5wc2V1ZG9mbGF2b3IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJLyoKKwkJICogSnVzdCBhIHF1aWNrIHNhbml0eSBjaGVjazsgd2UgY291bGQgYWxzbyB0cnkgdG8gY2hlY2sKKwkJICogd2hldGhlciB0aGlzIHBzZXVkb2ZsYXZvciBpcyBzdXBwb3J0ZWQsIGJ1dCBhdCB3b3JzdAorCQkgKiBhbiB1bnN1cHBvcnRlZCBwc2V1ZG9mbGF2b3Igb24gdGhlIGV4cG9ydCB3b3VsZCBqdXN0CisJCSAqIGJlIGEgcHNldWRvZmxhdm9yIHRoYXQgd29uJ3QgbWF0Y2ggdGhlIGZsYXZvciBvZiBhbnkKKwkJICogYXV0aGVudGljYXRlZCByZXF1ZXN0LiAgVGhlIGFkbWluaXN0cmF0b3Igd2lsbAorCQkgKiBwcm9iYWJseSBkaXNjb3ZlciB0aGUgcHJvYmxlbSB3aGVuIHNvbWVvbmUgZmFpbHMgdG8KKwkJICogYXV0aGVudGljYXRlLgorCQkgKi8KKwkJaWYgKGYtPnBzZXVkb2ZsYXZvciA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gZ2V0X2ludChtZXNnLCAmZi0+ZmxhZ3MpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJLyogT25seSBzb21lIGZsYWdzIGFyZSBhbGxvd2VkIHRvIGRpZmZlciBiZXR3ZWVuIGZsYXZvcnM6ICovCisJCWlmICh+TkZTRVhQX1NFQ0lORk9fRkxBR1MgJiAoZi0+ZmxhZ3MgXiBleHAtPmV4X2ZsYWdzKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlleHAtPmV4X25mbGF2b3JzID0gbGlzdHNpemU7CisJcmV0dXJuIDA7Cit9CisKICNlbHNlIC8qIENPTkZJR19ORlNEX1Y0ICovCi1zdGF0aWMgaW5saW5lIGludCBmc2xvY19wYXJzZShjaGFyICoqbWVzZywgY2hhciAqYnVmLCBzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zICpmc2xvYykgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQKK2ZzbG9jX3BhcnNlKGNoYXIgKiptZXNnLCBjaGFyICpidWYsIHN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgKmZzbG9jKXtyZXR1cm4gMDt9CitzdGF0aWMgaW5saW5lIGludAorc2VjaW5mb19wYXJzZShjaGFyICoqbWVzZywgY2hhciAqYnVmLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAogc3RhdGljIGludCBzdmNfZXhwb3J0X3BhcnNlKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLCBjaGFyICptZXNnLCBpbnQgbWxlbikKQEAgLTQ3Niw2ICs1MTksOSBAQAogCiAJZXhwLmV4X3V1aWQgPSBOVUxMOwogCisJLyogc2VjaW5mbyAqLworCWV4cC5leF9uZmxhdm9ycyA9IDA7CisKIAlpZiAobWVzZ1ttbGVuLTFdICE9ICdcbicpCiAJCXJldHVybiAtRUlOVkFMOwogCW1lc2dbbWxlbi0xXSA9IDA7CkBAIC01NTMsNyArNTk5LDkgQEAKIAkJCQkJaWYgKGV4cC5leF91dWlkID09IE5VTEwpCiAJCQkJCQllcnIgPSAtRU5PTUVNOwogCQkJCX0KLQkJCX0gZWxzZQorCQkJfSBlbHNlIGlmIChzdHJjbXAoYnVmLCAic2VjaW5mbyIpID09IDApCisJCQkJZXJyID0gc2VjaW5mb19wYXJzZSgmbWVzZywgYnVmLCAmZXhwKTsKKwkJCWVsc2UKIAkJCQkvKiBxdWlldGx5IGlnbm9yZSB1bmtub3duIHdvcmRzIGFuZCBhbnl0aGluZwogCQkJCSAqIGZvbGxvd2luZy4gTmV3ZXIgdXNlci1zcGFjZSBjYW4gdHJ5IHRvIHNldAogCQkJCSAqIG5ldyB2YWx1ZXMsIHRoZW4gc2VlIHdoYXQgdGhlIHJlc3VsdCB3YXMuCkBAIC01OTMsNiArNjQxLDcgQEAKIAogc3RhdGljIHZvaWQgZXhwX2ZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGZsYWcsIGludCBmc2lkLAogCQl1aWRfdCBhbm9udSwgdWlkX3QgYW5vbmcsIHN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgKmZzbG9jcyk7CitzdGF0aWMgdm9pZCBzaG93X3NlY2luZm8oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKTsKIAogc3RhdGljIGludCBzdmNfZXhwb3J0X3Nob3coc3RydWN0IHNlcV9maWxlICptLAogCQkJICAgc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsCkBAIC02MjIsNiArNjcxLDcgQEAKIAkJCQlzZXFfcHJpbnRmKG0sICIlMDJ4IiwgZXhwLT5leF91dWlkW2ldKTsKIAkJCX0KIAkJfQorCQlzaG93X3NlY2luZm8obSwgZXhwKTsKIAl9CiAJc2VxX3B1dHMobSwgIilcbiIpOwogCXJldHVybiAwOwpAQCAtNjU0LDYgKzcwNCw3IEBACiB7CiAJc3RydWN0IHN2Y19leHBvcnQgKm5ldyA9IGNvbnRhaW5lcl9vZihjbmV3LCBzdHJ1Y3Qgc3ZjX2V4cG9ydCwgaCk7CiAJc3RydWN0IHN2Y19leHBvcnQgKml0ZW0gPSBjb250YWluZXJfb2YoY2l0ZW0sIHN0cnVjdCBzdmNfZXhwb3J0LCBoKTsKKwlpbnQgaTsKIAogCW5ldy0+ZXhfZmxhZ3MgPSBpdGVtLT5leF9mbGFnczsKIAluZXctPmV4X2Fub25fdWlkID0gaXRlbS0+ZXhfYW5vbl91aWQ7CkBAIC02NjksNiArNzIwLDEwIEBACiAJaXRlbS0+ZXhfZnNsb2NzLmxvY2F0aW9uc19jb3VudCA9IDA7CiAJbmV3LT5leF9mc2xvY3MubWlncmF0ZWQgPSBpdGVtLT5leF9mc2xvY3MubWlncmF0ZWQ7CiAJaXRlbS0+ZXhfZnNsb2NzLm1pZ3JhdGVkID0gMDsKKwluZXctPmV4X25mbGF2b3JzID0gaXRlbS0+ZXhfbmZsYXZvcnM7CisJZm9yIChpID0gMDsgaSA8IE1BWF9TRUNJTkZPX0xJU1Q7IGkrKykgeworCQluZXctPmV4X2ZsYXZvcnNbaV0gPSBpdGVtLT5leF9mbGF2b3JzW2ldOworCX0KIH0KIAogc3RhdGljIHN0cnVjdCBjYWNoZV9oZWFkICpzdmNfZXhwb3J0X2FsbG9jKHZvaWQpCkBAIC03MzgsMTYgKzc5MywxOCBAQAogCWludCBlcnI7CiAJCiAJaWYgKCFjbHApCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAogCWtleS5la19jbGllbnQgPSBjbHA7CiAJa2V5LmVrX2ZzaWR0eXBlID0gZnNpZF90eXBlOwogCW1lbWNweShrZXkuZWtfZnNpZCwgZnNpZHYsIGtleV9sZW4oZnNpZF90eXBlKSk7CiAKIAllayA9IHN2Y19leHBrZXlfbG9va3VwKCZrZXkpOwotCWlmIChlayAhPSBOVUxMKQotCQlpZiAoKGVyciA9IGNhY2hlX2NoZWNrKCZzdmNfZXhwa2V5X2NhY2hlLCAmZWstPmgsIHJlcXApKSkKLQkJCWVrID0gRVJSX1BUUihlcnIpOworCWlmIChlayA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwllcnIgPSBjYWNoZV9jaGVjaygmc3ZjX2V4cGtleV9jYWNoZSwgJmVrLT5oLCByZXFwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCXJldHVybiBlazsKIH0KIApAQCAtODA4LDMwICs4NjUsMjEgQEAKIAkJc3RydWN0IGNhY2hlX3JlcSAqcmVxcCkKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBrZXk7CisJaW50IGVycjsKIAkKIAlpZiAoIWNscCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCiAJa2V5LmV4X2NsaWVudCA9IGNscDsKIAlrZXkuZXhfbW50ID0gbW50OwogCWtleS5leF9kZW50cnkgPSBkZW50cnk7CiAKIAlleHAgPSBzdmNfZXhwb3J0X2xvb2t1cCgma2V5KTsKLQlpZiAoZXhwICE9IE5VTEwpICB7Ci0JCWludCBlcnI7Ci0KLQkJZXJyID0gY2FjaGVfY2hlY2soJnN2Y19leHBvcnRfY2FjaGUsICZleHAtPmgsIHJlcXApOwotCQlzd2l0Y2ggKGVycikgewotCQljYXNlIDA6IGJyZWFrOwotCQljYXNlIC1FQUdBSU46Ci0JCWNhc2UgLUVUSU1FRE9VVDoKLQkJCWV4cCA9IEVSUl9QVFIoZXJyKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXhwID0gTlVMTDsKLQkJfQotCX0KLQorCWlmIChleHAgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZXJyID0gY2FjaGVfY2hlY2soJnN2Y19leHBvcnRfY2FjaGUsICZleHAtPmgsIHJlcXApOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CiAJcmV0dXJuIGV4cDsKIH0KIApAQCAtODQ3LDcgKzg5NSw3IEBACiAJZGdldChkZW50cnkpOwogCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShjbHAsIG1udCwgZGVudHJ5LCByZXFwKTsKIAotCXdoaWxlIChleHAgPT0gTlVMTCAmJiAhSVNfUk9PVChkZW50cnkpKSB7CisJd2hpbGUgKFBUUl9FUlIoZXhwKSA9PSAtRU5PRU5UICYmICFJU19ST09UKGRlbnRyeSkpIHsKIAkJc3RydWN0IGRlbnRyeSAqcGFyZW50OwogCiAJCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CkBAIC05MDAsNyArOTQ4LDcgQEAKIAkJcmV0dXJuOwogCiAJZWsgPSBleHBfZ2V0X2ZzaWRfa2V5KGV4cC0+ZXhfY2xpZW50LCBleHAtPmV4X2ZzaWQpOwotCWlmIChlayAmJiAhSVNfRVJSKGVrKSkgeworCWlmICghSVNfRVJSKGVrKSkgewogCQllay0+aC5leHBpcnlfdGltZSA9IGdldF9zZWNvbmRzKCktMTsKIAkJY2FjaGVfcHV0KCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOwogCX0KQEAgLTkzOCw3ICs5ODYsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBleHAtPmV4X2RlbnRyeS0+ZF9pbm9kZTsKIAogCWVrID0gZXhwX2dldF9rZXkoZXhwLT5leF9jbGllbnQsIGlub2RlLT5pX3NiLT5zX2RldiwgaW5vZGUtPmlfaW5vKTsKLQlpZiAoZWsgJiYgIUlTX0VSUihlaykpIHsKKwlpZiAoIUlTX0VSUihlaykpIHsKIAkJZWstPmguZXhwaXJ5X3RpbWUgPSBnZXRfc2Vjb25kcygpLTE7CiAJCWNhY2hlX3B1dCgmZWstPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKIAl9CkBAIC05ODksMTMgKzEwMzcsMTIgQEAKIAogCS8qIG11c3QgbWFrZSBzdXJlIHRoZXJlIHdvbid0IGJlIGFuIGV4X2ZzaWQgY2xhc2ggKi8KIAlpZiAoKG54cC0+ZXhfZmxhZ3MgJiBORlNFWFBfRlNJRCkgJiYKLQkgICAgKGZzaWRfa2V5ID0gZXhwX2dldF9mc2lkX2tleShjbHAsIG54cC0+ZXhfZGV2KSkgJiYKLQkgICAgIUlTX0VSUihmc2lkX2tleSkgJiYKKwkgICAgKCFJU19FUlIoZnNpZF9rZXkgPSBleHBfZ2V0X2ZzaWRfa2V5KGNscCwgbnhwLT5leF9kZXYpKSkgJiYKIAkgICAgZnNpZF9rZXktPmVrX21udCAmJgogCSAgICAoZnNpZF9rZXktPmVrX21udCAhPSBuZC5tbnQgfHwgZnNpZF9rZXktPmVrX2RlbnRyeSAhPSBuZC5kZW50cnkpICkKIAkJZ290byBmaW5pc2g7CiAKLQlpZiAoZXhwKSB7CisJaWYgKCFJU19FUlIoZXhwKSkgewogCQkvKiBqdXN0IGEgZmxhZ3MvaWQvZnNpZCB1cGRhdGUgKi8KIAogCQlleHBfZnNpZF91bmhhc2goZXhwKTsKQEAgLTExMDQsNyArMTE1MSw3IEBACiAJZXJyID0gLUVJTlZBTDsKIAlleHAgPSBleHBfZ2V0X2J5X25hbWUoZG9tLCBuZC5tbnQsIG5kLmRlbnRyeSwgTlVMTCk7CiAJcGF0aF9yZWxlYXNlKCZuZCk7Ci0JaWYgKCFleHApCisJaWYgKElTX0VSUihleHApKQogCQlnb3RvIG91dF9kb21haW47CiAKIAlleHBfZG9fdW5leHBvcnQoZXhwKTsKQEAgLTExNDksMTAgKzExOTYsNiBAQAogCQllcnIgPSBQVFJfRVJSKGV4cCk7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoIWV4cCkgewotCQlkcHJpbnRrKCJuZnNkOiBleHBfcm9vdGZoIGV4cG9ydCBub3QgZm91bmQuXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQogCiAJLyoKIAkgKiBmaCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGZoX2NvbXBvc2UKQEAgLTExNzYsMTcgKzEyMTksMTMwIEBACiB7CiAJc3RydWN0IHN2Y19leHBvcnQgKmV4cDsKIAlzdHJ1Y3Qgc3ZjX2V4cGtleSAqZWsgPSBleHBfZmluZF9rZXkoY2xwLCBmc2lkX3R5cGUsIGZzaWR2LCByZXFwKTsKLQlpZiAoIWVrIHx8IElTX0VSUihlaykpCisJaWYgKElTX0VSUihlaykpCiAJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoZWspKTsKIAogCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShjbHAsIGVrLT5la19tbnQsIGVrLT5la19kZW50cnksIHJlcXApOwogCWNhY2hlX3B1dCgmZWstPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKIAotCWlmICghZXhwIHx8IElTX0VSUihleHApKQorCWlmIChJU19FUlIoZXhwKSkKIAkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihleHApKTsKIAlyZXR1cm4gZXhwOwogfQogCitfX2JlMzIgY2hlY2tfbmZzZF9hY2Nlc3Moc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICpmOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmVuZCA9IGV4cC0+ZXhfZmxhdm9ycyArIGV4cC0+ZXhfbmZsYXZvcnM7CisKKwkvKiBsZWdhY3kgZ3NzLW9ubHkgY2xpZW50cyBhcmUgYWx3YXlzIE9LOiAqLworCWlmIChleHAtPmV4X2NsaWVudCA9PSBycXN0cC0+cnFfZ3NzY2xpZW50KQorCQlyZXR1cm4gMDsKKwkvKiBpcC1hZGRyZXNzIGJhc2VkIGNsaWVudDsgY2hlY2sgc2VjPSBleHBvcnQgb3B0aW9uOiAqLworCWZvciAoZiA9IGV4cC0+ZXhfZmxhdm9yczsgZiA8IGVuZDsgZisrKSB7CisJCWlmIChmLT5wc2V1ZG9mbGF2b3IgPT0gcnFzdHAtPnJxX2ZsYXZvcikKKwkJCXJldHVybiAwOworCX0KKwkvKiBkZWZhdWx0cyBpbiBhYnNlbmNlIG9mIHNlYz0gb3B0aW9uczogKi8KKwlpZiAoZXhwLT5leF9uZmxhdm9ycyA9PSAwKSB7CisJCWlmIChycXN0cC0+cnFfZmxhdm9yID09IFJQQ19BVVRIX05VTEwgfHwKKwkJICAgIHJxc3RwLT5ycV9mbGF2b3IgPT0gUlBDX0FVVEhfVU5JWCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gbmZzZXJyX3dyb25nc2VjOworfQorCisvKgorICogVXNlcyBycV9jbGllbnQgYW5kIHJxX2dzc2NsaWVudCB0byBmaW5kIGFuIGV4cG9ydDsgdXNlcyBycV9jbGllbnQgKGFuCisgKiBhdXRoX3VuaXggY2xpZW50KSBpZiBpdCdzIGF2YWlsYWJsZSBhbmQgaGFzIHNlY2luZm8gaW5mb3JtYXRpb247CisgKiBvdGhlcndpc2UsIHdpbGwgdHJ5IHRvIHVzZSBycV9nc3NjbGllbnQuCisgKgorICogQ2FsbGVkIGZyb20gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHJlcXVlc3RzOyBmdW5jdGlvbnMgdGhhdCBkbyB3b3JrIG9uCisgKiBiZWhhbGYgb2YgbW91bnRkIGFyZSBwYXNzZWQgYSBzaW5nbGUgY2xpZW50IG5hbWUgdG8gdXNlLCBhbmQgc2hvdWxkCisgKiB1c2UgZXhwX2dldF9ieV9uYW1lKCkgb3IgZXhwX2ZpbmQoKS4KKyAqLworc3RydWN0IHN2Y19leHBvcnQgKgorcnFzdF9leHBfZ2V0X2J5X25hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHZmc21vdW50ICptbnQsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZ3NzZXhwLCAqZXhwID0gTlVMTDsKKworCWlmIChycXN0cC0+cnFfY2xpZW50ID09IE5VTEwpCisJCWdvdG8gZ3NzOworCisJLyogRmlyc3QgdHJ5IHRoZSBhdXRoX3VuaXggY2xpZW50OiAqLworCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShycXN0cC0+cnFfY2xpZW50LCBtbnQsIGRlbnRyeSwKKwkJCQkJCSZycXN0cC0+cnFfY2hhbmRsZSk7CisJaWYgKFBUUl9FUlIoZXhwKSA9PSAtRU5PRU5UKQorCQlnb3RvIGdzczsKKwlpZiAoSVNfRVJSKGV4cCkpCisJCXJldHVybiBleHA7CisJLyogSWYgaXQgaGFzIHNlY2luZm8sIGFzc3VtZSB0aGVyZSBhcmUgbm8gZ3NzLy4uLiBjbGllbnRzICovCisJaWYgKGV4cC0+ZXhfbmZsYXZvcnMgPiAwKQorCQlyZXR1cm4gZXhwOworZ3NzOgorCS8qIE90aGVyd2lzZSwgdHJ5IGZhbGxpbmcgYmFjayBvbiBnc3MgY2xpZW50ICovCisJaWYgKHJxc3RwLT5ycV9nc3NjbGllbnQgPT0gTlVMTCkKKwkJcmV0dXJuIGV4cDsKKwlnc3NleHAgPSBleHBfZ2V0X2J5X25hbWUocnFzdHAtPnJxX2dzc2NsaWVudCwgbW50LCBkZW50cnksCisJCQkJCQkmcnFzdHAtPnJxX2NoYW5kbGUpOworCWlmIChQVFJfRVJSKGdzc2V4cCkgPT0gLUVOT0VOVCkKKwkJcmV0dXJuIGV4cDsKKwlpZiAoZXhwICYmICFJU19FUlIoZXhwKSkKKwkJZXhwX3B1dChleHApOworCXJldHVybiBnc3NleHA7Cit9CisKK3N0cnVjdCBzdmNfZXhwb3J0ICoKK3Jxc3RfZXhwX2ZpbmQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IGZzaWRfdHlwZSwgdTMyICpmc2lkdikKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZ3NzZXhwLCAqZXhwID0gTlVMTDsKKworCWlmIChycXN0cC0+cnFfY2xpZW50ID09IE5VTEwpCisJCWdvdG8gZ3NzOworCisJLyogRmlyc3QgdHJ5IHRoZSBhdXRoX3VuaXggY2xpZW50OiAqLworCWV4cCA9IGV4cF9maW5kKHJxc3RwLT5ycV9jbGllbnQsIGZzaWRfdHlwZSwgZnNpZHYsICZycXN0cC0+cnFfY2hhbmRsZSk7CisJaWYgKFBUUl9FUlIoZXhwKSA9PSAtRU5PRU5UKQorCQlnb3RvIGdzczsKKwlpZiAoSVNfRVJSKGV4cCkpCisJCXJldHVybiBleHA7CisJLyogSWYgaXQgaGFzIHNlY2luZm8sIGFzc3VtZSB0aGVyZSBhcmUgbm8gZ3NzLy4uLiBjbGllbnRzICovCisJaWYgKGV4cC0+ZXhfbmZsYXZvcnMgPiAwKQorCQlyZXR1cm4gZXhwOworZ3NzOgorCS8qIE90aGVyd2lzZSwgdHJ5IGZhbGxpbmcgYmFjayBvbiBnc3MgY2xpZW50ICovCisJaWYgKHJxc3RwLT5ycV9nc3NjbGllbnQgPT0gTlVMTCkKKwkJcmV0dXJuIGV4cDsKKwlnc3NleHAgPSBleHBfZmluZChycXN0cC0+cnFfZ3NzY2xpZW50LCBmc2lkX3R5cGUsIGZzaWR2LAorCQkJCQkJJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlpZiAoUFRSX0VSUihnc3NleHApID09IC1FTk9FTlQpCisJCXJldHVybiBleHA7CisJaWYgKGV4cCAmJiAhSVNfRVJSKGV4cCkpCisJCWV4cF9wdXQoZXhwKTsKKwlyZXR1cm4gZ3NzZXhwOworfQorCitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCitycXN0X2V4cF9wYXJlbnQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHZmc21vdW50ICptbnQsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwOworCisJZGdldChkZW50cnkpOworCWV4cCA9IHJxc3RfZXhwX2dldF9ieV9uYW1lKHJxc3RwLCBtbnQsIGRlbnRyeSk7CisKKwl3aGlsZSAoUFRSX0VSUihleHApID09IC1FTk9FTlQgJiYgIUlTX1JPT1QoZGVudHJ5KSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisKKwkJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBwYXJlbnQ7CisJCWV4cCA9IHJxc3RfZXhwX2dldF9ieV9uYW1lKHJxc3RwLCBtbnQsIGRlbnRyeSk7CisJfQorCWRwdXQoZGVudHJ5KTsKKwlyZXR1cm4gZXhwOworfQogCiAvKgogICogQ2FsbGVkIHdoZW4gd2UgbmVlZCB0aGUgZmlsZWhhbmRsZSBmb3IgdGhlIHJvb3Qgb2YgdGhlIHBzZXVkb2ZzLApAQCAtMTE5NCw4ICsxMzUwLDcgQEAKICAqIGV4cG9ydCBwb2ludCB3aXRoIGZzaWQ9PTAKICAqLwogX19iZTMyCi1leHBfcHNldWRvcm9vdChzdHJ1Y3QgYXV0aF9kb21haW4gKmNscCwgc3RydWN0IHN2Y19maCAqZmhwLAotCSAgICAgICBzdHJ1Y3QgY2FjaGVfcmVxICpjcmVxKQorZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCXN0cnVjdCBzdmNfZXhwb3J0ICpleHA7CiAJX19iZTMyIHJ2OwpAQCAtMTIwMywxMiArMTM1OCwxNiBAQAogCiAJbWtfZnNpZChGU0lEX05VTSwgZnNpZHYsIDAsIDAsIDAsIE5VTEwpOwogCi0JZXhwID0gZXhwX2ZpbmQoY2xwLCBGU0lEX05VTSwgZnNpZHYsIGNyZXEpOworCWV4cCA9IHJxc3RfZXhwX2ZpbmQocnFzdHAsIEZTSURfTlVNLCBmc2lkdik7CisJaWYgKFBUUl9FUlIoZXhwKSA9PSAtRU5PRU5UKQorCQlyZXR1cm4gbmZzZXJyX3Blcm07CiAJaWYgKElTX0VSUihleHApKQogCQlyZXR1cm4gbmZzZXJybm8oUFRSX0VSUihleHApKTsKLQlpZiAoZXhwID09IE5VTEwpCi0JCXJldHVybiBuZnNlcnJfcGVybTsKIAlydiA9IGZoX2NvbXBvc2UoZmhwLCBleHAsIGV4cC0+ZXhfZGVudHJ5LCBOVUxMKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OworCXJ2ID0gY2hlY2tfbmZzZF9hY2Nlc3MoZXhwLCBycXN0cCk7CitvdXQ6CiAJZXhwX3B1dChleHApOwogCXJldHVybiBydjsKIH0KQEAgLTEyOTYsMjggKzE0NTUsNjIgQEAKIAl7IDAsIHsiIiwgIiJ9fQogfTsKIAotc3RhdGljIHZvaWQgZXhwX2ZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGZsYWcsIGludCBmc2lkLAotCQl1aWRfdCBhbm9udSwgdWlkX3QgYW5vbmcsIHN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgKmZzbG9jKQorc3RhdGljIHZvaWQgc2hvd19leHBmbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBmbGFncywgaW50IG1hc2spCiB7Ci0JaW50IGZpcnN0ID0gMDsKIAlzdHJ1Y3QgZmxhZ3MgKmZsZzsKKwlpbnQgc3RhdGUsIGZpcnN0ID0gMDsKIAogCWZvciAoZmxnID0gZXhwZmxhZ3M7IGZsZy0+ZmxhZzsgZmxnKyspIHsKLQkJaW50IHN0YXRlID0gKGZsZy0+ZmxhZyAmIGZsYWcpPzA6MTsKKwkJaWYgKGZsZy0+ZmxhZyAmIH5tYXNrKQorCQkJY29udGludWU7CisJCXN0YXRlID0gKGZsZy0+ZmxhZyAmIGZsYWdzKSA/IDAgOiAxOwogCQlpZiAoKmZsZy0+bmFtZVtzdGF0ZV0pCiAJCQlzZXFfcHJpbnRmKG0sICIlcyVzIiwgZmlyc3QrKz8iLCI6IiIsIGZsZy0+bmFtZVtzdGF0ZV0pOwogCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19zZWNpbmZvX2ZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGZsYWdzKQoreworCXNlcV9wcmludGYobSwgIiwiKTsKKwlzaG93X2V4cGZsYWdzKG0sIGZsYWdzLCBORlNFWFBfU0VDSU5GT19GTEFHUyk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc2VjaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCit7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZjsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICplbmQgPSBleHAtPmV4X2ZsYXZvcnMgKyBleHAtPmV4X25mbGF2b3JzOworCWludCBsYXN0ZmxhZ3MgPSAwLCBmaXJzdCA9IDA7CisKKwlpZiAoZXhwLT5leF9uZmxhdm9ycyA9PSAwKQorCQlyZXR1cm47CisJZm9yIChmID0gZXhwLT5leF9mbGF2b3JzOyBmIDwgZW5kOyBmKyspIHsKKwkJaWYgKGZpcnN0IHx8IGYtPmZsYWdzICE9IGxhc3RmbGFncykgeworCQkJaWYgKCFmaXJzdCkKKwkJCQlzaG93X3NlY2luZm9fZmxhZ3MobSwgbGFzdGZsYWdzKTsKKwkJCXNlcV9wcmludGYobSwgIixzZWM9JWQiLCBmLT5wc2V1ZG9mbGF2b3IpOworCQkJbGFzdGZsYWdzID0gZi0+ZmxhZ3M7CisJCX0gZWxzZSB7CisJCQlzZXFfcHJpbnRmKG0sICI6JWQiLCBmLT5wc2V1ZG9mbGF2b3IpOworCQl9CisJfQorCXNob3dfc2VjaW5mb19mbGFncyhtLCBsYXN0ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBleHBfZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZywgaW50IGZzaWQsCisJCXVpZF90IGFub251LCB1aWRfdCBhbm9uZywgc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyAqZnNsb2MpCit7CisJc2hvd19leHBmbGFncyhtLCBmbGFnLCBORlNFWFBfQUxMRkxBR1MpOwogCWlmIChmbGFnICYgTkZTRVhQX0ZTSUQpCi0JCXNlcV9wcmludGYobSwgIiVzZnNpZD0lZCIsIGZpcnN0Kys/IiwiOiIiLCBmc2lkKTsKKwkJc2VxX3ByaW50ZihtLCAiLGZzaWQ9JWQiLCBmc2lkKTsKIAlpZiAoYW5vbnUgIT0gKHVpZF90KS0yICYmIGFub251ICE9ICgweDEwMDAwLTIpKQotCQlzZXFfcHJpbnRmKG0sICIlc2Fub251aWQ9JWQiLCBmaXJzdCsrPyIsIjoiIiwgYW5vbnUpOworCQlzZXFfcHJpbnRmKG0sICIsc2Fub251aWQ9JWQiLCBhbm9udSk7CiAJaWYgKGFub25nICE9IChnaWRfdCktMiAmJiBhbm9uZyAhPSAoMHgxMDAwMC0yKSkKLQkJc2VxX3ByaW50ZihtLCAiJXNhbm9uZ2lkPSVkIiwgZmlyc3QrKz8iLCI6IiIsIGFub25nKTsKKwkJc2VxX3ByaW50ZihtLCAiLHNhbm9uZ2lkPSVkIiwgYW5vbmcpOwogCWlmIChmc2xvYyAmJiBmc2xvYy0+bG9jYXRpb25zX2NvdW50ID4gMCkgewogCQljaGFyICpsb2N0eXBlID0gKGZzbG9jLT5taWdyYXRlZCkgPyAicmVmZXIiIDogInJlcGxpY2FzIjsKIAkJaW50IGk7CiAKLQkJc2VxX3ByaW50ZihtLCAiJXMlcz0iLCBmaXJzdCsrPyIsIjoiIiwgbG9jdHlwZSk7CisJCXNlcV9wcmludGYobSwgIiwlcz0iLCBsb2N0eXBlKTsKIAkJc2VxX2VzY2FwZShtLCBmc2xvYy0+bG9jYXRpb25zWzBdLnBhdGgsICIsO0AgXHRcblxcIik7CiAJCXNlcV9wdXRjKG0sICdAJyk7CiAJCXNlcV9lc2NhcGUobSwgZnNsb2MtPmxvY2F0aW9uc1swXS5ob3N0cywgIiw7QCBcdFxuXFwiKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbG9ja2QuYyBiL2ZzL25mc2QvbG9ja2QuYwppbmRleCAyMjFhY2QxLi45ZTRhNTY4IDEwMDY0NAotLS0gYS9mcy9uZnNkL2xvY2tkLmMKKysrIGIvZnMvbmZzZC9sb2NrZC5jCkBAIC02NSw2ICs2NSw3IEBACiBzdGF0aWMgc3RydWN0IG5sbXN2Y19iaW5kaW5nCW5mc2RfbmxtX29wcyA9IHsKIAkuZm9wZW4JCT0gbmxtX2ZvcGVuLAkJLyogb3BlbiBmaWxlIGZvciBsb2NraW5nICovCiAJLmZjbG9zZQkJPSBubG1fZmNsb3NlLAkJLyogY2xvc2UgZmlsZSAqLworCS5nZXRfZ3JhY2VfcGVyaW9kID0gZ2V0X25mczRfZ3JhY2VfcGVyaW9kLAogfTsKIAogdm9pZApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0YWNsLmMgYi9mcy9uZnNkL25mczRhY2wuYwppbmRleCBjYzNiN2JhLi5iNmVkMzgzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRhY2wuYworKysgYi9mcy9uZnNkL25mczRhY2wuYwpAQCAtMTgzLDggKzE4MywxMyBAQAogc3VtbWFyaXplX3Bvc2l4X2FjbChzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHN0cnVjdCBwb3NpeF9hY2xfc3VtbWFyeSAqcGFzKQogewogCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnBhLCAqcGU7Ci0JcGFzLT51c2VycyA9IDA7Ci0JcGFzLT5ncm91cHMgPSAwOworCisJLyoKKwkgKiBPbmx5IHBhcy51c2VycyBhbmQgcGFzLmdyb3VwcyBuZWVkIGluaXRpYWxpemF0aW9uOyBwcmV2aW91cworCSAqIHBvc2l4X2FjbF92YWxpZCgpIGNhbGxzIGVuc3VyZSB0aGF0IHRoZSBvdGhlciBmaWVsZHMgd2lsbCBiZQorCSAqIGluaXRpYWxpemVkIGluIHRoZSBmb2xsb3dpbmcgbG9vcC4gIEJ1dCwganVzdCB0byBwbGFjYXRlIGdjYzoKKwkgKi8KKwltZW1zZXQocGFzLCAwLCBzaXplb2YoKnBhcykpOwogCXBhcy0+bWFzayA9IDA3OwogCiAJcGUgPSBhY2wtPmFfZW50cmllcyArIGFjbC0+YV9jb3VudDsKQEAgLTczMiwxMyArNzM3LDE2IEBACiAJKnBhY2wgPSBwb3NpeF9zdGF0ZV90b19hY2woJmVmZmVjdGl2ZV9hY2xfc3RhdGUsIGZsYWdzKTsKIAlpZiAoSVNfRVJSKCpwYWNsKSkgewogCQlyZXQgPSBQVFJfRVJSKCpwYWNsKTsKKwkJKnBhY2wgPSBOVUxMOwogCQlnb3RvIG91dF9kc3RhdGU7CiAJfQogCSpkcGFjbCA9IHBvc2l4X3N0YXRlX3RvX2FjbCgmZGVmYXVsdF9hY2xfc3RhdGUsCiAJCQkJCQlmbGFncyB8IE5GUzRfQUNMX1RZUEVfREVGQVVMVCk7CiAJaWYgKElTX0VSUigqZHBhY2wpKSB7CiAJCXJldCA9IFBUUl9FUlIoKmRwYWNsKTsKKwkJKmRwYWNsID0gTlVMTDsKIAkJcG9zaXhfYWNsX3JlbGVhc2UoKnBhY2wpOworCQkqcGFjbCA9IE5VTEw7CiAJCWdvdG8gb3V0X2RzdGF0ZTsKIAl9CiAJc29ydF9wYWNsKCpwYWNsKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCmluZGV4IDU0NDNjNTIuLjMxZDY2MzMgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKKysrIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwpAQCAtNzUsNyArNzUsNyBAQAogI2RlZmluZSBvcF9lbmNfc3oJCQkxCiAjZGVmaW5lIG9wX2RlY19zegkJCTIKICNkZWZpbmUgZW5jX25mczRfZmhfc3oJCQkoMSArIChORlM0X0ZIU0laRSA+PiAyKSkKLSNkZWZpbmUgZW5jX3N0YXRlaWRfc3oJCQkxNgorI2RlZmluZSBlbmNfc3RhdGVpZF9zegkJCShORlM0X1NUQVRFSURfU0laRSA+PiAyKQogI2RlZmluZSBORlM0X2VuY19jYl9yZWNhbGxfc3oJCShjYl9jb21wb3VuZF9lbmNfaGRyX3N6ICsgICAgICAgXAogCQkJCQkxICsgZW5jX3N0YXRlaWRfc3ogKyAgICAgICAgICAgIFwKIAkJCQkJZW5jX25mczRfZmhfc3opCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRpZG1hcC5jIGIvZnMvbmZzZC9uZnM0aWRtYXAuYwppbmRleCA0NWFhMjFjLi4yY2Y5YTlhIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRpZG1hcC5jCisrKyBiL2ZzL25mc2QvbmZzNGlkbWFwLmMKQEAgLTU4Nyw2ICs1ODcsMTUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY2hhciAqCitycXN0X2F1dGhuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IGF1dGhfZG9tYWluICpjbHA7CisKKwljbHAgPSBycXN0cC0+cnFfZ3NzY2xpZW50ID8gcnFzdHAtPnJxX2dzc2NsaWVudCA6IHJxc3RwLT5ycV9jbGllbnQ7CisJcmV0dXJuIGNscC0+bmFtZTsKK30KKwogc3RhdGljIGludAogaWRtYXBfbmFtZV90b19pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgdTMyIG5hbWVsZW4sCiAJCXVpZF90ICppZCkKQEAgLTYwMCw3ICs2MDksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAltZW1jcHkoa2V5Lm5hbWUsIG5hbWUsIG5hbWVsZW4pOwogCWtleS5uYW1lW25hbWVsZW5dID0gJ1wwJzsKLQlzdHJsY3B5KGtleS5hdXRobmFtZSwgcnFzdHAtPnJxX2NsaWVudC0+bmFtZSwgc2l6ZW9mKGtleS5hdXRobmFtZSkpOworCXN0cmxjcHkoa2V5LmF1dGhuYW1lLCBycXN0X2F1dGhuYW1lKHJxc3RwKSwgc2l6ZW9mKGtleS5hdXRobmFtZSkpOwogCXJldCA9IGlkbWFwX2xvb2t1cChycXN0cCwgbmFtZXRvaWRfbG9va3VwLCAma2V5LCAmbmFtZXRvaWRfY2FjaGUsICZpdGVtKTsKIAlpZiAocmV0ID09IC1FTk9FTlQpCiAJCXJldCA9IC1FU1JDSDsgLyogbmZzZXJyX2JhZG5hbWUgKi8KQEAgLTYyMCw3ICs2MjksNyBAQAogCX07CiAJaW50IHJldDsKIAotCXN0cmxjcHkoa2V5LmF1dGhuYW1lLCBycXN0cC0+cnFfY2xpZW50LT5uYW1lLCBzaXplb2Yoa2V5LmF1dGhuYW1lKSk7CisJc3RybGNweShrZXkuYXV0aG5hbWUsIHJxc3RfYXV0aG5hbWUocnFzdHApLCBzaXplb2Yoa2V5LmF1dGhuYW1lKSk7CiAJcmV0ID0gaWRtYXBfbG9va3VwKHJxc3RwLCBpZHRvbmFtZV9sb29rdXAsICZrZXksICZpZHRvbmFtZV9jYWNoZSwgJml0ZW0pOwogCWlmIChyZXQgPT0gLUVOT0VOVCkKIAkJcmV0dXJuIHNwcmludGYobmFtZSwgIiV1IiwgaWQpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cHJvYy5jIGIvZnMvbmZzZC9uZnM0cHJvYy5jCmluZGV4IDg1MjI3MjkuLjNjNjI3MTIgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHByb2MuYworKysgYi9mcy9uZnNkL25mczRwcm9jLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC94ZHI0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzNF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfUFJPQwogCkBAIC0yODYsOCArMjg3LDcgQEAKIAlfX2JlMzIgc3RhdHVzOwogCiAJZmhfcHV0KCZjc3RhdGUtPmN1cnJlbnRfZmgpOwotCXN0YXR1cyA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLT5ycV9jbGllbnQsICZjc3RhdGUtPmN1cnJlbnRfZmgsCi0JCQkgICAgICAmcnFzdHAtPnJxX2NoYW5kbGUpOworCXN0YXR1cyA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00NzQsOCArNDc0LDggQEAKIAlfX2JlMzIgcmV0OwogCiAJZmhfaW5pdCgmdG1wX2ZoLCBORlM0X0ZIU0laRSk7Ci0JaWYoKHJldCA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLT5ycV9jbGllbnQsICZ0bXBfZmgsCi0JCQkgICAgICAmcnFzdHAtPnJxX2NoYW5kbGUpKSAhPSAwKQorCXJldCA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLCAmdG1wX2ZoKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWlmICh0bXBfZmguZmhfZGVudHJ5ID09IGNzdGF0ZS0+Y3VycmVudF9maC5maF9kZW50cnkpIHsKIAkJZmhfcHV0KCZ0bXBfZmgpOwpAQCAtNjExLDYgKzYxMSwzMCBAQAogfQogCiBzdGF0aWMgX19iZTMyCituZnNkNF9zZWNpbmZvKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgIHN0cnVjdCBuZnNkNF9zZWNpbmZvICpzZWNpbmZvKQoreworCXN0cnVjdCBzdmNfZmggcmVzZmg7CisJc3RydWN0IHN2Y19leHBvcnQgKmV4cDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJX19iZTMyIGVycjsKKworCWZoX2luaXQoJnJlc2ZoLCBORlM0X0ZIU0laRSk7CisJZXJyID0gbmZzZF9sb29rdXBfZGVudHJ5KHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLAorCQkJCSAgICBzZWNpbmZvLT5zaV9uYW1lLCBzZWNpbmZvLT5zaV9uYW1lbGVuLAorCQkJCSAgICAmZXhwLCAmZGVudHJ5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmIChkZW50cnktPmRfaW5vZGUgPT0gTlVMTCkgeworCQlleHBfcHV0KGV4cCk7CisJCWVyciA9IG5mc2Vycl9ub2VudDsKKwl9IGVsc2UKKwkJc2VjaW5mby0+c2lfZXhwID0gZXhwOworCWRwdXQoZGVudHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgX19iZTMyCiBuZnNkNF9zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAogCSAgICAgIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQogewpAQCAtMTAwOSw2ICsxMDMzLDkgQEAKIAlbT1BfU0FWRUZIXSA9IHsKIAkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3NhdmVmaCwKIAl9LAorCVtPUF9TRUNJTkZPXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3NlY2luZm8sCisJfSwKIAlbT1BfU0VUQVRUUl0gPSB7CiAJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9zZXRhdHRyLAogCX0sCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRzdGF0ZS5jIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwppbmRleCA4YzUyOTEzLi5lNGE0Yzg3IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRzdGF0ZS5jCisrKyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKQEAgLTQ5LDggKzQ5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyNC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvYmluZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkgICAgICAgICAgICAgICAgTkZTRERCR19QUk9DCiAKQEAgLTE0OSw2ICsxNTEsNyBAQAogfQogCiBzdGF0aWMgaW50IG51bV9kZWxlZ2F0aW9uczsKK3Vuc2lnbmVkIGludCBtYXhfZGVsZWdhdGlvbnM7CiAKIC8qCiAgKiBPcGVuIG93bmVyIHN0YXRlIChzaGFyZSBsb2NrcykKQEAgLTE5Miw3ICsxOTUsOSBAQAogCXN0cnVjdCBuZnM0X2NhbGxiYWNrICpjYiA9ICZzdHAtPnN0X3N0YXRlb3duZXItPnNvX2NsaWVudC0+Y2xfY2FsbGJhY2s7CiAKIAlkcHJpbnRrKCJORlNEIGFsbG9jX2luaXRfZGVsZWdcbiIpOwotCWlmIChudW1fZGVsZWdhdGlvbnMgPiBTVEFURUlEX0hBU0hfU0laRSAqIDQpCisJaWYgKGZwLT5maV9oYWRfY29uZmxpY3QpCisJCXJldHVybiBOVUxMOworCWlmIChudW1fZGVsZWdhdGlvbnMgPiBtYXhfZGVsZWdhdGlvbnMpCiAJCXJldHVybiBOVUxMOwogCWRwID0ga21lbV9jYWNoZV9hbGxvYyhkZWxlZ19zbGFiLCBHRlBfS0VSTkVMKTsKIAlpZiAoZHAgPT0gTlVMTCkKQEAgLTk5OSw2ICsxMDA0LDcgQEAKIAkJbGlzdF9hZGQoJmZwLT5maV9oYXNoLCAmZmlsZV9oYXNodGJsW2hhc2h2YWxdKTsKIAkJZnAtPmZpX2lub2RlID0gaWdyYWIoaW5vKTsKIAkJZnAtPmZpX2lkID0gY3VycmVudF9maWxlaWQrKzsKKwkJZnAtPmZpX2hhZF9jb25mbGljdCA9IGZhbHNlOwogCQlyZXR1cm4gZnA7CiAJfQogCXJldHVybiBOVUxMOwpAQCAtMTMyNSw2ICsxMzMxLDcgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IF9fZHA7CiAKKwlkcC0+ZGxfZmlsZS0+ZmlfaGFkX2NvbmZsaWN0ID0gdHJ1ZTsKIAluZnNkNF9jYl9yZWNhbGwoZHApOwogCXJldHVybiAwOwogfQpAQCAtMzE5MCwyMCArMzE5Nyw0OSBAQAogCQlwcmludGsoIk5GU0Q6IEZhaWx1cmUgcmVhZGluZyByZWJvb3QgcmVjb3ZlcnkgZGF0YVxuIik7CiB9CiAKK3Vuc2lnbmVkIGxvbmcKK2dldF9uZnM0X2dyYWNlX3BlcmlvZCh2b2lkKQoreworCXJldHVybiBtYXgodXNlcl9sZWFzZV90aW1lLCBsZWFzZV90aW1lKSAqIEhaOworfQorCisvKgorICogU2luY2UgdGhlIGxpZmV0aW1lIG9mIGEgZGVsZWdhdGlvbiBpc24ndCBsaW1pdGVkIHRvIHRoYXQgb2YgYW4gb3BlbiwgYQorICogY2xpZW50IG1heSBxdWl0ZSByZWFzb25hYmx5IGhhbmcgb24gdG8gYSBkZWxlZ2F0aW9uIGFzIGxvbmcgYXMgaXQgaGFzCisgKiB0aGUgaW5vZGUgY2FjaGVkLiAgVGhpcyBiZWNvbWVzIGFuIG9idmlvdXMgcHJvYmxlbSB0aGUgZmlyc3QgdGltZSBhCisgKiBjbGllbnQncyBpbm9kZSBjYWNoZSBhcHByb2FjaGVzIHRoZSBzaXplIG9mIHRoZSBzZXJ2ZXIncyB0b3RhbCBtZW1vcnkuCisgKgorICogRm9yIG5vdyB3ZSBhdm9pZCB0aGlzIHByb2JsZW0gYnkgaW1wb3NpbmcgYSBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIKKyAqIG9mIGRlbGVnYXRpb25zLCB3aGljaCB2YXJpZXMgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2ZXIncyBtZW1vcnkgc2l6ZS4KKyAqLworc3RhdGljIHZvaWQKK3NldF9tYXhfZGVsZWdhdGlvbnModm9pZCkKK3sKKwkvKgorCSAqIEFsbG93IGF0IG1vc3QgNCBkZWxlZ2F0aW9ucyBwZXIgbWVnYWJ5dGUgb2YgUkFNLiAgUXVpY2sKKwkgKiBlc3RpbWF0ZXMgc3VnZ2VzdCB0aGF0IGluIHRoZSB3b3JzdCBjYXNlICh3aGVyZSBldmVyeSBkZWxlZ2F0aW9uCisJICogaXMgZm9yIGEgZGlmZmVyZW50IGlub2RlKSwgYSBkZWxlZ2F0aW9uIGNvdWxkIHRha2UgYWJvdXQgMS41SywKKwkgKiBnaXZpbmcgYSB3b3JzdCBjYXNlIHVzYWdlIG9mIGFib3V0IDYlIG9mIG1lbW9yeS4KKwkgKi8KKwltYXhfZGVsZWdhdGlvbnMgPSBucl9mcmVlX2J1ZmZlcl9wYWdlcygpID4+ICgyMCAtIDIgLSBQQUdFX1NISUZUKTsKK30KKwogLyogaW5pdGlhbGl6YXRpb24gdG8gcGVyZm9ybSB3aGVuIHRoZSBuZnNkIHNlcnZpY2UgaXMgc3RhcnRlZDogKi8KIAogc3RhdGljIHZvaWQKIF9fbmZzNF9zdGF0ZV9zdGFydCh2b2lkKQogewotCXRpbWVfdCBncmFjZV90aW1lOworCXVuc2lnbmVkIGxvbmcgZ3JhY2VfdGltZTsKIAogCWJvb3RfdGltZSA9IGdldF9zZWNvbmRzKCk7Ci0JZ3JhY2VfdGltZSA9IG1heCh1c2VyX2xlYXNlX3RpbWUsIGxlYXNlX3RpbWUpOworCWdyYWNlX3RpbWUgPSBnZXRfbmZzX2dyYWNlX3BlcmlvZCgpOwogCWxlYXNlX3RpbWUgPSB1c2VyX2xlYXNlX3RpbWU7CiAJaW5fZ3JhY2UgPSAxOwotCXByaW50aygiTkZTRDogc3RhcnRpbmcgJWxkLXNlY29uZCBncmFjZSBwZXJpb2RcbiIsIGdyYWNlX3RpbWUpOworCXByaW50ayhLRVJOX0lORk8gIk5GU0Q6IHN0YXJ0aW5nICVsZC1zZWNvbmQgZ3JhY2UgcGVyaW9kXG4iLAorCSAgICAgICBncmFjZV90aW1lL0haKTsKIAlsYXVuZHJ5X3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm5mc2Q0Iik7Ci0JcXVldWVfZGVsYXllZF93b3JrKGxhdW5kcnlfd3EsICZsYXVuZHJvbWF0X3dvcmssIGdyYWNlX3RpbWUqSFopOworCXF1ZXVlX2RlbGF5ZWRfd29yayhsYXVuZHJ5X3dxLCAmbGF1bmRyb21hdF93b3JrLCBncmFjZV90aW1lKTsKKwlzZXRfbWF4X2RlbGVnYXRpb25zKCk7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCAxNTgwOWRmLi5iM2Q1NWM2IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtNTYsNiArNTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2RfaWRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzNF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oPgogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfWERSCiAKQEAgLTgxOSw2ICs4MjEsMjMgQEAKIH0KIAogc3RhdGljIF9fYmUzMgorbmZzZDRfZGVjb2RlX3NlY2luZm8oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwKKwkJICAgICBzdHJ1Y3QgbmZzZDRfc2VjaW5mbyAqc2VjaW5mbykKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMihzZWNpbmZvLT5zaV9uYW1lbGVuKTsKKwlSRUFEX0JVRihzZWNpbmZvLT5zaV9uYW1lbGVuKTsKKwlTQVZFTUVNKHNlY2luZm8tPnNpX25hbWUsIHNlY2luZm8tPnNpX25hbWVsZW4pOworCXN0YXR1cyA9IGNoZWNrX2ZpbGVuYW1lKHNlY2luZm8tPnNpX25hbWUsIHNlY2luZm8tPnNpX25hbWVsZW4sCisJCQkJCQkJCW5mc2Vycl9ub2VudCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3NldGF0dHIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3NldGF0dHIgKnNldGF0dHIpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC0xMTMxLDYgKzExNTAsOSBAQAogCQljYXNlIE9QX1NBVkVGSDoKIAkJCW9wLT5zdGF0dXMgPSBuZnNfb2s7CiAJCQlicmVhazsKKwkJY2FzZSBPUF9TRUNJTkZPOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zZWNpbmZvKGFyZ3AsICZvcC0+dS5zZWNpbmZvKTsKKwkJCWJyZWFrOwogCQljYXNlIE9QX1NFVEFUVFI6CiAJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3NldGF0dHIoYXJncCwgJm9wLT51LnNldGF0dHIpOwogCQkJYnJlYWs7CkBAIC0xMjk2LDcgKzEzMTgsNyBAQAogCWNoYXIgKnBhdGgsICpyb290cGF0aDsKIAogCWZoX2luaXQoJnRtcF9maCwgTkZTNF9GSFNJWkUpOwotCSpzdGF0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgJnRtcF9maCwgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwkqc3RhdCA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLCAmdG1wX2ZoKTsKIAlpZiAoKnN0YXQpCiAJCXJldHVybiBOVUxMOwogCXJvb3RwYXRoID0gdG1wX2ZoLmZoX2V4cG9ydC0+ZXhfcGF0aDsKQEAgLTE4NDcsMTEgKzE4NjksMTkgQEAKIAlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpIHsKIAkJaW50IGVycjsKIAorCQkvKgorCQkgKiBXaHkgdGhlIGhlY2sgYXJlbid0IHdlIGp1c3QgdXNpbmcgbmZzZF9sb29rdXA/PworCQkgKiBEaWZmZXJlbnQgIi4iLyIuLiIgaGFuZGxpbmc/ICBTb21ldGhpbmcgZWxzZT8KKwkJICogQXQgbGVhc3QsIGFkZCBhIGNvbW1lbnQgaGVyZSB0byBleHBsYWluLi4uLgorCQkgKi8KIAkJZXJyID0gbmZzZF9jcm9zc19tbnQoY2QtPnJkX3Jxc3RwLCAmZGVudHJ5LCAmZXhwKTsKIAkJaWYgKGVycikgewogCQkJbmZzZXJyID0gbmZzZXJybm8oZXJyKTsKIAkJCWdvdG8gb3V0X3B1dDsKIAkJfQorCQluZnNlcnIgPSBjaGVja19uZnNkX2FjY2VzcyhleHAsIGNkLT5yZF9ycXN0cCk7CisJCWlmIChuZnNlcnIpCisJCQlnb3RvIG91dF9wdXQ7CiAKIAl9CiAJbmZzZXJyID0gbmZzZDRfZW5jb2RlX2ZhdHRyKE5VTEwsIGV4cCwgZGVudHJ5LCBwLCBidWZsZW4sIGNkLT5yZF9ibXZhbCwKQEAgLTI0MTksNiArMjQ0OSw3MiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9zZWNpbmZvKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2VyciwKKwkJICAgICBzdHJ1Y3QgbmZzZDRfc2VjaW5mbyAqc2VjaW5mbykKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA9IHNlY2luZm8tPnNpX2V4cDsKKwl1MzIgbmZsYXZzOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmZsYXZzOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gZGVmX2ZsYXZzWzJdOworCUVOQ09ERV9IRUFEOworCisJaWYgKG5mc2VycikKKwkJZ290byBvdXQ7CisJaWYgKGV4cC0+ZXhfbmZsYXZvcnMpIHsKKwkJZmxhdnMgPSBleHAtPmV4X2ZsYXZvcnM7CisJCW5mbGF2cyA9IGV4cC0+ZXhfbmZsYXZvcnM7CisJfSBlbHNlIHsgLyogSGFuZGxpbmcgb2Ygc29tZSBkZWZhdWx0cyBpbiBhYnNlbmNlIG9mIHJlYWwgc2VjaW5mbzogKi8KKwkJZmxhdnMgPSBkZWZfZmxhdnM7CisJCWlmIChleHAtPmV4X2NsaWVudC0+Zmxhdm91ci0+Zmxhdm91ciA9PSBSUENfQVVUSF9VTklYKSB7CisJCQluZmxhdnMgPSAyOworCQkJZmxhdnNbMF0ucHNldWRvZmxhdm9yID0gUlBDX0FVVEhfVU5JWDsKKwkJCWZsYXZzWzFdLnBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX05VTEw7CisJCX0gZWxzZSBpZiAoZXhwLT5leF9jbGllbnQtPmZsYXZvdXItPmZsYXZvdXIgPT0gUlBDX0FVVEhfR1NTKSB7CisJCQluZmxhdnMgPSAxOworCQkJZmxhdnNbMF0ucHNldWRvZmxhdm9yCisJCQkJCT0gc3ZjYXV0aF9nc3NfZmxhdm9yKGV4cC0+ZXhfY2xpZW50KTsKKwkJfSBlbHNlIHsKKwkJCW5mbGF2cyA9IDE7CisJCQlmbGF2c1swXS5wc2V1ZG9mbGF2b3IKKwkJCQkJPSBleHAtPmV4X2NsaWVudC0+Zmxhdm91ci0+Zmxhdm91cjsKKwkJfQorCX0KKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihuZmxhdnMpOworCUFESlVTVF9BUkdTKCk7CisJZm9yIChpID0gMDsgaSA8IG5mbGF2czsgaSsrKSB7CisJCXUzMiBmbGF2ID0gZmxhdnNbaV0ucHNldWRvZmxhdm9yOworCQlzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSA9IGdzc19tZWNoX2dldF9ieV9wc2V1ZG9mbGF2b3IoZmxhdik7CisKKwkJaWYgKGdtKSB7CisJCQlSRVNFUlZFX1NQQUNFKDQpOworCQkJV1JJVEUzMihSUENfQVVUSF9HU1MpOworCQkJQURKVVNUX0FSR1MoKTsKKwkJCVJFU0VSVkVfU1BBQ0UoNCArIGdtLT5nbV9vaWQubGVuKTsKKwkJCVdSSVRFMzIoZ20tPmdtX29pZC5sZW4pOworCQkJV1JJVEVNRU0oZ20tPmdtX29pZC5kYXRhLCBnbS0+Z21fb2lkLmxlbik7CisJCQlBREpVU1RfQVJHUygpOworCQkJUkVTRVJWRV9TUEFDRSg0KTsKKwkJCVdSSVRFMzIoMCk7IC8qIHFvcCAqLworCQkJQURKVVNUX0FSR1MoKTsKKwkJCVJFU0VSVkVfU1BBQ0UoNCk7CisJCQlXUklURTMyKGdzc19wc2V1ZG9mbGF2b3JfdG9fc2VydmljZShnbSwgZmxhdikpOworCQkJQURKVVNUX0FSR1MoKTsKKwkJCWdzc19tZWNoX3B1dChnbSk7CisJCX0gZWxzZSB7CisJCQlSRVNFUlZFX1NQQUNFKDQpOworCQkJV1JJVEUzMihmbGF2KTsKKwkJCUFESlVTVF9BUkdTKCk7CisJCX0KKwl9CitvdXQ6CisJaWYgKGV4cCkKKwkJZXhwX3B1dChleHApOworfQorCiAvKgogICogVGhlIFNFVEFUVFIgZW5jb2RlIHJvdXRpbmUgaXMgc3BlY2lhbCAtLSBpdCBhbHdheXMgZW5jb2RlcyBhIGJpdG1hcCwKICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGVycm9yIHN0YXR1cy4KQEAgLTI1NTksNiArMjY1NSw5IEBACiAJCWJyZWFrOwogCWNhc2UgT1BfU0FWRUZIOgogCQlicmVhazsKKwljYXNlIE9QX1NFQ0lORk86CisJCW5mc2Q0X2VuY29kZV9zZWNpbmZvKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5zZWNpbmZvKTsKKwkJYnJlYWs7CiAJY2FzZSBPUF9TRVRBVFRSOgogCQluZnNkNF9lbmNvZGVfc2V0YXR0cihyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUuc2V0YXR0cik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKaW5kZXggNzFjNjg2ZC4uYmFhYzg5ZCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjdGwuYworKysgYi9mcy9uZnNkL25mc2N0bC5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9pbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTI0NSw3ICsyNDQsNyBAQAogCX0KIAlleHBfcmVhZHVubG9jaygpOwogCWlmIChlcnIgPT0gMCkKLQkJZXJyID0gcmVzLT5maF9zaXplICsgKGludCkmKChzdHJ1Y3Qga25mc2RfZmgqKTApLT5maF9iYXNlOworCQllcnIgPSByZXMtPmZoX3NpemUgKyBvZmZzZXRvZihzdHJ1Y3Qga25mc2RfZmgsIGZoX2Jhc2UpOwogIG91dDoKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNmaC5jIGIvZnMvbmZzZC9uZnNmaC5jCmluZGV4IDZjYTJkMjQuLjBlYjQ2NGEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzZmguYworKysgYi9mcy9uZnNkL25mc2ZoLmMKQEAgLTE1LDEwICsxNSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KIAogI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX0ZICkBAIC0yNywxMCArMjksNiBAQAogc3RhdGljIGludCBuZnNkX25yX3ZlcmlmaWVkOwogc3RhdGljIGludCBuZnNkX25yX3B1dDsKIAotZXh0ZXJuIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHBvcnRfb3BfZGVmYXVsdDsKLQotI2RlZmluZQlDQUxMKG9wcyxmdW4pICgob3BzLT5mdW4pPyhvcHMtPmZ1bik6ZXhwb3J0X29wX2RlZmF1bHQuZnVuKQotCiAvKgogICogb3VyIGFjY2VwdGFiaWxpdHkgZnVuY3Rpb24uCiAgKiBpZiBOT1NVQlRSRUVDSEVDSywgYWNjZXB0IGFueXRoaW5nCkBAIC0xMjMsOCArMTIxLDYgQEAKIAkJaW50IGRhdGFfbGVmdCA9IGZoLT5maF9zaXplLzQ7CiAKIAkJZXJyb3IgPSBuZnNlcnJfc3RhbGU7Ci0JCWlmIChycXN0cC0+cnFfY2xpZW50ID09IE5VTEwpCi0JCQlnb3RvIG91dDsKIAkJaWYgKHJxc3RwLT5ycV92ZXJzID4gMikKIAkJCWVycm9yID0gbmZzZXJyX2JhZGhhbmRsZTsKIAkJaWYgKHJxc3RwLT5ycV92ZXJzID09IDQgJiYgZmgtPmZoX3NpemUgPT0gMCkKQEAgLTE0OCw3ICsxNDQsNyBAQAogCQkJCWZoLT5maF9mc2lkWzFdID0gZmgtPmZoX2ZzaWRbMl07CiAJCQl9CiAJCQlpZiAoKGRhdGFfbGVmdCAtPSBsZW4pPDApIGdvdG8gb3V0OwotCQkJZXhwID0gZXhwX2ZpbmQocnFzdHAtPnJxX2NsaWVudCwgZmgtPmZoX2ZzaWRfdHlwZSwgZGF0YXAsICZycXN0cC0+cnFfY2hhbmRsZSk7CisJCQlleHAgPSBycXN0X2V4cF9maW5kKHJxc3RwLCBmaC0+ZmhfZnNpZF90eXBlLCBkYXRhcCk7CiAJCQlkYXRhcCArPSBsZW47CiAJCX0gZWxzZSB7CiAJCQlkZXZfdCB4ZGV2OwpAQCAtMTU5LDIwICsxNTUsMTggQEAKIAkJCXhkZXYgPSBvbGRfZGVjb2RlX2RldihmaC0+b2ZoX3hkZXYpOwogCQkJeGlubyA9IHUzMl90b19pbm9fdChmaC0+b2ZoX3hpbm8pOwogCQkJbWtfZnNpZChGU0lEX0RFViwgdGZoLCB4ZGV2LCB4aW5vLCAwLCBOVUxMKTsKLQkJCWV4cCA9IGV4cF9maW5kKHJxc3RwLT5ycV9jbGllbnQsIEZTSURfREVWLCB0ZmgsCi0JCQkJICAgICAgICZycXN0cC0+cnFfY2hhbmRsZSk7CisJCQlleHAgPSBycXN0X2V4cF9maW5kKHJxc3RwLCBGU0lEX0RFViwgdGZoKTsKIAkJfQogCi0JCWlmIChJU19FUlIoZXhwKSAmJiAoUFRSX0VSUihleHApID09IC1FQUdBSU4KLQkJCQl8fCBQVFJfRVJSKGV4cCkgPT0gLUVUSU1FRE9VVCkpIHsKKwkJZXJyb3IgPSBuZnNlcnJfc3RhbGU7CisJCWlmIChQVFJfRVJSKGV4cCkgPT0gLUVOT0VOVCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChJU19FUlIoZXhwKSkgewogCQkJZXJyb3IgPSBuZnNlcnJubyhQVFJfRVJSKGV4cCkpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQllcnJvciA9IG5mc2Vycl9zdGFsZTsgCi0JCWlmICghZXhwIHx8IElTX0VSUihleHApKQotCQkJZ290byBvdXQ7Ci0KIAkJLyogQ2hlY2sgaWYgdGhlIHJlcXVlc3Qgb3JpZ2luYXRlZCBmcm9tIGEgc2VjdXJlIHBvcnQuICovCiAJCWVycm9yID0gbmZzZXJyX3Blcm07CiAJCWlmICghcnFzdHAtPnJxX3NlY3VyZSAmJiBFWF9TRUNVUkUoZXhwKSkgewpAQCAtMjExLDExICsyMDUsOSBAQAogCQlpZiAoZmlsZWlkX3R5cGUgPT0gMCkKIAkJCWRlbnRyeSA9IGRnZXQoZXhwLT5leF9kZW50cnkpOwogCQllbHNlIHsKLQkJCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wID0gZXhwLT5leF9tbnQtPm1udF9zYi0+c19leHBvcnRfb3A7Ci0JCQlkZW50cnkgPSBDQUxMKG5vcCxkZWNvZGVfZmgpKGV4cC0+ZXhfbW50LT5tbnRfc2IsCi0JCQkJCQkgICAgIGRhdGFwLCBkYXRhX2xlZnQsCi0JCQkJCQkgICAgIGZpbGVpZF90eXBlLAotCQkJCQkJICAgICBuZnNkX2FjY2VwdGFibGUsIGV4cCk7CisJCQlkZW50cnkgPSBleHBvcnRmc19kZWNvZGVfZmgoZXhwLT5leF9tbnQsIGRhdGFwLAorCQkJCQlkYXRhX2xlZnQsIGZpbGVpZF90eXBlLAorCQkJCQluZnNkX2FjY2VwdGFibGUsIGV4cCk7CiAJCX0KIAkJaWYgKGRlbnRyeSA9PSBOVUxMKQogCQkJZ290byBvdXQ7CkBAIC0yNTcsOCArMjQ5LDE5IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAorCWlmICghKGFjY2VzcyAmIE1BWV9MT0NLKSkgeworCQkvKgorCQkgKiBwc2V1ZG9mbGF2b3IgcmVzdHJpY3Rpb25zIGFyZSBub3QgZW5mb3JjZWQgb24gTkxNLAorCQkgKiB3aGljaCBjbGllbnRzIHZpcnR1YWxseSBhbHdheXMgdXNlIGF1dGhfc3lzIGZvciwKKwkJICogZXZlbiB3aGlsZSB1c2luZyBSUENTRUNfR1NTIGZvciBORlMuCisJCSAqLworCQllcnJvciA9IGNoZWNrX25mc2RfYWNjZXNzKGV4cCwgcnFzdHApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwl9CisKIAkvKiBGaW5hbGx5LCBjaGVjayBhY2Nlc3MgcGVybWlzc2lvbnMuICovCi0JZXJyb3IgPSBuZnNkX3Blcm1pc3Npb24oZXhwLCBkZW50cnksIGFjY2Vzcyk7CisJZXJyb3IgPSBuZnNkX3Blcm1pc3Npb24ocnFzdHAsIGV4cCwgZGVudHJ5LCBhY2Nlc3MpOwogCiAJaWYgKGVycm9yKSB7CiAJCWRwcmludGsoImZoX3ZlcmlmeTogJXMvJXMgcGVybWlzc2lvbiBmYWlsdXJlLCAiCkBAIC0yODYsMTUgKzI4OSwxMyBAQAogc3RhdGljIGlubGluZSBpbnQgX2ZoX3VwZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsCiAJCQkgICAgIF9fdTMyICpkYXRhcCwgaW50ICptYXhzaXplKQogewotCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wID0gZXhwLT5leF9tbnQtPm1udF9zYi0+c19leHBvcnRfb3A7Ci0KIAlpZiAoZGVudHJ5ID09IGV4cC0+ZXhfZGVudHJ5KSB7CiAJCSptYXhzaXplID0gMDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIENBTEwobm9wLGVuY29kZV9maCkoZGVudHJ5LCBkYXRhcCwgbWF4c2l6ZSwKLQkJCSAgIShleHAtPmV4X2ZsYWdzJk5GU0VYUF9OT1NVQlRSRUVDSEVDSykpOworCXJldHVybiBleHBvcnRmc19lbmNvZGVfZmgoZGVudHJ5LCBkYXRhcCwgbWF4c2l6ZSwKKwkJCSAgIShleHAtPmV4X2ZsYWdzICYgTkZTRVhQX05PU1VCVFJFRUNIRUNLKSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3Byb2MuYyBiL2ZzL25mc2QvbmZzcHJvYy5jCmluZGV4IGIyYzcxNDcuLjk3N2E3MWYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzcHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzcHJvYy5jCkBAIC0yNzgsNyArMjc4LDggQEAKIAkJCQkJICogICBlY2hvIHRoaW5nID4gZGV2aWNlLXNwZWNpYWwtZmlsZS1vci1waXBlCiAJCQkJCSAqIGJ5IGRvaW5nIGEgQ1JFQVRFIHdpdGggdHlwZT09MAogCQkJCQkgKi8KLQkJCQkJbmZzZXJyID0gbmZzZF9wZXJtaXNzaW9uKG5ld2ZocC0+ZmhfZXhwb3J0LAorCQkJCQluZnNlcnIgPSBuZnNkX3Blcm1pc3Npb24ocnFzdHAsCisJCQkJCQkJCSBuZXdmaHAtPmZoX2V4cG9ydCwKIAkJCQkJCQkJIG5ld2ZocC0+ZmhfZGVudHJ5LAogCQkJCQkJCQkgTUFZX1dSSVRFfE1BWV9MT0NBTF9BQ0NFU1MpOwogCQkJCQlpZiAobmZzZXJyICYmIG5mc2VyciAhPSBuZnNlcnJfcm9mcykKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzc3ZjLmMgYi9mcy9uZnNkL25mc3N2Yy5jCmluZGV4IGZmNTU5NTAuLmE4Yzg5YWUgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzc3ZjLmMKKysrIGIvZnMvbmZzZC9uZnNzdmMuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9mc19zdHJ1Y3QuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy90eXBlcy5oPgpAQCAtNDMyLDYgKzQzMyw3IEBACiAJICogZGlydHkgcGFnZXMuCiAJICovCiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTEVTU19USFJPVFRMRTsKKwlzZXRfZnJlZXphYmxlKCk7CiAKIAkvKgogCSAqIFRoZSBtYWluIHJlcXVlc3QgbG9vcApAQCAtNDkyLDYgKzQ5NCwxNSBAQAogCW1vZHVsZV9wdXRfYW5kX2V4aXQoMCk7CiB9CiAKK3N0YXRpYyBfX2JlMzIgbWFwX25ld19lcnJvcnModTMyIHZlcnMsIF9fYmUzMiBuZnNlcnIpCit7CisJaWYgKG5mc2VyciA9PSBuZnNlcnJfanVrZWJveCAmJiB2ZXJzID09IDIpCisJCXJldHVybiBuZnNlcnJfZHJvcGl0OworCWlmIChuZnNlcnIgPT0gbmZzZXJyX3dyb25nc2VjICYmIHZlcnMgPCA0KQorCQlyZXR1cm4gbmZzZXJyX2FjY2VzOworCXJldHVybiBuZnNlcnI7Cit9CisKIGludAogbmZzZF9kaXNwYXRjaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnN0YXRwKQogewpAQCAtNTM0LDYgKzU0NSw3IEBACiAKIAkvKiBOb3cgY2FsbCB0aGUgcHJvY2VkdXJlIGhhbmRsZXIsIGFuZCBlbmNvZGUgTkZTIHN0YXR1cy4gKi8KIAluZnNlcnIgPSBwcm9jLT5wY19mdW5jKHJxc3RwLCBycXN0cC0+cnFfYXJncCwgcnFzdHAtPnJxX3Jlc3ApOworCW5mc2VyciA9IG1hcF9uZXdfZXJyb3JzKHJxc3RwLT5ycV92ZXJzLCBuZnNlcnIpOwogCWlmIChuZnNlcnIgPT0gbmZzZXJyX2p1a2Vib3ggJiYgcnFzdHAtPnJxX3ZlcnMgPT0gMikKIAkJbmZzZXJyID0gbmZzZXJyX2Ryb3BpdDsKIAlpZiAobmZzZXJyID09IG5mc2Vycl9kcm9waXQpIHsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCmluZGV4IDk0NWIxY2UuLmU5MGY0YTggMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAKIAl3aGlsZSAoZm9sbG93X2Rvd24oJm1udCwmbW91bnRzKSYmZF9tb3VudHBvaW50KG1vdW50cykpOwogCi0JZXhwMiA9IGV4cF9nZXRfYnlfbmFtZShleHAtPmV4X2NsaWVudCwgbW50LCBtb3VudHMsICZycXN0cC0+cnFfY2hhbmRsZSk7CisJZXhwMiA9IHJxc3RfZXhwX2dldF9ieV9uYW1lKHJxc3RwLCBtbnQsIG1vdW50cyk7CiAJaWYgKElTX0VSUihleHAyKSkgewogCQllcnIgPSBQVFJfRVJSKGV4cDIpOwogCQlkcHV0KG1vdW50cyk7CkBAIC0xMzUsMjEgKzEzNSwxMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qCi0gKiBMb29rIHVwIG9uZSBjb21wb25lbnQgb2YgYSBwYXRobmFtZS4KLSAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmaHAgYW5kIHJlc2ZoIG5lZWQgYW4gZmhfcHV0Ci0gKgotICogSWYgdGhlIGxvb2t1cCB3b3VsZCBjcm9zcyBhIG1vdW50cG9pbnQsIGFuZCB0aGUgbW91bnRlZCBmaWxlc3lzdGVtCi0gKiBpcyBleHBvcnRlZCB0byB0aGUgY2xpZW50IHdpdGggTkZTRVhQX05PSElERSwgdGhlbiB0aGUgbG9va3VwIGlzCi0gKiBhY2NlcHRlZCBhcyBpdCBzdGFuZHMgYW5kIHRoZSBtb3VudGVkIGRpcmVjdG9yeSBpcwotICogcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgY292ZXJlZCBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCi0gKiBOT1RFOiB0aGlzIG1vdW50cG9pbnQgY3Jvc3NpbmcgaXMgbm90IHN1cHBvcnRlZCBwcm9wZXJseSBieSBhbGwKLSAqICAgY2xpZW50cyBhbmQgaXMgZXhwbGljaXRseSBkaXNhbGxvd2VkIGZvciBORlN2MwotICogICAgICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KLSAqLwogX19iZTMyCi1uZnNkX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCWludCBsZW4sIHN0cnVjdCBzdmNfZmggKnJlc2ZoKQorbmZzZF9sb29rdXBfZGVudHJ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKKwkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJICAgc3RydWN0IHN2Y19leHBvcnQgKipleHBfcmV0LCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5X3JldCkKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydAkqZXhwOwogCXN0cnVjdCBkZW50cnkJCSpkcGFyZW50OwpAQCAtMTY4LDggKzE1Nyw2IEBACiAJZXhwICA9IGZocC0+ZmhfZXhwb3J0OwogCWV4cF9nZXQoZXhwKTsKIAotCWVyciA9IG5mc2Vycl9hY2NlczsKLQogCS8qIExvb2t1cCB0aGUgbmFtZSwgYnV0IGRvbid0IGZvbGxvdyBsaW5rcyAqLwogCWlmIChpc2RvdGVudChuYW1lLCBsZW4pKSB7CiAJCWlmIChsZW49PTEpCkBAIC0xOTAsMTcgKzE3NywxNSBAQAogCQkJZHB1dChkZW50cnkpOwogCQkJZGVudHJ5ID0gZHA7CiAKLQkJCWV4cDIgPSBleHBfcGFyZW50KGV4cC0+ZXhfY2xpZW50LCBtbnQsIGRlbnRyeSwKLQkJCQkJICAmcnFzdHAtPnJxX2NoYW5kbGUpOwotCQkJaWYgKElTX0VSUihleHAyKSkgeworCQkJZXhwMiA9IHJxc3RfZXhwX3BhcmVudChycXN0cCwgbW50LCBkZW50cnkpOworCQkJaWYgKFBUUl9FUlIoZXhwMikgPT0gLUVOT0VOVCkgeworCQkJCWRwdXQoZGVudHJ5KTsKKwkJCQlkZW50cnkgPSBkZ2V0KGRwYXJlbnQpOworCQkJfSBlbHNlIGlmIChJU19FUlIoZXhwMikpIHsKIAkJCQlob3N0X2VyciA9IFBUUl9FUlIoZXhwMik7CiAJCQkJZHB1dChkZW50cnkpOwogCQkJCW1udHB1dChtbnQpOwogCQkJCWdvdG8gb3V0X25mc2VycjsKLQkJCX0KLQkJCWlmICghZXhwMikgewotCQkJCWRwdXQoZGVudHJ5KTsKLQkJCQlkZW50cnkgPSBkZ2V0KGRwYXJlbnQpOwogCQkJfSBlbHNlIHsKIAkJCQlleHBfcHV0KGV4cCk7CiAJCQkJZXhwID0gZXhwMjsKQEAgLTIyMyw2ICsyMDgsNDEgQEAKIAkJCX0KIAkJfQogCX0KKwkqZGVudHJ5X3JldCA9IGRlbnRyeTsKKwkqZXhwX3JldCA9IGV4cDsKKwlyZXR1cm4gMDsKKworb3V0X25mc2VycjoKKwlleHBfcHV0KGV4cCk7CisJcmV0dXJuIG5mc2Vycm5vKGhvc3RfZXJyKTsKK30KKworLyoKKyAqIExvb2sgdXAgb25lIGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lLgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgX2JvdGhfIGZocCBhbmQgcmVzZmggbmVlZCBhbiBmaF9wdXQKKyAqCisgKiBJZiB0aGUgbG9va3VwIHdvdWxkIGNyb3NzIGEgbW91bnRwb2ludCwgYW5kIHRoZSBtb3VudGVkIGZpbGVzeXN0ZW0KKyAqIGlzIGV4cG9ydGVkIHRvIHRoZSBjbGllbnQgd2l0aCBORlNFWFBfTk9ISURFLCB0aGVuIHRoZSBsb29rdXAgaXMKKyAqIGFjY2VwdGVkIGFzIGl0IHN0YW5kcyBhbmQgdGhlIG1vdW50ZWQgZGlyZWN0b3J5IGlzCisgKiByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBjb3ZlcmVkIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KKyAqIE5PVEU6IHRoaXMgbW91bnRwb2ludCBjcm9zc2luZyBpcyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGJ5IGFsbAorICogICBjbGllbnRzIGFuZCBpcyBleHBsaWNpdGx5IGRpc2FsbG93ZWQgZm9yIE5GU3YzCisgKiAgICAgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorICovCitfX2JlMzIKK25mc2RfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJaW50IGxlbiwgc3RydWN0IHN2Y19maCAqcmVzZmgpCit7CisJc3RydWN0IHN2Y19leHBvcnQJKmV4cDsKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5OworCV9fYmUzMiBlcnI7CisKKwllcnIgPSBuZnNkX2xvb2t1cF9kZW50cnkocnFzdHAsIGZocCwgbmFtZSwgbGVuLCAmZXhwLCAmZGVudHJ5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGNoZWNrX25mc2RfYWNjZXNzKGV4cCwgcnFzdHApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OwogCS8qCiAJICogTm90ZTogd2UgY29tcG9zZSB0aGUgZmlsZSBoYW5kbGUgbm93LCBidXQgYXMgdGhlCiAJICogZGVudHJ5IG1heSBiZSBuZWdhdGl2ZSwgaXQgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZC4KQEAgLTIzMCwxNiArMjUwLDEzIEBACiAJZXJyID0gZmhfY29tcG9zZShyZXNmaCwgZXhwLCBkZW50cnksIGZocCk7CiAJaWYgKCFlcnIgJiYgIWRlbnRyeS0+ZF9pbm9kZSkKIAkJZXJyID0gbmZzZXJyX25vZW50OwotCWRwdXQoZGVudHJ5KTsKIG91dDoKKwlkcHV0KGRlbnRyeSk7CiAJZXhwX3B1dChleHApOwogCXJldHVybiBlcnI7Ci0KLW91dF9uZnNlcnI6Ci0JZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwotCWdvdG8gb3V0OwogfQogCisKIC8qCiAgKiBTZXQgdmFyaW91cyBmaWxlIGF0dHJpYnV0ZXMuCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBmaHAgbmVlZHMgYW4gZmhfcHV0CkBAIC0zMTEsNyArMzI4LDcgQEAKIAkvKiBUaGUgc2l6ZSBjYXNlIGlzIHNwZWNpYWwuIEl0IGNoYW5nZXMgdGhlIGZpbGUgYXMgd2VsbCBhcyB0aGUgYXR0cmlidXRlcy4gICovCiAJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKIAkJaWYgKGlhcC0+aWFfc2l6ZSA8IGlub2RlLT5pX3NpemUpIHsKLQkJCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZGVudHJ5LCBNQVlfVFJVTkN8TUFZX09XTkVSX09WRVJSSURFKTsKKwkJCWVyciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZmhwLT5maF9leHBvcnQsIGRlbnRyeSwgTUFZX1RSVU5DfE1BWV9PV05FUl9PVkVSUklERSk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0OwogCQl9CkBAIC00MzUsNyArNDUyLDcgQEAKIAkvKiBHZXQgaW5vZGUgKi8KIAllcnJvciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCAwIC8qIFNfSUZSRUcgKi8sIE1BWV9TQVRUUik7CiAJaWYgKGVycm9yKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIGVycm9yOwogCiAJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CkBAIC00NDQsMzMgKzQ2MSwyNSBAQAogCiAJaG9zdF9lcnJvciA9IG5mczRfYWNsX25mc3Y0X3RvX3Bvc2l4KGFjbCwgJnBhY2wsICZkcGFjbCwgZmxhZ3MpOwogCWlmIChob3N0X2Vycm9yID09IC1FSU5WQUwpIHsKLQkJZXJyb3IgPSBuZnNlcnJfYXR0cm5vdHN1cHA7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJyX2F0dHJub3RzdXBwOwogCX0gZWxzZSBpZiAoaG9zdF9lcnJvciA8IDApCiAJCWdvdG8gb3V0X25mc2VycjsKIAogCWhvc3RfZXJyb3IgPSBzZXRfbmZzdjRfYWNsX29uZShkZW50cnksIHBhY2wsIFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpOwogCWlmIChob3N0X2Vycm9yIDwgMCkKLQkJZ290byBvdXRfbmZzZXJyOworCQlnb3RvIG91dF9yZWxlYXNlOwogCi0JaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKIAkJaG9zdF9lcnJvciA9IHNldF9uZnN2NF9hY2xfb25lKGRlbnRyeSwgZHBhY2wsIFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKTsKLQkJaWYgKGhvc3RfZXJyb3IgPCAwKQotCQkJZ290byBvdXRfbmZzZXJyOwotCX0KIAotCWVycm9yID0gbmZzX29rOwotCi1vdXQ6CitvdXRfcmVsZWFzZToKIAlwb3NpeF9hY2xfcmVsZWFzZShwYWNsKTsKIAlwb3NpeF9hY2xfcmVsZWFzZShkcGFjbCk7Ci0JcmV0dXJuIChlcnJvcik7CiBvdXRfbmZzZXJyOgogCWlmIChob3N0X2Vycm9yID09IC1FT1BOT1RTVVBQKQotCQllcnJvciA9IG5mc2Vycl9hdHRybm90c3VwcDsKKwkJcmV0dXJuIG5mc2Vycl9hdHRybm90c3VwcDsKIAllbHNlCi0JCWVycm9yID0gbmZzZXJybm8oaG9zdF9lcnJvcik7Ci0JZ290byBvdXQ7CisJCXJldHVybiBuZnNlcnJubyhob3N0X2Vycm9yKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgpAQCAtNjA3LDcgKzYxNiw3IEBACiAKIAkJCXNyZXN1bHQgfD0gbWFwLT5hY2Nlc3M7CiAKLQkJCWVycjIgPSBuZnNkX3Blcm1pc3Npb24oZXhwb3J0LCBkZW50cnksIG1hcC0+aG93KTsKKwkJCWVycjIgPSBuZnNkX3Blcm1pc3Npb24ocnFzdHAsIGV4cG9ydCwgZGVudHJ5LCBtYXAtPmhvdyk7CiAJCQlzd2l0Y2ggKGVycjIpIHsKIAkJCWNhc2UgbmZzX29rOgogCQkJCXJlc3VsdCB8PSBtYXAtPmFjY2VzczsKQEAgLTEwMzQsNyArMTA0Myw3IEBACiAJX19iZTMyCQllcnI7CiAKIAlpZiAoZmlsZSkgewotCQllcnIgPSBuZnNkX3Blcm1pc3Npb24oZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAorCQllcnIgPSBuZnNkX3Blcm1pc3Npb24ocnFzdHAsIGZocC0+ZmhfZXhwb3J0LCBmaHAtPmZoX2RlbnRyeSwKIAkJCQlNQVlfUkVBRHxNQVlfT1dORVJfT1ZFUlJJREUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CkBAIC0xMDYzLDcgKzEwNzIsNyBAQAogCV9fYmUzMgkJCWVyciA9IDA7CiAKIAlpZiAoZmlsZSkgewotCQllcnIgPSBuZnNkX3Blcm1pc3Npb24oZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAorCQllcnIgPSBuZnNkX3Blcm1pc3Npb24ocnFzdHAsIGZocC0+ZmhfZXhwb3J0LCBmaHAtPmZoX2RlbnRyeSwKIAkJCQlNQVlfV1JJVEV8TUFZX09XTkVSX09WRVJSSURFKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwpAQCAtMTc5Miw3ICsxODAxLDggQEAKICAqIENoZWNrIGZvciBhIHVzZXIncyBhY2Nlc3MgcGVybWlzc2lvbnMgdG8gdGhpcyBpbm9kZS4KICAqLwogX19iZTMyCi1uZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgYWNjKQorbmZzZF9wZXJtaXNzaW9uKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsCisJCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGFjYykKIHsKIAlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCWludAkJZXJyOwpAQCAtMTgyMyw3ICsxODMzLDcgQEAKIAkgKi8KIAlpZiAoIShhY2MgJiBNQVlfTE9DQUxfQUNDRVNTKSkKIAkJaWYgKGFjYyAmIChNQVlfV1JJVEUgfCBNQVlfU0FUVFIgfCBNQVlfVFJVTkMpKSB7Ci0JCQlpZiAoRVhfUkRPTkxZKGV4cCkgfHwgSVNfUkRPTkxZKGlub2RlKSkKKwkJCWlmIChFWF9SRE9OTFkoZXhwLCBycXN0cCkgfHwgSVNfUkRPTkxZKGlub2RlKSkKIAkJCQlyZXR1cm4gbmZzZXJyX3JvZnM7CiAJCQlpZiAoLyogKGFjYyAmIE1BWV9XUklURSkgJiYgKi8gSVNfSU1NVVRBQkxFKGlub2RlKSkKIAkJCQlyZXR1cm4gbmZzZXJyX3Blcm07CmRpZmYgLS1naXQgYS9mcy9ubHMvTWFrZWZpbGUgYi9mcy9ubHMvTWFrZWZpbGUKaW5kZXggYTdhZGUxMy4uZjQ5OWRkNyAxMDA2NDQKLS0tIGEvZnMvbmxzL01ha2VmaWxlCisrKyBiL2ZzL25scy9NYWtlZmlsZQpAQCAtMzYsMTEgKzM2LDkgQEAKIG9iai0kKENPTkZJR19OTFNfSVNPODg1OV83KQkrPSBubHNfaXNvODg1OS03Lm8KIG9iai0kKENPTkZJR19OTFNfSVNPODg1OV84KQkrPSBubHNfY3AxMjU1Lm8KIG9iai0kKENPTkZJR19OTFNfSVNPODg1OV85KQkrPSBubHNfaXNvODg1OS05Lm8KLW9iai0kKENPTkZJR19OTFNfSVNPODg1OV8xMCkJKz0gbmxzX2lzbzg4NTktMTAubwogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzEzKQkrPSBubHNfaXNvODg1OS0xMy5vCiBvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMTQpCSs9IG5sc19pc284ODU5LTE0Lm8KIG9iai0kKENPTkZJR19OTFNfSVNPODg1OV8xNSkJKz0gbmxzX2lzbzg4NTktMTUubwogb2JqLSQoQ09ORklHX05MU19LT0k4X1IpCSs9IG5sc19rb2k4LXIubwogb2JqLSQoQ09ORklHX05MU19LT0k4X1UpCSs9IG5sc19rb2k4LXUubyBubHNfa29pOC1ydS5vCi1vYmotJChDT05GSUdfTkxTX0FCQykJCSs9IG5sc19hYmMubwogb2JqLSQoQ09ORklHX05MU19VVEY4KQkJKz0gbmxzX3V0ZjgubwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9uYW1laS5jIGIvZnMvbnRmcy9uYW1laS5jCmluZGV4IGJmZjAxYTUuLmU5M2M2MTQgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbmFtZWkuYworKysgYi9mcy9udGZzL25hbWVpLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogCiAjaW5jbHVkZSAiYXR0cmliLmgiCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5jIGIvZnMvb2NmczIvYWxsb2MuYwppbmRleCAxOTcxMmE3Li5mNWUxMWY0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5jCisrKyBiL2ZzL29jZnMyL2FsbG9jLmMKQEAgLTUwLDYgKzUwLDggQEAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCiBzdGF0aWMgdm9pZCBvY2ZzMl9mcmVlX3RydW5jYXRlX2NvbnRleHQoc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKnRjKTsKK3N0YXRpYyBpbnQgb2NmczJfY2FjaGVfZXh0ZW50X2Jsb2NrX2ZyZWUoc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYik7CiAKIC8qCiAgKiBTdHJ1Y3R1cmVzIHdoaWNoIGRlc2NyaWJlIGEgcGF0aCB0aHJvdWdoIGEgYnRyZWUsIGFuZCBmdW5jdGlvbnMgdG8KQEAgLTExNyw2ICsxMTksMzEgQEAKIH0KIAogLyoKKyAqIEFsbCB0aGUgZWxlbWVudHMgb2Ygc3JjIGludG8gZGVzdC4gQWZ0ZXIgdGhpcyBjYWxsLCBzcmMgY291bGQgYmUgZnJlZWQKKyAqIHdpdGhvdXQgYWZmZWN0aW5nIGRlc3QuCisgKgorICogQm90aCBwYXRocyBzaG91bGQgaGF2ZSB0aGUgc2FtZSByb290LiBBbnkgbm9uLXJvb3QgZWxlbWVudHMgb2YgZGVzdAorICogd2lsbCBiZSBmcmVlZC4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfY3BfcGF0aChzdHJ1Y3Qgb2NmczJfcGF0aCAqZGVzdCwgc3RydWN0IG9jZnMyX3BhdGggKnNyYykKK3sKKwlpbnQgaTsKKworCUJVR19PTihwYXRoX3Jvb3RfYmgoZGVzdCkgIT0gcGF0aF9yb290X2JoKHNyYykpOworCUJVR19PTihwYXRoX3Jvb3RfZWwoZGVzdCkgIT0gcGF0aF9yb290X2VsKHNyYykpOworCisJb2NmczJfcmVpbml0X3BhdGgoZGVzdCwgMSk7CisKKwlmb3IoaSA9IDE7IGkgPCBPQ0ZTMl9NQVhfUEFUSF9ERVBUSDsgaSsrKSB7CisJCWRlc3QtPnBfbm9kZVtpXS5iaCA9IHNyYy0+cF9ub2RlW2ldLmJoOworCQlkZXN0LT5wX25vZGVbaV0uZWwgPSBzcmMtPnBfbm9kZVtpXS5lbDsKKworCQlpZiAoZGVzdC0+cF9ub2RlW2ldLmJoKQorCQkJZ2V0X2JoKGRlc3QtPnBfbm9kZVtpXS5iaCk7CisJfQorfQorCisvKgogICogTWFrZSB0aGUgKmRlc3QgcGF0aCB0aGUgc2FtZSBhcyBzcmMgYW5kIHJlLWluaXRpYWxpemUgc3JjIHBhdGggdG8KICAqIGhhdmUgYSByb290IG9ubHkuCiAgKi8KQEAgLTIxMiwxMCArMjM5LDQxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGV4dGVudCByZWNvcmQgd2hpY2ggY29udGFpbnMgY2x1c3RlciAjdl9jbHVzdGVyLgorICogLTEgaXMgcmV0dXJuZWQgaWYgaXQgd2FzIG5vdCBmb3VuZC4KKyAqCisgKiBTaG91bGQgd29yayBmaW5lIG9uIGludGVyaW9yIGFuZCBleHRlcmlvciBub2Rlcy4KKyAqLworaW50IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCB1MzIgdl9jbHVzdGVyKQoreworCWludCByZXQgPSAtMTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCXUzMiByZWNfZW5kLCByZWNfc3RhcnQsIGNsdXN0ZXJzOworCisJZm9yKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGkrKykgeworCQlyZWMgPSAmZWwtPmxfcmVjc1tpXTsKKworCQlyZWNfc3RhcnQgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3Bvcyk7CisJCWNsdXN0ZXJzID0gb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpOworCisJCXJlY19lbmQgPSByZWNfc3RhcnQgKyBjbHVzdGVyczsKKworCQlpZiAodl9jbHVzdGVyID49IHJlY19zdGFydCAmJiB2X2NsdXN0ZXIgPCByZWNfZW5kKSB7CisJCQlyZXQgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBlbnVtIG9jZnMyX2NvbnRpZ190eXBlIHsKIAlDT05USUdfTk9ORSA9IDAsCiAJQ09OVElHX0xFRlQsCi0JQ09OVElHX1JJR0hUCisJQ09OVElHX1JJR0hULAorCUNPTlRJR19MRUZUUklHSFQsCiB9OwogCiAKQEAgLTI1Myw2ICszMTEsMTQgQEAKIHsKIAl1NjQgYmxrbm8gPSBsZTY0X3RvX2NwdShpbnNlcnRfcmVjLT5lX2Jsa25vKTsKIAorCS8qCisJICogUmVmdXNlIHRvIGNvYWxlc2NlIGV4dGVudCByZWNvcmRzIHdpdGggZGlmZmVyZW50IGZsYWcKKwkgKiBmaWVsZHMgLSB3ZSBkb24ndCB3YW50IHRvIG1peCB1bndyaXR0ZW4gZXh0ZW50cyB3aXRoIHVzZXIKKwkgKiBkYXRhLgorCSAqLworCWlmIChleHQtPmVfZmxhZ3MgIT0gaW5zZXJ0X3JlYy0+ZV9mbGFncykKKwkJcmV0dXJuIENPTlRJR19OT05FOworCiAJaWYgKG9jZnMyX2V4dGVudHNfYWRqYWNlbnQoZXh0LCBpbnNlcnRfcmVjKSAmJgogCSAgICBvY2ZzMl9ibG9ja19leHRlbnRfY29udGlnKGlub2RlLT5pX3NiLCBleHQsIGJsa25vKSkKIAkJCXJldHVybiBDT05USUdfUklHSFQ7CkBAIC0yNzcsNyArMzQzLDE0IEBACiAJQVBQRU5EX1RBSUwsCiB9OwogCitlbnVtIG9jZnMyX3NwbGl0X3R5cGUgeworCVNQTElUX05PTkUgPSAwLAorCVNQTElUX0xFRlQsCisJU1BMSVRfUklHSFQsCit9OworCiBzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgeworCWVudW0gb2NmczJfc3BsaXRfdHlwZQlpbnNfc3BsaXQ7CiAJZW51bSBvY2ZzMl9hcHBlbmRfdHlwZQlpbnNfYXBwZW5kaW5nOwogCWVudW0gb2NmczJfY29udGlnX3R5cGUJaW5zX2NvbnRpZzsKIAlpbnQJCQlpbnNfY29udGlnX2luZGV4OwpAQCAtMjg1LDYgKzM1OCwxMyBAQAogCWludAkJCWluc190cmVlX2RlcHRoOwogfTsKIAorc3RydWN0IG9jZnMyX21lcmdlX2N0eHQgeworCWVudW0gb2NmczJfY29udGlnX3R5cGUJY19jb250aWdfdHlwZTsKKwlpbnQJCQljX2hhc19lbXB0eV9leHRlbnQ7CisJaW50CQkJY19zcGxpdF9jb3ZlcnNfcmVjOworCWludAkJCWNfdXNlZF90YWlsX3JlY3M7Cit9OworCiAvKgogICogSG93IG1hbnkgZnJlZSBleHRlbnRzIGhhdmUgd2UgZ290IGJlZm9yZSB3ZSBuZWVkIG1vcmUgbWV0YSBkYXRhPwogICovCkBAIC0zODQsMTMgKzQ2NCw3IEBACiAJCQlzdHJjcHkoZWItPmhfc2lnbmF0dXJlLCBPQ0ZTMl9FWFRFTlRfQkxPQ0tfU0lHTkFUVVJFKTsKIAkJCWViLT5oX2Jsa25vID0gY3B1X3RvX2xlNjQoZmlyc3RfYmxrbm8pOwogCQkJZWItPmhfZnNfZ2VuZXJhdGlvbiA9IGNwdV90b19sZTMyKG9zYi0+ZnNfZ2VuZXJhdGlvbik7Ci0KLSNpZm5kZWYgT0NGUzJfVVNFX0FMTF9NRVRBREFUQV9TVUJBTExPQ0FUT1JTCi0JCQkvKiB3ZSBhbHdheXMgdXNlIHNsb3QgemVybydzIHN1YmFsbG9jYXRvciAqLwotCQkJZWItPmhfc3ViYWxsb2Nfc2xvdCA9IDA7Ci0jZWxzZQogCQkJZWItPmhfc3ViYWxsb2Nfc2xvdCA9IGNwdV90b19sZTE2KG9zYi0+c2xvdF9udW0pOwotI2VuZGlmCiAJCQllYi0+aF9zdWJhbGxvY19iaXQgPSBjcHVfdG9fbGUxNihzdWJhbGxvY19iaXRfc3RhcnQpOwogCQkJZWItPmhfbGlzdC5sX2NvdW50ID0KIAkJCQljcHVfdG9fbGUxNihvY2ZzMl9leHRlbnRfcmVjc19wZXJfZWIob3NiLT5zYikpOwpAQCAtNDYxLDcgKzUzNSw3IEBACiAJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmgsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmxhc3RfZWJfYmgsCiAJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpCiB7CiAJaW50IHN0YXR1cywgbmV3X2Jsb2NrcywgaTsKQEAgLTQ3Niw3ICs1NTAsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlCVUdfT04oIWxhc3RfZWJfYmgpOworCUJVR19PTighbGFzdF9lYl9iaCB8fCAhKmxhc3RfZWJfYmgpOwogCiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBmZV9iaC0+Yl9kYXRhOwogCkBAIC01MDcsNyArNTgxLDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilsYXN0X2ViX2JoLT5iX2RhdGE7CisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSgqbGFzdF9lYl9iaCktPmJfZGF0YTsKIAluZXdfY3BvcyA9IG9jZnMyX3N1bV9yaWdodG1vc3RfcmVjKCZlYi0+aF9saXN0KTsKIAogCS8qIE5vdGU6IG5ld19lYl9iaHNbbmV3X2Jsb2NrcyAtIDFdIGlzIHRoZSBndXkgd2hpY2ggd2lsbCBiZQpAQCAtNTY4LDcgKzY0Miw3IEBACiAJICogam91cm5hbF9kaXJ0eSBlcnJvcmluZyBhcyBpdCB3b24ndCB1bmxlc3Mgd2UndmUgYWJvcnRlZCB0aGUKIAkgKiBoYW5kbGUgKGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgbmV2ZXIgYmUgaGVyZSkgc28gcmVzZXJ2aW5nCiAJICogdGhlIHdyaXRlIHdpdGggam91cm5hbF9hY2Nlc3MgaXMgYWxsIHdlIG5lZWQgdG8gZG8uICovCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgbGFzdF9lYl9iaCwKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCAqbGFzdF9lYl9iaCwKIAkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNjAxLDEwICs2NzUsMTAgQEAKIAkgKiBuZXh0X2xlYWYgb24gdGhlIHByZXZpb3VzbHkgbGFzdC1leHRlbnQtYmxvY2suICovCiAJZmUtPmlfbGFzdF9lYl9ibGsgPSBjcHVfdG9fbGU2NChuZXdfbGFzdF9lYl9ibGspOwogCi0JZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBsYXN0X2ViX2JoLT5iX2RhdGE7CisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSAoKmxhc3RfZWJfYmgpLT5iX2RhdGE7CiAJZWItPmhfbmV4dF9sZWFmX2JsayA9IGNwdV90b19sZTY0KG5ld19sYXN0X2ViX2Jsayk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbGFzdF9lYl9iaCk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsICpsYXN0X2ViX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBmZV9iaCk7CkBAIC02MTYsNiArNjkwLDE0IEBACiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJfQogCisJLyoKKwkgKiBTb21lIGNhbGxlcnMgd2FudCB0byB0cmFjayB0aGUgcmlnaHRtb3N0IGxlYWYgc28gcGFzcyBpdAorCSAqIGJhY2sgaGVyZS4KKwkgKi8KKwlicmVsc2UoKmxhc3RfZWJfYmgpOworCWdldF9iaChuZXdfZWJfYmhzWzBdKTsKKwkqbGFzdF9lYl9iaCA9IG5ld19lYl9iaHNbMF07CisKIAlzdGF0dXMgPSAwOwogYmFpbDoKIAlpZiAobmV3X2ViX2JocykgewpAQCAtODI5LDYgKzkxMSw4NyBAQAogfQogCiAvKgorICogR3JvdyBhIGItdHJlZSBzbyB0aGF0IGl0IGhhcyBtb3JlIHJlY29yZHMuCisgKgorICogV2UgbWlnaHQgc2hpZnQgdGhlIHRyZWUgZGVwdGggaW4gd2hpY2ggY2FzZSBleGlzdGluZyBwYXRocyBzaG91bGQKKyAqIGJlIGNvbnNpZGVyZWQgaW52YWxpZC4KKyAqCisgKiBUcmVlIGRlcHRoIGFmdGVyIHRoZSBncm93IGlzIHJldHVybmVkIHZpYSAqZmluYWxfZGVwdGguCisgKgorICogKmxhc3RfZWJfYmggd2lsbCBiZSB1cGRhdGVkIGJ5IG9jZnMyX2FkZF9icmFuY2goKS4KKyAqLworc3RhdGljIGludCBvY2ZzMl9ncm93X3RyZWUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsIGludCAqZmluYWxfZGVwdGgsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipsYXN0X2ViX2JoLAorCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpCit7CisJaW50IHJldCwgc2hpZnQ7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJaW50IGRlcHRoID0gbGUxNl90b19jcHUoZGktPmlkMi5pX2xpc3QubF90cmVlX2RlcHRoKTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCUJVR19PTihtZXRhX2FjID09IE5VTEwpOworCisJc2hpZnQgPSBvY2ZzMl9maW5kX2JyYW5jaF90YXJnZXQob3NiLCBpbm9kZSwgZGlfYmgsICZiaCk7CisJaWYgKHNoaWZ0IDwgMCkgeworCQlyZXQgPSBzaGlmdDsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXZSB0cmF2ZWxlZCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tIG9mIHRoZSBhbGxvY2F0aW9uIHRyZWUKKwkgKiBhbmQgZGlkbid0IGZpbmQgcm9vbSBmb3IgYW55IG1vcmUgZXh0ZW50cyAtIHdlIG5lZWQgdG8gYWRkCisJICogYW5vdGhlciB0cmVlIGxldmVsICovCisJaWYgKHNoaWZ0KSB7CisJCUJVR19PTihiaCk7CisJCW1sb2coMCwgIm5lZWQgdG8gc2hpZnQgdHJlZSBkZXB0aCAoY3VycmVudCA9ICVkKVxuIiwgZGVwdGgpOworCisJCS8qIG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGggd2lsbCByZXR1cm4gdXMgYSBidWZmZXIgd2l0aAorCQkgKiB0aGUgbmV3IGV4dGVudCBibG9jayAoc28gd2UgY2FuIHBhc3MgdGhhdCB0bworCQkgKiBvY2ZzMl9hZGRfYnJhbmNoKS4gKi8KKwkJcmV0ID0gb2NmczJfc2hpZnRfdHJlZV9kZXB0aChvc2IsIGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCQkgICAgIG1ldGFfYWMsICZiaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkZXB0aCsrOworCQlpZiAoZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIFNwZWNpYWwgY2FzZTogd2UgaGF2ZSByb29tIG5vdyBpZiB3ZSBzaGlmdGVkIGZyb20KKwkJCSAqIHRyZWVfZGVwdGggMCwgc28gbm8gbW9yZSB3b3JrIG5lZWRzIHRvIGJlIGRvbmUuCisJCQkgKgorCQkJICogV2Ugd29uJ3QgYmUgY2FsbGluZyBhZGRfYnJhbmNoLCBzbyBwYXNzCisJCQkgKiBiYWNrICpsYXN0X2ViX2JoIGFzIHRoZSBuZXcgbGVhZi4gQXQgZGVwdGgKKwkJCSAqIHplcm8sIGl0IHNob3VsZCBhbHdheXMgYmUgbnVsbCBzbyB0aGVyZSdzCisJCQkgKiBubyByZWFzb24gdG8gYnJlbHNlLgorCQkJICovCisJCQlCVUdfT04oKmxhc3RfZWJfYmgpOworCQkJZ2V0X2JoKGJoKTsKKwkJCSpsYXN0X2ViX2JoID0gYmg7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIGNhbGwgb2NmczJfYWRkX2JyYW5jaCB0byBhZGQgdGhlIGZpbmFsIHBhcnQgb2YgdGhlIHRyZWUgd2l0aAorCSAqIHRoZSBuZXcgZGF0YS4gKi8KKwltbG9nKDAsICJhZGQgYnJhbmNoLiBiaCA9ICVwXG4iLCBiaCk7CisJcmV0ID0gb2NmczJfYWRkX2JyYW5jaChvc2IsIGhhbmRsZSwgaW5vZGUsIGRpX2JoLCBiaCwgbGFzdF9lYl9iaCwKKwkJCSAgICAgICBtZXRhX2FjKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCWlmIChmaW5hbF9kZXB0aCkKKwkJKmZpbmFsX2RlcHRoID0gZGVwdGg7CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBsZWFmIG5vZGVzLCB3aGljaCBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IGNhbgogICogaGF2ZSBlbXB0eSBleHRlbnRzIGFueXdheS4KICAqLwpAQCAtOTM0LDYgKzEwOTcsMjIgQEAKIAogfQogCitzdGF0aWMgdm9pZCBvY2ZzMl9yZW1vdmVfZW1wdHlfZXh0ZW50KHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwpCit7CisJaW50IHNpemUsIG51bV9yZWNzID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisKKwlCVUdfT04obnVtX3JlY3MgPT0gMCk7CisKKwlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSkgeworCQludW1fcmVjcy0tOworCQlzaXplID0gbnVtX3JlY3MgKiBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpOworCQltZW1tb3ZlKCZlbC0+bF9yZWNzWzBdLCAmZWwtPmxfcmVjc1sxXSwgc2l6ZSk7CisJCW1lbXNldCgmZWwtPmxfcmVjc1tudW1fcmVjc10sIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKwkJZWwtPmxfbmV4dF9mcmVlX3JlYyA9IGNwdV90b19sZTE2KG51bV9yZWNzKTsKKwl9Cit9CisKIC8qCiAgKiBDcmVhdGUgYW4gZW1wdHkgZXh0ZW50IHJlY29yZCAuCiAgKgpAQCAtMTIxMSw2ICsxMzkwLDEwIEBACiAJICogaW1tZWRpYXRlbHkgdG8gdGhlaXIgcmlnaHQuCiAJICovCiAJbGVmdF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHJpZ2h0X2NoaWxkX2VsLT5sX3JlY3NbMF0uZV9jcG9zKTsKKwlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZyaWdodF9jaGlsZF9lbC0+bF9yZWNzWzBdKSkgeworCQlCVUdfT04obGUxNl90b19jcHUocmlnaHRfY2hpbGRfZWwtPmxfbmV4dF9mcmVlX3JlYykgPD0gMSk7CisJCWxlZnRfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdShyaWdodF9jaGlsZF9lbC0+bF9yZWNzWzFdLmVfY3Bvcyk7CisJfQogCWxlZnRfY2x1c3RlcnMgLT0gbGUzMl90b19jcHUobGVmdF9yZWMtPmVfY3Bvcyk7CiAJbGVmdF9yZWMtPmVfaW50X2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIobGVmdF9jbHVzdGVycyk7CiAKQEAgLTE1MzEsMTAgKzE3MTQsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogRXh0ZW5kIHRoZSB0cmFuc2FjdGlvbiBieSBlbm91Z2ggY3JlZGl0cyB0byBjb21wbGV0ZSB0aGUgcm90YXRpb24sCisgKiBhbmQgc3RpbGwgbGVhdmUgYXQgbGVhc3QgdGhlIG9yaWdpbmFsIG51bWJlciBvZiBjcmVkaXRzIGFsbG9jYXRlZAorICogdG8gdGhpcyB0cmFuc2FjdGlvbi4KKyAqLwogc3RhdGljIGludCBvY2ZzMl9leHRlbmRfcm90YXRlX3RyYW5zYWN0aW9uKGhhbmRsZV90ICpoYW5kbGUsIGludCBzdWJ0cmVlX2RlcHRoLAorCQkJCQkgICBpbnQgb3BfY3JlZGl0cywKIAkJCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgpCiB7Ci0JaW50IGNyZWRpdHMgPSAocGF0aC0+cF90cmVlX2RlcHRoIC0gc3VidHJlZV9kZXB0aCkgKiAyICsgMTsKKwlpbnQgY3JlZGl0cyA9IChwYXRoLT5wX3RyZWVfZGVwdGggLSBzdWJ0cmVlX2RlcHRoKSAqIDIgKyAxICsgb3BfY3JlZGl0czsKIAogCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPCBjcmVkaXRzKQogCQlyZXR1cm4gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CkBAIC0xNTY4LDYgKzE3NTcsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvY2ZzMl9sZWZ0bW9zdF9yZWNfY29udGFpbnMoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwgdTMyIGNwb3MpCit7CisJaW50IG5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCXVuc2lnbmVkIGludCByYW5nZTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCisJaWYgKG5leHRfZnJlZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJlYyA9ICZlbC0+bF9yZWNzWzBdOworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQocmVjKSkgeworCQkvKiBFbXB0eSBsaXN0LiAqLworCQlpZiAobmV4dF9mcmVlID09IDEpCisJCQlyZXR1cm4gMDsKKwkJcmVjID0gJmVsLT5sX3JlY3NbMV07CisJfQorCisJcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisJaWYgKGNwb3MgPj0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICYmIGNwb3MgPCByYW5nZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBSb3RhdGUgYWxsIHRoZSByZWNvcmRzIGluIGEgYnRyZWUgcmlnaHQgb25lIHJlY29yZCwgc3RhcnRpbmcgYXQgaW5zZXJ0X2Nwb3MuCiAgKgpAQCAtMTU4NiwxMSArMTc5OCwxMiBAQAogICovCiBzdGF0aWMgaW50IG9jZnMyX3JvdGF0ZV90cmVlX3JpZ2h0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICBlbnVtIG9jZnMyX3NwbGl0X3R5cGUgc3BsaXQsCiAJCQkJICAgdTMyIGluc2VydF9jcG9zLAogCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAogCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICoqcmV0X2xlZnRfcGF0aCkKIHsKLQlpbnQgcmV0LCBzdGFydDsKKwlpbnQgcmV0LCBzdGFydCwgb3JpZ19jcmVkaXRzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOwogCXUzMiBjcG9zOwogCXN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGggPSBOVUxMOwogCkBAIC0xNjU3LDkgKzE4NzAsOSBAQAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCiAJCQkJcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCktPmJfYmxvY2tucik7CiAKLQkJaWYgKG9jZnMyX3JvdGF0ZV9yZXF1aXJlc19wYXRoX2FkanVzdG1lbnQobGVmdF9wYXRoLAorCQlpZiAoc3BsaXQgPT0gU1BMSVRfTk9ORSAmJgorCQkgICAgb2NmczJfcm90YXRlX3JlcXVpcmVzX3BhdGhfYWRqdXN0bWVudChsZWZ0X3BhdGgsCiAJCQkJCQkJICBpbnNlcnRfY3BvcykpIHsKLQkJCW1sb2coMCwgIlBhdGggYWRqdXN0bWVudCByZXF1aXJlZFxuIik7CiAKIAkJCS8qCiAJCQkgKiBXZSd2ZSByb3RhdGVkIHRoZSB0cmVlIGFzIG11Y2ggYXMgd2UKQEAgLTE2ODcsNyArMTkwMCw3IEBACiAJCSAgICAgcmlnaHRfcGF0aC0+cF90cmVlX2RlcHRoKTsKIAogCQlyZXQgPSBvY2ZzMl9leHRlbmRfcm90YXRlX3RyYW5zYWN0aW9uKGhhbmRsZSwgc3RhcnQsCi0JCQkJCQkgICAgICByaWdodF9wYXRoKTsKKwkJCQkJCSAgICAgIG9yaWdfY3JlZGl0cywgcmlnaHRfcGF0aCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMTcwMCw2ICsxOTEzLDI0IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCisJCWlmIChzcGxpdCAhPSBTUExJVF9OT05FICYmCisJCSAgICBvY2ZzMl9sZWZ0bW9zdF9yZWNfY29udGFpbnMocGF0aF9sZWFmX2VsKHJpZ2h0X3BhdGgpLAorCQkJCQkJaW5zZXJ0X2Nwb3MpKSB7CisJCQkvKgorCQkJICogQSByb3RhdGUgbW92ZXMgdGhlIHJpZ2h0bW9zdCBsZWZ0IGxlYWYKKwkJCSAqIHJlY29yZCBvdmVyIHRvIHRoZSBsZWZ0bW9zdCByaWdodCBsZWFmCisJCQkgKiBzbG90LiBJZiB3ZSdyZSBkb2luZyBhbiBleHRlbnQgc3BsaXQKKwkJCSAqIGluc3RlYWQgb2YgYSByZWFsIGluc2VydCwgdGhlbiB3ZSBoYXZlIHRvCisJCQkgKiBjaGVjayB0aGF0IHRoZSBleHRlbnQgdG8gYmUgc3BsaXQgd2Fzbid0CisJCQkgKiBqdXN0IG1vdmVkIG92ZXIuIElmIGl0IHdhcywgdGhlbiB3ZSBjYW4KKwkJCSAqIGV4aXQgaGVyZSwgcGFzc2luZyBsZWZ0X3BhdGggYmFjayAtCisJCQkgKiBvY2ZzMl9zcGxpdF9leHRlbnQoKSBpcyBzbWFydCBlbm91Z2ggdG8KKwkJCSAqIHNlYXJjaCBib3RoIGxlYXZlcy4KKwkJCSAqLworCQkJKnJldF9sZWZ0X3BhdGggPSBsZWZ0X3BhdGg7CisJCQlnb3RvIG91dF9yZXRfcGF0aDsKKwkJfQorCiAJCS8qCiAJCSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmUtcmVhZCB0aGUgbmV4dCByaWdodCBwYXRoCiAJCSAqIGFzIHdlIGtub3cgdGhhdCBpdCdsbCBiZSBvdXIgY3VycmVudCBsZWZ0CkBAIC0xNzIyLDYgKzE5NTMsMTAzMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIG9jZnMyX3VwZGF0ZV9lZGdlX2xlbmd0aHMoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCkKK3sKKwlpbnQgaSwgaWR4OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwl1MzIgcmFuZ2U7CisKKwkvKiBQYXRoIHNob3VsZCBhbHdheXMgYmUgcmlnaHRtb3N0LiAqLworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgocGF0aCktPmJfZGF0YTsKKwlCVUdfT04oZWItPmhfbmV4dF9sZWFmX2JsayAhPSAwVUxMKTsKKworCWVsID0gJmViLT5oX2xpc3Q7CisJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDApOworCWlkeCA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMTsKKwlyZWMgPSAmZWwtPmxfcmVjc1tpZHhdOworCXJhbmdlID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpOworCisJZm9yIChpID0gMDsgaSA8IHBhdGgtPnBfdHJlZV9kZXB0aDsgaSsrKSB7CisJCWVsID0gcGF0aC0+cF9ub2RlW2ldLmVsOworCQlpZHggPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDE7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2lkeF07CisKKwkJcmVjLT5lX2ludF9jbHVzdGVycyA9IGNwdV90b19sZTMyKHJhbmdlKTsKKwkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfaW50X2NsdXN0ZXJzLCAtbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpKTsKKworCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aC0+cF9ub2RlW2ldLmJoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3VubGlua19wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLCBpbnQgdW5saW5rX3N0YXJ0KQoreworCWludCByZXQsIGk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZm9yKGkgPSB1bmxpbmtfc3RhcnQ7IGkgPCBwYXRoX251bV9pdGVtcyhwYXRoKTsgaSsrKSB7CisJCWJoID0gcGF0aC0+cF9ub2RlW2ldLmJoOworCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKiliaC0+Yl9kYXRhOworCQkvKgorCQkgKiBOb3QgYWxsIG5vZGVzIG1pZ2h0IGhhdmUgaGFkIHRoZWlyIGZpbmFsIGNvdW50CisJCSAqIGRlY3JlbWVudGVkIGJ5IHRoZSBjYWxsZXIgLSBoYW5kbGUgdGhpcyBoZXJlLgorCQkgKi8KKwkJZWwgPSAmZWItPmhfbGlzdDsKKwkJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID4gMSkgeworCQkJbWxvZyhNTF9FUlJPUiwKKwkJCSAgICAgIklub2RlICVsbHUsIGF0dGVtcHRlZCB0byByZW1vdmUgZXh0ZW50IGJsb2NrICIKKwkJCSAgICAgIiVsbHUgd2l0aCAldSByZWNvcmRzXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShlYi0+aF9ibGtubyksCisJCQkgICAgIGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpKTsKKworCQkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwkJCW9jZnMyX3JlbW92ZV9mcm9tX2NhY2hlKGlub2RlLCBiaCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVsLT5sX25leHRfZnJlZV9yZWMgPSAwOworCQltZW1zZXQoJmVsLT5sX3JlY3NbMF0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCisJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisKKwkJcmV0ID0gb2NmczJfY2FjaGVfZXh0ZW50X2Jsb2NrX2ZyZWUoZGVhbGxvYywgZWIpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCisJCW9jZnMyX3JlbW92ZV9mcm9tX2NhY2hlKGlub2RlLCBiaCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvY2ZzMl91bmxpbmtfc3VidHJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSBzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoLAorCQkJCSBzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCwKKwkJCQkgaW50IHN1YnRyZWVfaW5kZXgsCisJCQkJIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCA9IGxlZnRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmJoOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCA9IGxlZnRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisKKwllbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOworCisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXJpZ2h0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4ICsgMV0uYmgtPmJfZGF0YTsKKworCWZvcihpID0gMTsgaSA8IGxlMTZfdG9fY3B1KHJvb3RfZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGkrKykKKwkJaWYgKHJvb3RfZWwtPmxfcmVjc1tpXS5lX2Jsa25vID09IGViLT5oX2Jsa25vKQorCQkJYnJlYWs7CisKKwlCVUdfT04oaSA+PSBsZTE2X3RvX2NwdShyb290X2VsLT5sX25leHRfZnJlZV9yZWMpKTsKKworCW1lbXNldCgmcm9vdF9lbC0+bF9yZWNzW2ldLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKwlsZTE2X2FkZF9jcHUoJnJvb3RfZWwtPmxfbmV4dF9mcmVlX3JlYywgLTEpOworCisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLT5iX2RhdGE7CisJZWItPmhfbmV4dF9sZWFmX2JsayA9IDA7CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcm9vdF9iaCk7CisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpKTsKKworCW9jZnMyX3VubGlua19wYXRoKGlub2RlLCBoYW5kbGUsIGRlYWxsb2MsIHJpZ2h0X3BhdGgsCisJCQkgIHN1YnRyZWVfaW5kZXggKyAxKTsKK30KKworc3RhdGljIGludCBvY2ZzMl9yb3RhdGVfc3VidHJlZV9sZWZ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCisJCQkJICAgICBpbnQgc3VidHJlZV9pbmRleCwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAorCQkJCSAgICAgaW50ICpkZWxldGVkKQoreworCWludCByZXQsIGksIGRlbF9yaWdodF9zdWJ0cmVlID0gMCwgcmlnaHRfaGFzX2VtcHR5ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmgsICpkaV9iaCA9IHBhdGhfcm9vdF9iaChyaWdodF9wYXRoKTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJpZ2h0X2xlYWZfZWwsICpsZWZ0X2xlYWZfZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisKKwkqZGVsZXRlZCA9IDA7CisKKwlyaWdodF9sZWFmX2VsID0gcGF0aF9sZWFmX2VsKHJpZ2h0X3BhdGgpOworCWxlZnRfbGVhZl9lbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOworCXJvb3RfYmggPSBsZWZ0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaDsKKwlCVUdfT04ocm9vdF9iaCAhPSByaWdodF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmgpOworCisJaWYgKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmxlZnRfbGVhZl9lbC0+bF9yZWNzWzBdKSkKKwkJcmV0dXJuIDA7CisKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKHJpZ2h0X3BhdGgpLT5iX2RhdGE7CisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmcmlnaHRfbGVhZl9lbC0+bF9yZWNzWzBdKSkgeworCQkvKgorCQkgKiBJdCdzIGxlZ2FsIGZvciB1cyB0byBwcm9jZWVkIGlmIHRoZSByaWdodCBsZWFmIGlzCisJCSAqIHRoZSByaWdodG1vc3Qgb25lIGFuZCBpdCBoYXMgYW4gZW1wdHkgZXh0ZW50LiBUaGVyZQorCQkgKiBhcmUgdHdvIGNhc2VzIHRvIGhhbmRsZSAtIHdoZXRoZXIgdGhlIGxlYWYgd2lsbCBiZQorCQkgKiBlbXB0eSBhZnRlciByZW1vdmFsIG9yIG5vdC4gSWYgdGhlIGxlYWYgaXNuJ3QgZW1wdHkKKwkJICogdGhlbiBqdXN0IHJlbW92ZSB0aGUgZW1wdHkgZXh0ZW50IHVwIGZyb250LiBUaGUKKwkJICogbmV4dCBibG9jayB3aWxsIGhhbmRsZSBlbXB0eSBsZWF2ZXMgYnkgZmxhZ2dpbmcKKwkJICogdGhlbSBmb3IgdW5saW5rLgorCQkgKgorCQkgKiBOb24gcmlnaHRtb3N0IGxlYXZlcyB3aWxsIHRocm93IC1FQUdBSU4gYW5kIHRoZQorCQkgKiBjYWxsZXIgY2FuIG1hbnVhbGx5IG1vdmUgdGhlIHN1YnRyZWUgYW5kIHJldHJ5LgorCQkgKi8KKworCQlpZiAoZWItPmhfbmV4dF9sZWFmX2JsayAhPSAwVUxMKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJaWYgKGxlMTZfdG9fY3B1KHJpZ2h0X2xlYWZfZWwtPmxfbmV4dF9mcmVlX3JlYykgPiAxKSB7CisJCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkJICAgcGF0aF9sZWFmX2JoKHJpZ2h0X3BhdGgpLAorCQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJb2NmczJfcmVtb3ZlX2VtcHR5X2V4dGVudChyaWdodF9sZWFmX2VsKTsKKwkJfSBlbHNlCisJCQlyaWdodF9oYXNfZW1wdHkgPSAxOworCX0KKworCWlmIChlYi0+aF9uZXh0X2xlYWZfYmxrID09IDBVTEwgJiYKKwkgICAgbGUxNl90b19jcHUocmlnaHRfbGVhZl9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAxKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgdG8gdXBkYXRlIGlfbGFzdF9lYl9ibGsgZHVyaW5nIHRoZSBtZXRhCisJCSAqIGRhdGEgZGVsZXRlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkZWxfcmlnaHRfc3VidHJlZSA9IDE7CisJfQorCisJLyoKKwkgKiBHZXR0aW5nIGhlcmUgd2l0aCBhbiBlbXB0eSBleHRlbnQgaW4gdGhlIHJpZ2h0IHBhdGggaW1wbGllcworCSAqIHRoYXQgaXQncyB0aGUgcmlnaHRtb3N0IHBhdGggYW5kIHdpbGwgYmUgZGVsZXRlZC4KKwkgKi8KKwlCVUdfT04ocmlnaHRfaGFzX2VtcHR5ICYmICFkZWxfcmlnaHRfc3VidHJlZSk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByb290X2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yKGkgPSBzdWJ0cmVlX2luZGV4ICsgMTsgaSA8IHBhdGhfbnVtX2l0ZW1zKHJpZ2h0X3BhdGgpOyBpKyspIHsKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJICAgcmlnaHRfcGF0aC0+cF9ub2RlW2ldLmJoLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJICAgbGVmdF9wYXRoLT5wX25vZGVbaV0uYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoIXJpZ2h0X2hhc19lbXB0eSkgeworCQkvKgorCQkgKiBPbmx5IGRvIHRoaXMgaWYgd2UncmUgbW92aW5nIGEgcmVhbAorCQkgKiByZWNvcmQuIE90aGVyd2lzZSwgdGhlIGFjdGlvbiBpcyBkZWxheWVkIHVudGlsCisJCSAqIGFmdGVyIHJlbW92YWwgb2YgdGhlIHJpZ2h0IHBhdGggaW4gd2hpY2ggY2FzZSB3ZQorCQkgKiBjYW4gZG8gYSBzaW1wbGUgc2hpZnQgdG8gcmVtb3ZlIHRoZSBlbXB0eSBleHRlbnQuCisJCSAqLworCQlvY2ZzMl9yb3RhdGVfbGVhZihsZWZ0X2xlYWZfZWwsICZyaWdodF9sZWFmX2VsLT5sX3JlY3NbMF0pOworCQltZW1zZXQoJnJpZ2h0X2xlYWZfZWwtPmxfcmVjc1swXSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCX0KKwlpZiAoZWItPmhfbmV4dF9sZWFmX2JsayA9PSAwVUxMKSB7CisJCS8qCisJCSAqIE1vdmUgcmVjcyBvdmVyIHRvIGdldCByaWQgb2YgZW1wdHkgZXh0ZW50LCBkZWNyZWFzZQorCQkgKiBuZXh0X2ZyZWUuIFRoaXMgaXMgYWxsb3dlZCB0byByZW1vdmUgdGhlIGxhc3QKKwkJICogZXh0ZW50IGluIG91ciBsZWFmIChzZXR0aW5nIGxfbmV4dF9mcmVlX3JlYyB0bworCQkgKiB6ZXJvKSAtIHRoZSBkZWxldGUgY29kZSBiZWxvdyB3b24ndCBjYXJlLgorCQkgKi8KKwkJb2NmczJfcmVtb3ZlX2VtcHR5X2V4dGVudChyaWdodF9sZWFmX2VsKTsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCkpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aF9sZWFmX2JoKHJpZ2h0X3BhdGgpKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlpZiAoZGVsX3JpZ2h0X3N1YnRyZWUpIHsKKwkJb2NmczJfdW5saW5rX3N1YnRyZWUoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLCByaWdodF9wYXRoLAorCQkJCSAgICAgc3VidHJlZV9pbmRleCwgZGVhbGxvYyk7CisJCW9jZnMyX3VwZGF0ZV9lZGdlX2xlbmd0aHMoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoKTsKKworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCktPmJfZGF0YTsKKwkJZGktPmlfbGFzdF9lYl9ibGsgPSBlYi0+aF9ibGtubzsKKworCQkvKgorCQkgKiBSZW1vdmFsIG9mIHRoZSBleHRlbnQgaW4gdGhlIGxlZnQgbGVhZiB3YXMgc2tpcHBlZAorCQkgKiBhYm92ZSBzbyB3ZSBjb3VsZCBkZWxldGUgdGhlIHJpZ2h0IHBhdGgKKwkJICogMXN0LgorCQkgKi8KKwkJaWYgKHJpZ2h0X2hhc19lbXB0eSkKKwkJCW9jZnMyX3JlbW92ZV9lbXB0eV9leHRlbnQobGVmdF9sZWFmX2VsKTsKKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCisJCSpkZWxldGVkID0gMTsKKwl9IGVsc2UKKwkJb2NmczJfY29tcGxldGVfZWRnZV9pbnNlcnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLCByaWdodF9wYXRoLAorCQkJCQkgICBzdWJ0cmVlX2luZGV4KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHaXZlbiBhIGZ1bGwgcGF0aCwgZGV0ZXJtaW5lIHdoYXQgY3BvcyB2YWx1ZSB3b3VsZCByZXR1cm4gdXMgYSBwYXRoCisgKiBjb250YWluaW5nIHRoZSBsZWFmIGltbWVkaWF0ZWx5IHRvIHRoZSByaWdodCBvZiB0aGUgY3VycmVudCBvbmUuCisgKgorICogV2lsbCByZXR1cm4gemVybyBpZiB0aGUgcGF0aCBwYXNzZWQgaW4gaXMgYWxyZWFkeSB0aGUgcmlnaHRtb3N0IHBhdGguCisgKgorICogVGhpcyBsb29rcyBzaW1pbGFyLCBidXQgaXMgc3VidGx5IGRpZmZlcmVudCB0bworICogb2NmczJfZmluZF9jcG9zX2Zvcl9sZWZ0X2xlYWYoKS4KKyAqLworc3RhdGljIGludCBvY2ZzMl9maW5kX2Nwb3NfZm9yX3JpZ2h0X2xlYWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwgdTMyICpjcG9zKQoreworCWludCBpLCBqLCByZXQgPSAwOworCXU2NCBibGtubzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCisJKmNwb3MgPSAwOworCisJaWYgKHBhdGgtPnBfdHJlZV9kZXB0aCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWJsa25vID0gcGF0aF9sZWFmX2JoKHBhdGgpLT5iX2Jsb2NrbnI7CisKKwkvKiBTdGFydCBhdCB0aGUgdHJlZSBub2RlIGp1c3QgYWJvdmUgdGhlIGxlYWYgYW5kIHdvcmsgb3VyIHdheSB1cC4gKi8KKwlpID0gcGF0aC0+cF90cmVlX2RlcHRoIC0gMTsKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWludCBuZXh0X2ZyZWU7CisKKwkJZWwgPSBwYXRoLT5wX25vZGVbaV0uZWw7CisKKwkJLyoKKwkJICogRmluZCB0aGUgZXh0ZW50IHJlY29yZCBqdXN0IGFmdGVyIHRoZSBvbmUgaW4gb3VyCisJCSAqIHBhdGguCisJCSAqLworCQluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwkJZm9yKGogPSAwOyBqIDwgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGorKykgeworCQkJaWYgKGxlNjRfdG9fY3B1KGVsLT5sX3JlY3Nbal0uZV9ibGtubykgPT0gYmxrbm8pIHsKKwkJCQlpZiAoaiA9PSAobmV4dF9mcmVlIC0gMSkpIHsKKwkJCQkJaWYgKGkgPT0gMCkgeworCQkJCQkJLyoKKwkJCQkJCSAqIFdlJ3ZlIGRldGVybWluZWQgdGhhdCB0aGUKKwkJCQkJCSAqIHBhdGggc3BlY2lmaWVkIGlzIGFscmVhZHkKKwkJCQkJCSAqIHRoZSByaWdodG1vc3Qgb25lIC0gcmV0dXJuIGEKKwkJCQkJCSAqIGNwb3Mgb2YgemVyby4KKwkJCQkJCSAqLworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQkJLyoKKwkJCQkJICogVGhlIHJpZ2h0bW9zdCByZWNvcmQgcG9pbnRzIHRvIG91cgorCQkJCQkgKiBsZWFmIC0gd2UgbmVlZCB0byB0cmF2ZWwgdXAgdGhlCisJCQkJCSAqIHRyZWUgb25lIGxldmVsLgorCQkJCQkgKi8KKwkJCQkJZ290byBuZXh0X25vZGU7CisJCQkJfQorCisJCQkJKmNwb3MgPSBsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ogKyAxXS5lX2Nwb3MpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJLyoKKwkJICogSWYgd2UgZ290IGhlcmUsIHdlIG5ldmVyIGZvdW5kIGEgdmFsaWQgbm9kZSB3aGVyZQorCQkgKiB0aGUgdHJlZSBpbmRpY2F0ZWQgb25lIHNob3VsZCBiZS4KKwkJICovCisJCW9jZnMyX2Vycm9yKHNiLAorCQkJICAgICJJbnZhbGlkIGV4dGVudCB0cmVlIGF0IGV4dGVudCBibG9jayAlbGx1XG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOworCQlyZXQgPSAtRVJPRlM7CisJCWdvdG8gb3V0OworCituZXh0X25vZGU6CisJCWJsa25vID0gcGF0aC0+cF9ub2RlW2ldLmJoLT5iX2Jsb2NrbnI7CisJCWktLTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3JvdGF0ZV9yaWdodG1vc3RfbGVhZl9sZWZ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwpCit7CisJaW50IHJldDsKKworCWlmICghb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW9jZnMyX3JlbW92ZV9lbXB0eV9leHRlbnQoZWwpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fb2NmczJfcm90YXRlX3RyZWVfbGVmdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLCBpbnQgb3JpZ19jcmVkaXRzLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICoqZW1wdHlfZXh0ZW50X3BhdGgpCit7CisJaW50IHJldCwgc3VidHJlZV9yb290LCBkZWxldGVkOworCXUzMiByaWdodF9jcG9zOworCXN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoID0gTlVMTDsKKworCUJVR19PTighb2NmczJfaXNfZW1wdHlfZXh0ZW50KCYocGF0aF9sZWFmX2VsKHBhdGgpLT5sX3JlY3NbMF0pKSk7CisKKwkqZW1wdHlfZXh0ZW50X3BhdGggPSBOVUxMOworCisJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9yaWdodF9sZWFmKGlub2RlLT5pX3NiLCBwYXRoLAorCQkJCQkgICAgICZyaWdodF9jcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHBhdGgpLAorCQkJCSAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJaWYgKCFsZWZ0X3BhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlvY2ZzMl9jcF9wYXRoKGxlZnRfcGF0aCwgcGF0aCk7CisKKwlyaWdodF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHBhdGgpLAorCQkJCSAgICBwYXRoX3Jvb3RfZWwocGF0aCkpOworCWlmICghcmlnaHRfcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChyaWdodF9jcG9zKSB7CisJCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgcmlnaHRfcGF0aCwgcmlnaHRfY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3VidHJlZV9yb290ID0gb2NmczJfZmluZF9zdWJ0cmVlX3Jvb3QoaW5vZGUsIGxlZnRfcGF0aCwKKwkJCQkJCSAgICAgICByaWdodF9wYXRoKTsKKworCQltbG9nKDAsICJTdWJ0cmVlIHJvb3QgYXQgaW5kZXggJWQgKGJsayAlbGx1LCBkZXB0aCAlZClcbiIsCisJCSAgICAgc3VidHJlZV9yb290LAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgcmlnaHRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfcm9vdF0uYmgtPmJfYmxvY2tuciwKKwkJICAgICByaWdodF9wYXRoLT5wX3RyZWVfZGVwdGgpOworCisJCXJldCA9IG9jZnMyX2V4dGVuZF9yb3RhdGVfdHJhbnNhY3Rpb24oaGFuZGxlLCBzdWJ0cmVlX3Jvb3QsCisJCQkJCQkgICAgICBvcmlnX2NyZWRpdHMsIGxlZnRfcGF0aCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfcm90YXRlX3N1YnRyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsCisJCQkJCQlyaWdodF9wYXRoLCBzdWJ0cmVlX3Jvb3QsCisJCQkJCQlkZWFsbG9jLCAmZGVsZXRlZCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJLyoKKwkJCSAqIFRoZSByb3RhdGlvbiBoYXMgdG8gdGVtcG9yYXJpbHkgc3RvcCBkdWUgdG8KKwkJCSAqIHRoZSByaWdodCBzdWJ0cmVlIGhhdmluZyBhbiBlbXB0eQorCQkJICogZXh0ZW50LiBQYXNzIGl0IGJhY2sgdG8gdGhlIGNhbGxlciBmb3IgYQorCQkJICogZml4dXAuCisJCQkgKi8KKwkJCSplbXB0eV9leHRlbnRfcGF0aCA9IHJpZ2h0X3BhdGg7CisJCQlyaWdodF9wYXRoID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogVGhlIHN1YnRyZWUgcm90YXRlIG1pZ2h0IGhhdmUgcmVtb3ZlZCByZWNvcmRzIG9uCisJCSAqIHRoZSByaWdodG1vc3QgZWRnZS4gSWYgc28sIHRoZW4gcm90YXRpb24gaXMKKwkJICogY29tcGxldGUuCisJCSAqLworCQlpZiAoZGVsZXRlZCkKKwkJCWJyZWFrOworCisJCW9jZnMyX212X3BhdGgobGVmdF9wYXRoLCByaWdodF9wYXRoKTsKKworCQlyZXQgPSBvY2ZzMl9maW5kX2Nwb3NfZm9yX3JpZ2h0X2xlYWYoaW5vZGUtPmlfc2IsIGxlZnRfcGF0aCwKKwkJCQkJCSAgICAgJnJpZ2h0X2Nwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aChyaWdodF9wYXRoKTsKKwlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcmVtb3ZlX3JpZ2h0bW9zdF9wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKK3sKKwlpbnQgcmV0LCBzdWJ0cmVlX2luZGV4OworCXUzMiBjcG9zOworCXN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwkvKgorCSAqIFhYWDogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgcm9vdCBpcyBhbiBpbm9kZSwgd2hpY2ggaXMKKwkgKiB0cnVlIGZvciBub3cgYnV0IG1heSBjaGFuZ2UgYXMgdHJlZSBjb2RlIGdldHMgZ2VuZXJpYy4KKwkgKi8KKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopcGF0aF9yb290X2JoKHBhdGgpLT5iX2RhdGE7CisJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKSB7CisJCXJldCA9IC1FSU87CisJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJICAgICJJbm9kZSAlbGx1IGhhcyBpbnZhbGlkIHBhdGggcm9vdCIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRoZXJlJ3MgdHdvIHdheXMgd2UgaGFuZGxlIHRoaXMgZGVwZW5kaW5nIG9uCisJICogd2hldGhlciBwYXRoIGlzIHRoZSBvbmx5IGV4aXN0aW5nIG9uZS4KKwkgKi8KKwlyZXQgPSBvY2ZzMl9leHRlbmRfcm90YXRlX3RyYW5zYWN0aW9uKGhhbmRsZSwgMCwKKwkJCQkJICAgICAgaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzLAorCQkJCQkgICAgICBwYXRoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChpbm9kZSwgaGFuZGxlLCBwYXRoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9sZWZ0X2xlYWYoaW5vZGUtPmlfc2IsIHBhdGgsICZjcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGNwb3MpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSBhIHBhdGggdG8gdGhlIGxlZnQgb2YgdGhpcyBvbmUgLSBpdCBuZWVkcworCQkgKiBhbiB1cGRhdGUgdG9vLgorCQkgKi8KKwkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHBhdGgpLAorCQkJCQkgICBwYXRoX3Jvb3RfZWwocGF0aCkpOworCQlpZiAoIWxlZnRfcGF0aCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCBsZWZ0X3BhdGgsIGNwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3BhdGgoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzdWJ0cmVlX2luZGV4ID0gb2NmczJfZmluZF9zdWJ0cmVlX3Jvb3QoaW5vZGUsIGxlZnRfcGF0aCwgcGF0aCk7CisKKwkJb2NmczJfdW5saW5rX3N1YnRyZWUoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLCBwYXRoLAorCQkJCSAgICAgc3VidHJlZV9pbmRleCwgZGVhbGxvYyk7CisJCW9jZnMyX3VwZGF0ZV9lZGdlX2xlbmd0aHMoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoKTsKKworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCktPmJfZGF0YTsKKwkJZGktPmlfbGFzdF9lYl9ibGsgPSBlYi0+aF9ibGtubzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAncGF0aCcgaXMgYWxzbyB0aGUgbGVmdG1vc3QgcGF0aCB3aGljaAorCQkgKiBtZWFucyBpdCBtdXN0IGJlIHRoZSBvbmx5IG9uZS4gVGhpcyBnZXRzCisJCSAqIGhhbmRsZWQgZGlmZmVyZW50bHkgYmVjYXVzZSB3ZSB3YW50IHRvCisJCSAqIHJldmVydCB0aGUgaW5vZGUgYmFjayB0byBoYXZpbmcgZXh0ZW50cworCQkgKiBpbi1saW5lLgorCQkgKi8KKwkJb2NmczJfdW5saW5rX3BhdGgoaW5vZGUsIGhhbmRsZSwgZGVhbGxvYywgcGF0aCwgMSk7CisKKwkJZWwgPSAmZGktPmlkMi5pX2xpc3Q7CisJCWVsLT5sX3RyZWVfZGVwdGggPSAwOworCQllbC0+bF9uZXh0X2ZyZWVfcmVjID0gMDsKKwkJbWVtc2V0KCZlbC0+bF9yZWNzWzBdLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKworCQlkaS0+aV9sYXN0X2ViX2JsayA9IDA7CisJfQorCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHBhdGhfcm9vdF9iaChwYXRoKSk7CisKK291dDoKKwlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTGVmdCByb3RhdGlvbiBvZiBidHJlZSByZWNvcmRzLgorICoKKyAqIEluIG1hbnkgd2F5cywgdGhpcyBpcyAodW5zdXJwcmlzaW5nbHkpIHRoZSBvcHBvc2l0ZSBvZiByaWdodAorICogcm90YXRpb24uIFdlIHN0YXJ0IGF0IHNvbWUgbm9uLXJpZ2h0bW9zdCBwYXRoIGNvbnRhaW5pbmcgYW4gZW1wdHkKKyAqIGV4dGVudCBpbiB0aGUgbGVhZiBibG9jay4gVGhlIGNvZGUgd29ya3MgaXRzIHdheSB0byB0aGUgcmlnaHRtb3N0CisgKiBwYXRoIGJ5IHJvdGF0aW5nIHJlY29yZHMgdG8gdGhlIGxlZnQgaW4gZXZlcnkgc3VidHJlZS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgYnkgYW55IGNvZGUgd2hpY2ggcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGV4dGVudCByZWNvcmRzCisgKiBpbiBhIGxlYWYuIEFmdGVyIHJlbW92YWwsIGFuIGVtcHR5IHJlY29yZCBzaG91bGQgYmUgcGxhY2VkIGluIHRoZQorICogbGVmdG1vc3QgbGlzdCBwb3NpdGlvbi4KKyAqCisgKiBUaGlzIHdvbid0IGhhbmRsZSBhIGxlbmd0aCB1cGRhdGUgb2YgdGhlIHJpZ2h0bW9zdCBwYXRoIHJlY29yZHMgaWYKKyAqIHRoZSByaWdodG1vc3QgdHJlZSBsZWFmIHJlY29yZCBpcyByZW1vdmVkIHNvIHRoZSBjYWxsZXIgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBkZXRlY3RpbmcgYW5kIGNvcnJlY3RpbmcgdGhhdC4KKyAqLworc3RhdGljIGludCBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQsIG9yaWdfY3JlZGl0cyA9IGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0czsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqdG1wX3BhdGggPSBOVUxMLCAqcmVzdGFydF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCisJZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJaWYgKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKQorCQlyZXR1cm4gMDsKKworCWlmIChwYXRoLT5wX3RyZWVfZGVwdGggPT0gMCkgeworcmlnaHRtb3N0X25vX2RlbGV0ZToKKwkJLyoKKwkJICogSW4taW5vZGUgZXh0ZW50cy4gVGhpcyBpcyB0cml2aWFsbHkgaGFuZGxlZCwgc28gZG8KKwkJICogaXQgdXAgZnJvbnQuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfcmlnaHRtb3N0X2xlYWZfbGVmdChpbm9kZSwgaGFuZGxlLAorCQkJCQkJICAgICAgIHBhdGhfbGVhZl9iaChwYXRoKSwKKwkJCQkJCSAgICAgICBwYXRoX2xlYWZfZWwocGF0aCkpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSByaWdodG1vc3QgYnJhbmNoIG5vdy4gVGhlcmUncyBzZXZlcmFsIGNhc2VzOgorCSAqICAxKSBzaW1wbGUgcm90YXRpb24gbGVhdmluZyByZWNvcmRzIGluIHRoZXJlLiBUaGF0J3MgdHJpdmlhbC4KKwkgKiAgMikgcm90YXRpb24gcmVxdWlyaW5nIGEgYnJhbmNoIGRlbGV0ZSAtIHRoZXJlJ3Mgbm8gbW9yZQorCSAqICAgICByZWNvcmRzIGxlZnQuIFR3byBjYXNlcyBvZiB0aGlzOgorCSAqICAgICBhKSBUaGVyZSBhcmUgYnJhbmNoZXMgdG8gdGhlIGxlZnQuCisJICogICAgIGIpIFRoaXMgaXMgYWxzbyB0aGUgbGVmdG1vc3QgKHRoZSBvbmx5KSBicmFuY2guCisJICoKKwkgKiAgMSkgaXMgaGFuZGxlZCB2aWEgb2NmczJfcm90YXRlX3JpZ2h0bW9zdF9sZWFmX2xlZnQoKQorCSAqICAyYSkgd2UgbmVlZCB0aGUgbGVmdCBicmFuY2ggc28gdGhhdCB3ZSBjYW4gdXBkYXRlIGl0IHdpdGggdGhlIHVubGluaworCSAqICAyYikgd2UgbmVlZCB0byBicmluZyB0aGUgaW5vZGUgYmFjayB0byBpbmxpbmUgZXh0ZW50cy4KKwkgKi8KKworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgocGF0aCktPmJfZGF0YTsKKwllbCA9ICZlYi0+aF9saXN0OworCWlmIChlYi0+aF9uZXh0X2xlYWZfYmxrID09IDApIHsKKwkJLyoKKwkJICogVGhpcyBnZXRzIGEgYml0IHRyaWNreSBpZiB3ZSdyZSBnb2luZyB0byBkZWxldGUgdGhlCisJCSAqIHJpZ2h0bW9zdCBwYXRoLiBHZXQgdGhlIG90aGVyIGNhc2VzIG91dCBvZiB0aGUgd2F5CisJCSAqIDFzdC4KKwkJICovCisJCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA+IDEpCisJCQlnb3RvIHJpZ2h0bW9zdF9ub19kZWxldGU7CisKKwkJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDApIHsKKwkJCXJldCA9IC1FSU87CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIklub2RlICVsbHUgaGFzIGVtcHR5IGV4dGVudCBibG9jayBhdCAlbGx1IiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZWItPmhfYmxrbm8pKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogWFhYOiBUaGUgY2FsbGVyIGNhbiBub3QgdHJ1c3QgInBhdGgiIGFueSBtb3JlIGFmdGVyCisJCSAqIHRoaXMgYXMgaXQgd2lsbCBoYXZlIGJlZW4gZGVsZXRlZC4gV2hhdCBkbyB3ZSBkbz8KKwkJICoKKwkJICogSW4gdGhlb3J5IHRoZSByb3RhdGUtZm9yLW1lcmdlIGNvZGUgd2lsbCBuZXZlciBnZXQKKwkJICogaGVyZSBiZWNhdXNlIGl0J2xsIGFsd2F5cyBhc2sgZm9yIGEgcm90YXRlIGluIGEKKwkJICogbm9uZW1wdHkgbGlzdC4KKwkJICovCisKKwkJcmV0ID0gb2NmczJfcmVtb3ZlX3JpZ2h0bW9zdF9wYXRoKGlub2RlLCBoYW5kbGUsIHBhdGgsCisJCQkJCQkgIGRlYWxsb2MpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBjYW4gbG9vcCwgcmVtZW1iZXJpbmcgdGhlIHBhdGggd2UgZ2V0IGZyb20gLUVBR0FJTgorCSAqIGFuZCByZXN0YXJ0aW5nIGZyb20gdGhlcmUuCisJICovCit0cnlfcm90YXRlOgorCXJldCA9IF9fb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBvcmlnX2NyZWRpdHMsIHBhdGgsCisJCQkJICAgICAgIGRlYWxsb2MsICZyZXN0YXJ0X3BhdGgpOworCWlmIChyZXQgJiYgcmV0ICE9IC1FQUdBSU4pIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAocmV0ID09IC1FQUdBSU4pIHsKKwkJdG1wX3BhdGggPSByZXN0YXJ0X3BhdGg7CisJCXJlc3RhcnRfcGF0aCA9IE5VTEw7CisKKwkJcmV0ID0gX19vY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIG9yaWdfY3JlZGl0cywKKwkJCQkJICAgICAgIHRtcF9wYXRoLCBkZWFsbG9jLAorCQkJCQkgICAgICAgJnJlc3RhcnRfcGF0aCk7CisJCWlmIChyZXQgJiYgcmV0ICE9IC1FQUdBSU4pIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJb2NmczJfZnJlZV9wYXRoKHRtcF9wYXRoKTsKKwkJdG1wX3BhdGggPSBOVUxMOworCisJCWlmIChyZXQgPT0gMCkKKwkJCWdvdG8gdHJ5X3JvdGF0ZTsKKwl9CisKK291dDoKKwlvY2ZzMl9mcmVlX3BhdGgodG1wX3BhdGgpOworCW9jZnMyX2ZyZWVfcGF0aChyZXN0YXJ0X3BhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX2NsZWFudXBfbWVyZ2Uoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKKwkJCQlpbnQgaW5kZXgpCit7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCWlmIChyZWMtPmVfbGVhZl9jbHVzdGVycyA9PSAwKSB7CisJCS8qCisJCSAqIFdlIGNvbnN1bWVkIGFsbCBvZiB0aGUgbWVyZ2VkLWZyb20gcmVjb3JkLiBBbiBlbXB0eQorCQkgKiBleHRlbnQgY2Fubm90IGV4aXN0IGFueXdoZXJlIGJ1dCB0aGUgMXN0IGFycmF5CisJCSAqIHBvc2l0aW9uLCBzbyBtb3ZlIHRoaW5ncyBvdmVyIGlmIHRoZSBtZXJnZWQtZnJvbQorCQkgKiByZWNvcmQgZG9lc24ndCBvY2N1cHkgdGhhdCBwb3NpdGlvbi4KKwkJICoKKwkJICogVGhpcyBjcmVhdGVzIGEgbmV3IGVtcHR5IGV4dGVudCBzbyB0aGUgY2FsbGVyCisJCSAqIHNob3VsZCBiZSBzbWFydCBlbm91Z2ggdG8gaGF2ZSByZW1vdmVkIGFueSBleGlzdGluZworCQkgKiBvbmVzLgorCQkgKi8KKwkJaWYgKGluZGV4ID4gMCkgeworCQkJQlVHX09OKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpOworCQkJc2l6ZSA9IGluZGV4ICogc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKTsKKwkJCW1lbW1vdmUoJmVsLT5sX3JlY3NbMV0sICZlbC0+bF9yZWNzWzBdLCBzaXplKTsKKwkJfQorCisJCS8qCisJCSAqIEFsd2F5cyBtZW1zZXQgLSB0aGUgY2FsbGVyIGRvZXNuJ3QgY2hlY2sgd2hldGhlciBpdAorCQkgKiBjcmVhdGVkIGFuIGVtcHR5IGV4dGVudCwgc28gdGhlcmUgY291bGQgYmUganVuayBpbgorCQkgKiB0aGUgb3RoZXIgZmllbGRzLgorCQkgKi8KKwkJbWVtc2V0KCZlbC0+bF9yZWNzWzBdLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKwl9Cit9CisKKy8qCisgKiBSZW1vdmUgc3BsaXRfcmVjIGNsdXN0ZXJzIGZyb20gdGhlIHJlY29yZCBhdCBpbmRleCBhbmQgbWVyZ2UgdGhlbQorICogb250byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWNvcmQgYXQgaW5kZXggKyAxLgorICovCitzdGF0aWMgaW50IG9jZnMyX21lcmdlX3JlY19yaWdodChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCWhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYywKKwkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCBpbnQgaW5kZXgpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgc3BsaXRfY2x1c3RlcnMgPSBsZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycyk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmxlZnRfcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyaWdodF9yZWM7CisKKwlCVUdfT04oaW5kZXggPj0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpOworCisJbGVmdF9yZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJcmlnaHRfcmVjID0gJmVsLT5sX3JlY3NbaW5kZXggKyAxXTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJbGUxNl9hZGRfY3B1KCZsZWZ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzLCAtc3BsaXRfY2x1c3RlcnMpOworCisJbGUzMl9hZGRfY3B1KCZyaWdodF9yZWMtPmVfY3BvcywgLXNwbGl0X2NsdXN0ZXJzKTsKKwlsZTY0X2FkZF9jcHUoJnJpZ2h0X3JlYy0+ZV9ibGtubywKKwkJICAgICAtb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBzcGxpdF9jbHVzdGVycykpOworCWxlMTZfYWRkX2NwdSgmcmlnaHRfcmVjLT5lX2xlYWZfY2x1c3RlcnMsIHNwbGl0X2NsdXN0ZXJzKTsKKworCW9jZnMyX2NsZWFudXBfbWVyZ2UoZWwsIGluZGV4KTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlbW92ZSBzcGxpdF9yZWMgY2x1c3RlcnMgZnJvbSB0aGUgcmVjb3JkIGF0IGluZGV4IGFuZCBtZXJnZSB0aGVtCisgKiBvbnRvIHRoZSB0YWlsIG9mIHRoZSByZWNvcmQgYXQgaW5kZXggLSAxLgorICovCitzdGF0aWMgaW50IG9jZnMyX21lcmdlX3JlY19sZWZ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIGludCBpbmRleCkKK3sKKwlpbnQgcmV0LCBoYXNfZW1wdHlfZXh0ZW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgc3BsaXRfY2x1c3RlcnMgPSBsZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycyk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmxlZnRfcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyaWdodF9yZWM7CisKKwlCVUdfT04oaW5kZXggPD0gMCk7CisKKwlsZWZ0X3JlYyA9ICZlbC0+bF9yZWNzW2luZGV4IC0gMV07CisJcmlnaHRfcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKQorCQloYXNfZW1wdHlfZXh0ZW50ID0gMTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGhhc19lbXB0eV9leHRlbnQgJiYgaW5kZXggPT0gMSkgeworCQkvKgorCQkgKiBUaGUgZWFzeSBjYXNlIC0gd2UgY2FuIGp1c3QgcGxvcCB0aGUgcmVjb3JkIHJpZ2h0IGluLgorCQkgKi8KKwkJKmxlZnRfcmVjID0gKnNwbGl0X3JlYzsKKworCQloYXNfZW1wdHlfZXh0ZW50ID0gMDsKKwl9IGVsc2UgeworCQlsZTE2X2FkZF9jcHUoJmxlZnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMsIHNwbGl0X2NsdXN0ZXJzKTsKKwl9CisKKwlsZTMyX2FkZF9jcHUoJnJpZ2h0X3JlYy0+ZV9jcG9zLCBzcGxpdF9jbHVzdGVycyk7CisJbGU2NF9hZGRfY3B1KCZyaWdodF9yZWMtPmVfYmxrbm8sCisJCSAgICAgb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBzcGxpdF9jbHVzdGVycykpOworCWxlMTZfYWRkX2NwdSgmcmlnaHRfcmVjLT5lX2xlYWZfY2x1c3RlcnMsIC1zcGxpdF9jbHVzdGVycyk7CisKKwlvY2ZzMl9jbGVhbnVwX21lcmdlKGVsLCBpbmRleCk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfdHJ5X3RvX21lcmdlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGgsCisJCQkJICAgICBpbnQgc3BsaXRfaW5kZXgsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfbWVyZ2VfY3R4dCAqY3R4dCkKKworeworCWludCByZXQgPSAwLCBkZWxldGVfdGFpbF9yZWNzID0gMDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYyA9ICZlbC0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKworCUJVR19PTihjdHh0LT5jX2NvbnRpZ190eXBlID09IENPTlRJR19OT05FKTsKKworCWlmIChjdHh0LT5jX3NwbGl0X2NvdmVyc19yZWMpIHsKKwkJZGVsZXRlX3RhaWxfcmVjcysrOworCisJCWlmIChjdHh0LT5jX2NvbnRpZ190eXBlID09IENPTlRJR19MRUZUUklHSFQgfHwKKwkJICAgIGN0eHQtPmNfaGFzX2VtcHR5X2V4dGVudCkKKwkJCWRlbGV0ZV90YWlsX3JlY3MrKzsKKworCQlpZiAoY3R4dC0+Y19oYXNfZW1wdHlfZXh0ZW50KSB7CisJCQkvKgorCQkJICogVGhlIG1lcmdlIGNvZGUgd2lsbCBuZWVkIHRvIGNyZWF0ZSBhbiBlbXB0eQorCQkJICogZXh0ZW50IHRvIHRha2UgdGhlIHBsYWNlIG9mIHRoZSBuZXdseQorCQkJICogZW1wdGllZCBzbG90LiBSZW1vdmUgYW55IHByZS1leGlzdGluZyBlbXB0eQorCQkJICogZXh0ZW50cyAtIGhhdmluZyBtb3JlIHRoYW4gb25lIGluIGEgbGVhZiBpcworCQkJICogaWxsZWdhbC4KKwkJCSAqLworCQkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsCisJCQkJCQkgICAgIGRlYWxsb2MpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXNwbGl0X2luZGV4LS07CisJCQlyZWMgPSAmZWwtPmxfcmVjc1tzcGxpdF9pbmRleF07CisJCX0KKwl9CisKKwlpZiAoY3R4dC0+Y19jb250aWdfdHlwZSA9PSBDT05USUdfTEVGVFJJR0hUKSB7CisJCS8qCisJCSAqIExlZnQtcmlnaHQgY29udGlnIGltcGxpZXMgdGhpcy4KKwkJICovCisJCUJVR19PTighY3R4dC0+Y19zcGxpdF9jb3ZlcnNfcmVjKTsKKwkJQlVHX09OKHNwbGl0X2luZGV4ID09IDApOworCisJCS8qCisJCSAqIFNpbmNlIHRoZSBsZWZ0cmlnaHQgaW5zZXJ0IGFsd2F5cyBjb3ZlcnMgdGhlIGVudGlyZQorCQkgKiBleHRlbnQsIHRoaXMgY2FsbCB3aWxsIGRlbGV0ZSB0aGUgaW5zZXJ0IHJlY29yZAorCQkgKiBlbnRpcmVseSwgcmVzdWx0aW5nIGluIGFuIGVtcHR5IGV4dGVudCByZWNvcmQgYWRkZWQgdG8KKwkJICogdGhlIGV4dGVudCBibG9jay4KKwkJICoKKwkJICogU2luY2UgdGhlIGFkZGluZyBvZiBhbiBlbXB0eSBleHRlbnQgc2hpZnRzCisJCSAqIGV2ZXJ5dGhpbmcgYmFjayB0byB0aGUgcmlnaHQsIHRoZXJlJ3Mgbm8gbmVlZCB0bworCQkgKiB1cGRhdGUgc3BsaXRfaW5kZXggaGVyZS4KKwkJICovCisJCXJldCA9IG9jZnMyX21lcmdlX3JlY19sZWZ0KGlub2RlLCBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSwKKwkJCQkJICAgaGFuZGxlLCBzcGxpdF9yZWMsIGVsLCBzcGxpdF9pbmRleCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogV2UgY2FuIG9ubHkgZ2V0IHRoaXMgZnJvbSBsb2dpYyBlcnJvciBhYm92ZS4KKwkJICovCisJCUJVR19PTighb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSk7CisKKwkJLyoKKwkJICogVGhlIGxlZnQgbWVyZ2UgbGVmdCB1cyB3aXRoIGFuIGVtcHR5IGV4dGVudCwgcmVtb3ZlCisJCSAqIGl0LgorCQkgKi8KKwkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIGRlYWxsb2MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzcGxpdF9pbmRleC0tOworCQlyZWMgPSAmZWwtPmxfcmVjc1tzcGxpdF9pbmRleF07CisKKwkJLyoKKwkJICogTm90ZSB0aGF0IHdlIGRvbid0IHBhc3Mgc3BsaXRfcmVjIGhlcmUgb24gcHVycG9zZSAtCisJCSAqIHdlJ3ZlIG1lcmdlZCBpdCBpbnRvIHRoZSBsZWZ0IHNpZGUuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9tZXJnZV9yZWNfcmlnaHQoaW5vZGUsIHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLAorCQkJCQkgICAgaGFuZGxlLCByZWMsIGVsLCBzcGxpdF9pbmRleCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJQlVHX09OKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKTsKKworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJICAgICBkZWFsbG9jKTsKKwkJLyoKKwkJICogRXJyb3IgZnJvbSB0aGlzIGxhc3Qgcm90YXRlIGlzIG5vdCBjcml0aWNhbCwgc28KKwkJICogcHJpbnQgYnV0IGRvbid0IGJ1YmJsZSBpdCB1cC4KKwkJICovCisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTWVyZ2UgYSByZWNvcmQgdG8gdGhlIGxlZnQgb3IgcmlnaHQuCisJCSAqCisJCSAqICdjb250aWdfdHlwZScgaXMgcmVsYXRpdmUgdG8gdGhlIGV4aXN0aW5nIHJlY29yZCwKKwkJICogc28gZm9yIGV4YW1wbGUsIGlmIHdlJ3JlICJyaWdodCBjb250aWciLCBpdCdzIHRvCisJCSAqIHRoZSByZWNvcmQgb24gdGhlIGxlZnQgKGhlbmNlIHRoZSBsZWZ0IG1lcmdlKS4KKwkJICovCisJCWlmIChjdHh0LT5jX2NvbnRpZ190eXBlID09IENPTlRJR19SSUdIVCkgeworCQkJcmV0ID0gb2NmczJfbWVyZ2VfcmVjX2xlZnQoaW5vZGUsCisJCQkJCQkgICBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSwKKwkJCQkJCSAgIGhhbmRsZSwgc3BsaXRfcmVjLCBlbCwKKwkJCQkJCSAgIHNwbGl0X2luZGV4KTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXQgPSBvY2ZzMl9tZXJnZV9yZWNfcmlnaHQoaW5vZGUsCisJCQkJCQkgICAgcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCksCisJCQkJCQkgICAgaGFuZGxlLCBzcGxpdF9yZWMsIGVsLAorCQkJCQkJICAgIHNwbGl0X2luZGV4KTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlpZiAoY3R4dC0+Y19zcGxpdF9jb3ZlcnNfcmVjKSB7CisJCQkvKgorCQkJICogVGhlIG1lcmdlIG1heSBoYXZlIGxlZnQgYW4gZW1wdHkgZXh0ZW50IGluCisJCQkgKiBvdXIgbGVhZi4gVHJ5IHRvIHJvdGF0ZSBpdCBhd2F5LgorCQkJICovCisJCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJCSAgICAgZGVhbGxvYyk7CisJCQlpZiAocmV0KQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl9zdWJ0cmFjdF9mcm9tX3JlYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICBlbnVtIG9jZnMyX3NwbGl0X3R5cGUgc3BsaXQsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMpCit7CisJdTY0IGxlbl9ibG9ja3M7CisKKwlsZW5fYmxvY2tzID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKHNiLAorCQkJCWxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisKKwlpZiAoc3BsaXQgPT0gU1BMSVRfTEVGVCkgeworCQkvKgorCQkgKiBSZWdpb24gaXMgb24gdGhlIGxlZnQgZWRnZSBvZiB0aGUgZXhpc3RpbmcKKwkJICogcmVjb3JkLgorCQkgKi8KKwkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfY3BvcywKKwkJCSAgICAgbGUxNl90b19jcHUoc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKwkJbGU2NF9hZGRfY3B1KCZyZWMtPmVfYmxrbm8sIGxlbl9ibG9ja3MpOworCQlsZTE2X2FkZF9jcHUoJnJlYy0+ZV9sZWFmX2NsdXN0ZXJzLAorCQkJICAgICAtbGUxNl90b19jcHUoc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBSZWdpb24gaXMgb24gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGV4aXN0aW5nCisJCSAqIHJlY29yZC4KKwkJICovCisJCWxlMTZfYWRkX2NwdSgmcmVjLT5lX2xlYWZfY2x1c3RlcnMsCisJCQkgICAgIC1sZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCX0KK30KKwogLyoKICAqIERvIHRoZSBmaW5hbCBiaXRzIG9mIGV4dGVudCByZWNvcmQgaW5zZXJ0aW9uIGF0IHRoZSB0YXJnZXQgbGVhZgogICogbGlzdC4gSWYgdGhpcyBsZWFmIGlzIHBhcnQgb2YgYW4gYWxsb2NhdGlvbiB0cmVlLCBpdCBpcyBhc3N1bWVkCkBAIC0xNzM4LDYgKzI5OTQsMTUgQEAKIAogCUJVR19PTihsZTE2X3RvX2NwdShlbC0+bF90cmVlX2RlcHRoKSAhPSAwKTsKIAorCWlmIChpbnNlcnQtPmluc19zcGxpdCAhPSBTUExJVF9OT05FKSB7CisJCWkgPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGxlMzJfdG9fY3B1KGluc2VydF9yZWMtPmVfY3BvcykpOworCQlCVUdfT04oaSA9PSAtMSk7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCQlvY2ZzMl9zdWJ0cmFjdF9mcm9tX3JlYyhpbm9kZS0+aV9zYiwgaW5zZXJ0LT5pbnNfc3BsaXQsIHJlYywKKwkJCQkJaW5zZXJ0X3JlYyk7CisJCWdvdG8gcm90YXRlOworCX0KKwogCS8qCiAJICogQ29udGlndW91cyBpbnNlcnQgLSBlaXRoZXIgbGVmdCBvciByaWdodC4KIAkgKi8KQEAgLTE3OTIsNiArMzA1Nyw3IEBACiAJCXJldHVybjsKIAl9CiAKK3JvdGF0ZToKIAkvKgogCSAqIE9rLCB3ZSBoYXZlIHRvIHJvdGF0ZS4KIAkgKgpAQCAtMTgxNSwxMyArMzA4MSw1MyBAQAogCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7CiB9CiAKK3N0YXRpYyB2b2lkIG9jZnMyX2FkanVzdF9yaWdodG1vc3RfcmVjb3JkcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkJICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMpCit7CisJaW50IHJldCwgaSwgbmV4dF9mcmVlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCisJLyoKKwkgKiBVcGRhdGUgZXZlcnl0aGluZyBleGNlcHQgdGhlIGxlYWYgYmxvY2suCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhdGgtPnBfdHJlZV9kZXB0aDsgaSsrKSB7CisJCWJoID0gcGF0aC0+cF9ub2RlW2ldLmJoOworCQllbCA9IHBhdGgtPnBfbm9kZVtpXS5lbDsKKworCQluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwkJaWYgKG5leHRfZnJlZSA9PSAwKSB7CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIkRpbm9kZSAlbGx1IGhhcyBhIGJhZCBleHRlbnQgbGlzdCIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwkJCXJldCA9IC1FSU87CisJCQlyZXR1cm47CisJCX0KKworCQlyZWMgPSAmZWwtPmxfcmVjc1tuZXh0X2ZyZWUgLSAxXTsKKworCQlyZWMtPmVfaW50X2NsdXN0ZXJzID0gaW5zZXJ0X3JlYy0+ZV9jcG9zOworCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9pbnRfY2x1c3RlcnMsCisJCQkgICAgIGxlMTZfdG9fY3B1KGluc2VydF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9pbnRfY2x1c3RlcnMsCisJCQkgICAgIC1sZTMyX3RvX2NwdShyZWMtPmVfY3BvcykpOworCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisKKwl9Cit9CisKIHN0YXRpYyBpbnQgb2NmczJfYXBwZW5kX3JlY190b19wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICppbnNlcnRfcmVjLAogCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCwKIAkJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKipyZXRfbGVmdF9wYXRoKQogewotCWludCByZXQsIGksIG5leHRfZnJlZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCByZXQsIG5leHRfZnJlZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwogCXN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGggPSBOVUxMOwogCkBAIC0xODg3LDQwICszMTkzLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZWwgPSBwYXRoX3Jvb3RfZWwocmlnaHRfcGF0aCk7Ci0JYmggPSBwYXRoX3Jvb3RfYmgocmlnaHRfcGF0aCk7Ci0JaSA9IDA7Ci0Jd2hpbGUgKDEpIHsKLQkJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKLQotCQluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKLQkJaWYgKG5leHRfZnJlZSA9PSAwKSB7Ci0JCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKLQkJCQkgICAgIkRpbm9kZSAlbGx1IGhhcyBhIGJhZCBleHRlbnQgbGlzdCIsCi0JCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCXJlYyA9ICZlbC0+bF9yZWNzW25leHRfZnJlZSAtIDFdOwotCi0JCXJlYy0+ZV9pbnRfY2x1c3RlcnMgPSBpbnNlcnRfcmVjLT5lX2Nwb3M7Ci0JCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKLQkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7Ci0JCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKLQkJCSAgICAgLWxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7Ci0KLQkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKLQkJaWYgKHJldCkKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQotCQkvKiBEb24ndCB0b3VjaCB0aGUgbGVhZiBub2RlICovCi0JCWlmICgrK2kgPj0gcmlnaHRfcGF0aC0+cF90cmVlX2RlcHRoKQotCQkJYnJlYWs7Ci0KLQkJYmggPSByaWdodF9wYXRoLT5wX25vZGVbaV0uYmg7Ci0JCWVsID0gcmlnaHRfcGF0aC0+cF9ub2RlW2ldLmVsOwotCX0KKwlvY2ZzMl9hZGp1c3RfcmlnaHRtb3N0X3JlY29yZHMoaW5vZGUsIGhhbmRsZSwgcmlnaHRfcGF0aCwgaW5zZXJ0X3JlYyk7CiAKIAkqcmV0X2xlZnRfcGF0aCA9IGxlZnRfcGF0aDsKIAlyZXQgPSAwOwpAQCAtMTkzMSw2ICszMjA0LDgzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgb2NmczJfc3BsaXRfcmVjb3JkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAorCQkJICAgICAgIGVudW0gb2NmczJfc3BsaXRfdHlwZSBzcGxpdCkKK3sKKwlpbnQgaW5kZXg7CisJdTMyIGNwb3MgPSBsZTMyX3RvX2NwdShzcGxpdF9yZWMtPmVfY3Bvcyk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpsZWZ0X2VsID0gTlVMTCwgKnJpZ2h0X2VsLCAqaW5zZXJ0X2VsLCAqZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYywgKnRtcHJlYzsKKworCXJpZ2h0X2VsID0gcGF0aF9sZWFmX2VsKHJpZ2h0X3BhdGgpOzsKKwlpZiAobGVmdF9wYXRoKQorCQlsZWZ0X2VsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CisKKwllbCA9IHJpZ2h0X2VsOworCWluc2VydF9lbCA9IHJpZ2h0X2VsOworCWluZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCBjcG9zKTsKKwlpZiAoaW5kZXggIT0gLTEpIHsKKwkJaWYgKGluZGV4ID09IDAgJiYgbGVmdF9wYXRoKSB7CisJCQlCVUdfT04ob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSk7CisKKwkJCS8qCisJCQkgKiBUaGlzIHR5cGljYWxseSBtZWFucyB0aGF0IHRoZSByZWNvcmQKKwkJCSAqIHN0YXJ0ZWQgaW4gdGhlIGxlZnQgcGF0aCBidXQgbW92ZWQgdG8gdGhlCisJCQkgKiByaWdodCBhcyBhIHJlc3VsdCBvZiByb3RhdGlvbi4gV2UgZWl0aGVyCisJCQkgKiBtb3ZlIHRoZSBleGlzdGluZyByZWNvcmQgdG8gdGhlIGxlZnQsIG9yIHdlCisJCQkgKiBkbyB0aGUgbGF0ZXIgaW5zZXJ0IHRoZXJlLgorCQkJICoKKwkJCSAqIEluIHRoaXMgY2FzZSwgdGhlIGxlZnQgcGF0aCBzaG91bGQgYWx3YXlzCisJCQkgKiBleGlzdCBhcyB0aGUgcm90YXRlIGNvZGUgd2lsbCBoYXZlIHBhc3NlZAorCQkJICogaXQgYmFjayBmb3IgYSBwb3N0LWluc2VydCB1cGRhdGUuCisJCQkgKi8KKworCQkJaWYgKHNwbGl0ID09IFNQTElUX0xFRlQpIHsKKwkJCQkvKgorCQkJCSAqIEl0J3MgYSBsZWZ0IHNwbGl0LiBTaW5jZSB3ZSBrbm93CisJCQkJICogdGhhdCB0aGUgcm90YXRlIGNvZGUgZ2F2ZSB1cyBhbgorCQkJCSAqIGVtcHR5IGV4dGVudCBpbiB0aGUgbGVmdCBwYXRoLCB3ZQorCQkJCSAqIGNhbiBqdXN0IGRvIHRoZSBpbnNlcnQgdGhlcmUuCisJCQkJICovCisJCQkJaW5zZXJ0X2VsID0gbGVmdF9lbDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBSaWdodCBzcGxpdCAtIHdlIGhhdmUgdG8gbW92ZSB0aGUKKwkJCQkgKiBleGlzdGluZyByZWNvcmQgb3ZlciB0byB0aGUgbGVmdAorCQkJCSAqIGxlYWYuIFRoZSBpbnNlcnQgd2lsbCBiZSBpbnRvIHRoZQorCQkJCSAqIG5ld2x5IGNyZWF0ZWQgZW1wdHkgZXh0ZW50IGluIHRoZQorCQkJCSAqIHJpZ2h0IGxlYWYuCisJCQkJICovCisJCQkJdG1wcmVjID0gJnJpZ2h0X2VsLT5sX3JlY3NbaW5kZXhdOworCQkJCW9jZnMyX3JvdGF0ZV9sZWFmKGxlZnRfZWwsIHRtcHJlYyk7CisJCQkJZWwgPSBsZWZ0X2VsOworCisJCQkJbWVtc2V0KHRtcHJlYywgMCwgc2l6ZW9mKCp0bXByZWMpKTsKKwkJCQlpbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChsZWZ0X2VsLCBjcG9zKTsKKwkJCQlCVUdfT04oaW5kZXggPT0gLTEpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJQlVHX09OKCFsZWZ0X3BhdGgpOworCQlCVUdfT04oIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmbGVmdF9lbC0+bF9yZWNzWzBdKSk7CisJCS8qCisJCSAqIExlZnQgcGF0aCBpcyBlYXN5IC0gd2UgY2FuIGp1c3QgYWxsb3cgdGhlIGluc2VydCB0bworCQkgKiBoYXBwZW4uCisJCSAqLworCQllbCA9IGxlZnRfZWw7CisJCWluc2VydF9lbCA9IGxlZnRfZWw7CisJCWluZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCBjcG9zKTsKKwkJQlVHX09OKGluZGV4ID09IC0xKTsKKwl9CisKKwlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJb2NmczJfc3VidHJhY3RfZnJvbV9yZWMoaW5vZGUtPmlfc2IsIHNwbGl0LCByZWMsIHNwbGl0X3JlYyk7CisJb2NmczJfcm90YXRlX2xlYWYoaW5zZXJ0X2VsLCBzcGxpdF9yZWMpOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBvbmx5IGRvZXMgaW5zZXJ0cyBvbiBhbiBhbGxvY2F0aW9uIGItdHJlZS4gRm9yIGRpbm9kZQogICogbGlzdHMsIG9jZnMyX2luc2VydF9hdF9sZWFmKCkgaXMgY2FsbGVkIGRpcmVjdGx5LgpAQCAtMTk0OCw3ICszMjk4LDYgQEAKIHsKIAlpbnQgcmV0LCBzdWJ0cmVlX2luZGV4OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbGVhZl9iaCA9IHBhdGhfbGVhZl9iaChyaWdodF9wYXRoKTsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwogCiAJLyoKIAkgKiBQYXNzIGJvdGggcGF0aHMgdG8gdGhlIGpvdXJuYWwuIFRoZSBtYWpvcml0eSBvZiBpbnNlcnRzCkBAIC0xOTg0LDkgKzMzMzMsMTggQEAKIAkJfQogCX0KIAotCWVsID0gcGF0aF9sZWFmX2VsKHJpZ2h0X3BhdGgpOworCWlmIChpbnNlcnQtPmluc19zcGxpdCAhPSBTUExJVF9OT05FKSB7CisJCS8qCisJCSAqIFdlIGNvdWxkIGNhbGwgb2NmczJfaW5zZXJ0X2F0X2xlYWYoKSBmb3Igc29tZSB0eXBlcworCQkgKiBvZiBzcGxpdHMsIGJ1dCBpdCdzIGVhc2llciB0byBqdXN0IGxldCBvbmUgc2VwZXJhdGUKKwkJICogZnVuY3Rpb24gc29ydCBpdCBhbGwgb3V0LgorCQkgKi8KKwkJb2NmczJfc3BsaXRfcmVjb3JkKGlub2RlLCBsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgsCisJCQkJICAgaW5zZXJ0X3JlYywgaW5zZXJ0LT5pbnNfc3BsaXQpOworCX0gZWxzZQorCQlvY2ZzMl9pbnNlcnRfYXRfbGVhZihpbnNlcnRfcmVjLCBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCksCisJCQkJICAgICBpbnNlcnQsIGlub2RlKTsKIAotCW9jZnMyX2luc2VydF9hdF9sZWFmKGluc2VydF9yZWMsIGVsLCBpbnNlcnQsIGlub2RlKTsKIAlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbGVhZl9iaCk7CiAJaWYgKHJldCkKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMjA3NSw3ICszNDMzLDcgQEAKIAkgKiBjYW4gd2luZCB1cCBza2lwcGluZyBib3RoIG9mIHRoZXNlIHR3byBzcGVjaWFsIGNhc2VzLi4uCiAJICovCiAJaWYgKHJvdGF0ZSkgewotCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9yaWdodChpbm9kZSwgaGFuZGxlLAorCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9yaWdodChpbm9kZSwgaGFuZGxlLCB0eXBlLT5pbnNfc3BsaXQsCiAJCQkJCSAgICAgIGxlMzJfdG9fY3B1KGluc2VydF9yZWMtPmVfY3BvcyksCiAJCQkJCSAgICAgIHJpZ2h0X3BhdGgsICZsZWZ0X3BhdGgpOwogCQlpZiAocmV0KSB7CkBAIC0yMTAwLDggKzM0NTgsOSBAQAogCX0KIAogb3V0X3VwZGF0ZV9jbHVzdGVyczoKLQlvY2ZzMl91cGRhdGVfZGlub2RlX2NsdXN0ZXJzKGlub2RlLCBkaSwKLQkJCQkgICAgIGxlMTZfdG9fY3B1KGluc2VydF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCWlmICh0eXBlLT5pbnNfc3BsaXQgPT0gU1BMSVRfTk9ORSkKKwkJb2NmczJfdXBkYXRlX2Rpbm9kZV9jbHVzdGVycyhpbm9kZSwgZGksCisJCQkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CiAKIAlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOwogCWlmIChyZXQpCkBAIC0yMTE0LDYgKzM0NzMsNDQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgZW51bSBvY2ZzMl9jb250aWdfdHlwZQorb2NmczJfZmlndXJlX21lcmdlX2NvbnRpZ190eXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwgaW50IGluZGV4LAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMpCit7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwllbnVtIG9jZnMyX2NvbnRpZ190eXBlIHJldCA9IENPTlRJR19OT05FOworCisJLyoKKwkgKiBXZSdyZSBjYXJlZnVsIHRvIGNoZWNrIGZvciBhbiBlbXB0eSBleHRlbnQgcmVjb3JkIGhlcmUgLQorCSAqIHRoZSBtZXJnZSBjb2RlIHdpbGwga25vdyB3aGF0IHRvIGRvIGlmIGl0IHNlZXMgb25lLgorCSAqLworCisJaWYgKGluZGV4ID4gMCkgeworCQlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleCAtIDFdOworCQlpZiAoaW5kZXggPT0gMSAmJiBvY2ZzMl9pc19lbXB0eV9leHRlbnQocmVjKSkgeworCQkJaWYgKHNwbGl0X3JlYy0+ZV9jcG9zID09IGVsLT5sX3JlY3NbaW5kZXhdLmVfY3BvcykKKwkJCQlyZXQgPSBDT05USUdfUklHSFQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBvY2ZzMl9leHRlbnRfY29udGlnKGlub2RlLCByZWMsIHNwbGl0X3JlYyk7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPCAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxKSkgeworCQllbnVtIG9jZnMyX2NvbnRpZ190eXBlIGNvbnRpZ190eXBlOworCisJCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4ICsgMV07CisJCWNvbnRpZ190eXBlID0gb2NmczJfZXh0ZW50X2NvbnRpZyhpbm9kZSwgcmVjLCBzcGxpdF9yZWMpOworCisJCWlmIChjb250aWdfdHlwZSA9PSBDT05USUdfTEVGVCAmJiByZXQgPT0gQ09OVElHX1JJR0hUKQorCQkJcmV0ID0gQ09OVElHX0xFRlRSSUdIVDsKKwkJZWxzZSBpZiAocmV0ID09IENPTlRJR19OT05FKQorCQkJcmV0ID0gY29udGlnX3R5cGU7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgb2NmczJfZmlndXJlX2NvbnRpZ190eXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgKmluc2VydCwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsCkBAIC0yMjA1LDYgKzM2MDIsOCBAQAogCXN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAorCWluc2VydC0+aW5zX3NwbGl0ID0gU1BMSVRfTk9ORTsKKwogCWVsID0gJmRpLT5pZDIuaV9saXN0OwogCWluc2VydC0+aW5zX3RyZWVfZGVwdGggPSBsZTE2X3RvX2NwdShlbC0+bF90cmVlX2RlcHRoKTsKIApAQCAtMjMyNyw5ICszNzI2LDEwIEBACiAJCQl1MzIgY3BvcywKIAkJCXU2NCBzdGFydF9ibGssCiAJCQl1MzIgbmV3X2NsdXN0ZXJzLAorCQkJdTggZmxhZ3MsCiAJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKIHsKLQlpbnQgc3RhdHVzLCBzaGlmdDsKKwlpbnQgc3RhdHVzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2luc2VydF90eXBlIGluc2VydCA9IHswLCB9OwpAQCAtMjM1MCw2ICszNzUwLDcgQEAKIAlyZWMuZV9jcG9zID0gY3B1X3RvX2xlMzIoY3Bvcyk7CiAJcmVjLmVfYmxrbm8gPSBjcHVfdG9fbGU2NChzdGFydF9ibGspOwogCXJlYy5lX2xlYWZfY2x1c3RlcnMgPSBjcHVfdG9fbGUxNihuZXdfY2x1c3RlcnMpOworCXJlYy5lX2ZsYWdzID0gZmxhZ3M7CiAKIAlzdGF0dXMgPSBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoaW5vZGUsIGZlX2JoLCAmbGFzdF9lYl9iaCwgJnJlYywKIAkJCQkJICAmaW5zZXJ0KTsKQEAgLTIzNjQsNTUgKzM3NjUsMTYgQEAKIAkgICAgIGluc2VydC5pbnNfYXBwZW5kaW5nLCBpbnNlcnQuaW5zX2NvbnRpZywgaW5zZXJ0Lmluc19jb250aWdfaW5kZXgsCiAJICAgICBpbnNlcnQuaW5zX2ZyZWVfcmVjb3JkcywgaW5zZXJ0Lmluc190cmVlX2RlcHRoKTsKIAotCS8qCi0JICogQXZvaWQgZ3Jvd2luZyB0aGUgdHJlZSB1bmxlc3Mgd2UncmUgb3V0IG9mIHJlY29yZHMgYW5kIHRoZQotCSAqIGluc2VydCB0eXBlIHJlcXVyZXMgb25lLgotCSAqLwotCWlmIChpbnNlcnQuaW5zX2NvbnRpZyAhPSBDT05USUdfTk9ORSB8fCBpbnNlcnQuaW5zX2ZyZWVfcmVjb3JkcykKLQkJZ290byBvdXRfYWRkOwotCi0Jc2hpZnQgPSBvY2ZzMl9maW5kX2JyYW5jaF90YXJnZXQob3NiLCBpbm9kZSwgZmVfYmgsICZiaCk7Ci0JaWYgKHNoaWZ0IDwgMCkgewotCQlzdGF0dXMgPSBzaGlmdDsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7Ci0JfQotCi0JLyogV2UgdHJhdmVsZWQgYWxsIHRoZSB3YXkgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYWxsb2NhdGlvbiB0cmVlCi0JICogYW5kIGRpZG4ndCBmaW5kIHJvb20gZm9yIGFueSBtb3JlIGV4dGVudHMgLSB3ZSBuZWVkIHRvIGFkZAotCSAqIGFub3RoZXIgdHJlZSBsZXZlbCAqLwotCWlmIChzaGlmdCkgewotCQlCVUdfT04oYmgpOwotCQltbG9nKDAsICJuZWVkIHRvIHNoaWZ0IHRyZWUgZGVwdGggIgotCQkgICAgICIoY3VycmVudCA9ICVkKVxuIiwgaW5zZXJ0Lmluc190cmVlX2RlcHRoKTsKLQotCQkvKiBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoIHdpbGwgcmV0dXJuIHVzIGEgYnVmZmVyIHdpdGgKLQkJICogdGhlIG5ldyBleHRlbnQgYmxvY2sgKHNvIHdlIGNhbiBwYXNzIHRoYXQgdG8KLQkJICogb2NmczJfYWRkX2JyYW5jaCkuICovCi0JCXN0YXR1cyA9IG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGgob3NiLCBoYW5kbGUsIGlub2RlLCBmZV9iaCwKLQkJCQkJCW1ldGFfYWMsICZiaCk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7CisJaWYgKGluc2VydC5pbnNfY29udGlnID09IENPTlRJR19OT05FICYmIGluc2VydC5pbnNfZnJlZV9yZWNvcmRzID09IDApIHsKKwkJc3RhdHVzID0gb2NmczJfZ3Jvd190cmVlKGlub2RlLCBoYW5kbGUsIGZlX2JoLAorCQkJCQkgJmluc2VydC5pbnNfdHJlZV9kZXB0aCwgJmxhc3RfZWJfYmgsCisJCQkJCSBtZXRhX2FjKTsKKwkJaWYgKHN0YXR1cykgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9Ci0JCWluc2VydC5pbnNfdHJlZV9kZXB0aCsrOwotCQkvKiBTcGVjaWFsIGNhc2U6IHdlIGhhdmUgcm9vbSBub3cgaWYgd2Ugc2hpZnRlZCBmcm9tCi0JCSAqIHRyZWVfZGVwdGggMCAqLwotCQlpZiAoaW5zZXJ0Lmluc190cmVlX2RlcHRoID09IDEpCi0JCQlnb3RvIG91dF9hZGQ7CiAJfQogCi0JLyogY2FsbCBvY2ZzMl9hZGRfYnJhbmNoIHRvIGFkZCB0aGUgZmluYWwgcGFydCBvZiB0aGUgdHJlZSB3aXRoCi0JICogdGhlIG5ldyBkYXRhLiAqLwotCW1sb2coMCwgImFkZCBicmFuY2guIGJoID0gJXBcbiIsIGJoKTsKLQlzdGF0dXMgPSBvY2ZzMl9hZGRfYnJhbmNoKG9zYiwgaGFuZGxlLCBpbm9kZSwgZmVfYmgsIGJoLCBsYXN0X2ViX2JoLAotCQkJCSAgbWV0YV9hYyk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7Ci0JfQotCi1vdXRfYWRkOgogCS8qIEZpbmFsbHksIHdlIGNhbiBhZGQgY2x1c3RlcnMuIFRoaXMgbWlnaHQgcm90YXRlIHRoZSB0cmVlIGZvciB1cy4gKi8KIAlzdGF0dXMgPSBvY2ZzMl9kb19pbnNlcnRfZXh0ZW50KGlub2RlLCBoYW5kbGUsIGZlX2JoLCAmcmVjLCAmaW5zZXJ0KTsKIAlpZiAoc3RhdHVzIDwgMCkKQEAgLTI0MzEsNyArMzc5Myw3MjAgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCitzdGF0aWMgdm9pZCBvY2ZzMl9tYWtlX3JpZ2h0X3NwbGl0X3JlYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAorCQkJCSAgICAgICB1MzIgY3BvcywKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYykKK3sKKwl1MzIgcmVjX2Nwb3MgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3Bvcyk7CisJdTMyIHJlY19yYW5nZSA9IHJlY19jcG9zICsgbGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpOworCisJbWVtc2V0KHNwbGl0X3JlYywgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisKKwlzcGxpdF9yZWMtPmVfY3BvcyA9IGNwdV90b19sZTMyKGNwb3MpOworCXNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzID0gY3B1X3RvX2xlMTYocmVjX3JhbmdlIC0gY3Bvcyk7CisKKwlzcGxpdF9yZWMtPmVfYmxrbm8gPSByZWMtPmVfYmxrbm87CisJbGU2NF9hZGRfY3B1KCZzcGxpdF9yZWMtPmVfYmxrbm8sCisJCSAgICAgb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKHNiLCBjcG9zIC0gcmVjX2Nwb3MpKTsKKworCXNwbGl0X3JlYy0+ZV9mbGFncyA9IHJlYy0+ZV9mbGFnczsKK30KKworc3RhdGljIGludCBvY2ZzMl9zcGxpdF9hbmRfaW5zZXJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGFzdF9lYl9iaCwKKwkJCQkgIGludCBzcGxpdF9pbmRleCwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpvcmlnX3NwbGl0X3JlYywKKwkJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKQoreworCWludCByZXQgPSAwLCBkZXB0aDsKKwl1bnNpZ25lZCBpbnQgaW5zZXJ0X3JhbmdlLCByZWNfcmFuZ2UsIGRvX2xlZnRyaWdodCA9IDA7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgdG1wcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcmlnaHRtb3N0X2VsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHJlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyBzcGxpdF9yZWMgPSAqb3JpZ19zcGxpdF9yZWM7CisJc3RydWN0IG9jZnMyX2luc2VydF90eXBlIGluc2VydDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKKworbGVmdHJpZ2h0OgorCS8qCisJICogU3RvcmUgYSBjb3B5IG9mIHRoZSByZWNvcmQgb24gdGhlIHN0YWNrIC0gaXQgbWlnaHQgbW92ZQorCSAqIGFyb3VuZCBhcyB0aGUgdHJlZSBpcyBtYW5pcHVsYXRlZCBiZWxvdy4KKwkgKi8KKwlyZWMgPSBwYXRoX2xlYWZfZWwocGF0aCktPmxfcmVjc1tzcGxpdF9pbmRleF07CisKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlyaWdodG1vc3RfZWwgPSAmZGktPmlkMi5pX2xpc3Q7CisKKwlkZXB0aCA9IGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF90cmVlX2RlcHRoKTsKKwlpZiAoZGVwdGgpIHsKKwkJQlVHX09OKCEoKmxhc3RfZWJfYmgpKTsKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSAoKmxhc3RfZWJfYmgpLT5iX2RhdGE7CisJCXJpZ2h0bW9zdF9lbCA9ICZlYi0+aF9saXN0OworCX0KKworCWlmIChsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0KKwkgICAgbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX2NvdW50KSkgeworCQlpbnQgb2xkX2RlcHRoID0gZGVwdGg7CisKKwkJcmV0ID0gb2NmczJfZ3Jvd190cmVlKGlub2RlLCBoYW5kbGUsIGRpX2JoLCAmZGVwdGgsIGxhc3RfZWJfYmgsCisJCQkJICAgICAgbWV0YV9hYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG9sZF9kZXB0aCAhPSBkZXB0aCkgeworCQkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSgqbGFzdF9lYl9iaCktPmJfZGF0YTsKKwkJCXJpZ2h0bW9zdF9lbCA9ICZlYi0+aF9saXN0OworCQl9CisJfQorCisJbWVtc2V0KCZpbnNlcnQsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUpKTsKKwlpbnNlcnQuaW5zX2FwcGVuZGluZyA9IEFQUEVORF9OT05FOworCWluc2VydC5pbnNfY29udGlnID0gQ09OVElHX05PTkU7CisJaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMgPSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfY291bnQpCisJCS0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpOworCWluc2VydC5pbnNfdHJlZV9kZXB0aCA9IGRlcHRoOworCisJaW5zZXJ0X3JhbmdlID0gbGUzMl90b19jcHUoc3BsaXRfcmVjLmVfY3BvcykgKworCQlsZTE2X3RvX2NwdShzcGxpdF9yZWMuZV9sZWFmX2NsdXN0ZXJzKTsKKwlyZWNfcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMuZV9jcG9zKSArCisJCWxlMTZfdG9fY3B1KHJlYy5lX2xlYWZfY2x1c3RlcnMpOworCisJaWYgKHNwbGl0X3JlYy5lX2Nwb3MgPT0gcmVjLmVfY3BvcykgeworCQlpbnNlcnQuaW5zX3NwbGl0ID0gU1BMSVRfTEVGVDsKKwl9IGVsc2UgaWYgKGluc2VydF9yYW5nZSA9PSByZWNfcmFuZ2UpIHsKKwkJaW5zZXJ0Lmluc19zcGxpdCA9IFNQTElUX1JJR0hUOworCX0gZWxzZSB7CisJCS8qCisJCSAqIExlZnQvcmlnaHQgc3BsaXQuIFdlIGZha2UgdGhpcyBhcyBhIHJpZ2h0IHNwbGl0CisJCSAqIGZpcnN0IGFuZCB0aGVuIG1ha2UgYSBzZWNvbmQgcGFzcyBhcyBhIGxlZnQgc3BsaXQuCisJCSAqLworCQlpbnNlcnQuaW5zX3NwbGl0ID0gU1BMSVRfUklHSFQ7CisKKwkJb2NmczJfbWFrZV9yaWdodF9zcGxpdF9yZWMoaW5vZGUtPmlfc2IsICZ0bXByZWMsIGluc2VydF9yYW5nZSwKKwkJCQkJICAgJnJlYyk7CisKKwkJc3BsaXRfcmVjID0gdG1wcmVjOworCisJCUJVR19PTihkb19sZWZ0cmlnaHQpOworCQlkb19sZWZ0cmlnaHQgPSAxOworCX0KKworCXJldCA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZGlfYmgsICZzcGxpdF9yZWMsCisJCQkJICAgICAmaW5zZXJ0KTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGRvX2xlZnRyaWdodCA9PSAxKSB7CisJCXUzMiBjcG9zOworCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCisJCWRvX2xlZnRyaWdodCsrOworCQlzcGxpdF9yZWMgPSAqb3JpZ19zcGxpdF9yZWM7CisKKwkJb2NmczJfcmVpbml0X3BhdGgocGF0aCwgMSk7CisKKwkJY3BvcyA9IGxlMzJfdG9fY3B1KHNwbGl0X3JlYy5lX2Nwb3MpOworCQlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIHBhdGgsIGNwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCQlzcGxpdF9pbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgY3Bvcyk7CisJCWdvdG8gbGVmdHJpZ2h0OworCX0KK291dDoKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNYXJrIHBhcnQgb3IgYWxsIG9mIHRoZSBleHRlbnQgcmVjb3JkIGF0IHNwbGl0X2luZGV4IGluIHRoZSBsZWFmCisgKiBwb2ludGVkIHRvIGJ5IHBhdGggYXMgd3JpdHRlbi4gVGhpcyByZW1vdmVzIHRoZSB1bndyaXR0ZW4KKyAqIGV4dGVudCBmbGFnLgorICoKKyAqIENhcmUgaXMgdGFrZW4gdG8gaGFuZGxlIGNvbnRpZ3VvdXNuZXNzIHNvIGFzIHRvIG5vdCBncm93IHRoZSB0cmVlLgorICoKKyAqIG1ldGFfYWMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSAtIHdlIG9ubHkgdHJ1bHkgbmVlZCBpdCBpZiBncm93dGgKKyAqIG9mIHRoZSB0cmVlIGlzIHJlcXVpcmVkLiBBbGwgb3RoZXIgY2FzZXMgd2lsbCBkZWdyYWRlIGludG8gYSBsZXNzCisgKiBvcHRpbWFsIHRyZWUgbGF5b3V0LgorICoKKyAqIGxhc3RfZWJfYmggc2hvdWxkIGJlIHRoZSByaWdodG1vc3QgbGVhZiBibG9jayBmb3IgYW55IGlub2RlIHdpdGggYQorICogYnRyZWUuIFNpbmNlIGEgc3BsaXQgbWF5IGdyb3cgdGhlIHRyZWUgb3IgYSBtZXJnZSBtaWdodCBzaHJpbmsgaXQsIHRoZSBjYWxsZXIgY2Fubm90IHRydXN0IHRoZSBjb250ZW50cyBvZiB0aGF0IGJ1ZmZlciBhZnRlciB0aGlzIGNhbGwuCisgKgorICogVGhpcyBjb2RlIGlzIG9wdGltaXplZCBmb3IgcmVhZGFiaWxpdHkgLSBzZXZlcmFsIHBhc3NlcyBtaWdodCBiZQorICogbWFkZSBvdmVyIGNlcnRhaW4gcG9ydGlvbnMgb2YgdGhlIHRyZWUuIEFsbCBvZiB0aG9zZSBibG9ja3Mgd2lsbAorICogaGF2ZSBiZWVuIGJyb3VnaHQgaW50byBjYWNoZSAoYW5kIHBpbm5lZCB2aWEgdGhlIGpvdXJuYWwpLCBzbyB0aGUKKyAqIGV4dHJhIG92ZXJoZWFkIGlzIG5vdCBleHByZXNzZWQgaW4gdGVybXMgb2YgZGlzayByZWFkcy4KKyAqLworc3RhdGljIGludCBfX29jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkJICAgICAgIGludCBzcGxpdF9pbmRleCwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYywKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9iaCwgKmxhc3RfZWJfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMgPSAmZWwtPmxfcmVjc1tzcGxpdF9pbmRleF07CisJc3RydWN0IG9jZnMyX21lcmdlX2N0eHQgY3R4dDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJpZ2h0bW9zdF9lbDsKKworCWlmICghcmVjLT5lX2ZsYWdzICYgT0NGUzJfRVhUX1VOV1JJVFRFTikgeworCQlyZXQgPSAtRUlPOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPiBsZTMyX3RvX2NwdShzcGxpdF9yZWMtPmVfY3BvcykgfHwKKwkgICAgKChsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycykpIDwKKwkgICAgIChsZTMyX3RvX2NwdShzcGxpdF9yZWMtPmVfY3BvcykgKyBsZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykpKSkgeworCQlyZXQgPSAtRUlPOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWViX2JoID0gcGF0aF9sZWFmX2JoKHBhdGgpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGViX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJY3R4dC5jX2NvbnRpZ190eXBlID0gb2NmczJfZmlndXJlX21lcmdlX2NvbnRpZ190eXBlKGlub2RlLCBlbCwKKwkJCQkJCQkgICAgc3BsaXRfaW5kZXgsCisJCQkJCQkJICAgIHNwbGl0X3JlYyk7CisKKwkvKgorCSAqIFRoZSBjb3JlIG1lcmdlIC8gc3BsaXQgY29kZSB3YW50cyB0byBrbm93IGhvdyBtdWNoIHJvb20gaXMKKwkgKiBsZWZ0IGluIHRoaXMgaW5vZGVzIGFsbG9jYXRpb24gdHJlZSwgc28gd2UgcGFzcyB0aGUKKwkgKiByaWdodG1vc3QgZXh0ZW50IGxpc3QuCisJICovCisJaWYgKHBhdGgtPnBfdHJlZV9kZXB0aCkgeworCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwkJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCisJCQkJICAgICAgIGxlNjRfdG9fY3B1KGRpLT5pX2xhc3RfZWJfYmxrKSwKKwkJCQkgICAgICAgJmxhc3RfZWJfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2V4aXQocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBsYXN0X2ViX2JoLT5iX2RhdGE7CisJCWlmICghT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKGViKSkgeworCQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsIGViKTsKKwkJCXJldCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CisJfSBlbHNlCisJCXJpZ2h0bW9zdF9lbCA9IHBhdGhfcm9vdF9lbChwYXRoKTsKKworCWN0eHQuY191c2VkX3RhaWxfcmVjcyA9IGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwlpZiAoY3R4dC5jX3VzZWRfdGFpbF9yZWNzID4gMCAmJgorCSAgICBvY2ZzMl9pc19lbXB0eV9leHRlbnQoJnJpZ2h0bW9zdF9lbC0+bF9yZWNzWzBdKSkKKwkJY3R4dC5jX3VzZWRfdGFpbF9yZWNzLS07CisKKwlpZiAocmVjLT5lX2Nwb3MgPT0gc3BsaXRfcmVjLT5lX2Nwb3MgJiYKKwkgICAgcmVjLT5lX2xlYWZfY2x1c3RlcnMgPT0gc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpCisJCWN0eHQuY19zcGxpdF9jb3ZlcnNfcmVjID0gMTsKKwllbHNlCisJCWN0eHQuY19zcGxpdF9jb3ZlcnNfcmVjID0gMDsKKworCWN0eHQuY19oYXNfZW1wdHlfZXh0ZW50ID0gb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKTsKKworCW1sb2coMCwgImluZGV4OiAlZCwgY29udGlnOiAldSwgdXNlZF90YWlsX3JlY3M6ICV1LCAiCisJICAgICAiaGFzX2VtcHR5OiAldSwgc3BsaXRfY292ZXJzOiAldVxuIiwgc3BsaXRfaW5kZXgsCisJICAgICBjdHh0LmNfY29udGlnX3R5cGUsIGN0eHQuY191c2VkX3RhaWxfcmVjcywKKwkgICAgIGN0eHQuY19oYXNfZW1wdHlfZXh0ZW50LCBjdHh0LmNfc3BsaXRfY292ZXJzX3JlYyk7CisKKwlpZiAoY3R4dC5jX2NvbnRpZ190eXBlID09IENPTlRJR19OT05FKSB7CisJCWlmIChjdHh0LmNfc3BsaXRfY292ZXJzX3JlYykKKwkJCWVsLT5sX3JlY3Nbc3BsaXRfaW5kZXhdID0gKnNwbGl0X3JlYzsKKwkJZWxzZQorCQkJcmV0ID0gb2NmczJfc3BsaXRfYW5kX2luc2VydChpbm9kZSwgaGFuZGxlLCBwYXRoLCBkaV9iaCwKKwkJCQkJCSAgICAgJmxhc3RfZWJfYmgsIHNwbGl0X2luZGV4LAorCQkJCQkJICAgICBzcGxpdF9yZWMsIG1ldGFfYWMpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCX0gZWxzZSB7CisJCXJldCA9IG9jZnMyX3RyeV90b19tZXJnZV9leHRlbnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwKKwkJCQkJCXNwbGl0X2luZGV4LCBzcGxpdF9yZWMsCisJCQkJCQlkZWFsbG9jLCAmY3R4dCk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJfQorCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGViX2JoKTsKKworb3V0OgorCWJyZWxzZShsYXN0X2ViX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTWFyayB0aGUgYWxyZWFkeS1leGlzdGluZyBleHRlbnQgYXQgY3BvcyBhcyB3cml0dGVuIGZvciBsZW4gY2x1c3RlcnMuCisgKgorICogSWYgdGhlIGV4aXN0aW5nIGV4dGVudCBpcyBsYXJnZXIgdGhhbiB0aGUgcmVxdWVzdCwgaW5pdGlhdGUgYQorICogc3BsaXQuIEFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIGF0IG1lcmdpbmcgd2l0aCBhZGphY2VudCBleHRlbnRzLgorICoKKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHBhc3NpbmcgZG93biBtZXRhX2FjIGlmIHdlJ2xsIG5lZWQgaXQuCisgKi8KK2ludCBvY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLCB1MzIgY3BvcywgdTMyIGxlbiwgdTMyIHBoeXMsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQsIGluZGV4OworCXU2NCBzdGFydF9ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgcGh5cyk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgc3BsaXRfcmVjOworCXN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwltbG9nKDAsICJJbm9kZSAlbHUgY3BvcyAldSwgbGVuICV1LCBwaHlzICV1ICglbGx1KVxuIiwKKwkgICAgIGlub2RlLT5pX2lubywgY3BvcywgbGVuLCBwaHlzLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X2Jsa25vKTsKKworCWlmICghb2NmczJfd3JpdGVzX3Vud3JpdHRlbl9leHRlbnRzKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpIHsKKwkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsICJJbm9kZSAlbGx1IGhhcyB1bndyaXR0ZW4gZXh0ZW50cyAiCisJCQkgICAgInRoYXQgYXJlIGJlaW5nIHdyaXR0ZW4gdG8sIGJ1dCB0aGUgZmVhdHVyZSBiaXQgIgorCQkJICAgICJpcyBub3Qgc2V0IGluIHRoZSBzdXBlciBibG9jay4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwkJcmV0ID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFhYWDogVGhpcyBzaG91bGQgYmUgZml4ZWQgdXAgc28gdGhhdCB3ZSBqdXN0IHJlLWluc2VydCB0aGUKKwkgKiBuZXh0IGV4dGVudCByZWNvcmRzLgorCSAqLworCW9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoaW5vZGUsIDApOworCisJbGVmdF9wYXRoID0gb2NmczJfbmV3X2lub2RlX3BhdGgoZGlfYmgpOworCWlmICghbGVmdF9wYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCBsZWZ0X3BhdGgsIGNwb3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKworCWluZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCBjcG9zKTsKKwlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpIHsKKwkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkgICAgIklub2RlICVsbHUgaGFzIGFuIGV4dGVudCBhdCBjcG9zICV1IHdoaWNoIGNhbiBubyAiCisJCQkgICAgImxvbmdlciBiZSBmb3VuZC5cbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGNwb3MpOworCQlyZXQgPSAtRVJPRlM7CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCgmc3BsaXRfcmVjLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKwlzcGxpdF9yZWMuZV9jcG9zID0gY3B1X3RvX2xlMzIoY3Bvcyk7CisJc3BsaXRfcmVjLmVfbGVhZl9jbHVzdGVycyA9IGNwdV90b19sZTE2KGxlbik7CisJc3BsaXRfcmVjLmVfYmxrbm8gPSBjcHVfdG9fbGU2NChzdGFydF9ibGtubyk7CisJc3BsaXRfcmVjLmVfZmxhZ3MgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKS0+bF9yZWNzW2luZGV4XS5lX2ZsYWdzOworCXNwbGl0X3JlYy5lX2ZsYWdzICY9IH5PQ0ZTMl9FWFRfVU5XUklUVEVOOworCisJcmV0ID0gX19vY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKGlub2RlLCBkaV9iaCwgaGFuZGxlLCBsZWZ0X3BhdGgsCisJCQkJCSAgaW5kZXgsICZzcGxpdF9yZWMsIG1ldGFfYWMsIGRlYWxsb2MpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfc3BsaXRfdHJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJICAgIGludCBpbmRleCwgdTMyIG5ld19yYW5nZSwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKK3sKKwlpbnQgcmV0LCBkZXB0aCwgY3JlZGl0cyA9IGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0czsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxhc3RfZWJfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcmlnaHRtb3N0X2VsLCAqZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgc3BsaXRfcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJc3RydWN0IG9jZnMyX2luc2VydF90eXBlIGluc2VydDsKKworCS8qCisJICogU2V0dXAgdGhlIHJlY29yZCB0byBzcGxpdCBiZWZvcmUgd2UgZ3JvdyB0aGUgdHJlZS4KKwkgKi8KKwllbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJb2NmczJfbWFrZV9yaWdodF9zcGxpdF9yZWMoaW5vZGUtPmlfc2IsICZzcGxpdF9yZWMsIG5ld19yYW5nZSwgcmVjKTsKKworCWRlcHRoID0gcGF0aC0+cF90cmVlX2RlcHRoOworCWlmIChkZXB0aCA+IDApIHsKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCisJCQkJICAgICAgIGxlNjRfdG9fY3B1KGRpLT5pX2xhc3RfZWJfYmxrKSwKKwkJCQkgICAgICAgJmxhc3RfZWJfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKKwkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CisJfSBlbHNlCisJCXJpZ2h0bW9zdF9lbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKworCWNyZWRpdHMgKz0gcGF0aC0+cF90cmVlX2RlcHRoICsgb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKGRpKTsKKwlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PQorCSAgICBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfY291bnQpKSB7CisJCWludCBvbGRfZGVwdGggPSBkZXB0aDsKKworCQlyZXQgPSBvY2ZzMl9ncm93X3RyZWUoaW5vZGUsIGhhbmRsZSwgZGlfYmgsICZkZXB0aCwgJmxhc3RfZWJfYmgsCisJCQkJICAgICAgbWV0YV9hYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG9sZF9kZXB0aCAhPSBkZXB0aCkgeworCQkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKWxhc3RfZWJfYmgtPmJfZGF0YTsKKwkJCXJpZ2h0bW9zdF9lbCA9ICZlYi0+aF9saXN0OworCQl9CisJfQorCisJbWVtc2V0KCZpbnNlcnQsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUpKTsKKwlpbnNlcnQuaW5zX2FwcGVuZGluZyA9IEFQUEVORF9OT05FOworCWluc2VydC5pbnNfY29udGlnID0gQ09OVElHX05PTkU7CisJaW5zZXJ0Lmluc19zcGxpdCA9IFNQTElUX1JJR0hUOworCWluc2VydC5pbnNfZnJlZV9yZWNvcmRzID0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX2NvdW50KQorCQktIGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwlpbnNlcnQuaW5zX3RyZWVfZGVwdGggPSBkZXB0aDsKKworCXJldCA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZGlfYmgsICZzcGxpdF9yZWMsICZpbnNlcnQpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0OgorCWJyZWxzZShsYXN0X2ViX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3RydW5jYXRlX3JlYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsIGludCBpbmRleCwKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAorCQkJICAgICAgdTMyIGNwb3MsIHUzMiBsZW4pCit7CisJaW50IHJldDsKKwl1MzIgbGVmdF9jcG9zLCByZWNfcmFuZ2UsIHRydW5jX3JhbmdlOworCWludCB3YW50c19yb3RhdGUgPSAwLCBpc19yaWdodG1vc3RfdHJlZV9yZWMgPSAwOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisKKwlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSAmJiBpbmRleCA+IDApIHsKKwkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLCBkZWFsbG9jKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpbmRleC0tOworCX0KKworCWlmIChpbmRleCA9PSAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxKSAmJgorCSAgICBwYXRoLT5wX3RyZWVfZGVwdGgpIHsKKwkJLyoKKwkJICogQ2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSByaWdodG1vc3QgdHJlZSByZWNvcmQuIElmCisJCSAqIHdlIHJlbW92ZSBhbGwgb2YgdGhpcyByZWNvcmQgb3IgcGFydCBvZiBpdHMgcmlnaHQKKwkJICogZWRnZSB0aGVuIGFuIHVwZGF0ZSBvZiB0aGUgcmVjb3JkIGxlbmd0aHMgYWJvdmUgaXQKKwkJICogd2lsbCBiZSByZXF1aXJlZC4KKwkJICovCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgocGF0aCktPmJfZGF0YTsKKwkJaWYgKGViLT5oX25leHRfbGVhZl9ibGsgPT0gMCkKKwkJCWlzX3JpZ2h0bW9zdF90cmVlX3JlYyA9IDE7CisJfQorCisJcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCWlmIChpbmRleCA9PSAwICYmIHBhdGgtPnBfdHJlZV9kZXB0aCAmJgorCSAgICBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPT0gY3BvcykgeworCQkvKgorCQkgKiBDaGFuZ2luZyB0aGUgbGVmdG1vc3Qgb2Zmc2V0ICh2aWEgcGFydGlhbCBvciB3aG9sZQorCQkgKiByZWNvcmQgdHJ1bmNhdGUpIG9mIGFuIGludGVyaW9yIChvciByaWdodG1vc3QpIHBhdGgKKwkJICogbWVhbnMgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIHN1YnRyZWUgdGhhdCBpcyBmb3JtZWQKKwkJICogYnkgdGhpcyBsZWFmIGFuZCB0aGUgb25lIHRvIGl0J3MgbGVmdC4KKwkJICoKKwkJICogVGhlcmUgYXJlIHR3byBjYXNlcyB3ZSBjYW4gc2tpcDoKKwkJICogICAxKSBQYXRoIGlzIHRoZSBsZWZ0bW9zdCBvbmUgaW4gb3VyIGlub2RlIHRyZWUuCisJCSAqICAgMikgVGhlIGxlYWYgaXMgcmlnaHRtb3N0IGFuZCB3aWxsIGJlIGVtcHR5IGFmdGVyCisJCSAqICAgICAgd2UgcmVtb3ZlIHRoZSBleHRlbnQgcmVjb3JkIC0gdGhlIHJvdGF0ZSBjb2RlCisJCSAqICAgICAga25vd3MgaG93IHRvIHVwZGF0ZSB0aGUgbmV3bHkgZm9ybWVkIGVkZ2UuCisJCSAqLworCisJCXJldCA9IG9jZnMyX2ZpbmRfY3Bvc19mb3JfbGVmdF9sZWFmKGlub2RlLT5pX3NiLCBwYXRoLAorCQkJCQkJICAgICZsZWZ0X2Nwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChsZWZ0X2Nwb3MgJiYgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPiAxKSB7CisJCQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCisJCQkJCQkgICBwYXRoX3Jvb3RfZWwocGF0aCkpOworCQkJaWYgKCFsZWZ0X3BhdGgpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCBsZWZ0X3BhdGgsIGxlZnRfY3Bvcyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisJcmV0ID0gb2NmczJfZXh0ZW5kX3JvdGF0ZV90cmFuc2FjdGlvbihoYW5kbGUsIDAsCisJCQkJCSAgICAgIGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cywKKwkJCQkJICAgICAgcGF0aCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3BhdGgoaW5vZGUsIGhhbmRsZSwgcGF0aCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3BhdGgoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVjX3JhbmdlID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpOworCXRydW5jX3JhbmdlID0gY3BvcyArIGxlbjsKKworCWlmIChsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPT0gY3BvcyAmJiByZWNfcmFuZ2UgPT0gdHJ1bmNfcmFuZ2UpIHsKKwkJaW50IG5leHRfZnJlZTsKKworCQltZW1zZXQocmVjLCAwLCBzaXplb2YoKnJlYykpOworCQlvY2ZzMl9jbGVhbnVwX21lcmdlKGVsLCBpbmRleCk7CisJCXdhbnRzX3JvdGF0ZSA9IDE7CisKKwkJbmV4dF9mcmVlID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJCWlmIChpc19yaWdodG1vc3RfdHJlZV9yZWMgJiYgbmV4dF9mcmVlID4gMSkgeworCQkJLyoKKwkJCSAqIFdlIHNraXAgdGhlIGVkZ2UgdXBkYXRlIGlmIHRoaXMgcGF0aCB3aWxsCisJCQkgKiBiZSBkZWxldGVkIGJ5IHRoZSByb3RhdGUgY29kZS4KKwkJCSAqLworCQkJcmVjID0gJmVsLT5sX3JlY3NbbmV4dF9mcmVlIC0gMV07CisJCQlvY2ZzMl9hZGp1c3RfcmlnaHRtb3N0X3JlY29yZHMoaW5vZGUsIGhhbmRsZSwgcGF0aCwKKwkJCQkJCSAgICAgICByZWMpOworCQl9CisJfSBlbHNlIGlmIChsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPT0gY3BvcykgeworCQkvKiBSZW1vdmUgbGVmdG1vc3QgcG9ydGlvbiBvZiB0aGUgcmVjb3JkLiAqLworCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9jcG9zLCBsZW4pOworCQlsZTY0X2FkZF9jcHUoJnJlYy0+ZV9ibGtubywgb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKHNiLCBsZW4pKTsKKwkJbGUxNl9hZGRfY3B1KCZyZWMtPmVfbGVhZl9jbHVzdGVycywgLWxlbik7CisJfSBlbHNlIGlmIChyZWNfcmFuZ2UgPT0gdHJ1bmNfcmFuZ2UpIHsKKwkJLyogUmVtb3ZlIHJpZ2h0bW9zdCBwb3J0aW9uIG9mIHRoZSByZWNvcmQgKi8KKwkJbGUxNl9hZGRfY3B1KCZyZWMtPmVfbGVhZl9jbHVzdGVycywgLWxlbik7CisJCWlmIChpc19yaWdodG1vc3RfdHJlZV9yZWMpCisJCQlvY2ZzMl9hZGp1c3RfcmlnaHRtb3N0X3JlY29yZHMoaW5vZGUsIGhhbmRsZSwgcGF0aCwgcmVjKTsKKwl9IGVsc2UgeworCQkvKiBDYWxsZXIgc2hvdWxkIGhhdmUgdHJhcHBlZCB0aGlzLiAqLworCQltbG9nKE1MX0VSUk9SLCAiSW5vZGUgJWxsdTogSW52YWxpZCByZWNvcmQgdHJ1bmNhdGU6ICgldSwgJXUpICIKKwkJICAgICAiKCV1LCAldSlcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkgICAgIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSwKKwkJICAgICBsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycyksIGNwb3MsIGxlbik7CisJCUJVRygpOworCX0KKworCWlmIChsZWZ0X3BhdGgpIHsKKwkJaW50IHN1YnRyZWVfaW5kZXg7CisKKwkJc3VidHJlZV9pbmRleCA9IG9jZnMyX2ZpbmRfc3VidHJlZV9yb290KGlub2RlLCBsZWZ0X3BhdGgsIHBhdGgpOworCQlvY2ZzMl9jb21wbGV0ZV9lZGdlX2luc2VydChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIHBhdGgsCisJCQkJCSAgIHN1YnRyZWVfaW5kZXgpOworCX0KKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX2xlYWZfYmgocGF0aCkpOworCisJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLCBkZWFsbG9jKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKGxlZnRfcGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG9jZnMyX3JlbW92ZV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCXUzMiBjcG9zLCB1MzIgbGVuLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKK3sKKwlpbnQgcmV0LCBpbmRleDsKKwl1MzIgcmVjX3JhbmdlLCB0cnVuY19yYW5nZTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisJc3RydWN0IG9jZnMyX3BhdGggKnBhdGg7CisKKwlvY2ZzMl9leHRlbnRfbWFwX3RydW5jKGlub2RlLCAwKTsKKworCXBhdGggPSBvY2ZzMl9uZXdfaW5vZGVfcGF0aChkaV9iaCk7CisJaWYgKCFwYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCBwYXRoLCBjcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA+PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSkgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSAgICAiSW5vZGUgJWxsdSBoYXMgYW4gZXh0ZW50IGF0IGNwb3MgJXUgd2hpY2ggY2FuIG5vICIKKwkJCSAgICAibG9uZ2VyIGJlIGZvdW5kLlxuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgY3Bvcyk7CisJCXJldCA9IC1FUk9GUzsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBXZSBoYXZlIDMgY2FzZXMgb2YgZXh0ZW50IHJlbW92YWw6CisJICogICAxKSBSYW5nZSBjb3ZlcnMgdGhlIGVudGlyZSBleHRlbnQgcmVjCisJICogICAyKSBSYW5nZSBiZWdpbnMgb3IgZW5kcyBvbiBvbmUgZWRnZSBvZiB0aGUgZXh0ZW50IHJlYworCSAqICAgMykgUmFuZ2UgaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZXh0ZW50IHJlYyAobm8gc2hhcmVkIGVkZ2VzKQorCSAqCisJICogRm9yIGNhc2UgMSB3ZSByZW1vdmUgdGhlIGV4dGVudCByZWMgYW5kIGxlZnQgcm90YXRlIHRvCisJICogZmlsbCB0aGUgaG9sZS4KKwkgKgorCSAqIEZvciBjYXNlIDIgd2UganVzdCBzaHJpbmsgdGhlIGV4aXN0aW5nIGV4dGVudCByZWMsIHdpdGggYQorCSAqIHRyZWUgdXBkYXRlIGlmIHRoZSBzaHJpbmtpbmcgZWRnZSBpcyBhbHNvIHRoZSBlZGdlIG9mIGFuCisJICogZXh0ZW50IGJsb2NrLgorCSAqCisJICogRm9yIGNhc2UgMyB3ZSBkbyBhIHJpZ2h0IHNwbGl0IHRvIHR1cm4gdGhlIGV4dGVudCByZWMgaW50bworCSAqIHNvbWV0aGluZyBjYXNlIDIgY2FuIGhhbmRsZS4KKwkgKi8KKwlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJcmVjX3JhbmdlID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpOworCXRydW5jX3JhbmdlID0gY3BvcyArIGxlbjsKKworCUJVR19PTihjcG9zIDwgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpIHx8IHRydW5jX3JhbmdlID4gcmVjX3JhbmdlKTsKKworCW1sb2coMCwgIklub2RlICVsbHUsIHJlbW92ZSAoY3BvcyAldSwgbGVuICV1KS4gRXhpc3RpbmcgaW5kZXggJWQgIgorCSAgICAgIihjcG9zICV1LCBsZW4gJXUpXG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGNwb3MsIGxlbiwgaW5kZXgsCisJICAgICBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcyksIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKSk7CisKKwlpZiAobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpID09IGNwb3MgfHwgcmVjX3JhbmdlID09IHRydW5jX3JhbmdlKSB7CisJCXJldCA9IG9jZnMyX3RydW5jYXRlX3JlYyhpbm9kZSwgaGFuZGxlLCBwYXRoLCBpbmRleCwgZGVhbGxvYywKKwkJCQkJIGNwb3MsIGxlbik7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gb2NmczJfc3BsaXRfdHJlZShpbm9kZSwgZGlfYmgsIGhhbmRsZSwgcGF0aCwgaW5kZXgsCisJCQkJICAgICAgIHRydW5jX3JhbmdlLCBtZXRhX2FjKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBUaGUgc3BsaXQgY291bGQgaGF2ZSBtYW5pcHVsYXRlZCB0aGUgdHJlZSBlbm91Z2ggdG8KKwkJICogbW92ZSB0aGUgcmVjb3JkIGxvY2F0aW9uLCBzbyB3ZSBoYXZlIHRvIGxvb2sgZm9yIGl0IGFnYWluLgorCQkgKi8KKwkJb2NmczJfcmVpbml0X3BhdGgocGF0aCwgMSk7CisKKwkJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCBwYXRoLCBjcG9zKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwkJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCQlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW5vZGUgJWxsdTogc3BsaXQgYXQgY3BvcyAldSBsb3N0IHJlY29yZC4iLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCQkgICAgY3Bvcyk7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIERvdWJsZSBjaGVjayBvdXIgdmFsdWVzIGhlcmUuIElmIGFueXRoaW5nIGlzIGZpc2h5LAorCQkgKiBpdCdzIGVhc2llciB0byBjYXRjaCBpdCBhdCB0aGUgdG9wIGxldmVsLgorCQkgKi8KKwkJcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCQlyZWNfcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKworCQkJb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpOworCQlpZiAocmVjX3JhbmdlICE9IHRydW5jX3JhbmdlKSB7CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIklub2RlICVsbHU6IGVycm9yIGFmdGVyIHNwbGl0IGF0IGNwb3MgJXUiCisJCQkJICAgICJ0cnVuYyBsZW4gJXUsIGV4aXN0aW5nIHJlY29yZCBpcyAoJXUsJXUpIiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkJICAgIGNwb3MsIGxlbiwgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLAorCQkJCSAgICBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYykpOworCQkJcmV0ID0gLUVST0ZTOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9yZWMoaW5vZGUsIGhhbmRsZSwgcGF0aCwgaW5kZXgsIGRlYWxsb2MsCisJCQkJCSBjcG9zLCBsZW4pOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqdGxfYmggPSBvc2ItPm9zYl90bF9iaDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKQEAgLTI0NjQsMTAgKzQ1MzksMTAgQEAKIAlyZXR1cm4gY3VycmVudF90YWlsID09IG5ld19zdGFydDsKIH0KIAotc3RhdGljIGludCBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgICAgIHU2NCBzdGFydF9ibGssCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzKQoraW50IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICAgdTY0IHN0YXJ0X2JsaywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpCiB7CiAJaW50IHN0YXR1cywgaW5kZXg7CiAJdW5zaWduZWQgaW50IHN0YXJ0X2NsdXN0ZXIsIHRsX2NvdW50OwpAQCAtMjYyMyw3ICs0Njk4LDcgQEAKIH0KIAogLyogRXhwZWN0cyB5b3UgdG8gYWxyZWFkeSBiZSBob2xkaW5nIHRsX2lub2RlLT5pX211dGV4ICovCi1zdGF0aWMgaW50IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoraW50IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQogewogCWludCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IG51bV90b19mbHVzaDsKQEAgLTI5NTcsNiArNTAzMiwyMTkgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKgorICogRGVsYXllZCBkZS1hbGxvY2F0aW9uIG9mIHN1YmFsbG9jYXRvciBibG9ja3MuCisgKgorICogU29tZSBzZXRzIG9mIGJsb2NrIGRlLWFsbG9jYXRpb25zIG1pZ2h0IGludm9sdmUgbXVsdGlwbGUgc3ViYWxsb2NhdG9yIGlub2Rlcy4KKyAqCisgKiBUaGUgbG9ja2luZyBmb3IgdGhpcyBjYW4gZ2V0IGV4dHJlbWVseSBjb21wbGljYXRlZCwgZXNwZWNpYWxseSB3aGVuCisgKiB0aGUgc3ViYWxsb2NhdG9yIGlub2RlcyB0byBkZWxldGUgZnJvbSBhcmVuJ3Qga25vd24gdW50aWwgZGVlcAorICogd2l0aGluIGFuIHVucmVsYXRlZCBjb2RlcGF0aC4KKyAqCisgKiBvY2ZzMl9leHRlbnRfYmxvY2sgc3RydWN0dXJlcyBhcmUgYSBnb29kIGV4YW1wbGUgb2YgdGhpcyAtIGFuIGlub2RlCisgKiBidHJlZSBjb3VsZCBoYXZlIGJlZW4gZ3Jvd24gYnkgYW55IG51bWJlciBvZiBub2RlcyBlYWNoIGFsbG9jYXRpbmcKKyAqIG91dCBvZiB0aGVpciBvd24gc3ViYWxsb2MgaW5vZGUuCisgKgorICogVGhlc2Ugc3RydWN0dXJlcyBhbGxvdyB0aGUgZGVsYXkgb2YgYmxvY2sgZGUtYWxsb2NhdGlvbiB1bnRpbCBhCisgKiBsYXRlciB0aW1lLCB3aGVuIGxvY2tpbmcgb2YgbXVsdGlwbGUgY2x1c3RlciBpbm9kZXMgd29uJ3QgY2F1c2UKKyAqIGRlYWRsb2NrLgorICovCisKKy8qCisgKiBEZXNjcmliZXMgYSBzaW5nbGUgYmxvY2sgZnJlZSBmcm9tIGEgc3ViYWxsb2NhdG9yCisgKi8KK3N0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSB7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlCQkqZnJlZV9uZXh0OworCXU2NAkJCQkJZnJlZV9ibGs7CisJdW5zaWduZWQgaW50CQkJCWZyZWVfYml0OworfTsKKworc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdCB7CisJc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdAkJKmZfbmV4dF9zdWJhbGxvY2F0b3I7CisJaW50CQkJCQlmX2lub2RlX3R5cGU7CisJaW50CQkJCQlmX3Nsb3Q7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlCQkqZl9maXJzdDsKK307CisKK3N0YXRpYyBpbnQgb2NmczJfZnJlZV9jYWNoZWRfaXRlbXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJICAgaW50IHN5c2ZpbGVfdHlwZSwKKwkJCQkgICBpbnQgc2xvdCwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUgKmhlYWQpCit7CisJaW50IHJldDsKKwl1NjQgYmdfYmxrbm87CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSAqdG1wOworCisJaW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLCBzeXNmaWxlX3R5cGUsIHNsb3QpOworCWlmICghaW5vZGUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsICZkaV9iaCwgMSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X211dGV4OworCX0KKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfU1VCQUxMT0NfRlJFRSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJd2hpbGUgKGhlYWQpIHsKKwkJYmdfYmxrbm8gPSBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cChoZWFkLT5mcmVlX2JsaywKKwkJCQkJCSAgICAgIGhlYWQtPmZyZWVfYml0KTsKKwkJbWxvZygwLCAiRnJlZSBiaXQ6IChiaXQgJXUsIGJsa25vICVsbHUpXG4iLAorCQkgICAgIGhlYWQtPmZyZWVfYml0LCAodW5zaWduZWQgbG9uZyBsb25nKWhlYWQtPmZyZWVfYmxrKTsKKworCQlyZXQgPSBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJCSAgICAgICBoZWFkLT5mcmVlX2JpdCwgYmdfYmxrbm8sIDEpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9qb3VybmFsOworCQl9CisKKwkJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgT0NGUzJfU1VCQUxMT0NfRlJFRSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2pvdXJuYWw7CisJCX0KKworCQl0bXAgPSBoZWFkOworCQloZWFkID0gaGVhZC0+ZnJlZV9uZXh0OworCQlrZnJlZSh0bXApOworCX0KKworb3V0X2pvdXJuYWw6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKworb3V0X3VubG9jazoKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7CisJYnJlbHNlKGRpX2JoKTsKK291dF9tdXRleDoKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlpcHV0KGlub2RlKTsKK291dDoKKwl3aGlsZShoZWFkKSB7CisJCS8qIFByZW1hdHVyZSBleGl0IG1heSBoYXZlIGxlZnQgc29tZSBkYW5nbGluZyBpdGVtcy4gKi8KKwkJdG1wID0gaGVhZDsKKwkJaGVhZCA9IGhlYWQtPmZyZWVfbmV4dDsKKwkJa2ZyZWUodG1wKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfcnVuX2RlYWxsb2NzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkgICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQpCit7CisJaW50IHJldCA9IDAsIHJldDI7CisJc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdCAqZmw7CisKKwlpZiAoIWN0eHQpCisJCXJldHVybiAwOworCisJd2hpbGUgKGN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yKSB7CisJCWZsID0gY3R4dC0+Y19maXJzdF9zdWJhbGxvY2F0b3I7CisKKwkJaWYgKGZsLT5mX2ZpcnN0KSB7CisJCQltbG9nKDAsICJGcmVlIGl0ZW1zOiAodHlwZSAldSwgc2xvdCAlZClcbiIsCisJCQkgICAgIGZsLT5mX2lub2RlX3R5cGUsIGZsLT5mX3Nsb3QpOworCQkJcmV0MiA9IG9jZnMyX2ZyZWVfY2FjaGVkX2l0ZW1zKG9zYiwgZmwtPmZfaW5vZGVfdHlwZSwKKwkJCQkJCSAgICAgICBmbC0+Zl9zbG90LCBmbC0+Zl9maXJzdCk7CisJCQlpZiAocmV0MikKKwkJCQltbG9nX2Vycm5vKHJldDIpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gcmV0MjsKKwkJfQorCisJCWN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yID0gZmwtPmZfbmV4dF9zdWJhbGxvY2F0b3I7CisJCWtmcmVlKGZsKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdCAqCitvY2ZzMl9maW5kX3Blcl9zbG90X2ZyZWVfbGlzdChpbnQgdHlwZSwKKwkJCSAgICAgIGludCBzbG90LAorCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQpCit7CisJc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdCAqZmwgPSBjdHh0LT5jX2ZpcnN0X3N1YmFsbG9jYXRvcjsKKworCXdoaWxlIChmbCkgeworCQlpZiAoZmwtPmZfaW5vZGVfdHlwZSA9PSB0eXBlICYmIGZsLT5mX3Nsb3QgPT0gc2xvdCkKKwkJCXJldHVybiBmbDsKKworCQlmbCA9IGZsLT5mX25leHRfc3ViYWxsb2NhdG9yOworCX0KKworCWZsID0ga21hbGxvYyhzaXplb2YoKmZsKSwgR0ZQX05PRlMpOworCWlmIChmbCkgeworCQlmbC0+Zl9pbm9kZV90eXBlID0gdHlwZTsKKwkJZmwtPmZfc2xvdCA9IHNsb3Q7CisJCWZsLT5mX2ZpcnN0ID0gTlVMTDsKKwkJZmwtPmZfbmV4dF9zdWJhbGxvY2F0b3IgPSBjdHh0LT5jX2ZpcnN0X3N1YmFsbG9jYXRvcjsKKworCQljdHh0LT5jX2ZpcnN0X3N1YmFsbG9jYXRvciA9IGZsOworCX0KKwlyZXR1cm4gZmw7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfY2FjaGVfYmxvY2tfZGVhbGxvYyhzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCwKKwkJCQkgICAgIGludCB0eXBlLCBpbnQgc2xvdCwgdTY0IGJsa25vLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl9wZXJfc2xvdF9mcmVlX2xpc3QgKmZsOworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSAqaXRlbTsKKworCWZsID0gb2NmczJfZmluZF9wZXJfc2xvdF9mcmVlX2xpc3QodHlwZSwgc2xvdCwgY3R4dCk7CisJaWYgKGZsID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpdGVtID0ga21hbGxvYyhzaXplb2YoKml0ZW0pLCBHRlBfTk9GUyk7CisJaWYgKGl0ZW0gPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW1sb2coMCwgIkluc2VydDogKHR5cGUgJWQsIHNsb3QgJXUsIGJpdCAldSwgYmxrICVsbHUpXG4iLAorCSAgICAgdHlwZSwgc2xvdCwgYml0LCAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vKTsKKworCWl0ZW0tPmZyZWVfYmxrID0gYmxrbm87CisJaXRlbS0+ZnJlZV9iaXQgPSBiaXQ7CisJaXRlbS0+ZnJlZV9uZXh0ID0gZmwtPmZfZmlyc3Q7CisKKwlmbC0+Zl9maXJzdCA9IGl0ZW07CisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfY2FjaGVfZXh0ZW50X2Jsb2NrX2ZyZWUoc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYikKK3sKKwlyZXR1cm4gb2NmczJfY2FjaGVfYmxvY2tfZGVhbGxvYyhjdHh0LCBFWFRFTlRfQUxMT0NfU1lTVEVNX0lOT0RFLAorCQkJCQkgbGUxNl90b19jcHUoZWItPmhfc3ViYWxsb2Nfc2xvdCksCisJCQkJCSBsZTY0X3RvX2NwdShlYi0+aF9ibGtubyksCisJCQkJCSBsZTE2X3RvX2NwdShlYi0+aF9zdWJhbGxvY19iaXQpKTsKK30KKwogLyogVGhpcyBmdW5jdGlvbiB3aWxsIGZpZ3VyZSBvdXQgd2hldGhlciB0aGUgY3VycmVudGx5IGxhc3QgZXh0ZW50CiAgKiBibG9jayB3aWxsIGJlIGRlbGV0ZWQsIGFuZCBpZiBpdCB3aWxsLCB3aGF0IHRoZSBuZXcgbGFzdCBleHRlbnQKICAqIGJsb2NrIHdpbGwgYmUgc28gd2UgY2FuIHVwZGF0ZSBoaXMgaF9uZXh0X2xlYWZfYmxrIGZpZWxkLCBhcyB3ZWxsCkBAIC0zMjM4LDI3ICs1NTI2LDEwIEBACiAJCQlCVUdfT04obGUzMl90b19jcHUoZWwtPmxfcmVjc1swXS5lX2Nwb3MpKTsKIAkJCUJVR19PTihsZTY0X3RvX2NwdShlbC0+bF9yZWNzWzBdLmVfYmxrbm8pKTsKIAotCQkJaWYgKGxlMTZfdG9fY3B1KGViLT5oX3N1YmFsbG9jX3Nsb3QpID09IDApIHsKLQkJCQkvKgotCQkJCSAqIFRoaXMgY29kZSBvbmx5IHVuZGVyc3RhbmRzIGhvdyB0bwotCQkJCSAqIGxvY2sgdGhlIHN1YmFsbG9jYXRvciBpbiBzbG90IDAsCi0JCQkJICogd2hpY2ggaXMgZmluZSBiZWNhdXNlIGFsbG9jYXRpb24gaXMKLQkJCQkgKiBvbmx5IGV2ZXIgZG9uZSBvdXQgb2YgdGhhdAotCQkJCSAqIHN1YmFsbG9jYXRvciB0b28uIEEgZnV0dXJlIHZlcnNpb24KLQkJCQkgKiBtaWdodCBjaGFuZ2UgdGhhdCBob3dldmVyLCBzbyBhdm9pZAotCQkJCSAqIGEgZnJlZSBpZiB3ZSBkb24ndCBrbm93IGhvdyB0bwotCQkJCSAqIGhhbmRsZSBpdC4gVGhpcyB3YXkgYW4gZnMgaW5jb21wYXQKLQkJCQkgKiBiaXQgd2lsbCBub3QgYmUgbmVjZXNzYXJ5LgotCQkJCSAqLwotCQkJCXJldCA9IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKGhhbmRsZSwKLQkJCQkJCQkgICAgICB0Yy0+dGNfZXh0X2FsbG9jX2lub2RlLAotCQkJCQkJCSAgICAgIHRjLT50Y19leHRfYWxsb2NfYmgsCi0JCQkJCQkJICAgICAgZWIpOwotCi0JCQkJLyogQW4gZXJyb3IgaGVyZSBpcyBub3QgZmF0YWwuICovCi0JCQkJaWYgKHJldCA8IDApCi0JCQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCX0KKwkJCXJldCA9IG9jZnMyX2NhY2hlX2V4dGVudF9ibG9ja19mcmVlKCZ0Yy0+dGNfZGVhbGxvYywgZWIpOworCQkJLyogQW4gZXJyb3IgaGVyZSBpcyBub3QgZmF0YWwuICovCisJCQlpZiAocmV0IDwgMCkKKwkJCQltbG9nX2Vycm5vKHJldCk7CiAJCX0gZWxzZSB7CiAJCQlkZWxldGVkX2ViID0gMDsKIAkJfQpAQCAtMzM5Nyw5ICs1NjY4LDkgQEAKIAlyZXR1cm4gb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOwogfQogCi1zdGF0aWMgdm9pZCBvY2ZzMl96ZXJvX2NsdXN0ZXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGlzaXplLAotCQkJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG51bXBhZ2VzLAotCQkJCSAgICAgdTY0IHBoeXMsIGhhbmRsZV90ICpoYW5kbGUpCitzdGF0aWMgdm9pZCBvY2ZzMl96ZXJvX2NsdXN0ZXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LAorCQkJCSAgICAgbG9mZl90IGVuZCwgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCQkgICAgIGludCBudW1wYWdlcywgdTY0IHBoeXMsIGhhbmRsZV90ICpoYW5kbGUpCiB7CiAJaW50IGksIHJldCwgcGFydGlhbCA9IDA7CiAJdm9pZCAqa2FkZHI7CkBAIC0zNDEyLDI2ICs1NjgzLDE0IEBACiAJaWYgKG51bXBhZ2VzID09IDApCiAJCWdvdG8gb3V0OwogCi0JZnJvbSA9IGlzaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOyAvKiAxc3QgcGFnZSBvZmZzZXQgKi8KLQlpZiAoUEFHRV9DQUNIRV9TSElGVCA+IE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZV9iaXRzKSB7Ci0JCS8qCi0JCSAqIFNpbmNlICdmcm9tJyBoYXMgYmVlbiBjYXBwZWQgdG8gYSB2YWx1ZSBiZWxvdyBwYWdlCi0JCSAqIHNpemUsIHRoaXMgY2FsY3VsYXRpb24gd29uJ3QgYmUgYWJsZSB0byBvdmVyZmxvdwotCQkgKiAndG8nCi0JCSAqLwotCQl0byA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX2NsdXN0ZXJzKHNiLCBmcm9tKTsKLQotCQkvKgotCQkgKiBUaGUgdHJ1bmNhdGUgdGFpbCBpbiB0aGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGNvbnRhaW4KLQkJICogbW9yZSB0aGFuIG9uZSBwYWdlIGF0IG1heGltdW0uIFRoZSBsb29wIGJlbG93IGFsc28KLQkJICogYXNzdW1lcyB0aGlzLgotCQkgKi8KLQkJQlVHX09OKG51bXBhZ2VzICE9IDEpOwotCX0KLQorCXRvID0gUEFHRV9DQUNIRV9TSVpFOwogCWZvcihpID0gMDsgaSA8IG51bXBhZ2VzOyBpKyspIHsKIAkJcGFnZSA9IHBhZ2VzW2ldOwogCisJCWZyb20gPSBzdGFydCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJaWYgKChlbmQgPj4gUEFHRV9DQUNIRV9TSElGVCkgPT0gcGFnZS0+aW5kZXgpCisJCQl0byA9IGVuZCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwogCQlCVUdfT04oZnJvbSA+IFBBR0VfQ0FDSEVfU0laRSk7CiAJCUJVR19PTih0byA+IFBBR0VfQ0FDSEVfU0laRSk7CiAKQEAgLTM0NjgsMTAgKzU3MjcsNyBAQAogCiAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCi0JCS8qCi0JCSAqIEV2ZXJ5IHBhZ2UgYWZ0ZXIgdGhlIDFzdCBvbmUgc2hvdWxkIGJlIGNvbXBsZXRlbHkgemVybydkLgotCQkgKi8KLQkJZnJvbSA9IDA7CisJCXN0YXJ0ID0gKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVDsKIAl9CiBvdXQ6CiAJaWYgKHBhZ2VzKSB7CkBAIC0zNDg0LDI0ICs1NzQwLDI2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG9jZnMyX2dyYWJfZW9mX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBpc2l6ZSwgc3RydWN0IHBhZ2UgKipwYWdlcywKLQkJCQlpbnQgKm51bSwgdTY0ICpwaHlzKQorc3RhdGljIGludCBvY2ZzMl9ncmFiX2VvZl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCQkJc3RydWN0IHBhZ2UgKipwYWdlcywgaW50ICpudW0sIHU2NCAqcGh5cykKIHsKIAlpbnQgaSwgbnVtcGFnZXMgPSAwLCByZXQgPSAwOwotCXVuc2lnbmVkIGludCBjc2l6ZSA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKS0+c19jbHVzdGVyc2l6ZTsKIAl1bnNpZ25lZCBpbnQgZXh0X2ZsYWdzOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAJdW5zaWduZWQgbG9uZyBpbmRleDsKLQl1NjQgbmV4dF9jbHVzdGVyX2J5dGVzOworCWxvZmZfdCBsYXN0X3BhZ2VfYnl0ZXM7CiAKIAlCVUdfT04oIW9jZnMyX3NwYXJzZV9hbGxvYyhPQ0ZTMl9TQihzYikpKTsKKwlCVUdfT04oc3RhcnQgPiBlbmQpOwogCi0JLyogQ2x1c3RlciBib3VuZGFyeSwgc28gd2UgZG9uJ3QgbmVlZCB0byBncmFiIGFueSBwYWdlcy4gKi8KLQlpZiAoKGlzaXplICYgKGNzaXplIC0gMSkpID09IDApCisJaWYgKHN0YXJ0ID09IGVuZCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIGlzaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAorCUJVR19PTihzdGFydCA+PiBPQ0ZTMl9TQihzYiktPnNfY2x1c3RlcnNpemVfYml0cyAhPQorCSAgICAgICAoZW5kIC0gMSkgPj4gT0NGUzJfU0Ioc2IpLT5zX2NsdXN0ZXJzaXplX2JpdHMpOworCisJcmV0ID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCBzdGFydCA+PiBzYi0+c19ibG9ja3NpemVfYml0cywKIAkJCQkJICBwaHlzLCBOVUxMLCAmZXh0X2ZsYWdzKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTM1MTcsOCArNTc3NSw4IEBACiAJaWYgKGV4dF9mbGFncyAmIE9DRlMyX0VYVF9VTldSSVRURU4pCiAJCWdvdG8gb3V0OwogCi0JbmV4dF9jbHVzdGVyX2J5dGVzID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIGlzaXplKTsKLQlpbmRleCA9IGlzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJbGFzdF9wYWdlX2J5dGVzID0gUEFHRV9BTElHTihlbmQpOworCWluZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlkbyB7CiAJCXBhZ2VzW251bXBhZ2VzXSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CiAJCWlmICghcGFnZXNbbnVtcGFnZXNdKSB7CkBAIC0zNTI5LDcgKzU3ODcsNyBAQAogCiAJCW51bXBhZ2VzKys7CiAJCWluZGV4Kys7Ci0JfSB3aGlsZSAoaW5kZXggPCAobmV4dF9jbHVzdGVyX2J5dGVzID4+IFBBR0VfQ0FDSEVfU0hJRlQpKTsKKwl9IHdoaWxlIChpbmRleCA8IChsYXN0X3BhZ2VfYnl0ZXMgPj4gUEFHRV9DQUNIRV9TSElGVCkpOwogCiBvdXQ6CiAJaWYgKHJldCAhPSAwKSB7CkBAIC0zNTU4LDExICs1ODE2LDEwIEBACiAgKiBvdGhlcndpc2UgYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgd2lsbCBza2lwIHdyaXRlb3V0IG9mIHBhZ2VzIHBhc3QKICAqIGlfc2l6ZS4gVGhlIG5ld19pX3NpemUgcGFyYW1ldGVyIGlzIHBhc3NlZCBmb3IgdGhpcyByZWFzb24uCiAgKi8KLWludCBvY2ZzMl96ZXJvX3RhaWxfZm9yX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJIHU2NCBuZXdfaV9zaXplKQoraW50IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICB1NjQgcmFuZ2Vfc3RhcnQsIHU2NCByYW5nZV9lbmQpCiB7CiAJaW50IHJldCwgbnVtcGFnZXM7Ci0JbG9mZl90IGVuZGJ5dGU7CiAJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CiAJdTY0IHBoeXM7CiAKQEAgLTM1ODEsNyArNTgzOCw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX2dyYWJfZW9mX3BhZ2VzKGlub2RlLCBuZXdfaV9zaXplLCBwYWdlcywgJm51bXBhZ2VzLCAmcGh5cyk7CisJcmV0ID0gb2NmczJfZ3JhYl9lb2ZfcGFnZXMoaW5vZGUsIHJhbmdlX3N0YXJ0LCByYW5nZV9lbmQsIHBhZ2VzLAorCQkJCSAgICZudW1wYWdlcywgJnBoeXMpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTM1OTAsMTcgKzU4NDgsMTYgQEAKIAlpZiAobnVtcGFnZXMgPT0gMCkKIAkJZ290byBvdXQ7CiAKLQlvY2ZzMl96ZXJvX2NsdXN0ZXJfcGFnZXMoaW5vZGUsIG5ld19pX3NpemUsIHBhZ2VzLCBudW1wYWdlcywgcGh5cywKLQkJCQkgaGFuZGxlKTsKKwlvY2ZzMl96ZXJvX2NsdXN0ZXJfcGFnZXMoaW5vZGUsIHJhbmdlX3N0YXJ0LCByYW5nZV9lbmQsIHBhZ2VzLAorCQkJCSBudW1wYWdlcywgcGh5cywgaGFuZGxlKTsKIAogCS8qCiAJICogSW5pdGlhdGUgd3JpdGVvdXQgb2YgdGhlIHBhZ2VzIHdlIHplcm8nZCBoZXJlLiBXZSBkb24ndAogCSAqIHdhaXQgb24gdGhlbSAtIHRoZSB0cnVuY2F0ZV9pbm9kZV9wYWdlcygpIGNhbGwgbGF0ZXIgd2lsbAogCSAqIGRvIHRoYXQgZm9yIHVzLgogCSAqLwotCWVuZGJ5dGUgPSBvY2ZzMl9hbGlnbl9ieXRlc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwgbmV3X2lfc2l6ZSk7Ci0JcmV0ID0gZG9fc3luY19tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIG5ld19pX3NpemUsCi0JCQkJICAgIGVuZGJ5dGUgLSAxLCBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUpOworCXJldCA9IGRvX3N5bmNfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCByYW5nZV9zdGFydCwKKwkJCQkgICAgcmFuZ2VfZW5kIC0gMSwgU1lOQ19GSUxFX1JBTkdFX1dSSVRFKTsKIAlpZiAocmV0KQogCQltbG9nX2Vycm5vKHJldCk7CiAKQEAgLTM2MzEsOCArNTg4OCw2IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwotCiAJbmV3X2hpZ2hlc3RfY3BvcyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhvc2ItPnNiLAogCQkJCQkJICAgICBpX3NpemVfcmVhZChpbm9kZSkpOwogCkBAIC0zNzU0LDcgKzYwMDksNiBAQAogCWdvdG8gc3RhcnQ7CiAKIGJhaWw6Ci0JdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwogCiAJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7CiAKQEAgLTM3NjQsNiArNjAxOCw4IEBACiAJaWYgKGhhbmRsZSkKIAkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAorCW9jZnMyX3J1bl9kZWFsbG9jcyhvc2IsICZ0Yy0+dGNfZGVhbGxvYyk7CisKIAlvY2ZzMl9mcmVlX3BhdGgocGF0aCk7CiAKIAkvKiBUaGlzIHdpbGwgZHJvcCB0aGUgZXh0X2FsbG9jIGNsdXN0ZXIgbG9jayBmb3IgdXMgKi8KQEAgLTM3NzQsMjMgKzYwMzAsMTggQEAKIH0KIAogLyoKLSAqIEV4cGVjdHMgdGhlIGlub2RlIHRvIGFscmVhZHkgYmUgbG9ja2VkLiBUaGlzIHdpbGwgZmlndXJlIG91dCB3aGljaAotICogaW5vZGVzIG5lZWQgdG8gYmUgbG9ja2VkIGFuZCB3aWxsIHB1dCB0aGVtIG9uIHRoZSByZXR1cm5lZCB0cnVuY2F0ZQotICogY29udGV4dC4KKyAqIEV4cGVjdHMgdGhlIGlub2RlIHRvIGFscmVhZHkgYmUgbG9ja2VkLgogICovCiBpbnQgb2NmczJfcHJlcGFyZV90cnVuY2F0ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJICAgc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKip0YykKIHsKLQlpbnQgc3RhdHVzLCBtZXRhZGF0YV9kZWxldGUsIGk7CisJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgbmV3X2lfY2x1c3RlcnM7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxhc3RfZWJfYmggPSBOVUxMOwotCXN0cnVjdCBpbm9kZSAqZXh0X2FsbG9jX2lub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dF9hbGxvY19iaCA9IE5VTEw7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIApAQCAtMzgxMCwxMiArNjA2MSw5IEBACiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KKwlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmKCp0YyktPnRjX2RlYWxsb2MpOwogCi0JbWV0YWRhdGFfZGVsZXRlID0gMDsKIAlpZiAoZmUtPmlkMi5pX2xpc3QubF90cmVlX2RlcHRoKSB7Ci0JCS8qIElmIHdlIGhhdmUgYSB0cmVlLCB0aGVuIHRoZSB0cnVuY2F0ZSBtYXkgcmVzdWx0IGluCi0JCSAqIG1ldGFkYXRhIGRlbGV0ZXMuIEZpZ3VyZSB0aGlzIG91dCBmcm9tIHRoZQotCQkgKiByaWdodG1vc3QgbGVhZiBibG9jay4qLwogCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgbGU2NF90b19jcHUoZmUtPmlfbGFzdF9lYl9ibGspLAogCQkJCQkgICZsYXN0X2ViX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTM4MzAsNDMgKzYwNzgsMTAgQEAKIAkJCXN0YXR1cyA9IC1FSU87CiAJCQlnb3RvIGJhaWw7CiAJCX0KLQkJZWwgPSAmKGViLT5oX2xpc3QpOwotCi0JCWkgPSAwOwotCQlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSkKLQkJCWkgPSAxOwotCQkvKgotCQkgKiBYWFg6IFNob3VsZCB3ZSBjaGVjayB0aGF0IG5leHRfZnJlZV9yZWMgY29udGFpbnMKLQkJICogdGhlIGV4dGVudD8KLQkJICovCi0JCWlmIChsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY3BvcykgPj0gbmV3X2lfY2x1c3RlcnMpCi0JCQltZXRhZGF0YV9kZWxldGUgPSAxOwogCX0KIAogCSgqdGMpLT50Y19sYXN0X2ViX2JoID0gbGFzdF9lYl9iaDsKIAotCWlmIChtZXRhZGF0YV9kZWxldGUpIHsKLQkJbWxvZygwLCAiV2lsbCBoYXZlIHRvIGRlbGV0ZSBtZXRhZGF0YSBmb3IgdGhpcyB0cnVuYy4gIgotCQkgICAgICJsb2NraW5nIGFsbG9jYXRvci5cbiIpOwotCQlleHRfYWxsb2NfaW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLCBFWFRFTlRfQUxMT0NfU1lTVEVNX0lOT0RFLCAwKTsKLQkJaWYgKCFleHRfYWxsb2NfaW5vZGUpIHsKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQotCQltdXRleF9sb2NrKCZleHRfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOwotCQkoKnRjKS0+dGNfZXh0X2FsbG9jX2lub2RlID0gZXh0X2FsbG9jX2lub2RlOwotCi0JCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhleHRfYWxsb2NfaW5vZGUsICZleHRfYWxsb2NfYmgsIDEpOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJZ290byBiYWlsOwotCQl9Ci0JCSgqdGMpLT50Y19leHRfYWxsb2NfYmggPSBleHRfYWxsb2NfYmg7Ci0JCSgqdGMpLT50Y19leHRfYWxsb2NfbG9ja2VkID0gMTsKLQl9Ci0KIAlzdGF0dXMgPSAwOwogYmFpbDoKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtMzg4MCwxNiArNjA5NSwxMyBAQAogCiBzdGF0aWMgdm9pZCBvY2ZzMl9mcmVlX3RydW5jYXRlX2NvbnRleHQoc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKnRjKQogewotCWlmICh0Yy0+dGNfZXh0X2FsbG9jX2lub2RlKSB7Ci0JCWlmICh0Yy0+dGNfZXh0X2FsbG9jX2xvY2tlZCkKLQkJCW9jZnMyX21ldGFfdW5sb2NrKHRjLT50Y19leHRfYWxsb2NfaW5vZGUsIDEpOwotCi0JCW11dGV4X3VubG9jaygmdGMtPnRjX2V4dF9hbGxvY19pbm9kZS0+aV9tdXRleCk7Ci0JCWlwdXQodGMtPnRjX2V4dF9hbGxvY19pbm9kZSk7Ci0JfQotCi0JaWYgKHRjLT50Y19leHRfYWxsb2NfYmgpCi0JCWJyZWxzZSh0Yy0+dGNfZXh0X2FsbG9jX2JoKTsKKwkvKgorCSAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNvbXBsZXRpbmcgZGVhbGxvY2F0aW9uCisJICogYmVmb3JlIGZyZWVpbmcgdGhlIGNvbnRleHQuCisJICovCisJaWYgKHRjLT50Y19kZWFsbG9jLmNfZmlyc3Rfc3ViYWxsb2NhdG9yICE9IE5VTEwpCisJCW1sb2coTUxfTk9USUNFLAorCQkgICAgICJUcnVuY2F0ZSBjb21wbGV0aW9uIGhhcyBub24tZW1wdHkgZGVhbGxvYyBjb250ZXh0XG4iKTsKIAogCWlmICh0Yy0+dGNfbGFzdF9lYl9iaCkKIAkJYnJlbHNlKHRjLT50Y19sYXN0X2ViX2JoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmggYi9mcy9vY2ZzMi9hbGxvYy5oCmluZGV4IGZiY2I1OTMuLjk5MGRmNDggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmgKKysrIGIvZnMvb2NmczIvYWxsb2MuaApAQCAtMzQsNyArMzQsMTcgQEAKIAkJCXUzMiBjcG9zLAogCQkJdTY0IHN0YXJ0X2JsaywKIAkJCXUzMiBuZXdfY2x1c3RlcnMsCisJCQl1OCBmbGFncywKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKTsKK3N0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0OworaW50IG9jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsIHUzMiBjcG9zLCB1MzIgbGVuLCB1MzIgcGh5cywKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpOworaW50IG9jZnMyX3JlbW92ZV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCXUzMiBjcG9zLCB1MzIgbGVuLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYyk7CiBpbnQgb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSk7CkBAIC02MiwxNyArNzIsNDEgQEAKIAkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICoqdGxfY29weSk7CiBpbnQgb2NmczJfY29tcGxldGVfdHJ1bmNhdGVfbG9nX3JlY292ZXJ5KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCQkgc3RydWN0IG9jZnMyX2Rpbm9kZSAqdGxfY29weSk7CitpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKTsKK2ludCBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgIHU2NCBzdGFydF9ibGssCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzKTsKK2ludCBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CisKKy8qCisgKiBQcm9jZXNzIGxvY2FsIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgdGhlIGJsb2NrIHVubGlua3MgZG9uZQorICogZHVyaW5nIGFuIG9wZXJhdGlvbi4gVGhpcyBpcyBwb3B1bGF0ZWQgdmlhCisgKiBvY2ZzMl9jYWNoZV9ibG9ja19kZWFsbG9jKCkuCisgKgorICogb2NmczJfcnVuX2RlYWxsb2NzKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgcG90ZW50aWFsbHkKKyAqIGRlLWFsbG9jYXRpbmcgcm91dGluZXMuIE5vIGpvdXJuYWwgaGFuZGxlcyBzaG91bGQgYmUgb3BlbiwgYW5kIG1vc3QKKyAqIGxvY2tzIHNob3VsZCBoYXZlIGJlZW4gZHJvcHBlZC4KKyAqLworc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgeworCXN0cnVjdCBvY2ZzMl9wZXJfc2xvdF9mcmVlX2xpc3QJCSpjX2ZpcnN0X3N1YmFsbG9jYXRvcjsKK307CitzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmMpCit7CisJYy0+Y19maXJzdF9zdWJhbGxvY2F0b3IgPSBOVUxMOworfQoraW50IG9jZnMyX3J1bl9kZWFsbG9jcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJICAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0KTsKIAogc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgewotCXN0cnVjdCBpbm9kZSAqdGNfZXh0X2FsbG9jX2lub2RlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqdGNfZXh0X2FsbG9jX2JoOworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0IHRjX2RlYWxsb2M7CiAJaW50IHRjX2V4dF9hbGxvY19sb2NrZWQ7IC8qIGlzIGl0IGNsdXN0ZXIgbG9ja2VkPyAqLwogCS8qIHRoZXNlIGdldCBkZXN0cm95ZWQgb25jZSBpdCdzIHBhc3NlZCB0byBvY2ZzMl9jb21taXRfdHJ1bmNhdGUuICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0Y19sYXN0X2ViX2JoOwogfTsKIAotaW50IG9jZnMyX3plcm9fdGFpbF9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgdTY0IG5ld19pX3NpemUpOworaW50IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICB1NjQgcmFuZ2Vfc3RhcnQsIHU2NCByYW5nZV9lbmQpOwogaW50IG9jZnMyX3ByZXBhcmVfdHJ1bmNhdGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKQEAgLTg0LDYgKzExOCw3IEBACiAKIGludCBvY2ZzMl9maW5kX2xlYWYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyb290X2VsLAogCQkgICAgdTMyIGNwb3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmxlYWZfYmgpOworaW50IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCB1MzIgdl9jbHVzdGVyKTsKIAogLyoKICAqIEhlbHBlciBmdW5jdGlvbiB0byBsb29rIGF0IHRoZSAjIG9mIGNsdXN0ZXJzIGluIGFuIGV4dGVudCByZWNvcmQuCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmMgYi9mcy9vY2ZzMi9hb3BzLmMKaW5kZXggYTQ4MGIwOS4uODRiZjZlNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5jCisrKyBiL2ZzL29jZnMyL2FvcHMuYwpAQCAtNjg0LDYgKzY4NCw4IEBACiAJICAgICBiaCA9IGJoLT5iX3RoaXNfcGFnZSwgYmxvY2tfc3RhcnQgKz0gYnNpemUpIHsKIAkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBic2l6ZTsKIAorCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwogCQkvKgogCQkgKiBJZ25vcmUgYmxvY2tzIG91dHNpZGUgb2Ygb3VyIGkvbyByYW5nZSAtCiAJCSAqIHRoZXkgbWF5IGJlbG9uZyB0byB1bmFsbG9jYXRlZCBjbHVzdGVycy4KQEAgLTY5OCw5ICs3MDAsOCBAQAogCQkgKiBGb3IgYW4gYWxsb2NhdGluZyB3cml0ZSB3aXRoIGNsdXN0ZXIgc2l6ZSA+PSBwYWdlCiAJCSAqIHNpemUsIHdlIGFsd2F5cyB3cml0ZSB0aGUgZW50aXJlIHBhZ2UuCiAJCSAqLwotCi0JCWlmIChidWZmZXJfbmV3KGJoKSkKLQkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQlpZiAobmV3KQorCQkJc2V0X2J1ZmZlcl9uZXcoYmgpOwogCiAJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKIAkJCW1hcF9iaChiaCwgaW5vZGUtPmlfc2IsICpwX2Jsa25vKTsKQEAgLTcxMSw3ICs3MTIsOCBAQAogCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQogCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQl9IGVsc2UgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpICYmICFidWZmZXJfZGVsYXkoYmgpICYmCi0JCSAgICAgKGJsb2NrX3N0YXJ0IDwgZnJvbSB8fCBibG9ja19lbmQgPiB0bykpIHsKKwkJCSAgICFidWZmZXJfbmV3KGJoKSAmJgorCQkJICAgKGJsb2NrX3N0YXJ0IDwgZnJvbSB8fCBibG9ja19lbmQgPiB0bykpIHsKIAkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CiAJCQkqd2FpdF9iaCsrPWJoOwogCQl9CkBAIC03MzgsMTggKzc0MCwxMyBAQAogCWJoID0gaGVhZDsKIAlibG9ja19zdGFydCA9IDA7CiAJZG8gewotCQl2b2lkICprYWRkcjsKLQogCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJzaXplOwogCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20pCiAJCQlnb3RvIG5leHRfYmg7CiAJCWlmIChibG9ja19zdGFydCA+PSB0bykKIAkJCWJyZWFrOwogCi0JCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCQltZW1zZXQoa2FkZHIrYmxvY2tfc3RhcnQsIDAsIGJoLT5iX3NpemUpOwotCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl6ZXJvX3VzZXJfcGFnZShwYWdlLCBibG9ja19zdGFydCwgYmgtPmJfc2l6ZSwgS01fVVNFUjApOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJbWFya19idWZmZXJfZGlydHkoYmgpOwogCkBAIC03NjEsMjE3ICs3NTgsMjQwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmIChQQUdFX0NBQ0hFX1NJWkUgPj0gT0NGUzJfTUFYX0NMVVNURVJTSVpFKQorI2RlZmluZSBPQ0ZTMl9NQVhfQ1RYVF9QQUdFUwkxCisjZWxzZQorI2RlZmluZSBPQ0ZTMl9NQVhfQ1RYVF9QQUdFUwkoT0NGUzJfTUFYX0NMVVNURVJTSVpFIC8gUEFHRV9DQUNIRV9TSVpFKQorI2VuZGlmCisKKyNkZWZpbmUgT0NGUzJfTUFYX0NMVVNURVJTX1BFUl9QQUdFCShQQUdFX0NBQ0hFX1NJWkUgLyBPQ0ZTMl9NSU5fQ0xVU1RFUlNJWkUpCisKIC8qCi0gKiBUaGlzIHdpbGwgY29weSB1c2VyIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHBhZ2UgaW4gdGhlIHNwbGljZQotICogY29udGV4dC4KLSAqCi0gKiBGb3Igbm93LCB3ZSBpZ25vcmUgU1BMSUNFX0ZfTU9WRSBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgc29tZSBleHRyYQotICogY29tbXVuaWNhdGlvbiBvdXQgYWxsIHRoZSB3YXkgdG8gb2NmczJfd3JpdGUoKS4KKyAqIERlc2NyaWJlIHRoZSBzdGF0ZSBvZiBhIHNpbmdsZSBjbHVzdGVyIHRvIGJlIHdyaXR0ZW4gdG8uCiAgKi8KLWludCBvY2ZzMl9tYXBfYW5kX3dyaXRlX3NwbGljZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsIHU2NCAqcF9ibGtubywKLQkJCQkgIHVuc2lnbmVkIGludCAqcmV0X2Zyb20sIHVuc2lnbmVkIGludCAqcmV0X3RvKQorc3RydWN0IG9jZnMyX3dyaXRlX2NsdXN0ZXJfZGVzYyB7CisJdTMyCQljX2Nwb3M7CisJdTMyCQljX3BoeXM7CisJLyoKKwkgKiBHaXZlIHRoaXMgYSB1bmlxdWUgZmllbGQgYmVjYXVzZSBjX3BoeXMgZXZlbnR1YWxseSBnZXRzCisJICogZmlsbGVkLgorCSAqLworCXVuc2lnbmVkCWNfbmV3OworCXVuc2lnbmVkCWNfdW53cml0dGVuOworfTsKKworc3RhdGljIGlubGluZSBpbnQgb2NmczJfc2hvdWxkX3plcm9fY2x1c3RlcihzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjICpkKQogewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHRvLCBmcm9tLCBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZDsKLQljaGFyICpzcmMsICpkc3Q7Ci0Jc3RydWN0IG9jZnMyX3NwbGljZV93cml0ZV9wcml2ICpzcCA9IHdjLT53X3ByaXZhdGU7Ci0Jc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBzcC0+c19idWY7Ci0JdW5zaWduZWQgbG9uZyBieXRlcywgc3JjX2Zyb207Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0KLQlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKG9zYiwgd2MtPndfY3BvcywgJmNsdXN0ZXJfc3RhcnQsCi0JCQkJCSZjbHVzdGVyX2VuZCk7Ci0KLQlmcm9tID0gc3AtPnNfb2Zmc2V0OwotCXNyY19mcm9tID0gc3AtPnNfYnVmX29mZnNldDsKLQlieXRlcyA9IHdjLT53X2NvdW50OwotCi0JaWYgKHdjLT53X2xhcmdlX3BhZ2VzKSB7Ci0JCS8qCi0JCSAqIEZvciBjbHVzdGVyIHNpemUgPCBwYWdlIHNpemUsIHdlIGhhdmUgdG8KLQkJICogY2FsY3VsYXRlIHBvcyB3aXRoaW4gdGhlIGNsdXN0ZXIgYW5kIG9iZXkKLQkJICogdGhlIHJpZ2h0bW9zdCBib3VuZGFyeS4KLQkJICovCi0JCWJ5dGVzID0gbWluKGJ5dGVzLCAodW5zaWduZWQgbG9uZykob3NiLT5zX2NsdXN0ZXJzaXplCi0JCQkJICAgLSAod2MtPndfcG9zICYgKG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpKSkpOwotCX0KLQl0byA9IGZyb20gKyBieXRlczsKLQotCUJVR19PTihmcm9tID4gUEFHRV9DQUNIRV9TSVpFKTsKLQlCVUdfT04odG8gPiBQQUdFX0NBQ0hFX1NJWkUpOwotCUJVR19PTihmcm9tIDwgY2x1c3Rlcl9zdGFydCk7Ci0JQlVHX09OKHRvID4gY2x1c3Rlcl9lbmQpOwotCi0JaWYgKHdjLT53X3RoaXNfcGFnZV9uZXcpCi0JCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2Nrcyh3Yy0+d190aGlzX3BhZ2UsIHBfYmxrbm8sIGlub2RlLAotCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsIDEpOwotCWVsc2UKLQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHdjLT53X3RoaXNfcGFnZSwgcF9ibGtubywgaW5vZGUsCi0JCQkJCSAgICBmcm9tLCB0bywgMCk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXNyYyA9IGJ1Zi0+b3BzLT5tYXAoc3AtPnNfcGlwZSwgYnVmLCAxKTsKLQlkc3QgPSBrbWFwX2F0b21pYyh3Yy0+d190aGlzX3BhZ2UsIEtNX1VTRVIxKTsKLQltZW1jcHkoZHN0ICsgZnJvbSwgc3JjICsgc3JjX2Zyb20sIGJ5dGVzKTsKLQlrdW5tYXBfYXRvbWljKHdjLT53X3RoaXNfcGFnZSwgS01fVVNFUjEpOwotCWJ1Zi0+b3BzLT51bm1hcChzcC0+c19waXBlLCBidWYsIHNyYyk7Ci0KLQl3Yy0+d19maW5pc2hlZF9jb3B5ID0gMTsKLQotCSpyZXRfZnJvbSA9IGZyb207Ci0JKnJldF90byA9IHRvOwotb3V0OgotCi0JcmV0dXJuIGJ5dGVzID8gKHVuc2lnbmVkIGludClieXRlcyA6IHJldDsKKwlyZXR1cm4gZC0+Y19uZXcgfHwgZC0+Y191bndyaXR0ZW47CiB9CiAKLS8qCi0gKiBUaGlzIHdpbGwgY29weSB1c2VyIGRhdGEgZnJvbSB0aGUgaW92ZWMgaW4gdGhlIGJ1ZmZlcmVkIHdyaXRlCi0gKiBjb250ZXh0LgotICovCi1pbnQgb2NmczJfbWFwX2FuZF93cml0ZV91c2VyX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywgdTY0ICpwX2Jsa25vLAotCQkJCSAgdW5zaWduZWQgaW50ICpyZXRfZnJvbSwgdW5zaWduZWQgaW50ICpyZXRfdG8pCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgdG8sIGZyb20sIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kOwotCXVuc2lnbmVkIGxvbmcgYnl0ZXMsIHNyY19mcm9tOwotCWNoYXIgKmRzdDsKLQlzdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiAqYnAgPSB3Yy0+d19wcml2YXRlOwotCWNvbnN0IHN0cnVjdCBpb3ZlYyAqY3VyX2lvdiA9IGJwLT5iX2N1cl9pb3Y7Ci0JY2hhciBfX3VzZXIgKmJ1ZjsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKK3N0cnVjdCBvY2ZzMl93cml0ZV9jdHh0IHsKKwkvKiBMb2dpY2FsIGNsdXN0ZXIgcG9zaXRpb24gLyBsZW4gb2Ygd3JpdGUgKi8KKwl1MzIJCQkJd19jcG9zOworCXUzMgkJCQl3X2NsZW47CiAKLQlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKG9zYiwgd2MtPndfY3BvcywgJmNsdXN0ZXJfc3RhcnQsCi0JCQkJCSZjbHVzdGVyX2VuZCk7Ci0KLQlidWYgPSBjdXJfaW92LT5pb3ZfYmFzZSArIGJwLT5iX2N1cl9vZmY7Ci0Jc3JjX2Zyb20gPSAodW5zaWduZWQgbG9uZylidWYgJiB+UEFHRV9DQUNIRV9NQVNLOwotCi0JZnJvbSA9IHdjLT53X3BvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjCXdfZGVzY1tPQ0ZTMl9NQVhfQ0xVU1RFUlNfUEVSX1BBR0VdOwogCiAJLyoKLQkgKiBUaGlzIGlzIGEgbG90IG9mIGNvbXBhcmlzb25zLCBidXQgaXQgcmVhZHMgcXVpdGUKLQkgKiBlYXNpbHksIHdoaWNoIGlzIGltcG9ydGFudCBoZXJlLgotCSAqLwotCS8qIFN0YXkgd2l0aGluIHRoZSBzcmMgcGFnZSAqLwotCWJ5dGVzID0gUEFHRV9TSVpFIC0gc3JjX2Zyb207Ci0JLyogU3RheSB3aXRoaW4gdGhlIHZlY3RvciAqLwotCWJ5dGVzID0gbWluKGJ5dGVzLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpKGN1cl9pb3YtPmlvdl9sZW4gLSBicC0+Yl9jdXJfb2ZmKSk7Ci0JLyogU3RheSB3aXRoaW4gY291bnQgKi8KLQlieXRlcyA9IG1pbihieXRlcywgKHVuc2lnbmVkIGxvbmcpd2MtPndfY291bnQpOwotCS8qCi0JICogRm9yIGNsdXN0ZXJzaXplID4gcGFnZSBzaXplLCBqdXN0IHN0YXkgd2l0aGluCi0JICogdGFyZ2V0IHBhZ2UsIG90aGVyd2lzZSB3ZSBoYXZlIHRvIGNhbGN1bGF0ZSBwb3MKLQkgKiB3aXRoaW4gdGhlIGNsdXN0ZXIgYW5kIG9iZXkgdGhlIHJpZ2h0bW9zdAotCSAqIGJvdW5kYXJ5LgotCSAqLwotCWlmICh3Yy0+d19sYXJnZV9wYWdlcykgewotCQkvKgotCQkgKiBGb3IgY2x1c3RlciBzaXplIDwgcGFnZSBzaXplLCB3ZSBoYXZlIHRvCi0JCSAqIGNhbGN1bGF0ZSBwb3Mgd2l0aGluIHRoZSBjbHVzdGVyIGFuZCBvYmV5Ci0JCSAqIHRoZSByaWdodG1vc3QgYm91bmRhcnkuCi0JCSAqLwotCQlieXRlcyA9IG1pbihieXRlcywgKHVuc2lnbmVkIGxvbmcpKG9zYi0+c19jbHVzdGVyc2l6ZQotCQkJCSAgIC0gKHdjLT53X3BvcyAmIChvc2ItPnNfY2x1c3RlcnNpemUgLSAxKSkpKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBjbHVzdGVyIHNpemUgPiBwYWdlIHNpemUgaXMgdGhlIG1vc3QgY29tbW9uCi0JCSAqIGNhc2UgLSB3ZSBqdXN0IHN0YXkgd2l0aGluIHRoZSB0YXJnZXQgcGFnZQotCQkgKiBib3VuZGFyeS4KLQkJICovCi0JCWJ5dGVzID0gbWluKGJ5dGVzLCBQQUdFX0NBQ0hFX1NJWkUgLSBmcm9tKTsKLQl9Ci0KLQl0byA9IGZyb20gKyBieXRlczsKLQotCUJVR19PTihmcm9tID4gUEFHRV9DQUNIRV9TSVpFKTsKLQlCVUdfT04odG8gPiBQQUdFX0NBQ0hFX1NJWkUpOwotCUJVR19PTihmcm9tIDwgY2x1c3Rlcl9zdGFydCk7Ci0JQlVHX09OKHRvID4gY2x1c3Rlcl9lbmQpOwotCi0JaWYgKHdjLT53X3RoaXNfcGFnZV9uZXcpCi0JCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2Nrcyh3Yy0+d190aGlzX3BhZ2UsIHBfYmxrbm8sIGlub2RlLAotCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsIDEpOwotCWVsc2UKLQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHdjLT53X3RoaXNfcGFnZSwgcF9ibGtubywgaW5vZGUsCi0JCQkJCSAgICBmcm9tLCB0bywgMCk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWRzdCA9IGttYXAod2MtPndfdGhpc19wYWdlKTsKLQltZW1jcHkoZHN0ICsgZnJvbSwgYnAtPmJfc3JjX2J1ZiArIHNyY19mcm9tLCBieXRlcyk7Ci0Ja3VubWFwKHdjLT53X3RoaXNfcGFnZSk7Ci0KLQkvKgotCSAqIFhYWDogVGhpcyBpcyBzbG93LCBidXQgc2ltcGxlLiBUaGUgY2FsbGVyIG9mCi0JICogb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcigpIGlzIHJlc3BvbnNpYmxlIGZvcgotCSAqIHBhc3NpbmcgdGhyb3VnaCB0aGUgaW92ZWNzLCBzbyBpdCdzIGRpZmZpY3VsdCB0bwotCSAqIHByZWRpY3Qgd2hhdCBvdXIgbmV4dCBzdGVwIGlzIGluIGhlcmUgYWZ0ZXIgb3VyCi0JICogaW5pdGlhbCB3cml0ZS4gQSBmdXR1cmUgdmVyc2lvbiBzaG91bGQgYmUgcHVzaGluZwotCSAqIHRoYXQgaW92ZWMgbWFuaXB1bGF0aW9uIGZ1cnRoZXIgZG93bi4KKwkgKiBUaGlzIGlzIHRydWUgaWYgcGFnZV9zaXplID4gY2x1c3Rlcl9zaXplLgogCSAqCi0JICogQnkgc2V0dGluZyB0aGlzLCB3ZSBpbmRpY2F0ZSB0aGF0IGEgY29weSBmcm9tIHVzZXIKLQkgKiBkYXRhIHdhcyBkb25lLCBhbmQgc3Vic2VxdWVudCBjYWxscyBmb3IgdGhpcwotCSAqIGNsdXN0ZXIgd2lsbCBza2lwIGNvcHlpbmcgbW9yZSBkYXRhLgorCSAqIEl0IHRyaWdnZXJzIGEgc2V0IG9mIHNwZWNpYWwgY2FzZXMgZHVyaW5nIHdyaXRlIHdoaWNoIG1pZ2h0CisJICogaGF2ZSB0byBkZWFsIHdpdGggYWxsb2NhdGluZyB3cml0ZXMgdG8gcGFydGlhbCBwYWdlcy4KIAkgKi8KLQl3Yy0+d19maW5pc2hlZF9jb3B5ID0gMTsKKwl1bnNpZ25lZCBpbnQJCQl3X2xhcmdlX3BhZ2VzOwogCi0JKnJldF9mcm9tID0gZnJvbTsKLQkqcmV0X3RvID0gdG87Ci1vdXQ6CisJLyoKKwkgKiBQYWdlcyBpbnZvbHZlZCBpbiB0aGlzIHdyaXRlLgorCSAqCisJICogd190YXJnZXRfcGFnZSBpcyB0aGUgcGFnZSBiZWluZyB3cml0dGVuIHRvIGJ5IHRoZSB1c2VyLgorCSAqCisJICogd19wYWdlcyBpcyBhbiBhcnJheSBvZiBwYWdlcyB3aGljaCBhbHdheXMgY29udGFpbnMKKwkgKiB3X3RhcmdldF9wYWdlLCBhbmQgaW4gdGhlIGNhc2Ugb2YgYW4gYWxsb2NhdGluZyB3cml0ZSB3aXRoCisJICogcGFnZV9zaXplIDwgY2x1c3RlciBzaXplLCBpdCB3aWxsIGNvbnRhaW4gemVybydkIGFuZCBtYXBwZWQKKwkgKiBwYWdlcyBhZGphY2VudCB0byB3X3RhcmdldF9wYWdlIHdoaWNoIG5lZWQgdG8gYmUgd3JpdHRlbgorCSAqIG91dCBpbiBzbyB0aGF0IGZ1dHVyZSByZWFkcyBmcm9tIHRoYXQgcmVnaW9uIHdpbGwgZ2V0CisJICogemVybydzLgorCSAqLworCXN0cnVjdCBwYWdlCQkJKndfcGFnZXNbT0NGUzJfTUFYX0NUWFRfUEFHRVNdOworCXVuc2lnbmVkIGludAkJCXdfbnVtX3BhZ2VzOworCXN0cnVjdCBwYWdlCQkJKndfdGFyZ2V0X3BhZ2U7CiAKLQlyZXR1cm4gYnl0ZXMgPyAodW5zaWduZWQgaW50KWJ5dGVzIDogcmV0OworCS8qCisJICogb2NmczJfd3JpdGVfZW5kKCkgdXNlcyB0aGlzIHRvIGtub3cgd2hhdCB0aGUgcmVhbCByYW5nZSB0bworCSAqIHdyaXRlIGluIHRoZSB0YXJnZXQgc2hvdWxkIGJlLgorCSAqLworCXVuc2lnbmVkIGludAkJCXdfdGFyZ2V0X2Zyb207CisJdW5zaWduZWQgaW50CQkJd190YXJnZXRfdG87CisKKwkvKgorCSAqIFdlIGNvdWxkIHVzZSBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkgYnV0IHRoaXMgaXMgY2xlYW5lciwKKwkgKiBJTUhPIC1NYXJrCisJICovCisJaGFuZGxlX3QJCQkqd19oYW5kbGU7CisKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSp3X2RpX2JoOworCisJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgd19kZWFsbG9jOworfTsKKworc3RhdGljIHZvaWQgb2NmczJfZnJlZV93cml0ZV9jdHh0KHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YykKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IHdjLT53X251bV9wYWdlczsgaSsrKSB7CisJCWlmICh3Yy0+d19wYWdlc1tpXSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJdW5sb2NrX3BhZ2Uod2MtPndfcGFnZXNbaV0pOworCQltYXJrX3BhZ2VfYWNjZXNzZWQod2MtPndfcGFnZXNbaV0pOworCQlwYWdlX2NhY2hlX3JlbGVhc2Uod2MtPndfcGFnZXNbaV0pOworCX0KKworCWJyZWxzZSh3Yy0+d19kaV9iaCk7CisJa2ZyZWUod2MpOworfQorCitzdGF0aWMgaW50IG9jZnMyX2FsbG9jX3dyaXRlX2N0eHQoc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKip3Y3AsCisJCQkJICBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgbG9mZl90IHBvcywKKwkJCQkgIHVuc2lnbmVkIGxlbiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCkKK3sKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2M7CisKKwl3YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0KSwgR0ZQX05PRlMpOworCWlmICghd2MpCisJCXJldHVybiAtRU5PTUVNOworCisJd2MtPndfY3BvcyA9IHBvcyA+PiBvc2ItPnNfY2x1c3RlcnNpemVfYml0czsKKwl3Yy0+d19jbGVuID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKG9zYi0+c2IsIGxlbik7CisJZ2V0X2JoKGRpX2JoKTsKKwl3Yy0+d19kaV9iaCA9IGRpX2JoOworCisJaWYgKHVubGlrZWx5KFBBR0VfQ0FDSEVfU0hJRlQgPiBvc2ItPnNfY2x1c3RlcnNpemVfYml0cykpCisJCXdjLT53X2xhcmdlX3BhZ2VzID0gMTsKKwllbHNlCisJCXdjLT53X2xhcmdlX3BhZ2VzID0gMDsKKworCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCZ3Yy0+d19kZWFsbG9jKTsKKworCSp3Y3AgPSB3YzsKKworCXJldHVybiAwOwogfQogCiAvKgotICogTWFwLCBmaWxsIGFuZCB3cml0ZSBhIHBhZ2UgdG8gZGlzay4KLSAqCi0gKiBUaGUgd29yayBvZiBjb3B5aW5nIGRhdGEgaXMgZG9uZSB2aWEgY2FsbGJhY2suICBOZXdseSBhbGxvY2F0ZWQKLSAqIHBhZ2VzIHdoaWNoIGRvbid0IHRha2UgdXNlciBkYXRhIHdpbGwgYmUgemVybydkIChzZXQgJ25ldycgdG8KLSAqIGluZGljYXRlIGFuIGFsbG9jYXRpbmcgd3JpdGUpCi0gKgotICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50bwotICogdGhlIHBhZ2UuCisgKiBJZiBhIHBhZ2UgaGFzIGFueSBuZXcgYnVmZmVycywgemVybyB0aGVtIG91dCBoZXJlLCBhbmQgbWFyayB0aGVtIHVwdG9kYXRlCisgKiBhbmQgZGlydHkgc28gdGhleSdsbCBiZSB3cml0dGVuIG91dCAoaW4gb3JkZXIgdG8gcHJldmVudCB1bmluaXRpYWxpc2VkCisgKiBibG9jayBkYXRhIGZyb20gbGVha2luZykuIEFuZCBjbGVhciB0aGUgbmV3IGJpdC4KICAqLwotc3RhdGljIGludCBvY2ZzMl93cml0ZV9kYXRhX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgdTY0ICpwX2Jsa25vLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQkgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLCBpbnQgbmV3KQorc3RhdGljIHZvaWQgb2NmczJfemVyb19uZXdfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7Ci0JaW50IHJldCwgY29waWVkID0gMDsKLQl1bnNpZ25lZCBpbnQgZnJvbSA9IDAsIHRvID0gMDsKLQl1bnNpZ25lZCBpbnQgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQ7Ci0JdW5zaWduZWQgaW50IHplcm9fZnJvbSA9IDAsIHplcm9fdG8gPSAwOworCXVuc2lnbmVkIGludCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKmJoOwogCi0Jb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIHdjLT53X2Nwb3MsCisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXJldHVybjsKKworCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlibG9ja19zdGFydCA9IDA7CisJZG8geworCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJoLT5iX3NpemU7CisKKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKSB7CisJCQlpZiAoYmxvY2tfZW5kID4gZnJvbSAmJiBibG9ja19zdGFydCA8IHRvKSB7CisJCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkJdW5zaWduZWQgc3RhcnQsIGVuZDsKKworCQkJCQlzdGFydCA9IG1heChmcm9tLCBibG9ja19zdGFydCk7CisJCQkJCWVuZCA9IG1pbih0bywgYmxvY2tfZW5kKTsKKworCQkJCQl6ZXJvX3VzZXJfcGFnZShwYWdlLCBzdGFydCwgZW5kIC0gc3RhcnQsIEtNX1VTRVIwKTsKKwkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJfQorCisJCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJfQorCQl9CisKKwkJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQ7CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworfQorCisvKgorICogT25seSBjYWxsZWQgd2hlbiB3ZSBoYXZlIGEgZmFpbHVyZSBkdXJpbmcgYWxsb2NhdGluZyB3cml0ZSB0byB3cml0ZQorICogemVybydzIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmVnaW9uLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl93cml0ZV9mYWlsdXJlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCWxvZmZfdCB1c2VyX3BvcywgdW5zaWduZWQgdXNlcl9sZW4pCit7CisJaW50IGk7CisJdW5zaWduZWQgZnJvbSwgdG87CisJc3RydWN0IHBhZ2UgKnRtcHBhZ2U7CisKKwlvY2ZzMl96ZXJvX25ld19idWZmZXJzKHdjLT53X3RhcmdldF9wYWdlLCB1c2VyX3BvcywgdXNlcl9sZW4pOworCisJaWYgKHdjLT53X2xhcmdlX3BhZ2VzKSB7CisJCWZyb20gPSB3Yy0+d190YXJnZXRfZnJvbTsKKwkJdG8gPSB3Yy0+d190YXJnZXRfdG87CisJfSBlbHNlIHsKKwkJZnJvbSA9IDA7CisJCXRvID0gUEFHRV9DQUNIRV9TSVpFOworCX0KKworCWZvcihpID0gMDsgaSA8IHdjLT53X251bV9wYWdlczsgaSsrKSB7CisJCXRtcHBhZ2UgPSB3Yy0+d19wYWdlc1tpXTsKKworCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQkJd2Fsa19wYWdlX2J1ZmZlcnMod2MtPndfaGFuZGxlLCBwYWdlX2J1ZmZlcnModG1wcGFnZSksCisJCQkJCSAgZnJvbSwgdG8sIE5VTEwsCisJCQkJCSAgb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKKworCQlibG9ja19jb21taXRfd3JpdGUodG1wcGFnZSwgZnJvbSwgdG8pOworCX0KK30KKworc3RhdGljIGludCBvY2ZzMl9wcmVwYXJlX3BhZ2VfZm9yX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCAqcF9ibGtubywKKwkJCQkJc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdTMyIGNwb3MsCisJCQkJCWxvZmZfdCB1c2VyX3BvcywgdW5zaWduZWQgdXNlcl9sZW4sCisJCQkJCWludCBuZXcpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgbWFwX2Zyb20gPSAwLCBtYXBfdG8gPSAwOworCXVuc2lnbmVkIGludCBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZDsKKwl1bnNpZ25lZCBpbnQgdXNlcl9kYXRhX2Zyb20gPSAwLCB1c2VyX2RhdGFfdG8gPSAwOworCisJb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGNwb3MsCiAJCQkJCSZjbHVzdGVyX3N0YXJ0LCAmY2x1c3Rlcl9lbmQpOwogCi0JaWYgKCh3Yy0+d19wb3MgPj4gUEFHRV9DQUNIRV9TSElGVCkgPT0gcGFnZS0+aW5kZXgKLQkgICAgJiYgIXdjLT53X2ZpbmlzaGVkX2NvcHkpIHsKKwlpZiAocGFnZSA9PSB3Yy0+d190YXJnZXRfcGFnZSkgeworCQltYXBfZnJvbSA9IHVzZXJfcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQltYXBfdG8gPSBtYXBfZnJvbSArIHVzZXJfbGVuOwogCi0JCXdjLT53X3RoaXNfcGFnZSA9IHBhZ2U7Ci0JCXdjLT53X3RoaXNfcGFnZV9uZXcgPSBuZXc7Ci0JCXJldCA9IHdjLT53X3dyaXRlX2RhdGFfcGFnZShpbm9kZSwgd2MsIHBfYmxrbm8sICZmcm9tLCAmdG8pOwotCQlpZiAocmV0IDwgMCkgeworCQlpZiAobmV3KQorCQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHBhZ2UsIHBfYmxrbm8sIGlub2RlLAorCQkJCQkJICAgIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kLAorCQkJCQkJICAgIG5ldyk7CisJCWVsc2UKKwkJCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2NrcyhwYWdlLCBwX2Jsa25vLCBpbm9kZSwKKwkJCQkJCSAgICBtYXBfZnJvbSwgbWFwX3RvLCBuZXcpOworCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWNvcGllZCA9IHJldDsKLQotCQl6ZXJvX2Zyb20gPSBmcm9tOwotCQl6ZXJvX3RvID0gdG87CisJCXVzZXJfZGF0YV9mcm9tID0gbWFwX2Zyb207CisJCXVzZXJfZGF0YV90byA9IG1hcF90bzsKIAkJaWYgKG5ldykgewotCQkJZnJvbSA9IGNsdXN0ZXJfc3RhcnQ7Ci0JCQl0byA9IGNsdXN0ZXJfZW5kOworCQkJbWFwX2Zyb20gPSBjbHVzdGVyX3N0YXJ0OworCQkJbWFwX3RvID0gY2x1c3Rlcl9lbmQ7CiAJCX0KKworCQl3Yy0+d190YXJnZXRfZnJvbSA9IG1hcF9mcm9tOworCQl3Yy0+d190YXJnZXRfdG8gPSBtYXBfdG87CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogSWYgd2UgaGF2ZW4ndCBhbGxvY2F0ZWQgdGhlIG5ldyBwYWdlIHlldCwgd2UKQEAgLTk4MCwxMSArMTAwMCwxMSBAQAogCQkgKi8KIAkJQlVHX09OKCFuZXcpOwogCi0JCWZyb20gPSBjbHVzdGVyX3N0YXJ0OwotCQl0byA9IGNsdXN0ZXJfZW5kOworCQltYXBfZnJvbSA9IGNsdXN0ZXJfc3RhcnQ7CisJCW1hcF90byA9IGNsdXN0ZXJfZW5kOwogCiAJCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2NrcyhwYWdlLCBwX2Jsa25vLCBpbm9kZSwKLQkJCQkJICAgIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kLCAxKTsKKwkJCQkJICAgIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kLCBuZXcpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTEwMDMsMTA4ICsxMDIzLDExMyBAQAogCSAqLwogCWlmIChuZXcgJiYgIVBhZ2VVcHRvZGF0ZShwYWdlKSkKIAkJb2NmczJfY2xlYXJfcGFnZV9yZWdpb25zKHBhZ2UsIE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKLQkJCQkJIHdjLT53X2Nwb3MsIHplcm9fZnJvbSwgemVyb190byk7CisJCQkJCSBjcG9zLCB1c2VyX2RhdGFfZnJvbSwgdXNlcl9kYXRhX3RvKTsKIAogCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCi0JaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgewotCQlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsCi0JCQkJCXBhZ2VfYnVmZmVycyhwYWdlKSwKLQkJCQkJZnJvbSwgdG8sIE5VTEwsCi0JCQkJCW9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJbWxvZ19lcnJubyhyZXQpOwotCX0KLQotCS8qCi0JICogV2UgZG9uJ3QgdXNlIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkgYmVjYXVzZSB3ZSBuZWVkIHRvCi0JICogaGFuZGxlIG91ciBvd24gaV9zaXplIHVwZGF0ZS4KLQkgKi8KLQlyZXQgPSBibG9ja19jb21taXRfd3JpdGUocGFnZSwgZnJvbSwgdG8pOwotCWlmIChyZXQpCi0JCW1sb2dfZXJybm8ocmV0KTsKIG91dDoKLQotCXJldHVybiBjb3BpZWQgPyBjb3BpZWQgOiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKLSAqIERvIHRoZSBhY3R1YWwgd3JpdGUgb2Ygc29tZSBkYXRhIGludG8gYW4gaW5vZGUuIE9wdGlvbmFsbHkgYWxsb2NhdGUKLSAqIGluIG9yZGVyIHRvIGZ1bGZpbGwgdGhlIHdyaXRlLgotICoKLSAqIGNwb3MgaXMgdGhlIGxvZ2ljYWwgY2x1c3RlciBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIHRvIHdyaXRlIGF0Ci0gKgotICogJ3BoeXMnIGlzIHRoZSBwaHlzaWNhbCBtYXBwaW5nIG9mIHRoYXQgb2Zmc2V0LiBhICdwaHlzJyB2YWx1ZSBvZgotICogemVybyBpbmRpY2F0ZXMgdGhhdCBhbGxvY2F0aW9uIGlzIHJlcXVpcmVkLiBJbiB0aGlzIGNhc2UsIGRhdGFfYWMKLSAqIGFuZCBtZXRhX2FjIHNob3VsZCBiZSB2YWxpZCAobWV0YV9hYyBjYW4gYmUgbnVsbCBpZiBtZXRhZGF0YQotICogYWxsb2NhdGlvbiBpc24ndCByZXF1aXJlZCkuCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBncmFiIG9uZSBjbHVzdGVycyB3b3J0aCBvZiBwYWdlcy4KICAqLwotc3RhdGljIHNzaXplX3Qgb2NmczJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHUzMiBwaHlzLCBoYW5kbGVfdCAqaGFuZGxlLAotCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKLQkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAotCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCi0JCQkgICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MpCitzdGF0aWMgaW50IG9jZnMyX2dyYWJfcGFnZXNfZm9yX3dyaXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQkgICAgICB1MzIgY3BvcywgbG9mZl90IHVzZXJfcG9zLCBpbnQgbmV3LAorCQkJCSAgICAgIHN0cnVjdCBwYWdlICptbWFwX3BhZ2UpCiB7Ci0JaW50IHJldCwgaSwgbnVtcGFnZXMgPSAxLCBuZXc7Ci0JdW5zaWduZWQgaW50IGNvcGllZCA9IDA7Ci0JdTMyIHRtcF9wb3M7Ci0JdTY0IHZfYmxrbm8sIHBfYmxrbm87Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisJaW50IHJldCA9IDAsIGk7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgdGFyZ2V0X2luZGV4LCBpbmRleDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKLQl1bnNpZ25lZCBsb25nIGluZGV4LCBzdGFydDsKLQlzdHJ1Y3QgcGFnZSAqKmNwYWdlczsKIAotCW5ldyA9IHBoeXMgPT0gMCA/IDEgOiAwOworCXRhcmdldF9pbmRleCA9IHVzZXJfcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKIAkvKgogCSAqIEZpZ3VyZSBvdXQgaG93IG1hbnkgcGFnZXMgd2UnbGwgYmUgbWFuaXB1bGF0aW5nIGhlcmUuIEZvcgogCSAqIG5vbiBhbGxvY2F0aW5nIHdyaXRlLCB3ZSBqdXN0IGNoYW5nZSB0aGUgb25lCiAJICogcGFnZS4gT3RoZXJ3aXNlLCB3ZSdsbCBuZWVkIGEgd2hvbGUgY2x1c3RlcnMgd29ydGguCiAJICovCi0JaWYgKG5ldykKLQkJbnVtcGFnZXMgPSBvY2ZzMl9wYWdlc19wZXJfY2x1c3Rlcihpbm9kZS0+aV9zYik7Ci0KLQljcGFnZXMgPSBremFsbG9jKHNpemVvZigqY3BhZ2VzKSAqIG51bXBhZ2VzLCBHRlBfTk9GUyk7Ci0JaWYgKCFjcGFnZXMpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qCi0JICogRmlsbCBvdXIgcGFnZSBhcnJheSBmaXJzdC4gVGhhdCB3YXkgd2UndmUgZ3JhYmJlZCBlbm91Z2ggc28KLQkgKiB0aGF0IHdlIGNhbiB6ZXJvIGFuZCBmbHVzaCBpZiB3ZSBlcnJvciBhZnRlciBhZGRpbmcgdGhlCi0JICogZXh0ZW50LgotCSAqLwogCWlmIChuZXcpIHsKLQkJc3RhcnQgPSBvY2ZzMl9hbGlnbl9jbHVzdGVyc190b19wYWdlX2luZGV4KGlub2RlLT5pX3NiLAotCQkJCQkJCSAgIHdjLT53X2Nwb3MpOwotCQl2X2Jsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCB3Yy0+d19jcG9zKTsKKwkJd2MtPndfbnVtX3BhZ2VzID0gb2NmczJfcGFnZXNfcGVyX2NsdXN0ZXIoaW5vZGUtPmlfc2IpOworCQlzdGFydCA9IG9jZnMyX2FsaWduX2NsdXN0ZXJzX3RvX3BhZ2VfaW5kZXgoaW5vZGUtPmlfc2IsIGNwb3MpOwogCX0gZWxzZSB7Ci0JCXN0YXJ0ID0gd2MtPndfcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCXZfYmxrbm8gPSB3Yy0+d19wb3MgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCXdjLT53X251bV9wYWdlcyA9IDE7CisJCXN0YXJ0ID0gdGFyZ2V0X2luZGV4OwogCX0KIAotCWZvcihpID0gMDsgaSA8IG51bXBhZ2VzOyBpKyspIHsKKwlmb3IoaSA9IDA7IGkgPCB3Yy0+d19udW1fcGFnZXM7IGkrKykgewogCQlpbmRleCA9IHN0YXJ0ICsgaTsKIAotCQljcGFnZXNbaV0gPSBmaW5kX29yX2NyZWF0ZV9wYWdlKG1hcHBpbmcsIGluZGV4LCBHRlBfTk9GUyk7Ci0JCWlmICghY3BhZ2VzW2ldKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7CisJCWlmIChpbmRleCA9PSB0YXJnZXRfaW5kZXggJiYgbW1hcF9wYWdlKSB7CisJCQkvKgorCQkJICogb2NmczJfcGFnZW1rd3JpdGUoKSBpcyBhIGxpdHRsZSBkaWZmZXJlbnQKKwkJCSAqIGFuZCB3YW50cyB1cyB0byBkaXJlY3RseSB1c2UgdGhlIHBhZ2UKKwkJCSAqIHBhc3NlZCBpbi4KKwkJCSAqLworCQkJbG9ja19wYWdlKG1tYXBfcGFnZSk7CisKKwkJCWlmIChtbWFwX3BhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykgeworCQkJCXVubG9ja19wYWdlKG1tYXBfcGFnZSk7CisJCQkJLyoKKwkJCQkgKiBTYW5pdHkgY2hlY2sgLSB0aGUgbG9ja2luZyBpbgorCQkJCSAqIG9jZnMyX3BhZ2Vta3dyaXRlKCkgc2hvdWxkIGVuc3VyZQorCQkJCSAqIHRoYXQgdGhpcyBjb2RlIGRvZXNuJ3QgdHJpZ2dlci4KKwkJCQkgKi8KKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcGFnZV9jYWNoZV9nZXQobW1hcF9wYWdlKTsKKwkJCXdjLT53X3BhZ2VzW2ldID0gbW1hcF9wYWdlOworCQl9IGVsc2UgeworCQkJd2MtPndfcGFnZXNbaV0gPSBmaW5kX29yX2NyZWF0ZV9wYWdlKG1hcHBpbmcsIGluZGV4LAorCQkJCQkJCSAgICAgR0ZQX05PRlMpOworCQkJaWYgKCF3Yy0+d19wYWdlc1tpXSkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQogCQl9CisKKwkJaWYgKGluZGV4ID09IHRhcmdldF9pbmRleCkKKwkJCXdjLT53X3RhcmdldF9wYWdlID0gd2MtPndfcGFnZXNbaV07CiAJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQcmVwYXJlIGEgc2luZ2xlIGNsdXN0ZXIgZm9yIHdyaXRlIG9uZSBjbHVzdGVyIGludG8gdGhlIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfd3JpdGVfY2x1c3RlcihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgICB1MzIgcGh5cywgdW5zaWduZWQgaW50IHVud3JpdHRlbiwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsIHUzMiBjcG9zLAorCQkJICAgICAgIGxvZmZfdCB1c2VyX3BvcywgdW5zaWduZWQgdXNlcl9sZW4pCit7CisJaW50IHJldCwgaSwgbmV3LCBzaG91bGRfemVybyA9IDA7CisJdTY0IHZfYmxrbm8sIHBfYmxrbm87CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisKKwluZXcgPSBwaHlzID09IDAgPyAxIDogMDsKKwlpZiAobmV3IHx8IHVud3JpdHRlbikKKwkJc2hvdWxkX3plcm8gPSAxOwogCiAJaWYgKG5ldykgeworCQl1MzIgdG1wX3BvczsKKwogCQkvKgogCQkgKiBUaGlzIGlzIHNhZmUgdG8gY2FsbCB3aXRoIHRoZSBwYWdlIGxvY2tzIC0gaXQgd29uJ3QgdGFrZQogCQkgKiBhbnkgYWRkaXRpb25hbCBzZW1hcGhvcmVzIG9yIGNsdXN0ZXIgbG9ja3MuCiAJCSAqLwotCQl0bXBfcG9zID0gd2MtPndfY3BvczsKKwkJdG1wX3BvcyA9IGNwb3M7CiAJCXJldCA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaW5vZGUsCi0JCQkJCQkgJnRtcF9wb3MsIDEsIGRpX2JoLCBoYW5kbGUsCi0JCQkJCQkgZGF0YV9hYywgbWV0YV9hYywgTlVMTCk7CisJCQkJCQkgJnRtcF9wb3MsIDEsIDAsIHdjLT53X2RpX2JoLAorCQkJCQkJIHdjLT53X2hhbmRsZSwgZGF0YV9hYywKKwkJCQkJCSBtZXRhX2FjLCBOVUxMKTsKIAkJLyoKIAkJICogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGJlY2F1c2Ugd2UgbXVzdCBoYXZlIGFscmVhZHkKIAkJICogY2FsY3VsYXRlZCB0aGUgY29ycmVjdCBtZXRhIGRhdGEgYWxsb2NhdGlvbiByZXF1aXJlZC4gVGhlCkBAIC0xMTIxLDEwMyArMTE0NiwzNDQgQEAKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CisJfSBlbHNlIGlmICh1bndyaXR0ZW4pIHsKKwkJcmV0ID0gb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihpbm9kZSwgd2MtPndfZGlfYmgsCisJCQkJCQl3Yy0+d19oYW5kbGUsIGNwb3MsIDEsIHBoeXMsCisJCQkJCQltZXRhX2FjLCAmd2MtPndfZGVhbGxvYyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAorCWlmIChzaG91bGRfemVybykKKwkJdl9ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgY3Bvcyk7CisJZWxzZQorCQl2X2Jsa25vID0gdXNlcl9wb3MgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwkvKgorCSAqIFRoZSBvbmx5IHJlYXNvbiB0aGlzIHNob3VsZCBmYWlsIGlzIGR1ZSB0byBhbiBpbmFiaWxpdHkgdG8KKwkgKiBmaW5kIHRoZSBleHRlbnQgYWRkZWQuCisJICovCiAJcmV0ID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCB2X2Jsa25vLCAmcF9ibGtubywgTlVMTCwKIAkJCQkJICBOVUxMKTsKIAlpZiAocmV0IDwgMCkgewotCi0JCS8qCi0JCSAqIFhYWDogU2hvdWxkIHdlIGdvIHJlYWRvbmx5IGhlcmU/Ci0JCSAqLwotCi0JCW1sb2dfZXJybm8ocmV0KTsKKwkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsICJDb3JydXB0aW5nIGV4dGVuZCBmb3IgaW5vZGUgJWxsdSwgIgorCQkJICAgICJhdCBsb2dpY2FsIGJsb2NrICVsbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdl9ibGtubyk7CiAJCWdvdG8gb3V0OwogCX0KIAogCUJVR19PTihwX2Jsa25vID09IDApOwogCi0JZm9yKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgewotCQlyZXQgPSBvY2ZzMl93cml0ZV9kYXRhX3BhZ2UoaW5vZGUsIGhhbmRsZSwgJnBfYmxrbm8sIGNwYWdlc1tpXSwKLQkJCQkJICAgIHdjLCBuZXcpOwotCQlpZiAocmV0IDwgMCkgeworCWZvcihpID0gMDsgaSA8IHdjLT53X251bV9wYWdlczsgaSsrKSB7CisJCWludCB0bXByZXQ7CisKKwkJdG1wcmV0ID0gb2NmczJfcHJlcGFyZV9wYWdlX2Zvcl93cml0ZShpbm9kZSwgJnBfYmxrbm8sIHdjLAorCQkJCQkJICAgICAgd2MtPndfcGFnZXNbaV0sIGNwb3MsCisJCQkJCQkgICAgICB1c2VyX3BvcywgdXNlcl9sZW4sCisJCQkJCQkgICAgICBzaG91bGRfemVybyk7CisJCWlmICh0bXByZXQpIHsKKwkJCW1sb2dfZXJybm8odG1wcmV0KTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQl0bXByZXQgPSByZXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIG9ubHkgaGF2ZSBjbGVhbnVwIHRvIGRvIGluIGNhc2Ugb2YgYWxsb2NhdGluZyB3cml0ZS4KKwkgKi8KKwlpZiAocmV0ICYmIG5ldykKKwkJb2NmczJfd3JpdGVfZmFpbHVyZShpbm9kZSwgd2MsIHVzZXJfcG9zLCB1c2VyX2xlbik7CisKK291dDoKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfd3JpdGVfY2x1c3Rlcl9ieV9kZXNjKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQkgICAgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuKQoreworCWludCByZXQsIGk7CisJc3RydWN0IG9jZnMyX3dyaXRlX2NsdXN0ZXJfZGVzYyAqZGVzYzsKKworCWZvciAoaSA9IDA7IGkgPCB3Yy0+d19jbGVuOyBpKyspIHsKKwkJZGVzYyA9ICZ3Yy0+d19kZXNjW2ldOworCisJCXJldCA9IG9jZnMyX3dyaXRlX2NsdXN0ZXIobWFwcGluZywgZGVzYy0+Y19waHlzLAorCQkJCQkgIGRlc2MtPmNfdW53cml0dGVuLCBkYXRhX2FjLCBtZXRhX2FjLAorCQkJCQkgIHdjLCBkZXNjLT5jX2Nwb3MsIHBvcywgbGVuKTsKKwkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KLQotCQljb3BpZWQgKz0gcmV0OwogCX0KIAorCXJldCA9IDA7CiBvdXQ6Ci0JZm9yKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgewotCQl1bmxvY2tfcGFnZShjcGFnZXNbaV0pOwotCQltYXJrX3BhZ2VfYWNjZXNzZWQoY3BhZ2VzW2ldKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKGNwYWdlc1tpXSk7Ci0JfQotCWtmcmVlKGNwYWdlcyk7Ci0KLQlyZXR1cm4gY29waWVkID8gY29waWVkIDogcmV0OwotfQotCi1zdGF0aWMgdm9pZCBvY2ZzMl93cml0ZV9jdHh0X2luaXQoc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAotCQkJCSAgc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIGxvZmZfdCBwb3MsCi0JCQkJICBzaXplX3QgY291bnQsIG9jZnMyX3BhZ2Vfd3JpdGVyICpjYiwKLQkJCQkgIHZvaWQgKmNiX3ByaXYpCi17Ci0Jd2MtPndfY291bnQgPSBjb3VudDsKLQl3Yy0+d19wb3MgPSBwb3M7Ci0Jd2MtPndfY3BvcyA9IHdjLT53X3BvcyA+PiBvc2ItPnNfY2x1c3RlcnNpemVfYml0czsKLQl3Yy0+d19maW5pc2hlZF9jb3B5ID0gMDsKLQotCWlmICh1bmxpa2VseShQQUdFX0NBQ0hFX1NISUZUID4gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHMpKQotCQl3Yy0+d19sYXJnZV9wYWdlcyA9IDE7Ci0JZWxzZQotCQl3Yy0+d19sYXJnZV9wYWdlcyA9IDA7Ci0KLQl3Yy0+d193cml0ZV9kYXRhX3BhZ2UgPSBjYjsKLQl3Yy0+d19wcml2YXRlID0gY2JfcHJpdjsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgotICogV3JpdGUgYSBjbHVzdGVyIHRvIGFuIGlub2RlLiBUaGUgY2x1c3RlciBtYXkgbm90IGJlIGFsbG9jYXRlZCB5ZXQsCi0gKiBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUuIFRoaXMgb25seSBleGlzdHMgZm9yIGJ1ZmZlcmVkIHdyaXRlcyAtCi0gKiBPX0RJUkVDVCB0YWtlcyBhIG1vcmUgInRyYWRpdGlvbmFsIiBwYXRoIHRocm91Z2ggdGhlIGtlcm5lbC4KLSAqCi0gKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBpbmNyZW1lbnRpbmcgcG9zLCB3cml0dGVuIGNvdW50cywgZXRjCi0gKgotICogRm9yIGZpbGUgc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc3BhcnNlIGZpbGVzLCBwcmUtYWxsb2NhdGlvbgotICogYW5kIHBhZ2UgemVyb2luZyB1cCB1bnRpbCBjcG9zIHNob3VsZCBiZSBkb25lIHByaW9yIHRvIHRoaXMKLSAqIGZ1bmN0aW9uIGNhbGwuCi0gKgotICogQ2FsbGVycyBzaG91bGQgYmUgaG9sZGluZyBpX3NlbSwgYW5kIHRoZSBydyBjbHVzdGVyIGxvY2suCi0gKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHVzZXIgYnl0ZXMgd3JpdHRlbiwgb3IgbGVzcyB0aGFuIHplcm8gZm9yCi0gKiBlcnJvci4KKyAqIG9jZnMyX3dyaXRlX2VuZCgpIHdhbnRzIHRvIGtub3cgd2hpY2ggcGFydHMgb2YgdGhlIHRhcmdldCBwYWdlIGl0CisgKiBzaG91bGQgY29tcGxldGUgdGhlIHdyaXRlIG9uLiBJdCdzIGVhc2llc3QgdG8gY29tcHV0ZSB0aGVtIGFoZWFkIG9mCisgKiB0aW1lIHdoZW4gYSBtb3JlIGNvbXBsZXRlIHZpZXcgb2YgdGhlIHdyaXRlIGlzIGF2YWlsYWJsZS4KICAqLwotc3NpemVfdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zLAotCQkJCSAgICAgc2l6ZV90IGNvdW50LCBvY2ZzMl9wYWdlX3dyaXRlciAqYWN0b3IsCi0JCQkJICAgICB2b2lkICpwcml2KQorc3RhdGljIHZvaWQgb2NmczJfc2V0X3RhcmdldF9ib3VuZGFyaWVzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCQlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJCWxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgaW50IGFsbG9jKQoreworCXN0cnVjdCBvY2ZzMl93cml0ZV9jbHVzdGVyX2Rlc2MgKmRlc2M7CisKKwl3Yy0+d190YXJnZXRfZnJvbSA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl3Yy0+d190YXJnZXRfdG8gPSB3Yy0+d190YXJnZXRfZnJvbSArIGxlbjsKKworCWlmIChhbGxvYyA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEFsbG9jYXRpbmcgd3JpdGUgLSB3ZSBtYXkgaGF2ZSBkaWZmZXJlbnQgYm91bmRhcmllcyBiYXNlZAorCSAqIG9uIHBhZ2Ugc2l6ZSBhbmQgY2x1c3RlciBzaXplLgorCSAqCisJICogTk9URTogV2UgY2FuIG5vIGxvbmdlciBjb21wdXRlIG9uZSB2YWx1ZSBmcm9tIHRoZSBvdGhlciBhcworCSAqIHRoZSBhY3R1YWwgd3JpdGUgbGVuZ3RoIGFuZCB1c2VyIHByb3ZpZGVkIGxlbmd0aCBtYXkgYmUKKwkgKiBkaWZmZXJlbnQuCisJICovCisKKwlpZiAod2MtPndfbGFyZ2VfcGFnZXMpIHsKKwkJLyoKKwkJICogV2Ugb25seSBjYXJlIGFib3V0IHRoZSAxc3QgYW5kIGxhc3QgY2x1c3RlciB3aXRoaW4KKwkJICogb3VyIHJhbmdlIGFuZCB3aGV0aGVyIHRoZXkgc2hvdWxkIGJlIHplcm8nZCBvciBub3QuIEVpdGhlcgorCQkgKiB2YWx1ZSBtYXkgYmUgZXh0ZW5kZWQgb3V0IHRvIHRoZSBzdGFydC9lbmQgb2YgYQorCQkgKiBuZXdseSBhbGxvY2F0ZWQgY2x1c3Rlci4KKwkJICovCisJCWRlc2MgPSAmd2MtPndfZGVzY1swXTsKKwkJaWYgKG9jZnMyX3Nob3VsZF96ZXJvX2NsdXN0ZXIoZGVzYykpCisJCQlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKG9zYiwKKwkJCQkJCQlkZXNjLT5jX2Nwb3MsCisJCQkJCQkJJndjLT53X3RhcmdldF9mcm9tLAorCQkJCQkJCU5VTEwpOworCisJCWRlc2MgPSAmd2MtPndfZGVzY1t3Yy0+d19jbGVuIC0gMV07CisJCWlmIChvY2ZzMl9zaG91bGRfemVyb19jbHVzdGVyKGRlc2MpKQorCQkJb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhvc2IsCisJCQkJCQkJZGVzYy0+Y19jcG9zLAorCQkJCQkJCU5VTEwsCisJCQkJCQkJJndjLT53X3RhcmdldF90byk7CisJfSBlbHNlIHsKKwkJd2MtPndfdGFyZ2V0X2Zyb20gPSAwOworCQl3Yy0+d190YXJnZXRfdG8gPSBQQUdFX0NBQ0hFX1NJWkU7CisJfQorfQorCisvKgorICogUG9wdWxhdGUgZWFjaCBzaW5nbGUtY2x1c3RlciB3cml0ZSBkZXNjcmlwdG9yIGluIHRoZSB3cml0ZSBjb250ZXh0CisgKiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpL28gdG8gYmUgZG9uZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgdGhhdCB3aWxsIGhhdmUgdG8gYmUgYWxsb2NhdGVkLCBhcworICogd2VsbCBhcyBhIHdvcnN0IGNhc2UgZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBleHRlbnQgcmVjb3JkcyB0aGF0CisgKiB3b3VsZCBoYXZlIHRvIGJlIGNyZWF0ZWQgZHVyaW5nIGEgd3JpdGUgdG8gYW4gdW53cml0dGVuIHJlZ2lvbi4KKyAqLworc3RhdGljIGludCBvY2ZzMl9wb3B1bGF0ZV93cml0ZV9kZXNjKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNsdXN0ZXJzX3RvX2FsbG9jLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpleHRlbnRzX3RvX3NwbGl0KQoreworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX3dyaXRlX2NsdXN0ZXJfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzID0gMDsKKwl1bnNpZ25lZCBpbnQgZXh0X2ZsYWdzID0gMDsKKwl1MzIgcGh5cyA9IDA7CisJaW50IGk7CisKKwkqY2x1c3RlcnNfdG9fYWxsb2MgPSAwOworCSpleHRlbnRzX3RvX3NwbGl0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB3Yy0+d19jbGVuOyBpKyspIHsKKwkJZGVzYyA9ICZ3Yy0+d19kZXNjW2ldOworCQlkZXNjLT5jX2Nwb3MgPSB3Yy0+d19jcG9zICsgaTsKKworCQlpZiAobnVtX2NsdXN0ZXJzID09IDApIHsKKwkJCS8qCisJCQkgKiBOZWVkIHRvIGxvb2sgdXAgdGhlIG5leHQgZXh0ZW50IHJlY29yZC4KKwkJCSAqLworCQkJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBkZXNjLT5jX2Nwb3MsICZwaHlzLAorCQkJCQkJICZudW1fY2x1c3RlcnMsICZleHRfZmxhZ3MpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEFzc3VtZSB3b3JzdCBjYXNlIC0gdGhhdCB3ZSdyZSB3cml0aW5nIGluCisJCQkgKiB0aGUgbWlkZGxlIG9mIHRoZSBleHRlbnQuCisJCQkgKgorCQkJICogV2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB3cml0ZSBwcm9jZWVkcyBmcm9tCisJCQkgKiBsZWZ0IHRvIHJpZ2h0LCBpbiB3aGljaCBjYXNlIHRoZSBleHRlbnQKKwkJCSAqIGluc2VydCBjb2RlIGlzIHNtYXJ0IGVub3VnaCB0byBjb2FsZXNjZSB0aGUKKwkJCSAqIG5leHQgc3BsaXRzIGludG8gdGhlIHByZXZpb3VzIHJlY29yZHMgY3JlYXRlZC4KKwkJCSAqLworCQkJaWYgKGV4dF9mbGFncyAmIE9DRlMyX0VYVF9VTldSSVRURU4pCisJCQkJKmV4dGVudHNfdG9fc3BsaXQgPSAqZXh0ZW50c190b19zcGxpdCArIDI7CisJCX0gZWxzZSBpZiAocGh5cykgeworCQkJLyoKKwkJCSAqIE9ubHkgaW5jcmVtZW50IHBoeXMgaWYgaXQgZG9lc24ndCBkZXNjcmliZQorCQkJICogYSBob2xlLgorCQkJICovCisJCQlwaHlzKys7CisJCX0KKworCQlkZXNjLT5jX3BoeXMgPSBwaHlzOworCQlpZiAocGh5cyA9PSAwKSB7CisJCQlkZXNjLT5jX25ldyA9IDE7CisJCQkqY2x1c3RlcnNfdG9fYWxsb2MgPSAqY2x1c3RlcnNfdG9fYWxsb2MgKyAxOworCQl9CisJCWlmIChleHRfZmxhZ3MgJiBPQ0ZTMl9FWFRfVU5XUklUVEVOKQorCQkJZGVzYy0+Y191bndyaXR0ZW4gPSAxOworCisJCW51bV9jbHVzdGVycy0tOworCX0KKworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IG9jZnMyX3dyaXRlX2JlZ2luX25vbG9jayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKKwkJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcCwgdm9pZCAqKmZzZGF0YSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwgc3RydWN0IHBhZ2UgKm1tYXBfcGFnZSkKIHsKIAlpbnQgcmV0LCBjcmVkaXRzID0gT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFM7Ci0Jc3NpemVfdCB3cml0dGVuID0gMDsKLQl1MzIgcGh5czsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXVuc2lnbmVkIGludCBjbHVzdGVyc190b19hbGxvYywgZXh0ZW50c190b19zcGxpdDsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKIAloYW5kbGVfdCAqaGFuZGxlOwotCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0IHdjOwogCi0Jb2NmczJfd3JpdGVfY3R4dF9pbml0KCZ3Yywgb3NiLCBwb3MsIGNvdW50LCBhY3RvciwgcHJpdik7CisJcmV0ID0gb2NmczJfYWxsb2Nfd3JpdGVfY3R4dCgmd2MsIG9zYiwgcG9zLCBsZW4sIGRpX2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKLQlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsICZkaV9iaCwgMSk7CisJcmV0ID0gb2NmczJfcG9wdWxhdGVfd3JpdGVfZGVzYyhpbm9kZSwgd2MsICZjbHVzdGVyc190b19hbGxvYywKKwkJCQkJJmV4dGVudHNfdG9fc3BsaXQpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9Ci0JZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopd2MtPndfZGlfYmgtPmJfZGF0YTsKKworCS8qCisJICogV2Ugc2V0IHdfdGFyZ2V0X2Zyb20sIHdfdGFyZ2V0X3RvIGhlcmUgc28gdGhhdAorCSAqIG9jZnMyX3dyaXRlX2VuZCgpIGtub3dzIHdoaWNoIHJhbmdlIGluIHRoZSB0YXJnZXQgcGFnZSB0bworCSAqIHdyaXRlIG91dC4gQW4gYWxsb2NhdGlvbiByZXF1aXJlcyB0aGF0IHdlIHdyaXRlIHRoZSBlbnRpcmUKKwkgKiBjbHVzdGVyIHJhbmdlLgorCSAqLworCWlmIChjbHVzdGVyc190b19hbGxvYyB8fCBleHRlbnRzX3RvX3NwbGl0KSB7CisJCS8qCisJCSAqIFhYWDogV2UgYXJlIHN0cmV0Y2hpbmcgdGhlIGxpbWl0cyBvZgorCQkgKiBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoKS4gSXQgZ3JlYXRseSBvdmVyLWVzdGltYXRlcworCQkgKiB0aGUgd29yayB0byBiZSBkb25lLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBkaSwgY2x1c3RlcnNfdG9fYWxsb2MsCisJCQkJCSAgICBleHRlbnRzX3RvX3NwbGl0LCAmZGF0YV9hYywgJm1ldGFfYWMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKGlub2RlLT5pX3NiLCBkaSwKKwkJCQkJCSAgICBjbHVzdGVyc190b19hbGxvYyk7CisKKwl9CisKKwlvY2ZzMl9zZXRfdGFyZ2V0X2JvdW5kYXJpZXMob3NiLCB3YywgcG9zLCBsZW4sCisJCQkJICAgIGNsdXN0ZXJzX3RvX2FsbG9jICsgZXh0ZW50c190b19zcGxpdCk7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJd2MtPndfaGFuZGxlID0gaGFuZGxlOworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRoaXMgdG8gZmFpbCBpbiBvY2ZzMl93cml0ZV9lbmQoKSwgc28gZG8gaXQKKwkgKiBoZXJlLgorCSAqLworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHdjLT53X2RpX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCS8qCisJICogRmlsbCBvdXIgcGFnZSBhcnJheSBmaXJzdC4gVGhhdCB3YXkgd2UndmUgZ3JhYmJlZCBlbm91Z2ggc28KKwkgKiB0aGF0IHdlIGNhbiB6ZXJvIGFuZCBmbHVzaCBpZiB3ZSBlcnJvciBhZnRlciBhZGRpbmcgdGhlCisJICogZXh0ZW50LgorCSAqLworCXJldCA9IG9jZnMyX2dyYWJfcGFnZXNfZm9yX3dyaXRlKG1hcHBpbmcsIHdjLCB3Yy0+d19jcG9zLCBwb3MsCisJCQkJCSBjbHVzdGVyc190b19hbGxvYyArIGV4dGVudHNfdG9fc3BsaXQsCisJCQkJCSBtbWFwX3BhZ2UpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJcmV0ID0gb2NmczJfd3JpdGVfY2x1c3Rlcl9ieV9kZXNjKG1hcHBpbmcsIGRhdGFfYWMsIG1ldGFfYWMsIHdjLCBwb3MsCisJCQkJCSAgbGVuKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCWlmIChkYXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7CisJaWYgKG1ldGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKworCSpwYWdlcCA9IHdjLT53X3RhcmdldF9wYWdlOworCSpmc2RhdGEgPSB3YzsKKwlyZXR1cm4gMDsKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKworb3V0OgorCW9jZnMyX2ZyZWVfd3JpdGVfY3R4dCh3Yyk7CisKKwlpZiAoZGF0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOworCWlmIChtZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG9jZnMyX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJICAgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKKwkJICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcCwgdm9pZCAqKmZzZGF0YSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCisJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAogCS8qCiAJICogVGFrZSBhbGxvYyBzZW0gaGVyZSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgbG9va3Vwcy4gVGhhdCB3YXkKQEAgLTEyMjgsNTIgKzE0OTQsODUgQEAKIAkgKi8KIAlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKIAotCXJldCA9IG9jZnMyX2dldF9jbHVzdGVycyhpbm9kZSwgd2Mud19jcG9zLCAmcGh5cywgTlVMTCwgTlVMTCk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X21ldGE7Ci0JfQotCi0JLyogcGh5cyA9PSAwIG1lYW5zIHRoYXQgYWxsb2NhdGlvbiBpcyByZXF1aXJlZC4gKi8KLQlpZiAocGh5cyA9PSAwKSB7Ci0JCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgZGksIDEsICZkYXRhX2FjLCAmbWV0YV9hYyk7Ci0JCWlmIChyZXQpIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X21ldGE7Ci0JCX0KLQotCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhpbm9kZS0+aV9zYiwgZGksIDEpOwotCX0KLQogCXJldCA9IG9jZnMyX2RhdGFfbG9jayhpbm9kZSwgMSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X21ldGE7CisJCWdvdG8gb3V0X2ZhaWw7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2RhdGE7Ci0JfQotCi0Jd3JpdHRlbiA9IG9jZnMyX3dyaXRlKGZpbGUsIHBoeXMsIGhhbmRsZSwgZGlfYmgsIGRhdGFfYWMsCi0JCQkgICAgICBtZXRhX2FjLCAmd2MpOwotCWlmICh3cml0dGVuIDwgMCkgewotCQlyZXQgPSB3cml0dGVuOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKLQl9Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKG1hcHBpbmcsIHBvcywgbGVuLCBmbGFncywgcGFnZXAsCisJCQkJICAgICAgIGZzZGF0YSwgZGlfYmgsIE5VTEwpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0X2ZhaWxfZGF0YTsKIAl9CiAKLQlwb3MgKz0gd3JpdHRlbjsKKwlicmVsc2UoZGlfYmgpOworCisJcmV0dXJuIDA7CisKK291dF9mYWlsX2RhdGE6CisJb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOworb3V0X2ZhaWw6CisJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCisJYnJlbHNlKGRpX2JoKTsKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfd3JpdGVfZW5kX25vbG9jayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY29waWVkLAorCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmZzZGF0YSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBmcm9tLCB0bywgc3RhcnQgPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjID0gZnNkYXRhOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil3Yy0+d19kaV9iaC0+Yl9kYXRhOworCWhhbmRsZV90ICpoYW5kbGUgPSB3Yy0+d19oYW5kbGU7CisJc3RydWN0IHBhZ2UgKnRtcHBhZ2U7CisKKwlpZiAodW5saWtlbHkoY29waWVkIDwgbGVuKSkgeworCQlpZiAoIVBhZ2VVcHRvZGF0ZSh3Yy0+d190YXJnZXRfcGFnZSkpCisJCQljb3BpZWQgPSAwOworCisJCW9jZnMyX3plcm9fbmV3X2J1ZmZlcnMod2MtPndfdGFyZ2V0X3BhZ2UsIHN0YXJ0K2NvcGllZCwKKwkJCQkgICAgICAgc3RhcnQrbGVuKTsKKwl9CisJZmx1c2hfZGNhY2hlX3BhZ2Uod2MtPndfdGFyZ2V0X3BhZ2UpOworCisJZm9yKGkgPSAwOyBpIDwgd2MtPndfbnVtX3BhZ2VzOyBpKyspIHsKKwkJdG1wcGFnZSA9IHdjLT53X3BhZ2VzW2ldOworCisJCWlmICh0bXBwYWdlID09IHdjLT53X3RhcmdldF9wYWdlKSB7CisJCQlmcm9tID0gd2MtPndfdGFyZ2V0X2Zyb207CisJCQl0byA9IHdjLT53X3RhcmdldF90bzsKKworCQkJQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUgfHwKKwkJCSAgICAgICB0byA+IFBBR0VfQ0FDSEVfU0laRSB8fAorCQkJICAgICAgIHRvIDwgZnJvbSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUGFnZXMgYWRqYWNlbnQgdG8gdGhlIHRhcmdldCAoaWYgYW55KSBpbXBseQorCQkJICogYSBob2xlLWZpbGxpbmcgd3JpdGUgaW4gd2hpY2ggY2FzZSB3ZSB3YW50CisJCQkgKiB0byBmbHVzaCB0aGVpciBlbnRpcmUgcmFuZ2UuCisJCQkgKi8KKwkJCWZyb20gPSAwOworCQkJdG8gPSBQQUdFX0NBQ0hFX1NJWkU7CisJCX0KKworCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQkJd2Fsa19wYWdlX2J1ZmZlcnMod2MtPndfaGFuZGxlLCBwYWdlX2J1ZmZlcnModG1wcGFnZSksCisJCQkJCSAgZnJvbSwgdG8sIE5VTEwsCisJCQkJCSAgb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKKworCQlibG9ja19jb21taXRfd3JpdGUodG1wcGFnZSwgZnJvbSwgdG8pOworCX0KKworCXBvcyArPSBjb3BpZWQ7CiAJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpIHsKIAkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOwogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKQEAgLTEyODMsMjkgKzE1ODIsMzEgQEAKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWRpLT5pX210aW1lID0gZGktPmlfY3RpbWUgPSBjcHVfdG9fbGU2NChpbm9kZS0+aV9tdGltZS50dl9zZWMpOwogCWRpLT5pX210aW1lX25zZWMgPSBkaS0+aV9jdGltZV9uc2VjID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfbXRpbWUudHZfbnNlYyk7CisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHdjLT53X2RpX2JoKTsKIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7Ci0JaWYgKHJldCkKLQkJbWxvZ19lcnJubyhyZXQpOwotCi1vdXRfY29tbWl0OgogCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKLW91dF9kYXRhOgotCW9jZnMyX2RhdGFfdW5sb2NrKGlub2RlLCAxKTsKKwlvY2ZzMl9ydW5fZGVhbGxvY3Mob3NiLCAmd2MtPndfZGVhbGxvYyk7CiAKLW91dF9tZXRhOgorCW9jZnMyX2ZyZWVfd3JpdGVfY3R4dCh3Yyk7CisKKwlyZXR1cm4gY29waWVkOworfQorCitpbnQgb2NmczJfd3JpdGVfZW5kKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY29waWVkLAorCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmZzZGF0YSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCisJcmV0ID0gb2NmczJfd3JpdGVfZW5kX25vbG9jayhtYXBwaW5nLCBwb3MsIGxlbiwgY29waWVkLCBwYWdlLCBmc2RhdGEpOworCisJb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOwogCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKIAlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7CiAKLW91dDoKLQlicmVsc2UoZGlfYmgpOwotCWlmIChkYXRhX2FjKQotCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7Ci0JaWYgKG1ldGFfYWMpCi0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKLQotCXJldHVybiB3cml0dGVuID8gd3JpdHRlbiA6IHJldDsKKwlyZXR1cm4gcmV0OwogfQogCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG9jZnMyX2FvcHMgPSB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmggYi9mcy9vY2ZzMi9hb3BzLmgKaW5kZXggNDU4MjFkNC4uMzg5NTc5YiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5oCisrKyBiL2ZzL29jZnMyL2FvcHMuaApAQCAtNDIsNTcgKzQyLDIyIEBACiAJCQlpbnQgKCpmbikoCWhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpKTsKIAotc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQ7Ci10eXBlZGVmIGludCAob2NmczJfcGFnZV93cml0ZXIpKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqLAotCQkJCXU2NCAqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopOworaW50IG9jZnMyX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJICAgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKKwkJICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcCwgdm9pZCAqKmZzZGF0YSk7CiAKLXNzaXplX3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBvcywKLQkJCQkgICAgIHNpemVfdCBjb3VudCwgb2NmczJfcGFnZV93cml0ZXIgKmFjdG9yLAotCQkJCSAgICAgdm9pZCAqcHJpdik7CitpbnQgb2NmczJfd3JpdGVfZW5kKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY29waWVkLAorCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmZzZGF0YSk7CiAKLXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0IHsKLQlzaXplX3QJCQkJd19jb3VudDsKLQlsb2ZmX3QJCQkJd19wb3M7Ci0JdTMyCQkJCXdfY3BvczsKLQl1bnNpZ25lZCBpbnQJCQl3X2ZpbmlzaGVkX2NvcHk7CitpbnQgb2NmczJfd3JpdGVfZW5kX25vbG9jayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY29waWVkLAorCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmZzZGF0YSk7CiAKLQkvKiBUaGlzIGlzIHRydWUgaWYgcGFnZV9zaXplID4gY2x1c3Rlcl9zaXplICovCi0JdW5zaWduZWQgaW50CQkJd19sYXJnZV9wYWdlczsKLQotCS8qIEZpbGxlciBjYWxsYmFjayBhbmQgcHJpdmF0ZSBkYXRhICovCi0Jb2NmczJfcGFnZV93cml0ZXIJCSp3X3dyaXRlX2RhdGFfcGFnZTsKLQl2b2lkCQkJCSp3X3ByaXZhdGU7Ci0KLQkvKiBPbmx5IHZhbGlkIGZvciB0aGUgZmlsbGVyIGNhbGxiYWNrICovCi0Jc3RydWN0IHBhZ2UJCQkqd190aGlzX3BhZ2U7Ci0JdW5zaWduZWQgaW50CQkJd190aGlzX3BhZ2VfbmV3OwotfTsKLQotc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgewotCWNoYXIJCQkJKmJfc3JjX2J1ZjsKLQljb25zdCBzdHJ1Y3QgaW92ZWMJCSpiX2N1cl9pb3Y7IC8qIEN1cnJlbnQgaW92ZWMgKi8KLQlzaXplX3QJCQkJYl9jdXJfb2ZmOyAvKiBPZmZzZXQgaW4gdGhlCi0JCQkJCQkgICAgKiBjdXJyZW50IGlvdmVjICovCi19OwotaW50IG9jZnMyX21hcF9hbmRfd3JpdGVfdXNlcl9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCi0JCQkJICB1NjQgKnBfYmxrbm8sCi0JCQkJICB1bnNpZ25lZCBpbnQgKnJldF9mcm9tLAotCQkJCSAgdW5zaWduZWQgaW50ICpyZXRfdG8pOwotCi1zdHJ1Y3Qgb2NmczJfc3BsaWNlX3dyaXRlX3ByaXYgewotCXN0cnVjdCBzcGxpY2VfZGVzYwkJKnNfc2Q7Ci0Jc3RydWN0IHBpcGVfYnVmZmVyCQkqc19idWY7Ci0Jc3RydWN0IHBpcGVfaW5vZGVfaW5mbwkJKnNfcGlwZTsKLQkvKiBOZWl0aGVyIG9mZnNldCB2YWx1ZSBpcyBldmVyIGxhcmdlciB0aGFuIG9uZSBwYWdlICovCi0JdW5zaWduZWQgaW50CQkJc19vZmZzZXQ7Ci0JdW5zaWduZWQgaW50CQkJc19idWZfb2Zmc2V0OwotfTsKLWludCBvY2ZzMl9tYXBfYW5kX3dyaXRlX3NwbGljZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKLQkJCQkgICAgdTY0ICpwX2Jsa25vLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJldF9mcm9tLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJldF90byk7CitpbnQgb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAorCQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLCBzdHJ1Y3QgcGFnZSAqbW1hcF9wYWdlKTsKIAogLyogYWxsIG9jZnMyX2Rpb19lbmRfaW8oKSdzIGZhdWx0ICovCiAjZGVmaW5lIG9jZnMyX2lvY2JfaXNfcndfbG9ja2VkKGlvY2IpIFwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDk3OTExMzQuLjJiZDdmNzggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtMTMzNSw2ICsxMzM1LDcgQEAKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobzJoYl9zdGVhZHlfcXVldWUsCiAJCQkJYXRvbWljX3JlYWQoJnJlZy0+aHJfc3RlYWR5X2l0ZXJhdGlvbnMpID09IDApOwogCWlmIChyZXQpIHsKKwkJLyogV2UgZ290IGludGVycnVwdGVkIChoZWxsbyBwdHJhY2UhKS4gIENsZWFuIHVwICovCiAJCXNwaW5fbG9jaygmbzJoYl9saXZlX2xvY2spOwogCQloYl90YXNrID0gcmVnLT5ocl90YXNrOwogCQlyZWctPmhyX3Rhc2sgPSBOVUxMOwpAQCAtMTM0NSw3ICsxMzQ2LDE2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGNvdW50OworCS8qIE9rLCB3ZSB3ZXJlIHdva2VuLiAgTWFrZSBzdXJlIGl0IHdhc24ndCBieSBkcm9wX2l0ZW0oKSAqLworCXNwaW5fbG9jaygmbzJoYl9saXZlX2xvY2spOworCWhiX3Rhc2sgPSByZWctPmhyX3Rhc2s7CisJc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKworCWlmIChoYl90YXNrKQorCQlyZXQgPSBjb3VudDsKKwllbHNlCisJCXJldCA9IC1FSU87CisKIG91dDoKIAlpZiAoZmlscCkKIAkJZnB1dChmaWxwKTsKQEAgLTE1MjMsNiArMTUzMywxNSBAQAogCWlmIChoYl90YXNrKQogCQlrdGhyZWFkX3N0b3AoaGJfdGFzayk7CiAKKwkvKgorCSAqIElmIHdlJ3JlIHJhY2luZyBhIGRldl93cml0ZSgpLCB3ZSBuZWVkIHRvIHdha2UgdGhlbS4gIFRoZXkgd2lsbAorCSAqIGNoZWNrIHJlZy0+aHJfdGFzaworCSAqLworCWlmIChhdG9taWNfcmVhZCgmcmVnLT5ocl9zdGVhZHlfaXRlcmF0aW9ucykgIT0gMCkgeworCQlhdG9taWNfc2V0KCZyZWctPmhyX3N0ZWFkeV9pdGVyYXRpb25zLCAwKTsKKwkJd2FrZV91cCgmbzJoYl9zdGVhZHlfcXVldWUpOworCX0KKwogCWNvbmZpZ19pdGVtX3B1dChpdGVtKTsKIH0KIApAQCAtMTY2NSw3ICsxNjg0LDY3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvMmhiX3NldHVwX2NhbGxiYWNrKTsKIAotaW50IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpCitzdGF0aWMgc3RydWN0IG8yaGJfcmVnaW9uICpvMmhiX2ZpbmRfcmVnaW9uKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkKQoreworCXN0cnVjdCBvMmhiX3JlZ2lvbiAqcCwgKnJlZyA9IE5VTEw7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJm8yaGJfbGl2ZV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJm8yaGJfYWxsX3JlZ2lvbnMsIGhyX2FsbF9pdGVtKSB7CisJCWlmICghc3RyY21wKHJlZ2lvbl91dWlkLCBjb25maWdfaXRlbV9uYW1lKCZwLT5ocl9pdGVtKSkpIHsKKwkJCXJlZyA9IHA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbnQgbzJoYl9yZWdpb25fZ2V0KGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBvMmhiX3JlZ2lvbiAqcmVnOworCisJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlyZWcgPSBvMmhiX2ZpbmRfcmVnaW9uKHJlZ2lvbl91dWlkKTsKKwlpZiAoIXJlZykKKwkJcmV0ID0gLUVOT0VOVDsKKwlzcGluX3VubG9jaygmbzJoYl9saXZlX2xvY2spOworCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBvMm5tX2RlcGVuZF90aGlzX25vZGUoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IG8ybm1fZGVwZW5kX2l0ZW0oJnJlZy0+aHJfaXRlbSk7CisJaWYgKHJldCkKKwkJbzJubV91bmRlcGVuZF90aGlzX25vZGUoKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG8yaGJfcmVnaW9uX3B1dChjb25zdCBjaGFyICpyZWdpb25fdXVpZCkKK3sKKwlzdHJ1Y3QgbzJoYl9yZWdpb24gKnJlZzsKKworCXNwaW5fbG9jaygmbzJoYl9saXZlX2xvY2spOworCisJcmVnID0gbzJoYl9maW5kX3JlZ2lvbihyZWdpb25fdXVpZCk7CisKKwlzcGluX3VubG9jaygmbzJoYl9saXZlX2xvY2spOworCisJaWYgKHJlZykgeworCQlvMm5tX3VuZGVwZW5kX2l0ZW0oJnJlZy0+aHJfaXRlbSk7CisJCW8ybm1fdW5kZXBlbmRfdGhpc19ub2RlKCk7CisJfQorfQorCitpbnQgbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhjb25zdCBjaGFyICpyZWdpb25fdXVpZCwKKwkJCSAgIHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKQogewogCXN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKnRtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwpAQCAtMTY4MSw2ICsxNzYwLDEyIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlmIChyZWdpb25fdXVpZCkgeworCQlyZXQgPSBvMmhiX3JlZ2lvbl9nZXQocmVnaW9uX3V1aWQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCiAJZG93bl93cml0ZSgmbzJoYl9jYWxsYmFja19zZW0pOwogCiAJbGlzdF9mb3JfZWFjaChpdGVyLCAmaGJjYWxsLT5saXN0KSB7CkBAIC0xNzAyLDE2ICsxNzg3LDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKTsKIAotdm9pZCBvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpCit2b2lkIG8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhjb25zdCBjaGFyICpyZWdpb25fdXVpZCwKKwkJCSAgICAgIHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKQogewogCUJVR19PTihoYy0+aGNfbWFnaWMgIT0gTzJIQl9DQl9NQUdJQyk7CiAKIAltbG9nKE1MX0hFQVJUQkVBVCwgIm9uIGJlaGFsZiBvZiAlcCBmb3IgZnVuY3MgJXBcbiIsCiAJICAgICBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIGhjKTsKIAorCS8qIFhYWCBDYW4gdGhpcyBoYXBwZW4gX3dpdGhfIGEgcmVnaW9uIHJlZmVyZW5jZT8gKi8KIAlpZiAobGlzdF9lbXB0eSgmaGMtPmhjX2l0ZW0pKQogCQlyZXR1cm47CiAKKwlpZiAocmVnaW9uX3V1aWQpCisJCW8yaGJfcmVnaW9uX3B1dChyZWdpb25fdXVpZCk7CisKIAlkb3duX3dyaXRlKCZvMmhiX2NhbGxiYWNrX3NlbSk7CiAKIAlsaXN0X2RlbF9pbml0KCZoYy0+aGNfaXRlbSk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5oIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuaAppbmRleCBjYzZkNDBiLi4zNTM5N2RkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5oCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmgKQEAgLTY5LDggKzY5LDEwIEBACiAJCQkgbzJoYl9jYl9mdW5jICpmdW5jLAogCQkJIHZvaWQgKmRhdGEsCiAJCQkgaW50IHByaW9yaXR5KTsKLWludCBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKTsKLXZvaWQgbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKTsKK2ludCBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkLAorCQkJICAgc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpOwordm9pZCBvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soY29uc3QgY2hhciAqcmVnaW9uX3V1aWQsCisJCQkgICAgICBzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYyk7CiB2b2lkIG8yaGJfZmlsbF9ub2RlX21hcCh1bnNpZ25lZCBsb25nICptYXAsCiAJCQl1bnNpZ25lZCBieXRlcyk7CiB2b2lkIG8yaGJfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYwppbmRleCA5ZjVhZDBmLi5hZjIwNzBkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jCkBAIC05MDAsNiArOTAwLDQ2IEBACiAJfSwKIH07CiAKK2ludCBvMm5tX2RlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKK3sKKwlyZXR1cm4gY29uZmlnZnNfZGVwZW5kX2l0ZW0oJm8ybm1fY2x1c3Rlcl9ncm91cC5jc19zdWJzeXMsIGl0ZW0pOworfQorCit2b2lkIG8ybm1fdW5kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCit7CisJY29uZmlnZnNfdW5kZXBlbmRfaXRlbSgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cywgaXRlbSk7Cit9CisKK2ludCBvMm5tX2RlcGVuZF90aGlzX25vZGUodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbzJubV9ub2RlICpsb2NhbF9ub2RlOworCisJbG9jYWxfbm9kZSA9IG8ybm1fZ2V0X25vZGVfYnlfbnVtKG8ybm1fdGhpc19ub2RlKCkpOworCWlmICghbG9jYWxfbm9kZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvMm5tX2RlcGVuZF9pdGVtKCZsb2NhbF9ub2RlLT5uZF9pdGVtKTsKKwlvMm5tX25vZGVfcHV0KGxvY2FsX25vZGUpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBvMm5tX3VuZGVwZW5kX3RoaXNfbm9kZSh2b2lkKQoreworCXN0cnVjdCBvMm5tX25vZGUgKmxvY2FsX25vZGU7CisKKwlsb2NhbF9ub2RlID0gbzJubV9nZXRfbm9kZV9ieV9udW0obzJubV90aGlzX25vZGUoKSk7CisJQlVHX09OKCFsb2NhbF9ub2RlKTsKKworCW8ybm1fdW5kZXBlbmRfaXRlbSgmbG9jYWxfbm9kZS0+bmRfaXRlbSk7CisJbzJubV9ub2RlX3B1dChsb2NhbF9ub2RlKTsKK30KKworCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9vMm5tKHZvaWQpCiB7CiAJaWYgKG9jZnMyX3RhYmxlX2hlYWRlcikKQEAgLTkzNCw3ICs5NzQsNyBAQAogCQlnb3RvIG91dF9zeXNjdGw7CiAKIAljb25maWdfZ3JvdXBfaW5pdCgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cy5zdV9ncm91cCk7Ci0JaW5pdF9NVVRFWCgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cy5zdV9zZW0pOworCW11dGV4X2luaXQoJm8ybm1fY2x1c3Rlcl9ncm91cC5jc19zdWJzeXMuc3VfbXV0ZXgpOwogCXJldCA9IGNvbmZpZ2ZzX3JlZ2lzdGVyX3N1YnN5c3RlbSgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cyk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIm5vZGVtYW5hZ2VyOiBSZWdpc3RyYXRpb24gcmV0dXJuZWQgJWRcbiIsIHJldCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmggYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmgKaW5kZXggMDcwNTIyMS4uN2M4NjAzNiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5oCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaApAQCAtNzcsNCArNzcsOSBAQAogdm9pZCBvMm5tX25vZGVfZ2V0KHN0cnVjdCBvMm5tX25vZGUgKm5vZGUpOwogdm9pZCBvMm5tX25vZGVfcHV0KHN0cnVjdCBvMm5tX25vZGUgKm5vZGUpOwogCitpbnQgbzJubV9kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwordm9pZCBvMm5tX3VuZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKK2ludCBvMm5tX2RlcGVuZF90aGlzX25vZGUodm9pZCk7Cit2b2lkIG8ybm1fdW5kZXBlbmRfdGhpc19ub2RlKHZvaWQpOworCiAjZW5kaWYgLyogTzJDTFVTVEVSX05PREVNQU5BR0VSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCmluZGV4IDBiMjI5YTkuLmYwYmRmZDkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci90Y3AuYwpAQCAtMjYxLDE0ICsyNjEsMTIgQEAKIAogc3RhdGljIHZvaWQgbzJuZXRfY29tcGxldGVfbm9kZXNfbnN3KHN0cnVjdCBvMm5ldF9ub2RlICpubikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqdG1wOworCXN0cnVjdCBvMm5ldF9zdGF0dXNfd2FpdCAqbnN3LCAqdG1wOwogCXVuc2lnbmVkIGludCBudW1fa2lsbHMgPSAwOwotCXN0cnVjdCBvMm5ldF9zdGF0dXNfd2FpdCAqbnN3OwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZubi0+bm5fbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1wLCAmbm4tPm5uX3N0YXR1c19saXN0KSB7Ci0JCW5zdyA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IG8ybmV0X3N0YXR1c193YWl0LCBuc19ub2RlX2l0ZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuc3csIHRtcCwgJm5uLT5ubl9zdGF0dXNfbGlzdCwgbnNfbm9kZV9pdGVtKSB7CiAJCW8ybmV0X2NvbXBsZXRlX25zd19sb2NrZWQobm4sIG5zdywgTzJORVRfRVJSX0RJRUQsIDApOwogCQludW1fa2lsbHMrKzsKIAl9CkBAIC03NjQsMTMgKzc2MiwxMCBAQAogCiB2b2lkIG8ybmV0X3VucmVnaXN0ZXJfaGFuZGxlcl9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbjsKLQlzdHJ1Y3QgbzJuZXRfbXNnX2hhbmRsZXIgKm5taDsKKwlzdHJ1Y3QgbzJuZXRfbXNnX2hhbmRsZXIgKm5taCwgKm47CiAKIAl3cml0ZV9sb2NrKCZvMm5ldF9oYW5kbGVyX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGxpc3QpIHsKLQkJbm1oID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBvMm5ldF9tc2dfaGFuZGxlciwKLQkJCQkgbmhfdW5yZWdpc3Rlcl9pdGVtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm1oLCBuLCBsaXN0LCBuaF91bnJlZ2lzdGVyX2l0ZW0pIHsKIAkJbWxvZyhNTF9UQ1AsICJ1bnJlZ2lzdGVyaW5nIGhhbmRsZXIgZnVuYyAlcCB0eXBlICV1IGtleSAlMDh4XG4iLAogCQkgICAgIG5taC0+bmhfZnVuYywgbm1oLT5uaF9tc2dfdHlwZSwgbm1oLT5uaF9rZXkpOwogCQlyYl9lcmFzZSgmbm1oLT5uaF9ub2RlLCAmbzJuZXRfaGFuZGxlcl90cmVlKTsKQEAgLTE2MzgsOCArMTYzMyw4IEBACiAKIHZvaWQgbzJuZXRfdW5yZWdpc3Rlcl9oYl9jYWxsYmFja3Modm9pZCkKIHsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJm8ybmV0X2hiX3VwKTsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJm8ybmV0X2hiX2Rvd24pOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmbzJuZXRfaGJfdXApOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmbzJuZXRfaGJfZG93bik7CiB9CiAKIGludCBvMm5ldF9yZWdpc3Rlcl9oYl9jYWxsYmFja3Modm9pZCkKQEAgLTE2NTEsOSArMTY0Niw5IEBACiAJbzJoYl9zZXR1cF9jYWxsYmFjaygmbzJuZXRfaGJfdXAsIE8ySEJfTk9ERV9VUF9DQiwKIAkJCSAgICBvMm5ldF9oYl9ub2RlX3VwX2NiLCBOVUxMLCBPMk5FVF9IQl9QUkkpOwogCi0JcmV0ID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfdXApOworCXJldCA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJm8ybmV0X2hiX3VwKTsKIAlpZiAocmV0ID09IDApCi0JCXJldCA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soJm8ybmV0X2hiX2Rvd24pOworCQlyZXQgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZvMm5ldF9oYl9kb3duKTsKIAogCWlmIChyZXQpCiAJCW8ybmV0X3VucmVnaXN0ZXJfaGJfY2FsbGJhY2tzKCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kaXIuYyBiL2ZzL29jZnMyL2Rpci5jCmluZGV4IGM0NDFlZjEuLjBkNWZkZGUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2Rpci5jCisrKyBiL2ZzL29jZnMyL2Rpci5jCkBAIC0zNjgsNyArMzY4LDcgQEAKIAkJdTMyIG9mZnNldCA9IE9DRlMyX0koZGlyKS0+aXBfY2x1c3RlcnM7CiAKIAkJc3RhdHVzID0gb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oT0NGUzJfU0Ioc2IpLCBkaXIsICZvZmZzZXQsCi0JCQkJCQkgICAgMSwgcGFyZW50X2ZlX2JoLCBoYW5kbGUsCisJCQkJCQkgICAgMSwgMCwgcGFyZW50X2ZlX2JoLCBoYW5kbGUsCiAJCQkJCQkgICAgZGF0YV9hYywgbWV0YV9hYywgTlVMTCk7CiAJCUJVR19PTihzdGF0dXMgPT0gLUVBR0FJTik7CiAJCWlmIChzdGF0dXMgPCAwKSB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKaW5kZXggZDgzNmI5OC4uNjk1NDU2NSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwpAQCAtMTEyOCw4ICsxMTI4LDggQEAKIAogc3RhdGljIHZvaWQgZGxtX3VucmVnaXN0ZXJfZG9tYWluX2hhbmRsZXJzKHN0cnVjdCBkbG1fY3R4dCAqZGxtKQogewotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmZGxtLT5kbG1faGJfdXApOwotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmZGxtLT5kbG1faGJfZG93bik7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl91cCk7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl9kb3duKTsKIAlvMm5ldF91bnJlZ2lzdGVyX2hhbmRsZXJfbGlzdCgmZGxtLT5kbG1fZG9tYWluX2hhbmRsZXJzKTsKIH0KIApAQCAtMTE0MSwxMyArMTE0MSwxMyBAQAogCiAJbzJoYl9zZXR1cF9jYWxsYmFjaygmZGxtLT5kbG1faGJfZG93biwgTzJIQl9OT0RFX0RPV05fQ0IsCiAJCQkgICAgZGxtX2hiX25vZGVfZG93bl9jYiwgZGxtLCBETE1fSEJfTk9ERV9ET1dOX1BSSSk7Ci0Jc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmZGxtLT5kbG1faGJfZG93bik7CisJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmZGxtLT5kbG1faGJfZG93bik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBiYWlsOwogCiAJbzJoYl9zZXR1cF9jYWxsYmFjaygmZGxtLT5kbG1faGJfdXAsIE8ySEJfTk9ERV9VUF9DQiwKIAkJCSAgICBkbG1faGJfbm9kZV91cF9jYiwgZGxtLCBETE1fSEJfTk9ERV9VUF9QUkkpOwotCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soJmRsbS0+ZGxtX2hiX3VwKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl91cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBiYWlsOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMgYi9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKaW5kZXggNmVkZmZjYS4uNjViMmI5YiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwpAQCAtMTkyLDI1ICsxOTIsMjAgQEAKIHN0YXRpYyB2b2lkIGRsbV9kdW1wX21sZXMoc3RydWN0IGRsbV9jdHh0ICpkbG0pCiB7CiAJc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSAqbWxlOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAJCiAJbWxvZyhNTF9OT1RJQ0UsICJkdW1waW5nIGFsbCBtbGVzIGZvciBkb21haW4gJXM6XG4iLCBkbG0tPm5hbWUpOwogCXNwaW5fbG9jaygmZGxtLT5tYXN0ZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5tYXN0ZXJfbGlzdCkgewotCQltbGUgPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnksIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWxlLCAmZGxtLT5tYXN0ZXJfbGlzdCwgbGlzdCkKIAkJZGxtX3ByaW50X29uZV9tbGUobWxlKTsKLQl9CiAJc3Bpbl91bmxvY2soJmRsbS0+bWFzdGVyX2xvY2spOwogfQogCiBpbnQgZGxtX2R1bXBfYWxsX21sZXMoY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbTsKIAogCXNwaW5fbG9jaygmZGxtX2RvbWFpbl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG1fZG9tYWlucykgewotCQlkbG0gPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2N0eHQsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGxtLCAmZGxtX2RvbWFpbnMsIGxpc3QpIHsKIAkJbWxvZyhNTF9OT1RJQ0UsICJmb3VuZCBkbG06ICVwLCBuYW1lPSVzXG4iLCBkbG0sIGRsbS0+bmFtZSk7CiAJCWRsbV9kdW1wX21sZXMoZGxtKTsKIAl9CkBAIC00NTQsMTIgKzQ0OSwxMCBAQAogCQkJY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IG5hbWVsZW4pCiB7CiAJc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSAqdG1wbWxlOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRsbS0+bWFzdGVyX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5tYXN0ZXJfbGlzdCkgewotCQl0bXBtbGUgPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnksIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wbWxlLCAmZGxtLT5tYXN0ZXJfbGlzdCwgbGlzdCkgewogCQlpZiAoIWRsbV9tbGVfZXF1YWwoZGxtLCB0bXBtbGUsIG5hbWUsIG5hbWVsZW4pKQogCQkJY29udGludWU7CiAJCWRsbV9nZXRfbWxlKHRtcG1sZSk7CkBAIC00NzIsMTMgKzQ2NSwxMCBAQAogdm9pZCBkbG1faGJfZXZlbnRfbm90aWZ5X2F0dGFjaGVkKHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBpbnQgaWR4LCBpbnQgbm9kZV91cCkKIHsKIAlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5zcGlubG9jayk7CiAJCi0JbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5tbGVfaGJfZXZlbnRzKSB7Ci0JCW1sZSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSwgCi0JCQkJIGhiX2V2ZW50cyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtbGUsICZkbG0tPm1sZV9oYl9ldmVudHMsIGhiX2V2ZW50cykgewogCQlpZiAobm9kZV91cCkKIAkJCWRsbV9tbGVfbm9kZV91cChkbG0sIG1sZSwgTlVMTCwgaWR4KTsKIAkJZWxzZQpAQCAtMjQzNCw3ICsyNDI0LDcgQEAKIAlpbnQgcmV0OwogCWludCBpOwogCWludCBjb3VudCA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcXVldWUsICppdGVyOworCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlOwogCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmcmVzLT5zcGlubG9jayk7CkBAIC0yNDUzLDggKzI0NDMsNyBAQAogCXJldCA9IDA7CiAJcXVldWUgPSAmcmVzLT5ncmFudGVkOwogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCBxdWV1ZSwgbGlzdCkgewogCQkJKytjb3VudDsKIAkJCWlmIChsb2NrLT5tbC5ub2RlID09IGRsbS0+bm9kZV9udW0pIHsKIAkJCQltbG9nKDAsICJmb3VuZCBhIGxvY2sgb3duZWQgYnkgdGhpcyBub2RlIHN0aWxsICIKQEAgLTI5MjMsMTggKzI5MTIsMTYgQEAKIHN0YXRpYyB2b2lkIGRsbV9yZW1vdmVfbm9ubG9jYWxfbG9ja3Moc3RydWN0IGRsbV9jdHh0ICpkbG0sCiAJCQkJICAgICAgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwogCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlID0gJnJlcy0+Z3JhbnRlZDsKIAlpbnQgaSwgYml0OwotCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKKwlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2ssICpuZXh0OwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZyZXMtPnNwaW5sb2NrKTsKIAogCUJVR19PTihyZXMtPm93bmVyID09IGRsbS0+bm9kZV9udW0pOwogCiAJZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgcXVldWUpIHsKLQkJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgcXVldWUsIGxpc3QpIHsKIAkJCWlmIChsb2NrLT5tbC5ub2RlICE9IGRsbS0+bm9kZV9udW0pIHsKIAkJCQltbG9nKDAsICJwdXR0aW5nIGxvY2sgZm9yIG5vZGUgJXVcbiIsCiAJCQkJICAgICBsb2NrLT5tbC5ub2RlKTsKQEAgLTI5NzYsNyArMjk2Myw2IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IGxpc3RfaGVhZCAqcXVldWUgPSAmcmVzLT5ncmFudGVkOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAJc3RydWN0IGRsbV9sb2NrICpsb2NrOwogCWludCBub2RlbnVtOwogCkBAIC0yOTg0LDEwICsyOTcwLDkgQEAKIAogCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2goaXRlciwgcXVldWUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCBxdWV1ZSwgbGlzdCkgewogCQkJLyogdXAgdG8gdGhlIGNhbGxlciB0byBtYWtlIHN1cmUgdGhpcyBub2RlCiAJCQkgKiBpcyBhbGl2ZSAqLwotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CiAJCQlpZiAobG9jay0+bWwubm9kZSAhPSBkbG0tPm5vZGVfbnVtKSB7CiAJCQkJc3Bpbl91bmxvY2soJnJlcy0+c3BpbmxvY2spOwogCQkJCXJldHVybiBsb2NrLT5tbC5ub2RlOwpAQCAtMzIzNCw4ICszMjE5LDcgQEAKIAogdm9pZCBkbG1fY2xlYW5fbWFzdGVyX2xpc3Qoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHU4IGRlYWRfbm9kZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7Ci0Jc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSAqbWxlOworCXN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnkgKm1sZSwgKm5leHQ7CiAJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7CiAJdW5zaWduZWQgaW50IGhhc2g7CiAKQEAgLTMyNDUsOSArMzIyOSw3IEBACiAKIAkvKiBjbGVhbiB0aGUgbWFzdGVyIGxpc3QgKi8KIAlzcGluX2xvY2soJmRsbS0+bWFzdGVyX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJmRsbS0+bWFzdGVyX2xpc3QpIHsKLQkJbWxlID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5LCBsaXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtbGUsIG5leHQsICZkbG0tPm1hc3Rlcl9saXN0LCBsaXN0KSB7CiAJCUJVR19PTihtbGUtPnR5cGUgIT0gRExNX01MRV9CTE9DSyAmJgogCQkgICAgICAgbWxlLT50eXBlICE9IERMTV9NTEVfTUFTVEVSICYmCiAJCSAgICAgICBtbGUtPnR5cGUgIT0gRExNX01MRV9NSUdSQVRJT04pOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMgYi9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYwppbmRleCA2NzFjNGVkLi5hMmMzMzE2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYwpAQCAtMTU4LDggKzE1OCw3IEBACiAJc3RydWN0IGRsbV9jdHh0ICpkbG0gPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRsbV9jdHh0LCBkaXNwYXRjaGVkX3dvcmspOwogCUxJU1RfSEVBRCh0bXBfbGlzdCk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwotCXN0cnVjdCBkbG1fd29ya19pdGVtICppdGVtOworCXN0cnVjdCBkbG1fd29ya19pdGVtICppdGVtLCAqbmV4dDsKIAlkbG1fd29ya2Z1bmNfdCAqd29ya2Z1bmM7CiAJaW50IHRvdD0wOwogCkBAIC0xNjcsMTMgKzE2NiwxMiBAQAogCWxpc3Rfc3BsaWNlX2luaXQoJmRsbS0+d29ya19saXN0LCAmdG1wX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZkbG0tPndvcmtfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsICZ0bXBfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlbSwgJnRtcF9saXN0LCBsaXN0KSB7CiAJCXRvdCsrOwogCX0KIAltbG9nKDAsICIlczogd29yayB0aHJlYWQgaGFzICVkIHdvcmsgaXRlbXNcbiIsIGRsbS0+bmFtZSwgdG90KTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJnRtcF9saXN0KSB7Ci0JCWl0ZW0gPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBkbG1fd29ya19pdGVtLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRlbSwgbmV4dCwgJnRtcF9saXN0LCBsaXN0KSB7CiAJCXdvcmtmdW5jID0gaXRlbS0+ZnVuYzsKIAkJbGlzdF9kZWxfaW5pdCgmaXRlbS0+bGlzdCk7CiAKQEAgLTU0OSw3ICs1NDcsNiBAQAogewogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAJaW50IGFsbF9ub2Rlc19kb25lOwogCWludCBkZXN0cm95ID0gMDsKIAlpbnQgcGFzcyA9IDA7CkBAIC01NjcsOCArNTY0LDcgQEAKIAogCS8qIHNhZmUgdG8gYWNjZXNzIHRoZSBub2RlIGRhdGEgbGlzdCB3aXRob3V0IGEgbG9jaywgc2luY2UgdGhpcwogCSAqIHByb2Nlc3MgaXMgdGhlIG9ubHkgb25lIHRvIGNoYW5nZSB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbS0+cmVjby5ub2RlX2RhdGEpIHsKLQkJbmRhdGEgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5kYXRhLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSwgbGlzdCkgewogCQlCVUdfT04obmRhdGEtPnN0YXRlICE9IERMTV9SRUNPX05PREVfREFUQV9JTklUKTsKIAkJbmRhdGEtPnN0YXRlID0gRExNX1JFQ09fTk9ERV9EQVRBX1JFUVVFU1RJTkc7CiAKQEAgLTY1NSw5ICs2NTEsNyBAQAogCQkgKiBkb25lLCBvciBpZiBhbnlvbmUgZGllZCAqLwogCQlhbGxfbm9kZXNfZG9uZSA9IDE7CiAJCXNwaW5fbG9jaygmZGxtX3JlY29fc3RhdGVfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbS0+cmVjby5ub2RlX2RhdGEpIHsKLQkJCW5kYXRhID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSwgbGlzdCk7Ci0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZGF0YSwgJmRsbS0+cmVjby5ub2RlX2RhdGEsIGxpc3QpIHsKIAkJCW1sb2coMCwgImNoZWNraW5nIHJlY292ZXJ5IHN0YXRlIG9mIG5vZGUgJXVcbiIsCiAJCQkgICAgIG5kYXRhLT5ub2RlX251bSk7CiAJCQlzd2l0Y2ggKG5kYXRhLT5zdGF0ZSkgewpAQCAtNzc0LDE2ICs3NjgsMTQgQEAKIAogc3RhdGljIHZvaWQgZGxtX2Rlc3Ryb3lfcmVjb3ZlcnlfYXJlYShzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICppdGVyMjsKLQlzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhICpuZGF0YTsKKwlzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhICpuZGF0YSwgKm5leHQ7CiAJTElTVF9IRUFEKHRtcGxpc3QpOwogCiAJc3Bpbl9sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKIAlsaXN0X3NwbGljZV9pbml0KCZkbG0tPnJlY28ubm9kZV9kYXRhLCAmdG1wbGlzdCk7CiAJc3Bpbl91bmxvY2soJmRsbV9yZWNvX3N0YXRlX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmdG1wbGlzdCkgewotCQluZGF0YSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZGF0YSwgbmV4dCwgJnRtcGxpc3QsIGxpc3QpIHsKIAkJbGlzdF9kZWxfaW5pdCgmbmRhdGEtPmxpc3QpOwogCQlrZnJlZShuZGF0YSk7CiAJfQpAQCAtODc2LDcgKzg2OCw2IEBACiAJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7CiAJc3RydWN0IGRsbV9jdHh0ICpkbG07CiAJTElTVF9IRUFEKHJlc291cmNlcyk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlpbnQgcmV0OwogCXU4IGRlYWRfbm9kZSwgcmVjb19tYXN0ZXI7CiAJaW50IHNraXBfYWxsX2RvbmUgPSAwOwpAQCAtOTIwLDggKzkxMSw3IEBACiAKIAkvKiBhbnkgZXJyb3JzIHJldHVybmVkIHdpbGwgYmUgZHVlIHRvIHRoZSBuZXdfbWFzdGVyIGR5aW5nLAogCSAqIHRoZSBkbG1fcmVjb190aHJlYWQgc2hvdWxkIGRldGVjdCB0aGlzICovCi0JbGlzdF9mb3JfZWFjaChpdGVyLCAmcmVzb3VyY2VzKSB7Ci0JCXJlcyA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSwgcmVjb3ZlcmluZyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZyZXNvdXJjZXMsIHJlY292ZXJpbmcpIHsKIAkJcmV0ID0gZGxtX3NlbmRfb25lX2xvY2tyZXMoZGxtLCByZXMsIG1yZXMsIHJlY29fbWFzdGVyLAogCQkJCSAgIAlETE1fTVJFU19SRUNPVkVSWSk7CiAJCWlmIChyZXQgPCAwKSB7CkBAIC05ODMsNyArOTczLDYgQEAKIHsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbSA9IGRhdGE7CiAJc3RydWN0IGRsbV9yZWNvX2RhdGFfZG9uZSAqZG9uZSA9IChzdHJ1Y3QgZGxtX3JlY29fZGF0YV9kb25lICopbXNnLT5idWY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhICpuZGF0YSA9IE5VTEw7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKQEAgLTEwMDAsOCArOTg5LDcgQEAKIAkJCWRsbS0+cmVjby5kZWFkX25vZGUsIGRvbmUtPm5vZGVfaWR4LCBkbG0tPm5vZGVfbnVtKTsKIAogCXNwaW5fbG9jaygmZGxtX3JlY29fc3RhdGVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSkgewotCQluZGF0YSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobmRhdGEsICZkbG0tPnJlY28ubm9kZV9kYXRhLCBsaXN0KSB7CiAJCWlmIChuZGF0YS0+bm9kZV9udW0gIT0gZG9uZS0+bm9kZV9pZHgpCiAJCQljb250aW51ZTsKIApAQCAtMTA0OSwxMyArMTAzNywxMSBAQAogCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAogCQkJCSAgICAgICAJdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICppdGVyMjsKKwlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcywgKm5leHQ7CiAJc3RydWN0IGRsbV9sb2NrICpsb2NrOwogCiAJc3Bpbl9sb2NrKCZkbG0tPnNwaW5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsICZkbG0tPnJlY28ucmVzb3VyY2VzKSB7Ci0JCXJlcyA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSwgcmVjb3ZlcmluZyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgbmV4dCwgJmRsbS0+cmVjby5yZXNvdXJjZXMsIHJlY292ZXJpbmcpIHsKIAkJLyogYWx3YXlzIHBydW5lIGFueSAkUkVDT1ZFUlkgZW50cmllcyBmb3IgZGVhZCBub2RlcywKIAkJICogb3RoZXJ3aXNlIGhhbmdzIGNhbiBvY2N1ciBkdXJpbmcgbGF0ZXIgcmVjb3ZlcnkgKi8KIAkJaWYgKGRsbV9pc19yZWNvdmVyeV9sb2NrKHJlcy0+bG9ja25hbWUubmFtZSwKQEAgLTExNjksNyArMTE1NSw3IEBACiAJCQkJCXU4IGZsYWdzLCB1OCBtYXN0ZXIpCiB7CiAJLyogbXJlcyBoZXJlIGlzIG9uZSBmdWxsIHBhZ2UgKi8KLQltZW1zZXQobXJlcywgMCwgUEFHRV9TSVpFKTsKKwljbGVhcl9wYWdlKG1yZXMpOwogCW1yZXMtPmxvY2tuYW1lX2xlbiA9IG5hbWVsZW47CiAJbWVtY3B5KG1yZXMtPmxvY2tuYW1lLCBsb2NrbmFtZSwgbmFtZWxlbik7CiAJbXJlcy0+bnVtX2xvY2tzID0gMDsKQEAgLTEyNTIsNyArMTIzOCw3IEBACiAJCQkgc3RydWN0IGRsbV9taWdyYXRhYmxlX2xvY2tyZXMgKm1yZXMsCiAJCQkgdTggc2VuZF90bywgdTggZmxhZ3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcXVldWUsICppdGVyOworCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlOwogCWludCB0b3RhbF9sb2NrcywgaTsKIAl1NjQgbWlnX2Nvb2tpZSA9IDA7CiAJc3RydWN0IGRsbV9sb2NrICpsb2NrOwpAQCAtMTI3OCw5ICsxMjY0LDcgQEAKIAl0b3RhbF9sb2NrcyA9IDA7CiAJZm9yIChpPURMTV9HUkFOVEVEX0xJU1Q7IGk8PURMTV9CTE9DS0VEX0xJU1Q7IGkrKykgewogCQlxdWV1ZSA9IGRsbV9saXN0X2lkeF90b19wdHIocmVzLCBpKTsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7Ci0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCBxdWV1ZSwgbGlzdCkgewogCQkJLyogYWRkIGFub3RoZXIgbG9jay4gKi8KIAkJCXRvdGFsX2xvY2tzKys7CiAJCQlpZiAoIWRsbV9hZGRfbG9ja190b19hcnJheShsb2NrLCBtcmVzLCBpKSkKQEAgLTE3MTcsNyArMTcwMSw2IEBACiAJc3RydWN0IGRsbV9sb2Nrc3RhdHVzICpsa3NiID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgaSwgaiwgYmFkOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAJc3RydWN0IGRsbV9sb2NrICpsb2NrID0gTlVMTDsKIAl1OCBmcm9tID0gTzJOTV9NQVhfTk9ERVM7CiAJdW5zaWduZWQgaW50IGFkZGVkID0gMDsKQEAgLTE3NTUsOCArMTczOCw3IEBACiAJCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwogCQkJZm9yIChqID0gRExNX0dSQU5URURfTElTVDsgaiA8PSBETE1fQkxPQ0tFRF9MSVNUOyBqKyspIHsKIAkJCQl0bXBxID0gZGxtX2xpc3RfaWR4X3RvX3B0cihyZXMsIGopOwotCQkJCWxpc3RfZm9yX2VhY2goaXRlciwgdG1wcSkgewotCQkJCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHRtcHEsIGxpc3QpIHsKIAkJCQkJaWYgKGxvY2stPm1sLmNvb2tpZSAhPSBtbC0+Y29va2llKQogCQkJCQkJbG9jayA9IE5VTEw7CiAJCQkJCWVsc2UKQEAgLTE5MzAsOCArMTkxMiw4IEBACiAJCQkJICAgICAgIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzKQogewogCWludCBpOwotCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlLCAqaXRlciwgKml0ZXIyOwotCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZTsKKwlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2ssICpuZXh0OwogCiAJcmVzLT5zdGF0ZSB8PSBETE1fTE9DS19SRVNfUkVDT1ZFUklORzsKIAlpZiAoIWxpc3RfZW1wdHkoJnJlcy0+cmVjb3ZlcmluZykpIHsKQEAgLTE5NDcsOCArMTkyOSw3IEBACiAJLyogZmluZCBhbnkgcGVuZGluZyBsb2NrcyBhbmQgcHV0IHRoZW0gYmFjayBvbiBwcm9wZXIgbGlzdCAqLwogCWZvciAoaT1ETE1fQkxPQ0tFRF9MSVNUOyBpPj1ETE1fR1JBTlRFRF9MSVNUOyBpLS0pIHsKIAkJcXVldWUgPSBkbG1fbGlzdF9pZHhfdG9fcHRyKHJlcywgaSk7Ci0JCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgcXVldWUpIHsKLQkJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgcXVldWUsIGxpc3QpIHsKIAkJCWRsbV9sb2NrX2dldChsb2NrKTsKIAkJCWlmIChsb2NrLT5jb252ZXJ0X3BlbmRpbmcpIHsKIAkJCQkvKiBtb3ZlIGNvbnZlcnRpbmcgbG9jayBiYWNrIHRvIGdyYW50ZWQgKi8KQEAgLTIwMTMsMTggKzE5OTQsMTUgQEAKIAkJCQkJICAgICAgdTggZGVhZF9ub2RlLCB1OCBuZXdfbWFzdGVyKQogewogCWludCBpOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICppdGVyMjsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqaGFzaF9pdGVyOwogCXN0cnVjdCBobGlzdF9oZWFkICpidWNrZXQ7Ci0KLQlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcywgKm5leHQ7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5zcGlubG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsICZkbG0tPnJlY28ucmVzb3VyY2VzKSB7Ci0JCXJlcyA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSwgcmVjb3ZlcmluZyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgbmV4dCwgJmRsbS0+cmVjby5yZXNvdXJjZXMsIHJlY292ZXJpbmcpIHsKIAkJaWYgKHJlcy0+b3duZXIgPT0gZGVhZF9ub2RlKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZyZXMtPnJlY292ZXJpbmcpOwogCQkJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKQEAgLTIwOTksNyArMjA3Nyw3IEBACiBzdGF0aWMgdm9pZCBkbG1fcmV2YWxpZGF0ZV9sdmIoc3RydWN0IGRsbV9jdHh0ICpkbG0sCiAJCQkgICAgICAgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMsIHU4IGRlYWRfbm9kZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCAqcXVldWU7CiAJc3RydWN0IGRsbV9sb2NrICpsb2NrOwogCWludCBibGFua19sdmIgPSAwLCBsb2NhbCA9IDA7CiAJaW50IGk7CkBAIC0yMTIxLDggKzIwOTksNyBAQAogCiAJZm9yIChpPURMTV9HUkFOVEVEX0xJU1Q7IGk8PURMTV9DT05WRVJUSU5HX0xJU1Q7IGkrKykgewogCQlxdWV1ZSA9IGRsbV9saXN0X2lkeF90b19wdHIocmVzLCBpKTsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgcXVldWUsIGxpc3QpIHsKIAkJCWlmIChsb2NrLT5tbC5ub2RlID09IHNlYXJjaF9ub2RlKSB7CiAJCQkJaWYgKGRsbV9sdmJfbmVlZHNfaW52YWxpZGF0aW9uKGxvY2ssIGxvY2FsKSkgewogCQkJCQkvKiB6ZXJvIHRoZSBsa3NiIGx2YiBhbmQgbG9ja3JlcyBsdmIgKi8KQEAgLTIxNDMsOCArMjEyMCw3IEBACiBzdGF0aWMgdm9pZCBkbG1fZnJlZV9kZWFkX2xvY2tzKHN0cnVjdCBkbG1fY3R4dCAqZGxtLAogCQkJCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzLCB1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKnRtcGl0ZXI7Ci0Jc3RydWN0IGRsbV9sb2NrICpsb2NrOworCXN0cnVjdCBkbG1fbG9jayAqbG9jaywgKm5leHQ7CiAJdW5zaWduZWQgaW50IGZyZWVkID0gMDsKIAogCS8qIHRoaXMgbm9kZSBpcyB0aGUgbG9ja3JlcyBtYXN0ZXI6CkBAIC0yMTU1LDI0ICsyMTMxLDIxIEBACiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZyZXMtPnNwaW5sb2NrKTsKIAogCS8qIFRPRE86IGNoZWNrIHBlbmRpbmdfYXN0cywgcGVuZGluZ19iYXN0cyBoZXJlICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIHRtcGl0ZXIsICZyZXMtPmdyYW50ZWQpIHsKLQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvY2ssIG5leHQsICZyZXMtPmdyYW50ZWQsIGxpc3QpIHsKIAkJaWYgKGxvY2stPm1sLm5vZGUgPT0gZGVhZF9ub2RlKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZsb2NrLT5saXN0KTsKIAkJCWRsbV9sb2NrX3B1dChsb2NrKTsKIAkJCWZyZWVkKys7CiAJCX0KIAl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIHRtcGl0ZXIsICZyZXMtPmNvbnZlcnRpbmcpIHsKLQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvY2ssIG5leHQsICZyZXMtPmNvbnZlcnRpbmcsIGxpc3QpIHsKIAkJaWYgKGxvY2stPm1sLm5vZGUgPT0gZGVhZF9ub2RlKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZsb2NrLT5saXN0KTsKIAkJCWRsbV9sb2NrX3B1dChsb2NrKTsKIAkJCWZyZWVkKys7CiAJCX0KIAl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIHRtcGl0ZXIsICZyZXMtPmJsb2NrZWQpIHsKLQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvY2ssIG5leHQsICZyZXMtPmJsb2NrZWQsIGxpc3QpIHsKIAkJaWYgKGxvY2stPm1sLm5vZGUgPT0gZGVhZF9ub2RlKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZsb2NrLT5saXN0KTsKIAkJCWRsbV9sb2NrX3B1dChsb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbWdsdWUuYyBiL2ZzL29jZnMyL2RsbWdsdWUuYwppbmRleCBkMWJkMzA1Li5mNzEyNTBlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG1nbHVlLmMKKysrIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCkBAIC02MDAsMTUgKzYwMCwxMyBAQAogc3RhdGljIHZvaWQgbG9ja3Jlc19zZXRfZmxhZ3Moc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXdmbGFncykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0bXA7Ci0Jc3RydWN0IG9jZnMyX21hc2tfd2FpdGVyICptdzsKKwlzdHJ1Y3Qgb2NmczJfbWFza193YWl0ZXIgKm13LCAqdG1wOwogCiAgCWFzc2VydF9zcGluX2xvY2tlZCgmbG9ja3Jlcy0+bF9sb2NrKTsKIAogCWxvY2tyZXMtPmxfZmxhZ3MgPSBuZXdmbGFnczsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJmxvY2tyZXMtPmxfbWFza193YWl0ZXJzKSB7Ci0JCW13ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBvY2ZzMl9tYXNrX3dhaXRlciwgbXdfaXRlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG13LCB0bXAsICZsb2NrcmVzLT5sX21hc2tfd2FpdGVycywgbXdfaXRlbSkgewogCQlpZiAoKGxvY2tyZXMtPmxfZmxhZ3MgJiBtdy0+bXdfbWFzaykgIT0gbXctPm13X2dvYWwpCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZW5kaWFuLmggYi9mcy9vY2ZzMi9lbmRpYW4uaAppbmRleCBmMjI2YjIyLi5mZjI1NzYyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9lbmRpYW4uaAorKysgYi9mcy9vY2ZzMi9lbmRpYW4uaApAQCAtMzIsNiArMzIsMTEgQEAKIAkqdmFyID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKnZhcikgKyB2YWwpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbGU2NF9hZGRfY3B1KF9fbGU2NCAqdmFyLCB1NjQgdmFsKQoreworCSp2YXIgPSBjcHVfdG9fbGU2NChsZTY0X3RvX2NwdSgqdmFyKSArIHZhbCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBsZTMyX2FuZF9jcHUoX19sZTMyICp2YXIsIHUzMiB2YWwpCiB7CiAJKnZhciA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KCp2YXIpICYgdmFsKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4cG9ydC5oIGIvZnMvb2NmczIvZXhwb3J0LmgKaW5kZXggNWI3N2VlNy4uZTA4YmVkOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXhwb3J0LmgKKysrIGIvZnMvb2NmczIvZXhwb3J0LmgKQEAgLTI2LDYgKzI2LDggQEAKICNpZm5kZWYgT0NGUzJfRVhQT1JUX0gKICNkZWZpbmUgT0NGUzJfRVhQT1JUX0gKIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CisKIGV4dGVybiBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgb2NmczJfZXhwb3J0X29wczsKIAogI2VuZGlmIC8qIE9DRlMyX0VYUE9SVF9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmMgYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKaW5kZXggYmEyYjJhYi4uMDNjMWQzNjUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYworKysgYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKQEAgLTEwOSwxNyArMTA5LDE0IEBACiAgKi8KIHZvaWQgb2NmczJfZXh0ZW50X21hcF90cnVuYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgY3BvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtICplbWk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqZW1pLCAqbjsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcCAqZW0gPSAmb2ktPmlwX2V4dGVudF9tYXA7CiAJTElTVF9IRUFEKHRtcF9saXN0KTsKIAl1bnNpZ25lZCBpbnQgcmFuZ2U7CiAKIAlzcGluX2xvY2soJm9pLT5pcF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmVtLT5lbV9saXN0KSB7Ci0JCWVtaSA9IGxpc3RfZW50cnkocCwgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSwgZWlfbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW1pLCBuLCAmZW0tPmVtX2xpc3QsIGVpX2xpc3QpIHsKIAkJaWYgKGVtaS0+ZWlfY3BvcyA+PSBjcG9zKSB7CiAJCQkvKiBGdWxsIHRydW5jYXRlIG9mIHRoaXMgcmVjb3JkLiAqLwogCQkJbGlzdF9tb3ZlKCZlbWktPmVpX2xpc3QsICZ0bXBfbGlzdCk7CkBAIC0xMzYsOCArMTMzLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmdG1wX2xpc3QpIHsKLQkJZW1pID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtLCBlaV9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW1pLCBuLCAmdG1wX2xpc3QsIGVpX2xpc3QpIHsKIAkJbGlzdF9kZWwoJmVtaS0+ZWlfbGlzdCk7CiAJCWtmcmVlKGVtaSk7CiAJfQpAQCAtMzc3LDM3ICszNzMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBleHRlbnQgcmVjb3JkIHdoaWNoIGNvbnRhaW5zIGNsdXN0ZXIgI3ZfY2x1c3Rlci4KLSAqIC0xIGlzIHJldHVybmVkIGlmIGl0IHdhcyBub3QgZm91bmQuCi0gKgotICogU2hvdWxkIHdvcmsgZmluZSBvbiBpbnRlcmlvciBhbmQgZXh0ZXJpb3Igbm9kZXMuCi0gKi8KLXN0YXRpYyBpbnQgb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsCi0JCQkJICAgIHUzMiB2X2NsdXN0ZXIpCi17Ci0JaW50IHJldCA9IC0xOwotCWludCBpOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7Ci0JdTMyIHJlY19lbmQsIHJlY19zdGFydCwgY2x1c3RlcnM7Ci0KLQlmb3IoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKSB7Ci0JCXJlYyA9ICZlbC0+bF9yZWNzW2ldOwotCi0JCXJlY19zdGFydCA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKTsKLQkJY2x1c3RlcnMgPSBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7Ci0KLQkJcmVjX2VuZCA9IHJlY19zdGFydCArIGNsdXN0ZXJzOwotCi0JCWlmICh2X2NsdXN0ZXIgPj0gcmVjX3N0YXJ0ICYmIHZfY2x1c3RlciA8IHJlY19lbmQpIHsKLQkJCXJldCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KIGludCBvY2ZzMl9nZXRfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIHZfY2x1c3RlciwKIAkJICAgICAgIHUzMiAqcF9jbHVzdGVyLCB1MzIgKm51bV9jbHVzdGVycywKIAkJICAgICAgIHVuc2lnbmVkIGludCAqZXh0ZW50X2ZsYWdzKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIvZmlsZS5jCmluZGV4IDQ5NzliNjYuLmYwNGM3YWEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTI2Myw2ICsyNjMsNyBAQAogCWludCBzdGF0dXM7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKKwl1NjQgY2x1c3Rlcl9ieXRlczsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCkBAIC0yODYsNyArMjg3LDkgQEAKIAkvKgogCSAqIERvIHRoaXMgYmVmb3JlIHNldHRpbmcgaV9zaXplLgogCSAqLwotCXN0YXR1cyA9IG9jZnMyX3plcm9fdGFpbF9mb3JfdHJ1bmNhdGUoaW5vZGUsIGhhbmRsZSwgbmV3X2lfc2l6ZSk7CisJY2x1c3Rlcl9ieXRlcyA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLCBuZXdfaV9zaXplKTsKKwlzdGF0dXMgPSBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBuZXdfaV9zaXplLAorCQkJCQkgICAgICAgY2x1c3Rlcl9ieXRlcyk7CiAJaWYgKHN0YXR1cykgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTMyNiw5ICszMjksNiBAQAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfaV9zaXplKTsKIAotCXVubWFwX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSArIFBBR0VfU0laRSAtIDEsIDAsIDEpOwotCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIG5ld19pX3NpemUpOwotCiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBkaV9iaC0+Yl9kYXRhOwogCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewogCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERShpbm9kZS0+aV9zYiwgZmUpOwpAQCAtMzYzLDE2ICszNjMsMjMgQEAKIAlpZiAobmV3X2lfc2l6ZSA9PSBsZTY0X3RvX2NwdShmZS0+aV9zaXplKSkKIAkJZ290byBiYWlsOwogCisJZG93bl93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKIAkvKiBUaGlzIGZvcmNlcyBvdGhlciBub2RlcyB0byBzeW5jIGFuZCBkcm9wIHRoZWlyIHBhZ2VzLiBEbwogCSAqIHRoaXMgZXZlbiBpZiB3ZSBoYXZlIGEgdHJ1bmNhdGUgd2l0aG91dCBhbGxvY2F0aW9uIGNoYW5nZSAtCiAJICogb2NmczIgY2x1c3RlciBzaXplcyBjYW4gYmUgbXVjaCBncmVhdGVyIHRoYW4gcGFnZSBzaXplLCBzbwogCSAqIHdlIGhhdmUgdG8gdHJ1bmNhdGUgdGhlbSBhbnl3YXkuICAqLwogCXN0YXR1cyA9IG9jZnMyX2RhdGFfbG9jayhpbm9kZSwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKKwkJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KIAorCXVubWFwX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSArIFBBR0VfU0laRSAtIDEsIDAsIDEpOworCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIG5ld19pX3NpemUpOworCiAJLyogYWxyaWdodCwgd2UncmUgZ29pbmcgdG8gbmVlZCB0byBkbyBhIGZ1bGwgYmxvd24gYWxsb2Mgc2l6ZQogCSAqIGNoYW5nZS4gT3JwaGFuIHRoZSBpbm9kZSBzbyB0aGF0IHJlY292ZXJ5IGNhbiBjb21wbGV0ZSB0aGUKIAkgKiB0cnVuY2F0ZSBpZiBuZWNlc3NhcnkuIFRoaXMgZG9lcyB0aGUgdGFzayBvZiBtYXJraW5nCkBAIC0zOTksNiArNDA2LDggQEAKIGJhaWxfdW5sb2NrX2RhdGE6CiAJb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOwogCisJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCiBiYWlsOgogCiAJbWxvZ19leGl0KHN0YXR1cyk7CkBAIC00MTksNiArNDI4LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICAgIHUzMiAqbG9naWNhbF9vZmZzZXQsCiAJCQkgICAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSAgICAgICBpbnQgbWFya191bndyaXR0ZW4sCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLApAQCAtNDMxLDkgKzQ0MSwxMyBAQAogCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHJlYXNvbiA9IFJFU1RBUlRfTk9ORTsKIAl1MzIgYml0X29mZiwgbnVtX2JpdHM7CiAJdTY0IGJsb2NrOworCXU4IGZsYWdzID0gMDsKIAogCUJVR19PTighY2x1c3RlcnNfdG9fYWRkKTsKIAorCWlmIChtYXJrX3Vud3JpdHRlbikKKwkJZmxhZ3MgPSBPQ0ZTMl9FWFRfVU5XUklUVEVOOworCiAJZnJlZV9leHRlbnRzID0gb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhvc2IsIGlub2RlLCBmZSk7CiAJaWYgKGZyZWVfZXh0ZW50cyA8IDApIHsKIAkJc3RhdHVzID0gZnJlZV9leHRlbnRzOwpAQCAtNDgzLDcgKzQ5Nyw3IEBACiAJICAgICBudW1fYml0cywgYml0X29mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwogCXN0YXR1cyA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGlub2RlLCBmZV9iaCwKIAkJCQkgICAgICpsb2dpY2FsX29mZnNldCwgYmxvY2ssIG51bV9iaXRzLAotCQkJCSAgICAgbWV0YV9hYyk7CisJCQkJICAgICBmbGFncywgbWV0YV9hYyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwpAQCAtNTE2LDI1ICs1MzAsMzEgQEAKICAqIEZvciBhIGdpdmVuIGFsbG9jYXRpb24sIGRldGVybWluZSB3aGljaCBhbGxvY2F0b3JzIHdpbGwgbmVlZCB0byBiZQogICogYWNjZXNzZWQsIGFuZCBsb2NrIHRoZW0sIHJlc2VydmluZyB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJpdHMuCiAgKgotICogQ2FsbGVkIGZyb20gb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oKSBmb3IgZmlsZSBzeXN0ZW1zIHdoaWNoIGRvbid0Ci0gKiBzdXBwb3J0IGhvbGVzLCBhbmQgZnJvbSBvY2ZzMl93cml0ZSgpIGZvciBmaWxlIHN5c3RlbXMgd2hpY2gKLSAqIHVuZGVyc3RhbmQgc3BhcnNlIGlub2Rlcy4KKyAqIFNwYXJzZSBmaWxlIHN5c3RlbXMgY2FsbCB0aGlzIGZyb20gb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKCkKKyAqIGFuZCBvY2ZzMl9hbGxvY2F0ZV91bndyaXR0ZW5fZXh0ZW50cygpLgorICoKKyAqIEZpbGUgc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IGhvbGVzIGNhbGwgdGhpcyBmcm9tCisgKiBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbigpLgogICovCiBpbnQgb2NmczJfbG9ja19hbGxvY2F0b3JzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAotCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLAorCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLCB1MzIgZXh0ZW50c190b19zcGxpdCwKIAkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKipkYXRhX2FjLAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKm1ldGFfYWMpCiB7Ci0JaW50IHJldCwgbnVtX2ZyZWVfZXh0ZW50czsKKwlpbnQgcmV0ID0gMCwgbnVtX2ZyZWVfZXh0ZW50czsKKwl1bnNpZ25lZCBpbnQgbWF4X3JlY3NfbmVlZGVkID0gY2x1c3RlcnNfdG9fYWRkICsgMiAqIGV4dGVudHNfdG9fc3BsaXQ7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAKIAkqbWV0YV9hYyA9IE5VTEw7Ci0JKmRhdGFfYWMgPSBOVUxMOworCWlmIChkYXRhX2FjKQorCQkqZGF0YV9hYyA9IE5VTEw7CisKKwlCVUdfT04oY2x1c3RlcnNfdG9fYWRkICE9IDAgJiYgZGF0YV9hYyA9PSBOVUxMKTsKIAogCW1sb2coMCwgImV4dGVuZCBpbm9kZSAlbGx1LCBpX3NpemUgPSAlbGxkLCBkaS0+aV9jbHVzdGVycyA9ICV1LCAiCi0JICAgICAiY2x1c3RlcnNfdG9fYWRkID0gJXVcbiIsCisJICAgICAiY2x1c3RlcnNfdG9fYWRkID0gJXUsIGV4dGVudHNfdG9fc3BsaXQgPSAldVxuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBpX3NpemVfcmVhZChpbm9kZSksCi0JICAgICBsZTMyX3RvX2NwdShkaS0+aV9jbHVzdGVycyksIGNsdXN0ZXJzX3RvX2FkZCk7CisJICAgICBsZTMyX3RvX2NwdShkaS0+aV9jbHVzdGVycyksIGNsdXN0ZXJzX3RvX2FkZCwgZXh0ZW50c190b19zcGxpdCk7CiAKIAludW1fZnJlZV9leHRlbnRzID0gb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhvc2IsIGlub2RlLCBkaSk7CiAJaWYgKG51bV9mcmVlX2V4dGVudHMgPCAwKSB7CkBAIC01NTIsOSArNTcyLDEyIEBACiAJICoKIAkgKiBNb3N0IG9mIHRoZSB0aW1lIHdlJ2xsIG9ubHkgYmUgc2VlaW5nIHRoaXMgMSBjbHVzdGVyIGF0IGEgdGltZQogCSAqIGFueXdheS4KKwkgKgorCSAqIEFsd2F5cyBsb2NrIGZvciBhbnkgdW53cml0dGVuIGV4dGVudHMgLSB3ZSBtaWdodCB3YW50IHRvCisJICogYWRkIGJsb2NrcyBkdXJpbmcgYSBzcGxpdC4KIAkgKi8KIAlpZiAoIW51bV9mcmVlX2V4dGVudHMgfHwKLQkgICAgKG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpICYmIG51bV9mcmVlX2V4dGVudHMgPCBjbHVzdGVyc190b19hZGQpKSB7CisJICAgIChvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSAmJiBudW1fZnJlZV9leHRlbnRzIDwgbWF4X3JlY3NfbmVlZGVkKSkgewogCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGRpLCBtZXRhX2FjKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVOT1NQQykKQEAgLTU2Myw2ICs1ODYsOSBAQAogCQl9CiAJfQogCisJaWYgKGNsdXN0ZXJzX3RvX2FkZCA9PSAwKQorCQlnb3RvIG91dDsKKwogCXJldCA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCBjbHVzdGVyc190b19hZGQsIGRhdGFfYWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWlmIChyZXQgIT0gLUVOT1NQQykKQEAgLTU4NSwxNCArNjExLDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgIHUzMiBjbHVzdGVyc190b19hZGQpCitzdGF0aWMgaW50IF9fb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGxvZ2ljYWxfc3RhcnQsCisJCQkJICAgICB1MzIgY2x1c3RlcnNfdG9fYWRkLCBpbnQgbWFya191bndyaXR0ZW4pCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IHJlc3RhcnRfZnVuYyA9IDA7Ci0JaW50IGRyb3BfYWxsb2Nfc2VtID0gMDsKIAlpbnQgY3JlZGl0czsKLQl1MzIgcHJldl9jbHVzdGVycywgbG9naWNhbF9zdGFydDsKKwl1MzIgcHJldl9jbHVzdGVyczsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSA9IE5VTEw7CiAJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CkBAIC02MDcsNyArNjMyLDcgQEAKIAkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIGZvciBmaWxlIHN5c3RlbXMgd2hpY2ggZG9uJ3QKIAkgKiBzdXBwb3J0IGhvbGVzLgogCSAqLwotCUJVR19PTihvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSk7CisJQlVHX09OKG1hcmtfdW53cml0dGVuICYmICFvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSk7CiAKIAlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmYmgsCiAJCQkJICBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKQEAgLTYyMywxOSArNjQ4LDEwIEBACiAJCWdvdG8gbGVhdmU7CiAJfQogCi0JbG9naWNhbF9zdGFydCA9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVyczsKLQogcmVzdGFydF9hbGw6CiAJQlVHX09OKGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSAhPSBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOwogCi0JLyogYmxvY2tzIHBlb3BlIGluIHJlYWQvd3JpdGUgZnJvbSByZWFkaW5nIG91ciBhbGxvY2F0aW9uCi0JICogdW50aWwgd2UncmUgZG9uZSBjaGFuZ2luZyBpdC4gV2UgZGVwZW5kIG9uIGlfbXV0ZXggdG8gYmxvY2sKLQkgKiBvdGhlciBleHRlbmQvdHJ1bmNhdGUgY2FsbHMgd2hpbGUgd2UncmUgaGVyZS4gT3JkZXJpbmcgd3J0Ci0JICogc3RhcnRfdHJhbnMgaXMgaW1wb3J0YW50IGhlcmUgLS0gYWx3YXlzIGRvIGl0IGJlZm9yZSEgKi8KLQlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKLQlkcm9wX2FsbG9jX3NlbSA9IDE7Ci0KLQlzdGF0dXMgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGZlLCBjbHVzdGVyc190b19hZGQsICZkYXRhX2FjLAorCXN0YXR1cyA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgZmUsIGNsdXN0ZXJzX3RvX2FkZCwgMCwgJmRhdGFfYWMsCiAJCQkJICAgICAgICZtZXRhX2FjKTsKIAlpZiAoc3RhdHVzKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTY2OCw2ICs2ODQsNyBAQAogCQkJCQkgICAgaW5vZGUsCiAJCQkJCSAgICAmbG9naWNhbF9zdGFydCwKIAkJCQkJICAgIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCQkJICAgIG1hcmtfdW53cml0dGVuLAogCQkJCQkgICAgYmgsCiAJCQkJCSAgICBoYW5kbGUsCiAJCQkJCSAgICBkYXRhX2FjLApAQCAtNzIwLDEwICs3MzcsNiBAQAogCSAgICAgT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzLCBpX3NpemVfcmVhZChpbm9kZSkpOwogCiBsZWF2ZToKLQlpZiAoZHJvcF9hbGxvY19zZW0pIHsKLQkJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwotCQlkcm9wX2FsbG9jX3NlbSA9IDA7Ci0JfQogCWlmIChoYW5kbGUpIHsKIAkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTc0OSw2ICs3NjIsMjUgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgaW50IG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBsb2dpY2FsX3N0YXJ0LAorCQkJCSAgIHUzMiBjbHVzdGVyc190b19hZGQsIGludCBtYXJrX3Vud3JpdHRlbikKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUaGUgYWxsb2Mgc2VtIGJsb2NrcyBwZW9wZSBpbiByZWFkL3dyaXRlIGZyb20gcmVhZGluZyBvdXIKKwkgKiBhbGxvY2F0aW9uIHVudGlsIHdlJ3JlIGRvbmUgY2hhbmdpbmcgaXQuIFdlIGRlcGVuZCBvbgorCSAqIGlfbXV0ZXggdG8gYmxvY2sgb3RoZXIgZXh0ZW5kL3RydW5jYXRlIGNhbGxzIHdoaWxlIHdlJ3JlCisJICogaGVyZS4KKwkgKi8KKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwlyZXQgPSBfX29jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLCBsb2dpY2FsX3N0YXJ0LCBjbHVzdGVyc190b19hZGQsCisJCQkJCW1hcmtfdW53cml0dGVuKTsKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKiBTb21lIHBhcnRzIG9mIHRoaXMgdGFrZW4gZnJvbSBnZW5lcmljX2NvbnRfZXhwYW5kLCB3aGljaCB0dXJuZWQgb3V0CiAgKiB0byBiZSB0b28gZnJhZ2lsZSB0byBkbyBleGFjdGx5IHdoYXQgd2UgbmVlZCB3aXRob3V0IHVzIGhhdmluZyB0bwogICogd29ycnkgYWJvdXQgcmVjdXJzaXZlIGxvY2tpbmcgaW4gLT5wcmVwYXJlX3dyaXRlKCkgYW5kCkBAIC04OTAsNyArOTIyLDkgQEAKIAl9CiAKIAlpZiAoY2x1c3RlcnNfdG9fYWRkKSB7Ci0JCXJldCA9IG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLCBjbHVzdGVyc190b19hZGQpOworCQlyZXQgPSBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihpbm9kZSwKKwkJCQkJICAgICAgT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzLAorCQkJCQkgICAgICBjbHVzdGVyc190b19hZGQsIDApOwogCQlpZiAocmV0IDwgMCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXRfdW5sb2NrOwpAQCAtOTk1LDYgKzEwMjksMTMgQEAKIAkJZ290byBiYWlsX3VubG9jazsKIAl9CiAKKwkvKgorCSAqIFRoaXMgd2lsbCBpbnRlbnRpb25hbGx5IG5vdCB3aW5kIHVwIGNhbGxpbmcgdm10cnVuY2F0ZSgpLAorCSAqIHNpbmNlIGFsbCB0aGUgd29yayBmb3IgYSBzaXplIGNoYW5nZSBoYXMgYmVlbiBkb25lIGFib3ZlLgorCSAqIE90aGVyd2lzZSwgd2UgY291bGQgZ2V0IGludG8gcHJvYmxlbXMgd2l0aCB0cnVuY2F0ZSBhcworCSAqIGlwX2FsbG9jX3NlbSBpcyB1c2VkIHRoZXJlIHRvIHByb3RlY3QgYWdhaW5zdCBpX3NpemUKKwkgKiBjaGFuZ2VzLgorCSAqLwogCXN0YXR1cyA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGF0dHIpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTEwNzAsMTcgKzExMTEsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IF9fb2NmczJfd3JpdGVfcmVtb3ZlX3N1aWQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCiAJbWxvZ19lbnRyeSgiKElub2RlICVsbHUsIG1vZGUgMCVvKVxuIiwKLQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8sIGlub2RlLT5pX21vZGUpOworCQkgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgaW5vZGUtPmlfbW9kZSk7CiAKIAloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKIAlpZiAoaGFuZGxlID09IE5VTEwpIHsKQEAgLTEwODksMTcgKzExMjksMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIG9pLT5pcF9ibGtubywgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKLQlpZiAocmV0IDwgMCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X3RyYW5zOwotCX0KLQogCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAogCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2JoOworCQlnb3RvIG91dF90cmFuczsKIAl9CiAKIAlpbm9kZS0+aV9tb2RlICY9IH5TX0lTVUlEOwpAQCAtMTExMiw4ICsxMTQ2LDcgQEAKIAlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOwogCWlmIChyZXQgPCAwKQogCQltbG9nX2Vycm5vKHJldCk7Ci1vdXRfYmg6Ci0JYnJlbHNlKGJoKTsKKwogb3V0X3RyYW5zOgogCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiBvdXQ6CkBAIC0xMTU5LDYgKzExOTIsNDYwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBvY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCByZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKKwkJCSAgICAgICBvaS0+aXBfYmxrbm8sICZiaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAgX19vY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChpbm9kZSwgYmgpOworb3V0OgorCWJyZWxzZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGVub3VnaCBleHRlbnRzIHRvIGNvdmVyIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgYnl0ZSBvZmZzZXQKKyAqIHN0YXJ0IGZvciBsZW4gYnl0ZXMuIEV4aXN0aW5nIGV4dGVudHMgYXJlIHNraXBwZWQsIGFueSBleHRlbnRzCisgKiBhZGRlZCBhcmUgbWFya2VkIGFzICJ1bndyaXR0ZW4iLgorICovCitzdGF0aWMgaW50IG9jZnMyX2FsbG9jYXRlX3Vud3JpdHRlbl9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJaW50IHJldDsKKwl1MzIgY3BvcywgcGh5c19jcG9zLCBjbHVzdGVycywgYWxsb2Nfc2l6ZTsKKworCS8qCisJICogV2UgY29uc2lkZXIgYm90aCBzdGFydCBhbmQgbGVuIHRvIGJlIGluY2x1c2l2ZS4KKwkgKi8KKwljcG9zID0gc3RhcnQgPj4gT0NGUzJfU0IoaW5vZGUtPmlfc2IpLT5zX2NsdXN0ZXJzaXplX2JpdHM7CisJY2x1c3RlcnMgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsIHN0YXJ0ICsgbGVuKTsKKwljbHVzdGVycyAtPSBjcG9zOworCisJd2hpbGUgKGNsdXN0ZXJzKSB7CisJCXJldCA9IG9jZnMyX2dldF9jbHVzdGVycyhpbm9kZSwgY3BvcywgJnBoeXNfY3BvcywKKwkJCQkJICZhbGxvY19zaXplLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBIb2xlIG9yIGV4aXN0aW5nIGV4dGVudCBsZW4gY2FuIGJlIGFyYml0cmFyeSwgc28KKwkJICogY2FwIGl0IHRvIG91ciBvd24gYWxsb2NhdGlvbiByZXF1ZXN0LgorCQkgKi8KKwkJaWYgKGFsbG9jX3NpemUgPiBjbHVzdGVycykKKwkJCWFsbG9jX3NpemUgPSBjbHVzdGVyczsKKworCQlpZiAocGh5c19jcG9zKSB7CisJCQkvKgorCQkJICogV2UgYWxyZWFkeSBoYXZlIGFuIGFsbG9jYXRpb24gYXQgdGhpcworCQkJICogcmVnaW9uIHNvIHdlIGNhbiBzYWZlbHkgc2tpcCBpdC4KKwkJCSAqLworCQkJZ290byBuZXh0OworCQl9CisKKwkJcmV0ID0gX19vY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihpbm9kZSwgY3BvcywgYWxsb2Nfc2l6ZSwgMSk7CisJCWlmIChyZXQpIHsKKwkJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCituZXh0OgorCQljcG9zICs9IGFsbG9jX3NpemU7CisJCWNsdXN0ZXJzIC09IGFsbG9jX3NpemU7CisJfQorCisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgICAgICB1MzIgY3BvcywgdTMyIHBoeXNfY3BvcywgdTMyIGxlbiwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKK3sKKwlpbnQgcmV0OworCXU2NCBwaHlzX2Jsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwaHlzX2Nwb3MpOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgZGksIDAsIDEsIE5VTEwsICZtZXRhX2FjKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltdXRleF9sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CisKKwlpZiAob2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKG9zYikpIHsKKwkJcmV0ID0gX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2cob3NiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9SRU1PVkVfRVhURU5UX0NSRURJVFMpOworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVtb3ZlX2V4dGVudChpbm9kZSwgZGlfYmgsIGNwb3MsIGxlbiwgaGFuZGxlLCBtZXRhX2FjLAorCQkJCSAgZGVhbGxvYyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMgLT0gbGVuOworCWRpLT5pX2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIoT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKG9zYiwgaGFuZGxlLCBwaHlzX2Jsa25vLCBsZW4pOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0X2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKG1ldGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUcnVuY2F0ZSBhIGJ5dGUgcmFuZ2UsIGF2b2lkaW5nIHBhZ2VzIHdpdGhpbiBwYXJ0aWFsIGNsdXN0ZXJzLiBUaGlzCisgKiBwcmVzZXJ2ZXMgdGhvc2UgcGFnZXMgZm9yIHRoZSB6ZXJvaW5nIGNvZGUgdG8gd3JpdGUgdG8uCisgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX3RydW5jYXRlX2NsdXN0ZXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGJ5dGVfc3RhcnQsCisJCQkJCSB1NjQgYnl0ZV9sZW4pCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJbG9mZl90IHN0YXJ0LCBlbmQ7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCisJc3RhcnQgPSAobG9mZl90KW9jZnMyX2FsaWduX2J5dGVzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLCBieXRlX3N0YXJ0KTsKKwllbmQgPSBieXRlX3N0YXJ0ICsgYnl0ZV9sZW47CisJZW5kID0gZW5kICYgfihvc2ItPnNfY2x1c3RlcnNpemUgLSAxKTsKKworCWlmIChzdGFydCA8IGVuZCkgeworCQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQgLSBzdGFydCwgMCk7CisJCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQgLSAxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfemVyb19wYXJ0aWFsX2NsdXN0ZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1NjQgdG1wZW5kLCBlbmQgPSBzdGFydCArIGxlbjsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwl1bnNpZ25lZCBpbnQgY3NpemUgPSBvc2ItPnNfY2x1c3RlcnNpemU7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCS8qCisJICogVGhlICJzdGFydCIgYW5kICJlbmQiIHZhbHVlcyBhcmUgTk9UIG5lY2Vzc2FyaWx5IHBhcnQgb2YKKwkgKiB0aGUgcmFuZ2Ugd2hvc2UgYWxsb2NhdGlvbiBpcyBiZWluZyBkZWxldGVkLiBSYXRoZXIsIHRoaXMKKwkgKiBpcyB3aGF0IHRoZSB1c2VyIHBhc3NlZCBpbiB3aXRoIHRoZSByZXF1ZXN0LiBXZSBtdXN0IHplcm8KKwkgKiBwYXJ0aWFsIGNsdXN0ZXJzIGhlcmUuIFRoZXJlJ3Mgbm8gbmVlZCB0byB3b3JyeSBhYm91dAorCSAqIHBoeXNpY2FsIGFsbG9jYXRpb24gLSB0aGUgemVyb2luZyBjb2RlIGtub3dzIHRvIHNraXAgaG9sZXMuCisJICovCisJbWxvZygwLCAiYnl0ZSBzdGFydDogJWxsdSwgZW5kOiAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmQpOworCisJLyoKKwkgKiBJZiBib3RoIGVkZ2VzIGFyZSBvbiBhIGNsdXN0ZXIgYm91bmRhcnkgdGhlbiB0aGVyZSdzIG5vCisJICogemVyb2luZyByZXF1aXJlZCBhcyB0aGUgcmVnaW9uIGlzIHBhcnQgb2YgdGhlIGFsbG9jYXRpb24gdG8KKwkgKiBiZSB0cnVuY2F0ZWQuCisJICovCisJaWYgKChzdGFydCAmIChjc2l6ZSAtIDEpKSA9PSAwICYmIChlbmQgJiAoY3NpemUgLSAxKSkgPT0gMCkKKwkJZ290byBvdXQ7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFdlIHdhbnQgdG8gZ2V0IHRoZSBieXRlIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSAxc3QgY2x1c3Rlci4KKwkgKi8KKwl0bXBlbmQgPSAodTY0KW9zYi0+c19jbHVzdGVyc2l6ZSArIChzdGFydCAmIH4ob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSkpOworCWlmICh0bXBlbmQgPiBlbmQpCisJCXRtcGVuZCA9IGVuZDsKKworCW1sb2coMCwgIjFzdCByYW5nZTogc3RhcnQ6ICVsbHUsIHRtcGVuZDogJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpdG1wZW5kKTsKKworCXJldCA9IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIHN0YXJ0LCB0bXBlbmQpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworCWlmICh0bXBlbmQgPCBlbmQpIHsKKwkJLyoKKwkJICogVGhpcyBtYXkgbWFrZSBzdGFydCBhbmQgZW5kIGVxdWFsLCBidXQgdGhlIHplcm9pbmcKKwkJICogY29kZSB3aWxsIHNraXAgYW55IHdvcmsgaW4gdGhhdCBjYXNlIHNvIHRoZXJlJ3Mgbm8KKwkJICogbmVlZCB0byBjYXRjaCBpdCB1cCBoZXJlLgorCQkgKi8KKwkJc3RhcnQgPSBlbmQgJiB+KG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpOworCisJCW1sb2coMCwgIjJuZCByYW5nZTogc3RhcnQ6ICVsbHUsIGVuZDogJWxsdVxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKWVuZCk7CisKKwkJcmV0ID0gb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoaW5vZGUsIGhhbmRsZSwgc3RhcnQsIGVuZCk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJfQorCisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3JlbW92ZV9pbm9kZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLCB1NjQgYnl0ZV9zdGFydCwKKwkJCQkgICAgdTY0IGJ5dGVfbGVuKQoreworCWludCByZXQgPSAwOworCXUzMiB0cnVuY19zdGFydCwgdHJ1bmNfbGVuLCBjcG9zLCBwaHlzX2Nwb3MsIGFsbG9jX3NpemU7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgZGVhbGxvYzsKKworCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCZkZWFsbG9jKTsKKworCWlmIChieXRlX2xlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCXRydW5jX3N0YXJ0ID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKG9zYi0+c2IsIGJ5dGVfc3RhcnQpOworCXRydW5jX2xlbiA9IChieXRlX3N0YXJ0ICsgYnl0ZV9sZW4pID4+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOworCWlmICh0cnVuY19sZW4gPj0gdHJ1bmNfc3RhcnQpCisJCXRydW5jX2xlbiAtPSB0cnVuY19zdGFydDsKKwllbHNlCisJCXRydW5jX2xlbiA9IDA7CisKKwltbG9nKDAsICJJbm9kZTogJWxsdSwgc3RhcnQ6ICVsbHUsIGxlbjogJWxsdSwgY3N0YXJ0OiAldSwgY2xlbjogJXVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnl0ZV9zdGFydCwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnl0ZV9sZW4sIHRydW5jX3N0YXJ0LCB0cnVuY19sZW4pOworCisJcmV0ID0gb2NmczJfemVyb19wYXJ0aWFsX2NsdXN0ZXJzKGlub2RlLCBieXRlX3N0YXJ0LCBieXRlX2xlbik7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWNwb3MgPSB0cnVuY19zdGFydDsKKwl3aGlsZSAodHJ1bmNfbGVuKSB7CisJCXJldCA9IG9jZnMyX2dldF9jbHVzdGVycyhpbm9kZSwgY3BvcywgJnBoeXNfY3BvcywKKwkJCQkJICZhbGxvY19zaXplLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoYWxsb2Nfc2l6ZSA+IHRydW5jX2xlbikKKwkJCWFsbG9jX3NpemUgPSB0cnVuY19sZW47CisKKwkJLyogT25seSBkbyB3b3JrIGZvciBub24taG9sZXMgKi8KKwkJaWYgKHBoeXNfY3BvcyAhPSAwKSB7CisJCQlyZXQgPSBfX29jZnMyX3JlbW92ZV9pbm9kZV9yYW5nZShpbm9kZSwgZGlfYmgsIGNwb3MsCisJCQkJCQkJIHBoeXNfY3BvcywgYWxsb2Nfc2l6ZSwKKwkJCQkJCQkgJmRlYWxsb2MpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWNwb3MgKz0gYWxsb2Nfc2l6ZTsKKwkJdHJ1bmNfbGVuIC09IGFsbG9jX3NpemU7CisJfQorCisJb2NmczJfdHJ1bmNhdGVfY2x1c3Rlcl9wYWdlcyhpbm9kZSwgYnl0ZV9zdGFydCwgYnl0ZV9sZW4pOworCitvdXQ6CisJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7CisJb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJmRlYWxsb2MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBhcnRzIG9mIHRoaXMgZnVuY3Rpb24gdGFrZW4gZnJvbSB4ZnNfY2hhbmdlX2ZpbGVfc3BhY2UoKQorICovCitpbnQgb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2Uoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YgKnNyKQoreworCWludCByZXQ7CisJczY0IGxsZW47CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWF4X29mZiA9IG9jZnMyX21heF9maWxlX29mZnNldChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisKKwlpZiAoKGNtZCA9PSBPQ0ZTMl9JT0NfUkVTVlNQIHx8IGNtZCA9PSBPQ0ZTMl9JT0NfUkVTVlNQNjQpICYmCisJICAgICFvY2ZzMl93cml0ZXNfdW53cml0dGVuX2V4dGVudHMob3NiKSkKKwkJcmV0dXJuIC1FTk9UVFk7CisJZWxzZSBpZiAoKGNtZCA9PSBPQ0ZTMl9JT0NfVU5SRVNWU1AgfHwgY21kID09IE9DRlMyX0lPQ19VTlJFU1ZTUDY0KSAmJgorCQkgIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKQorCQlyZXR1cm4gLUVOT1RUWTsKKworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCXJldHVybiAtRUJBREY7CisKKwlpZiAob2NmczJfaXNfaGFyZF9yZWFkb25seShvc2IpIHx8IG9jZnMyX2lzX3NvZnRfcmVhZG9ubHkob3NiKSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCS8qCisJICogVGhpcyBwcmV2ZW50cyBjb25jdXJyZW50IHdyaXRlcyBvbiBvdGhlciBub2RlcworCSAqLworCXJldCA9IG9jZnMyX3J3X2xvY2soaW5vZGUsIDEpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsICZkaV9iaCwgMSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X3J3X3VubG9jazsKKwl9CisKKwlpZiAoaW5vZGUtPmlfZmxhZ3MgJiAoU19JTU1VVEFCTEV8U19BUFBFTkQpKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBvdXRfbWV0YV91bmxvY2s7CisJfQorCisJc3dpdGNoIChzci0+bF93aGVuY2UpIHsKKwljYXNlIDA6IC8qU0VFS19TRVQqLworCQlicmVhazsKKwljYXNlIDE6IC8qU0VFS19DVVIqLworCQlzci0+bF9zdGFydCArPSBmaWxlLT5mX3BvczsKKwkJYnJlYWs7CisJY2FzZSAyOiAvKlNFRUtfRU5EKi8KKwkJc3ItPmxfc3RhcnQgKz0gaV9zaXplX3JlYWQoaW5vZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisJc3ItPmxfd2hlbmNlID0gMDsKKworCWxsZW4gPSBzci0+bF9sZW4gPiAwID8gc3ItPmxfbGVuIC0gMSA6IHNyLT5sX2xlbjsKKworCWlmIChzci0+bF9zdGFydCA8IDAKKwkgICAgfHwgc3ItPmxfc3RhcnQgPiBtYXhfb2ZmCisJICAgIHx8IChzci0+bF9zdGFydCArIGxsZW4pIDwgMAorCSAgICB8fCAoc3ItPmxfc3RhcnQgKyBsbGVuKSA+IG1heF9vZmYpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfbWV0YV91bmxvY2s7CisJfQorCisJaWYgKGNtZCA9PSBPQ0ZTMl9JT0NfUkVTVlNQIHx8IGNtZCA9PSBPQ0ZTMl9JT0NfUkVTVlNQNjQpIHsKKwkJaWYgKHNyLT5sX2xlbiA8PSAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfbWV0YV91bmxvY2s7CisJCX0KKwl9CisKKwlpZiAoc2hvdWxkX3JlbW92ZV9zdWlkKGZpbGUtPmZfcGF0aC5kZW50cnkpKSB7CisJCXJldCA9IF9fb2NmczJfd3JpdGVfcmVtb3ZlX3N1aWQoaW5vZGUsIGRpX2JoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfbWV0YV91bmxvY2s7CisJCX0KKwl9CisKKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19SRVNWU1A2NDoKKwkJLyoKKwkJICogVGhpcyB0YWtlcyB1bnNpZ25lZCBvZmZzZXRzLCBidXQgdGhlIHNpZ25lZCBvbmVzIHdlCisJCSAqIHBhc3MgaGF2ZSBiZWVuIGNoZWNrZWQgYWdhaW5zdCBvdmVyZmxvdyBhYm92ZS4KKwkJICovCisJCXJldCA9IG9jZnMyX2FsbG9jYXRlX3Vud3JpdHRlbl9leHRlbnRzKGlub2RlLCBzci0+bF9zdGFydCwKKwkJCQkJCSAgICAgICBzci0+bF9sZW4pOworCQlicmVhazsKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDY0OgorCQlyZXQgPSBvY2ZzMl9yZW1vdmVfaW5vZGVfcmFuZ2UoaW5vZGUsIGRpX2JoLCBzci0+bF9zdGFydCwKKwkJCQkJICAgICAgIHNyLT5sX2xlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfbWV0YV91bmxvY2s7CisJfQorCisJLyoKKwkgKiBXZSB1cGRhdGUgYy9tdGltZSBmb3IgdGhlc2UgY2hhbmdlcworCSAqLworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfbWV0YV91bmxvY2s7CisJfQorCisJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKwlyZXQgPSBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUsIGRpX2JoKTsKKwlpZiAocmV0IDwgMCkKKwkJbWxvZ19lcnJubyhyZXQpOworCisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKworb3V0X21ldGFfdW5sb2NrOgorCWJyZWxzZShkaV9iaCk7CisJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOworb3V0X3J3X3VubG9jazoKKwlvY2ZzMl9yd191bmxvY2soaW5vZGUsIDEpOworCisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBvY2ZzMl9wcmVwYXJlX2lub2RlX2Zvcl93cml0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCSBsb2ZmX3QgKnBwb3MsCiAJCQkJCSBzaXplX3QgY291bnQsCkBAIC0xMzI5LDE1ICsxODE2LDE2IEBACiAJKmJhc2VwID0gYmFzZTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICogb2NmczJfZ2V0X3dyaXRlX3NvdXJjZShzdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiAqYnAsCitzdGF0aWMgc3RydWN0IHBhZ2UgKiBvY2ZzMl9nZXRfd3JpdGVfc291cmNlKGNoYXIgKipyZXRfc3JjX2J1ZiwKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqY3VyX2lvdiwKIAkJCQkJICAgIHNpemVfdCBpb3Zfb2Zmc2V0KQogewogCWludCByZXQ7Ci0JY2hhciAqYnVmOworCWNoYXIgKmJ1ZiA9IGN1cl9pb3YtPmlvdl9iYXNlICsgaW92X29mZnNldDsKIAlzdHJ1Y3QgcGFnZSAqc3JjX3BhZ2UgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgb2ZmOwogCi0JYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKyBpb3Zfb2Zmc2V0OworCW9mZiA9ICh1bnNpZ25lZCBsb25nKShidWYpICYgflBBR0VfQ0FDSEVfTUFTSzsKIAogCWlmICghc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgewogCQkvKgpAQCAtMTM0OSwxOCArMTgzNywxNyBAQAogCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpYnVmICYgUEFHRV9DQUNIRV9NQVNLLCAxLAogCQkJCSAgICAgMCwgMCwgJnNyY19wYWdlLCBOVUxMKTsKIAkJaWYgKHJldCA9PSAxKQotCQkJYnAtPmJfc3JjX2J1ZiA9IGttYXAoc3JjX3BhZ2UpOworCQkJKnJldF9zcmNfYnVmID0ga21hcChzcmNfcGFnZSkgKyBvZmY7CiAJCWVsc2UKIAkJCXNyY19wYWdlID0gRVJSX1BUUigtRUZBVUxUKTsKIAl9IGVsc2UgewotCQlicC0+Yl9zcmNfYnVmID0gYnVmOworCQkqcmV0X3NyY19idWYgPSBidWY7CiAJfQogCiAJcmV0dXJuIHNyY19wYWdlOwogfQogCi1zdGF0aWMgdm9pZCBvY2ZzMl9wdXRfd3JpdGVfc291cmNlKHN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2ICpicCwKLQkJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyB2b2lkIG9jZnMyX3B1dF93cml0ZV9zb3VyY2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaWYgKHBhZ2UpIHsKIAkJa3VubWFwKHBhZ2UpOwpAQCAtMTM3NiwxMCArMTg2MywxMiBAQAogewogCWludCByZXQgPSAwOwogCXNzaXplX3QgY29waWVkLCB0b3RhbCA9IDA7Ci0Jc2l6ZV90IGlvdl9vZmZzZXQgPSAwOworCXNpemVfdCBpb3Zfb2Zmc2V0ID0gMCwgYnl0ZXM7CisJbG9mZl90IHBvczsKIAljb25zdCBzdHJ1Y3QgaW92ZWMgKmN1cl9pb3YgPSBpb3Y7Ci0Jc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgYnA7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHBhZ2UgKnVzZXJfcGFnZSwgKnBhZ2U7CisJY2hhciAqYnVmLCAqZHN0OworCXZvaWQgKmZzZGF0YTsKIAogCS8qCiAJICogaGFuZGxlIHBhcnRpYWwgRElPIHdyaXRlLiAgQWRqdXN0IGN1cl9pb3YgaWYgbmVlZGVkLgpAQCAtMTM4NywyMSArMTg3NiwzOCBAQAogCW9jZnMyX3NldF9uZXh0X2lvdmVjKCZjdXJfaW92LCAmaW92X29mZnNldCwgb19kaXJlY3Rfd3JpdHRlbik7CiAKIAlkbyB7Ci0JCWJwLmJfY3VyX29mZiA9IGlvdl9vZmZzZXQ7Ci0JCWJwLmJfY3VyX2lvdiA9IGN1cl9pb3Y7CisJCXBvcyA9ICpwcG9zOwogCi0JCXBhZ2UgPSBvY2ZzMl9nZXRfd3JpdGVfc291cmNlKCZicCwgY3VyX2lvdiwgaW92X29mZnNldCk7Ci0JCWlmIChJU19FUlIocGFnZSkpIHsKLQkJCXJldCA9IFBUUl9FUlIocGFnZSk7CisJCXVzZXJfcGFnZSA9IG9jZnMyX2dldF93cml0ZV9zb3VyY2UoJmJ1ZiwgY3VyX2lvdiwgaW92X29mZnNldCk7CisJCWlmIChJU19FUlIodXNlcl9wYWdlKSkgeworCQkJcmV0ID0gUFRSX0VSUih1c2VyX3BhZ2UpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQljb3BpZWQgPSBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKGZpbGUsICpwcG9zLCBjb3VudCwKLQkJCQkJCSAgICAgIG9jZnMyX21hcF9hbmRfd3JpdGVfdXNlcl9kYXRhLAotCQkJCQkJICAgICAgJmJwKTsKKwkJLyogU3RheSB3aXRoaW4gb3VyIHBhZ2UgYm91bmRhcmllcyAqLworCQlieXRlcyA9IG1pbigoUEFHRV9DQUNIRV9TSVpFIC0gKCh1bnNpZ25lZCBsb25nKXBvcyAmIH5QQUdFX0NBQ0hFX01BU0spKSwKKwkJCSAgICAoUEFHRV9DQUNIRV9TSVpFIC0gKCh1bnNpZ25lZCBsb25nKWJ1ZiAmIH5QQUdFX0NBQ0hFX01BU0spKSk7CisJCS8qIFN0YXkgd2l0aGluIHRoZSB2ZWN0b3IgYm91bmRhcnkgKi8KKwkJYnl0ZXMgPSBtaW5fdChzaXplX3QsIGJ5dGVzLCBjdXJfaW92LT5pb3ZfbGVuIC0gaW92X29mZnNldCk7CisJCS8qIFN0YXkgd2l0aGluIGNvdW50ICovCisJCWJ5dGVzID0gbWluKGJ5dGVzLCBjb3VudCk7CiAKLQkJb2NmczJfcHV0X3dyaXRlX3NvdXJjZSgmYnAsIHBhZ2UpOworCQlwYWdlID0gTlVMTDsKKwkJcmV0ID0gb2NmczJfd3JpdGVfYmVnaW4oZmlsZSwgZmlsZS0+Zl9tYXBwaW5nLCBwb3MsIGJ5dGVzLCAwLAorCQkJCQkmcGFnZSwgJmZzZGF0YSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CiAKKwkJZHN0ID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1jcHkoZHN0ICsgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSksIGJ1ZiwgYnl0ZXMpOworCQlrdW5tYXBfYXRvbWljKGRzdCwgS01fVVNFUjApOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJb2NmczJfcHV0X3dyaXRlX3NvdXJjZSh1c2VyX3BhZ2UpOworCisJCWNvcGllZCA9IG9jZnMyX3dyaXRlX2VuZChmaWxlLCBmaWxlLT5mX21hcHBpbmcsIHBvcywgYnl0ZXMsCisJCQkJCSBieXRlcywgcGFnZSwgZnNkYXRhKTsKIAkJaWYgKGNvcGllZCA8IDApIHsKIAkJCW1sb2dfZXJybm8oY29waWVkKTsKIAkJCXJldCA9IGNvcGllZDsKQEAgLTE0MDksNyArMTkxNSw3IEBACiAJCX0KIAogCQl0b3RhbCArPSBjb3BpZWQ7Ci0JCSpwcG9zID0gKnBwb3MgKyBjb3BpZWQ7CisJCSpwcG9zID0gcG9zICsgY29waWVkOwogCQljb3VudCAtPSBjb3BpZWQ7CiAKIAkJb2NmczJfc2V0X25leHRfaW92ZWMoJmN1cl9pb3YsICZpb3Zfb2Zmc2V0LCBjb3BpZWQpOwpAQCAtMTU3OSw1MiArMjA4NSw0NiBAQAogCQkJCSAgICBzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiwKIAkJCQkgICAgc3RydWN0IHNwbGljZV9kZXNjICpzZCkKIHsKLQlpbnQgcmV0LCBjb3VudCwgdG90YWwgPSAwOworCWludCByZXQsIGNvdW50OwogCXNzaXplX3QgY29waWVkID0gMDsKLQlzdHJ1Y3Qgb2NmczJfc3BsaWNlX3dyaXRlX3ByaXYgc3A7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBzZC0+dS5maWxlOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXZvaWQgKmZzZGF0YTsKKwljaGFyICpzcmMsICpkc3Q7CiAKIAlyZXQgPSBidWYtPm9wcy0+Y29uZmlybShwaXBlLCBidWYpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0Jc3Auc19zZCA9IHNkOwotCXNwLnNfYnVmID0gYnVmOwotCXNwLnNfcGlwZSA9IHBpcGU7Ci0Jc3Auc19vZmZzZXQgPSBzZC0+cG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKLQlzcC5zX2J1Zl9vZmZzZXQgPSBidWYtPm9mZnNldDsKLQorCW9mZnNldCA9IHNkLT5wb3MgJiB+UEFHRV9DQUNIRV9NQVNLOwogCWNvdW50ID0gc2QtPmxlbjsKLQlpZiAoY291bnQgKyBzcC5zX29mZnNldCA+IFBBR0VfQ0FDSEVfU0laRSkKLQkJY291bnQgPSBQQUdFX0NBQ0hFX1NJWkUgLSBzcC5zX29mZnNldDsKKwlpZiAoY291bnQgKyBvZmZzZXQgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCWNvdW50ID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OwogCi0JZG8gewotCQkvKgotCQkgKiBzcGxpY2Ugd2FudHMgdXMgdG8gY29weSB1cCB0byBvbmUgcGFnZSBhdCBhCi0JCSAqIHRpbWUuIEZvciBwYWdlc2l6ZSA+IGNsdXN0ZXIgc2l6ZSwgdGhpcyBtZWFucyB3ZQotCQkgKiBtaWdodCBlbnRlciBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKCkgbW9yZQotCQkgKiB0aGFuIG9uY2UsIHNvIGtlZXAgdHJhY2sgb2Ygb3VyIHByb2dyZXNzIGhlcmUuCi0JCSAqLwotCQljb3BpZWQgPSBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKHNkLT51LmZpbGUsCi0JCQkJCQkgICAgICAobG9mZl90KXNkLT5wb3MgKyB0b3RhbCwKLQkJCQkJCSAgICAgIGNvdW50LAotCQkJCQkJICAgICAgb2NmczJfbWFwX2FuZF93cml0ZV9zcGxpY2VfZGF0YSwKLQkJCQkJCSAgICAgICZzcCk7Ci0JCWlmIChjb3BpZWQgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKGNvcGllZCk7Ci0JCQlyZXQgPSBjb3BpZWQ7Ci0JCQlnb3RvIG91dDsKLQkJfQorCXJldCA9IG9jZnMyX3dyaXRlX2JlZ2luKGZpbGUsIGZpbGUtPmZfbWFwcGluZywgc2QtPnBvcywgY291bnQsIDAsCisJCQkJJnBhZ2UsICZmc2RhdGEpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CiAKLQkJY291bnQgLT0gY29waWVkOwotCQlzcC5zX29mZnNldCArPSBjb3BpZWQ7Ci0JCXNwLnNfYnVmX29mZnNldCArPSBjb3BpZWQ7Ci0JCXRvdGFsICs9IGNvcGllZDsKLQl9IHdoaWxlIChjb3VudCk7CisJc3JjID0gYnVmLT5vcHMtPm1hcChwaXBlLCBidWYsIDEpOworCWRzdCA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIxKTsKKwltZW1jcHkoZHN0ICsgb2Zmc2V0LCBzcmMgKyBidWYtPm9mZnNldCwgY291bnQpOworCWt1bm1hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOworCWJ1Zi0+b3BzLT51bm1hcChwaXBlLCBidWYsIHNyYyk7CiAKLQlyZXQgPSAwOworCWNvcGllZCA9IG9jZnMyX3dyaXRlX2VuZChmaWxlLCBmaWxlLT5mX21hcHBpbmcsIHNkLT5wb3MsIGNvdW50LCBjb3VudCwKKwkJCQkgcGFnZSwgZnNkYXRhKTsKKwlpZiAoY29waWVkIDwgMCkgeworCQltbG9nX2Vycm5vKGNvcGllZCk7CisJCXJldCA9IGNvcGllZDsKKwkJZ290byBvdXQ7CisJfQogb3V0OgogCi0JcmV0dXJuIHRvdGFsID8gdG90YWwgOiByZXQ7CisJcmV0dXJuIGNvcGllZCA/IGNvcGllZCA6IHJldDsKIH0KIAogc3RhdGljIHNzaXplX3QgX19vY2ZzMl9maWxlX3NwbGljZV93cml0ZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5oIGIvZnMvb2NmczIvZmlsZS5oCmluZGV4IGE0ZGQxZmEuLjM2ZmUyN2YgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuaAorKysgYi9mcy9vY2ZzMi9maWxlLmgKQEAgLTM5LDE1ICszOSwxNiBAQAogfTsKIGludCBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgIHUzMiAqY2x1c3Rlcl9zdGFydCwKKwkJCSAgICAgICB1MzIgKmxvZ2ljYWxfb2Zmc2V0LAogCQkJICAgICAgIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgICAgICAgaW50IG1hcmtfdW53cml0dGVuLAogCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKIAkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKLQkJCSAgICAgICBlbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCAqcmVhc29uKTsKKwkJCSAgICAgICBlbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCAqcmVhc29uX3JldCk7CiBpbnQgb2NmczJfbG9ja19hbGxvY2F0b3JzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAotCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLAorCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLCB1MzIgZXh0ZW50c190b19zcGxpdCwKIAkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKipkYXRhX2FjLAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKm1ldGFfYWMpOwogaW50IG9jZnMyX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwpAQCAtNjEsNCArNjIsNyBAQAogaW50IG9jZnMyX3VwZGF0ZV9pbm9kZV9hdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAoraW50IG9jZnMyX2NoYW5nZV9maWxlX3NwYWNlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2ICpzcik7CisKICNlbmRpZiAvKiBPQ0ZTMl9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2hlYXJ0YmVhdC5jIGIvZnMvb2NmczIvaGVhcnRiZWF0LmMKaW5kZXggYjI1ZWY2My4uMzUyZWI0YSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvaGVhcnRiZWF0LmMKQEAgLTE1NywxNiArMTU3LDE2IEBACiAJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpCiAJCXJldHVybiAwOwogCi0Jc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmb3NiLT5vc2JfaGJfZG93bik7CisJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfZG93bik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmb3NiLT5vc2JfaGJfdXApOworCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2sob3NiLT51dWlkX3N0ciwgJm9zYi0+b3NiX2hiX3VwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmb3NiLT5vc2JfaGJfZG93bik7CisJCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfZG93bik7CiAJfQogCiBiYWlsOgpAQCAtMTc4LDggKzE3OCw4IEBACiAJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpCiAJCXJldHVybjsKIAotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmb3NiLT5vc2JfaGJfZG93bik7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl91cCk7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl9kb3duKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2sob3NiLT51dWlkX3N0ciwgJm9zYi0+b3NiX2hiX3VwKTsKIH0KIAogdm9pZCBvY2ZzMl9zdG9wX2hlYXJ0YmVhdChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2lvY3RsLmMgYi9mcy9vY2ZzMi9pb2N0bC5jCmluZGV4IGYzYWQyMWEuLmJkNjhjM2YgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2lvY3RsLmMKKysrIGIvZnMvb2NmczIvaW9jdGwuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgIm9jZnMyLmgiCiAjaW5jbHVkZSAiYWxsb2MuaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCisjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAiam91cm5hbC5oIgogCkBAIC0xMTUsNiArMTE2LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdiBzcjsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBPQ0ZTMl9JT0NfR0VURkxBR1M6CkBAIC0xMzAsNiArMTMyLDE0IEBACiAKIAkJcmV0dXJuIG9jZnMyX3NldF9pbm9kZV9hdHRyKGlub2RlLCBmbGFncywKIAkJCU9DRlMyX0ZMX01PRElGSUFCTEUpOworCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19SRVNWU1A2NDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDY0OgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnNyLCAoaW50IF9fdXNlciAqKSBhcmcsIHNpemVvZihzcikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIG9jZnMyX2NoYW5nZV9maWxlX3NwYWNlKGZpbHAsIGNtZCwgJnNyKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1RUWTsKIAl9CkBAIC0xNDgsNiArMTU4LDExIEBACiAJY2FzZSBPQ0ZTMl9JT0MzMl9TRVRGTEFHUzoKIAkJY21kID0gT0NGUzJfSU9DX1NFVEZMQUdTOwogCQlicmVhazsKKwljYXNlIE9DRlMyX0lPQ19SRVNWU1A6CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQNjQ6CisJY2FzZSBPQ0ZTMl9JT0NfVU5SRVNWU1A6CisJY2FzZSBPQ0ZTMl9JT0NfVU5SRVNWU1A2NDoKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAl9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9qb3VybmFsLmMgYi9mcy9vY2ZzMi9qb3VybmFsLmMKaW5kZXggZGMxMTg4MC4uZGJmYjIwYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvam91cm5hbC5jCisrKyBiL2ZzL29jZnMyL2pvdXJuYWwuYwpAQCAtNzIyLDggKzcyMiw3IEBACiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgb2NmczJfam91cm5hbCwgal9yZWNvdmVyeV93b3JrKTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IGpvdXJuYWwtPmpfb3NiOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmxhX2Rpbm9kZSwgKnRsX2Rpbm9kZTsKLQlzdHJ1Y3Qgb2NmczJfbGFfcmVjb3ZlcnlfaXRlbSAqaXRlbTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKwlzdHJ1Y3Qgb2NmczJfbGFfcmVjb3ZlcnlfaXRlbSAqaXRlbSwgKm47CiAJTElTVF9IRUFEKHRtcF9sYV9saXN0KTsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwpAQCAtNzM0LDggKzczMyw3IEBACiAJbGlzdF9zcGxpY2VfaW5pdCgmam91cm5hbC0+al9sYV9jbGVhbnVwcywgJnRtcF9sYV9saXN0KTsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmdG1wX2xhX2xpc3QpIHsKLQkJaXRlbSA9IGxpc3RfZW50cnkocCwgc3RydWN0IG9jZnMyX2xhX3JlY292ZXJ5X2l0ZW0sIGxyaV9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRlbSwgbiwgJnRtcF9sYV9saXN0LCBscmlfbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZpdGVtLT5scmlfbGlzdCk7CiAKIAkJbWxvZygwLCAiQ29tcGxldGUgcmVjb3ZlcnkgZm9yIHNsb3QgJWRcbiIsIGl0ZW0tPmxyaV9zbG90KTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuaCBiL2ZzL29jZnMyL2pvdXJuYWwuaAppbmRleCAzZGI1ZGU0Li5jZTYwYWFiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmgKKysrIGIvZnMvb2NmczIvam91cm5hbC5oCkBAIC0yODksNiArMjg5LDggQEAKICNkZWZpbmUgT0NGUzJfVFJVTkNBVEVfTE9HX0ZMVVNIX09ORV9SRUMgKE9DRlMyX1NVQkFMTE9DX0ZSRUUgCQkgICAgICBcCiAJCQkJCSArIE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUpCiAKKyNkZWZpbmUgT0NGUzJfUkVNT1ZFX0VYVEVOVF9DUkVESVRTIChPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFICsgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpCisKIC8qIGRhdGEgYmxvY2sgZm9yIG5ldyBkaXIvc3ltbGluaywgMiBmb3IgYml0bWFwIHVwZGF0ZXMgKGJpdG1hcCBmZSArCiAgKiBiaXRtYXAgYmxvY2sgZm9yIHRoZSBuZXcgYml0KSAqLwogI2RlZmluZSBPQ0ZTMl9ESVJfTElOS19BRERJVElPTkFMX0NSRURJVFMgKDEgKyAyKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbW1hcC5jIGIvZnMvb2NmczIvbW1hcC5jCmluZGV4IGFmMDExNTguLmQ3OWFhMTIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL21tYXAuYworKysgYi9mcy9vY2ZzMi9tbWFwLmMKQEAgLTM3LDExICszNywyOSBAQAogCiAjaW5jbHVkZSAib2NmczIuaCIKIAorI2luY2x1ZGUgImFvcHMuaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAibW1hcC5oIgogCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl92bV9vcF9ibG9ja19zaWdzKHNpZ3NldF90ICpibG9ja2VkLCBzaWdzZXRfdCAqb2xkc2V0KQoreworCS8qIFRoZSBiZXN0IHdheSB0byBkZWFsIHdpdGggc2lnbmFscyBpbiB0aGUgdm0gcGF0aCBpcworCSAqIHRvIGJsb2NrIHRoZW0gdXBmcm9udCwgcmF0aGVyIHRoYW4gYWxsb3dpbmcgdGhlCisJICogbG9ja2luZyBwYXRocyB0byByZXR1cm4gLUVSRVNUQVJUU1lTLiAqLworCXNpZ2ZpbGxzZXQoYmxvY2tlZCk7CisKKwkvKiBXZSBzaG91bGQgdGVjaG5pY2FsbHkgbmV2ZXIgZ2V0IGEgYmFkIHJldHVybiB2YWx1ZQorCSAqIGZyb20gc2lncHJvY21hc2sgKi8KKwlyZXR1cm4gc2lncHJvY21hc2soU0lHX0JMT0NLLCBibG9ja2VkLCBvbGRzZXQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl92bV9vcF91bmJsb2NrX3NpZ3Moc2lnc2V0X3QgKm9sZHNldCkKK3sKKwlyZXR1cm4gc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIG9sZHNldCwgTlVMTCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqb2NmczJfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIGFyZWEsCiAJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKIAkJCQkgaW50ICp0eXBlKQpAQCAtNTMsMTQgKzcxLDcgQEAKIAltbG9nX2VudHJ5KCIoYXJlYT0lcCwgYWRkcmVzcz0lbHUsIHR5cGU9JXApXG4iLCBhcmVhLCBhZGRyZXNzLAogCQkgICB0eXBlKTsKIAotCS8qIFRoZSBiZXN0IHdheSB0byBkZWFsIHdpdGggc2lnbmFscyBpbiB0aGlzIHBhdGggaXMKLQkgKiB0byBibG9jayB0aGVtIHVwZnJvbnQsIHJhdGhlciB0aGFuIGFsbG93aW5nIHRoZQotCSAqIGxvY2tpbmcgcGF0aHMgdG8gcmV0dXJuIC1FUkVTVEFSVFNZUy4gKi8KLQlzaWdmaWxsc2V0KCZibG9ja2VkKTsKLQotCS8qIFdlIHNob3VsZCB0ZWNobmljYWxseSBuZXZlciBnZXQgYSBiYWQgcmV0IHJldHVybgotCSAqIGZyb20gc2lncHJvY21hc2sgKi8KLQlyZXQgPSBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZibG9ja2VkLCAmb2xkc2V0KTsKKwlyZXQgPSBvY2ZzMl92bV9vcF9ibG9ja19zaWdzKCZibG9ja2VkLCAmb2xkc2V0KTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtNjgsNyArNzksNyBAQAogCiAJcGFnZSA9IGZpbGVtYXBfbm9wYWdlKGFyZWEsIGFkZHJlc3MsIHR5cGUpOwogCi0JcmV0ID0gc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbGRzZXQsIE5VTEwpOworCXJldCA9IG9jZnMyX3ZtX29wX3VuYmxvY2tfc2lncygmb2xkc2V0KTsKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwogb3V0OgpAQCAtNzYsMjcgKzg3LDEzNSBAQAogCXJldHVybiBwYWdlOwogfQogCitzdGF0aWMgaW50IF9fb2NmczJfcGFnZV9ta3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkJc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJbG9mZl90IHBvcyA9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgaW50IGxlbiA9IFBBR0VfQ0FDSEVfU0laRTsKKwlwZ29mZl90IGxhc3RfaW5kZXg7CisJc3RydWN0IHBhZ2UgKmxvY2tlZF9wYWdlID0gTlVMTDsKKwl2b2lkICpmc2RhdGE7CisJbG9mZl90IHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwkvKgorCSAqIEFub3RoZXIgbm9kZSBtaWdodCBoYXZlIHRydW5jYXRlZCB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcgb24KKwkgKiBjbHVzdGVyIGxvY2tzLgorCSAqLworCWxhc3RfaW5kZXggPSBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKHBhZ2UtPmluZGV4ID4gbGFzdF9pbmRleCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRoZSBpX3NpemUgY2hlY2sgYWJvdmUgZG9lc24ndCBjYXRjaCB0aGUgY2FzZSB3aGVyZSBub2RlcworCSAqIHRydW5jYXRlZCBhbmQgdGhlbiByZS1leHRlbmRlZCB0aGUgZmlsZS4gV2UnbGwgcmUtY2hlY2sgdGhlCisJICogcGFnZSBtYXBwaW5nIGFmdGVyIHRha2luZyB0aGUgcGFnZSBsb2NrIGluc2lkZSBvZgorCSAqIG9jZnMyX3dyaXRlX2JlZ2luX25vbG9jaygpLgorCSAqLworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IHBhZ2UtPm1hcHBpbmcgIT0gaW5vZGUtPmlfbWFwcGluZykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIENhbGwgb2NmczJfd3JpdGVfYmVnaW4oKSBhbmQgb2NmczJfd3JpdGVfZW5kKCkgdG8gdGFrZQorCSAqIGFkdmFudGFnZSBvZiB0aGUgYWxsb2NhdGlvbiBjb2RlIHRoZXJlLiBXZSBwYXNzIGEgd3JpdGUKKwkgKiBsZW5ndGggb2YgdGhlIHdob2xlIHBhZ2UgKGNob3BwZWQgdG8gaV9zaXplKSB0byBtYWtlIHN1cmUKKwkgKiB0aGUgd2hvbGUgdGhpbmcgaXMgYWxsb2NhdGVkLgorCSAqCisJICogU2luY2Ugd2Uga25vdyB0aGUgcGFnZSBpcyB1cCB0byBkYXRlLCB3ZSBkb24ndCBoYXZlIHRvCisJICogd29ycnkgYWJvdXQgb2NmczJfd3JpdGVfYmVnaW4oKSBza2lwcGluZyBzb21lIGJ1ZmZlciByZWFkcworCSAqIGJlY2F1c2UgdGhlICJ3cml0ZSIgd291bGQgaW52YWxpZGF0ZSB0aGVpciBkYXRhLgorCSAqLworCWlmIChwYWdlLT5pbmRleCA9PSBsYXN0X2luZGV4KQorCQlsZW4gPSBzaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKKworCXJldCA9IG9jZnMyX3dyaXRlX2JlZ2luX25vbG9jayhtYXBwaW5nLCBwb3MsIGxlbiwgMCwgJmxvY2tlZF9wYWdlLAorCQkJCSAgICAgICAmZnNkYXRhLCBkaV9iaCwgcGFnZSk7CisJaWYgKHJldCkgeworCQlpZiAocmV0ICE9IC1FTk9TUEMpCisJCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX3dyaXRlX2VuZF9ub2xvY2sobWFwcGluZywgcG9zLCBsZW4sIGxlbiwgbG9ja2VkX3BhZ2UsCisJCQkJICAgICBmc2RhdGEpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCUJVR19PTihyZXQgIT0gbGVuKTsKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcGFnZV9ta3dyaXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXNpZ3NldF90IGJsb2NrZWQsIG9sZHNldDsKKwlpbnQgcmV0LCByZXQyOworCisJcmV0ID0gb2NmczJfdm1fb3BfYmxvY2tfc2lncygmYmxvY2tlZCwgJm9sZHNldCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogVGhlIGNsdXN0ZXIgbG9ja3MgdGFrZW4gd2lsbCBibG9jayBhIHRydW5jYXRlIGZyb20gYW5vdGhlcgorCSAqIG5vZGUuIFRha2luZyB0aGUgZGF0YSBsb2NrIHdpbGwgYWxzbyBlbnN1cmUgdGhhdCB3ZSBkb24ndAorCSAqIGF0dGVtcHQgcGFnZSB0cnVuY2F0aW9uIGFzIHBhcnQgb2YgYSBkb3duY29udmVydC4KKwkgKi8KKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsICZkaV9iaCwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRoZSBhbGxvYyBzZW0gc2hvdWxkIGJlIGVub3VnaCB0byBzZXJpYWxpemUgd2l0aAorCSAqIG9jZnMyX3RydW5jYXRlX2ZpbGUoKSBjaGFuZ2luZyBpX3NpemUgYXMgd2VsbCBhcyBhbnkgdGhyZWFkCisJICogbW9kaWZ5aW5nIHRoZSBpbm9kZSBidHJlZS4KKwkgKi8KKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKworCXJldCA9IG9jZnMyX2RhdGFfbG9jayhpbm9kZSwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlyZXQgPSBfX29jZnMyX3BhZ2VfbWt3cml0ZShpbm9kZSwgZGlfYmgsIHBhZ2UpOworCisJb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOworCitvdXRfbWV0YV91bmxvY2s6CisJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCisJYnJlbHNlKGRpX2JoKTsKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7CisKK291dDoKKwlyZXQyID0gb2NmczJfdm1fb3BfdW5ibG9ja19zaWdzKCZvbGRzZXQpOworCWlmIChyZXQyIDwgMCkKKwkJbWxvZ19lcnJubyhyZXQyKTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgb2NmczJfZmlsZV92bV9vcHMgPSB7Ci0JLm5vcGFnZSA9IG9jZnMyX25vcGFnZSwKKwkubm9wYWdlCQk9IG9jZnMyX25vcGFnZSwKKwkucGFnZV9ta3dyaXRlCT0gb2NmczJfcGFnZV9ta3dyaXRlLAogfTsKIAogaW50IG9jZnMyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWludCByZXQgPSAwLCBsb2NrX2xldmVsID0gMDsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiKTsKLQotCS8qCi0JICogT25seSBzdXBwb3J0IHNoYXJlZCB3cml0ZWFibGUgbW1hcCBmb3IgbG9jYWwgbW91bnRzIHdoaWNoCi0JICogZG9uJ3Qga25vdyBhYm91dCBob2xlcy4KLQkgKi8KLQlpZiAoKCFvY2ZzMl9tb3VudF9sb2NhbChvc2IpIHx8IG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKSAmJgotCSAgICAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpIHx8ICh2bWEtPnZtX2ZsYWdzICYgVk1fTUFZU0hBUkUpKSAmJgotCSAgICAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlXUklURSkpKSB7Ci0JCW1sb2coMCwgImRpc2FsbG93IHNoYXJlZCB3cml0YWJsZSBtbWFwcyAlbHhcbiIsIHZtYS0+dm1fZmxhZ3MpOwotCQkvKiBUaGlzIGlzIC1FSU5WQUwgYmVjYXVzZSBnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcAotCQkgKiByZXR1cm5zIGl0IGluIGEgc2ltaWxhciBzaXR1YXRpb24uICovCi0JCXJldHVybiAtRUlOVkFMOwotCX0KIAogCXJldCA9IG9jZnMyX21ldGFfbG9ja19hdGltZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKIAkJCQkgICAgZmlsZS0+Zl92ZnNtbnQsICZsb2NrX2xldmVsKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL25hbWVpLmMgYi9mcy9vY2ZzMi9uYW1laS5jCmluZGV4IDM2Mjg5ZTYuLmQ0MzBmZGEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL25hbWVpLmMKKysrIGIvZnMvb2NmczIvbmFtZWkuYwpAQCAtMTY3NCw3ICsxNjc0LDcgQEAKIAkJdTMyIG9mZnNldCA9IDA7CiAKIAkJaW5vZGUtPmlfb3AgPSAmb2NmczJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihvc2IsIGlub2RlLCAmb2Zmc2V0LCAxLAorCQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihvc2IsIGlub2RlLCAmb2Zmc2V0LCAxLCAwLAogCQkJCQkJICAgIG5ld19mZV9iaCwKIAkJCQkJCSAgICBoYW5kbGUsIGRhdGFfYWMsIE5VTEwsCiAJCQkJCQkgICAgTlVMTCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMi5oIGIvZnMvb2NmczIvb2NmczIuaAppbmRleCBhODYwNjMzLi41Y2M5MGE0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMi5oCisrKyBiL2ZzL29jZnMyL29jZnMyLmgKQEAgLTIxOSw2ICsyMTksNyBAQAogCXUxNiBtYXhfc2xvdHM7CiAJczE2IG5vZGVfbnVtOwogCXMxNiBzbG90X251bTsKKwlzMTYgcHJlZmVycmVkX3Nsb3Q7CiAJaW50IHNfc2VjdHNpemVfYml0czsKIAlpbnQgc19jbHVzdGVyc2l6ZTsKIAlpbnQgc19jbHVzdGVyc2l6ZV9iaXRzOwpAQCAtMzA1LDYgKzMwNiwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl93cml0ZXNfdW53cml0dGVuX2V4dGVudHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJLyoKKwkgKiBTdXBwb3J0IGZvciBzcGFyc2UgZmlsZXMgaXMgYSBwcmUtcmVxdWlzaXRlCisJICovCisJaWYgKCFvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob3NiLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVU5XUklUVEVOKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwogLyogc2V0IC8gY2xlYXIgZnVuY3Rpb25zIGJlY2F1c2UgY2x1c3RlciBldmVudHMgY2FuIG1ha2UgdGhlc2UgaGFwcGVuCiAgKiBpbiBwYXJhbGxlbCBzbyB3ZSB3YW50IHRoZSB0cmFuc2l0aW9ucyB0byBiZSBhdG9taWMuIHRoaXMgYWxzbwogICogbWVhbnMgdGhhdCBhbnkgZnV0dXJlIGZsYWdzIG9zYl9mbGFncyBtdXN0IGJlIHByb3RlY3RlZCBieSBzcGlubG9jawpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczJfZnMuaCBiL2ZzL29jZnMyL29jZnMyX2ZzLmgKaW5kZXggZjBkOWViMC4uODJmOGE3NSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczJfZnMuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMl9mcy5oCkBAIC04OCw3ICs4OCw3IEBACiAjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfQ09NUEFUX1NVUFAJT0NGUzJfRkVBVFVSRV9DT01QQVRfQkFDS1VQX1NCCiAjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAkoT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9MT0NBTF9NT1VOVCBcCiAJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfU1BBUlNFX0FMTE9DKQotI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQCTAKKyNkZWZpbmUgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAlPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4KIAogLyoKICAqIEhlYXJ0YmVhdC1vbmx5IGRldmljZXMgYXJlIG1pc3Npbmcgam91cm5hbHMgYW5kIG90aGVyIGZpbGVzLiAgVGhlCkBAIC0xMTYsNiArMTE2LDExIEBACiAgKi8KICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9DT01QQVRfQkFDS1VQX1NCCQkweDAwMDEKIAorLyoKKyAqIFVud3JpdHRlbiBleHRlbnRzIHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVU5XUklUVEVOCTB4MDAwMQorCiAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJhY2t1cCBibG9jayB3aWxsIGJlIDFHLgogICogVGhlIGZvbGxvd2luZyB3aWxsIGJlIDRHLCAxNkcsIDY0RywgMjU2RyBhbmQgMVQuCiAgKi8KQEAgLTE3MCw2ICsxNzUsMzIgQEAKICNkZWZpbmUgT0NGUzJfSU9DMzJfU0VURkxBR1MJX0lPVygnZicsIDIsIGludCkKIAogLyoKKyAqIFNwYWNlIHJlc2VydmF0aW9uIC8gYWxsb2NhdGlvbiAvIGZyZWUgaW9jdGxzIGFuZCBhcmd1bWVudCBzdHJ1Y3R1cmUKKyAqIGFyZSBkZXNpZ25lZCB0byBiZSBjb21wYXRpYmxlIHdpdGggWEZTLgorICoKKyAqIEFMTE9DU1AqIGFuZCBGUkVFU1AqIGFyZSBub3QgYW5kIHdpbGwgbmV2ZXIgYmUgc3VwcG9ydGVkLCBidXQgYXJlCisgKiBpbmNsdWRlZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuCisgKi8KK3N0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2IHsKKwlfX3MxNgkJbF90eXBlOworCV9fczE2CQlsX3doZW5jZTsKKwlfX3M2NAkJbF9zdGFydDsKKwlfX3M2NAkJbF9sZW47CQkvKiBsZW4gPT0gMCBtZWFucyB1bnRpbCBlbmQgb2YgZmlsZSAqLworCV9fczMyCQlsX3N5c2lkOworCV9fdTMyCQlsX3BpZDsKKwlfX3MzMgkJbF9wYWRbNF07CS8qIHJlc2VydmUgYXJlYQkJCSAgICAqLworfTsKKworI2RlZmluZSBPQ0ZTMl9JT0NfQUxMT0NTUAkJX0lPVyAoJ1gnLCAxMCwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19GUkVFU1AJCV9JT1cgKCdYJywgMTEsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfUkVTVlNQCQlfSU9XICgnWCcsIDQwLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX1VOUkVTVlNQCV9JT1cgKCdYJywgNDEsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfQUxMT0NTUDY0CV9JT1cgKCdYJywgMzYsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfRlJFRVNQNjQJX0lPVyAoJ1gnLCAzNywgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19SRVNWU1A2NAlfSU9XICgnWCcsIDQyLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX1VOUkVTVlNQNjQJX0lPVyAoJ1gnLCA0Mywgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisKKy8qCiAgKiBKb3VybmFsIEZsYWdzIChvY2ZzMl9kaW5vZGUuaWQxLmpvdXJuYWwxLmlfZmxhZ3MpCiAgKi8KICNkZWZpbmUgT0NGUzJfSk9VUk5BTF9ESVJUWV9GTAkoMHgwMDAwMDAwMSkJLyogSm91cm5hbCBuZWVkcyByZWNvdmVyeSAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc2xvdF9tYXAuYyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKaW5kZXggZDhiNzkwNi4uYWY0ODgyYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc2xvdF9tYXAuYworKysgYi9mcy9vY2ZzMi9zbG90X21hcC5jCkBAIC0xMjEsMTcgKzEyMSwyNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzMTYgX19vY2ZzMl9maW5kX2VtcHR5X3Nsb3Qoc3RydWN0IG9jZnMyX3Nsb3RfaW5mbyAqc2kpCitzdGF0aWMgczE2IF9fb2NmczJfZmluZF9lbXB0eV9zbG90KHN0cnVjdCBvY2ZzMl9zbG90X2luZm8gKnNpLCBzMTYgcHJlZmVycmVkKQogewogCWludCBpOwogCXMxNiByZXQgPSBPQ0ZTMl9JTlZBTElEX1NMT1Q7CiAKKwlpZiAocHJlZmVycmVkID49IDAgJiYgcHJlZmVycmVkIDwgc2ktPnNpX251bV9zbG90cykgeworCQlpZiAoT0NGUzJfSU5WQUxJRF9TTE9UID09IHNpLT5zaV9nbG9iYWxfbm9kZV9udW1zW3ByZWZlcnJlZF0pIHsKKwkJCXJldCA9IHByZWZlcnJlZDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCiAJZm9yKGkgPSAwOyBpIDwgc2ktPnNpX251bV9zbG90czsgaSsrKSB7CiAJCWlmIChPQ0ZTMl9JTlZBTElEX1NMT1QgPT0gc2ktPnNpX2dsb2JhbF9ub2RlX251bXNbaV0pIHsKIAkJCXJldCA9IChzMTYpIGk7CiAJCQlicmVhazsKIAkJfQogCX0KK291dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNDgsNyArMjU2LDcgQEAKIAlpZiAoc2xvdCA9PSBPQ0ZTMl9JTlZBTElEX1NMT1QpIHsKIAkJLyogaWYgbm8gc2xvdCB5ZXQsIHRoZW4ganVzdCB0YWtlIDFzdCBhdmFpbGFibGUKIAkJICogb25lLiAqLwotCQlzbG90ID0gX19vY2ZzMl9maW5kX2VtcHR5X3Nsb3Qoc2kpOworCQlzbG90ID0gX19vY2ZzMl9maW5kX2VtcHR5X3Nsb3Qoc2ksIG9zYi0+cHJlZmVycmVkX3Nsb3QpOwogCQlpZiAoc2xvdCA9PSBPQ0ZTMl9JTlZBTElEX1NMT1QpIHsKIAkJCXNwaW5fdW5sb2NrKCZzaS0+c2lfbG9jayk7CiAJCQltbG9nKE1MX0VSUk9SLCAibm8gZnJlZSBzbG90cyBhdmFpbGFibGUhXG4iKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1YmFsbG9jLmMgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCmluZGV4IGUzNDM3NjIuLmQ5YzVjOWYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1YmFsbG9jLmMKKysrIGIvZnMvb2NmczIvc3ViYWxsb2MuYwpAQCAtOTgsMTQgKzk4LDYgQEAKIAkJCQkgICAgdTE2IGNoYWluKTsKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX3JlYXNvbmFibHlfZW1wdHkoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnLAogCQkJCQkJICAgICB1MzIgd2FudGVkKTsKLXN0YXRpYyBpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCi0JCQkJICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCi0JCQkJICAgIHU2NCBiZ19ibGtubywKLQkJCQkgICAgdW5zaWduZWQgaW50IGNvdW50KTsKLXN0YXRpYyBpbmxpbmUgdTY0IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKHU2NCBibG9jaywKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgYml0KTsKIHN0YXRpYyBpbmxpbmUgdTMyIG9jZnMyX2Rlc2NfYml0bWFwX3RvX2NsdXN0ZXJfb2ZmKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCQkgICB1NjQgYmdfYmxrbm8sCiAJCQkJCQkgICB1MTYgYmdfYml0X29mZik7CkBAIC00OTYsMTMgKzQ4OCw3IEBACiAKIAkoKmFjKS0+YWNfYml0c193YW50ZWQgPSBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZmUpOwogCSgqYWMpLT5hY193aGljaCA9IE9DRlMyX0FDX1VTRV9NRVRBOwotCi0jaWZuZGVmIE9DRlMyX1VTRV9BTExfTUVUQURBVEFfU1VCQUxMT0NBVE9SUwotCXNsb3QgPSAwOwotI2Vsc2UKIAlzbG90ID0gb3NiLT5zbG90X251bTsKLSNlbmRpZgotCiAJKCphYyktPmFjX2dyb3VwX3NlYXJjaCA9IG9jZnMyX2Jsb2NrX2dyb3VwX3NlYXJjaDsKIAogCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhvc2IsICgqYWMpLApAQCAtMTYyNiwxMiArMTYxMiwxMiBAQAogLyoKICAqIGV4cGVjdHMgdGhlIHN1YmFsbG9jIGlub2RlIHRvIGFscmVhZHkgYmUgbG9ja2VkLgogICovCi1zdGF0aWMgaW50IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAotCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsbG9jX2JoLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgc3RhcnRfYml0LAotCQkJCSAgICB1NjQgYmdfYmxrbm8sCi0JCQkJICAgIHVuc2lnbmVkIGludCBjb3VudCkKK2ludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19iaCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCwKKwkJCSAgICAgdTY0IGJnX2Jsa25vLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJdTMyIHRtcF91c2VkOwpAQCAtMTcwMywxMyArMTY4OSw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSB1NjQgb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAodTY0IGJsb2NrLCB1bnNpZ25lZCBpbnQgYml0KQotewotCXU2NCBncm91cCA9IGJsb2NrIC0gKHU2NCkgYml0OwotCi0JcmV0dXJuIGdyb3VwOwotfQotCiBpbnQgb2NmczJfZnJlZV9kaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwKIAkJICAgICAgc3RydWN0IGlub2RlICppbm9kZV9hbGxvY19pbm9kZSwKIAkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9hbGxvY19iaCwKQEAgLTE3MjMsMTkgKzE3MDIsNiBAQAogCQkJCQlpbm9kZV9hbGxvY19iaCwgYml0LCBiZ19ibGtubywgMSk7CiB9CiAKLWludCBvY2ZzMl9mcmVlX2V4dGVudF9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLAotCQkJICAgIHN0cnVjdCBpbm9kZSAqZWJfYWxsb2NfaW5vZGUsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9hbGxvY19iaCwKLQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYikKLXsKLQl1NjQgYmxrID0gbGU2NF90b19jcHUoZWItPmhfYmxrbm8pOwotCXUxNiBiaXQgPSBsZTE2X3RvX2NwdShlYi0+aF9zdWJhbGxvY19iaXQpOwotCXU2NCBiZ19ibGtubyA9IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKGJsaywgYml0KTsKLQotCXJldHVybiBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlLCBlYl9hbGxvY19pbm9kZSwgZWJfYWxsb2NfYmgsCi0JCQkJCWJpdCwgYmdfYmxrbm8sIDEpOwotfQotCiBpbnQgb2NmczJfZnJlZV9jbHVzdGVycyhoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICAgc3RydWN0IGlub2RlICpiaXRtYXBfaW5vZGUsCiAJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1YmFsbG9jLmggYi9mcy9vY2ZzMi9zdWJhbGxvYy5oCmluZGV4IDFhM2M5NGMuLmYyMTJkYzAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1YmFsbG9jLmgKKysrIGIvZnMvb2NmczIvc3ViYWxsb2MuaApAQCAtODYsMjAgKzg2LDI5IEBACiAJCQkgdTMyICpjbHVzdGVyX3N0YXJ0LAogCQkJIHUzMiAqbnVtX2NsdXN0ZXJzKTsKIAoraW50IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsbG9jX2JoLAorCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfYml0LAorCQkJICAgICB1NjQgYmdfYmxrbm8sCisJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCk7CiBpbnQgb2NmczJfZnJlZV9kaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwKIAkJICAgICAgc3RydWN0IGlub2RlICppbm9kZV9hbGxvY19pbm9kZSwKIAkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9hbGxvY19iaCwKIAkJICAgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkpOwotaW50IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICAgc3RydWN0IGlub2RlICplYl9hbGxvY19pbm9kZSwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2FsbG9jX2JoLAotCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKTsKIGludCBvY2ZzMl9mcmVlX2NsdXN0ZXJzKGhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3QgaW5vZGUgKmJpdG1hcF9pbm9kZSwKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLAogCQkJdTY0IHN0YXJ0X2JsaywKIAkJCXVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpOwogCitzdGF0aWMgaW5saW5lIHU2NCBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cCh1NjQgYmxvY2ssIHVuc2lnbmVkIGludCBiaXQpCit7CisJdTY0IGdyb3VwID0gYmxvY2sgLSAodTY0KSBiaXQ7CisKKwlyZXR1cm4gZ3JvdXA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIG9jZnMyX2NsdXN0ZXJfZnJvbV9kZXNjKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCQkgIHU2NCBiZ19ibGtubykKIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1cGVyLmMgYi9mcy9vY2ZzMi9zdXBlci5jCmluZGV4IDg2YjU1OWMuLjNhNWExZWQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1cGVyLmMKKysrIGIvZnMvb2NmczIvc3VwZXIuYwpAQCAtODIsNyArODIsOCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgaW50IG9jZnMyX3BhcnNlX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqb3B0aW9ucywKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nICptb3VudF9vcHQsIGludCBpc19yZW1vdW50KTsKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICptb3VudF9vcHQsIHMxNiAqc2xvdCwKKwkJCSAgICAgICBpbnQgaXNfcmVtb3VudCk7CiBzdGF0aWMgdm9pZCBvY2ZzMl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBzdGF0aWMgaW50IG9jZnMyX21vdW50X3ZvbHVtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyBpbnQgb2NmczJfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKTsKQEAgLTExNCw4ICsxMTUsNiBAQAogc3RhdGljIHN0cnVjdCBpbm9kZSAqb2NmczJfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBzdGF0aWMgdm9pZCBvY2ZzMl9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG9jZnMyX21heF9maWxlX29mZnNldCh1bnNpZ25lZCBpbnQgYmxvY2tzaGlmdCk7Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBvY2ZzMl9zb3BzID0gewogCS5zdGF0ZnMJCT0gb2NmczJfc3RhdGZzLAogCS5hbGxvY19pbm9kZQk9IG9jZnMyX2FsbG9jX2lub2RlLApAQCAtMTQwLDYgKzEzOSw3IEBACiAJT3B0X2RhdGFfb3JkZXJlZCwKIAlPcHRfZGF0YV93cml0ZWJhY2ssCiAJT3B0X2F0aW1lX3F1YW50dW0sCisJT3B0X3Nsb3QsCiAJT3B0X2VyciwKIH07CiAKQEAgLTE1NCw2ICsxNTQsNyBAQAogCXtPcHRfZGF0YV9vcmRlcmVkLCAiZGF0YT1vcmRlcmVkIn0sCiAJe09wdF9kYXRhX3dyaXRlYmFjaywgImRhdGE9d3JpdGViYWNrIn0sCiAJe09wdF9hdGltZV9xdWFudHVtLCAiYXRpbWVfcXVhbnR1bT0ldSJ9LAorCXtPcHRfc2xvdCwgInByZWZlcnJlZF9zbG90PSV1In0sCiAJe09wdF9lcnIsIE5VTEx9CiB9OwogCkBAIC0zMTgsNyArMzE5LDcgQEAKIC8qIEZyb20geGZzX3N1cGVyLmM6eGZzX21heF9maWxlX29mZnNldAogICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG9jZnMyX21heF9maWxlX29mZnNldCh1bnNpZ25lZCBpbnQgYmxvY2tzaGlmdCkKK3Vuc2lnbmVkIGxvbmcgbG9uZyBvY2ZzMl9tYXhfZmlsZV9vZmZzZXQodW5zaWduZWQgaW50IGJsb2Nrc2hpZnQpCiB7CiAJdW5zaWduZWQgaW50IHBhZ2VmYWN0b3IgPSAxOwogCXVuc2lnbmVkIGludCBiaXRzaGlmdCA9IEJJVFNfUEVSX0xPTkcgLSAxOwpAQCAtMzU1LDkgKzM1NiwxMCBAQAogCWludCBpbmNvbXBhdF9mZWF0dXJlczsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIHBhcnNlZF9vcHRpb25zOworCXMxNiBzbG90OwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0Ioc2IpOwogCi0JaWYgKCFvY2ZzMl9wYXJzZV9vcHRpb25zKHNiLCBkYXRhLCAmcGFyc2VkX29wdGlvbnMsIDEpKSB7CisJaWYgKCFvY2ZzMl9wYXJzZV9vcHRpb25zKHNiLCBkYXRhLCAmcGFyc2VkX29wdGlvbnMsICZzbG90LCAxKSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC01MzQsNiArNTM2LDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpyb290OwogCWludCBzdGF0dXMsIHNlY3Rvcl9zaXplOwogCXVuc2lnbmVkIGxvbmcgcGFyc2VkX29wdDsKKwlzMTYgc2xvdDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CkBAIC01NDEsNyArNTQ0LDcgQEAKIAogCW1sb2dfZW50cnkoIiVwLCAlcCwgJWkiLCBzYiwgZGF0YSwgc2lsZW50KTsKIAotCWlmICghb2NmczJfcGFyc2Vfb3B0aW9ucyhzYiwgZGF0YSwgJnBhcnNlZF9vcHQsIDApKSB7CisJaWYgKCFvY2ZzMl9wYXJzZV9vcHRpb25zKHNiLCBkYXRhLCAmcGFyc2VkX29wdCwgJnNsb3QsIDApKSB7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCWdvdG8gcmVhZF9zdXBlcl9lcnJvcjsKIAl9CkBAIC01NzEsNiArNTc0LDcgQEAKIAlicmVsc2UoYmgpOwogCWJoID0gTlVMTDsKIAlvc2ItPnNfbW91bnRfb3B0ID0gcGFyc2VkX29wdDsKKwlvc2ItPnByZWZlcnJlZF9zbG90ID0gc2xvdDsKIAogCXNiLT5zX21hZ2ljID0gT0NGUzJfU1VQRVJfTUFHSUM7CiAKQEAgLTcxMyw2ICs3MTcsNyBAQAogc3RhdGljIGludCBvY2ZzMl9wYXJzZV9vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICAgICAgY2hhciAqb3B0aW9ucywKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nICptb3VudF9vcHQsCisJCQkgICAgICAgczE2ICpzbG90LAogCQkJICAgICAgIGludCBpc19yZW1vdW50KQogewogCWludCBzdGF0dXM7CkBAIC03MjIsNiArNzI3LDcgQEAKIAkJICAgb3B0aW9ucyA/IG9wdGlvbnMgOiAiKG5vbmUpIik7CiAKIAkqbW91bnRfb3B0ID0gMDsKKwkqc2xvdCA9IE9DRlMyX0lOVkFMSURfU0xPVDsKIAogCWlmICghb3B0aW9ucykgewogCQlzdGF0dXMgPSAxOwpAQCAtNzgyLDYgKzc4OCwxNSBAQAogCQkJZWxzZQogCQkJCW9zYi0+c19hdGltZV9xdWFudHVtID0gT0NGUzJfREVGQVVMVF9BVElNRV9RVUFOVFVNOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Nsb3Q6CisJCQlvcHRpb24gPSAwOworCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpIHsKKwkJCQlzdGF0dXMgPSAwOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChvcHRpb24pCisJCQkJKnNsb3QgPSAoczE2KW9wdGlvbjsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJbWxvZyhNTF9FUlJPUiwKIAkJCSAgICAgIlVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1cGVyLmggYi9mcy9vY2ZzMi9zdXBlci5oCmluZGV4IDc4M2Y1MjcuLjNiOWNiM2QgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1cGVyLmgKKysrIGIvZnMvb2NmczIvc3VwZXIuaApAQCAtNDUsNCArNDUsNiBAQAogCiAjZGVmaW5lIG9jZnMyX2Fib3J0KHNiLCBmbXQsIGFyZ3MuLi4pIF9fb2NmczJfYWJvcnQoc2IsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIGZtdCwgIyNhcmdzKQogCit1bnNpZ25lZCBsb25nIGxvbmcgb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCBibG9ja3NoaWZ0KTsKKwogI2VuZGlmIC8qIE9DRlMyX1NVUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uYwppbmRleCAwZDUxNWQxLi5iZTZhNDU3IDEwMDY0NAotLS0gYS9mcy9vcGVuLmMKKysrIGIvZnMvb3Blbi5jCkBAIC04NTUsNyArODU1LDcgQEAKIC8qCiAgKiBGaW5kIGFuIGVtcHR5IGZpbGUgZGVzY3JpcHRvciBlbnRyeSwgYW5kIG1hcmsgaXQgYnVzeS4KICAqLwotaW50IGdldF91bnVzZWRfZmQodm9pZCkKK2ludCBnZXRfdW51c2VkX2ZkX2ZsYWdzKGludCBmbGFncykKIHsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMgPSBjdXJyZW50LT5maWxlczsKIAlpbnQgZmQsIGVycm9yOwpAQCAtODkxLDcgKzg5MSwxMCBAQAogCX0KIAogCUZEX1NFVChmZCwgZmR0LT5vcGVuX2Zkcyk7Ci0JRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCWlmIChmbGFncyAmIE9fQ0xPRVhFQykKKwkJRkRfU0VUKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCWVsc2UKKwkJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwogCWZpbGVzLT5uZXh0X2ZkID0gZmQgKyAxOwogI2lmIDEKIAkvKiBTYW5pdHkgY2hlY2sgKi8KQEAgLTkwNyw2ICs5MTAsMTEgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK2ludCBnZXRfdW51c2VkX2ZkKHZvaWQpCit7CisJcmV0dXJuIGdldF91bnVzZWRfZmRfZmxhZ3MoMCk7Cit9CisKIEVYUE9SVF9TWU1CT0woZ2V0X3VudXNlZF9mZCk7CiAKIHN0YXRpYyB2b2lkIF9fcHV0X3VudXNlZF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgdW5zaWduZWQgaW50IGZkKQpAQCAtOTU5LDcgKzk2Nyw3IEBACiAJaW50IGZkID0gUFRSX0VSUih0bXApOwogCiAJaWYgKCFJU19FUlIodG1wKSkgewotCQlmZCA9IGdldF91bnVzZWRfZmQoKTsKKwkJZmQgPSBnZXRfdW51c2VkX2ZkX2ZsYWdzKGZsYWdzKTsKIAkJaWYgKGZkID49IDApIHsKIAkJCXN0cnVjdCBmaWxlICpmID0gZG9fZmlscF9vcGVuKGRmZCwgdG1wLCBmbGFncywgbW9kZSk7CiAJCQlpZiAoSVNfRVJSKGYpKSB7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMgYi9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKaW5kZXggZTM0OTEzMi4uM2QzZTE2NiAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9hY29ybi5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYwpAQCAtMjUsNiArMjUsOCBAQAogI2RlZmluZSBQQVJUSVRJT05fUklTQ0lYX1NDU0kJMgogI2RlZmluZSBQQVJUSVRJT05fTElOVVgJCTkKIAorI2lmIGRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9DVU1BTkEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUykKIHN0YXRpYyBzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkICoKIGFkZnNfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIGNoYXIgKm5hbWUsIGNoYXIgKmRhdGEsCiAJICAgICAgIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc2VjdG9yLCBpbnQgc2xvdCkKQEAgLTQ4LDYgKzUwLDcgQEAKIAlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LCBmaXJzdF9zZWN0b3IsIG5yX3NlY3RzKTsKIAlyZXR1cm4gZHI7CiB9CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fUklTQ0lYCiAKQEAgLTY1LDYgKzY4LDggQEAKIAlzdHJ1Y3QgcmlzY2l4X3BhcnQgcGFydFs4XTsKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQUNPUk5fUEFSVElUSU9OX0FERlMpCiBzdGF0aWMgaW50CiByaXNjaXhfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCXVuc2lnbmVkIGxvbmcgZmlyc3Rfc2VjdCwgaW50IHNsb3QsIHVuc2lnbmVkIGxvbmcgbnJfc2VjdHMpCkBAIC0xMDUsNiArMTEwLDcgQEAKIAlyZXR1cm4gc2xvdDsKIH0KICNlbmRpZgorI2VuZGlmCiAKICNkZWZpbmUgTElOVVhfTkFUSVZFX01BR0lDIDB4ZGVhZmExZGUKICNkZWZpbmUgTElOVVhfU1dBUF9NQUdJQyAgIDB4ZGVhZmFiMWUKQEAgLTExNSw2ICsxMjEsOCBAQAogCV9fbGUzMiBucl9zZWN0czsKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQUNPUk5fUEFSVElUSU9OX0FERlMpCiBzdGF0aWMgaW50CiBsaW51eF9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0LCBpbnQgc2xvdCwgdW5zaWduZWQgbG9uZyBucl9zZWN0cykKQEAgLTE0Niw2ICsxNTQsNyBAQAogCXB1dF9kZXZfc2VjdG9yKHNlY3QpOwogCXJldHVybiBzbG90OwogfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQQogaW50CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2xkbS5jIGIvZnMvcGFydGl0aW9ucy9sZG0uYwppbmRleCA5OTg3M2EyLi5lN2RkMWQ0IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2xkbS5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvbGRtLmMKQEAgLTY3NywxNSArNjc3LDI0IEBACiAgKiBSZXR1cm46ICAtMSBFcnJvciwgdGhlIGNhbGN1bGF0ZWQgb2Zmc2V0IGV4Y2VlZGVkIHRoZSBzaXplIG9mIHRoZSBidWZmZXIKICAqICAgICAgICAgICBuIE9LLCBhIHJhbmdlLWNoZWNrZWQgb2Zmc2V0IGludG8gYnVmZmVyCiAgKi8KLXN0YXRpYyBpbnQgbGRtX3JlbGF0aXZlIChjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgYmFzZSwgaW50IG9mZnNldCkKK3N0YXRpYyBpbnQgbGRtX3JlbGF0aXZlKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIGludCBiYXNlLCBpbnQgb2Zmc2V0KQogewogCiAJYmFzZSArPSBvZmZzZXQ7Ci0JaWYgKCghYnVmZmVyKSB8fCAob2Zmc2V0IDwgMCkgfHwgKGJhc2UgPiBidWZsZW4pKQorCWlmICghYnVmZmVyIHx8IG9mZnNldCA8IDAgfHwgYmFzZSA+IGJ1ZmxlbikgeworCQlpZiAoIWJ1ZmZlcikKKwkJCWxkbV9lcnJvcigiIWJ1ZmZlciIpOworCQlpZiAob2Zmc2V0IDwgMCkKKwkJCWxkbV9lcnJvcigib2Zmc2V0ICglZCkgPCAwIiwgb2Zmc2V0KTsKKwkJaWYgKGJhc2UgPiBidWZsZW4pCisJCQlsZG1fZXJyb3IoImJhc2UgKCVkKSA+IGJ1ZmxlbiAoJWQpIiwgYmFzZSwgYnVmbGVuKTsKIAkJcmV0dXJuIC0xOwotCWlmICgoYmFzZSArIGJ1ZmZlcltiYXNlXSkgPj0gYnVmbGVuKQorCX0KKwlpZiAoYmFzZSArIGJ1ZmZlcltiYXNlXSA+PSBidWZsZW4pIHsKKwkJbGRtX2Vycm9yKCJiYXNlICglZCkgKyBidWZmZXJbYmFzZV0gKCVkKSA+PSBidWZsZW4gKCVkKSIsIGJhc2UsCisJCQkJYnVmZmVyW2Jhc2VdLCBidWZsZW4pOwogCQlyZXR1cm4gLTE7Ci0KKwl9CiAJcmV0dXJuIGJ1ZmZlcltiYXNlXSArIG9mZnNldCArIDE7CiB9CiAKQEAgLTEwNTQsNjAgKzEwNjMsOTggQEAKICAqIFJldHVybjogICd0cnVlJyAgIEB2YiBjb250YWlucyBhIFZvbHVtZSBWQkxLCiAgKiAgICAgICAgICAnZmFsc2UnICBAdmIgY29udGVudHMgYXJlIG5vdCBkZWZpbmVkCiAgKi8KLXN0YXRpYyBib29sIGxkbV9wYXJzZV92b2w1IChjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBzdHJ1Y3QgdmJsayAqdmIpCitzdGF0aWMgYm9vbCBsZG1fcGFyc2Vfdm9sNShjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBzdHJ1Y3QgdmJsayAqdmIpCiB7Ci0JaW50IHJfb2JqaWQsIHJfbmFtZSwgcl92dHlwZSwgcl9jaGlsZCwgcl9zaXplLCByX2lkMSwgcl9pZDIsIHJfc2l6ZTI7Ci0JaW50IHJfZHJpdmUsIGxlbjsKKwlpbnQgcl9vYmppZCwgcl9uYW1lLCByX3Z0eXBlLCByX2Rpc2FibGVfZHJpdmVfbGV0dGVyLCByX2NoaWxkLCByX3NpemU7CisJaW50IHJfaWQxLCByX2lkMiwgcl9zaXplMiwgcl9kcml2ZSwgbGVuOwogCXN0cnVjdCB2YmxrX3ZvbHUgKnZvbHU7CiAKLQlCVUdfT04gKCFidWZmZXIgfHwgIXZiKTsKLQotCXJfb2JqaWQgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgMCk7Ci0Jcl9uYW1lICAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX29iamlkKTsKLQlyX3Z0eXBlICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfbmFtZSk7Ci0Jcl9jaGlsZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDJFLCByX3Z0eXBlKTsKLQlyX3NpemUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4M0UsIHJfY2hpbGQpOwotCi0JaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0lEMSkKLQkJcl9pZDEgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDUzLCByX3NpemUpOwotCWVsc2UKKwlCVUdfT04oIWJ1ZmZlciB8fCAhdmIpOworCXJfb2JqaWQgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MTgsIDApOworCWlmIChyX29iamlkIDwgMCkgeworCQlsZG1fZXJyb3IoInJfb2JqaWQgJWQgPCAwIiwgcl9vYmppZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcl9uYW1lID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX29iamlkKTsKKwlpZiAocl9uYW1lIDwgMCkgeworCQlsZG1fZXJyb3IoInJfbmFtZSAlZCA8IDAiLCByX25hbWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfdnR5cGUgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfbmFtZSk7CisJaWYgKHJfdnR5cGUgPCAwKSB7CisJCWxkbV9lcnJvcigicl92dHlwZSAlZCA8IDAiLCByX3Z0eXBlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX2Rpc2FibGVfZHJpdmVfbGV0dGVyID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX3Z0eXBlKTsKKwlpZiAocl9kaXNhYmxlX2RyaXZlX2xldHRlciA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX2Rpc2FibGVfZHJpdmVfbGV0dGVyICVkIDwgMCIsCisJCQkJcl9kaXNhYmxlX2RyaXZlX2xldHRlcik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcl9jaGlsZCA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgyRCwgcl9kaXNhYmxlX2RyaXZlX2xldHRlcik7CisJaWYgKHJfY2hpbGQgPCAwKSB7CisJCWxkbV9lcnJvcigicl9jaGlsZCAlZCA8IDAiLCByX2NoaWxkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX3NpemUgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4M0QsIHJfY2hpbGQpOworCWlmIChyX3NpemUgPCAwKSB7CisJCWxkbV9lcnJvcigicl9zaXplICVkIDwgMCIsIHJfc2l6ZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0lEMSkgeworCQlyX2lkMSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHg1Miwgcl9zaXplKTsKKwkJaWYgKHJfaWQxIDwgMCkgeworCQkJbGRtX2Vycm9yKCJyX2lkMSAlZCA8IDAiLCByX2lkMSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9IGVsc2UKIAkJcl9pZDEgPSByX3NpemU7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQyKQotCQlyX2lkMiA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfaWQxKTsKLQllbHNlCisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0lEMikgeworCQlyX2lkMiA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHg1Miwgcl9pZDEpOworCQlpZiAocl9pZDIgPCAwKSB7CisJCQlsZG1fZXJyb3IoInJfaWQyICVkIDwgMCIsIHJfaWQyKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZQogCQlyX2lkMiA9IHJfaWQxOwotCi0JaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX1NJWkUpCi0JCXJfc2l6ZTIgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDUzLCByX2lkMik7Ci0JZWxzZQorCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9TSVpFKSB7CisJCXJfc2l6ZTIgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4NTIsIHJfaWQyKTsKKwkJaWYgKHJfc2l6ZTIgPCAwKSB7CisJCQlsZG1fZXJyb3IoInJfc2l6ZTIgJWQgPCAwIiwgcl9zaXplMik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9IGVsc2UKIAkJcl9zaXplMiA9IHJfaWQyOwotCi0JaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0RSSVZFKQotCQlyX2RyaXZlID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9zaXplMik7Ci0JZWxzZQotCQlyX2RyaXZlID0gcl9zaXplMjsKLQotCWxlbiA9IHJfZHJpdmU7Ci0JaWYgKGxlbiA8IDApCi0JCXJldHVybiBmYWxzZTsKLQotCWxlbiArPSBWQkxLX1NJWkVfVk9MNTsKLQlpZiAobGVuICE9IEJFMzIgKGJ1ZmZlciArIDB4MTQpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl2b2x1ID0gJnZiLT52YmxrLnZvbHU7Ci0KLQlsZG1fZ2V0X3ZzdHIgKGJ1ZmZlciArIDB4MTggKyByX25hbWUsICB2b2x1LT52b2x1bWVfdHlwZSwKLQkJc2l6ZW9mICh2b2x1LT52b2x1bWVfdHlwZSkpOwotCW1lbWNweSAodm9sdS0+dm9sdW1lX3N0YXRlLCBidWZmZXIgKyAweDE5ICsgcl92dHlwZSwKLQkJCXNpemVvZiAodm9sdS0+dm9sdW1lX3N0YXRlKSk7Ci0Jdm9sdS0+c2l6ZSA9IGxkbV9nZXRfdm51bSAoYnVmZmVyICsgMHgzRSArIHJfY2hpbGQpOwotCXZvbHUtPnBhcnRpdGlvbl90eXBlID0gYnVmZmVyWzB4NDIgKyByX3NpemVdOwotCW1lbWNweSAodm9sdS0+Z3VpZCwgYnVmZmVyICsgMHg0MyArIHJfc2l6ZSwgIHNpemVvZiAodm9sdS0+Z3VpZCkpOwogCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9EUklWRSkgewotCQlsZG1fZ2V0X3ZzdHIgKGJ1ZmZlciArIDB4NTMgKyByX3NpemUsICB2b2x1LT5kcml2ZV9oaW50LAotCQkJc2l6ZW9mICh2b2x1LT5kcml2ZV9oaW50KSk7CisJCXJfZHJpdmUgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4NTIsIHJfc2l6ZTIpOworCQlpZiAocl9kcml2ZSA8IDApIHsKKwkJCWxkbV9lcnJvcigicl9kcml2ZSAlZCA8IDAiLCByX2RyaXZlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZQorCQlyX2RyaXZlID0gcl9zaXplMjsKKwlsZW4gPSByX2RyaXZlOworCWlmIChsZW4gPCAwKSB7CisJCWxkbV9lcnJvcigibGVuICVkIDwgMCIsIGxlbik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJbGVuICs9IFZCTEtfU0laRV9WT0w1OworCWlmIChsZW4gPiBCRTMyKGJ1ZmZlciArIDB4MTQpKSB7CisJCWxkbV9lcnJvcigibGVuICVkID4gQkUzMihidWZmZXIgKyAweDE0KSAlZCIsIGxlbiwKKwkJCQlCRTMyKGJ1ZmZlciArIDB4MTQpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl2b2x1ID0gJnZiLT52YmxrLnZvbHU7CisJbGRtX2dldF92c3RyKGJ1ZmZlciArIDB4MTggKyByX25hbWUsIHZvbHUtPnZvbHVtZV90eXBlLAorCQkJc2l6ZW9mKHZvbHUtPnZvbHVtZV90eXBlKSk7CisJbWVtY3B5KHZvbHUtPnZvbHVtZV9zdGF0ZSwgYnVmZmVyICsgMHgxOCArIHJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIsCisJCQlzaXplb2Yodm9sdS0+dm9sdW1lX3N0YXRlKSk7CisJdm9sdS0+c2l6ZSA9IGxkbV9nZXRfdm51bShidWZmZXIgKyAweDNEICsgcl9jaGlsZCk7CisJdm9sdS0+cGFydGl0aW9uX3R5cGUgPSBidWZmZXJbMHg0MSArIHJfc2l6ZV07CisJbWVtY3B5KHZvbHUtPmd1aWQsIGJ1ZmZlciArIDB4NDIgKyByX3NpemUsIHNpemVvZih2b2x1LT5ndWlkKSk7CisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0RSSVZFKSB7CisJCWxkbV9nZXRfdnN0cihidWZmZXIgKyAweDUyICsgcl9zaXplLCB2b2x1LT5kcml2ZV9oaW50LAorCQkJCXNpemVvZih2b2x1LT5kcml2ZV9oaW50KSk7CiAJfQogCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9sZG0uaCBiL2ZzL3BhcnRpdGlvbnMvbGRtLmgKaW5kZXggZDJlNmEzMC4uODBmNjNiNSAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9sZG0uaAorKysgYi9mcy9wYXJ0aXRpb25zL2xkbS5oCkBAIC02OCw3ICs2OCw3IEBACiAjZGVmaW5lIFZCTEtfU0laRV9EU0szCQkxMgogI2RlZmluZSBWQkxLX1NJWkVfRFNLNAkJNDUKICNkZWZpbmUgVkJMS19TSVpFX1BSVDMJCTI4Ci0jZGVmaW5lIFZCTEtfU0laRV9WT0w1CQk1OQorI2RlZmluZSBWQkxLX1NJWkVfVk9MNQkJNTgKIAogLyogY29tcG9uZW50IHR5cGVzICovCiAjZGVmaW5lIENPTVBfU1RSSVBFCQkweDAxCQkvKiBTdHJpcGUtc2V0ICovCmRpZmYgLS1naXQgYS9mcy9wcm9jL2FycmF5LmMgYi9mcy9wcm9jL2FycmF5LmMKaW5kZXggOThlNzhlMi4uOTY1NjI1YSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9hcnJheS5jCisrKyBiL2ZzL3Byb2MvYXJyYXkuYwpAQCAtNjIsNiArNjIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgpAQCAtNzYsOSArNzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTg3LDEwICs4NywxMCBAQAogZG8geyBtZW1jcHkoYnVmZmVyLCBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsgXAogICAgICBidWZmZXIgKz0gc3RybGVuKHN0cmluZyk7IH0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqIHRhc2tfbmFtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKiBidWYpCitzdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfbmFtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZikKIHsKIAlpbnQgaTsKLQljaGFyICogbmFtZTsKKwljaGFyICpuYW1lOwogCWNoYXIgdGNvbW1bc2l6ZW9mKHAtPmNvbW0pXTsKIAogCWdldF90YXNrX2NvbW0odGNvbW0sIHApOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJIlggKGRlYWQpIgkJLyogMzIgKi8KIH07CiAKLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqIGdldF90YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpnZXRfdGFza19zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAl1bnNpZ25lZCBpbnQgc3RhdGUgPSAodHNrLT5zdGF0ZSAmIChUQVNLX1JVTk5JTkcgfAogCQkJCQkgICAgVEFTS19JTlRFUlJVUFRJQkxFIHwKQEAgLTE1Niw3ICsxNTYsNyBAQAogCXJldHVybiAqcDsKIH0KIAotc3RhdGljIGlubGluZSBjaGFyICogdGFza19zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZmZlcikKIHsKIAlzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ3JvdXBfaW5mbzsKIAlpbnQgZzsKQEAgLTE3Miw4ICsxNzIsOCBAQAogCQkiVWlkOlx0JWRcdCVkXHQlZFx0JWRcbiIKIAkJIkdpZDpcdCVkXHQlZFx0JWRcdCVkXG4iLAogCQlnZXRfdGFza19zdGF0ZShwKSwKLQkgICAgICAgCXAtPnRnaWQsIHAtPnBpZCwKLQkgICAgICAgCXBpZF9hbGl2ZShwKSA/IHJjdV9kZXJlZmVyZW5jZShwLT5yZWFsX3BhcmVudCktPnRnaWQgOiAwLAorCQlwLT50Z2lkLCBwLT5waWQsCisJCXBpZF9hbGl2ZShwKSA/IHJjdV9kZXJlZmVyZW5jZShwLT5yZWFsX3BhcmVudCktPnRnaWQgOiAwLAogCQlwaWRfYWxpdmUocCkgJiYgcC0+cHRyYWNlID8gcmN1X2RlcmVmZXJlbmNlKHAtPnBhcmVudCktPnBpZCA6IDAsCiAJCXAtPnVpZCwgcC0+ZXVpZCwgcC0+c3VpZCwgcC0+ZnN1aWQsCiAJCXAtPmdpZCwgcC0+ZWdpZCwgcC0+c2dpZCwgcC0+ZnNnaWQpOwpAQCAtMTkxLDE1ICsxOTEsMTUgQEAKIAlnZXRfZ3JvdXBfaW5mbyhncm91cF9pbmZvKTsKIAl0YXNrX3VubG9jayhwKTsKIAotCWZvciAoZyA9IDA7IGcgPCBtaW4oZ3JvdXBfaW5mby0+bmdyb3VwcyxOR1JPVVBTX1NNQUxMKTsgZysrKQotCQlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICIlZCAiLCBHUk9VUF9BVChncm91cF9pbmZvLGcpKTsKKwlmb3IgKGcgPSAwOyBnIDwgbWluKGdyb3VwX2luZm8tPm5ncm91cHMsIE5HUk9VUFNfU01BTEwpOyBnKyspCisJCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiVkICIsIEdST1VQX0FUKGdyb3VwX2luZm8sIGcpKTsKIAlwdXRfZ3JvdXBfaW5mbyhncm91cF9pbmZvKTsKIAogCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlxuIik7CiAJcmV0dXJuIGJ1ZmZlcjsKIH0KIAotc3RhdGljIGNoYXIgKiByZW5kZXJfc2lnc2V0X3QoY29uc3QgY2hhciAqaGVhZGVyLCBzaWdzZXRfdCAqc2V0LCBjaGFyICpidWZmZXIpCitzdGF0aWMgY2hhciAqcmVuZGVyX3NpZ3NldF90KGNvbnN0IGNoYXIgKmhlYWRlciwgc2lnc2V0X3QgKnNldCwgY2hhciAqYnVmZmVyKQogewogCWludCBpLCBsZW47CiAKQEAgLTIzOSw3ICsyMzksNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBjaGFyICogdGFza19zaWcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWZmZXIpCitzdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfc2lnKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc2lnc2V0X3QgcGVuZGluZywgc2hwZW5kaW5nLCBibG9ja2VkLCBpZ25vcmVkLCBjYXVnaHQ7CkBAIC0yODksMTQgKzI4OSwyMyBAQAogCQkJICAgIGNhcF90KHAtPmNhcF9lZmZlY3RpdmUpKTsKIH0KIAotaW50IHByb2NfcGlkX3N0YXR1cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIpCitzdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfY29udGV4dF9zd2l0Y2hfY291bnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCQkJCWNoYXIgKmJ1ZmZlcikKIHsKLQljaGFyICogb3JpZyA9IGJ1ZmZlcjsKKwlyZXR1cm4gYnVmZmVyICsgc3ByaW50ZihidWZmZXIsICJ2b2x1bnRhcnlfY3R4dF9zd2l0Y2hlczpcdCVsdVxuIgorCQkJICAgICJub252b2x1bnRhcnlfY3R4dF9zd2l0Y2hlczpcdCVsdVxuIiwKKwkJCSAgICBwLT5udmNzdywKKwkJCSAgICBwLT5uaXZjc3cpOworfQorCitpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQoreworCWNoYXIgKm9yaWcgPSBidWZmZXI7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKIAogCWJ1ZmZlciA9IHRhc2tfbmFtZSh0YXNrLCBidWZmZXIpOwogCWJ1ZmZlciA9IHRhc2tfc3RhdGUodGFzaywgYnVmZmVyKTsKLSAKKwogCWlmIChtbSkgewogCQlidWZmZXIgPSB0YXNrX21lbShtbSwgYnVmZmVyKTsKIAkJbW1wdXQobW0pOwpAQCAtMzA3LDYgKzMxNiw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfUzM5MCkKIAlidWZmZXIgPSB0YXNrX3Nob3dfcmVncyh0YXNrLCBidWZmZXIpOwogI2VuZGlmCisJYnVmZmVyID0gdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHModGFzaywgYnVmZmVyKTsKIAlyZXR1cm4gYnVmZmVyIC0gb3JpZzsKIH0KIApAQCAtMzMyLDcgKzM0Miw3IEBACiAKIHN0YXRpYyBjbG9ja190IHRhc2tfc3RpbWUoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCWNsb2NrX3Qgc3RpbWUgPSBjcHV0aW1lX3RvX2Nsb2NrX3QocC0+c3RpbWUpOworCWNsb2NrX3Qgc3RpbWU7CiAKIAkvKgogCSAqIFVzZSBDRlMncyBwcmVjaXNlIGFjY291bnRpbmcuICh3ZSBzdWJ0cmFjdCB1dGltZSBmcm9tCkBAIC0zNDQsOCArMzU0LDcgQEAKIAlyZXR1cm4gc3RpbWU7CiB9CiAKLQotc3RhdGljIGludCBkb190YXNrX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyLCBpbnQgd2hvbGUpCitzdGF0aWMgaW50IGRvX3Rhc2tfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlciwgaW50IHdob2xlKQogewogCXVuc2lnbmVkIGxvbmcgdnNpemUsIGVpcCwgZXNwLCB3Y2hhbiA9IH4wVUw7CiAJbG9uZyBwcmlvcml0eSwgbmljZTsKQEAgLTM1Myw3ICszNjIsNyBAQAogCXNpZ3NldF90IHNpZ2lnbiwgc2lnY2F0Y2g7CiAJY2hhciBzdGF0ZTsKIAlpbnQgcmVzOwotIAlwaWRfdCBwcGlkID0gMCwgcGdpZCA9IC0xLCBzaWQgPSAtMTsKKwlwaWRfdCBwcGlkID0gMCwgcGdpZCA9IC0xLCBzaWQgPSAtMTsKIAlpbnQgbnVtX3RocmVhZHMgPSAwOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydF90aW1lOwpAQCAtNDI0LDcgKzQzMyw3IEBACiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKCF3aG9sZSB8fCBudW1fdGhyZWFkczwyKQorCWlmICghd2hvbGUgfHwgbnVtX3RocmVhZHMgPCAyKQogCQl3Y2hhbiA9IGdldF93Y2hhbih0YXNrKTsKIAlpZiAoIXdob2xlKSB7CiAJCW1pbl9mbHQgPSB0YXNrLT5taW5fZmx0OwpAQCAtNDQwLDEyICs0NDksMTMgQEAKIAogCS8qIFRlbXBvcmFyeSB2YXJpYWJsZSBuZWVkZWQgZm9yIGdjYy0yLjk2ICovCiAJLyogY29udmVydCB0aW1lc3BlYyAtPiBuc2VjKi8KLQlzdGFydF90aW1lID0gKHVuc2lnbmVkIGxvbmcgbG9uZyl0YXNrLT5zdGFydF90aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQwotCQkJCSsgdGFzay0+c3RhcnRfdGltZS50dl9uc2VjOworCXN0YXJ0X3RpbWUgPQorCQkodW5zaWduZWQgbG9uZyBsb25nKXRhc2stPnJlYWxfc3RhcnRfdGltZS50dl9zZWMgKiBOU0VDX1BFUl9TRUMKKwkJCQkrIHRhc2stPnJlYWxfc3RhcnRfdGltZS50dl9uc2VjOwogCS8qIGNvbnZlcnQgbnNlYyAtPiB0aWNrcyAqLwogCXN0YXJ0X3RpbWUgPSBuc2VjX3RvX2Nsb2NrX3Qoc3RhcnRfdGltZSk7CiAKLQlyZXMgPSBzcHJpbnRmKGJ1ZmZlciwiJWQgKCVzKSAlYyAlZCAlZCAlZCAlZCAlZCAldSAlbHUgXAorCXJlcyA9IHNwcmludGYoYnVmZmVyLCAiJWQgKCVzKSAlYyAlZCAlZCAlZCAlZCAlZCAldSAlbHUgXAogJWx1ICVsdSAlbHUgJWx1ICVsdSAlbGQgJWxkICVsZCAlbGQgJWQgMCAlbGx1ICVsdSAlbGQgJWx1ICVsdSAlbHUgJWx1ICVsdSBcCiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVkICVkICV1ICV1ICVsbHVcbiIsCiAJCXRhc2stPnBpZCwKQEAgLTQ3MSw3ICs0ODEsNyBAQAogCQlzdGFydF90aW1lLAogCQl2c2l6ZSwKIAkJbW0gPyBnZXRfbW1fcnNzKG1tKSA6IDAsCi0JICAgICAgICByc3NsaW0sCisJCXJzc2xpbSwKIAkJbW0gPyBtbS0+c3RhcnRfY29kZSA6IDAsCiAJCW1tID8gbW0tPmVuZF9jb2RlIDogMCwKIAkJbW0gPyBtbS0+c3RhcnRfc3RhY2sgOiAwLApAQCAtNDkzLDE3ICs1MDMsMTcgQEAKIAkJdGFzay0+cnRfcHJpb3JpdHksCiAJCXRhc2stPnBvbGljeSwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZWxheWFjY3RfYmxraW9fdGlja3ModGFzaykpOwotCWlmKG1tKQorCWlmIChtbSkKIAkJbW1wdXQobW0pOwogCXJldHVybiByZXM7CiB9CiAKLWludCBwcm9jX3RpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlcikKK2ludCBwcm9jX3RpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQogewogCXJldHVybiBkb190YXNrX3N0YXQodGFzaywgYnVmZmVyLCAwKTsKIH0KIAotaW50IHByb2NfdGdpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlcikKK2ludCBwcm9jX3RnaWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKIHsKIAlyZXR1cm4gZG9fdGFza19zdGF0KHRhc2ssIGJ1ZmZlciwgMSk7CiB9CkBAIC01MTIsMTIgKzUyMiwxMiBAQAogewogCWludCBzaXplID0gMCwgcmVzaWRlbnQgPSAwLCBzaGFyZWQgPSAwLCB0ZXh0ID0gMCwgbGliID0gMCwgZGF0YSA9IDA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKLQkKKwogCWlmIChtbSkgewogCQlzaXplID0gdGFza19zdGF0bShtbSwgJnNoYXJlZCwgJnRleHQsICZkYXRhLCAmcmVzaWRlbnQpOwogCQltbXB1dChtbSk7CiAJfQogCi0JcmV0dXJuIHNwcmludGYoYnVmZmVyLCIlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKIAkJICAgICAgIHNpemUsIHJlc2lkZW50LCBzaGFyZWQsIHRleHQsIGxpYiwgZGF0YSwgMCk7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IDQ2ZWE1ZDUuLjQyY2I0ZjUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC02Nyw3ICs2Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KQEAgLTIwNCwxMiArMjAzLDE3IEBACiAJaW50IHJlcyA9IDA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKIAlpZiAobW0pIHsKLQkJdW5zaWduZWQgaW50IGxlbiA9IG1tLT5lbnZfZW5kIC0gbW0tPmVudl9zdGFydDsKKwkJdW5zaWduZWQgaW50IGxlbjsKKworCQlyZXMgPSAtRVNSQ0g7CisJCWlmICghcHRyYWNlX21heV9hdHRhY2godGFzaykpCisJCQlnb3RvIG91dDsKKworCQlsZW4gID0gbW0tPmVudl9lbmQgLSBtbS0+ZW52X3N0YXJ0OwogCQlpZiAobGVuID4gUEFHRV9TSVpFKQogCQkJbGVuID0gUEFHRV9TSVpFOwogCQlyZXMgPSBhY2Nlc3NfcHJvY2Vzc192bSh0YXNrLCBtbS0+ZW52X3N0YXJ0LCBidWZmZXIsIGxlbiwgMCk7Ci0JCWlmICghcHRyYWNlX21heV9hdHRhY2godGFzaykpCi0JCQlyZXMgPSAtRVNSQ0g7CitvdXQ6CiAJCW1tcHV0KG1tKTsKIAl9CiAJcmV0dXJuIHJlczsKQEAgLTI3OSw3ICsyODMsNyBAQAogc3RhdGljIGludCBwcm9jX3BpZF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKIHsKIAl1bnNpZ25lZCBsb25nIHdjaGFuOwotCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOXTsKIAogCXdjaGFuID0gZ2V0X3djaGFuKHRhc2spOwogCkBAIC04MTIsNzEgKzgxNiw2IEBACiB9OwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU0VDQ09NUAotc3RhdGljIHNzaXplX3Qgc2VjY29tcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0JY2hhciBfX2J1ZlsyMF07Ci0Jc2l6ZV90IGxlbjsKLQotCWlmICghdHNrKQotCQlyZXR1cm4gLUVTUkNIOwotCS8qIG5vIG5lZWQgdG8gcHJpbnQgdGhlIHRyYWlsaW5nIHplcm8sIHNvIHVzZSBvbmx5IGxlbiAqLwotCWxlbiA9IHNwcmludGYoX19idWYsICIldVxuIiwgdHNrLT5zZWNjb21wLm1vZGUpOwotCXB1dF90YXNrX3N0cnVjdCh0c2spOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIF9fYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZWNjb21wX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGdldF9wcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOwotCWNoYXIgX19idWZbMjBdLCAqZW5kOwotCXVuc2lnbmVkIGludCBzZWNjb21wX21vZGU7Ci0Jc3NpemVfdCByZXN1bHQ7Ci0KLQlyZXN1bHQgPSAtRVNSQ0g7Ci0JaWYgKCF0c2spCi0JCWdvdG8gb3V0X25vX3Rhc2s7Ci0KLQkvKiBjYW4gc2V0IGl0IG9ubHkgb25jZSB0byBiZSBldmVuIG1vcmUgc2VjdXJlICovCi0JcmVzdWx0ID0gLUVQRVJNOwotCWlmICh1bmxpa2VseSh0c2stPnNlY2NvbXAubW9kZSkpCi0JCWdvdG8gb3V0OwotCi0JcmVzdWx0ID0gLUVGQVVMVDsKLQltZW1zZXQoX19idWYsIDAsIHNpemVvZihfX2J1ZikpOwotCWNvdW50ID0gbWluKGNvdW50LCBzaXplb2YoX19idWYpIC0gMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKF9fYnVmLCBidWYsIGNvdW50KSkKLQkJZ290byBvdXQ7Ci0KLQlzZWNjb21wX21vZGUgPSBzaW1wbGVfc3RydG91bChfX2J1ZiwgJmVuZCwgMCk7Ci0JaWYgKCplbmQgPT0gJ1xuJykKLQkJZW5kKys7Ci0JcmVzdWx0ID0gLUVJTlZBTDsKLQlpZiAoc2VjY29tcF9tb2RlICYmIHNlY2NvbXBfbW9kZSA8PSBOUl9TRUNDT01QX01PREVTKSB7Ci0JCXRzay0+c2VjY29tcC5tb2RlID0gc2VjY29tcF9tb2RlOwotCQlzZXRfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1NFQ0NPTVApOwotCX0gZWxzZQotCQlnb3RvIG91dDsKLQlyZXN1bHQgPSAtRUlPOwotCWlmICh1bmxpa2VseSghKGVuZCAtIF9fYnVmKSkpCi0JCWdvdG8gb3V0OwotCXJlc3VsdCA9IGVuZCAtIF9fYnVmOwotb3V0OgotCXB1dF90YXNrX3N0cnVjdCh0c2spOwotb3V0X25vX3Rhc2s6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zZWNjb21wX29wZXJhdGlvbnMgPSB7Ci0JLnJlYWQJCT0gc2VjY29tcF9yZWFkLAotCS53cml0ZQkJPSBzZWNjb21wX3dyaXRlLAotfTsKLSNlbmRpZiAvKiBDT05GSUdfU0VDQ09NUCAqLwotCiAjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTgogc3RhdGljIHNzaXplX3QgcHJvY19mYXVsdF9pbmplY3RfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAogCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQpAQCAtMjAzNyw5ICsxOTc2LDYgQEAKIAlSRUcoIm51bWFfbWFwcyIsICBTX0lSVUdPLCBudW1hX21hcHMpLAogI2VuZGlmCiAJUkVHKCJtZW0iLCAgICAgICAgU19JUlVTUnxTX0lXVVNSLCBtZW0pLAotI2lmZGVmIENPTkZJR19TRUNDT01QCi0JUkVHKCJzZWNjb21wIiwgICAgU19JUlVTUnxTX0lXVVNSLCBzZWNjb21wKSwKLSNlbmRpZgogCUxOSygiY3dkIiwgICAgICAgIGN3ZCksCiAJTE5LKCJyb290IiwgICAgICAgcm9vdCksCiAJTE5LKCJleGUiLCAgICAgICAgZXhlKSwKQEAgLTIzMjQsOSArMjI2MCw2IEBACiAJUkVHKCJudW1hX21hcHMiLCBTX0lSVUdPLCBudW1hX21hcHMpLAogI2VuZGlmCiAJUkVHKCJtZW0iLCAgICAgICBTX0lSVVNSfFNfSVdVU1IsIG1lbSksCi0jaWZkZWYgQ09ORklHX1NFQ0NPTVAKLQlSRUcoInNlY2NvbXAiLCAgIFNfSVJVU1J8U19JV1VTUiwgc2VjY29tcCksCi0jZW5kaWYKIAlMTksoImN3ZCIsICAgICAgIGN3ZCksCiAJTE5LKCJyb290IiwgICAgICByb290KSwKIAlMTksoImV4ZSIsICAgICAgIGV4ZSksCmRpZmYgLS1naXQgYS9mcy9wcm9jL2dlbmVyaWMuYyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCmluZGV4IDhhNDBlMTUuLmI1ZTcxNTUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvZ2VuZXJpYy5jCisrKyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTUyOSwxMiArNTMwLDYgQEAKIAkJcmV0dXJuIC1FQUdBSU47CiAJZHAtPmxvd19pbm8gPSBpOwogCi0Jc3Bpbl9sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKLQlkcC0+bmV4dCA9IGRpci0+c3ViZGlyOwotCWRwLT5wYXJlbnQgPSBkaXI7Ci0JZGlyLT5zdWJkaXIgPSBkcDsKLQlzcGluX3VubG9jaygmcHJvY19zdWJkaXJfbG9jayk7Ci0KIAlpZiAoU19JU0RJUihkcC0+bW9kZSkpIHsKIAkJaWYgKGRwLT5wcm9jX2lvcHMgPT0gTlVMTCkgewogCQkJZHAtPnByb2NfZm9wcyA9ICZwcm9jX2Rpcl9vcGVyYXRpb25zOwpAQCAtNTUwLDYgKzU0NSwxMyBAQAogCQlpZiAoZHAtPnByb2NfaW9wcyA9PSBOVUxMKQogCQkJZHAtPnByb2NfaW9wcyA9ICZwcm9jX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIAl9CisKKwlzcGluX2xvY2soJnByb2Nfc3ViZGlyX2xvY2spOworCWRwLT5uZXh0ID0gZGlyLT5zdWJkaXI7CisJZHAtPnBhcmVudCA9IGRpcjsKKwlkaXItPnN1YmRpciA9IGRwOworCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC02MTMsNiArNjE1LDkgQEAKIAllbnQtPm5hbWVsZW4gPSBsZW47CiAJZW50LT5tb2RlID0gbW9kZTsKIAllbnQtPm5saW5rID0gbmxpbms7CisJZW50LT5wZGVfdXNlcnMgPSAwOworCXNwaW5fbG9ja19pbml0KCZlbnQtPnBkZV91bmxvYWRfbG9jayk7CisJZW50LT5wZGVfdW5sb2FkX2NvbXBsZXRpb24gPSBOVUxMOwogIG91dDoKIAlyZXR1cm4gZW50OwogfQpAQCAtNjQ5LDkgKzY1NCw2IEBACiAKIAllbnQgPSBwcm9jX2NyZWF0ZSgmcGFyZW50LCBuYW1lLCBTX0lGRElSIHwgbW9kZSwgMik7CiAJaWYgKGVudCkgewotCQllbnQtPnByb2NfZm9wcyA9ICZwcm9jX2Rpcl9vcGVyYXRpb25zOwotCQllbnQtPnByb2NfaW9wcyA9ICZwcm9jX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwotCiAJCWlmIChwcm9jX3JlZ2lzdGVyKHBhcmVudCwgZW50KSA8IDApIHsKIAkJCWtmcmVlKGVudCk7CiAJCQllbnQgPSBOVUxMOwpAQCAtNjg2LDEwICs2ODgsNiBAQAogCiAJZW50ID0gcHJvY19jcmVhdGUoJnBhcmVudCxuYW1lLG1vZGUsbmxpbmspOwogCWlmIChlbnQpIHsKLQkJaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJCWVudC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7Ci0JCQllbnQtPnByb2NfaW9wcyA9ICZwcm9jX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwotCQl9CiAJCWlmIChwcm9jX3JlZ2lzdGVyKHBhcmVudCwgZW50KSA8IDApIHsKIAkJCWtmcmVlKGVudCk7CiAJCQllbnQgPSBOVUxMOwpAQCAtNzM0LDkgKzczMiwzNSBAQAogCQlkZSA9ICpwOwogCQkqcCA9IGRlLT5uZXh0OwogCQlkZS0+bmV4dCA9IE5VTEw7CisKKwkJc3Bpbl9sb2NrKCZkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJLyoKKwkJICogU3RvcCBhY2NlcHRpbmcgbmV3IGNhbGxlcnMgaW50byBtb2R1bGUuIElmIHlvdSdyZQorCQkgKiBkeW5hbWljYWxseSBhbGxvY2F0aW5nIC0+cHJvY19mb3BzLCBzYXZlIGEgcG9pbnRlciBzb21ld2hlcmUuCisJCSAqLworCQlkZS0+cHJvY19mb3BzID0gTlVMTDsKKwkJLyogV2FpdCB1bnRpbCBhbGwgZXhpc3RpbmcgY2FsbGVycyBpbnRvIG1vZHVsZSBhcmUgZG9uZS4gKi8KKwkJaWYgKGRlLT5wZGVfdXNlcnMgPiAwKSB7CisJCQlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjKTsKKworCQkJaWYgKCFkZS0+cGRlX3VubG9hZF9jb21wbGV0aW9uKQorCQkJCWRlLT5wZGVfdW5sb2FkX2NvbXBsZXRpb24gPSAmYzsKKworCQkJc3Bpbl91bmxvY2soJmRlLT5wZGVfdW5sb2FkX2xvY2spOworCQkJc3Bpbl91bmxvY2soJnByb2Nfc3ViZGlyX2xvY2spOworCisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKGRlLT5wZGVfdW5sb2FkX2NvbXBsZXRpb24pOworCisJCQlzcGluX2xvY2soJnByb2Nfc3ViZGlyX2xvY2spOworCQkJZ290byBjb250aW51ZV9yZW1vdmluZzsKKwkJfQorCQlzcGluX3VubG9jaygmZGUtPnBkZV91bmxvYWRfbG9jayk7CisKK2NvbnRpbnVlX3JlbW92aW5nOgogCQlpZiAoU19JU0RJUihkZS0+bW9kZSkpCiAJCQlwYXJlbnQtPm5saW5rLS07Ci0JCXByb2Nfa2lsbF9pbm9kZXMoZGUpOworCQlpZiAoIVNfSVNSRUcoZGUtPm1vZGUpKQorCQkJcHJvY19raWxsX2lub2RlcyhkZSk7CiAJCWRlLT5ubGluayA9IDA7CiAJCVdBUk5fT04oZGUtPnN1YmRpcik7CiAJCWlmICghYXRvbWljX3JlYWQoJmRlLT5jb3VudCkpCmRpZmYgLS1naXQgYS9mcy9wcm9jL2lub2RlLmMgYi9mcy9wcm9jL2lub2RlLmMKaW5kZXggZDVjZTY1Yy4uZGQyOGU4NiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9pbm9kZS5jCisrKyBiL2ZzL3Byb2MvaW5vZGUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTQwLDYgKzE0MSwyNTEgQEAKIAkucmVtb3VudF9mcwk9IHByb2NfcmVtb3VudCwKIH07CiAKK3N0YXRpYyB2b2lkIHBkZV91c2Vyc19kZWMoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUpCit7CisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJcGRlLT5wZGVfdXNlcnMtLTsKKwlpZiAocGRlLT5wZGVfdW5sb2FkX2NvbXBsZXRpb24gJiYgcGRlLT5wZGVfdXNlcnMgPT0gMCkKKwkJY29tcGxldGUocGRlLT5wZGVfdW5sb2FkX2NvbXBsZXRpb24pOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7Cit9CisKK3N0YXRpYyBsb2ZmX3QgcHJvY19yZWdfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCWxvZmZfdCBydiA9IC1FSU5WQUw7CisJbG9mZl90ICgqbGxzZWVrKShzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkvKgorCSAqIHJlbW92ZV9wcm9jX2VudHJ5KCkgaXMgZ29pbmcgdG8gZGVsZXRlIFBERSAoYXMgcGFydCBvZiBtb2R1bGUKKwkgKiBjbGVhbnVwIHNlcXVlbmNlKS4gTm8gbmV3IGNhbGxlcnMgaW50byBtb2R1bGUgYWxsb3dlZC4KKwkgKi8KKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJLyoKKwkgKiBCdW1wIHJlZmNvdW50IHNvIHRoYXQgcmVtb3ZlX3Byb2NfZW50cnkgd2lsbCB3YWlsIGZvciAtPmxsc2VlayB0bworCSAqIGNvbXBsZXRlLgorCSAqLworCXBkZS0+cGRlX3VzZXJzKys7CisJLyoKKwkgKiBTYXZlIGZ1bmN0aW9uIHBvaW50ZXIgdW5kZXIgbG9jaywgdG8gcHJvdGVjdCBhZ2FpbnN0IC0+cHJvY19mb3BzCisJICogTlVMTCdpZnlpbmcgcmlnaHQgYWZ0ZXIgLT5wZGVfdW5sb2FkX2xvY2sgaXMgZHJvcHBlZC4KKwkgKi8KKwlsbHNlZWsgPSBwZGUtPnByb2NfZm9wcy0+bGxzZWVrOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAoIWxsc2VlaykKKwkJbGxzZWVrID0gZGVmYXVsdF9sbHNlZWs7CisJcnYgPSBsbHNlZWsoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19yZWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJc3NpemVfdCBydiA9IC1FSU87CisJc3NpemVfdCAoKnJlYWQpKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJcmVhZCA9IHBkZS0+cHJvY19mb3BzLT5yZWFkOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAocmVhZCkKKwkJcnYgPSByZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19yZWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCXNzaXplX3QgcnYgPSAtRUlPOworCXNzaXplX3QgKCp3cml0ZSkoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwl3cml0ZSA9IHBkZS0+cHJvY19mb3BzLT53cml0ZTsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKHdyaXRlKQorCQlydiA9IHdyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwcm9jX3JlZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnB0cykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwl1bnNpZ25lZCBpbnQgcnYgPSAwOworCXVuc2lnbmVkIGludCAoKnBvbGwpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXBvbGwgPSBwZGUtPnByb2NfZm9wcy0+cG9sbDsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKHBvbGwpCisJCXJ2ID0gcG9sbChmaWxlLCBwdHMpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGxvbmcgcHJvY19yZWdfdW5sb2NrZWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCWxvbmcgcnYgPSAtRU5PVFRZOworCWxvbmcgKCp1bmxvY2tlZF9pb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKwlpbnQgKCppb2N0bCkoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwl1bmxvY2tlZF9pb2N0bCA9IHBkZS0+cHJvY19mb3BzLT51bmxvY2tlZF9pb2N0bDsKKwlpb2N0bCA9IHBkZS0+cHJvY19mb3BzLT5pb2N0bDsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKHVubG9ja2VkX2lvY3RsKSB7CisJCXJ2ID0gdW5sb2NrZWRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlpZiAocnYgPT0gLUVOT0lPQ1RMQ01EKQorCQkJcnYgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoaW9jdGwpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJcnYgPSBpb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgcHJvY19yZWdfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlsb25nIHJ2ID0gLUVOT1RUWTsKKwlsb25nICgqY29tcGF0X2lvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJY29tcGF0X2lvY3RsID0gcGRlLT5wcm9jX2ZvcHMtPmNvbXBhdF9pb2N0bDsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKGNvbXBhdF9pb2N0bCkKKwkJcnYgPSBjb21wYXRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHByb2NfcmVnX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCWludCBydiA9IC1FSU87CisJaW50ICgqbW1hcCkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJbW1hcCA9IHBkZS0+cHJvY19mb3BzLT5tbWFwOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAobW1hcCkKKwkJcnYgPSBtbWFwKGZpbGUsIHZtYSk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHByb2NfcmVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoaW5vZGUpOworCWludCBydiA9IDA7CisJaW50ICgqb3Blbikoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJb3BlbiA9IHBkZS0+cHJvY19mb3BzLT5vcGVuOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAob3BlbikKKwkJcnYgPSBvcGVuKGlub2RlLCBmaWxlKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19yZWdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7CisJaW50IHJ2ID0gMDsKKwlpbnQgKCpyZWxlYXNlKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwlyZWxlYXNlID0gcGRlLT5wcm9jX2ZvcHMtPnJlbGVhc2U7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChyZWxlYXNlKQorCQlydiA9IHJlbGVhc2UoaW5vZGUsIGZpbGUpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19yZWdfZmlsZV9vcHMgPSB7CisJLmxsc2VlawkJPSBwcm9jX3JlZ19sbHNlZWssCisJLnJlYWQJCT0gcHJvY19yZWdfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19yZWdfd3JpdGUsCisJLnBvbGwJCT0gcHJvY19yZWdfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwJPSBwcm9jX3JlZ191bmxvY2tlZF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IHByb2NfcmVnX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCS5tbWFwCQk9IHByb2NfcmVnX21tYXAsCisJLm9wZW4JCT0gcHJvY19yZWdfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfcmVnX3JlbGVhc2UsCit9OworCiBzdHJ1Y3QgaW5vZGUgKnByb2NfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBpbm8sCiAJCQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKIHsKQEAgLTE2Niw4ICs0MTIsMTIgQEAKIAkJCWlub2RlLT5pX25saW5rID0gZGUtPm5saW5rOwogCQlpZiAoZGUtPnByb2NfaW9wcykKIAkJCWlub2RlLT5pX29wID0gZGUtPnByb2NfaW9wczsKLQkJaWYgKGRlLT5wcm9jX2ZvcHMpCi0JCQlpbm9kZS0+aV9mb3AgPSBkZS0+cHJvY19mb3BzOworCQlpZiAoZGUtPnByb2NfZm9wcykgeworCQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfcmVnX2ZpbGVfb3BzOworCQkJZWxzZQorCQkJCWlub2RlLT5pX2ZvcCA9IGRlLT5wcm9jX2ZvcHM7CisJCX0KIAl9CiAKIAlyZXR1cm4gaW5vZGU7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfbWlzYy5jIGIvZnMvcHJvYy9wcm9jX21pc2MuYwppbmRleCA1ZmQ0OWU0Li5kMjRiOGQ0IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfbWlzYy5jCisrKyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKQEAgLTEwNSw2ICsxMDUsNyBAQAogCWNwdXRpbWVfdCBpZGxldGltZSA9IGNwdXRpbWVfYWRkKGluaXRfdGFzay51dGltZSwgaW5pdF90YXNrLnN0aW1lKTsKIAogCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ1cHRpbWUpOworCW1vbm90b25pY190b19ib290YmFzZWQoJnVwdGltZSk7CiAJY3B1dGltZV90b190aW1lc3BlYyhpZGxldGltZSwgJmlkbGUpOwogCWxlbiA9IHNwcmludGYocGFnZSwiJWx1LiUwMmx1ICVsdS4lMDJsdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nKSB1cHRpbWUudHZfc2VjLApAQCAtNDQzLDEyICs0NDQsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGppZjsKIAljcHV0aW1lNjRfdCB1c2VyLCBuaWNlLCBzeXN0ZW0sIGlkbGUsIGlvd2FpdCwgaXJxLCBzb2Z0aXJxLCBzdGVhbDsKIAl1NjQgc3VtID0gMDsKKwlzdHJ1Y3QgdGltZXNwZWMgYm9vdHRpbWU7CiAKIAl1c2VyID0gbmljZSA9IHN5c3RlbSA9IGlkbGUgPSBpb3dhaXQgPQogCQlpcnEgPSBzb2Z0aXJxID0gc3RlYWwgPSBjcHV0aW1lNjRfemVybzsKLQlqaWYgPSAtIHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYzsKLQlpZiAod2FsbF90b19tb25vdG9uaWMudHZfbnNlYykKLQkJLS1qaWY7CisJZ2V0Ym9vdHRpbWUoJmJvb3R0aW1lKTsKKwlqaWYgPSBib290dGltZS50dl9zZWM7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlpbnQgajsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY190dHkuYyBiL2ZzL3Byb2MvcHJvY190dHkuYwppbmRleCBiM2E0NzNiLi4yMjg0NjIyIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfdHR5LmMKKysrIGIvZnMvcHJvYy9wcm9jX3R0eS5jCkBAIC02OSw3ICs2OSw3IEBACiAKIHN0YXRpYyBpbnQgc2hvd190dHlfZHJpdmVyKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgdHR5X2RyaXZlciAqcCA9IHY7CisJc3RydWN0IHR0eV9kcml2ZXIgKnAgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCB0dHlfZHJpdmVyLCB0dHlfZHJpdmVycyk7CiAJZGV2X3QgZnJvbSA9IE1LREVWKHAtPm1ham9yLCBwLT5taW5vcl9zdGFydCk7CiAJZGV2X3QgdG8gPSBmcm9tICsgcC0+bnVtOwogCkBAIC0xMDYsMjIgKzEwNiwxMyBAQAogLyogaXRlcmF0b3IgKi8KIHN0YXRpYyB2b2lkICp0X3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKLQlsb2ZmX3QgbCA9ICpwb3M7Ci0KIAltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gocCwgJnR0eV9kcml2ZXJzKQotCQlpZiAoIWwtLSkKLQkJCXJldHVybiBsaXN0X2VudHJ5KHAsIHN0cnVjdCB0dHlfZHJpdmVyLCB0dHlfZHJpdmVycyk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZ0dHlfZHJpdmVycywgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICp0X25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwID0gKChzdHJ1Y3QgdHR5X2RyaXZlciAqKXYpLT50dHlfZHJpdmVycy5uZXh0OwotCSgqcG9zKSsrOwotCXJldHVybiBwPT0mdHR5X2RyaXZlcnMgPyBOVUxMIDoKLQkJCWxpc3RfZW50cnkocCwgc3RydWN0IHR0eV9kcml2ZXIsIHR0eV9kcml2ZXJzKTsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmdHR5X2RyaXZlcnMsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIHRfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCmRpZmYgLS1naXQgYS9mcy9xdW90YS5jIGIvZnMvcXVvdGEuYwppbmRleCA5ZjIzN2Q2Li5lNjU3N2FjIDEwMDY0NAotLS0gYS9mcy9xdW90YS5jCisrKyBiL2ZzL3F1b3RhLmMKQEAgLTEwLDEyICsxMCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyogQ2hlY2sgdmFsaWRpdHkgb2YgZ2VuZXJpYyBxdW90YWN0bCBjb21tYW5kcyAqLwogc3RhdGljIGludCBnZW5lcmljX3F1b3RhY3RsX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgY21kLCBxaWRfdCBpZCkKQEAgLTM4NCwzICszODYsMTE5IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSB8fCBkZWZpbmVkKENPTkZJR19JQTY0KQorLyoKKyAqIFRoaXMgY29kZSB3b3JrcyBvbmx5IGZvciAzMiBiaXQgcXVvdGEgdG9vbHMgb3ZlciA2NCBiaXQgT1MgKHg4Nl82NCwgaWE2NCkKKyAqIGFuZCBpcyBuZWNlc3NhcnkgZHVlIHRvIGFsaWdubWVudCBwcm9ibGVtcy4KKyAqLworc3RydWN0IGNvbXBhdF9pZl9kcWJsayB7CisJY29tcGF0X3U2NCBkcWJfYmhhcmRsaW1pdDsKKwljb21wYXRfdTY0IGRxYl9ic29mdGxpbWl0OworCWNvbXBhdF91NjQgZHFiX2N1cnNwYWNlOworCWNvbXBhdF91NjQgZHFiX2loYXJkbGltaXQ7CisJY29tcGF0X3U2NCBkcWJfaXNvZnRsaW1pdDsKKwljb21wYXRfdTY0IGRxYl9jdXJpbm9kZXM7CisJY29tcGF0X3U2NCBkcWJfYnRpbWU7CisJY29tcGF0X3U2NCBkcWJfaXRpbWU7CisJY29tcGF0X3VpbnRfdCBkcWJfdmFsaWQ7Cit9OworCisvKiBYRlMgc3RydWN0dXJlcyAqLworc3RydWN0IGNvbXBhdF9mc19xZmlsZXN0YXQgeworCWNvbXBhdF91NjQgZHFiX2JoYXJkbGltaXQ7CisJY29tcGF0X3U2NCBxZnNfbmJsa3M7CisJY29tcGF0X3VpbnRfdCBxZnNfbmV4dGVudHM7Cit9OworCitzdHJ1Y3QgY29tcGF0X2ZzX3F1b3RhX3N0YXQgeworCV9fczgJCXFzX3ZlcnNpb247CisJX191MTYJCXFzX2ZsYWdzOworCV9fczgJCXFzX3BhZDsKKwlzdHJ1Y3QgY29tcGF0X2ZzX3FmaWxlc3RhdAlxc191cXVvdGE7CisJc3RydWN0IGNvbXBhdF9mc19xZmlsZXN0YXQJcXNfZ3F1b3RhOworCWNvbXBhdF91aW50X3QJcXNfaW5jb3JlZHFzOworCWNvbXBhdF9pbnRfdAlxc19idGltZWxpbWl0OworCWNvbXBhdF9pbnRfdAlxc19pdGltZWxpbWl0OworCWNvbXBhdF9pbnRfdAlxc19ydGJ0aW1lbGltaXQ7CisJX191MTYJCXFzX2J3YXJubGltaXQ7CisJX191MTYJCXFzX2l3YXJubGltaXQ7Cit9OworCithc21saW5rYWdlIGxvbmcgc3lzMzJfcXVvdGFjdGwodW5zaWduZWQgaW50IGNtZCwgY29uc3QgY2hhciBfX3VzZXIgKnNwZWNpYWwsCisJCQkJCQlxaWRfdCBpZCwgdm9pZCBfX3VzZXIgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IGNtZHM7CisJc3RydWN0IGlmX2RxYmxrIF9fdXNlciAqZHFibGs7CisJc3RydWN0IGNvbXBhdF9pZl9kcWJsayBfX3VzZXIgKmNvbXBhdF9kcWJsazsKKwlzdHJ1Y3QgZnNfcXVvdGFfc3RhdCBfX3VzZXIgKmZzcXN0YXQ7CisJc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0IF9fdXNlciAqY29tcGF0X2ZzcXN0YXQ7CisJY29tcGF0X3VpbnRfdCBkYXRhOworCXUxNiB4ZGF0YTsKKwlsb25nIHJldDsKKworCWNtZHMgPSBjbWQgPj4gU1VCQ01EU0hJRlQ7CisKKwlzd2l0Y2ggKGNtZHMpIHsKKwljYXNlIFFfR0VUUVVPVEE6CisJCWRxYmxrID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBpZl9kcWJsaykpOworCQljb21wYXRfZHFibGsgPSBhZGRyOworCQlyZXQgPSBzeXNfcXVvdGFjdGwoY21kLCBzcGVjaWFsLCBpZCwgZHFibGspOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCWlmIChjb3B5X2luX3VzZXIoY29tcGF0X2RxYmxrLCBkcWJsaywgc2l6ZW9mKCpjb21wYXRfZHFibGspKSB8fAorCQkJZ2V0X3VzZXIoZGF0YSwgJmRxYmxrLT5kcWJfdmFsaWQpIHx8CisJCQlwdXRfdXNlcihkYXRhLCAmY29tcGF0X2RxYmxrLT5kcWJfdmFsaWQpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBRX1NFVFFVT1RBOgorCQlkcWJsayA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgaWZfZHFibGspKTsKKwkJY29tcGF0X2RxYmxrID0gYWRkcjsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfaW5fdXNlcihkcWJsaywgY29tcGF0X2RxYmxrLCBzaXplb2YoKmNvbXBhdF9kcWJsaykpIHx8CisJCQlnZXRfdXNlcihkYXRhLCAmY29tcGF0X2RxYmxrLT5kcWJfdmFsaWQpIHx8CisJCQlwdXRfdXNlcihkYXRhLCAmZHFibGstPmRxYl92YWxpZCkpCisJCQlicmVhazsKKwkJcmV0ID0gc3lzX3F1b3RhY3RsKGNtZCwgc3BlY2lhbCwgaWQsIGRxYmxrKTsKKwkJYnJlYWs7CisJY2FzZSBRX1hHRVRRU1RBVDoKKwkJZnNxc3RhdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgZnNfcXVvdGFfc3RhdCkpOworCQljb21wYXRfZnNxc3RhdCA9IGFkZHI7CisJCXJldCA9IHN5c19xdW90YWN0bChjbWQsIHNwZWNpYWwsIGlkLCBmc3FzdGF0KTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUZBVUxUOworCQkvKiBDb3B5aW5nIHFzX3ZlcnNpb24sIHFzX2ZsYWdzLCBxc19wYWQgKi8KKwkJaWYgKGNvcHlfaW5fdXNlcihjb21wYXRfZnNxc3RhdCwgZnNxc3RhdCwKKwkJCW9mZnNldG9mKHN0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCwgcXNfdXF1b3RhKSkpCisJCQlicmVhazsKKwkJLyogQ29weWluZyBxc191cXVvdGEgKi8KKwkJaWYgKGNvcHlfaW5fdXNlcigmY29tcGF0X2ZzcXN0YXQtPnFzX3VxdW90YSwKKwkJCSZmc3FzdGF0LT5xc191cXVvdGEsCisJCQlzaXplb2YoY29tcGF0X2ZzcXN0YXQtPnFzX3VxdW90YSkpIHx8CisJCQlnZXRfdXNlcihkYXRhLCAmZnNxc3RhdC0+cXNfdXF1b3RhLnFmc19uZXh0ZW50cykgfHwKKwkJCXB1dF91c2VyKGRhdGEsICZjb21wYXRfZnNxc3RhdC0+cXNfdXF1b3RhLnFmc19uZXh0ZW50cykpCisJCQlicmVhazsKKwkJLyogQ29weWluZyBxc19ncXVvdGEgKi8KKwkJaWYgKGNvcHlfaW5fdXNlcigmY29tcGF0X2ZzcXN0YXQtPnFzX2dxdW90YSwKKwkJCSZmc3FzdGF0LT5xc19ncXVvdGEsCisJCQlzaXplb2YoY29tcGF0X2ZzcXN0YXQtPnFzX2dxdW90YSkpIHx8CisJCQlnZXRfdXNlcihkYXRhLCAmZnNxc3RhdC0+cXNfZ3F1b3RhLnFmc19uZXh0ZW50cykgfHwKKwkJCXB1dF91c2VyKGRhdGEsICZjb21wYXRfZnNxc3RhdC0+cXNfZ3F1b3RhLnFmc19uZXh0ZW50cykpCisJCQlicmVhazsKKwkJLyogQ29weWluZyB0aGUgcmVzdCAqLworCQlpZiAoY29weV9pbl91c2VyKCZjb21wYXRfZnNxc3RhdC0+cXNfaW5jb3JlZHFzLAorCQkJJmZzcXN0YXQtPnFzX2luY29yZWRxcywKKwkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X2ZzX3F1b3RhX3N0YXQpIC0KKwkJCW9mZnNldG9mKHN0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCwgcXNfaW5jb3JlZHFzKSkgfHwKKwkJCWdldF91c2VyKHhkYXRhLCAmZnNxc3RhdC0+cXNfaXdhcm5saW1pdCkgfHwKKwkJCXB1dF91c2VyKHhkYXRhLCAmY29tcGF0X2ZzcXN0YXQtPnFzX2l3YXJubGltaXQpKQorCQkJYnJlYWs7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IHN5c19xdW90YWN0bChjbWQsIHNwZWNpYWwsIGlkLCBhZGRyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvaW5vZGUuYyBiL2ZzL3JhbWZzL2lub2RlLmMKaW5kZXggZDQwZDIyYi4uZWYyYjQ2ZCAxMDA2NDQKLS0tIGEvZnMvcmFtZnMvaW5vZGUuYworKysgYi9mcy9yYW1mcy9pbm9kZS5jCkBAIC02MCw2ICs2MCw3IEBACiAJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnJhbWZzX2FvcHM7CiAJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmcmFtZnNfYmFja2luZ19kZXZfaW5mbzsKKwkJbWFwcGluZ19zZXRfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZywgR0ZQX0hJR0hVU0VSKTsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKIAkJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2ZpbGUuYyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwppbmRleCAzMGVlYmZiLi4yMDcwYWVlIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maWxlLmMKKysrIGIvZnMvcmVpc2VyZnMvZmlsZS5jCkBAIC0xMzA1LDcgKzEzMDUsNiBAQAogCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUpID09IEtFWV9GT1JNQVRfM181ICYmCiAJICAgICpwcG9zICsgY291bnQgPiBNQVhfTk9OX0xGUykgewogCQlpZiAoKnBwb3MgPj0gTUFYX05PTl9MRlMpIHsKLQkJCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwogCQkJcmV0dXJuIC1FRkJJRzsKIAkJfQogCQlpZiAoY291bnQgPiBNQVhfTk9OX0xGUyAtICh1bnNpZ25lZCBsb25nKSpwcG9zKQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW5vZGUuYyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKaW5kZXggMTI3MmQxMS4uZGRkZTQ4OSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW5vZGUuYworKysgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IGI0YWM5MTEuLjVhOTNjZmUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CmRpZmYgLS1naXQgYS9mcy9zZXFfZmlsZS5jIGIvZnMvc2VxX2ZpbGUuYwppbmRleCA0OTE5NGE0Li5iYmIxOWJlIDEwMDY0NAotLS0gYS9mcy9zZXFfZmlsZS5jCisrKyBiL2ZzL3NlcV9maWxlLmMKQEAgLTE3NywyMSArMTc3LDIzIEBACiAKIHN0YXRpYyBpbnQgdHJhdmVyc2Uoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3Qgb2Zmc2V0KQogewotCWxvZmZfdCBwb3MgPSAwOworCWxvZmZfdCBwb3MgPSAwLCBpbmRleDsKIAlpbnQgZXJyb3IgPSAwOwogCXZvaWQgKnA7CiAKIAltLT52ZXJzaW9uID0gMDsKLQltLT5pbmRleCA9IDA7CisJaW5kZXggPSAwOwogCW0tPmNvdW50ID0gbS0+ZnJvbSA9IDA7Ci0JaWYgKCFvZmZzZXQpCisJaWYgKCFvZmZzZXQpIHsKKwkJbS0+aW5kZXggPSBpbmRleDsKIAkJcmV0dXJuIDA7CisJfQogCWlmICghbS0+YnVmKSB7CiAJCW0tPmJ1ZiA9IGttYWxsb2MobS0+c2l6ZSA9IFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbS0+YnVmKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXAgPSBtLT5vcC0+c3RhcnQobSwgJm0tPmluZGV4KTsKKwlwID0gbS0+b3AtPnN0YXJ0KG0sICZpbmRleCk7CiAJd2hpbGUgKHApIHsKIAkJZXJyb3IgPSBQVFJfRVJSKHApOwogCQlpZiAoSVNfRVJSKHApKQpAQCAtMjA0LDE1ICsyMDYsMTcgQEAKIAkJaWYgKHBvcyArIG0tPmNvdW50ID4gb2Zmc2V0KSB7CiAJCQltLT5mcm9tID0gb2Zmc2V0IC0gcG9zOwogCQkJbS0+Y291bnQgLT0gbS0+ZnJvbTsKKwkJCW0tPmluZGV4ID0gaW5kZXg7CiAJCQlicmVhazsKIAkJfQogCQlwb3MgKz0gbS0+Y291bnQ7CiAJCW0tPmNvdW50ID0gMDsKIAkJaWYgKHBvcyA9PSBvZmZzZXQpIHsKLQkJCW0tPmluZGV4Kys7CisJCQlpbmRleCsrOworCQkJbS0+aW5kZXggPSBpbmRleDsKIAkJCWJyZWFrOwogCQl9Ci0JCXAgPSBtLT5vcC0+bmV4dChtLCBwLCAmbS0+aW5kZXgpOworCQlwID0gbS0+b3AtPm5leHQobSwgcCwgJmluZGV4KTsKIAl9CiAJbS0+b3AtPnN0b3AobSwgcCk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMjYwLDggKzI2NCw4IEBACiAJCQkJfQogCQkJfQogCX0KLQltdXRleF91bmxvY2soJm0tPmxvY2spOwogCWZpbGUtPmZfdmVyc2lvbiA9IG0tPnZlcnNpb247CisJbXV0ZXhfdW5sb2NrKCZtLT5sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogRVhQT1JUX1NZTUJPTChzZXFfbHNlZWspOwpkaWZmIC0tZ2l0IGEvZnMvc3BsaWNlLmMgYi9mcy9zcGxpY2UuYwppbmRleCA2Yzk4Mjg2Li41M2ZjMjA4IDEwMDY0NAotLS0gYS9mcy9zcGxpY2UuYworKysgYi9mcy9zcGxpY2UuYwpAQCAtMTA2MSw4ICsxMDYxLDkgQEAKIAogCXdoaWxlIChsZW4pIHsKIAkJc2l6ZV90IHJlYWRfbGVuOworCQlsb2ZmX3QgcG9zID0gc2QtPnBvczsKIAotCQlyZXQgPSBkb19zcGxpY2VfdG8oaW4sICZzZC0+cG9zLCBwaXBlLCBsZW4sIGZsYWdzKTsKKwkJcmV0ID0gZG9fc3BsaWNlX3RvKGluLCAmcG9zLCBwaXBlLCBsZW4sIGZsYWdzKTsKIAkJaWYgKHVubGlrZWx5KHJldCA8PSAwKSkKIAkJCWdvdG8gb3V0X3JlbGVhc2U7CiAKQEAgLTEwODAsNiArMTA4MSw3IEBACiAKIAkJYnl0ZXMgKz0gcmV0OwogCQlsZW4gLT0gcmV0OworCQlzZC0+cG9zID0gcG9zOwogCiAJCWlmIChyZXQgPCByZWFkX2xlbikKIAkJCWdvdG8gb3V0X3JlbGVhc2U7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCA1MjYwZDYyLi5mYzhlYmVkIDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTg4NCw2ICs4ODQsNyBAQAogCWVycm9yID0gdHlwZS0+Z2V0X3NiKHR5cGUsIGZsYWdzLCBuYW1lLCBkYXRhLCBtbnQpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0X2ZyZWVfc2VjZGF0YTsKKwlCVUdfT04oIW1udC0+bW50X3NiKTsKIAogIAllcnJvciA9IHNlY3VyaXR5X3NiX2tlcm5fbW91bnQobW50LT5tbnRfc2IsIHNlY2RhdGEpOwogIAlpZiAoZXJyb3IpCmRpZmYgLS1naXQgYS9mcy91ZGYvY3JjLmMgYi9mcy91ZGYvY3JjLmMKaW5kZXggMWI4MmE0YS4uZWYyYmZhYSAxMDA2NDQKLS0tIGEvZnMvdWRmL2NyYy5jCisrKyBiL2ZzL3VkZi9jcmMuYwpAQCAtMTA2LDggKzEwNiw4IEBACiB7CiAJdW5zaWduZWQgc2hvcnQgeDsKIAotCXggPSB1ZGZfY3JjMTYoYnl0ZXMsIHNpemVvZiBieXRlcyk7Ci0JcHJpbnRmKCJ1ZGZfY3JjMTY6IGNhbGN1bGF0ZWQgPSAlNC40eCwgY29ycmVjdCA9ICU0LjR4XG4iLCB4LCAweDMyOTlVKTsKKwl4ID0gdWRmX2NyYyhieXRlcywgc2l6ZW9mIGJ5dGVzKTsKKwlwcmludGYoInVkZl9jcmM6IGNhbGN1bGF0ZWQgPSAlNC40eCwgY29ycmVjdCA9ICU0LjR4XG4iLCB4LCAweDMyOTlVKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lhbGxvYy5jIGIvZnMvdWRmL2lhbGxvYy5jCmluZGV4IDgyMDY5ODMuLjEwZjMxODggMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pYWxsb2MuYworKysgYi9mcy91ZGYvaWFsbG9jLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAkJZWxzZQogCQkJVURGX1NCX0xWSURJVShzYiktPm51bUZpbGVzID0KIAkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMpIC0gMSk7Ci0JCQorCiAJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19sdmlkYmgpOwogCX0KIAltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CkBAIC0xMzYsNiArMTM2LDEzIEBACiAJCVVERl9JX0VGRShpbm9kZSkgPSAwOwogCQlVREZfSV9EQVRBKGlub2RlKSA9IGt6YWxsb2MoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKIAl9CisJaWYgKCFVREZfSV9EQVRBKGlub2RlKSkKKwl7CisJCWlwdXQoaW5vZGUpOworCQkqZXJyID0gLUVOT01FTTsKKwkJbXV0ZXhfdW5sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfQURfSU5fSUNCKSkKIAkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0lOX0lDQjsKIAllbHNlIGlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX1NIT1JUX0FEKSkKZGlmZiAtLWdpdCBhL2ZzL3VkZi9pbm9kZS5jIGIvZnMvdWRmL2lub2RlLmMKaW5kZXggYmY3ZGUwYi4uNWI4MmU0OCAxMDA2NDQKLS0tIGEvZnMvdWRmL2lub2RlLmMKKysrIGIvZnMvdWRmL2lub2RlLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKIHN0YXRpYyBtb2RlX3QgdWRmX2NvbnZlcnRfcGVybWlzc2lvbnMoc3RydWN0IGZpbGVFbnRyeSAqKTsKIHN0YXRpYyBpbnQgdWRmX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIHN0YXRpYyB2b2lkIHVkZl9maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitzdGF0aWMgaW50IHVkZl9hbGxvY19pX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgc2l6ZV90IHNpemUpOwogc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfZ2V0YmxrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgaW50ICosCiAJbG9uZyAqLCBpbnQgKik7CiBzdGF0aWMgaW50OF90IHVkZl9pbnNlcnRfYWV4dChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGV4dGVudF9wb3NpdGlvbiwKQEAgLTczNCw3ICs3MzUsNyBAQAogCQkJKCpjKSArKzsKIAkJCSgqZW5kbnVtKSArKzsKIAkJfQotCQkKKwogCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPSBuZXdibG9ja251bTsKIAkJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgPj4gMzApKQogCQkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0KQEAgLTgzNiw3ICs4MzcsNyBAQAogCQkJCXsKIAkJCQkJbnVtYWxsb2MgLT0gZWxlbjsKIAkJCQkJaWYgKCplbmRudW0gPiAoaSsxKSkKLQkJCQkJCW1lbW1vdmUoJmxhYXJyW2ldLCAmbGFhcnJbaSsxXSwgCisJCQkJCQltZW1tb3ZlKCZsYWFycltpXSwgJmxhYXJyW2krMV0sCiAJCQkJCQkJc2l6ZW9mKGxvbmdfYWQpICogKCplbmRudW0gLSAoaSsxKSkpOwogCQkJCQlpIC0tOwogCQkJCQkoKmVuZG51bSkgLS07CkBAIC0xMDI0LDcgKzEwMjUsNyBAQAogCXsKIAkJYmxvY2tfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplLCB1ZGZfZ2V0X2Jsb2NrKTsKIAkJdWRmX3RydW5jYXRlX2V4dGVudHMoaW5vZGUpOwotCX0JCisJfQogCiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CiAJaWYgKElTX1NZTkMoaW5vZGUpKQpAQCAtMTA4NywxMCArMTA4OCwxMCBAQAogCQkJewogCQkJCWtlcm5lbF9sYl9hZGRyIGxvYzsKIAkJCQlpZSA9IChzdHJ1Y3QgaW5kaXJlY3RFbnRyeSAqKWliaC0+Yl9kYXRhOwotCQorCiAJCQkJbG9jID0gbGVsYl90b19jcHUoaWUtPmluZGlyZWN0SUNCLmV4dExvY2F0aW9uKTsKLQkKLQkJCQlpZiAoaWUtPmluZGlyZWN0SUNCLmV4dExlbmd0aCAmJiAKKworCQkJCWlmIChpZS0+aW5kaXJlY3RJQ0IuZXh0TGVuZ3RoICYmCiAJCQkJCShuYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCBsb2MsIDAsICZpZGVudCkpKQogCQkJCXsKIAkJCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9GRSB8fApAQCAtMTE1NiwxNCArMTE1NywyMiBAQAogCXsKIAkJVURGX0lfRUZFKGlub2RlKSA9IDE7CiAJCVVERl9JX1VTRShpbm9kZSkgPSAwOwotCQlVREZfSV9EQVRBKGlub2RlKSA9IGttYWxsb2MoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSksIEdGUF9LRVJORUwpOworCQlpZiAodWRmX2FsbG9jX2lfZGF0YShpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkpKQorCQl7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQlyZXR1cm47CisJCX0KIAkJbWVtY3B5KFVERl9JX0RBVEEoaW5vZGUpLCBiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpKTsKIAl9CiAJZWxzZSBpZiAobGUxNl90b19jcHUoZmUtPmRlc2NUYWcudGFnSWRlbnQpID09IFRBR19JREVOVF9GRSkKIAl7CiAJCVVERl9JX0VGRShpbm9kZSkgPSAwOwogCQlVREZfSV9VU0UoaW5vZGUpID0gMDsKLQkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1ZGZfYWxsb2NfaV9kYXRhKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpKQorCQl7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQlyZXR1cm47CisJCX0KIAkJbWVtY3B5KFVERl9JX0RBVEEoaW5vZGUpLCBiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpOwogCX0KIAllbHNlIGlmIChsZTE2X3RvX2NwdShmZS0+ZGVzY1RhZy50YWdJZGVudCkgPT0gVEFHX0lERU5UX1VTRSkKQEAgLTExNzMsNyArMTE4MiwxMSBAQAogCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPQogCQkJbGUzMl90b19jcHUoCiAJCQkJKChzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkgKiliaC0+Yl9kYXRhKS0+bGVuZ3RoQWxsb2NEZXNjcyk7Ci0JCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1ZGZfYWxsb2NfaV9kYXRhKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSkpCisJCXsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCXJldHVybjsKKwkJfQogCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSkpOwogCQlyZXR1cm47CiAJfQpAQCAtMTE5MSw3ICsxMjA0LDcgQEAKIAlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KGZlLT5maWxlTGlua0NvdW50KTsKIAlpZiAoIWlub2RlLT5pX25saW5rKQogCQlpbm9kZS0+aV9ubGluayA9IDE7Ci0JCisKIAlpbm9kZS0+aV9zaXplID0gbGU2NF90b19jcHUoZmUtPmluZm9ybWF0aW9uTGVuZ3RoKTsKIAlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CiAKQEAgLTEyNDMsNyArMTI1Niw3IEBACiAJfQogCWVsc2UKIAl7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KGVmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkKSA8PCAKKwkJaW5vZGUtPmlfYmxvY2tzID0gbGU2NF90b19jcHUoZWZlLT5sb2dpY2FsQmxvY2tzUmVjb3JkZWQpIDw8CiAJCQkoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKIAogCQlpZiAoIHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCkBAIC0xMzc0LDYgKzEzODcsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgdWRmX2FsbG9jX2lfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzaXplX3Qgc2l6ZSkKK3sKKwlVREZfSV9EQVRBKGlub2RlKSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIVVERl9JX0RBVEEoaW5vZGUpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6dWRmX2FsbG9jX2lfZGF0YSAoaW5vICVsZCkgbm8gZnJlZSBtZW1vcnlcbiIsCisJCSAgICAgICBpbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIG1vZGVfdAogdWRmX2NvbnZlcnRfcGVybWlzc2lvbnMoc3RydWN0IGZpbGVFbnRyeSAqZmUpCiB7CkBAIC0yMDcyLDcgKzIwOTksNyBAQAogCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUob2Vwb3MuYmgsIGlub2RlKTsKIAkJfQogCX0KLQkKKwogCWJyZWxzZShlcG9zLmJoKTsKIAlicmVsc2Uob2Vwb3MuYmgpOwogCXJldHVybiAoZWxlbiA+PiAzMCk7CmRpZmYgLS1naXQgYS9mcy91ZnMvc3VwZXIuYyBiL2ZzL3Vmcy9zdXBlci5jCmluZGV4IDIyZmY2ZWQuLjJiMzAxMTYgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9zdXBlci5jCisrKyBiL2ZzL3Vmcy9zdXBlci5jCkBAIC04Nyw2ICs4Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCkBAIC04NTQsNyArODU1LDcgQEAKIAl1c3BpLT5zX2ZtYXNrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZtYXNrKTsKIAl1c3BpLT5zX2ZzaGlmdCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mc2hpZnQpOwogCi0JaWYgKHVzcGktPnNfZnNpemUgJiAodXNwaS0+c19mc2l6ZSAtIDEpKSB7CisJaWYgKCFpc19wb3dlcl9vZl8yKHVzcGktPnNfZnNpemUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidWZzX3JlYWRfc3VwZXI6IGZyYWdtZW50IHNpemUgJXUgaXMgbm90IGEgcG93ZXIgb2YgMlxuIiwKIAkJCXVzcGktPnNfZnNpemUpOwogCQkJZ290byBmYWlsZWQ7CkBAIC04NjksNyArODcwLDcgQEAKIAkJCXVzcGktPnNfZnNpemUpOwogCQlnb3RvIGZhaWxlZDsKIAl9Ci0JaWYgKHVzcGktPnNfYnNpemUgJiAodXNwaS0+c19ic2l6ZSAtIDEpKSB7CisJaWYgKCFpc19wb3dlcl9vZl8yKHVzcGktPnNfYnNpemUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidWZzX3JlYWRfc3VwZXI6IGJsb2NrIHNpemUgJXUgaXMgbm90IGEgcG93ZXIgb2YgMlxuIiwKIAkJCXVzcGktPnNfYnNpemUpOwogCQlnb3RvIGZhaWxlZDsKZGlmZiAtLWdpdCBhL2ZzL3V0aW1lcy5jIGIvZnMvdXRpbWVzLmMKaW5kZXggYjNjODg5NS4uODNhN2U2OSAxMDA2NDQKLS0tIGEvZnMvdXRpbWVzLmMKKysrIGIvZnMvdXRpbWVzLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgICAgICAgICAgIGlmIChJU19JTU1VVEFCTEUoaW5vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkcHV0X2FuZF9vdXQ7CiAKLQkJaWYgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgeworCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpIHsKIAkJCWlmIChmKSB7CiAJCQkJaWYgKCEoZi0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQogCQkJCQlnb3RvIGRwdXRfYW5kX291dDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKaW5kZXggMmRmNjM2Mi4uYjBmMGU1OCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTM1LDEwICszNSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogc3RhdGljIGttZW1fem9uZV90ICp4ZnNfYnVmX3pvbmU7Ci1zdGF0aWMgc3RydWN0IHNocmlua2VyICp4ZnNfYnVmX3NoYWtlOwogU1RBVElDIGludCB4ZnNidWZkKHZvaWQgKik7CiBTVEFUSUMgaW50IHhmc2J1ZmRfd2FrZXVwKGludCwgZ2ZwX3QpOwogU1RBVElDIHZvaWQgeGZzX2J1Zl9kZWx3cmlfcXVldWUoeGZzX2J1Zl90ICosIGludCk7CitzdGF0aWMgc3RydWN0IHNocmlua2VyIHhmc19idWZfc2hha2UgPSB7CisJLnNocmluayA9IHhmc2J1ZmRfd2FrZXVwLAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OwogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhmc2xvZ2Rfd29ya3F1ZXVlOwogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhmc2RhdGFkX3dvcmtxdWV1ZTsKQEAgLTE4MzIsMTQgKzE4MzUsOSBAQAogCWlmICgheGZzZGF0YWRfd29ya3F1ZXVlKQogCQlnb3RvIG91dF9kZXN0cm95X3hmc2xvZ2Rfd29ya3F1ZXVlOwogCi0JeGZzX2J1Zl9zaGFrZSA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCB4ZnNidWZkX3dha2V1cCk7Ci0JaWYgKCF4ZnNfYnVmX3NoYWtlKQotCQlnb3RvIG91dF9kZXN0cm95X3hmc2RhdGFkX3dvcmtxdWV1ZTsKLQorCXJlZ2lzdGVyX3Nocmlua2VyKCZ4ZnNfYnVmX3NoYWtlKTsKIAlyZXR1cm4gMDsKIAotIG91dF9kZXN0cm95X3hmc2RhdGFkX3dvcmtxdWV1ZToKLQlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNkYXRhZF93b3JrcXVldWUpOwogIG91dF9kZXN0cm95X3hmc2xvZ2Rfd29ya3F1ZXVlOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2xvZ2Rfd29ya3F1ZXVlKTsKICBvdXRfZnJlZV9idWZfem9uZToKQEAgLTE4NTQsNyArMTg1Miw3IEBACiB2b2lkCiB4ZnNfYnVmX3Rlcm1pbmF0ZSh2b2lkKQogewotCXJlbW92ZV9zaHJpbmtlcih4ZnNfYnVmX3NoYWtlKTsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZ4ZnNfYnVmX3NoYWtlKTsKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNkYXRhZF93b3JrcXVldWUpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2xvZ2Rfd29ya3F1ZXVlKTsKIAlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfYnVmX3pvbmUpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKaW5kZXggMDY4OTRjZi4uNDUyOGY5YSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCkBAIC01NjIsNiArNTYyLDcgQEAKIAliaHZfdmZzX3N5bmNfd29ya190CSp3b3JrLCAqbjsKIAlMSVNUX0hFQUQJCSh0bXApOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXRpbWVsZWZ0ID0geGZzX3N5bmNkX2NlbnRpc2VjcyAqIG1zZWNzX3RvX2ppZmZpZXMoMTApOwogCWZvciAoOzspIHsKIAkJdGltZWxlZnQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZWxlZnQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKaW5kZXggMzNkZDFjYS4uMjAxY2MzMiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCkBAIC0xOCw2ICsxOCw4IEBACiAjaWZuZGVmIF9fWEZTX1NVUEVSX0hfXwogI2RlZmluZSBfX1hGU19TVVBFUl9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CisKICNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCiAjIGRlZmluZSB2ZnNfaW5zZXJ0ZG1hcGkodmZzKQl2ZnNfaW5zZXJ0b3BzKHZmc3AsICZ4ZnNfZG1vcHMpCiAjIGRlZmluZSB2ZnNfaW5pdGRtYXBpKCkJZG1hcGlfaW5pdCgpCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmMKaW5kZXggN2RlZjRjNi4uMmQyNzRiMiAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbS5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwpAQCAtNjIsNyArNjIsNiBAQAogCiBrbWVtX3pvbmVfdAkqcW1fZHF6b25lOwoga21lbV96b25lX3QJKnFtX2RxdHJ4em9uZTsKLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKnhmc19xbV9zaGFrZXI7CiAKIHN0YXRpYyBjcmVkX3QJeGZzX3plcm9jcjsKIApAQCAtNzgsNiArNzcsMTEgQEAKIFNUQVRJQyBpbnQJeGZzX3FtX2luaXRfcXVvdGFpbmZvKHhmc19tb3VudF90ICopOwogU1RBVElDIGludAl4ZnNfcW1fc2hha2UoaW50LCBnZnBfdCk7CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgeGZzX3FtX3NoYWtlciA9IHsKKwkuc2hyaW5rID0geGZzX3FtX3NoYWtlLAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OworCiAjaWZkZWYgREVCVUcKIGV4dGVybiBtdXRleF90CXFjaGVja19sb2NrOwogI2VuZGlmCkBAIC0xNDksNyArMTUzLDcgQEAKIAl9IGVsc2UKIAkJeHFtLT5xbV9kcXpvbmUgPSBxbV9kcXpvbmU7CiAKLQl4ZnNfcW1fc2hha2VyID0gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHhmc19xbV9zaGFrZSk7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19xbV9zaGFrZXIpOwogCiAJLyoKIAkgKiBUaGUgdF9kcWluZm8gcG9ydGlvbiBvZiB0cmFuc2FjdGlvbnMuCkBAIC0xODEsNyArMTg1LDcgQEAKIAogCUFTU0VSVCh4cW0gIT0gTlVMTCk7CiAJQVNTRVJUKHhxbS0+cW1fbnJlZnMgPT0gMCk7Ci0JcmVtb3ZlX3Nocmlua2VyKHhmc19xbV9zaGFrZXIpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19xbV9zaGFrZXIpOwogCWhzaXplID0geHFtLT5xbV9kcWhhc2htYXNrICsgMTsKIAlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgewogCQl4ZnNfcW1fbGlzdF9kZXN0cm95KCYoeHFtLT5xbV91c3JfZHFodGFibGVbaV0pKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2ZiLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOWJiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9mYi5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKy8qIENhY2hpbmcgaXMgb2ZmIGluIHRoZSBJL08gc3BhY2UgcXVhZHJhbnQgYnkgZGVzaWduLiAgKi8KKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvaW8uaCBiL2luY2x1ZGUvYXNtLWFscGhhL2lvLmgKaW5kZXggMjFhODZmMS4uYWI1YjYwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9pby5oCkBAIC00LDYgKzQsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC05MCw2ICs5MSwxMSBAQAogCiAjZGVmaW5lIHBhZ2VfdG9fcGh5cyhwYWdlKQlwYWdlX3RvX3BhKHBhZ2UpCiAKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBfX2RlcHJlY2F0ZWQgaXNhX3BhZ2VfdG9fYnVzKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBwYWdlX3RvX3BoeXMocGFnZSk7Cit9CisKIC8qIFRoaXMgZGVwZW5kcyBvbiB3b3JraW5nIGlvbW11LiAgKi8KICNkZWZpbmUgQklPX1ZNRVJHRV9CT1VOREFSWQkoYWxwaGFfbXYubXZfcGNpX3RiaSA/IFBBR0VfU0laRSA6IDApCiAKQEAgLTEwMiwxMiArMTA4LDEyIEBACiAgKgogICogTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBmb3IgYSBsaW1pdGVkIHJhbmdlIG9mIGtlcm5lbCBhZGRyZXNzZXMsCiAgKiBhbmQgdmVyeSB3ZWxsIG1heSBub3Qgc3BhbiBhbGwgbWVtb3J5LiAgQ29uc2lkZXIgdGhpcyBpbnRlcmZhY2UgCi0gKiBkZXByZWNhdGVkIGluIGZhdm91ciBvZiB0aGUgbWFwcGluZyBmdW5jdGlvbnMgaW4gPGFzbS9wY2kuaD4uCisgKiBkZXByZWNhdGVkIGluIGZhdm91ciBvZiB0aGUgRE1BLW1hcHBpbmcgQVBJLgogICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX2RpcmVjdF9tYXBfYmFzZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fZGlyZWN0X21hcF9zaXplOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19idXModm9pZCAqYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2RlcHJlY2F0ZWQgdmlydF90b19idXModm9pZCAqYWRkcmVzcykKIHsKIAl1bnNpZ25lZCBsb25nIHBoeXMgPSB2aXJ0X3RvX3BoeXMoYWRkcmVzcyk7CiAJdW5zaWduZWQgbG9uZyBidXMgPSBwaHlzICsgX19kaXJlY3RfbWFwX2Jhc2U7CkBAIC0xMTUsNyArMTIxLDcgQEAKIH0KICNkZWZpbmUgaXNhX3ZpcnRfdG9fYnVzIHZpcnRfdG9fYnVzCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqYnVzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIGlubGluZSB2b2lkICogX19kZXByZWNhdGVkIGJ1c190b192aXJ0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAl2b2lkICp2aXJ0OwogCkBAIC0xMjYsNiArMTMyLDcgQEAKIAl2aXJ0ID0gcGh5c190b192aXJ0KGFkZHJlc3MpOwogCXJldHVybiAobG9uZylhZGRyZXNzIDw9IDAgPyBOVUxMIDogdmlydDsKIH0KKyNkZWZpbmUgaXNhX2J1c190b192aXJ0IGJ1c190b192aXJ0CiAKIC8qCiAgKiBUaGVyZSBhcmUgZGlmZmVyZW50IGNoaXBzZXRzIHRvIGludGVyZmFjZSB0aGUgQWxwaGEgQ1BVcyB0byB0aGUgd29ybGQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmgKaW5kZXggZDJiZWQzYy4uYmFlN2YwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaApAQCAtMTcsNyArMTcsOCBAQAogZXh0ZXJuIHZvaWQgY2xlYXJfcGFnZSh2b2lkICpwYWdlKTsKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykJY2xlYXJfcGFnZShwYWdlKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdm1hZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdm1hZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCiBleHRlcm4gdm9pZCBjb3B5X3BhZ2Uodm9pZCAqIF90bywgdm9pZCAqIF9mcm9tKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaAppbmRleCA2MTZkMjA2Li45OTAzN2IwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oCkBAIC0yNjQsMjEgKzI2NCwxNSBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1leHRlcm4gaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZPUik7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZPVyk7IH0KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfRk9FKTsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KIAogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRk9XOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9GT1I7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0ZPRTsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH4oX19ESVJUWV9CSVRTKTsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+KF9fQUNDRVNTX0JJVFMpOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0ZPVzsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0ZPUjsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0ZPRTsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9fRElSVFlfQklUUzsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9fQUNDRVNTX0JJVFM7IHJldHVybiBwdGU7IH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tYWxwaGEvdGVybWlvcy5oCmluZGV4IDM5ZTQ5MmMuLmZhMTM3MTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtaW9zLmgKQEAgLTgxLDcgKzgxLDcgQEAKIAogI2RlZmluZSB1c2VyX3Rlcm1pb190b19rZXJuZWxfdGVybWlvcyhhX3Rlcm1pb3MsIHVfdGVybWlvKQkJCVwKICh7CQkJCQkJCQkJCVwKLQlzdHJ1Y3QgdGVybWlvcyAqa190ZXJtaW9zID0gKGFfdGVybWlvcyk7CQkJCVwKKwlzdHJ1Y3Qga3Rlcm1pb3MgKmtfdGVybWlvcyA9IChhX3Rlcm1pb3MpOwkJCQlcCiAJc3RydWN0IHRlcm1pbyBrX3Rlcm1pbzsJCQkJCQkJXAogCWludCBjYW5vbiwgcmV0OwkJCQkJCQkJXAogCQkJCQkJCQkJCVwKQEAgLTExMyw3ICsxMTMsNyBAQAogICovCiAjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvKHVfdGVybWlvLCBhX3Rlcm1pb3MpCQlcCiAoewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdGVybWlvcyAqa190ZXJtaW9zID0gKGFfdGVybWlvcyk7CQkJXAorCXN0cnVjdCBrdGVybWlvcyAqa190ZXJtaW9zID0gKGFfdGVybWlvcyk7CQkJXAogCXN0cnVjdCB0ZXJtaW8ga190ZXJtaW87CQkJCQkJXAogCWludCBjYW5vbjsJCQkJCQkJXAogCQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MS9ib2FyZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MS9ib2FyZC5oCmluZGV4IDBjZTZlZTkuLmQ5NmIxMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTEvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxL2JvYXJkLmgKQEAgLTY0LDYgKzY0LDcgQEAKIAogIC8qIEV0aGVybmV0IChFTUFDICYgTUFDQikgKi8KIHN0cnVjdCBhdDkxX2V0aF9kYXRhIHsKKwl1MzIJCXBoeV9tYXNrOwogCXU4CQlwaHlfaXJxX3BpbjsJLyogUEhZIElSUSAqLwogCXU4CQlpc19ybWlpOwkvKiB1c2luZyBSTUlJIGludGVyZmFjZT8gKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vZmIuaCBiL2luY2x1ZGUvYXNtLWFybS9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWFybS9wZ3RhYmxlLmgKaW5kZXggMjFkZWM5Zi4uZDJlODE3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oCkBAIC04MywxNCArODMsMTQgQEAKICAqIG1lYW5zIHRoYXQgYSB3cml0ZSB0byBhIGNsZWFuIHBhZ2Ugd2lsbCBjYXVzZSBhIHBlcm1pc3Npb24gZmF1bHQsIGFuZAogICogdGhlIExpbnV4IE1NIGxheWVyIHdpbGwgbWFyayB0aGUgcGFnZSBkaXJ0eSB2aWEgaGFuZGxlX3B0ZV9mYXVsdCgpLgogICogRm9yIHRoZSBoYXJkd2FyZSB0byBub3RpY2UgdGhlIHBlcm1pc3Npb24gY2hhbmdlLCB0aGUgVExCIGVudHJ5IG11c3QKLSAqIGJlIGZsdXNoZWQsIGFuZCBwdGVwX2VzdGFibGlzaCgpIGRvZXMgdGhhdCBmb3IgdXMuCisgKiBiZSBmbHVzaGVkLCBhbmQgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKCkgZG9lcyB0aGF0IGZvciB1cy4KICAqCiAgKiBUaGUgImFjY2Vzc2VkIiBvciAieW91bmciIGJpdCBpcyBlbXVsYXRlZCBieSBhIHNpbWlsYXIgbWV0aG9kOyB3ZSBvbmx5CiAgKiBhbGxvdyBhY2Nlc3NlcyB0byB0aGUgcGFnZSBpZiB0aGUgInlvdW5nIiBiaXQgaXMgc2V0LiAgQWNjZXNzZXMgdG8gdGhlCiAgKiBwYWdlIHdpbGwgY2F1c2UgYSBmYXVsdCwgYW5kIGhhbmRsZV9wdGVfZmF1bHQoKSB3aWxsIHNldCB0aGUgeW91bmcgYml0CiAgKiBmb3IgdXMgYXMgbG9uZyBhcyB0aGUgcGFnZSBpcyBtYXJrZWQgcHJlc2VudCBpbiB0aGUgY29ycmVzcG9uZGluZyBMaW51eAotICogUFRFIGVudHJ5LiAgQWdhaW4sIHB0ZXBfZXN0YWJsaXNoKCkgd2lsbCBlbnN1cmUgdGhhdCB0aGUgVExCIGlzIHVwIHRvCi0gKiBkYXRlLgorICogUFRFIGVudHJ5LiAgQWdhaW4sIHB0ZXBfc2V0X2FjY2Vzc19mbGFncygpIHdpbGwgZW5zdXJlIHRoYXQgdGhlIFRMQiBpcworICogdXAgdG8gZGF0ZS4KICAqCiAgKiBIb3dldmVyLCB3aGVuIHRoZSAieW91bmciIGJpdCBpcyBjbGVhcmVkLCB3ZSBkZW55IGFjY2VzcyB0byB0aGUgcGFnZQogICogYnkgY2xlYXJpbmcgdGhlIGhhcmR3YXJlIFBURS4gIEN1cnJlbnRseSBMaW51eCBkb2VzIG5vdCBmbHVzaCB0aGUgVExCCkBAIC0yNTcsOSArMjU3LDcgQEAKICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwogI2RlZmluZSBwdGVfcHJlc2VudChwdGUpCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9QUkVTRU5UKQotI2RlZmluZSBwdGVfcmVhZChwdGUpCQkocHRlX3ZhbChwdGUpICYgTF9QVEVfVVNFUikKICNkZWZpbmUgcHRlX3dyaXRlKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9XUklURSkKLSNkZWZpbmUgcHRlX2V4ZWMocHRlKQkJKHB0ZV92YWwocHRlKSAmIExfUFRFX0VYRUMpCiAjZGVmaW5lIHB0ZV9kaXJ0eShwdGUpCQkocHRlX3ZhbChwdGUpICYgTF9QVEVfRElSVFkpCiAjZGVmaW5lIHB0ZV95b3VuZyhwdGUpCQkocHRlX3ZhbChwdGUpICYgTF9QVEVfWU9VTkcpCiAKQEAgLTI3NSwxMiArMjczLDggQEAKICNkZWZpbmUgUFRFX0JJVF9GVU5DKGZuLG9wKSBcCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV8jI2ZuKHB0ZV90IHB0ZSkgeyBwdGVfdmFsKHB0ZSkgb3A7IHJldHVybiBwdGU7IH0KIAotLypQVEVfQklUX0ZVTkMocmRwcm90ZWN0LCAmPSB+TF9QVEVfVVNFUik7Ki8KLS8qUFRFX0JJVF9GVU5DKG1rcmVhZCwgICAgfD0gTF9QVEVfVVNFUik7Ki8KIFBURV9CSVRfRlVOQyh3cnByb3RlY3QsICY9IH5MX1BURV9XUklURSk7CiBQVEVfQklUX0ZVTkMobWt3cml0ZSwgICB8PSBMX1BURV9XUklURSk7Ci1QVEVfQklUX0ZVTkMoZXhwcm90ZWN0LCAmPSB+TF9QVEVfRVhFQyk7Ci1QVEVfQklUX0ZVTkMobWtleGVjLCAgICB8PSBMX1BURV9FWEVDKTsKIFBURV9CSVRfRlVOQyhta2NsZWFuLCAgICY9IH5MX1BURV9ESVJUWSk7CiBQVEVfQklUX0ZVTkMobWtkaXJ0eSwgICB8PSBMX1BURV9ESVJUWSk7CiBQVEVfQklUX0ZVTkMobWtvbGQsICAgICAmPSB+TF9QVEVfWU9VTkcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2RtYS1tYXBwaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWVhZTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvZG1hLW1hcHBpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oPgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9mYi5oIGIvaW5jbHVkZS9hc20tYXJtMjYvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9pb2N0bHMuaAppbmRleCBiYTljN2Q4Li44YTMyOTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9pb2N0bHMuaApAQCAtNDcsNiArNDcsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3BndGFibGUuaAppbmRleCAyYjIwZTlmLi41NWExYTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvcGd0YWJsZS5oCkBAIC0yMTgsOSArMjE4LDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotI2RlZmluZSBwdGVfcmVhZChwdGUpICAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX05PVF9VU0VSKSkKICNkZWZpbmUgcHRlX3dyaXRlKHB0ZSkgICAgICAgICAgICAgICAgICAoIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFET05MWSkpCi0jZGVmaW5lIHB0ZV9leGVjKHB0ZSkgICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfTk9UX1VTRVIpKQogI2RlZmluZSBwdGVfZGlydHkocHRlKSAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX0NMRUFOKSkKICNkZWZpbmUgcHRlX3lvdW5nKHB0ZSkgICAgICAgICAgICAgICAgICAoIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9PTEQpKQogLy9PTkxZIHdoZW4gIXB0ZV9wcmVzZW50KCkgSSB0aGluay4gbmlja2VkIGZyb20gYXJtMzIgKEZJWE1FISkKQEAgLTIzMSw4ICsyMjksNiBAQAogCiBQVEVfQklUX0ZVTkMod3Jwcm90ZWN0LCB8PSAgX1BBR0VfUkVBRE9OTFkpOwogUFRFX0JJVF9GVU5DKG1rd3JpdGUsICAgJj0gfl9QQUdFX1JFQURPTkxZKTsKLVBURV9CSVRfRlVOQyhleHByb3RlY3QsIHw9ICBfUEFHRV9OT1RfVVNFUik7Ci1QVEVfQklUX0ZVTkMobWtleGVjLCAgICAmPSB+X1BBR0VfTk9UX1VTRVIpOwogUFRFX0JJVF9GVU5DKG1rY2xlYW4sICAgfD0gIF9QQUdFX0NMRUFOKTsKIFBURV9CSVRfRlVOQyhta2RpcnR5LCAgICY9IH5fUEFHRV9DTEVBTik7CiBQVEVfQklUX0ZVTkMobWtvbGQsICAgICB8PSAgX1BBR0VfT0xEKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtYml0cy5oCmluZGV4IGY2NmI1MTguLjQ4ZDJmNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaApAQCAtMTM4LDYgKzEzOCw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgQk9USEVSICAwMDEwMDAwCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNTMsMTAgKzE1NCwxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ01TUEFSICAgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLwogI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KIAorI2RlZmluZSBJQlNISUZUCSAgMTYJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1pb3MuaAppbmRleCAzMjljMzI0Li4yOTNlM2YxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvdGVybWlvcy5oCkBAIC04Miw4ICs4MiwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCmluZGV4IDlmZDJlMzIuLjk3NDQ4MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaApAQCAtMjEsNiArMjEsNyBAQAogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KHVuc2lnbmVkIGludCBpZCk7CiAKIHN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSB7CisJdTMyCXBoeV9tYXNrOwogCXU4CWlzX3JtaWk7CiB9Owogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9mYi5oIGIvaW5jbHVkZS9hc20tYXZyMzIvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWJhZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvZmIuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QoKHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpCisJCQkJICAgICAgJiB+X1BBR0VfQ0FDSEFCTEUpCisJCQkJICAgICB8IChfUEFHRV9CVUZGRVIgfCBfUEFHRV9ESVJUWSkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3BndGFibGUuaAppbmRleCBmNmNjMmIwLi5jMDdiZGQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvcGd0YWJsZS5oCkBAIC0yMDEsMTggKzIwMSwxMCBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7Ci19CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQogewogCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRVhFQ1VURTsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCiB7CiAJcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOwpAQCAtMjMxLDIxICsyMjMsMTEgQEAKIH0KIAogLyogTXV0YXRvciBmdW5jdGlvbnMgZm9yIFBURSBiaXRzICovCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQotewotCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1VTRVIpKTsKLQlyZXR1cm4gcHRlOwotfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkKIHsKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9SVykpOwogCXJldHVybiBwdGU7CiB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQotewotCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0VYRUNVVEUpKTsKLQlyZXR1cm4gcHRlOwotfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRElSVFkpKTsKQEAgLTI1NiwyMSArMjM4LDExIEBACiAJc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfQUNDRVNTRUQpKTsKIAlyZXR1cm4gcHRlOwogfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkKLXsKLQlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1VTRVIpKTsKLQlyZXR1cm4gcHRlOwotfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCiB7CiAJc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9SVykpOwogCXJldHVybiBwdGU7CiB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQotewotCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRVhFQ1VURSkpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0RJUlRZKSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9mYi5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9mYi5oIGIvaW5jbHVkZS9hc20tY3Jpcy9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2lvY3Rscy5oCmluZGV4IDk3Nzg3YzMuLjRmNGU1MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvaW9jdGxzLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bHMuaApAQCAtNDgsNiArNDgsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvcGFnZS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmgKaW5kZXggOWYxM2MzMi4uMDY0OGUzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmgKQEAgLTIwLDcgKzIwLDggQEAKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykgICAgY2xlYXJfcGFnZShwYWdlKQogI2RlZmluZSBjb3B5X3VzZXJfcGFnZSh0bywgZnJvbSwgdmFkZHIsIHBnKSBjb3B5X3BhZ2UodG8sIGZyb20pCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcikKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpIFwKKwlhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1jcmlzL3BndGFibGUuaAppbmRleCBjOTRhNzEwLi40MTdmNzExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3BndGFibGUuaApAQCAtMTExLDkgKzExMSw3IEBACiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKSAgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkgICAgICAgICAgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpICAgICAgICAgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX01PRElGSUVEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKSAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKSAgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQpAQCAtMTI0LDE4ICsxMjIsNiBAQAogICAgICAgICByZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQotewotICAgICAgICBwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SRUFEIHwgX1BBR0VfU0lMRU5UX1JFQUQpOwotCXJldHVybiBwdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCi17Ci0gICAgICAgIHB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JFQUQgfCBfUEFHRV9TSUxFTlRfUkVBRCk7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfTU9ESUZJRUQgfCBfUEFHRV9TSUxFTlRfV1JJVEUpOyAKQEAgLTE1NiwyMiArMTQyLDYgQEAKICAgICAgICAgcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JFQUQ7Ci0gICAgICAgIGlmIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRCkKLSAgICAgICAgICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0gICAgICAgIHJldHVybiBwdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCi17Ci0gICAgICAgIHB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOwotICAgICAgICBpZiAocHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQpCi0gICAgICAgICAgICAgICAgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1NJTEVOVF9SRUFEOwotICAgICAgICByZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkKIHsKICAgICAgICAgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX01PRElGSUVEOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tY3Jpcy90ZXJtYml0cy5oCmluZGV4IDZjYzJlMjcuLjcxYzFiMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmgKQEAgLTE2Niw2ICsxNjYsNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgQk9USEVSICAwMDEwMDAwCiAjZGVmaW5lICBCNTc2MDAgIDAwMTAwMDEKICNkZWZpbmUgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgQjIzMDQwMCAwMDEwMDAzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oCmluZGV4IGM5ZGJkNGQuLmIwMTI0ZTZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1pb3MuaApAQCAtODEsOCArODEsMTAgQEAKIAljb3B5X3RvX3VzZXIoKHRlcm1pbyktPmNfY2MsICh0ZXJtaW9zKS0+Y19jYywgTkNDKTsgXAogfSkKIAotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvZmIuaCBiL2luY2x1ZGUvYXNtLWZydi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1mcnYvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWZydi9wZ3RhYmxlLmgKaW5kZXggMTE0YWVmYS4uMTQ3ZTk5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oCkBAIC0zNzcsMzAgKzM3NywxNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiAhKChwdGUpLnB0ZSAmIF9QQUdFX1NVUEVSKTsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gISgocHRlKS5wdGUgJiBfUEFHRV9TVVBFUik7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGUgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gISgocHRlKS5wdGUgJiBfUEFHRV9XUCk7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgfD0gX1BBR0VfU1VQRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlIHw9IF9QQUdFX1NVUEVSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgfD0gX1BBR0VfV1A7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlICY9IH5fUEFHRV9TVVBFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX1NVUEVSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgfD0gX1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlICY9IH5fUEFHRV9XUDsgcmV0dXJuIHB0ZTsgfQogCi1zdGF0aWMgaW5saW5lIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCWludCBpID0gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9ESVJUWSwgcHRlcCk7Ci0JYXNtIHZvbGF0aWxlKCJkY2YgJU0wIiA6OiAiVSIoKnB0ZXApKTsKLQlyZXR1cm4gaTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlpbnQgaSA9IHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfQUNDRVNTRUQsIHB0ZXApOwpAQCAtNTEwLDcgKzQ5Nyw2IEBACiAJCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaAppbmRleCBkMGVhNjc4Li43MzA2YzcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCkBAIC0zMjYsMTAgKzMyNiwxNCBAQAogI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCTMxNwogI2RlZmluZSBfX05SX2dldGNwdQkJMzE4CiAjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzE5CisjZGVmaW5lIF9fTlJfdXRpbWVuc2F0CQkzMjAKKyNkZWZpbmUgX19OUl9zaWduYWxmZAkJMzIxCisjZGVmaW5lIF9fTlJfdGltZXJmZAkJMzIyCisjZGVmaW5lIF9fTlJfZXZlbnRmZAkJMzIzCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzIwCisjZGVmaW5lIE5SX3N5c2NhbGxzIDMyNAogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAvKiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAppbmRleCA3ZjMwY2NlLi4zNDRlMzA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKQEAgLTI4LDcgKzI4LDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIEhBVkVfQVJDSF9CVUdfT04KLSNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikgZG8geyBpZiAodW5saWtlbHkoKGNvbmRpdGlvbikhPTApKSBCVUcoKTsgfSB3aGlsZSgwKQorI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSBkbyB7IGlmICh1bmxpa2VseShjb25kaXRpb24pKSBCVUcoKTsgfSB3aGlsZSgwKQogI2VuZGlmCiAKICNpZm5kZWYgSEFWRV9BUkNIX1dBUk5fT04KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oCmluZGV4IDI5NDEzZDMuLmUyNDY4ZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaApAQCAtMSwyNCArMSw4MiBAQAogI2lmbmRlZiBfQVNNX0dFTkVSSUNfRE1BX01BUFBJTkdfSAogI2RlZmluZSBfQVNNX0dFTkVSSUNfRE1BX01BUFBJTkdfSAogCi0vKiBUaGlzIGlzIHVzZWQgZm9yIGFyY2hzIHRoYXQgZG8gbm90IHN1cHBvcnQgRE1BICovCisvKiBkZWZpbmUgdGhlIGRtYSBhcGkgdG8gYWxsb3cgY29tcGlsYXRpb24gYnV0IG5vdCBsaW5raW5nIG9mCisgKiBkbWEgZGVwZW5kZW50IGNvZGUuICBDb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgZG1hLW1hcHBpbmcKKyAqIEFQSSBuZWVkcyB0byBzZXQgJ2RlcGVuZHMgb24gSEFTX0RNQScgaW4gaXRzIEtjb25maWcKKyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgKgorc3RydWN0IHNjYXR0ZXJsaXN0OworCitleHRlcm4gdm9pZCAqCiBkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwKLQkJICAgZ2ZwX3QgZmxhZykKLXsKLQlCVUcoKTsKLQlyZXR1cm4gTlVMTDsKLX0KKwkJICAgZ2ZwX3QgZmxhZyk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorZXh0ZXJuIHZvaWQKIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLAotCQkgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQotewotCUJVRygpOwotfQorCQkgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKIAogI2RlZmluZSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoZCwgcywgaCwgZikgZG1hX2FsbG9jX2NvaGVyZW50KGQsIHMsIGgsIGYpCiAjZGVmaW5lIGRtYV9mcmVlX25vbmNvaGVyZW50KGQsIHMsIHYsIGgpIGRtYV9mcmVlX2NvaGVyZW50KGQsIHMsIHYsIGgpCiAKK2V4dGVybiBkbWFfYWRkcl90CitkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gaW50CitkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmh3ZW50cmllcywKKwkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiBkbWFfYWRkcl90CitkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJICAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywgc2l6ZV90IHNpemUsCisJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gdm9pZAorZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gdm9pZAorZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCisJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCisjZGVmaW5lIGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1CisjZGVmaW5lIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1CisjZGVmaW5lIGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2UgZG1hX3N5bmNfc2dfZm9yX2NwdQorCitleHRlcm4gaW50CitkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcl90IGRtYV9hZGRyKTsKKworZXh0ZXJuIGludAorZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKKworZXh0ZXJuIGludAorZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworCitleHRlcm4gaW50CitkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKTsKKworZXh0ZXJuIGludAorZG1hX2lzX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOworCitleHRlcm4gdm9pZAorZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKICNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfRE1BX01BUFBJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCmluZGV4IGMxNTRiOWQuLmI4NDc3NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKQEAgLTQ4LDYgKzQ4LDkgQEAKICNpZm5kZWYgT19OT0FUSU1FCiAjZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAogI2VuZGlmCisjaWZuZGVmIE9fQ0xPRVhFQworI2RlZmluZSBPX0NMT0VYRUMJMDIwMDAwMDAJLyogc2V0IGNsb3NlX29uX2V4ZWMgKi8KKyNlbmRpZgogI2lmbmRlZiBPX05ERUxBWQogI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKaW5kZXggN2Q3YmNmOS4uZjYwNWU4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKQEAgLTMsMjUgKzMsNiBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0jaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfRVNUQUJMSVNICi0vKgotICogRXN0YWJsaXNoIGEgbmV3IG1hcHBpbmc6Ci0gKiAgLSBmbHVzaCB0aGUgb2xkIG9uZQotICogIC0gdXBkYXRlIHRoZSBwYWdlIHRhYmxlcwotICogIC0gaW5mb3JtIHRoZSBUTEIgYWJvdXQgdGhlIG5ldyBvbmUKLSAqCi0gKiBXZSBob2xkIHRoZSBtbSBzZW1hcGhvcmUgZm9yIHJlYWRpbmcsIGFuZCB0aGUgcHRlIGxvY2suCi0gKgotICogTm90ZTogdGhlIG9sZCBwdGUgaXMga25vd24gdG8gbm90IGJlIHdyaXRhYmxlLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gKiB3b3JyeSBhYm91dCBkaXJ0eSBiaXRzIGV0YyBnZXR0aW5nIGxvc3QuCi0gKi8KLSNkZWZpbmUgcHRlcF9lc3RhYmxpc2goX192bWEsIF9fYWRkcmVzcywgX19wdGVwLCBfX2VudHJ5KQkJXAotZG8gewkJCQkgIAkJCQkJXAotCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIChfX2FkZHJlc3MpLCBfX3B0ZXAsIF9fZW50cnkpOwlcCi0JZmx1c2hfdGxiX3BhZ2UoX192bWEsIF9fYWRkcmVzcyk7CQkJCVwKLX0gd2hpbGUgKDApCi0jZW5kaWYKLQogI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX1NFVF9BQ0NFU1NfRkxBR1MKIC8qCiAgKiBMYXJnZWx5IHNhbWUgYXMgYWJvdmUsIGJ1dCBvbmx5IHNldHMgdGhlIGFjY2VzcyBmbGFncyAoZGlydHksCkBAIC02OCwzMSArNDksNiBAQAogfSkKICNlbmRpZgogCi0jaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKLSNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXApCQlcCi0oewkJCQkJCQkJCVwKLQlwdGVfdCBfX3B0ZSA9ICpfX3B0ZXA7CQkJCQkJXAotCWludCByID0gMTsJCQkJCQkJXAotCWlmICghcHRlX2RpcnR5KF9fcHRlKSkJCQkJCQlcCi0JCXIgPSAwOwkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQlzZXRfcHRlX2F0KChfX3ZtYSktPnZtX21tLCAoX19hZGRyZXNzKSwgKF9fcHRlcCksCVwKLQkJCSAgIHB0ZV9ta2NsZWFuKF9fcHRlKSk7CQkJCVwKLQlyOwkJCQkJCQkJXAotfSkKLSNlbmRpZgotCi0jaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRElSVFlfRkxVU0gKLSNkZWZpbmUgcHRlcF9jbGVhcl9mbHVzaF9kaXJ0eShfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXApCQlcCi0oewkJCQkJCQkJCVwKLQlpbnQgX19kaXJ0eTsJCQkJCQkJXAotCV9fZGlydHkgPSBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCk7CVwKLQlpZiAoX19kaXJ0eSkJCQkJCQkJXAotCQlmbHVzaF90bGJfcGFnZShfX3ZtYSwgX19hZGRyZXNzKTsJCQlcCi0JX19kaXJ0eTsJCQkJCQkJXAotfSkKLSNlbmRpZgotCiAjaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBwdGVwX2dldF9hbmRfY2xlYXIoX19tbSwgX19hZGRyZXNzLCBfX3B0ZXApCQkJXAogKHsJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaAppbmRleCAwOWVjNDQ3Li4xNmE0NjZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmgKQEAgLTE4LDcgKzE4LDggQEAKICNkZWZpbmUgZ2V0X3VuYWxpZ25lZChwdHIpIFwKIAlfX2dldF91bmFsaWduZWQoKHB0ciksIHNpemVvZigqKHB0cikpKQogI2RlZmluZSBwdXRfdW5hbGlnbmVkKHgscHRyKSBcCi0JX19wdXRfdW5hbGlnbmVkKChfX3U2NCkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKwkoKHZvaWQpc2l6ZW9mKCoocHRyKT0oeCkpLFwKKwlfX3B1dF91bmFsaWduZWQoKF9fZm9yY2UgX191NjQpKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpKQogCiAvKgogICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0LiAgVGhlIGlkZWEgaXMgdGhhdCB3aGVuCkBAIC05NSwyMSArOTYsMjEgQEAKIAlkZWZhdWx0OgkJCQlcCiAJCWJhZF91bmFsaWduZWRfYWNjZXNzX2xlbmd0aCgpOwlcCiAJfTsJCQkJCVwKLQkoX190eXBlb2ZfXygqKHB0cikpKXZhbDsJCVwKKwkoX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkpdmFsOwlcCiB9KQogCiAjZGVmaW5lIF9fcHV0X3VuYWxpZ25lZCh2YWwsIHB0ciwgc2l6ZSkJCVwKLWRvIHsJCQkJCQlcCisoewkJCQkJCVwKIAl2b2lkICpfX2d1X3AgPSBwdHI7CQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQlcCiAJY2FzZSAxOgkJCQkJXAotCQkqKF9fdTggKilfX2d1X3AgPSB2YWw7CQlcCisJCSooX191OCAqKV9fZ3VfcCA9IChfX2ZvcmNlIF9fdTgpdmFsOwkJXAogCSAgICAgICAgYnJlYWs7CQkJCVwKIAljYXNlIDI6CQkJCQlcCi0JCV9fdXN0dyh2YWwsIF9fZ3VfcCk7CQlcCisJCV9fdXN0dygoX19mb3JjZSBfX3UxNil2YWwsIF9fZ3VfcCk7CQlcCiAJCWJyZWFrOwkJCQlcCiAJY2FzZSA0OgkJCQkJXAotCQlfX3VzdGwodmFsLCBfX2d1X3ApOwkJXAorCQlfX3VzdGwoKF9fZm9yY2UgX191MzIpdmFsLCBfX2d1X3ApOwkJXAogCQlicmVhazsJCQkJXAogCWNhc2UgODoJCQkJCVwKIAkJX191c3RxKHZhbCwgX19ndV9wKTsJCVwKQEAgLTExNyw2ICsxMTgsNyBAQAogCWRlZmF1bHQ6CQkJCVwKIAkgICAgCWJhZF91bmFsaWduZWRfYWNjZXNzX2xlbmd0aCgpOwlcCiAJfTsJCQkJCVwKLX0gd2hpbGUoMCkKKwkodm9pZCkwOwkJCQlcCit9KQogCiAjZW5kaWYgLyogX0FTTV9HRU5FUklDX1VOQUxJR05FRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20taDgzMDAvZG1hLW1hcHBpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwZTQwMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9kbWEtbWFwcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvZmIuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2lvY3Rscy5oIGIvaW5jbHVkZS9hc20taDgzMDAvaW9jdGxzLmgKaW5kZXggYWMyMDQ1Ny4uOThhNTNkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvaW9jdGxzLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvaW9jdGxzLmgKQEAgLTQ3LDYgKzQ3LDEwIEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywweDJELCBzdHJ1Y3QgdGVybWlvczIpCiAjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLwogI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmggYi9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmgKaW5kZXggM2I0ZjI5MC4uYzhjYzgxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaApAQCAtMjIsNyArMjIsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWJpdHMuaAppbmRleCBlODc3YjQwLi4zMWVjYTgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmgKQEAgLTE0MSw2ICsxNDEsNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgICBCT1RIRVIgMDAxMDAwMAogI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQogI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMwpAQCAtMTU2LDEwICsxNTcsMTIgQEAKICNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKICNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKICNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlICovCiAjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLwogI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KIAorI2RlZmluZSBJQlNISUZUCSAgMTYJCQkvKiBzaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1oODMwMC90ZXJtaW9zLmgKaW5kZXggZmIyOTI1ZC4uNzBlZWE2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1pb3MuaApAQCAtODIsOCArODIsMTAgQEAKIAljb3B5X3RvX3VzZXIoKHRlcm1pbyktPmNfY2MsICh0ZXJtaW9zKS0+Y19jYywgTkNDKTsgXAogfSkKIAotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20taDgzMDAvdGhyZWFkX2luZm8uaAppbmRleCA0NWYwOWRjLi5hZWU0MDA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmgKQEAgLTkyLDYgKzkyLDcgQEAKICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTQJLyogdHJ1ZSBpZiBwb2xsX2lkbGUoKSBpcyBwb2xsaW5nCiAJCQkJCSAgIFRJRl9ORUVEX1JFU0NIRUQgKi8KICNkZWZpbmUgVElGX01FTURJRQkJNQorI2RlZmluZSBUSUZfUkVTVE9SRV9TSUdNQVNLCTYJLyogcmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwoKSAqLwogCiAvKiBhcyBhYm92ZSwgYnV0IGFzIGJpdCB2YWx1ZXMgKi8KICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKQEAgLTk5LDYgKzEwMCw3IEBACiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDE8PFRJRl9TSUdQRU5ESU5HKQogI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMTw8VElGX05FRURfUkVTQ0hFRCkKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMTw8VElGX1BPTExJTkdfTlJGTEFHKQorI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMTw8VElGX1JFU1RPUkVfU0lHTUFTSykKIAogI2RlZmluZSBfVElGX1dPUktfTUFTSwkJMHgwMDAwRkZGRQkvKiB3b3JrIHRvIGRvIG9uIGludGVycnVwdC9leGNlcHRpb24gcmV0dXJuICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZmIuaCBiL2luY2x1ZGUvYXNtLWkzODYvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWM2Mjk3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9mYi5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworZXh0ZXJuIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCWlmIChib290X2NwdV9kYXRhLng4NiA+IDMpCisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX1BDRDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmggYi9pbmNsdWRlL2FzbS1pMzg2L2ZpeG1hcC5oCmluZGV4IDgwZWEwNTIuLjI0OWU3NTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaApAQCAtNTQsNiArNTQsOCBAQAogZW51bSBmaXhlZF9hZGRyZXNzZXMgewogCUZJWF9IT0xFLAogCUZJWF9WRFNPLAorCUZJWF9EQkdQX0JBU0UsCisJRklYX0VBUkxZQ09OX01FTV9CQVNFLAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCUZJWF9BUElDX0JBU0UsCS8qIGxvY2FsIChDUFUpIEFQSUMpIC0tIHJlcXVpcmVkIGZvciBTTVAgb3Igbm90ICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaWRlLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oCmluZGV4IDBmYzI0MGMuLmU3ODE3YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaWRlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pZGUuaApAQCAtNDAsMTQgKzQwLDEzIEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgaWRlX2RlZmF1bHRfaW9fYmFzZShpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJLyoKIAkgKglJZiBQQ0kgaXMgcHJlc2VudCB0aGVuIGl0IGlzIG5vdCBzYWZlIHRvIHBva2UgYXJvdW5kCiAJICoJdGhlIG90aGVyIGxlZ2FjeSBJREUgcG9ydHMuIE9ubHkgMHgxZjAgYW5kIDB4MTcwIGFyZQogCSAqCWRlZmluZWQgY29tcGF0aWJpbGl0eSBtb2RlIHBvcnRzIGZvciBQQ0kuIEEgdXNlciBjYW4gCiAJICoJb3ZlcnJpZGUgdGhpcyB1c2luZyBpZGU9IGJ1dCB3ZSBtdXN0IGRlZmF1bHQgc2FmZS4KIAkgKi8KLQlpZiAoKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKSkgPT0gTlVMTCkgeworCWlmIChub19wY2lfZGV2aWNlcygpKSB7CiAJCXN3aXRjaChpbmRleCkgewogCQkJY2FzZSAyOiByZXR1cm4gMHgxZTg7CiAJCQljYXNlIDM6IHJldHVybiAweDE2ODsKQEAgLTU1LDcgKzU0LDYgQEAKIAkJCWNhc2UgNTogcmV0dXJuIDB4MTYwOwogCQl9CiAJfQotCXBjaV9kZXZfcHV0KHBkZXYpOwogCXN3aXRjaCAoaW5kZXgpIHsKIAkJY2FzZSAwOglyZXR1cm4gMHgxZjA7CiAJCWNhc2UgMToJcmV0dXJuIDB4MTcwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pby5oIGIvaW5jbHVkZS9hc20taTM4Ni9pby5oCmluZGV4IGU3OTc1ODYuLjdiNjViNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKQEAgLTEyOSw2ICsxMjksNyBAQAogICovCiBleHRlcm4gdm9pZCAqYnRfaW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIGJ0X2lvdW5tYXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiB2b2lkIF9faW9tZW0gKmZpeF9pb3JlbWFwKHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbG9uZyBwaHlzKTsKIAogLyogVXNlIGVhcmx5IElPIG1hcHBpbmdzIGZvciBETUkgYmVjYXVzZSBpdCdzIGluaXRpYWxpemVkIGVhcmx5ICovCiAjZGVmaW5lIGRtaV9pb3JlbWFwIGJ0X2lvcmVtYXAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGFnZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmgKaW5kZXggODE4YWM4Yi4uOTljZjVkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmgKQEAgLTM0LDcgKzM0LDggQEAKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykJY2xlYXJfcGFnZShwYWdlKQogI2RlZmluZSBjb3B5X3VzZXJfcGFnZSh0bywgZnJvbSwgdmFkZHIsIHBnKQljb3B5X3BhZ2UodG8sIGZyb20pCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcikKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpIFwKKwlhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTJsZXZlbC5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTJsZXZlbC5oCmluZGV4IGE1MGZkMTcuLjg0YjAzY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0ybGV2ZWwuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmgKQEAgLTU3LDE0ICs1Nyw2IEBACiAjZGVmaW5lIHBmbl9wbWQocGZuLCBwcm90KQlfX3BtZCgoKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKQogCiAvKgotICogQWxsIHByZXNlbnQgdXNlciBwYWdlcyBhcmUgdXNlci1leGVjdXRhYmxlOgotICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIHB0ZV91c2VyKHB0ZSk7Ci19Ci0KLS8qCiAgKiBBbGwgcHJlc2VudCBwYWdlcyBhcmUga2VybmVsLWV4ZWN1dGFibGU6CiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjX2tlcm5lbChwdGVfdCBwdGUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtM2xldmVsLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtM2xldmVsLmgKaW5kZXggZWIwZjFkNy4uOTQ4YTMzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaApAQCAtMjAsMjYgKzIwLDExIEBACiAjZGVmaW5lIHB1ZF9wcmVzZW50KHB1ZCkJCQkxCiAKIC8qCi0gKiBJcyB0aGUgcHRlIGV4ZWN1dGFibGU/Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV94KHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9OWCk7Ci19Ci0KLS8qCi0gKiBBbGwgcHJlc2VudCB1c2VyLXBhZ2VzIHdpdGggIU5YIGJpdCBhcmUgdXNlci1leGVjdXRhYmxlOgotICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIHB0ZV91c2VyKHB0ZSkgJiYgcHRlX3gocHRlKTsKLX0KLS8qCiAgKiBBbGwgcHJlc2VudCBwYWdlcyB3aXRoICFOWCBiaXQgYXJlIGtlcm5lbC1leGVjdXRhYmxlOgogICovCiBzdGF0aWMgaW5saW5lIGludCBwdGVfZXhlY19rZXJuZWwocHRlX3QgcHRlKQogewotCXJldHVybiBwdGVfeChwdGUpOworCXJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX05YKTsKIH0KIAogLyogUnVsZXMgZm9yIHVzaW5nIHNldF9wdGU6IHRoZSBwdGUgYmVpbmcgYXNzaWduZWQgKm11c3QqIGJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oCmluZGV4IDYyOGZhNzcuLmM3ZmVmYTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oCkBAIC03OSw3ICs3OSw3IEBACiAgKiBhcmVhIGZvciB0aGUgc2FtZSByZWFzb24uIDspCiAgKi8KICNkZWZpbmUgVk1BTExPQ19PRkZTRVQJKDgqMTAyNCoxMDI0KQotI2RlZmluZSBWTUFMTE9DX1NUQVJUCSgoKHVuc2lnbmVkIGxvbmcpIGhpZ2hfbWVtb3J5ICsgdm1hbGxvY19lYXJseXJlc2VydmUgKyBcCisjZGVmaW5lIFZNQUxMT0NfU1RBUlQJKCgodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgKyBcCiAJCQkyKlZNQUxMT0NfT0ZGU0VULTEpICYgfihWTUFMTE9DX09GRlNFVC0xKSkKICNpZmRlZiBDT05GSUdfSElHSE1FTQogIyBkZWZpbmUgVk1BTExPQ19FTkQJKFBLTUFQX0JBU0UtMipQQUdFX1NJWkUpCkBAIC0yMTgsOCArMjE4LDYgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX1VTRVI7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZV9sb3cgJiBfUEFHRV9VU0VSOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX1JXOyB9CkBAIC0yMzAsMTMgKzIyOCw5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZV9sb3cgJiBfUEFHRV9GSUxFOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93ICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93ICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX1JXOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93IHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgfD0gX1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgfD0gX1BBR0VfUlc7IHJldHVybiBwdGU7IH0KQEAgLTI5NSwxNyArMjg5LDYgQEAKIAlfX2NoYW5nZWQ7CQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHZtYSwgYWRkciwgcHRlcCkgKHsJCQlcCi0JaW50IF9fcmV0ID0gMDsJCQkJCQkJXAotCWlmIChwdGVfZGlydHkoKihwdGVwKSkpCQkJCQkJXAotCQlfX3JldCA9IHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfRElSVFksCQlcCi0JCQkJCQkmKHB0ZXApLT5wdGVfbG93KTsJXAotCWlmIChfX3JldCkJCQkJCQkJXAotCQlwdGVfdXBkYXRlKCh2bWEpLT52bV9tbSwgYWRkciwgcHRlcCk7CQkJXAotCV9fcmV0OwkJCQkJCQkJXAotfSkKLQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCiAjZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCBhZGRyLCBwdGVwKSAoewkJCVwKIAlpbnQgX19yZXQgPSAwOwkJCQkJCQlcCkBAIC0zMTcsMjcgKzMwMCw2IEBACiAJX19yZXQ7CQkJCQkJCQlcCiB9KQogCi0vKgotICogUnVsZXMgZm9yIHVzaW5nIHB0ZXBfZXN0YWJsaXNoOiB0aGUgcHRlIE1VU1QgYmUgYSB1c2VyIHB0ZSwgYW5kCi0gKiBtdXN0IGJlIGEgcHJlc2VudC0+cHJlc2VudCB0cmFuc2l0aW9uLgotICovCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfRVNUQUJMSVNICi0jZGVmaW5lIHB0ZXBfZXN0YWJsaXNoKHZtYSwgYWRkcmVzcywgcHRlcCwgcHRldmFsKQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0Jc2V0X3B0ZV9wcmVzZW50KCh2bWEpLT52bV9tbSwgYWRkcmVzcywgcHRlcCwgcHRldmFsKTsJCVwKLQlmbHVzaF90bGJfcGFnZSh2bWEsIGFkZHJlc3MpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0RJUlRZX0ZMVVNICi0jZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2hfZGlydHkodm1hLCBhZGRyZXNzLCBwdGVwKQkJCVwKLSh7CQkJCQkJCQkJXAotCWludCBfX2RpcnR5OwkJCQkJCQlcCi0JX19kaXJ0eSA9IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoKHZtYSksIChhZGRyZXNzKSwgKHB0ZXApKTsJXAotCWlmIChfX2RpcnR5KQkJCQkJCQlcCi0JCWZsdXNoX3RsYl9wYWdlKHZtYSwgYWRkcmVzcyk7CQkJCVwKLQlfX2RpcnR5OwkJCQkJCQlcCi19KQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfWU9VTkdfRkxVU0gKICNkZWZpbmUgcHRlcF9jbGVhcl9mbHVzaF95b3VuZyh2bWEsIGFkZHJlc3MsIHB0ZXApCQkJXAogKHsJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAppbmRleCA5NGUwYzE0Li40MjJjZmZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKQEAgLTIyOCw2ICsyMjgsMTAgQEAKIAogI2RlZmluZSBIQVZFX0FSQ0hfUElDS19NTUFQX0xBWU9VVAogCitleHRlcm4gdm9pZCBoYXJkX2Rpc2FibGVfVFNDKHZvaWQpOworZXh0ZXJuIHZvaWQgZGlzYWJsZV9UU0Modm9pZCk7CitleHRlcm4gdm9pZCBoYXJkX2VuYWJsZV9UU0Modm9pZCk7CisKIC8qCiAgKiBTaXplIG9mIGlvX2JpdG1hcC4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCmluZGV4IDRjYjBmOTEuLjU0NDI0ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKQEAgLTEzNyw2ICsxMzcsNyBAQAogI2RlZmluZSBUSUZfREVCVUcJCTE3CS8qIHVzZXMgZGVidWcgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFRJRl9JT19CSVRNQVAJCTE4CS8qIHVzZXMgSS9PIGJpdG1hcCAqLwogI2RlZmluZSBUSUZfRlJFRVpFCQkxOQkvKiBpcyBmcmVlemluZyBmb3Igc3VzcGVuZCAqLworI2RlZmluZSBUSUZfTk9UU0MJCTIwCS8qIFRTQyBpcyBub3QgYWNjZXNzaWJsZSBpbiB1c2VybGFuZCAqLwogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCkBAIC0xNTEsNiArMTUyLDcgQEAKICNkZWZpbmUgX1RJRl9ERUJVRwkJKDE8PFRJRl9ERUJVRykKICNkZWZpbmUgX1RJRl9JT19CSVRNQVAJCSgxPDxUSUZfSU9fQklUTUFQKQogI2RlZmluZSBfVElGX0ZSRUVaRQkJKDE8PFRJRl9GUkVFWkUpCisjZGVmaW5lIF9USUZfTk9UU0MJCSgxPDxUSUZfTk9UU0MpCiAKIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KICNkZWZpbmUgX1RJRl9XT1JLX01BU0sgXApAQCAtMTYwLDcgKzE2Miw4IEBACiAjZGVmaW5lIF9USUZfQUxMV09SS19NQVNLCSgweDAwMDBGRkZGICYgfl9USUZfU0VDQ09NUCkKIAogLyogZmxhZ3MgdG8gY2hlY2sgaW4gX19zd2l0Y2hfdG8oKSAqLwotI2RlZmluZSBfVElGX1dPUktfQ1RYU1cgKF9USUZfREVCVUd8X1RJRl9JT19CSVRNQVApCisjZGVmaW5lIF9USUZfV09SS19DVFhTV19ORVhUIChfVElGX0lPX0JJVE1BUCB8IF9USUZfTk9UU0MgfCBfVElGX0RFQlVHKQorI2RlZmluZSBfVElGX1dPUktfQ1RYU1dfUFJFViAoX1RJRl9JT19CSVRNQVAgfCBfVElGX05PVFNDKQogCiAvKgogICogVGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCmluZGV4IDQwZDAxZDguLjBmNmU1MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaApAQCAtMzEsOCArMzEsMTAgQEAKIAogdHlwZWRlZiBzMzIJCWNvbXBhdF9pbnRfdDsKIHR5cGVkZWYgczMyCQljb21wYXRfbG9uZ190OwordHlwZWRlZiBzNjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIGNvbXBhdF9zNjQ7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3VpbnRfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWxvbmdfdDsKK3R5cGVkZWYgdTY0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKSBjb21wYXRfdTY0OwogCiBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHsKIAljb21wYXRfdGltZV90CXR2X3NlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvZmIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWEzOTdjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9mYi5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaWYgKGVmaV9yYW5nZV9pc193Yyh2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpKQorCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOworCWVsc2UKKwkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2lvY3Rscy5oIGIvaW5jbHVkZS9hc20taWE2NC9pb2N0bHMuaAppbmRleCAzMWVlNTIxLi5mNDFiNjM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGxzLmgKQEAgLTUzLDYgKzUzLDEwIEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywweDJELCBzdHJ1Y3QgdGVybWlvczIpCiAjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLwogI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oCmluZGV4IDQ4NTc1OWIuLmQ2MzQ1NDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oCkBAIC04NywxMiArODcsMTMgQEAKIH0gd2hpbGUgKDApCiAKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBcCi0oewkJCQkJCVwKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpOyBcCi0JaWYgKHBhZ2UpCQkJCVwKLSAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwlcCi0JcGFnZTsJCQkJCVwKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCQlcCisoewkJCQkJCQkJCVwKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKAkJCQlcCisJCUdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpOwlcCisJaWYgKHBhZ2UpCQkJCQkJCVwKKyAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwkJCQlcCisJcGFnZTsJCQkJCQkJCVwKIH0pCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20taWE2NC9wZ3RhYmxlLmgKaW5kZXggNjU4MGYzMS4uZGU2ZDAxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wZ3RhYmxlLmgKQEAgLTI5Nyw4ICsyOTcsNiBAQAogLyoKICAqIFRoZSBmb2xsb3dpbmcgaGF2ZSBkZWZpbmVkIGJlaGF2aW9yIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKi8KLSNkZWZpbmUgcHRlX3VzZXIocHRlKQkJKChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9QTF9NQVNLKSA9PSBfUEFHRV9QTF8zKQotI2RlZmluZSBwdGVfcmVhZChwdGUpCQkoKChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BUl9NQVNLKSA+PiBfUEFHRV9BUl9TSElGVCkgPCA2KQogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkoKHVuc2lnbmVkKSAoKChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BUl9NQVNLKSA+PiBfUEFHRV9BUl9TSElGVCkgLSAyKSA8PSA0KQogI2RlZmluZSBwdGVfZXhlYyhwdGUpCQkoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FSX1JYKSAhPSAwKQogI2RlZmluZSBwdGVfZGlydHkocHRlKQkJKChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9EKSAhPSAwKQpAQCAtMzEwLDcgKzMwOCw2IEBACiAgKi8KICNkZWZpbmUgcHRlX3dycHJvdGVjdChwdGUpCShfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfQVJfUlcpKQogI2RlZmluZSBwdGVfbWt3cml0ZShwdGUpCShfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9BUl9SVykpCi0jZGVmaW5lIHB0ZV9ta2V4ZWMocHRlKQkJKF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0FSX1JYKSkKICNkZWZpbmUgcHRlX21rb2xkKHB0ZSkJCShfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfQSkpCiAjZGVmaW5lIHB0ZV9ta3lvdW5nKHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0EpKQogI2RlZmluZSBwdGVfbWtjbGVhbihwdGUpCShfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRCkpCkBAIC0zOTgsMjIgKzM5NSw2IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLXB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkgKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoIXB0ZV9kaXJ0eSgqcHRlcCkpCi0JCXJldHVybiAwOwotCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfRF9CSVQsIHB0ZXApOwotI2Vsc2UKLQlwdGVfdCBwdGUgPSAqcHRlcDsKLQlpZiAoIXB0ZV9kaXJ0eShwdGUpKQotCQlyZXR1cm4gMDsKLQlzZXRfcHRlX2F0KHZtYS0+dm1fbW0sIGFkZHIsIHB0ZXAsIHB0ZV9ta2NsZWFuKHB0ZSkpOwotCXJldHVybiAxOwotI2VuZGlmCi19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QKIHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKQEAgLTU0Niw4ICs1MjcsMTAgQEAKICMgZGVmaW5lIHB0ZXBfc2V0X2FjY2Vzc19mbGFncyhfX3ZtYSwgX19hZGRyLCBfX3B0ZXAsIF9fZW50cnksIF9fc2FmZWx5X3dyaXRhYmxlKSBcCiAoewkJCQkJCQkJCVwKIAlpbnQgX19jaGFuZ2VkID0gIXB0ZV9zYW1lKCooX19wdGVwKSwgX19lbnRyeSk7CQkJXAotCWlmIChfX2NoYW5nZWQpCQkJCQkJCVwKLQkJcHRlcF9lc3RhYmxpc2goX192bWEsIF9fYWRkciwgX19wdGVwLCBfX2VudHJ5KTsJCVwKKwlpZiAoX19jaGFuZ2VkKSB7CQkJCQkJXAorCQlzZXRfcHRlX2F0KChfX3ZtYSktPnZtX21tLCAoX19hZGRyKSwgX19wdGVwLCBfX2VudHJ5KTsJXAorCQlmbHVzaF90bGJfcGFnZShfX3ZtYSwgX19hZGRyKTsJCQkJXAorCX0JCQkJCQkJCVwKIAlfX2NoYW5nZWQ7CQkJCQkJCVwKIH0pCiAjZW5kaWYKQEAgLTU5MSw3ICs1NzQsNiBAQAogI2VuZGlmCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWJpdHMuaAppbmRleCA3ZmFlMzEwLi45ZjE2MmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oCkBAIC0xNDksNiArMTQ5LDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICAgQk9USEVSIDAwMTAwMDAKICNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKICNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKQEAgLTE2NCwxMCArMTY1LDEyIEBACiAjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CiAjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CiAjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3Ci0jZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qIGlucHV0IGJhdWQgcmF0ZSAqLwogI2RlZmluZSBDTVNQQVIJICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCiAKKyNkZWZpbmUgSUJTSElGVAkxNgkJLyogU2hpZnQgZnJvbSBDQkFVRCB0byBDSUJBVUQgKi8KKwogLyogY19sZmxhZyBiaXRzICovCiAjZGVmaW5lIElTSUcJMDAwMDAwMQogI2RlZmluZSBJQ0FOT04JMDAwMDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1pb3MuaAppbmRleCAwODc1MGMyLi42ODlkMjE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1pb3MuaApAQCAtODcsOCArODcsMTAgQEAKIAljb3B5X3RvX3VzZXIoKHRlcm1pbyktPmNfY2MsICh0ZXJtaW9zKS0+Y19jYywgTkNDKTsJXAogfSkKIAotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQogCiAjIGVuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tbTMyci9kbWEtbWFwcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI1OGViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvZG1hLW1hcHBpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfQVNNX00zMlJfRE1BX01BUFBJTkdfSAotI2RlZmluZSBfQVNNX00zMlJfRE1BX01BUFBJTkdfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+Ci0KLSNlbmRpZiAvKiBfQVNNX00zMlJfRE1BX01BUFBJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9mYi5oIGIvaW5jbHVkZS9hc20tbTMyci9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1tMzJyL2lvY3Rscy5oCmluZGV4IGQyM2NmYzQuLmI5ZjU0YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvaW9jdGxzLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9pb2N0bHMuaApAQCAtNDcsNiArNDcsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvcGFnZS5oIGIvaW5jbHVkZS9hc20tbTMyci9wYWdlLmgKaW5kZXggNmY2ZWNmNy4uMDRmZDE4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9wYWdlLmgKQEAgLTE1LDcgKzE1LDggQEAKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykJY2xlYXJfcGFnZShwYWdlKQogI2RlZmluZSBjb3B5X3VzZXJfcGFnZSh0bywgZnJvbSwgdmFkZHIsIHBnKQljb3B5X3BhZ2UodG8sIGZyb20pCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcikKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpIFwKKwlhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1tMzJyL3BndGFibGUuaAppbmRleCA2NjA0MzAzLi45MmQ3MjY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3BndGFibGUuaApAQCAtMTkxLDE2ICsxOTEsNiBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQUQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRVhFQzsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7CkBAIC0yMjQsMTggKzIxNCw2IEBACiAJcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9SRUFEOwotCXJldHVybiBwdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9FWEVDOwotCXJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQogewogCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRElSVFk7CkBAIC0yNTQsMTggKzIzMiw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsKLQlyZXR1cm4gcHRlOwotfQotCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9FWEVDOwotCXJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9ESVJUWTsKQEAgLTI4NCwxMSArMjUwLDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lICBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9ESVJUWSwgcHRlcCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0FDQ0VTU0VELCBwdGVwKTsKQEAgLTM4Miw3ICszNDMsNiBAQAogCQlyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TQU1FCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1iaXRzLmgKaW5kZXggNmJlM2I4YS4uYmMxMDQwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaApAQCAtMTQwLDYgKzE0MCw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgIEJPVEhFUiAwMDEwMDAwCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNTUsMTEgKzE1NiwxMyBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiogaW5wdXQgYmF1ZCByYXRlICovCiAjZGVmaW5lIENUVkIJICAwMDQwMDAwMDAwMDAJCS8qIFZpc2lvQnJhaWxsZSBUZXJtaW5hbCBmbG93IGNvbnRyb2wgKi8KICNkZWZpbmUgQ01TUEFSCSAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lCUlCU0hJRlQJMTYJCQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLW0zMnIvdGVybWlvcy5oCmluZGV4IDQ5NDNkZDguLjkzY2U3OWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvdGVybWlvcy5oCkBAIC04MSw4ICs4MSwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfU0xNLmggYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX1NMTS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmY0ZmNkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfU0xNLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0KLSNpZm5kZWYgX0FUQVJJX1NMTV9ICi0jZGVmaW5lIF9BVEFSSV9TTE1fSAotCi0vKiBBdGFyaSBTTE0gbGFzZXIgcHJpbnRlciBzcGVjaWZpYyBpb2N0bHMgKi8KLQotI2RlZmluZQlTTE1JT0dTVEFUCTB4YTEwMAotI2RlZmluZQlTTE1JT0dQU0laRQkweGExMDEKLSNkZWZpbmUJU0xNSU9HTUZFRUQJMHhhMTAyCi0KLSNkZWZpbmUJU0xNSU9SRVNFVAkweGExNDAKLQotI2RlZmluZQlTTE1JT1NQU0laRQkweGExODEKLSNkZWZpbmUJU0xNSU9TTUZFRUQJMHhhMTgyCi0KLS8qIFN0YXR1cyByZXR1cm5pbmcgc3RydWN0dXJlIChTTE1JT0dTVEFUKSAqLwotc3RydWN0IFNMTV9zdGF0dXMgewotCWludAkJc3RhdDsJCS8qIG51bWVyaWMgc3RhdHVzIGNvZGUgKi8KLQljaGFyCXN0cls0MF07CS8qIHN0YXR1cyBzdHJpbmcgKi8KLX07Ci0KLS8qIFBhcGVyIHNpemUgc3RydWN0dXJlIChTTE1JT1tHU11QU0laRSkgKi8KLXN0cnVjdCBTTE1fcGFwZXJfc2l6ZSB7Ci0JaW50CQl3aWR0aDsKLQlpbnQJCWhlaWdodDsKLX07Ci0KLSNlbmRpZiAvKiBfQVRBUklfU0xNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfYWNzaS5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9hY3NpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZmVhNjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9hY3NpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaWZuZGVmIF9BU01fQVRBUklfQUNTSV9ICi0jZGVmaW5lIF9BU01fQVRBUklfQUNTSV9ICi0KLS8qIEZ1bmN0aW9ucyBleHBvcnRlZCBieSBkcml2ZXJzL2Jsb2NrL2Fjc2kuYyAqLwotCi12b2lkIGFjc2lfZGVsYXlfc3RhcnQoIHZvaWQgKTsKLXZvaWQgYWNzaV9kZWxheV9lbmQoIGxvbmcgdXNlYyApOwotaW50IGFjc2lfd2FpdF9mb3JfSVJRKCB1bnNpZ25lZCB0aW1lb3V0ICk7Ci1pbnQgYWNzaV93YWl0X2Zvcl9ub0lSUSggdW5zaWduZWQgdGltZW91dCApOwotaW50IGFjc2ljbWRfbm9kbWEoIGNvbnN0IGNoYXIgKmNtZCwgaW50IGVuYWJsZSk7Ci1pbnQgYWNzaV9nZXRzdGF0dXMoIHZvaWQgKTsKLWludCBhY3NpX2V4dHN0YXR1cyggY2hhciAqYnVmZmVyLCBpbnQgY250ICk7Ci12b2lkIGFjc2lfZW5kX2V4dHN0YXR1cyggdm9pZCApOwotaW50IGFjc2lfZXh0Y21kKCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBjbnQgKTsKLQotLyogVGhlIEFDU0kgYnVmZmVyIGlzIGd1YXJhbnR1ZWVkIHRvIHJlc2lkZSBpbiBTVC1SQU0gYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVyCi0gKiBkcml2ZXJzIHRoYXQgd29yayBvbiB0aGUgQUNTSSBidXMsIHRvby4gSXQncyBkYXRhIGFyZSB2YWxpZCBvbmx5IGFzIGxvbmcgYXMKLSAqIHRoZSBTVC1ETUEgaXMgbG9ja2VkLiAqLwotZXh0ZXJuIGNoYXIgKmFjc2lfYnVmZmVyOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGh5c19hY3NpX2J1ZmZlcjsKLQotLyogVXRpbGl0eSBtYWNyb3MgKi8KLQotLyogU2VuZCBvbmUgZGF0YSBieXRlIG92ZXIgdGhlIGJ1cyBhbmQgc2V0IG1vZGUgZm9yIG5leHQgb3BlcmF0aW9uCi0gKiB3aXRoIG9uZSBtb3ZlLmwgLS0gQXRhcmkgcmVjb21tZW5kcyB0aGlzLi4uCi0gKi8KLQotI2RlZmluZSBETUFfTE9OR19XUklURShkYXRhLG1vZGUpCQkJCQkJCVwKLSAgICBkbyB7CQkJCQkJCQkJCQkJCVwKLQkJKigodW5zaWduZWQgbG9uZyAqKSZkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50KSA9CVwKLQkJCSgoZGF0YSk8PDE2KSB8IChtb2RlKTsJCQkJCQkJXAotCX0gd2hpbGUoMCkKLQotI2RlZmluZSBFTkFCTEVfSVJRKCkJYXRhcmlfdHVybm9uX2lycSggSVJRX01GUF9BQ1NJICkKLSNkZWZpbmUgRElTQUJMRV9JUlEoKQlhdGFyaV90dXJub2ZmX2lycSggSVJRX01GUF9BQ1NJICkKLQotI2VuZGlmIC8qIF9BU01fQVRBUklfQUNTSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2ZiLmggYi9pbmNsdWRlL2FzbS1tNjhrL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwYjk3YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvZmIuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpZmRlZiBDT05GSUdfU1VOMworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gU1VOM19QQUdFX05PQ0FDSEU7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaWYgKENQVV9JU18wMjBfT1JfMDMwKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT0NBQ0hFMDMwOworCWlmIChDUFVfSVNfMDQwX09SXzA2MCkgeworCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSAmPSBfQ0FDSEVNQVNLMDQwOworCQkvKiBVc2Ugbm8tY2FjaGUgbW9kZSwgc2VyaWFsaXplZCAqLworCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT0NBQ0hFX1M7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19TVU4zICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1tNjhrL21vdG9yb2xhX3BndGFibGUuaAppbmRleCBiNWI3OGMwLi5kMDI5Yjc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL21vdG9yb2xhX3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL21vdG9yb2xhX3BndGFibGUuaApAQCAtMTY0LDIxICsxNjQsMTUgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gMTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfUk9OTFkpOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9ST05MWTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1JPTkxZOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rbm9jYWNoZShwdGVfdCBwdGUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaAppbmRleCBiOWU2MmMxLi5iNzY2ZmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmgKQEAgLTE2NSwyMSArMTY1LDE1IEBACiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uLgogICogW3dlIGhhdmUgdGhlIGZ1bGwgc2V0IGhlcmUgZXZlbiBpZiB0aGV5IGRvbid0IGNoYW5nZSBmcm9tIG02OGtdCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBTVU4zX1BBR0VfV1JJVEVBQkxFOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgU1VOM19QQUdFX01PRElGSUVEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgU1VOM19QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBTVU4zX1BBR0VfQUNDRVNTRUQ7IH0KIAogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gflNVTjNfUEFHRV9XUklURUFCTEU7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gflNVTjNfUEFHRV9NT0RJRklFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+U1VOM19QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gU1VOM19QQUdFX1dSSVRFQUJMRTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBTVU4zX1BBR0VfTU9ESUZJRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBTVU4zX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rbm9jYWNoZShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IFNVTjNfUEFHRV9OT0NBQ0hFOyByZXR1cm4gcHRlOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZmIuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9wYWdlLmgKaW5kZXggMmExYjhiZC4uOWVmYTBhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oCkBAIC0yMiw3ICsyMiw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCmluZGV4IDY3YzNmOGUuLjU2OGM3NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaApAQCAtMzcsOCArMzcsMTAgQEAKIAogdHlwZWRlZiBzMzIJCWNvbXBhdF9pbnRfdDsKIHR5cGVkZWYgczMyCQljb21wYXRfbG9uZ190OwordHlwZWRlZiBzNjQJCWNvbXBhdF9zNjQ7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3VpbnRfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWxvbmdfdDsKK3R5cGVkZWYgdTY0CQljb21wYXRfdTY0OwogCiBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHsKIAljb21wYXRfdGltZV90CXR2X3NlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZmIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNmNjhjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCmluZGV4IDI3ZDc3ZDkuLjJlMmQ3MGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCkBAIC0xNzgsOSArMTc4LDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKQl7IEJVRygpOyByZXR1cm4gMDsgfQogI2lmIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikgJiYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMSkKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlLnB0ZV9sb3cgJiBfUEFHRV9SRUFEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQl7IHJldHVybiBwdGUucHRlX2xvdyAmIF9QQUdFX1dSSVRFOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQl7IHJldHVybiBwdGUucHRlX2xvdyAmIF9QQUdFX01PRElGSUVEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQl7IHJldHVybiBwdGUucHRlX2xvdyAmIF9QQUdFX0FDQ0VTU0VEOyB9CkBAIC0xOTMsMTMgKzE5MSw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGUucHRlX2xvdyAgJj0gfihfUEFHRV9SRUFEIHwgX1BBR0VfU0lMRU5UX1JFQUQpOwotCXB0ZS5wdGVfaGlnaCAmPSB+X1BBR0VfU0lMRU5UX1JFQUQ7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlLnB0ZV9sb3cgICY9IH4oX1BBR0VfTU9ESUZJRUQgfCBfUEFHRV9TSUxFTlRfV1JJVEUpOwpAQCAtMjI0LDE2ICsyMTUsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCi17Ci0JcHRlLnB0ZV9sb3cgfD0gX1BBR0VfUkVBRDsKLQlpZiAocHRlLnB0ZV9sb3cgJiBfUEFHRV9BQ0NFU1NFRCkgewotCQlwdGUucHRlX2xvdyAgfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0JCXB0ZS5wdGVfaGlnaCB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLQl9Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAJcHRlLnB0ZV9sb3cgfD0gX1BBR0VfTU9ESUZJRUQ7CkBAIC0yNTMsNyArMjM0LDYgQEAKIAlyZXR1cm4gcHRlOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX01PRElGSUVEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQpAQCAtMjY1LDEyICsyNDUsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUkVBRCB8IF9QQUdFX1NJTEVOVF9SRUFEKTsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9NT0RJRklFRHxfUEFHRV9TSUxFTlRfV1JJVEUpOwpAQCAtMjkxLDE0ICsyNjUsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JFQUQ7Ci0JaWYgKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEKQotCQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX01PRElGSUVEOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaAppbmRleCBiZGEzOTFkLi4yNzM4YzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaApAQCAtMjIwLDE3ICsyMjAsMjUgQEAKICNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUKGNoYW4pICAgICAgICAgICAgICAgKCgoKGNoYW4pJjIpID09IDApPyBBX0JDTTE0ODBfRFVBUlQwIDogQV9CQ00xNDgwX0RVQVJUMSkKIAogI2RlZmluZSBCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyAgICAgICAweDEwMAotI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfQ0hBTlJFRyhjaGFuLHJlZykgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HKigoY2hhbikmMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHJlZykpCi0jZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9DSEFOUkVHKGNoYW4scmVnKSAgIChCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyooKGNoYW4pJjEpICsgKHJlZykpCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9DSEFOUkVHKGNoYW4sIHJlZykJCQkJXAorCShBX0JDTTE0ODBfRFVBUlQoY2hhbikgKwkJCQkJXAorCSBCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyAqICgoKGNoYW4pICYgMSkgKyAxKSArIChyZWcpKQorI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRyhjaGFuLCByZWcpCQkJCVwKKwkoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsJCQkJCVwKKwkgQkNNMTQ4MF9EVUFSVF9DSEFOUkVHX1NQQUNJTkcgKiAzICsgKHJlZykpCiAKLSNkZWZpbmUgUl9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgKFJfRFVBUlRfSU1SX0EgKyAoKGNoYW4pJjEpKkRVQVJUX0lNUklTUl9TUEFDSU5HKQotI2RlZmluZSBSX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoUl9EVUFSVF9JU1JfQSArICgoY2hhbikmMSkqRFVBUlRfSU1SSVNSX1NQQUNJTkcpCisjZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikJCQkJCVwKKwkoUl9EVUFSVF9JTVJfQSArICgoY2hhbikgJiAxKSAqIERVQVJUX0lNUklTUl9TUEFDSU5HKQorI2RlZmluZSBSX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCQkJCQlcCisJKFJfRFVBUlRfSVNSX0EgKyAoKGNoYW4pICYgMSkgKiBEVUFSVF9JTVJJU1JfU1BBQ0lORykKIAotI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsgUl9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKSkKLSNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikpCi0jZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTl9QT1JUKGNoYW4pICAgICAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgKyBSX0RVQVJUX0lOUF9PUlQpCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikJCQkJCVwKKwkoQV9CQ00xNDgwX0RVQVJUX0NUUkxSRUcoKGNoYW4pLCBSX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pKSkKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKQkJCQkJXAorCShBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRygoY2hhbiksIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikpKQorCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTl9QT1JUKGNoYW4pCQkJCQlcCisJKEFfQkNNMTQ4MF9EVUFSVF9DVFJMUkVHKChjaGFuKSwgUl9EVUFSVF9JTl9QT1JUKSkKIAogLyoKICAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdGhlIGFic29sdXRlIGFkZHJlc3Nlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oCmluZGV4IGRhN2MxODguLjIyMGI3ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaApAQCAtMjcyLDU5ICsyNzIsNjkgQEAKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeAkJLyogVGhpcyBNQyBvbmx5IG9uIDEyNTAgJiAxMTJ4ICovCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeCAgICAvKiBUaGlzIE1DIG9ubHkgb24gMTI1MCAmIDExMnggKi8KICNkZWZpbmUgUl9EVUFSVF9OVU1fUE9SVFMgICAgICAgICAgIDIKIAogI2RlZmluZSBBX0RVQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDYwMDAwCiAKICNkZWZpbmUgRFVBUlRfQ0hBTlJFR19TUEFDSU5HICAgICAgIDB4MTAwCi0jZGVmaW5lIEFfRFVBUlRfQ0hBTlJFRyhjaGFuLHJlZykgICAoQV9EVUFSVCArIERVQVJUX0NIQU5SRUdfU1BBQ0lORyooY2hhbikgKyAocmVnKSkKLSNkZWZpbmUgUl9EVUFSVF9DSEFOUkVHKGNoYW4scmVnKSAgIChEVUFSVF9DSEFOUkVHX1NQQUNJTkcqKGNoYW4pICsgKHJlZykpCisKKyNkZWZpbmUgQV9EVUFSVF9DSEFOUkVHKGNoYW4sIHJlZykJCQkJCVwKKwkoQV9EVUFSVCArIERVQVJUX0NIQU5SRUdfU1BBQ0lORyAqICgoY2hhbikgKyAxKSArIChyZWcpKQogI2VuZGlmCS8qIDEyNTAgJiAxMTJ4ICovCiAKLSNkZWZpbmUgUl9EVUFSVF9NT0RFX1JFR18xCSAgICAweDEwMAotI2RlZmluZSBSX0RVQVJUX01PREVfUkVHXzIJICAgIDB4MTEwCi0jZGVmaW5lIFJfRFVBUlRfU1RBVFVTICAgICAgICAgICAgICAweDEyMAotI2RlZmluZSBSX0RVQVJUX0NMS19TRUwgICAgICAgICAgICAgMHgxMzAKLSNkZWZpbmUgUl9EVUFSVF9DTUQgICAgICAgICAgICAgICAgIDB4MTUwCi0jZGVmaW5lIFJfRFVBUlRfUlhfSE9MRCAgICAgICAgICAgICAweDE2MAotI2RlZmluZSBSX0RVQVJUX1RYX0hPTEQgICAgICAgICAgICAgMHgxNzAKKyNkZWZpbmUgUl9EVUFSVF9NT0RFX1JFR18xCSAgICAweDAwMAorI2RlZmluZSBSX0RVQVJUX01PREVfUkVHXzIJICAgIDB4MDEwCisjZGVmaW5lIFJfRFVBUlRfU1RBVFVTCQkgICAgMHgwMjAKKyNkZWZpbmUgUl9EVUFSVF9DTEtfU0VMCQkgICAgMHgwMzAKKyNkZWZpbmUgUl9EVUFSVF9DTUQJCSAgICAweDA1MAorI2RlZmluZSBSX0RVQVJUX1JYX0hPTEQJCSAgICAweDA2MAorI2RlZmluZSBSX0RVQVJUX1RYX0hPTEQJCSAgICAweDA3MAogCiAjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCi0jZGVmaW5lIFJfRFVBUlRfRlVMTF9DVEwJICAgIDB4MTQwCi0jZGVmaW5lIFJfRFVBUlRfT1BDUl9YCQkgICAgMHgxODAKLSNkZWZpbmUgUl9EVUFSVF9BVVhDVExfWAkgICAgMHgxOTAKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCovCisjZGVmaW5lIFJfRFVBUlRfRlVMTF9DVEwJICAgIDB4MDQwCisjZGVmaW5lIFJfRFVBUlRfT1BDUl9YCQkgICAgMHgwODAKKyNkZWZpbmUgUl9EVUFSVF9BVVhDVExfWAkgICAgMHgwOTAKKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogCiAKIC8qCiAgKiBUaGUgSU1SIGFuZCBJU1IgY2FuJ3QgYmUgYWRkcmVzc2VkIHdpdGggQV9EVUFSVF9DSEFOUkVHLAotICogc28gdXNlIHRoaXMgbWFjcm8gaW5zdGVhZC4KKyAqIHNvIHVzZSB0aGVzZSBtYWNyb3MgaW5zdGVhZC4KICAqLwogCi0jZGVmaW5lIFJfRFVBUlRfQVVYX0NUUkwgICAgICAgICAgICAweDMxMAotI2RlZmluZSBSX0RVQVJUX0lTUl9BICAgICAgICAgICAgICAgMHgzMjAKLSNkZWZpbmUgUl9EVUFSVF9JTVJfQSAgICAgICAgICAgICAgIDB4MzMwCi0jZGVmaW5lIFJfRFVBUlRfSVNSX0IgICAgICAgICAgICAgICAweDM0MAotI2RlZmluZSBSX0RVQVJUX0lNUl9CICAgICAgICAgICAgICAgMHgzNTAKLSNkZWZpbmUgUl9EVUFSVF9PVVRfUE9SVCAgICAgICAgICAgIDB4MzYwCi0jZGVmaW5lIFJfRFVBUlRfT1BDUiAgICAgICAgICAgICAgICAweDM3MAotI2RlZmluZSBSX0RVQVJUX0lOX1BPUlQgICAgICAgICAgICAgMHgzODAKKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4ICAgIC8qIFRoaXMgTUMgb25seSBvbiAxMjUwICYgMTEyeCAqLworI2RlZmluZSBEVUFSVF9JTVJJU1JfU1BBQ0lORwkgICAgMHgyMAorI2RlZmluZSBEVUFSVF9JTkNITkdfU1BBQ0lORwkgICAgMHgxMAogCi0jZGVmaW5lIFJfRFVBUlRfU0VUX09QUgkJICAgIDB4M0IwCi0jZGVmaW5lIFJfRFVBUlRfQ0xFQVJfT1BSCSAgICAweDNDMAorI2RlZmluZSBBX0RVQVJUX0NUUkxSRUcocmVnKQkJCQkJCVwKKwkoQV9EVUFSVCArIERVQVJUX0NIQU5SRUdfU1BBQ0lORyAqIDMgKyAocmVnKSkKIAotI2RlZmluZSBEVUFSVF9JTVJJU1JfU1BBQ0lORyAgICAgICAgMHgyMAorI2RlZmluZSBSX0RVQVJUX0lNUlJFRyhjaGFuKQkJCQkJCVwKKwkoUl9EVUFSVF9JTVJfQSArIChjaGFuKSAqIERVQVJUX0lNUklTUl9TUEFDSU5HKQorI2RlZmluZSBSX0RVQVJUX0lTUlJFRyhjaGFuKQkJCQkJCVwKKwkoUl9EVUFSVF9JU1JfQSArIChjaGFuKSAqIERVQVJUX0lNUklTUl9TUEFDSU5HKQorI2RlZmluZSBSX0RVQVJUX0lOQ0hSRUcoY2hhbikJCQkJCQlcCisJKFJfRFVBUlRfSU5fQ0hOR19BICsgKGNoYW4pICogRFVBUlRfSU5DSE5HX1NQQUNJTkcpCiAKLSNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4CQkvKiBUaGlzIE1DIG9ubHkgb24gMTI1MCAmIDExMnggKi8KLSNkZWZpbmUgUl9EVUFSVF9JTVJSRUcoY2hhbikJICAgIChSX0RVQVJUX0lNUl9BICsgKGNoYW4pKkRVQVJUX0lNUklTUl9TUEFDSU5HKQotI2RlZmluZSBSX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgKFJfRFVBUlRfSVNSX0EgKyAoY2hhbikqRFVBUlRfSU1SSVNSX1NQQUNJTkcpCi0KLSNkZWZpbmUgQV9EVUFSVF9JTVJSRUcoY2hhbikJICAgIChBX0RVQVJUICsgUl9EVUFSVF9JTVJSRUcoY2hhbikpCi0jZGVmaW5lIEFfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoQV9EVUFSVCArIFJfRFVBUlRfSVNSUkVHKGNoYW4pKQorI2RlZmluZSBBX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgQV9EVUFSVF9DVFJMUkVHKFJfRFVBUlRfSU1SUkVHKGNoYW4pKQorI2RlZmluZSBBX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgQV9EVUFSVF9DVFJMUkVHKFJfRFVBUlRfSVNSUkVHKGNoYW4pKQorI2RlZmluZSBBX0RVQVJUX0lOQ0hSRUcoY2hhbikJICAgIEFfRFVBUlRfQ1RSTFJFRyhSX0RVQVJUX0lOQ0hSRUcoY2hhbikpCiAjZW5kaWYJLyogMTI1MCAmIDExMnggKi8KIAorI2RlZmluZSBSX0RVQVJUX0FVWF9DVFJMCSAgICAweDAxMAorI2RlZmluZSBSX0RVQVJUX0lTUl9BCQkgICAgMHgwMjAKKyNkZWZpbmUgUl9EVUFSVF9JTVJfQQkJICAgIDB4MDMwCisjZGVmaW5lIFJfRFVBUlRfSVNSX0IJCSAgICAweDA0MAorI2RlZmluZSBSX0RVQVJUX0lNUl9CCQkgICAgMHgwNTAKKyNkZWZpbmUgUl9EVUFSVF9PVVRfUE9SVAkgICAgMHgwNjAKKyNkZWZpbmUgUl9EVUFSVF9PUENSCQkgICAgMHgwNzAKKyNkZWZpbmUgUl9EVUFSVF9JTl9QT1JUCQkgICAgMHgwODAKIAorI2RlZmluZSBSX0RVQVJUX1NFVF9PUFIJCSAgICAweDBCMAorI2RlZmluZSBSX0RVQVJUX0NMRUFSX09QUgkgICAgMHgwQzAKKyNkZWZpbmUgUl9EVUFSVF9JTl9DSE5HX0EJICAgIDB4MEQwCisjZGVmaW5lIFJfRFVBUlRfSU5fQ0hOR19CCSAgICAweDBFMAogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaAppbmRleCBlODcwNDVlLi5jZjc0ZmVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF91YXJ0LmgKQEAgLTc1LDcgKzc1LDggQEAKICNkZWZpbmUgVl9EVUFSVF9QQVJJVFlfTU9ERV9BRERfRklYRUQgVl9EVUFSVF9QQVJJVFlfTU9ERShLX0RVQVJUX1BBUklUWV9NT0RFX0FERF9GSVhFRCkKICNkZWZpbmUgVl9EVUFSVF9QQVJJVFlfTU9ERV9OT05FICAgICAgVl9EVUFSVF9QQVJJVFlfTU9ERShLX0RVQVJUX1BBUklUWV9NT0RFX05PTkUpCiAKLSNkZWZpbmUgTV9EVUFSVF9FUlJfTU9ERSAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNSkgICAgLyogbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lIE1fRFVBUlRfVFhfSVJRX1NFTF9UWFJEWSAgICAwCisjZGVmaW5lIE1fRFVBUlRfVFhfSVJRX1NFTF9UWEVNUFQgICBfU0JfTUFLRU1BU0sxKDUpCiAKICNkZWZpbmUgTV9EVUFSVF9SWF9JUlFfU0VMX1JYUkRZICAgIDAKICNkZWZpbmUgTV9EVUFSVF9SWF9JUlFfU0VMX1JYRlVMTCAgIF9TQl9NQUtFTUFTSzEoNikKQEAgLTI0NiwxMCArMjQ3LDEzIEBACiAKICNkZWZpbmUgTV9EVUFSVF9JU1JfQlJLX0EgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMikKICNkZWZpbmUgTV9EVUFSVF9JU1JfSU5fQSAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMykKKyNkZWZpbmUgTV9EVUFSVF9JU1JfQUxMX0EJICAgIF9TQl9NQUtFTUFTSyg0LDApCisKICNkZWZpbmUgTV9EVUFSVF9JU1JfVFhfQiAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNCkKICNkZWZpbmUgTV9EVUFSVF9JU1JfUlhfQiAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNSkKICNkZWZpbmUgTV9EVUFSVF9JU1JfQlJLX0IgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNikKICNkZWZpbmUgTV9EVUFSVF9JU1JfSU5fQiAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNykKKyNkZWZpbmUgTV9EVUFSVF9JU1JfQUxMX0IJICAgIF9TQl9NQUtFTUFTSyg0LDQpCiAKIC8qCiAgKiBEVUFSVCBDaGFubmVsIEEgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAoVGFibGUgMTAtMTcpCkBAIC0yNjIsNiArMjY2LDcgQEAKICNkZWZpbmUgTV9EVUFSVF9JU1JfUlggICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMSkKICNkZWZpbmUgTV9EVUFSVF9JU1JfQlJLICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMikKICNkZWZpbmUgTV9EVUFSVF9JU1JfSU4gICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMykKKyNkZWZpbmUgTV9EVUFSVF9JU1JfQUxMCQkgICAgX1NCX01BS0VNQVNLKDQsMCkKICNkZWZpbmUgTV9EVUFSVF9JU1JfUkVTRVJWRUQgICAgICAgIF9TQl9NQUtFTUFTSyg0LDQpCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmgKaW5kZXggMTFmNDIyMi4uNWE4NWQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaApAQCAtMzEsOCArMzEsMTAgQEAKIAogdHlwZWRlZiBzMzIJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0CWNvbXBhdF9zNjQ7CiB0eXBlZGVmIHUzMgljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NAljb21wYXRfdTY0OwogCiBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHsKIAljb21wYXRfdGltZV90CQl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZmIuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNTAzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PX0NBQ0hFOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKaW5kZXggMzE3ODUxZi4uMWUxYzgyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKQEAgLTMsMjEgKzMsMjIgQEAKIAogLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwogICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQVBQRU5ECTAwMDAwMDEwCi0jZGVmaW5lIE9fQkxLU0VFSwkwMDAwMDEwMCAvKiBIUFVYIG9ubHkgKi8KLSNkZWZpbmUgT19DUkVBVAkJMDAwMDA0MDAgLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJMDAwMDIwMDAgLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAwMDA0MDAwCi0jZGVmaW5lIE9fU1lOQwkJMDAxMDAwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkwMDIwMDAwNCAvKiBIUFVYIGhhcyBzZXBhcmF0ZSBOREVMQVkgJiBOT05CTE9DSyAqLwotI2RlZmluZSBPX05PQ1RUWQkwMDQwMDAwMCAvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19EU1lOQwkJMDEwMDAwMDAgLyogSFBVWCBvbmx5ICovCi0jZGVmaW5lIE9fUlNZTkMJCTAyMDAwMDAwIC8qIEhQVVggb25seSAqLwotI2RlZmluZSBPX05PQVRJTUUJMDQwMDAwMDAKKyNkZWZpbmUgT19BUFBFTkQJMDAwMDAwMDEwCisjZGVmaW5lIE9fQkxLU0VFSwkwMDAwMDAxMDAgLyogSFBVWCBvbmx5ICovCisjZGVmaW5lIE9fQ1JFQVQJCTAwMDAwMDQwMCAvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19FWENMCQkwMDAwMDIwMDAgLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fTEFSR0VGSUxFCTAwMDAwNDAwMAorI2RlZmluZSBPX1NZTkMJCTAwMDEwMDAwMAorI2RlZmluZSBPX05PTkJMT0NLCTAwMDIwMDAwNCAvKiBIUFVYIGhhcyBzZXBhcmF0ZSBOREVMQVkgJiBOT05CTE9DSyAqLworI2RlZmluZSBPX05PQ1RUWQkwMDA0MDAwMDAgLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fRFNZTkMJCTAwMTAwMDAwMCAvKiBIUFVYIG9ubHkgKi8KKyNkZWZpbmUgT19SU1lOQwkJMDAyMDAwMDAwIC8qIEhQVVggb25seSAqLworI2RlZmluZSBPX05PQVRJTUUJMDA0MDAwMDAwCisjZGVmaW5lIE9fQ0xPRVhFQwkwMTAwMDAwMDAgLyogc2V0IGNsb3NlX29uX2V4ZWMgKi8KIAotI2RlZmluZSBPX0RJUkVDVE9SWQkwMDAxMDAwMCAvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDAwMDAyMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fSU5WSVNJQkxFCTA0MDAwMDAwIC8qIGludmlzaWJsZSBJL08sIGZvciBETUFQSS9YRFNNICovCisjZGVmaW5lIE9fRElSRUNUT1JZCTAwMDAxMDAwMCAvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCisjZGVmaW5lIE9fTk9GT0xMT1cJMDAwMDAwMjAwIC8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLworI2RlZmluZSBPX0lOVklTSUJMRQkwMDQwMDAwMDAgLyogaW52aXNpYmxlIEkvTywgZm9yIERNQVBJL1hEU00gKi8KIAogI2RlZmluZSBGX0dFVExLNjQJOAogI2RlZmluZSBGX1NFVExLNjQJOQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wZ3RhYmxlLmgKaW5kZXggYmViMmFkYi4uZTg4Y2FjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGd0YWJsZS5oCkBAIC0zMzUsMTggKzMzNSwxNCBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1leHRlcm4gaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1dSSVRFOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9Ci1leHRlcm4gaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpIAkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQogCi1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfUkVBRDsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9XUklURTsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9XUklURTsgcmV0dXJuIHB0ZTsgfQpAQCAtNDUxLDIxICs0NDcsNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmICghcHRlX2RpcnR5KCpwdGVwKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdCh4bGF0ZV9wYWJpdChfUEFHRV9ESVJUWV9CSVQpLCAmcHRlX3ZhbCgqcHRlcCkpOwotI2Vsc2UKLQlwdGVfdCBwdGUgPSAqcHRlcDsKLQlpZiAoIXB0ZV9kaXJ0eShwdGUpKQotCQlyZXR1cm4gMDsKLQlzZXRfcHRlX2F0KHZtYS0+dm1fbW0sIGFkZHIsIHB0ZXAsIHB0ZV9ta2NsZWFuKHB0ZSkpOwotCXJldHVybiAxOwotI2VuZGlmCi19Ci0KIGV4dGVybiBzcGlubG9ja190IHBhX2RiaXRfbG9jazsKIAogc3RydWN0IG1tX3N0cnVjdDsKQEAgLTUzMyw3ICs1MTQsNiBAQAogI2RlZmluZSBIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TQU1FCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlLmgKaW5kZXggNjQyYmU2Mi4uNTM1MDcwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGUuaApAQCAtMzQsNSArMzQsOSBAQAogZXh0ZXJuIHN0cnVjdCBwcGM2NF9jYWNoZXMgcHBjNjRfY2FjaGVzOwogI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gJiYgISBfX0FTU0VNQkxZX18gKi8KIAorI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKKyNkZWZpbmUgX19yZWFkX21vc3RseSBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEucmVhZF9tb3N0bHkiKSkpCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY29tcGF0LmgKaW5kZXggYWFjYWFiZC4uNjRhYjFkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oCkBAIC0zMyw4ICszMywxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAkJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJCWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCmluZGV4IDgyZDU5NWEuLjNkYzhlMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKQEAgLTExMSw3ICsxMTEsNyBAQAogLyogQ1BVIGtlcm5lbCBmZWF0dXJlcyAqLwogCiAvKiBSZXRhaW4gdGhlIDMyYiBkZWZpbml0aW9ucyBhbGwgdXNlIGJvdHRvbSBoYWxmIG9mIHdvcmQgKi8KLSNkZWZpbmUgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKKyNkZWZpbmUgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCiAjZGVmaW5lIENQVV9GVFJfTDJDUgkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDIpCiAjZGVmaW5lIENQVV9GVFJfU1BFQzc0NTAJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDQpCiAjZGVmaW5lIENQVV9GVFJfQUxUSVZFQwkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDgpCkBAIC0xMzUsNiArMTM1LDcgQEAKICNkZWZpbmUgQ1BVX0ZUUl9QUENfTEUJCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMjAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1JFQUxfTEUJCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwNDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0ZQVV9VTkFWQUlMQUJMRQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDgwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFCUFTTV9DT05TVCgweDAwMDAwMDAwMDEwMDAwMDApCiAKIC8qCiAgKiBBZGQgdGhlIDY0LWJpdCBwcm9jZXNzb3IgdW5pcXVlIGZlYXR1cmVzIGluIHRoZSB0b3AgaGFsZiBvZiB0aGUgd29yZDsKQEAgLTE1NCw3ICsxNTUsNiBAQAogI2RlZmluZSBDUFVfRlRSX01NQ1JBCQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDA0MDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NUUkwJCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMDgwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfU01UCQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDEwMDAwMDAwMDAwKQotI2RlZmluZSBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDIwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFCQlMT05HX0FTTV9DT05TVCgweDAwMDAwNDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfQ0lfTEFSR0VfUEFHRQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMTAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1BBVVNFX1pFUk8JCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDIwMDAwMDAwMDAwMCkKQEAgLTIwNiwxNjQgKzIwNiwxNDkgQEAKIAkJICAgICAhZGVmaW5lZChDT05GSUdfUE9XRVIzKSAmJiAhZGVmaW5lZChDT05GSUdfUE9XRVI0KSAmJiBcCiAJCSAgICAgIWRlZmluZWQoQ09ORklHX0JPT0tFKSkKIAotI2RlZmluZSBDUFVfRlRSU19QUEM2MDEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl82MDEgfCBDUFVfRlRSX0hQVEVfVEFCTEUpCi0jZGVmaW5lIENQVV9GVFJTXzYwMwkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU19QUEM2MDEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl82MDEgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBcCisJQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCisjZGVmaW5lIENQVV9GVFJTXzYwMwkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzYwNAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU182MDQJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfNjA0X1BFUkZfTU9OIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgXAogCSAgICBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQwX05PVEFVCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0MF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0MAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAogCSAgICBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc1MAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCiAJICAgIENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBDTAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgxCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCi0JICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKLQkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX05PX0RQTSB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBGWDIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAotCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9OT19EUE0gfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAotCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9EVUFMX1BMTF83NTBGWCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBHWAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0MDBfTk9UQVUJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwQ0wJKENQVV9GVFJTXzc1MCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUykKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgxCShDUFVfRlRSU183NTAgfCBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9OT19EUE0pCisjZGVmaW5lIENQVV9GVFJTXzc1MEZYMgkoQ1BVX0ZUUlNfNzUwIHwgQ1BVX0ZUUl9OT19EUE0pCisjZGVmaW5lIENQVV9GVFJTXzc1MEZYCShDUFVfRlRSU183NTAgfCBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgXAorCQlDUFVfRlRSX0hBU19ISUdIX0JBVFMpCisjZGVmaW5lIENQVV9GVFJTXzc1MEdYCShDUFVfRlRSU183NTBGWCkKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQwMF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDAwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0MDAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDUwXzIwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTBfMjAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDUwXzIxCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9MM19ESVNBQkxFX05BUCB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTBfMjMJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMwkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDU1XzEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NV8xCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9MM0NSIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NV8yMAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDU1XzIwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9MM19ESVNBQkxFX05BUCB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTUJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NDdfMTAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N18xMAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9OT19CVElDIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NDcJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ0NwkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NDdBCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NDdBCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ0OAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDQ4CShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfODJYWAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU184MlhYCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCKQotI2RlZmluZSBDUFVfRlRSU19HMl9MRQkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCisjZGVmaW5lIENQVV9GVFJTX0cyX0xFCShDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUykKLSNkZWZpbmUgQ1BVX0ZUUlNfRTMwMAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCisjZGVmaW5lIENQVV9GVFJTX0UzMDAJKENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX0NPTU1PTikKLSNkZWZpbmUgQ1BVX0ZUUlNfRTMwMEMyCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfRTMwMEMyCShDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX0ZQVV9VTkFWQUlMQUJMRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfQ0xBU1NJQzMyCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTX0NMQVNTSUMzMgkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFKQotI2RlZmluZSBDUFVfRlRSU184WFgJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQikKLSNkZWZpbmUgQ1BVX0ZUUlNfNDBYCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCi0JICAgIENQVV9GVFJfTk9EU0lTUkFMSUdOKQotI2RlZmluZSBDUFVfRlRSU180NFgJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKLQkgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jZGVmaW5lIENQVV9GVFJTX0UyMDAJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jZGVmaW5lIENQVV9GVFJTX0U1MDAJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKLQkgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jZGVmaW5lIENQVV9GVFJTX0U1MDBfMgkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU184WFgJKENQVV9GVFJfVVNFX1RCKQorI2RlZmluZSBDUFVfRlRSU180MFgJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCisjZGVmaW5lIENQVV9GVFJTXzQ0WAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKKyNkZWZpbmUgQ1BVX0ZUUlNfRTIwMAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTiB8IFwKKwkgICAgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCisjZGVmaW5lIENQVV9GVFJTX0U1MDAJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCisjZGVmaW5lIENQVV9GVFJTX0U1MDBfMgkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfQklHX1BIWVMgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKICNkZWZpbmUgQ1BVX0ZUUlNfR0VORVJJQ18zMgkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX05PRFNJU1JBTElHTikKIAogLyogNjQtYml0IENQVXMgKi8KLSNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVIzCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSMwkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU19SUzY0CShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1JTNjQJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NUUkwpCi0jZGVmaW5lIENQVV9GVFJTX1BPV0VSNAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QT1dFUjQJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEpCi0jZGVmaW5lIENQVV9GVFJTX1BQQzk3MAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QUEM5NzAJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9DQU5fTkFQIHwgQ1BVX0ZUUl9NTUNSQSkKLSNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI1CShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSNQkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCiAJICAgIENQVV9GVFJfUFVSUikKLSNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI2IChDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSNiAoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCiAJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfU1BVUlIgfCBDUFVfRlRSX1JFQUxfTEUgfCBcCiAJICAgIENQVV9GVFJfRFNDUikKLSNkZWZpbmUgQ1BVX0ZUUlNfQ0VMTAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19DRUxMCShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKIAkgICAgQ1BVX0ZUUl9QQVVTRV9aRVJPIHwgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFIHwgQ1BVX0ZUUl9DRUxMX1RCX0JVRykKLSNkZWZpbmUgQ1BVX0ZUUlNfUEE2VCAoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QQTZUIChDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9SRUFMX0xFKQotI2RlZmluZSBDUFVfRlRSU19DT01QQVRJQkxFCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX0NPTVBBVElCTEUJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIpCiAKICNpZmRlZiBfX3Bvd2VycGM2NF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2ZiLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExYWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmIuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGh5c19tZW1fYWNjZXNzX3Byb3QoZmlsZSwgb2ZmID4+IFBBR0VfU0hJRlQsCisJCQkJCQkgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJCQkJIHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaAppbmRleCBhZmE3MDBkLi4zNDE0NmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgZmRfZnJlZV9pcnEoKSAgICAgICAgICAgZnJlZV9pcnEoRkxPUFBZX0lSUSwgTlVMTCk7CiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgkvKiBmb3IgcHBjNjRfaXNhYnJpZGdlX2RldiAqLworI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CS8qIGZvciBpc2FfYnJpZGdlX3BjaWRldiAqLwogCiAjZGVmaW5lIGZkX2RtYV9zZXR1cChhZGRyLHNpemUsbW9kZSxpbykgZmRfb3BzLT5fZG1hX3NldHVwKGFkZHIsc2l6ZSxtb2RlLGlvKQogCkBAIC0xMzksMTIgKzEzOSwxMiBAQAogCWlmIChidXNfYWRkciAKIAkgICAgJiYgKGFkZHIgIT0gcHJldl9hZGRyIHx8IHNpemUgIT0gcHJldl9zaXplIHx8IGRpciAhPSBwcmV2X2RpcikpIHsKIAkJLyogZGlmZmVyZW50IGZyb20gbGFzdCB0aW1lIC0tIHVubWFwIHByZXYgKi8KLQkJcGNpX3VubWFwX3NpbmdsZShwcGM2NF9pc2FicmlkZ2VfZGV2LCBidXNfYWRkciwgcHJldl9zaXplLCBwcmV2X2Rpcik7CisJCXBjaV91bm1hcF9zaW5nbGUoaXNhX2JyaWRnZV9wY2lkZXYsIGJ1c19hZGRyLCBwcmV2X3NpemUsIHByZXZfZGlyKTsKIAkJYnVzX2FkZHIgPSAwOwogCX0KIAogCWlmICghYnVzX2FkZHIpCS8qIG5lZWQgdG8gbWFwIGl0ICovCi0JCWJ1c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHBjNjRfaXNhYnJpZGdlX2RldiwgYWRkciwgc2l6ZSwgZGlyKTsKKwkJYnVzX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShpc2FfYnJpZGdlX3BjaWRldiwgYWRkciwgc2l6ZSwgZGlyKTsKIAogCS8qIHJlbWVtYmVyIHRoaXMgb25lIGFzIHByZXYgKi8KIAlwcmV2X2FkZHIgPSBhZGRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKaW5kZXggNjJlZmQ5ZC4uYmY2Y2Q3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCkBAIC0yMDYsNiArMjA2LDcgQEAKICNkZWZpbmUgSF9GUkVFX0xPR0lDQUxfTEFOX0JVRkZFUiAweDFENAogI2RlZmluZSBIX1FVRVJZX0lOVF9TVEFURSAgICAgICAweDFFNAogI2RlZmluZSBIX1BPTExfUEVORElORwkJMHgxRDgKKyNkZWZpbmUgSF9JTExBTl9BVFRSSUJVVEVTCTB4MjQ0CiAjZGVmaW5lIEhfSk9JTgkJCTB4Mjk4CiAjZGVmaW5lIEhfVkFTSV9TVEFURSAgICAgICAgICAgIDB4MkE0CiAjZGVmaW5lIEhfRU5BQkxFX0NSUQkJMHgyQjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaAppbmRleCAzNTBjOWJkLi5iYjhkOTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCkBAIC02MDcsOSArNjA3LDkgQEAKICAqCiAgKiAqIGlvdW5tYXAgdW5kb2VzIHN1Y2ggYSBtYXBwaW5nIGFuZCBjYW4gYmUgaG9va2VkCiAgKgotICogKiBfX2lvcmVtYXBfZXhwbGljaXQgKGFuZCB0aGUgcGVuZGluZyBfX2lvdW5tYXBfZXhwbGljaXQpIGFyZSBsb3cgbGV2ZWwKLSAqICAgZnVuY3Rpb25zIHRvIGNyZWF0ZSBoYW5kLW1hZGUgbWFwcGluZ3MgZm9yIHVzZSBvbmx5IGJ5IHRoZSBQQ0kgY29kZQotICogICBhbmQgY2Fubm90IGN1cnJlbnRseSBiZSBob29rZWQuCisgKiAqIF9faW9yZW1hcF9hdCAoYW5kIHRoZSBwZW5kaW5nIF9faW91bm1hcF9hdCkgYXJlIGxvdyBsZXZlbCBmdW5jdGlvbnMgdG8KKyAqICAgY3JlYXRlIGhhbmQtbWFkZSBtYXBwaW5ncyBmb3IgdXNlIG9ubHkgYnkgdGhlIFBDSSBjb2RlIGFuZCBjYW5ub3QKKyAqICAgY3VycmVudGx5IGJlIGhvb2tlZC4gTXVzdCBiZSBwYWdlIGFsaWduZWQuCiAgKgogICogKiBfX2lvcmVtYXAgaXMgdGhlIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IGlvcmVtYXAgYW5kCiAgKiAgIGlvcmVtYXBfZmxhZ3MgYW5kIGNhbm5vdCBiZSBob29rZWQgKGJ1dCBjYW4gYmUgdXNlZCBieSBhIGhvb2sgb24gb25lCkBAIC02MjksMTkgKzYyOSw5IEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CiBleHRlcm4gdm9pZCBfX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKIAotZXh0ZXJuIGludCBfX2lvcmVtYXBfZXhwbGljaXQocGh5c19hZGRyX3QgcF9hZGRyLCB1bnNpZ25lZCBsb25nIHZfYWRkciwKLQkJICAgICAJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBpbnQgX19pb3VubWFwX2V4cGxpY2l0KHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOwotCi1leHRlcm4gdm9pZCBfX2lvbWVtICogcmVzZXJ2ZV9waGJfaW9zcGFjZSh1bnNpZ25lZCBsb25nIHNpemUpOwotCi0vKiBUaG9zZSBhcmUgbW9yZSAzMiBiaXRzIG9ubHkgZnVuY3Rpb25zICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpb3BhKHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBtbV9wdG92KHVuc2lnbmVkIGxvbmcgYWRkcikgX19hdHRyaWJ1dGVfY29uc3RfXzsKLWV4dGVybiB2b2lkIGlvX2Jsb2NrX21hcHBpbmcodW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKTsKLQorZXh0ZXJuIHZvaWQgX19pb21lbSAqIF9faW9yZW1hcF9hdChwaHlzX2FkZHJfdCBwYSwgdm9pZCAqZWEsCisJCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIF9faW91bm1hcF9hdCh2b2lkICplYSwgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogLyoKICAqIFdoZW4gQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBzZXQsIHdlIHVzZSB0aGUgZ2VuZXJpYyBpb21hcCBpbXBsZW1lbnRhdGlvbgpAQCAtNjUxLDggKzY0MSw4IEBACiAgKi8KICNkZWZpbmUgSEFWRV9BUkNIX1BJT19TSVpFCQkxCiAjZGVmaW5lIFBJT19PRkZTRVQJCQkweDAwMDAwMDAwVUwKLSNkZWZpbmUgUElPX01BU0sJCQkweDNmZmZmZmZmVUwKLSNkZWZpbmUgUElPX1JFU0VSVkVECQkJMHg0MDAwMDAwMFVMCisjZGVmaW5lIFBJT19NQVNLCQkJKEZVTExfSU9fU0laRSAtIDEpCisjZGVmaW5lIFBJT19SRVNFUlZFRAkJCShGVUxMX0lPX1NJWkUpCiAKICNkZWZpbmUgbW1pb19yZWFkMTZiZShhZGRyKQkJcmVhZHdfYmUoYWRkcikKICNkZWZpbmUgbW1pb19yZWFkMzJiZShhZGRyKQkJcmVhZGxfYmUoYWRkcikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oCmluZGV4IDA1ZGQ1YTMuLjA0ODVjNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaApAQCAtMjIzLDYgKzIyMywxNSBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfZmluZF9tYXBwaW5nKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCwKIAkJCQkgICAgIGlycV9od19udW1iZXJfdCBod2lycSk7CiAKKy8qKgorICogaXJxX2NyZWF0ZV9kaXJlY3RfbWFwcGluZyAtIEFsbG9jYXRlIGEgdmlycSBmb3IgZGlyZWN0IG1hcHBpbmcKKyAqIEBob3N0OiBob3N0IHRvIGFsbG9jYXRlIHRoZSB2aXJxIGZvciBvciBOVUxMIGZvciBkZWZhdWx0IGhvc3QKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgaXJxIGNvbnRyb2xsZXJzIHdoaWNoIGNhbiBjaG9vc2UgdGhlIGhhcmR3YXJlCisgKiBpbnRlcnJ1cHQgbnVtYmVycyB0aGV5IGdlbmVyYXRlLiBJbiBzdWNoIGEgY2FzZSBpdCdzIHNpbXBsZXN0IHRvIHVzZQorICogdGhlIGxpbnV4IHZpcnEgYXMgdGhlIGhhcmR3YXJlIGludGVycnVwdCBudW1iZXIuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9kaXJlY3RfbWFwcGluZyhzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QpOwogCiAvKioKICAqIGlycV9yYWRpeF9yZXZtYXAgLSBGaW5kIGEgbGludXggdmlycSBmcm9tIGEgaHcgaXJxIG51bWJlci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKaW5kZXggYjBlNDBmZi4uOTUzN2ZkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKQEAgLTY1LDEwICs2NSwxMCBAQAogCQl9IGVsc2UgaWYgKG5hbWVbMF0gIT0gJy4nKQkJCQlcCiAJCQlhZGRyID0gKihrcHJvYmVfb3Bjb2RlX3QgKiopYWRkcjsJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCWNoYXIgZG90X25hbWVbS1NZTV9OQU1FX0xFTisxXTsJCQkJXAorCQljaGFyIGRvdF9uYW1lW0tTWU1fTkFNRV9MRU5dOwkJCQlcCiAJCWRvdF9uYW1lWzBdID0gJy4nOwkJCQkJXAogCQlkb3RfbmFtZVsxXSA9ICdcMCc7CQkJCQlcCi0JCXN0cm5jYXQoZG90X25hbWUsIG5hbWUsIEtTWU1fTkFNRV9MRU4pOwkJCVwKKwkJc3RybmNhdChkb3RfbmFtZSwgbmFtZSwgS1NZTV9OQU1FX0xFTiAtIDIpOwkJXAogCQlhZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKWthbGxzeW1zX2xvb2t1cF9uYW1lKGRvdF9uYW1lKTsgXAogCX0JCQkJCQkJCVwKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oCmluZGV4IDgyMWVhMGMuLjU2N2VkOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaApAQCAtOTgsNyArOTgsNyBAQAogCXU2NAlzYXZlZF9ncHI1OwkJLy8gU2F2ZWQgR1BSNSAgICAgICAgICAgICAgICAgICB4MzAteDM3CiAKIAl1OAlyZXNlcnZlZDQ7CQkvLyBSZXNlcnZlZAkJCXgzOC14MzgKLQl1OAljcHVjdGxzX3Rhc2tfYXR0cnM7CS8vIFRhc2sgYXR0cmlidXRlcyBmb3IgY3B1Y3RscyAgeDM5LXgzOQorCXU4CWRvbmF0ZV9kZWRpY2F0ZWRfY3B1OwkvLyBEb25hdGUgZGVkaWNhdGVkIENQVSBjeWNsZXMgIHgzOS14MzkKIAl1OAlmcHJlZ3NfaW5fdXNlOwkJLy8gRlAgcmVncyBpbiB1c2UgICAgICAgICAgICAgICB4M0EteDNBCiAJdTgJcG1jcmVnc19pbl91c2U7CQkvLyBQTUMgcmVncyBpbiB1c2UgICAgICAgICAgICAgIHgzQi14M0IKIAl2b2xhdGlsZSB1MzIgc2F2ZWRfZGVjcjsJLy8gU2F2ZWQgRGVjciBWYWx1ZSAgICAgICAgICAgICB4M0MteDNGCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2x2MWNhbGwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oCmluZGV4IGY3MzNiZWUuLjgxNzEzYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oCkBAIC0yMzgsNiArMjM4LDcgQEAKIExWMV9DQUxMKGNvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwLCAgICAgICAgICAgICAgICAgICAgMywgMCwgIDExICkKIExWMV9DQUxMKGNvbm5lY3RfaXJxX3BsdWdfZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgIDEyICkKIExWMV9DQUxMKHJlbGVhc2VfbWVtb3J5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgIDEzICkKK0xWMV9DQUxMKHB1dF9pb3B0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgIDE1ICkKIExWMV9DQUxMKGRpc2Nvbm5lY3RfaXJxX3BsdWdfZXh0LCAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgIDE3ICkKIExWMV9DQUxMKGNvbnN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQsICAgICAgICAgICAgICAgICAgMCwgMSwgIDE4ICkKIExWMV9DQUxMKGRlc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCwgICAgICAgICAgICAgICAgICAgMSwgMCwgIDE5ICkKQEAgLTI2OCw2ICsyNjksOCBAQAogTFYxX0NBTEwocmVhZF9odGFiX2VudHJpZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA1LCAgOTUgKQogTFYxX0NBTEwoc2V0X2RhYnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAwLCAgOTYgKQogTFYxX0NBTEwoZ2V0X3RvdGFsX2V4ZWN1dGlvbl90aW1lLCAgICAgICAgICAgICAgICAgICAgICAyLCAxLCAxMDMgKQorTFYxX0NBTEwoYWxsb2NhdGVfaW9fc2VnbWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAxLCAxMTYgKQorTFYxX0NBTEwocmVsZWFzZV9pb19zZWdtZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAwLCAxMTcgKQogTFYxX0NBTEwoY29uc3RydWN0X2lvX2lycV9vdXRsZXQsICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxMjAgKQogTFYxX0NBTEwoZGVzdHJ1Y3RfaW9faXJxX291dGxldCwgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAxMjEgKQogTFYxX0NBTEwobWFwX2h0YWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxMjIgKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNoZGVwLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaAppbmRleCA2Y2YxYTgzLi43MWM2ZTdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaApAQCAtMjE4LDcgKzIxOCw3IEBACiAJaW50ICAoKnBjaWJpb3NfZW5hYmxlX2RldmljZV9ob29rKShzdHJ1Y3QgcGNpX2RldiAqLCBpbnQgaW5pdGlhbCk7CiAKIAkvKiBDYWxsZWQgaW4gaW5kaXJlY3RfKiB0byBhdm9pZCB0b3VjaGluZyBkZXZpY2VzICovCi0JaW50ICgqcGNpX2V4Y2x1ZGVfZGV2aWNlKSh1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKKwlpbnQgKCpwY2lfZXhjbHVkZV9kZXZpY2UpKHN0cnVjdCBwY2lfY29udHJvbGxlciAqLCB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKIAogCS8qIENhbGxlZCBhdCB0aGVuIHZlcnkgZW5kIG9mIHBjaWJpb3NfaW5pdCgpICovCiAJdm9pZCAoKnBjaWJpb3NfYWZ0ZXJfaW5pdCkodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS04eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LTh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmJkODgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS04eHguaApAQCAtMCwwICsxLDE0NyBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTU1VXzhYWF9IXworI2RlZmluZSBfQVNNX1BPV0VSUENfTU1VXzhYWF9IXworLyoKKyAqIFBQQzh4eCBzdXBwb3J0CisgKi8KKworLyogQ29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzIGZvciB0aGUgTVBDOHh4LgorICogQSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlc2UgcmVnaXN0ZXJzIGNhdXNlcyBzZXJpYWxpemVkIGFjY2Vzcy4KKyAqIER1cmluZyBzb2Z0d2FyZSB0YWJsZXdhbGssIHRoZSByZWdpc3RlcnMgdXNlZCBwZXJmb3JtIG1hc2svc2hpZnQtYWRkCisgKiBvcGVyYXRpb25zIHdoZW4gd3JpdHRlbi9yZWFkLiAgQSBUTEIgZW50cnkgaXMgY3JlYXRlZCB3aGVuIHRoZSBNeF9SUE4KKyAqIGlzIHdyaXR0ZW4sIGFuZCB0aGUgY29udGVudHMgb2Ygc2V2ZXJhbCByZWdpc3RlcnMgYXJlIHVzZWQgdG8KKyAqIGNyZWF0ZSB0aGUgZW50cnkuCisgKi8KKyNkZWZpbmUgU1BSTl9NSV9DVFIJNzg0CS8qIEluc3RydWN0aW9uIFRMQiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JX0dQTQkJMHg4MDAwMDAwMAkvKiBTZXQgZG9tYWluIG1hbmFnZXIgbW9kZSAqLworI2RlZmluZSBNSV9QUE0JCTB4NDAwMDAwMDAJLyogU2V0IHN1YnBhZ2UgcHJvdGVjdGlvbiAqLworI2RlZmluZSBNSV9DSURFRgkweDIwMDAwMDAwCS8qIFNldCBjYWNoZSBpbmhpYml0IHdoZW4gTU1VIGRpcyAqLworI2RlZmluZSBNSV9SU1Y0SQkweDA4MDAwMDAwCS8qIFJlc2VydmUgNCBUTEIgZW50cmllcyAqLworI2RlZmluZSBNSV9QUENTCQkweDAyMDAwMDAwCS8qIFVzZSBNSV9SUE4gcHJvYi9wcml2IHN0YXRlICovCisjZGVmaW5lIE1JX0lEWE1BU0sJMHgwMDAwMWYwMAkvKiBUTEIgaW5kZXggdG8gYmUgbG9hZGVkICovCisjZGVmaW5lIE1JX1JFU0VUVkFMCTB4MDAwMDAwMDAJLyogVmFsdWUgb2YgcmVnaXN0ZXIgYXQgcmVzZXQgKi8KKworLyogVGhlc2UgYXJlIHRoZSBLcyBhbmQgS3AgZnJvbSB0aGUgUG93ZXJQQyBib29rcy4gIEZvciBwcm9wZXIgb3BlcmF0aW9uLAorICogS3MgPSAwLCBLcCA9IDEuCisgKi8KKyNkZWZpbmUgU1BSTl9NSV9BUAk3ODYKKyNkZWZpbmUgTUlfS3MJCTB4ODAwMDAwMDAJLyogU2hvdWxkIG5vdCBiZSBzZXQgKi8KKyNkZWZpbmUgTUlfS3AJCTB4NDAwMDAwMDAJLyogU2hvdWxkIGFsd2F5cyBiZSBzZXQgKi8KKworLyogVGhlIGVmZmVjdGl2ZSBwYWdlIG51bWJlciByZWdpc3Rlci4gIFdoZW4gcmVhZCwgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBUTEIgbWlzcy4gIFdoZW4gTUlfUlBOIGlzIHdyaXR0ZW4sIGJpdHMgaW4KKyAqIHRoaXMgcmVnaXN0ZXIgYXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBUTEIgZW50cnkuCisgKi8KKyNkZWZpbmUgU1BSTl9NSV9FUE4JNzg3CisjZGVmaW5lIE1JX0VQTk1BU0sJMHhmZmZmZjAwMAkvKiBFZmZlY3RpdmUgcGFnZSBudW1iZXIgZm9yIGVudHJ5ICovCisjZGVmaW5lIE1JX0VWQUxJRAkweDAwMDAwMjAwCS8qIEVudHJ5IGlzIHZhbGlkICovCisjZGVmaW5lIE1JX0FTSURNQVNLCTB4MDAwMDAwMGYJLyogQVNJRCBtYXRjaCB2YWx1ZSAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworLyogQSAibGV2ZWwgMSIgb3IgInNlZ21lbnQiIG9yIHdoYXRldmVyIHlvdSB3YW50IHRvIGNhbGwgaXQgcmVnaXN0ZXIuCisgKiBGb3IgdGhlIGluc3RydWN0aW9uIFRMQiwgaXQgY29udGFpbnMgYml0cyB0aGF0IGdldCBsb2FkZWQgaW50byB0aGUKKyAqIFRMQiBlbnRyeSB3aGVuIHRoZSBNSV9SUE4gaXMgd3JpdHRlbi4KKyAqLworI2RlZmluZSBTUFJOX01JX1RXQwk3ODkKKyNkZWZpbmUgTUlfQVBHCQkweDAwMDAwMWUwCS8qIEFjY2VzcyBwcm90ZWN0aW9uIGdyb3VwICgwKSAqLworI2RlZmluZSBNSV9HVUFSREVECTB4MDAwMDAwMTAJLyogR3VhcmRlZCBzdG9yYWdlICovCisjZGVmaW5lIE1JX1BTTUFTSwkweDAwMDAwMDBjCS8qIE1hc2sgb2YgcGFnZSBzaXplIGJpdHMgKi8KKyNkZWZpbmUgTUlfUFM4TUVHCTB4MDAwMDAwMGMJLyogOE0gcGFnZSBzaXplICovCisjZGVmaW5lIE1JX1BTNTEySwkweDAwMDAwMDA0CS8qIDUxMksgcGFnZSBzaXplICovCisjZGVmaW5lIE1JX1BTNEtfMTZLCTB4MDAwMDAwMDAJLyogNEsgb3IgMTZLIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNSV9TVkFMSUQJMHgwMDAwMDAwMQkvKiBTZWdtZW50IGVudHJ5IGlzIHZhbGlkICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisvKiBSZWFsIHBhZ2UgbnVtYmVyLiAgRGVmaW5lZCBieSB0aGUgcHRlLiAgV3JpdGluZyB0aGlzIHJlZ2lzdGVyCisgKiBjYXVzZXMgYSBUTEIgZW50cnkgdG8gYmUgY3JlYXRlZCBmb3IgdGhlIGluc3RydWN0aW9uIFRMQiwgdXNpbmcKKyAqIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZnJvbSB0aGUgTUlfRVBOLCBhbmQgTUlfVFdDIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBTUFJOX01JX1JQTgk3OTAKKworLyogRGVmaW5lIGFuIFJQTiB2YWx1ZSBmb3IgbWFwcGluZyBrZXJuZWwgbWVtb3J5IHRvIGxhcmdlIHZpcnR1YWwKKyAqIHBhZ2VzIGZvciBib290IGluaXRpYWxpemF0aW9uLiAgVGhpcyBoYXMgcmVhbCBwYWdlIG51bWJlciBvZiAwLAorICogbGFyZ2UgcGFnZSBzaXplLCBzaGFyZWQgcGFnZSwgY2FjaGUgZW5hYmxlZCwgYW5kIHZhbGlkLgorICogQWxzbyBtYXJrIGFsbCBzdWJwYWdlcyB2YWxpZCBhbmQgd3JpdGUgYWNjZXNzLgorICovCisjZGVmaW5lIE1JX0JPT1RJTklUCTB4MDAwMDAxZmQKKworI2RlZmluZSBTUFJOX01EX0NUUgk3OTIJLyogRGF0YSBUTEIgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNRF9HUE0JCTB4ODAwMDAwMDAJLyogU2V0IGRvbWFpbiBtYW5hZ2VyIG1vZGUgKi8KKyNkZWZpbmUgTURfUFBNCQkweDQwMDAwMDAwCS8qIFNldCBzdWJwYWdlIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgTURfQ0lERUYJMHgyMDAwMDAwMAkvKiBTZXQgY2FjaGUgaW5oaWJpdCB3aGVuIE1NVSBkaXMgKi8KKyNkZWZpbmUgTURfV1RERUYJMHgxMDAwMDAwMAkvKiBTZXQgd3JpdGV0aHJvdWdoIHdoZW4gTU1VIGRpcyAqLworI2RlZmluZSBNRF9SU1Y0SQkweDA4MDAwMDAwCS8qIFJlc2VydmUgNCBUTEIgZW50cmllcyAqLworI2RlZmluZSBNRF9UV0FNCQkweDA0MDAwMDAwCS8qIFVzZSA0SyBwYWdlIGhhcmR3YXJlIGFzc2lzdCAqLworI2RlZmluZSBNRF9QUENTCQkweDAyMDAwMDAwCS8qIFVzZSBNSV9SUE4gcHJvYi9wcml2IHN0YXRlICovCisjZGVmaW5lIE1EX0lEWE1BU0sJMHgwMDAwMWYwMAkvKiBUTEIgaW5kZXggdG8gYmUgbG9hZGVkICovCisjZGVmaW5lIE1EX1JFU0VUVkFMCTB4MDQwMDAwMDAJLyogVmFsdWUgb2YgcmVnaXN0ZXIgYXQgcmVzZXQgKi8KKworI2RlZmluZSBTUFJOX01fQ0FTSUQJNzkzCS8qIEFkZHJlc3Mgc3BhY2UgSUQgKGNvbnRleHQpIHRvIG1hdGNoICovCisjZGVmaW5lIE1DX0FTSURNQVNLCTB4MDAwMDAwMGYJLyogQml0cyB1c2VkIGZvciBBU0lEIHZhbHVlICovCisKKworLyogVGhlc2UgYXJlIHRoZSBLcyBhbmQgS3AgZnJvbSB0aGUgUG93ZXJQQyBib29rcy4gIEZvciBwcm9wZXIgb3BlcmF0aW9uLAorICogS3MgPSAwLCBLcCA9IDEuCisgKi8KKyNkZWZpbmUgU1BSTl9NRF9BUAk3OTQKKyNkZWZpbmUgTURfS3MJCTB4ODAwMDAwMDAJLyogU2hvdWxkIG5vdCBiZSBzZXQgKi8KKyNkZWZpbmUgTURfS3AJCTB4NDAwMDAwMDAJLyogU2hvdWxkIGFsd2F5cyBiZSBzZXQgKi8KKworLyogVGhlIGVmZmVjdGl2ZSBwYWdlIG51bWJlciByZWdpc3Rlci4gIFdoZW4gcmVhZCwgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBUTEIgbWlzcy4gIFdoZW4gTURfUlBOIGlzIHdyaXR0ZW4sIGJpdHMgaW4KKyAqIHRoaXMgcmVnaXN0ZXIgYXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBUTEIgZW50cnkuCisgKi8KKyNkZWZpbmUgU1BSTl9NRF9FUE4JNzk1CisjZGVmaW5lIE1EX0VQTk1BU0sJMHhmZmZmZjAwMAkvKiBFZmZlY3RpdmUgcGFnZSBudW1iZXIgZm9yIGVudHJ5ICovCisjZGVmaW5lIE1EX0VWQUxJRAkweDAwMDAwMjAwCS8qIEVudHJ5IGlzIHZhbGlkICovCisjZGVmaW5lIE1EX0FTSURNQVNLCTB4MDAwMDAwMGYJLyogQVNJRCBtYXRjaCB2YWx1ZSAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworLyogVGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbGV2ZWwgcGFnZSB0YWJsZS4KKyAqIER1cmluZyBhIHNvZnR3YXJlIHRhYmxld2FsaywgcmVhZGluZyB0aGlzIHJlZ2lzdGVyIHByb3ZpZGVzIHRoZSBhZGRyZXNzCisgKiBvZiB0aGUgZW50cnkgYXNzb2NpYXRlZCB3aXRoIE1EX0VQTi4KKyAqLworI2RlZmluZSBTUFJOX01fVFdCCTc5NgorI2RlZmluZQlNX0wxVEIJCTB4ZmZmZmYwMDAJLyogTGV2ZWwgMSB0YWJsZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTV9MMUlORFgJMHgwMDAwMGZmYwkvKiBMZXZlbCAxIGluZGV4LCB3aGVuIHJlYWQgKi8KKwkJCQkJLyogUmVzZXQgdmFsdWUgaXMgdW5kZWZpbmVkICovCisKKy8qIEEgImxldmVsIDEiIG9yICJzZWdtZW50IiBvciB3aGF0ZXZlciB5b3Ugd2FudCB0byBjYWxsIGl0IHJlZ2lzdGVyLgorICogRm9yIHRoZSBkYXRhIFRMQiwgaXQgY29udGFpbnMgYml0cyB0aGF0IGdldCBsb2FkZWQgaW50byB0aGUgVExCIGVudHJ5CisgKiB3aGVuIHRoZSBNRF9SUE4gaXMgd3JpdHRlbi4gIEl0IGlzIGFsc28gcHJvdmlkZXMgdGhlIGhhcmR3YXJlIGFzc2lzdAorICogZm9yIGZpbmRpbmcgdGhlIFBURSBhZGRyZXNzIGR1cmluZyBzb2Z0d2FyZSB0YWJsZXdhbGsuCisgKi8KKyNkZWZpbmUgU1BSTl9NRF9UV0MJNzk3CisjZGVmaW5lIE1EX0wyVEIJCTB4ZmZmZmYwMDAJLyogTGV2ZWwgMiB0YWJsZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTURfTDJJTkRYCTB4ZmZmZmZlMDAJLyogTGV2ZWwgMiBpbmRleCAoKnB0ZSksIHdoZW4gcmVhZCAqLworI2RlZmluZSBNRF9BUEcJCTB4MDAwMDAxZTAJLyogQWNjZXNzIHByb3RlY3Rpb24gZ3JvdXAgKDApICovCisjZGVmaW5lIE1EX0dVQVJERUQJMHgwMDAwMDAxMAkvKiBHdWFyZGVkIHN0b3JhZ2UgKi8KKyNkZWZpbmUgTURfUFNNQVNLCTB4MDAwMDAwMGMJLyogTWFzayBvZiBwYWdlIHNpemUgYml0cyAqLworI2RlZmluZSBNRF9QUzhNRUcJMHgwMDAwMDAwYwkvKiA4TSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTURfUFM1MTJLCTB4MDAwMDAwMDQJLyogNTEySyBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTURfUFM0S18xNksJMHgwMDAwMDAwMAkvKiA0SyBvciAxNksgcGFnZSBzaXplICovCisjZGVmaW5lIE1EX1dUCQkweDAwMDAwMDAyCS8qIFVzZSB3cml0ZXRocm91Z2ggcGFnZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTURfU1ZBTElECTB4MDAwMDAwMDEJLyogU2VnbWVudCBlbnRyeSBpcyB2YWxpZCAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworCisvKiBSZWFsIHBhZ2UgbnVtYmVyLiAgRGVmaW5lZCBieSB0aGUgcHRlLiAgV3JpdGluZyB0aGlzIHJlZ2lzdGVyCisgKiBjYXVzZXMgYSBUTEIgZW50cnkgdG8gYmUgY3JlYXRlZCBmb3IgdGhlIGRhdGEgVExCLCB1c2luZworICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBNRF9FUE4sIGFuZCBNRF9UV0MgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFNQUk5fTURfUlBOCTc5OAorCisvKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgcmVnaXN0ZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHNhdmUKKyAqIGEgcHJvY2Vzc29yIHdvcmtpbmcgcmVnaXN0ZXIgZHVyaW5nIGEgdGFibGV3YWxrLgorICovCisjZGVmaW5lIFNQUk5fTV9UVwk3OTkKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaWQ7CisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7Cit9IG1tX2NvbnRleHRfdDsKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfTU1VXzhYWF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtZnNsLWJvb2tlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1mc2wtYm9va2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU4MDAwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtZnNsLWJvb2tlLmgKQEAgLTAsMCArMSw4OCBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTU1VX0ZTTF9CT09LRV9IXworI2RlZmluZSBfQVNNX1BPV0VSUENfTU1VX0ZTTF9CT09LRV9IXworLyoKKyAqIEZyZWVzY2FsZSBCb29rLUUgTU1VIHN1cHBvcnQKKyAqLworCisvKiBCb29rLUUgZGVmaW5lZCBwYWdlIHNpemVzICovCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xSwkJMAorI2RlZmluZSBCT09LRV9QQUdFU1pfNEsJCTEKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzE2SwkyCisjZGVmaW5lIEJPT0tFX1BBR0VTWl82NEsJMworI2RlZmluZSBCT09LRV9QQUdFU1pfMjU2Swk0CisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xTQkJNQorI2RlZmluZSBCT09LRV9QQUdFU1pfNE0JCTYKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzE2TQk3CisjZGVmaW5lIEJPT0tFX1BBR0VTWl82NE0JOAorI2RlZmluZSBCT09LRV9QQUdFU1pfMjU2TQk5CisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xR0IJMTAKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzRHQgkxMQorI2RlZmluZSBCT09LRV9QQUdFU1pfMTZHQgkxMgorI2RlZmluZSBCT09LRV9QQUdFU1pfNjRHQgkxMworI2RlZmluZSBCT09LRV9QQUdFU1pfMjU2R0IJMTQKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzFUQgkxNQorCisjZGVmaW5lIE1BUzBfVExCU0VMKHgpCSgoeCA8PCAyOCkgJiAweDMwMDAwMDAwKQorI2RlZmluZSBNQVMwX0VTRUwoeCkJKCh4IDw8IDE2KSAmIDB4MEZGRjAwMDApCisjZGVmaW5lIE1BUzBfTlYoeCkJKCh4KSAmIDB4MDAwMDBGRkYpCisKKyNkZWZpbmUgTUFTMV9WQUxJRCAJMHg4MDAwMDAwMAorI2RlZmluZSBNQVMxX0lQUk9UCTB4NDAwMDAwMDAKKyNkZWZpbmUgTUFTMV9USUQoeCkJKCh4IDw8IDE2KSAmIDB4M0ZGRjAwMDApCisjZGVmaW5lIE1BUzFfVFMJCTB4MDAwMDEwMDAKKyNkZWZpbmUgTUFTMV9UU0laRSh4KQkoKHggPDwgOCkgJiAweDAwMDAwRjAwKQorCisjZGVmaW5lIE1BUzJfRVBOCTB4RkZGRkYwMDAKKyNkZWZpbmUgTUFTMl9YMAkJMHgwMDAwMDA0MAorI2RlZmluZSBNQVMyX1gxCQkweDAwMDAwMDIwCisjZGVmaW5lIE1BUzJfVwkJMHgwMDAwMDAxMAorI2RlZmluZSBNQVMyX0kJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFTMl9NCQkweDAwMDAwMDA0CisjZGVmaW5lIE1BUzJfRwkJMHgwMDAwMDAwMgorI2RlZmluZSBNQVMyX0UJCTB4MDAwMDAwMDEKKworI2RlZmluZSBNQVMzX1JQTgkweEZGRkZGMDAwCisjZGVmaW5lIE1BUzNfVTAJCTB4MDAwMDAyMDAKKyNkZWZpbmUgTUFTM19VMQkJMHgwMDAwMDEwMAorI2RlZmluZSBNQVMzX1UyCQkweDAwMDAwMDgwCisjZGVmaW5lIE1BUzNfVTMJCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUFTM19VWAkJMHgwMDAwMDAyMAorI2RlZmluZSBNQVMzX1NYCQkweDAwMDAwMDEwCisjZGVmaW5lIE1BUzNfVVcJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFTM19TVwkJMHgwMDAwMDAwNAorI2RlZmluZSBNQVMzX1VSCQkweDAwMDAwMDAyCisjZGVmaW5lIE1BUzNfU1IJCTB4MDAwMDAwMDEKKworI2RlZmluZSBNQVM0X1RMQlNFTEQoeCkgTUFTMF9UTEJTRUwoeCkKKyNkZWZpbmUgTUFTNF9USUREU0VMCTB4MDAwRjAwMDAKKyNkZWZpbmUgTUFTNF9UU0laRUQoeCkJTUFTMV9UU0laRSh4KQorI2RlZmluZSBNQVM0X1gwRAkweDAwMDAwMDQwCisjZGVmaW5lIE1BUzRfWDFECTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFTNF9XRAkJMHgwMDAwMDAxMAorI2RlZmluZSBNQVM0X0lECQkweDAwMDAwMDA4CisjZGVmaW5lIE1BUzRfTUQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUFTNF9HRAkJMHgwMDAwMDAwMgorI2RlZmluZSBNQVM0X0VECQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTUFTNl9TUElEMAkweDNGRkYwMDAwCisjZGVmaW5lIE1BUzZfU1BJRDEJMHgwMDAwN0ZGRQorI2RlZmluZSBNQVM2X1NBUwkweDAwMDAwMDAxCisjZGVmaW5lIE1BUzZfU1BJRAlNQVM2X1NQSUQwCisKKyNkZWZpbmUgTUFTN19SUE4JMHhGRkZGRkZGRgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZuZGVmIENPTkZJR19QSFlTXzY0QklUCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgcGh5c19hZGRyX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaWQ7CisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7Cit9IG1tX2NvbnRleHRfdDsKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfTU1VX0ZTTF9CT09LRV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDMyLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ3MzViCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDMyLmgKQEAgLTAsMCArMSw5MSBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTU1VX0hBU0gzMl9IXworI2RlZmluZSBfQVNNX1BPV0VSUENfTU1VX0hBU0gzMl9IXworLyoKKyAqIDMyLWJpdCBoYXNoIHRhYmxlIE1NVSBzdXBwb3J0CisgKi8KKworLyoKKyAqIEJBVHMKKyAqLworCisvKiBCbG9jayBzaXplIG1hc2tzICovCisjZGVmaW5lIEJMXzEyOEsJMHgwMDAKKyNkZWZpbmUgQkxfMjU2SyAweDAwMQorI2RlZmluZSBCTF81MTJLIDB4MDAzCisjZGVmaW5lIEJMXzFNICAgMHgwMDcKKyNkZWZpbmUgQkxfMk0gICAweDAwRgorI2RlZmluZSBCTF80TSAgIDB4MDFGCisjZGVmaW5lIEJMXzhNICAgMHgwM0YKKyNkZWZpbmUgQkxfMTZNICAweDA3RgorI2RlZmluZSBCTF8zMk0gIDB4MEZGCisjZGVmaW5lIEJMXzY0TSAgMHgxRkYKKyNkZWZpbmUgQkxfMTI4TSAweDNGRgorI2RlZmluZSBCTF8yNTZNIDB4N0ZGCisKKy8qIEJBVCBBY2Nlc3MgUHJvdGVjdGlvbiAqLworI2RlZmluZSBCUFBfWFgJMHgwMAkJLyogTm8gYWNjZXNzICovCisjZGVmaW5lIEJQUF9SWAkweDAxCQkvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQlBQX1JXCTB4MDIJCS8qIFJlYWQvd3JpdGUgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3N0cnVjdCBwcGNfYmF0IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIGJlcGk6MTU7CS8qIEVmZmVjdGl2ZSBwYWdlIGluZGV4ICh2aXJ0dWFsIGFkZHJlc3MpICovCisJCXVuc2lnbmVkIGxvbmcgOjQ7CS8qIFVudXNlZCAqLworCQl1bnNpZ25lZCBsb25nIGJsOjExOwkvKiBCbG9jayBzaXplIG1hc2sgKi8KKwkJdW5zaWduZWQgbG9uZyB2czoxOwkvKiBTdXBlcnZpc29yIHZhbGlkICovCisJCXVuc2lnbmVkIGxvbmcgdnA6MTsJLyogVXNlciB2YWxpZCAqLworCX0gYmF0dTsgCQkvKiBVcHBlciByZWdpc3RlciAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgYnJwbjoxNTsJLyogUmVhbCBwYWdlIGluZGV4IChwaHlzaWNhbCBhZGRyZXNzKSAqLworCQl1bnNpZ25lZCBsb25nIDoxMDsJLyogVW51c2VkICovCisJCXVuc2lnbmVkIGxvbmcgdzoxOwkvKiBXcml0ZS10aHJ1IGNhY2hlICovCisJCXVuc2lnbmVkIGxvbmcgaToxOwkvKiBDYWNoZSBpbmhpYml0ICovCisJCXVuc2lnbmVkIGxvbmcgbToxOwkvKiBNZW1vcnkgY29oZXJlbmNlICovCisJCXVuc2lnbmVkIGxvbmcgZzoxOwkvKiBHdWFyZGVkIChNQlogaW4gSUJBVCkgKi8KKwkJdW5zaWduZWQgbG9uZyA6MTsJLyogVW51c2VkICovCisJCXVuc2lnbmVkIGxvbmcgcHA6MjsJLyogUGFnZSBhY2Nlc3MgcHJvdGVjdGlvbnMgKi8KKwl9IGJhdGw7CQkJLyogTG93ZXIgcmVnaXN0ZXIgKi8KK307CisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisvKgorICogSGFzaCB0YWJsZQorICovCisKKy8qIFZhbHVlcyBmb3IgUFAgKGFzc3VtZXMgS3M9MCwgS3A9MSkgKi8KKyNkZWZpbmUgUFBfUldYWAkwCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciBub25lICovCisjZGVmaW5lIFBQX1JXUlggMQkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgcmVhZCAqLworI2RlZmluZSBQUF9SV1JXIDIJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgUFBfUlhSWCAzCS8qIFN1cGVydmlzb3IgcmVhZCwgICAgICAgVXNlciByZWFkICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qIEhhcmR3YXJlIFBhZ2UgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBoYXNoX3B0ZSB7CisJdW5zaWduZWQgbG9uZyB2OjE7CS8qIEVudHJ5IGlzIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyB2c2lkOjI0OwkvKiBWaXJ0dWFsIHNlZ21lbnQgaWRlbnRpZmllciAqLworCXVuc2lnbmVkIGxvbmcgaDoxOwkvKiBIYXNoIGFsZ29yaXRobSBpbmRpY2F0b3IgKi8KKwl1bnNpZ25lZCBsb25nIGFwaTo2OwkvKiBBYmJyZXZpYXRlZCBwYWdlIGluZGV4ICovCisJdW5zaWduZWQgbG9uZyBycG46MjA7CS8qIFJlYWwgKHBoeXNpY2FsKSBwYWdlIG51bWJlciAqLworCXVuc2lnbmVkIGxvbmcgICAgOjM7CS8qIFVudXNlZCAqLworCXVuc2lnbmVkIGxvbmcgcjoxOwkvKiBSZWZlcmVuY2VkICovCisJdW5zaWduZWQgbG9uZyBjOjE7CS8qIENoYW5nZWQgKi8KKwl1bnNpZ25lZCBsb25nIHc6MTsJLyogV3JpdGUtdGhydSBjYWNoZSBtb2RlICovCisJdW5zaWduZWQgbG9uZyBpOjE7CS8qIENhY2hlIGluaGliaXRlZCAqLworCXVuc2lnbmVkIGxvbmcgbToxOwkvKiBNZW1vcnkgY29oZXJlbmNlICovCisJdW5zaWduZWQgbG9uZyBnOjE7CS8qIEd1YXJkZWQgKi8KKwl1bnNpZ25lZCBsb25nICA6MTsJLyogVW51c2VkICovCisJdW5zaWduZWQgbG9uZyBwcDoyOwkvKiBQYWdlIHByb3RlY3Rpb24gKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGlkOworCXVuc2lnbmVkIGxvbmcgdmRzb19iYXNlOworfSBtbV9jb250ZXh0X3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHJfdDsKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19NTVVfSEFTSDMyX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoNjQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oCmluZGV4IGI4ZGNhMzAuLjY5NTk2MmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oCkBAIC05NCw2ICs5NCw5IEBACiAjZGVmaW5lIEhQVEVfUl9DCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDgwKQogI2RlZmluZSBIUFRFX1JfUgkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDEwMCkKIAorI2RlZmluZSBIUFRFX1ZfMVRCX1NFRwkJQVNNX0NPTlNUKDB4NDAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgSFBURV9WX1ZSTUFfTUFTSwlBU01fQ09OU1QoMHg0MDAxZmZmZmZmMDAwMDAwKQorCiAvKiBWYWx1ZXMgZm9yIFBQIChhc3N1bWVzIEtzPTAsIEtwPTEpICovCiAvKiBwcDAgd2lsbCBhbHdheXMgYmUgMCBmb3IgbGludXggICAgICovCiAjZGVmaW5lIFBQX1JXWFgJMAkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgbm9uZSAqLwpAQCAtMTAzLDEyICsxMDYsMTIgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGhhc2hfcHRlIHsKIAl1bnNpZ25lZCBsb25nIHY7CiAJdW5zaWduZWQgbG9uZyByOwotfSBocHRlX3Q7Cit9OwogCi1leHRlcm4gaHB0ZV90ICpodGFiX2FkZHJlc3M7CitleHRlcm4gc3RydWN0IGhhc2hfcHRlICpodGFiX2FkZHJlc3M7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBodGFiX3NpemVfYnl0ZXM7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKaW5kZXggZmU1MTBmZi4uZDQ0ZDIxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCkBAIC01LDEzICs1LDE4IEBACiAjaWZkZWYgQ09ORklHX1BQQzY0CiAvKiA2NC1iaXQgY2xhc3NpYyBoYXNoIHRhYmxlIE1NVSAqLwogIyAgaW5jbHVkZSA8YXNtL21tdS1oYXNoNjQuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19TVERfTU1VKQorLyogMzItYml0IGNsYXNzaWMgaGFzaCB0YWJsZSBNTVUgKi8KKyMgIGluY2x1ZGUgPGFzbS9tbXUtaGFzaDMyLmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR180NHgpCiAvKiA0NHgtc3R5bGUgc29mdHdhcmUgbG9hZGVkIFRMQiAqLwogIyAgaW5jbHVkZSA8YXNtL21tdS00NHguaD4KLSNlbHNlCi0vKiBPdGhlciAzMi1iaXQuICBGSVhNRTogc3BsaXQgdXAgdGhlIG90aGVyIDMyLWJpdCBNTVUgdHlwZXMsIGFuZAotICogcmV2aXNlIGZvciBhcmNoL3Bvd2VycGMgKi8KLSMgIGluY2x1ZGUgPGFzbS1wcGMvbW11Lmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19GU0xfQk9PS0UpCisvKiBGcmVlc2NhbGUgQm9vay1FIHNvZnR3YXJlIGxvYWRlZCBUTEIgKi8KKyMgIGluY2x1ZGUgPGFzbS9tbXUtZnNsLWJvb2tlLmg+CisjZWxpZiBkZWZpbmVkIChDT05GSUdfUFBDXzh4eCkKKy8qIE1vdG9yb2xhL0ZyZWVzY2FsZSA4eHggc29mdHdhcmUgbG9hZGVkIFRMQiAqLworIyAgaW5jbHVkZSA8YXNtL21tdS04eHguaD4KICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXVfY29udGV4dC5oCmluZGV4IDQwYzllNWEuLmY4NjNhYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmgKQEAgLTIsMTYgKzIsMjEwIEBACiAjZGVmaW5lIF9fQVNNX1BPV0VSUENfTU1VX0NPTlRFWFRfSAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGFzbS9tbXUuaD4JCisjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1faG9va3MuaD4KKwogI2lmbmRlZiBDT05GSUdfUFBDNjQKLSNpbmNsdWRlIDxhc20tcHBjL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworLyoKKyAqIE9uIDMyLWJpdCBQb3dlclBDIDZ4eC83eHgvN3h4eCBDUFVzLCB3ZSB1c2UgYSBzZXQgb2YgMTYgVlNJRHMKKyAqICh2aXJ0dWFsIHNlZ21lbnQgaWRlbnRpZmllcnMpIGZvciBlYWNoIGNvbnRleHQuICBBbHRob3VnaCB0aGUKKyAqIGhhcmR3YXJlIHN1cHBvcnRzIDI0LWJpdCBWU0lEcywgYW5kIHRodXMgPjEgbWlsbGlvbiBjb250ZXh0cywKKyAqIHdlIG9ubHkgdXNlIDMyLDc2OCBvZiB0aGVtLiAgVGhhdCBpcyBhbXBsZSwgc2luY2UgdGhlcmUgY2FuIGJlCisgKiBhdCBtb3N0IGFyb3VuZCAzMCwwMDAgdGFza3MgaW4gdGhlIHN5c3RlbSBhbnl3YXksIGFuZCBpdCBtZWFucworICogdGhhdCB3ZSBjYW4gdXNlIGEgYml0bWFwIHRvIGluZGljYXRlIHdoaWNoIGNvbnRleHRzIGFyZSBpbiB1c2UuCisgKiBVc2luZyBhIGJpdG1hcCBtZWFucyB0aGF0IHdlIGVudGlyZWx5IGF2b2lkIGFsbCBvZiB0aGUgcHJvYmxlbXMKKyAqIHRoYXQgd2UgdXNlZCB0byBoYXZlIHdoZW4gdGhlIGNvbnRleHQgbnVtYmVyIG92ZXJmbG93ZWQsCisgKiBwYXJ0aWN1bGFybHkgb24gU01QIHN5c3RlbXMuCisgKiAgLS0gcGF1bHVzLgorICovCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGRlZmluZXMgdGhlIG1hcHBpbmcgZnJvbSBjb250ZXh0cyB0byBWU0lEcyAodmlydHVhbAorICogc2VnbWVudCBJRHMpLiAgV2UgdXNlIGEgc2tldyBvbiBib3RoIHRoZSBjb250ZXh0IGFuZCB0aGUgaGlnaCA0IGJpdHMKKyAqIG9mIHRoZSAzMi1iaXQgdmlydHVhbCBhZGRyZXNzICh0aGUgImVmZmVjdGl2ZSBzZWdtZW50IElEIikgaW4gb3JkZXIKKyAqIHRvIHNwcmVhZCBvdXQgdGhlIGVudHJpZXMgaW4gdGhlIE1NVSBoYXNoIHRhYmxlLiAgTm90ZSwgaWYgdGhpcworICogZnVuY3Rpb24gaXMgY2hhbmdlZCB0aGVuIGFyY2gvcHBjL21tL2hhc2h0YWJsZS5TIHdpbGwgaGF2ZSB0byBiZQorICogY2hhbmdlZCB0byBjb3JyZXNwb25kLgorICovCisjZGVmaW5lIENUWF9UT19WU0lEKGN0eCwgdmEpCSgoKGN0eCkgKiAoODk3ICogMTYpICsgKCh2YSkgPj4gMjgpICogMHgxMTEpIFwKKwkJCQkgJiAweGZmZmZmZikKKworLyoKKyAgIFRoZSBNUEM4eHggaGFzIG9ubHkgMTYgY29udGV4dHMuICBXZSByb3RhdGUgdGhyb3VnaCB0aGVtIG9uIGVhY2gKKyAgIHRhc2sgc3dpdGNoLiAgQSBiZXR0ZXIgd2F5IHdvdWxkIGJlIHRvIGtlZXAgdHJhY2sgb2YgdGFza3MgdGhhdAorICAgb3duIGNvbnRleHRzLCBhbmQgaW1wbGVtZW50IGFuIExSVSB1c2FnZS4gIFRoYXQgd2F5IHZlcnkgYWN0aXZlCisgICB0YXNrcyBkb24ndCBhbHdheXMgaGF2ZSB0byBwYXkgdGhlIFRMQiByZWxvYWQgb3ZlcmhlYWQuICBUaGUKKyAgIGtlcm5lbCBwYWdlcyBhcmUgbWFwcGVkIHNoYXJlZCwgc28gdGhlIGtlcm5lbCBjYW4gcnVuIG9uIGJlaGFsZgorICAgb2YgYW55IHRhc2sgdGhhdCBtYWtlcyBhIGtlcm5lbCBlbnRyeS4gIFNoYXJlZCBkb2VzIG5vdCBtZWFuIHRoZXkKKyAgIGFyZSBub3QgcHJvdGVjdGVkLCBqdXN0IHRoYXQgdGhlIEFTSUQgY29tcGFyaXNvbiBpcyBub3QgcGVyZm9ybWVkLgorICAgICAgICAtLSBEYW4KKworICAgVGhlIElCTTR4eCBoYXMgMjU2IGNvbnRleHRzLCBzbyB3ZSBjYW4ganVzdCByb3RhdGUgdGhyb3VnaCB0aGVzZQorICAgYXMgYSB3YXkgb2YgInN3aXRjaGluZyIgY29udGV4dHMuICBJZiB0aGUgVElEIG9mIHRoZSBUTEIgaXMgemVybywKKyAgIHRoZSBQSUQvVElEIGNvbXBhcmlzb24gaXMgZGlzYWJsZWQsIHNvIHdlIGNhbiB1c2UgYSBUSUQgb2YgemVybworICAgdG8gcmVwcmVzZW50IGFsbCBrZXJuZWwgcGFnZXMgYXMgc2hhcmVkIGFtb25nIGFsbCBjb250ZXh0cy4KKyAgIAktLSBEYW4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZW50ZXJfbGF6eV90bGIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworfQorCisjaWZkZWYgQ09ORklHXzh4eAorI2RlZmluZSBOT19DT05URVhUICAgICAgCTE2CisjZGVmaW5lIExBU1RfQ09OVEVYVCAgICAJMTUKKyNkZWZpbmUgRklSU1RfQ09OVEVYVCAgICAJMAorCisjZWxpZiBkZWZpbmVkKENPTkZJR180eHgpCisjZGVmaW5lIE5PX0NPTlRFWFQgICAgICAJMjU2CisjZGVmaW5lIExBU1RfQ09OVEVYVCAgICAJMjU1CisjZGVmaW5lIEZJUlNUX0NPTlRFWFQgICAgCTEKKworI2VsaWYgZGVmaW5lZChDT05GSUdfRTIwMCkgfHwgZGVmaW5lZChDT05GSUdfRTUwMCkKKyNkZWZpbmUgTk9fQ09OVEVYVCAgICAgIAkyNTYKKyNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkyNTUKKyNkZWZpbmUgRklSU1RfQ09OVEVYVCAgICAJMQorCisjZWxzZQorCisvKiBQUEMgNnh4LCA3eHggQ1BVcyAqLworI2RlZmluZSBOT19DT05URVhUICAgICAgCSgodW5zaWduZWQgbG9uZykgLTEpCisjZGVmaW5lIExBU1RfQ09OVEVYVCAgICAJMzI3NjcKKyNkZWZpbmUgRklSU1RfQ09OVEVYVCAgICAJMQorI2VuZGlmCisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgTU1VIGNvbnRleHQuCisgKiBPbiAzMi1iaXQgUG93ZXJQQ3MgKG90aGVyIHRoYW4gdGhlIDh4eCBlbWJlZGRlZCBjaGlwcyksIHRoaXMgaXMgZG9uZSBieQorICogbG9hZGluZyB1cCB0aGUgc2VnbWVudCByZWdpc3RlcnMgZm9yIHRoZSB1c2VyIHBhcnQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuCisgKgorICogU2luY2UgdGhlIFBHRCBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUsIGl0IGlzIG11Y2ggZmFzdGVyIHRvIHNpbXBseQorICogcGFzcyB0aGlzIGFsb25nIGFzIGEgc2Vjb25kIHBhcmFtZXRlciwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIDh4eCBhbmQKKyAqIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb24gYWxsIHByb2Nlc3NvcnMgKGlmIHlvdSBoYXBwZW4gdG8gaGF2ZQorICogYW4gQWJhdHJvbikuCisgKi8KK2V4dGVybiB2b2lkIHNldF9jb250ZXh0KHVuc2lnbmVkIGxvbmcgY29udGV4dGlkLCBwZ2RfdCAqcGdkKTsKKworLyoKKyAqIEJpdG1hcCBvZiBjb250ZXh0cyBpbiB1c2UuCisgKiBUaGUgc2l6ZSBvZiB0aGlzIGJpdG1hcCBpcyBMQVNUX0NPTlRFWFQgKyAxIGJpdHMuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGNvbnRleHRfbWFwW107CisKKy8qCisgKiBUaGlzIGNhY2hlcyB0aGUgbmV4dCBjb250ZXh0IG51bWJlciB0aGF0IHdlIGV4cGVjdCB0byBiZSBmcmVlLgorICogSXRzIHVzZSBpcyBhbiBvcHRpbWl6YXRpb24gb25seSwgd2UgY2FuJ3QgcmVseSBvbiB0aGlzIGNvbnRleHQKKyAqIG51bWJlciB0byBiZSBmcmVlLCBidXQgaXQgdXN1YWxseSB3aWxsIGJlLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBuZXh0X21tdV9jb250ZXh0OworCisvKgorICogSWYgd2UgZG9uJ3QgaGF2ZSBzdWZmaWNpZW50IGNvbnRleHRzIHRvIGdpdmUgb25lIHRvIGV2ZXJ5IHRhc2sKKyAqIHRoYXQgY291bGQgYmUgaW4gdGhlIHN5c3RlbSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHN0ZWFsIGNvbnRleHRzLgorICogVGhlc2UgdmFyaWFibGVzIHN1cHBvcnQgdGhhdC4KKyAqLworI2lmIExBU1RfQ09OVEVYVCA8IDMwMDAwCisjZGVmaW5lIEZFV19DT05URVhUUwkxCitleHRlcm4gYXRvbWljX3QgbnJfZnJlZV9jb250ZXh0czsKK2V4dGVybiBzdHJ1Y3QgbW1fc3RydWN0ICpjb250ZXh0X21tW0xBU1RfQ09OVEVYVCsxXTsKK2V4dGVybiB2b2lkIHN0ZWFsX2NvbnRleHQodm9pZCk7CisjZW5kaWYKKworLyoKKyAqIEdldCBhIG5ldyBtbXUgY29udGV4dCBmb3IgdGhlIGFkZHJlc3Mgc3BhY2UgZGVzY3JpYmVkIGJ5IGBtbScuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJdW5zaWduZWQgbG9uZyBjdHg7CisKKwlpZiAobW0tPmNvbnRleHQuaWQgIT0gTk9fQ09OVEVYVCkKKwkJcmV0dXJuOworI2lmZGVmIEZFV19DT05URVhUUworCXdoaWxlIChhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZucl9mcmVlX2NvbnRleHRzKSA8IDApCisJCXN0ZWFsX2NvbnRleHQoKTsKKyNlbmRpZgorCWN0eCA9IG5leHRfbW11X2NvbnRleHQ7CisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoY3R4LCBjb250ZXh0X21hcCkpIHsKKwkJY3R4ID0gZmluZF9uZXh0X3plcm9fYml0KGNvbnRleHRfbWFwLCBMQVNUX0NPTlRFWFQrMSwgY3R4KTsKKwkJaWYgKGN0eCA+IExBU1RfQ09OVEVYVCkKKwkJCWN0eCA9IDA7CisJfQorCW5leHRfbW11X2NvbnRleHQgPSAoY3R4ICsgMSkgJiBMQVNUX0NPTlRFWFQ7CisJbW0tPmNvbnRleHQuaWQgPSBjdHg7CisjaWZkZWYgRkVXX0NPTlRFWFRTCisJY29udGV4dF9tbVtjdHhdID0gbW07CisjZW5kaWYKK30KKworLyoKKyAqIFNldCB1cCB0aGUgY29udGV4dCBmb3IgYSBuZXcgYWRkcmVzcyBzcGFjZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5pdF9uZXdfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKKwltbS0+Y29udGV4dC52ZHNvX2Jhc2UgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogV2UncmUgZmluaXNoZWQgdXNpbmcgdGhlIGNvbnRleHQgZm9yIGFuIGFkZHJlc3Mgc3BhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKG1tLT5jb250ZXh0LmlkICE9IE5PX0NPTlRFWFQpIHsKKwkJY2xlYXJfYml0KG1tLT5jb250ZXh0LmlkLCBjb250ZXh0X21hcCk7CisJCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKKyNpZmRlZiBGRVdfQ09OVEVYVFMKKwkJYXRvbWljX2luYygmbnJfZnJlZV9jb250ZXh0cyk7CisjZW5kaWYKKwl9CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LAorCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BTFRJVkVDKSkKKwlhc20gdm9sYXRpbGUgKCJkc3NhbGw7XG4iCisjaWZuZGVmIENPTkZJR19QT1dFUjQKKwkgInN5bmM7XG4iIC8qIEc0IG5lZWRzIGEgc3luYyBoZXJlLCBHNSBhcHBhcmVudGx5IG5vdCAqLworI2VuZGlmCisJIDogOiApOworI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCisKKwl0c2stPnRocmVhZC5wZ2RpciA9IG5leHQtPnBnZDsKKworCS8qIE5vIG5lZWQgdG8gZmx1c2ggdXNlcnNwYWNlIHNlZ21lbnRzIGlmIHRoZSBtbSBkb2VzbnQgY2hhbmdlICovCisJaWYgKHByZXYgPT0gbmV4dCkKKwkJcmV0dXJuOworCisJLyogU2V0dXAgbmV3IHVzZXJzcGFjZSBjb250ZXh0ICovCisJZ2V0X21tdV9jb250ZXh0KG5leHQpOworCXNldF9jb250ZXh0KG5leHQtPmNvbnRleHQuaWQsIG5leHQtPnBnZCk7Cit9CisKKyNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssbW0pCWRvIHsgfSB3aGlsZSAoMCkKKworLyoKKyAqIEFmdGVyIHdlIGhhdmUgc2V0IGN1cnJlbnQtPm1tIHRvIGEgbmV3IHZhbHVlLCB0aGlzIGFjdGl2YXRlcworICogdGhlIGNvbnRleHQgZm9yIHRoZSBuZXcgbW0gc28gd2Ugc2VlIHRoZSBuZXcgbWFwcGluZ3MuCisgKi8KKyNkZWZpbmUgYWN0aXZhdGVfbW0oYWN0aXZlX21tLCBtbSkgICBzd2l0Y2hfbW0oYWN0aXZlX21tLCBtbSwgY3VycmVudCkKKworZXh0ZXJuIHZvaWQgbW11X2NvbnRleHRfaW5pdCh2b2lkKTsKKworCiAjZWxzZQogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CQogI2luY2x1ZGUgPGxpbnV4L21tLmg+CQogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL21tdS5oPgkKLSNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbV9ob29rcy5oPgogCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAxIFBQQyA2NCBUZWFtLCBJQk0gQ29ycApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4Nnh4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaAppbmRleCBiODVkZjQ1Li4xNWY2NTBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaApAQCAtMTksMTIgKzE5LDYgQEAKIAogI2lmZGVmIENPTkZJR19QUENfODZ4eAogCi0jZGVmaW5lIF9JT19CQVNFICAgICAgICBpc2FfaW9fYmFzZQotI2RlZmluZSBfSVNBX01FTV9CQVNFICAgaXNhX21lbV9iYXNlCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgcGNpX2RyYW1fb2Zmc2V0Ci0jZW5kaWYKLQogI2RlZmluZSBDUFUwX0JPT1RfUkVMRUFTRSAweDAxMDAwMDAwCiAjZGVmaW5lIENQVTFfQk9PVF9SRUxFQVNFIDB4MDIwMDAwMDAKICNkZWZpbmUgQ1BVX0FMTF9SRUxFQVNFRCAoQ1BVMF9CT09UX1JFTEVBU0UgfCBDUFUxX0JPT1RfUkVMRUFTRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjOHh4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzh4eC5oCmluZGV4IDU4MDM3MTEuLjJiZTAxNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjOHh4LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4eHguaApAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlIDxwbGF0Zm9ybXMvOHh4L21wYzg4NWFkcy5oPgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUENNQ0lBX004WFgKK2V4dGVybiBzdHJ1Y3QgbXBjOHh4X3BjbWNpYV9vcHMgbTh4eF9wY21jaWFfb3BzOworI2VuZGlmCisKICNlbmRpZiAvKiBDT05GSUdfOHh4ICovCiAjZW5kaWYgLyogX19DT05GSUdfOHh4X0RFRlMgKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCmluZGV4IGQ5YmY1YWIuLmU3MmMyYTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCkBAIC0yLDEyICsyLDkxIEBACiAjZGVmaW5lIF9BU01fUE9XRVJQQ19QQ0lfQlJJREdFX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpZm5kZWYgQ09ORklHX1BQQzY0Ci0jaW5jbHVkZSA8YXNtLXBwYy9wY2ktYnJpZGdlLmg+Ci0jZWxzZQotCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaWZuZGVmIENPTkZJR19QUEM2NAorCitzdHJ1Y3QgZGV2aWNlX25vZGU7CitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXI7CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBQQ0kgY29udHJvbGxlciAoaG9zdCBicmlkZ2UpCisgKi8KK3N0cnVjdCBwY2lfY29udHJvbGxlciB7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwljaGFyIGlzX2R5bmFtaWM7CisJdm9pZCAqYXJjaF9kYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9ub2RlOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKworCWludCBmaXJzdF9idXNubzsKKwlpbnQgbGFzdF9idXNubzsKKwlpbnQgc2VsZl9idXNubzsKKworCXZvaWQgX19pb21lbSAqaW9fYmFzZV92aXJ0OworCXJlc291cmNlX3NpemVfdCBpb19iYXNlX3BoeXM7CisKKwkvKiBTb21lIG1hY2hpbmVzIChQUmVQKSBoYXZlIGEgbm9uIDE6MSBtYXBwaW5nIG9mCisJICogdGhlIFBDSSBtZW1vcnkgc3BhY2UgaW4gdGhlIENQVSBidXMgc3BhY2UKKwkgKi8KKwlyZXNvdXJjZV9zaXplX3QgcGNpX21lbV9vZmZzZXQ7CisKKwlzdHJ1Y3QgcGNpX29wcyAqb3BzOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2lvbWVtICpjZmdfYWRkcjsKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOworCisJLyoKKwkgKiBVc2VkIGZvciB2YXJpYW50cyBvZiBQQ0kgaW5kaXJlY3QgaGFuZGxpbmcgYW5kIHBvc3NpYmxlIHF1aXJrczoKKwkgKiAgU0VUX0NGR19UWVBFIC0gdXNlZCBvbiA0eHggb3IgYW55IFBIQiB0aGF0IGRvZXMgZXhwbGljaXQgdHlwZTAvMQorCSAqICBFWFRfUkVHIC0gcHJvdmlkZXMgYWNjZXNzIHRvIFBDSS1lIGV4dGVuZGVkIHJlZ2lzdGVycworCSAqICBTVVJQUkVTU19QUklNQVJZX0JVUyAtIHdlIHN1cnByZXNzIHRoZSBzZXR0aW5nIG9mIFBDSV9QUklNQVJZX0JVUworCSAqICAgb24gRnJlZXNjYWxlIFBDSS1lIGNvbnRyb2xsZXJzIHNpbmNlIHRoZXkgdXNlZCB0aGUgUENJX1BSSU1BUllfQlVTCisJICogICB0byBkZXRlcm1pbmUgd2hpY2ggYnVzIG51bWJlciB0byBtYXRjaCBvbiB3aGVuIGdlbmVyYXRpbmcgdHlwZTAKKwkgKiAgIGNvbmZpZyBjeWNsZXMKKwkgKi8KKyNkZWZpbmUgUFBDX0lORElSRUNUX1RZUEVfU0VUX0NGR19UWVBFCQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRwkJKDB4MDAwMDAwMDIpCisjZGVmaW5lIFBQQ19JTkRJUkVDVF9UWVBFX1NVUlBSRVNTX1BSSU1BUllfQlVTCSgweDAwMDAwMDA0KQorCXUzMiBpbmRpcmVjdF90eXBlOworCisJLyogQ3VycmVudGx5LCB3ZSBsaW1pdCBvdXJzZWx2ZXMgdG8gMSBJTyByYW5nZSBhbmQgMyBtZW0KKwkgKiByYW5nZXMgc2luY2UgdGhlIGNvbW1vbiBwY2lfYnVzIHN0cnVjdHVyZSBjYW4ndCBoYW5kbGUgbW9yZQorCSAqLworCXN0cnVjdCByZXNvdXJjZQlpb19yZXNvdXJjZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgbWVtX3Jlc291cmNlc1szXTsKKwlpbnQgZ2xvYmFsX251bWJlcjsJCS8qIFBDSSBkb21haW4gbnVtYmVyICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGNpX2J1c190b19ob3N0KHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJcmV0dXJuIGJ1cy0+c3lzZGF0YTsKK30KKworLyogVGhlc2UgYXJlIHVzZWQgZm9yIGNvbmZpZyBhY2Nlc3MgYmVmb3JlIGFsbCB0aGUgUENJIHByb2JpbmcKKyAgIGhhcyBiZWVuIGRvbmUuICovCitpbnQgZWFybHlfcmVhZF9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICBpbnQgd2hlcmUsIHU4ICp2YWwpOworaW50IGVhcmx5X3JlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgaW50IHdoZXJlLCB1MTYgKnZhbCk7CitpbnQgZWFybHlfcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgIGludCB3aGVyZSwgdTMyICp2YWwpOworaW50IGVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgICBpbnQgd2hlcmUsIHU4IHZhbCk7CitpbnQgZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgIGludCB3aGVyZSwgdTE2IHZhbCk7CitpbnQgZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgICAgaW50IHdoZXJlLCB1MzIgdmFsKTsKKworZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpX25vbWFwKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwKKwkJCSAgICAgICB2b2lkIF9faW9tZW0gKmNmZ19hZGRyLCB2b2lkIF9faW9tZW0gKmNmZ19kYXRhKTsKK2V4dGVybiB2b2lkIHNldHVwX2luZGlyZWN0X3BjaShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsCisJCQkgICAgICAgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpOworZXh0ZXJuIHZvaWQgc2V0dXBfZ3JhY2tsZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCisjZWxzZQorCiAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0zMSw2ICsxMTAsNyBAQAogCWludCBsYXN0X2J1c25vOwogCiAJdm9pZCBfX2lvbWVtICppb19iYXNlX3ZpcnQ7CisJdm9pZCAqaW9fYmFzZV9hbGxvYzsKIAlyZXNvdXJjZV9zaXplX3QgaW9fYmFzZV9waHlzOwogCiAJLyogU29tZSBtYWNoaW5lcyBoYXZlIGEgbm9uIDE6MSBtYXBwaW5nIG9mCkBAIC00OCw4ICsxMjgsNyBAQAogCSAqLwogCXN0cnVjdCByZXNvdXJjZSBpb19yZXNvdXJjZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgbWVtX3Jlc291cmNlc1szXTsKLQlpbnQgZ2xvYmFsX251bWJlcjsJCQotCWludCBsb2NhbF9udW1iZXI7CQkKKwlpbnQgZ2xvYmFsX251bWJlcjsKIAl1bnNpZ25lZCBsb25nIGJ1aWQ7CiAJdW5zaWduZWQgbG9uZyBkbWFfd2luZG93X2Jhc2VfY3VyOwogCXVuc2lnbmVkIGxvbmcgZG1hX3dpbmRvd19zaXplOwpAQCAtNzAsMTkgKzE0OSwyMiBAQAogCWludAlkZXZmbjsJCQkvKiBwY2kgZGV2aWNlIGFuZCBmdW5jdGlvbiBudW1iZXIgKi8KIAlpbnQJY2xhc3NfY29kZTsJCS8qIHBjaSBkZXZpY2UgY2xhc3MgKi8KIAotI2lmZGVmIENPTkZJR19QUENfUFNFUklFUworCXN0cnVjdCAgcGNpX2NvbnRyb2xsZXIgKnBoYjsJLyogZm9yIHBjaSBkZXZpY2VzICovCisJc3RydWN0CWlvbW11X3RhYmxlICppb21tdV90YWJsZTsJLyogZm9yIHBoYidzIG9yIGJyaWRnZXMgKi8KKwlzdHJ1Y3QJcGNpX2RldiAqcGNpZGV2OwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIHBjaSBkZXZpY2UgKi8KKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKm5vZGU7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgZGV2aWNlX25vZGUgKi8KKworCWludAlwY2lfZXh0X2NvbmZpZ19zcGFjZTsJLyogZm9yIHBjaSBkZXZpY2VzICovCisKKyNpZmRlZiBDT05GSUdfRUVICiAJaW50CWVlaF9tb2RlOwkJLyogU2VlIGVlaC5oIGZvciBwb3NzaWJsZSBFRUhfTU9ERXMgKi8KIAlpbnQJZWVoX2NvbmZpZ19hZGRyOwogCWludAllZWhfcGVfY29uZmlnX2FkZHI7IC8qIG5ldy1zdHlsZSBwYXJ0aXRpb24gZW5kcG9pbnQgYWRkcmVzcyAqLwogCWludCAJZWVoX2NoZWNrX2NvdW50OwkvKiAjIHRpbWVzIGRyaXZlciBpZ25vcmVkIGVycm9yICovCiAJaW50IAllZWhfZnJlZXplX2NvdW50OwkvKiAjIHRpbWVzIHRoaXMgZGV2aWNlIGZyb3plIHVwLiAqLwotI2VuZGlmCi0JaW50CXBjaV9leHRfY29uZmlnX3NwYWNlOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KLQlzdHJ1Y3QgIHBjaV9jb250cm9sbGVyICpwaGI7CS8qIGZvciBwY2kgZGV2aWNlcyAqLwotCXN0cnVjdAlpb21tdV90YWJsZSAqaW9tbXVfdGFibGU7CS8qIGZvciBwaGIncyBvciBicmlkZ2VzICovCi0Jc3RydWN0CXBjaV9kZXYgKnBjaWRldjsJLyogYmFjay1wb2ludGVyIHRvIHRoZSBwY2kgZGV2aWNlICovCi0Jc3RydWN0CWRldmljZV9ub2RlICpub2RlOwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIGRldmljZV9ub2RlICovCisJaW50IAllZWhfZmFsc2VfcG9zaXRpdmVzOwkvKiAjIHRpbWVzIHRoaXMgZGV2aWNlIHJlcG9ydGVkICNmZidzICovCiAJdTMyCWNvbmZpZ19zcGFjZVsxNl07CS8qIHNhdmVkIFBDSSBjb25maWcgc3BhY2UgKi8KKyNlbmRpZgogfTsKIAogLyogR2V0IHRoZSBwb2ludGVyIHRvIGEgZGV2aWNlX25vZGUncyBwY2lfZG4gKi8KQEAgLTEyOCw5ICsyMTAsNiBAQAogLyoqIEZpbmQgdGhlIGJ1cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRpY2F0ZWQgZGV2aWNlIG5vZGUgKi8KIHN0cnVjdCBwY2lfYnVzICogcGNpYmlvc19maW5kX3BjaV9idXMoc3RydWN0IGRldmljZV9ub2RlICpkbik7CiAKLWV4dGVybiB2b2lkIHBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCQkgc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBwcmltYXJ5KTsKLQogLyoqIFJlbW92ZSBhbGwgb2YgdGhlIFBDSSBkZXZpY2VzIHVuZGVyIHRoaXMgYnVzICovCiB2b2lkIHBjaWJpb3NfcmVtb3ZlX3BjaV9kZXZpY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCkBAIC0xNDgsMjEgKzIyNywxMiBAQAogCXJldHVybiBQQ0lfRE4oYnVzZG4pLT5waGI7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqCi1wY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKTsKLQotZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlciAqCi1wY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwogZXh0ZXJuIHZvaWQgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwogCi0jaWZkZWYgQ09ORklHX1BDSQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7Ci19Ci0jZW5kaWYKK2V4dGVybiB2b2lkIGlzYV9icmlkZ2VfZmluZF9lYXJseShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCitleHRlcm4gaW50IHBjaWJpb3NfdW5tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7CitleHRlcm4gaW50IHBjaWJpb3NfbWFwX2lvX3NwYWNlKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKiBSZXR1cm4gdmFsdWVzIGZvciBwcGNfbWQucGNpX3Byb2JlX21vZGUgZnVuY3Rpb24gKi8KICNkZWZpbmUgUENJX1BST0JFX05PTkUJCS0xCS8qIERvbid0IGxvb2sgYXQgdGhpcyBidXMgYXQgYWxsICovCkBAIC0xNzYsNSArMjQ2LDI5IEBACiAjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworCisvKiBHZXQgdGhlIFBDSSBob3N0IGNvbnRyb2xsZXIgZm9yIGFuIE9GIGRldmljZSAqLworZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlcioKK3BjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpOworCisvKiBGaWxsIHVwIGhvc3QgY29udHJvbGxlciByZXNvdXJjZXMgZnJvbSB0aGUgT0Ygbm9kZSAqLworZXh0ZXJuIHZvaWQKK3BjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBwcmltYXJ5KTsKKworLyogQWxsb2NhdGUgYSBuZXcgUENJIGhvc3QgYnJpZGdlIHN0cnVjdHVyZSAqLworZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlciAqCitwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworI2lmZGVmIENPTkZJR19QQ0kKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOworfQorI2VuZGlmCisKKworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaAppbmRleCBlMTZlN2JjLi43YjExNzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKQEAgLTk1LDggKzk1LDYgQEAKICNkZWZpbmUgZ2V0X3BjaV9kbWFfb3BzKCkJTlVMTAogI2VuZGlmCiAKLWV4dGVybiBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKLQogLyogRGVjaWRlIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZG9tYWluIG51bWJlciBpbiAvcHJvYyAqLwogZXh0ZXJuIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKQEAgLTExMiw5ICsxMTAsNiBAQAogfQogI2VuZGlmCiAKLS8qIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIFBDSSBjb250cm9sbGVyIGZvciBkZXZpY2UgUERFVi4gKi8KLSNkZWZpbmUgcGNpX2RvbWFpbl9ucihidXMpICgoc3RydWN0IHBjaV9jb250cm9sbGVyICopKGJ1cyktPnN5c2RhdGEpLT5pbmRleAotCiAvKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGJ1cyBhcyBpdCBhcHBlYXJzIGluIC9wcm9jL2J1cy9wY2kgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9wcm9jX2RvbWFpbihzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewpAQCAtMTIzLDYgKzExOCw4IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAorZXh0ZXJuIGludCBwY2lfZG9tYWluX25yKHN0cnVjdCBwY2lfYnVzICpidXMpOworCiBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7CiAvKiBNYXAgYSByYW5nZSBvZiBQQ0kgbWVtb3J5IG9yIEkvTyBzcGFjZSBmb3IgYSBkZXZpY2UgaW50byB1c2VyIHNwYWNlICovCiBpbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCkBAIC0yMDIsMTAgKzE5OSw2IEBACiAJcmV0dXJuIHJvb3Q7CiB9CiAKLWV4dGVybiBpbnQgdW5tYXBfYnVzX3JhbmdlKHN0cnVjdCBwY2lfYnVzICpidXMpOwotCi1leHRlcm4gaW50IHJlbWFwX2J1c19yYW5nZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKLQogZXh0ZXJuIHZvaWQgcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzMyLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjMzIuaAppbmRleCA3ZmI3MzBjLi44NmE1NGE0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzMyLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzMyLmgKQEAgLTYsMTEgKzYsNyBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CQkvKiBGb3IgVEFTS19TSVpFICovCi0jaW5jbHVkZSA8YXNtL21tdS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CQkJLyogRm9yIHN1Yi1hcmNoIHNwZWNpZmljIFBQQ19QSU5fU0laRSAqLwotc3RydWN0IG1tX3N0cnVjdDsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmFfdG9fcGh5cyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwogZXh0ZXJuIHB0ZV90ICp2YV90b19wdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKQEAgLTQ4OCwxNCArNDg0LDYgQEAKICNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKCgocHRlX2Jhc2ljX3QpKHBmbikgPDwgUEZOX1NISUZUX09GRlNFVCkgfFwKIAkJCQkJcGdwcm90X3ZhbChwcm90KSkKICNkZWZpbmUgbWtfcHRlKHBhZ2UsIHByb3QpCXBmbl9wdGUocGFnZV90b19wZm4ocGFnZSksIHByb3QpCi0KLS8qCi0gKiBaRVJPX1BBR0UgaXMgYSBnbG9iYWwgc2hhcmVkIHBhZ2UgdGhhdCBpcyBhbHdheXMgemVybzogdXNlZAotICogZm9yIHplcm8tbWFwcGVkIG1lbW9yeSBhcmVhcyBldGMuLgotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbMTAyNF07Ci0jZGVmaW5lIFpFUk9fUEFHRSh2YWRkcikgKHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpKQotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUgcHRlX25vbmUocHRlKQkJKChwdGVfdmFsKHB0ZSkgJiB+X1BURV9OT05FX01BU0spID09IDApCkBAIC01MTIsOSArNTAwLDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQpAQCAtNTIyLDIxICs1MDgsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfdW5jYWNoZShwdGVfdCBwdGUpICAgICAgIHsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX05PX0NBQ0hFOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2NhY2hlKHB0ZV90IHB0ZSkgICAgICAgICB7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfTk9fQ0FDSEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JXIHwgX1BBR0VfSFdXUklURSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfRElSVFkgfCBfUEFHRV9IV1dSSVRFKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUiB8IF9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JXOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkgewpAQCAtNjQzLDEzICs2MjEsNiBAQAogI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKF9fdm1hLCBfX2FkZHIsIF9fcHRlcCkgXAogCV9fcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZygoX192bWEpLT52bV9tbS0+Y29udGV4dC5pZCwgX19hZGRyLCBfX3B0ZXApCiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcmV0dXJuIChwdGVfdXBkYXRlKHB0ZXAsIChfUEFHRV9ESVJUWSB8IF9QQUdFX0hXV1JJVEUpLCAwKSAmIF9QQUdFX0RJUlRZKSAhPSAwOwotfQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkgICAgICAgcHRlX3QgKnB0ZXApCkBAIC03MzQsMTAgKzcwNSw2IEBACiAjZGVmaW5lIHB0ZV91bm1hcChwdGUpCQlrdW5tYXBfYXRvbWljKHB0ZSwgS01fUFRFMCkKICNkZWZpbmUgcHRlX3VubWFwX25lc3RlZChwdGUpCWt1bm1hcF9hdG9taWMocHRlLCBLTV9QVEUxKQogCi1leHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsKLQotZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7Ci0KIC8qCiAgKiBFbmNvZGUgYW5kIGRlY29kZSBhIHN3YXAgZW50cnkuCiAgKiBOb3RlIHRoYXQgdGhlIGJpdHMgd2UgdXNlIGluIGEgUFRFIGZvciByZXByZXNlbnRpbmcgYSBzd2FwIGVudHJ5CkBAIC03NTUsNDAgKzcyMiw2IEBACiAjZGVmaW5lIHB0ZV90b19wZ29mZihwdGUpCShwdGVfdmFsKHB0ZSkgPj4gMykKICNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJKChwdGVfdCkgeyAoKG9mZikgPDwgMykgfCBfUEFHRV9GSUxFIH0pCiAKLS8qIENPTkZJR19BUFVTICovCi0vKiBGb3IgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MgY29udmVyc2lvbiAqLwotZXh0ZXJuIHZvaWQgY2FjaGVfY2xlYXIoX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1leHRlcm4gdm9pZCBjYWNoZV9wdXNoKF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOwotZXh0ZXJuIGludCBtbV9lbmRfb2ZfY2h1bmsgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpb3BhKHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBtbV9wdG92KHVuc2lnbmVkIGxvbmcgYWRkcikgX19hdHRyaWJ1dGVfY29uc3RfXzsKLQotLyogVmFsdWVzIGZvciBub2NhY2hlZmxhZyBhbmQgY21vZGUgKi8KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCBieSB0aGUgQVBVUyBrZXJuZWxfbWFwLCBidXQgcHJldmVudHMKLSAgIGNvbXBpbGF0aW9uIGVycm9ycy4gKi8KLSNkZWZpbmUJS0VSTkVMTUFQX0ZVTExfQ0FDSElORwkJMAotI2RlZmluZQlLRVJORUxNQVBfTk9DQUNIRV9TRVIJCTEKLSNkZWZpbmUJS0VSTkVMTUFQX05PQ0FDSEVfTk9OU0VSCTIKLSNkZWZpbmUJS0VSTkVMTUFQX05PX0NPUFlCQUNLCQkzCi0KLS8qCi0gKiBNYXAgc29tZSBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLgotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBrZXJuZWxfbWFwKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQlpbnQgbm9jYWNoZWZsYWcsIHVuc2lnbmVkIGxvbmcgKm1lbWF2YWlscCApOwotCi0vKgotICogU2V0IGNhY2hlIG1vZGUgb2YgKGtlcm5lbCBzcGFjZSkgYWRkcmVzcyByYW5nZS4KLSAqLwotZXh0ZXJuIHZvaWQga2VybmVsX3NldF9jYWNoZW1vZGUgKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtb2RlKTsKLQotLyogTmVlZHMgdG8gYmUgZGVmaW5lZCBoZXJlIGFuZCBub3QgaW4gbGludXgvbW0uaCwgYXMgaXQgaXMgYXJjaCBkZXBlbmRlbnQgKi8KLSNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpCSgxKQotCi0jZGVmaW5lIGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCQlcCi0JCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCi0KIC8qCiAgKiBObyBwYWdlIHRhYmxlIGNhY2hlcyB0byBpbml0aWFsaXNlCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGM2NC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzY0LmgKaW5kZXggM2NmZDk4Zi4uMzAwZjlhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzY0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzY0LmgKQEAgLTcsMTEgKzcsNyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIEZvciBUQVNLX1NJWkUgKi8KLSNpbmNsdWRlIDxhc20vbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLXN0cnVjdCBtbV9zdHJ1Y3Q7CiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwpAQCAtMjcsNyArMjMsNyBAQAogICovCiAjZGVmaW5lIFBHVEFCTEVfRUFERFJfU0laRSAoUFRFX0lOREVYX1NJWkUgKyBQTURfSU5ERVhfU0laRSArIFwKICAgICAgICAgICAgICAgICAJICAgIFBVRF9JTkRFWF9TSVpFICsgUEdEX0lOREVYX1NJWkUgKyBQQUdFX1NISUZUKQotI2RlZmluZSBQR1RBQkxFX1JBTkdFICgxVUwgPDwgUEdUQUJMRV9FQUREUl9TSVpFKQorI2RlZmluZSBQR1RBQkxFX1JBTkdFIChBU01fQ09OU1QoMSkgPDwgUEdUQUJMRV9FQUREUl9TSVpFKQogCiAjaWYgVEFTS19TSVpFX1VTRVI2NCA+IFBHVEFCTEVfUkFOR0UKICNlcnJvciBUQVNLX1NJWkVfVVNFUjY0IGV4Y2VlZHMgcGFnZXRhYmxlIHJhbmdlCkBAIC0zNywxOSArMzMsMjggQEAKICNlcnJvciBUQVNLX1NJWkVfVVNFUjY0IGV4Y2VlZHMgdXNlciBWU0lEIHJhbmdlCiAjZW5kaWYKIAorCiAvKgogICogRGVmaW5lIHRoZSBhZGRyZXNzIHJhbmdlIG9mIHRoZSB2bWFsbG9jIFZNIGFyZWEuCiAgKi8KICNkZWZpbmUgVk1BTExPQ19TVEFSVCBBU01fQ09OU1QoMHhEMDAwMDAwMDAwMDAwMDAwKQotI2RlZmluZSBWTUFMTE9DX1NJWkUgIEFTTV9DT05TVCgweDgwMDAwMDAwMDAwKQorI2RlZmluZSBWTUFMTE9DX1NJWkUgIChQR1RBQkxFX1JBTkdFID4+IDEpCiAjZGVmaW5lIFZNQUxMT0NfRU5EICAgKFZNQUxMT0NfU1RBUlQgKyBWTUFMTE9DX1NJWkUpCiAKIC8qCi0gKiBEZWZpbmUgdGhlIGFkZHJlc3MgcmFuZ2Ugb2YgdGhlIGltYWxsb2MgVk0gYXJlYS4KKyAqIERlZmluZSB0aGUgYWRkcmVzcyByYW5nZXMgZm9yIE1NSU8gYW5kIElPIHNwYWNlIDoKKyAqCisgKiAgSVNBX0lPX0JBU0UgPSBWTUFMTE9DX0VORCwgNjRLIHJlc2VydmVkIGFyZWEKKyAqICBQSEJfSU9fQkFTRSA9IElTQV9JT19CQVNFICsgNjRLIHRvIElTQV9JT19CQVNFICsgMkcsIFBIQiBJTyBzcGFjZXMKKyAqIElPUkVNQVBfQkFTRSA9IElTQV9JT19CQVNFICsgMkcgdG8gVk1BTExPQ19TVEFSVCArIFBHVEFCTEVfUkFOR0UKICAqLwotI2RlZmluZSBQSEJTX0lPX0JBU0UJVk1BTExPQ19FTkQKLSNkZWZpbmUgSU1BTExPQ19CQVNFCShQSEJTX0lPX0JBU0UgKyAweDgwMDAwMDAwdWwpCS8qIFJlc2VydmUgMiBnaWdzIGZvciBQSEJzICovCi0jZGVmaW5lIElNQUxMT0NfRU5ECShWTUFMTE9DX1NUQVJUICsgUEdUQUJMRV9SQU5HRSkKKyNkZWZpbmUgRlVMTF9JT19TSVpFCTB4ODAwMDAwMDB1bAorI2RlZmluZSAgSVNBX0lPX0JBU0UJKFZNQUxMT0NfRU5EKQorI2RlZmluZSAgSVNBX0lPX0VORAkoVk1BTExPQ19FTkQgKyAweDEwMDAwdWwpCisjZGVmaW5lICBQSEJfSU9fQkFTRQkoSVNBX0lPX0VORCkKKyNkZWZpbmUgIFBIQl9JT19FTkQJKFZNQUxMT0NfRU5EICsgRlVMTF9JT19TSVpFKQorI2RlZmluZSBJT1JFTUFQX0JBU0UJKFBIQl9JT19FTkQpCisjZGVmaW5lIElPUkVNQVBfRU5ECShWTUFMTE9DX1NUQVJUICsgUEdUQUJMRV9SQU5HRSkKIAogLyoKICAqIFJlZ2lvbiBJRHMKQEAgLTEzNCwxNiArMTM5LDYgQEAKICNkZWZpbmUgX19TMTEwCVBBR0VfU0hBUkVEX1gKICNkZWZpbmUgX19TMTExCVBBR0VfU0hBUkVEX1gKIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyoKLSAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCi0gKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVtQQUdFX1NJWkUvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKLSNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCi0jZW5kaWYgLyogX19BU1NFTUJMWV9fICovCi0KICNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCiAKICNkZWZpbmUgSEFWRV9BUkNIX1VOTUFQUEVEX0FSRUEKQEAgLTIzMiw5ICsyMjcsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSO30KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXO30KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUM7fQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7fQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7fQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFO30KQEAgLTI0MiwyMCArMjM1LDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX3VuY2FjaGUocHRlX3QgcHRlKSB7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9OT19DQUNIRTsgfQogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9jYWNoZShwdGVfdCBwdGUpICAgeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX05PX0NBQ0hFOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SVyk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfRElSVFkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUiB8IF9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JXOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkgewpAQCAtMzA3LDI5ICsyOTIsNiBAQAogCV9fcjsJCQkJCQkJCSAgIFwKIH0pCiAKLS8qCi0gKiBPbiBSVy9ESVJUWSBiaXQgdHJhbnNpdGlvbnMgd2UgY2FuIGF2b2lkIGZsdXNoaW5nIHRoZSBocHRlLiBGb3IgdGhlCi0gKiBtb21lbnQgd2UgYWx3YXlzIGZsdXNoIGJ1dCB3ZSBuZWVkIHRvIGZpeCBocHRlX3VwZGF0ZSBhbmQgdGVzdCBpZiB0aGUKLSAqIG9wdGltaXNhdGlvbiBpcyB3b3J0aCBpdC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19wdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXVuc2lnbmVkIGxvbmcgb2xkOwotCi0gICAgICAgCWlmICgocHRlX3ZhbCgqcHRlcCkgJiBfUEFHRV9ESVJUWSkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0Jb2xkID0gcHRlX3VwZGF0ZShtbSwgYWRkciwgcHRlcCwgX1BBR0VfRElSVFksIDApOwotCXJldHVybiAob2xkICYgX1BBR0VfRElSVFkpICE9IDA7Ci19Ci0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKLSNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShfX3ZtYSwgX19hZGRyLCBfX3B0ZXApCQkgICBcCi0oewkJCQkJCQkJCSAgIFwKLQlpbnQgX19yOwkJCQkJCQkgICBcCi0JX19yID0gX19wdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KChfX3ZtYSktPnZtX21tLCBfX2FkZHIsIF9fcHRlcCk7IFwKLQlfX3I7CQkJCQkJCQkgICBcCi19KQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogc3RhdGljIGlubGluZSB2b2lkIHB0ZXBfc2V0X3dycHJvdGVjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICAgIHB0ZV90ICpwdGVwKQpAQCAtMzU3LDE0ICszMTksNiBAQAogCV9feW91bmc7CQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ESVJUWV9GTFVTSAotI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCWludCBfX2RpcnR5ID0gX19wdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KChfX3ZtYSktPnZtX21tLCBfX2FkZHJlc3MsIFwKLQkJCQkJCSAgX19wdGVwKTsgCQlcCi0JX19kaXJ0eTsJCQkJCQkJXAotfSkKLQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQpAQCAtNDQyLDEwICszOTYsNiBAQAogI2RlZmluZSBwZ2RfRVJST1IoZSkgXAogCXByaW50aygiJXM6JWQ6IGJhZCBwZ2QgJTA4bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHBnZF92YWwoZSkpCiAKLWV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltdOwotCi1leHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKLQogLyogRW5jb2RlIGFuZCBkZS1jb2RlIGEgc3dhcCBlbnRyeSAqLwogI2RlZmluZSBfX3N3cF90eXBlKGVudHJ5KQkoKChlbnRyeSkudmFsID4+IDEpICYgMHgzZikKICNkZWZpbmUgX19zd3Bfb2Zmc2V0KGVudHJ5KQkoKGVudHJ5KS52YWwgPj4gOCkKQEAgLTQ1NiwxNyArNDA2LDYgQEAKICNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJKChwdGVfdCkgeygob2ZmKSA8PCBQVEVfUlBOX1NISUZUKXxfUEFHRV9GSUxFfSkKICNkZWZpbmUgUFRFX0ZJTEVfTUFYX0JJVFMJKEJJVFNfUEVSX0xPTkcgLSBQVEVfUlBOX1NISUZUKQogCi0vKgotICoga2Vybl9hZGRyX3ZhbGlkIGlzIGludGVuZGVkIHRvIGluZGljYXRlIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBhIHZhbGlkCi0gKiBrZXJuZWwgYWRkcmVzcy4gIE1vc3QgMzItYml0IGFyY2hzIGRlZmluZSBpdCBhcyBhbHdheXMgdHJ1ZSAobGlrZSB0aGlzKQotICogYnV0IG1vc3QgNjQtYml0IGFyY2hzIGFjdHVhbGx5IHBlcmZvcm0gYSB0ZXN0LiAgV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KLSAqIFRoZSBvbmx5IHVzZSBpcyBpbiBmcy9uY3Bmcy9kaXIuYwotICovCi0jZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKQkoMSkKLQotI2RlZmluZSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQkJXAotCQlyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQotCiB2b2lkIHBndGFibGVfY2FjaGVfaW5pdCh2b2lkKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKaW5kZXggNzhiZjRhZS4uZDE4ZmZlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKQEAgLTIsNiArMiwxMyBAQAogI2RlZmluZSBfQVNNX1BPV0VSUENfUEdUQUJMRV9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIEZvciBUQVNLX1NJWkUgKi8KKyNpbmNsdWRlIDxhc20vbW11Lmg+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+CiAjaW5jbHVkZSA8bGludXgva2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciB7CiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCmluZGV4IGZjY2M2ZTUuLjhjYTdjYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXVkaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKQEAgLTYzLDkgKzYzLDEyIEBACiAjZGVmaW5lIEFVRElUX0FERF9SVUxFCQkxMDExCS8qIEFkZCBzeXNjYWxsIGZpbHRlcmluZyBydWxlICovCiAjZGVmaW5lIEFVRElUX0RFTF9SVUxFCQkxMDEyCS8qIERlbGV0ZSBzeXNjYWxsIGZpbHRlcmluZyBydWxlICovCiAjZGVmaW5lIEFVRElUX0xJU1RfUlVMRVMJMTAxMwkvKiBMaXN0IHN5c2NhbGwgZmlsdGVyaW5nIHJ1bGVzICovCisjZGVmaW5lIEFVRElUX1RUWV9HRVQJCTEwMTQJLyogR2V0IFRUWSBhdWRpdGluZyBzdGF0dXMgKi8KKyNkZWZpbmUgQVVESVRfVFRZX1NFVAkJMTAxNQkvKiBTZXQgVFRZIGF1ZGl0aW5nIHN0YXR1cyAqLwogCiAjZGVmaW5lIEFVRElUX0ZJUlNUX1VTRVJfTVNHCTExMDAJLyogVXNlcnNwYWNlIG1lc3NhZ2VzIG1vc3RseSB1bmludGVyZXN0aW5nIHRvIGtlcm5lbCAqLwogI2RlZmluZSBBVURJVF9VU0VSX0FWQwkJMTEwNwkvKiBXZSBmaWx0ZXIgdGhpcyBkaWZmZXJlbnRseSAqLworI2RlZmluZSBBVURJVF9VU0VSX1RUWQkJMTEyNAkvKiBOb24tSUNBTk9OIFRUWSBpbnB1dCBtZWFuaW5nICovCiAjZGVmaW5lIEFVRElUX0xBU1RfVVNFUl9NU0cJMTE5OQogI2RlZmluZSBBVURJVF9GSVJTVF9VU0VSX01TRzIJMjEwMAkvKiBNb3JlIHVzZXIgc3BhY2UgbWVzc2FnZXMgKi8KICNkZWZpbmUgQVVESVRfTEFTVF9VU0VSX01TRzIJMjk5OQpAQCAtOTIsNiArOTUsNyBAQAogI2RlZmluZSBBVURJVF9LRVJORUxfT1RIRVIJMTMxNgkvKiBGb3IgdXNlIGJ5IDNyZCBwYXJ0eSBtb2R1bGVzICovCiAjZGVmaW5lIEFVRElUX0ZEX1BBSVIJCTEzMTcgICAgLyogYXVkaXQgcmVjb3JkIGZvciBwaXBlL3NvY2tldHBhaXIgKi8KICNkZWZpbmUgQVVESVRfT0JKX1BJRAkJMTMxOAkvKiBwdHJhY2UgdGFyZ2V0ICovCisjZGVmaW5lIEFVRElUX1RUWQkJMTMxOQkvKiBJbnB1dCBvbiBhbiBhZG1pbmlzdHJhdGl2ZSBUVFkgKi8KIAogI2RlZmluZSBBVURJVF9BVkMJCTE0MDAJLyogU0UgTGludXggYXZjIGRlbmlhbCBvciBncmFudCAqLwogI2RlZmluZSBBVURJVF9TRUxJTlVYX0VSUgkxNDAxCS8qIEludGVybmFsIFNFIExpbnV4IEVycm9ycyAqLwpAQCAtMjg5LDYgKzI5MywxMCBAQAogCV9fdTMyCQliYWNrbG9nOwkvKiBtZXNzYWdlcyB3YWl0aW5nIGluIHF1ZXVlICovCiB9OwogCitzdHJ1Y3QgYXVkaXRfdHR5X3N0YXR1cyB7CisJX191MzIJCWVuYWJsZWQ7IC8qIDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KK307CisKIC8qIGF1ZGl0X3J1bGVfZGF0YSBzdXBwb3J0cyBmaWx0ZXIgcnVsZXMgd2l0aCBib3RoIGludGVnZXIgYW5kIHN0cmluZwogICogZmllbGRzLiAgSXQgY29ycmVzcG9uZHMgd2l0aCBBVURJVF9BRERfUlVMRSwgQVVESVRfREVMX1JVTEUgYW5kCiAgKiBBVURJVF9MSVNUX1JVTEVTIHJlcXVlc3RzLgpAQCAtNTE1LDExICs1MjMsMTMgQEAKIAkJCQkJICAgICBjb25zdCBjaGFyICpwcmVmaXgsCiAJCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50KTsKK2V4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nX2xvc3QoY29uc3QgY2hhciAqbWVzc2FnZSk7CiAJCQkJLyogUHJpdmF0ZSBBUEkgKGZvciBhdWRpdC5jIG9ubHkpICovCiBleHRlcm4gaW50IGF1ZGl0X2ZpbHRlcl91c2VyKHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqY2IsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgYXVkaXRfZmlsdGVyX3R5cGUoaW50IHR5cGUpOwogZXh0ZXJuIGludCAgYXVkaXRfcmVjZWl2ZV9maWx0ZXIoaW50IHR5cGUsIGludCBwaWQsIGludCB1aWQsIGludCBzZXEsCiAJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFzeiwgdWlkX3QgbG9naW51aWQsIHUzMiBzaWQpOworZXh0ZXJuIGludCBhdWRpdF9lbmFibGVkOwogI2Vsc2UKICNkZWZpbmUgYXVkaXRfbG9nKGMsZyx0LGYsLi4uKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX3N0YXJ0KGMsZyx0KSAoeyBOVUxMOyB9KQpAQCAtNTMwLDYgKzU0MCw3IEBACiAjZGVmaW5lIGF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYSxzKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKGEsbixzKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX2RfcGF0aChiLHAsZCx2KSBkbyB7IDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYXVkaXRfZW5hYmxlZCAwCiAjZW5kaWYKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmggYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKaW5kZXggZjI1NDJjMi4uNzAxMWQ2MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKQEAgLTkzLDcgKzkzLDYgQEAKIHZvaWQgY2xlYXJfYmRpX2Nvbmdlc3RlZChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgcncpOwogdm9pZCBzZXRfYmRpX2Nvbmdlc3RlZChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgcncpOwogbG9uZyBjb25nZXN0aW9uX3dhaXQoaW50IHJ3LCBsb25nIHRpbWVvdXQpOwotbG9uZyBjb25nZXN0aW9uX3dhaXRfaW50ZXJydXB0aWJsZShpbnQgcncsIGxvbmcgdGltZW91dCk7CiB2b2lkIGNvbmdlc3Rpb25fZW5kKGludCBydyk7CiAKICNkZWZpbmUgYmRpX2NhcF93cml0ZWJhY2tfZGlydHkoYmRpKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCBmYWUxMzhiLi5mNzg5NjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9ic2cuaD4KIAogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogCkBAIC00MSw2ICs0Miw4IEBACiB0eXBlZGVmIHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSBlbGV2YXRvcl90Owogc3RydWN0IHJlcXVlc3RfcG1fc3RhdGU7CiBzdHJ1Y3QgYmxrX3RyYWNlOworc3RydWN0IHJlcXVlc3Q7CitzdHJ1Y3Qgc2dfaW9faGRyOwogCiAjZGVmaW5lIEJMS0RFVl9NSU5fUlEJNAogI2RlZmluZSBCTEtERVZfTUFYX1JRCTEyOAkvKiBEZWZhdWx0IG1heGltdW0gKi8KQEAgLTMxNCw2ICszMTcsOSBAQAogCSAqLwogCXJxX2VuZF9pb19mbiAqZW5kX2lvOwogCXZvaWQgKmVuZF9pb19kYXRhOworCisJLyogZm9yIGJpZGkgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqbmV4dF9ycTsKIH07CiAKIC8qCkBAIC00NjgsNiArNDc0LDEwIEBACiAJdW5zaWduZWQgaW50CQliaV9zaXplOwogCiAJc3RydWN0IG11dGV4CQlzeXNmc19sb2NrOworCisjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9CU0cpCisJc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgYnNnX2RldjsKKyNlbmRpZgogfTsKIAogI2RlZmluZSBRVUVVRV9GTEFHX0NMVVNURVIJMAkvKiBjbHVzdGVyIHNldmVyYWwgc2VnbWVudHMgaW50byAxICovCkBAIC00NzksNiArNDg5LDcgQEAKICNkZWZpbmUgUVVFVUVfRkxBR19SRUVOVEVSCTYJLyogUmUtZW50cmFuY3kgYXZvaWRhbmNlICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfUExVR0dFRAk3CS8qIHF1ZXVlIGlzIHBsdWdnZWQgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19FTFZTV0lUQ0gJOAkvKiBkb24ndCB1c2UgZWxldmF0b3IsIGp1c3QgZG8gRklGTyAqLworI2RlZmluZSBRVUVVRV9GTEFHX0JJREkJCTkJLyogcXVldWUgc3VwcG9ydHMgYmlkaSByZXF1ZXN0cyAqLwogCiBlbnVtIHsKIAkvKgpAQCAtNTQzLDYgKzU1NCw3IEBACiAjZGVmaW5lIGJsa19zb3J0ZWRfcnEocnEpCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfU09SVEVEKQogI2RlZmluZSBibGtfYmFycmllcl9ycShycSkJKChycSktPmNtZF9mbGFncyAmIFJFUV9IQVJEQkFSUklFUikKICNkZWZpbmUgYmxrX2Z1YV9ycShycSkJCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfRlVBKQorI2RlZmluZSBibGtfYmlkaV9ycShycSkJCSgocnEpLT5uZXh0X3JxICE9IE5VTEwpCiAKICNkZWZpbmUgbGlzdF9lbnRyeV9ycShwdHIpCWxpc3RfZW50cnkoKHB0ciksIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpCiAKQEAgLTYwNyw3ICs2MTksMTIgQEAKICNkZWZpbmUgQkxLX0JPVU5DRV9BTlkJCSgodTY0KWJsa19tYXhfcGZuIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIEJMS19CT1VOQ0VfSVNBCQkoSVNBX0RNQV9USFJFU0hPTEQpCiAKLSNpZmRlZiBDT05GSUdfTU1VCisvKgorICogZGVmYXVsdCB0aW1lb3V0IGZvciBTR19JTyBpZiBub25lIHNwZWNpZmllZAorICovCisjZGVmaW5lIEJMS19ERUZBVUxUX1NHX1RJTUVPVVQJKDYwICogSFopCisKKyNpZmRlZiBDT05GSUdfQk9VTkNFCiBleHRlcm4gaW50IGluaXRfZW1lcmdlbmN5X2lzYV9wb29sKHZvaWQpOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2JvdW5jZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKipiaW8pOwogI2Vsc2UKQEAgLTYzNyw3ICs2NTQsOCBAQAogZXh0ZXJuIHZvaWQgYmxrX3BsdWdfZGV2aWNlKHJlcXVlc3RfcXVldWVfdCAqKTsKIGV4dGVybiBpbnQgYmxrX3JlbW92ZV9wbHVnKHJlcXVlc3RfcXVldWVfdCAqKTsKIGV4dGVybiB2b2lkIGJsa19yZWNvdW50X3NlZ21lbnRzKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgYmlvICopOwotZXh0ZXJuIGludCBzY3NpX2NtZF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZ2VuZGlzayAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopOworZXh0ZXJuIGludCBzY3NpX2NtZF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLAorCQkJICBzdHJ1Y3QgZ2VuZGlzayAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopOwogZXh0ZXJuIGludCBzZ19zY3NpX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosCiAJCXN0cnVjdCBnZW5kaXNrICosIHN0cnVjdCBzY3NpX2lvY3RsX2NvbW1hbmQgX191c2VyICopOwogCkBAIC02ODAsNiArNjk4LDEyIEBACiAJCQkgIHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiBleHRlcm4gdm9pZCBibGtfZXhlY3V0ZV9ycV9ub3dhaXQocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBnZW5kaXNrICosCiAJCQkJICBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIHJxX2VuZF9pb19mbiAqKTsKK2V4dGVybiBpbnQgYmxrX2ZpbGxfc2doZHJfcnEocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosCisJCSAgICAgIHN0cnVjdCBzZ19pb19oZHIgKiwgaW50KTsKK2V4dGVybiBpbnQgYmxrX3VubWFwX3NnaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzZ19pb19oZHIgKik7CitleHRlcm4gaW50IGJsa19jb21wbGV0ZV9zZ2hkcl9ycShzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3Qgc2dfaW9faGRyICosCisJCQkgIHN0cnVjdCBiaW8gKik7CitleHRlcm4gaW50IGJsa192ZXJpZnlfY29tbWFuZCh1bnNpZ25lZCBjaGFyICosIGludCk7CiAKIHN0YXRpYyBpbmxpbmUgcmVxdWVzdF9xdWV1ZV90ICpiZGV2X2dldF9xdWV1ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ic2cuaCBiL2luY2x1ZGUvbGludXgvYnNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5OThjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYnNnLmgKQEAgLTAsMCArMSw3MCBAQAorI2lmbmRlZiBCU0dfSAorI2RlZmluZSBCU0dfSAorCisjZGVmaW5lIEJTR19QUk9UT0NPTF9TQ1NJCQkwCisKKyNkZWZpbmUgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX0NNRAkwCisjZGVmaW5lIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9UTUYJMQorI2RlZmluZSBCU0dfU1VCX1BST1RPQ09MX1NDU0lfVFJBTlNQT1JUCTIKKworc3RydWN0IHNnX2lvX3Y0IHsKKwlfX3MzMiBndWFyZDsJCS8qIFtpXSAnUScgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIHYzICovCisJX191MzIgcHJvdG9jb2w7CQkvKiBbaV0gMCAtPiBTQ1NJICwgLi4uLiAqLworCV9fdTMyIHN1YnByb3RvY29sOwkvKiBbaV0gMCAtPiBTQ1NJIGNvbW1hbmQsIDEgLT4gU0NTSSB0YXNrCisJCQkJICAgbWFuYWdlbWVudCBmdW5jdGlvbiwgLi4uLiAqLworCisJX191MzIgcmVxdWVzdF9sZW47CS8qIFtpXSBpbiBieXRlcyAqLworCV9fdTY0IHJlcXVlc3Q7CQkvKiBbaV0sIFsqaV0ge1NDU0k6IGNkYn0gKi8KKwlfX3UzMiByZXF1ZXN0X2F0dHI7CS8qIFtpXSB7U0NTSTogdGFzayBhdHRyaWJ1dGV9ICovCisJX191MzIgcmVxdWVzdF90YWc7CS8qIFtpXSB7U0NTSTogdGFzayB0YWcgKG9ubHkgaWYgZmxhZ2dlZCl9ICovCisJX191MzIgcmVxdWVzdF9wcmlvcml0eTsJLyogW2ldIHtTQ1NJOiB0YXNrIHByaW9yaXR5fSAqLworCV9fdTMyIG1heF9yZXNwb25zZV9sZW47CS8qIFtpXSBpbiBieXRlcyAqLworCV9fdTY0IHJlc3BvbnNlOwkJLyogW2ldLCBbKm9dIHtTQ1NJOiAoYXV0bylzZW5zZSBkYXRhfSAqLworCisJLyogImRpbl8iIGZvciBkYXRhIGluIChmcm9tIGRldmljZSk7ICJkb3V0XyIgZm9yIGRhdGEgb3V0ICh0byBkZXZpY2UpICovCisJX191MzIgZG91dF94ZmVyX2xlbjsJLyogW2ldIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkIHRvIGRldmljZSAqLworCV9fdTMyIGRpbl94ZmVyX2xlbjsJLyogW2ldIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlICovCisJX191NjQgZG91dF94ZmVycDsJLyogW2ldLCBbKmldICovCisJX191NjQgZGluX3hmZXJwOwkvKiBbaV0sIFsqb10gKi8KKworCV9fdTMyIHRpbWVvdXQ7CQkvKiBbaV0gdW5pdHM6IG1pbGxpc2Vjb25kICovCisJX191MzIgZmxhZ3M7CQkvKiBbaV0gYml0IG1hc2sgKi8KKwlfX3U2NCB1c3JfcHRyOwkJLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5ICovCisJX191MzIgc3BhcmVfaW47CQkvKiBbaV0gKi8KKworCV9fdTMyIGRyaXZlcl9zdGF0dXM7CS8qIFtvXSAwIC0+IG9rICovCisJX191MzIgdHJhbnNwb3J0X3N0YXR1czsJLyogW29dIDAgLT4gb2sgKi8KKwlfX3UzMiBkZXZpY2Vfc3RhdHVzOwkvKiBbb10ge1NDU0k6IGNvbW1hbmQgY29tcGxldGlvbiBzdGF0dXN9ICovCisJX191MzIgcmV0cnlfZGVsYXk7CS8qIFtvXSB7U0NTSTogc3RhdHVzIGF1eGlsaWFyeSBpbmZvcm1hdGlvbn0gKi8KKwlfX3UzMiBpbmZvOwkJLyogW29dIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KKwlfX3UzMiBkdXJhdGlvbjsJCS8qIFtvXSB0aW1lIHRvIGNvbXBsZXRlLCBpbiBtaWxsaXNlY29uZHMgKi8KKwlfX3UzMiByZXNwb25zZV9sZW47CS8qIFtvXSBieXRlcyBvZiByZXNwb25zZSBhY3R1YWxseSB3cml0dGVuICovCisJX19zMzIgZGluX3Jlc2lkOwkvKiBbb10gYWN0dWFsX2Rpbl94ZmVyX2xlbiAtIGRpbl94ZmVyX2xlbiAqLworCV9fdTMyIGdlbmVyYXRlZF90YWc7CS8qIFtvXSB7U0NTSTogdGFzayB0YWcgdGhhdCB0cmFuc3BvcnQgY2hvc2V9ICovCisJX191MzIgc3BhcmVfb3V0OwkvKiBbb10gKi8KKworCV9fdTMyIHBhZGRpbmc7Cit9OworCisjaWZkZWYgX19LRVJORUxfXworCisjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9CU0cpCitzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSB7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgbWlub3I7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKK307CisKK2V4dGVybiBpbnQgYnNnX3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCBic2dfdW5yZWdpc3Rlcl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKKyNlbHNlCitzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSB7IH07CisjZGVmaW5lIGJzZ19yZWdpc3Rlcl9xdWV1ZShkaXNrLCBuYW1lKQkJKDApCisjZGVmaW5lIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKGRpc2spCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnVnLmggYi9pbmNsdWRlL2xpbnV4L2J1Zy5oCmluZGV4IDQyYWEwYTUuLjU0Mzk4ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9idWcuaApAQCAtMTAsNiArMTAsOCBAQAogCUJVR19UUkFQX1RZUEVfQlVHID0gMiwKIH07CiAKK3N0cnVjdCBwdF9yZWdzOworCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQlVHCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CiAKQEAgLTIwLDcgKzIyLDcgQEAKIAogY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSAqZmluZF9idWcodW5zaWduZWQgbG9uZyBidWdhZGRyKTsKIAotZW51bSBidWdfdHJhcF90eXBlIHJlcG9ydF9idWcodW5zaWduZWQgbG9uZyBidWdfYWRkcik7CitlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIGludCAgbW9kdWxlX2J1Z19maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqLCBjb25zdCBFbGZfU2hkciAqLAogCQkJIHN0cnVjdCBtb2R1bGUgKik7CkBAIC0zMSw3ICszMyw4IEBACiAKICNlbHNlCS8qICFDT05GSUdfR0VORVJJQ19CVUcgKi8KIAotc3RhdGljIGlubGluZSBlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyKQorc3RhdGljIGlubGluZSBlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyLAorCQkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJcmV0dXJuIEJVR19UUkFQX1RZUEVfQlVHOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmggYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAppbmRleCBiYmY4ZGY3Li4yZGZhNTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApAQCAtNDQsNyArNDQsNiBAQAogICAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAKIC8qICNkZWZpbmUgU1RSSUNUX0NBUF9UX1RZUEVDSEVDS1MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2Ryb20uaCBiL2luY2x1ZGUvbGludXgvY2Ryb20uaAppbmRleCBmNTBmMDRiLi4yYjY0MWIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nkcm9tLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZHJvbS5oCkBAIC00MTQsOCArNDE0LDggQEAKICNkZWZpbmUgQ0RPX0NIRUNLX1RZUEUJCTB4MTAgICAgLyogY2hlY2sgdHlwZSBvbiBvcGVuIGZvciBkYXRhICovCiAKIC8qIFNwZWNpYWwgY29kZXMgdXNlZCB3aGVuIHNwZWNpZnlpbmcgY2hhbmdlciBzbG90cy4gKi8KLSNkZWZpbmUgQ0RTTF9OT05FICAgICAgIAkoKGludCkgKH4wVT4+MSktMSkKLSNkZWZpbmUgQ0RTTF9DVVJSRU5UICAgIAkoKGludCkgKH4wVT4+MSkpCisjZGVmaW5lIENEU0xfTk9ORSAgICAgICAJKElOVF9NQVgtMSkKKyNkZWZpbmUgQ0RTTF9DVVJSRU5UICAgIAlJTlRfTUFYCiAKIC8qIEZvciBwYXJ0aXRpb24gYmFzZWQgbXVsdGlzZXNzaW9uIGFjY2Vzcy4gSURFIGNhbiBoYW5kbGUgNjQgcGFydGl0aW9ucwogICogcGVyIGRyaXZlIC0gU0NTSSBDRC1ST00ncyB1c2UgbWlub3JzIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29iYWx0LW52cmFtLmggYi9pbmNsdWRlL2xpbnV4L2NvYmFsdC1udnJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQyOTU2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvY29iYWx0LW52cmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqICRJZDogY29iYWx0LW52cmFtLmgsdiAxLjIwIDIwMDEvMTAvMTcgMjM6MTY6NTUgdGhvY2tpbiBFeHAgJAotICogY29iYWx0LW52cmFtLmggOiBkZWZpbmVzIGZvciB0aGUgdmFyaW91cyBmaWVsZHMgaW4gdGhlIGNvYmFsdCBOVlJBTQotICoKLSAqIENvcHlyaWdodCAyMDAxLDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICovCi0KLSNpZm5kZWYgQ09CQUxUX05WUkFNX0gKLSNkZWZpbmUgQ09CQUxUX05WUkFNX0gKLQotI2luY2x1ZGUgPGxpbnV4L252cmFtLmg+Ci0KLSNkZWZpbmUgQ09CVF9DTU9TX0lORk9fTUFYCQkweDdmCS8qIHRvcCBhZGRyZXNzIGFsbG93ZWQgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0JJT1NfRFJJVkVfSU5GTwkweDEyCS8qIGRyaXZlIGluZm8gd291bGQgZ28gaGVyZSAqLwotCi0jZGVmaW5lIENPQlRfQ01PU19DS1NfU1RBUlQJCU5WUkFNX09GRlNFVCgweDBlKQotI2RlZmluZSBDT0JUX0NNT1NfQ0tTX0VORAkJTlZSQU1fT0ZGU0VUKDB4N2YpCi0KLS8qIGZsYWcgYnl0ZXMgLSAxNiBmbGFncyBmb3Igbm93LCBsZWF2ZSByb29tIGZvciBtb3JlICovCi0jZGVmaW5lIENPQlRfQ01PU19GTEFHX0JZVEVfMAkJTlZSQU1fT0ZGU0VUKDB4MTApCi0jZGVmaW5lIENPQlRfQ01PU19GTEFHX0JZVEVfMQkJTlZSQU1fT0ZGU0VUKDB4MTEpCi0KLS8qIGZsYWdzIGluIGZsYWcgYnl0ZXMgLSB1cCB0byAxNiAqLwotI2RlZmluZSBDT0JUX0NNT1NfRkxBR19NSU4JCTB4MDAwMQotI2RlZmluZSBDT0JUX0NNT1NfQ09OU09MRV9GTEFHCQkweDAwMDEgLyogY29uc29sZSBvbi9vZmYgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0RFQlVHX0ZMQUcJCTB4MDAwMiAvKiBST00gZGVidWcgbWVzc2FnZXMgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0FVVE9fUFJPTVBUX0ZMQUcJMHgwMDA0IC8qIGJvb3QgdG8gUk9NIHByb21wdD8gKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0NMRUFOX0JPT1RfRkxBRwkweDAwMDggLyogc2V0IGJ5IGEgY2xlYW4gc2h1dGRvd24gKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0hXX05PUFJPQkVfRkxBRwkweDAwMTAgLyogZ28gZWFzeSBvbiB0aGUgcHJvYmluZyAqLwotI2RlZmluZSBDT0JUX0NNT1NfU1lTRkFVTFRfRkxBRwkJMHgwMDIwIC8qIHN5c3RlbSBmYXVsdCBkZXRlY3RlZCAqLwotI2RlZmluZSBDT0JUX0NNT1NfT09QU1BBTklDX0ZMQUcJMHgwMDQwIC8qIHBhbmljIG9uIG9vcHMgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0RFTEFZX0NBQ0hFX0ZMQUcJMHgwMDgwIC8qIGRlbGF5IGNhY2hlIGluaXRpYWxpemF0aW9uICovCi0jZGVmaW5lIENPQlRfQ01PU19OT0xPR09fRkxBRwkJMHgwMTAwIC8qIGhpZGUgIkMiIGxvZ28gQCBib290ICovCi0jZGVmaW5lIENPQlRfQ01PU19WRVJTSU9OX0ZMQUcJCTB4MDIwMCAvKiB0aGUgdmVyc2lvbiBmaWVsZCBpcyB2YWxpZCAqLwotI2RlZmluZSBDT0JUX0NNT1NfRkxBR19NQVgJCTB4MDIwMAotCi0vKiBsZWF2ZSBieXRlIDB4MTIgYmxhbmsgLSBMaW51eCBsb29rcyBmb3IgZHJpdmUgaW5mbyBoZXJlICovCi0KLS8qIENNT1Mgc3RydWN0dXJlIHZlcnNpb24sIHZhbGlkIGlmIENPQlRfQ01PU19WRVJTSU9OX0ZMQUcgaXMgdHJ1ZSAqLwotI2RlZmluZSBDT0JUX0NNT1NfVkVSU0lPTgkJTlZSQU1fT0ZGU0VUKDB4MTMpCi0jZGVmaW5lIENPQlRfQ01PU19WRVJfQlRPQ09ERQkJMSAvKiBtaW4uIHZlcnNpb24gbmVlZGVkIGZvciBidG9jb2RlICovCi0KLS8qIGluZGV4IG9mIGRlZmF1bHQgYm9vdCBtZXRob2QgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfTUVUSE9ECQlOVlJBTV9PRkZTRVQoMHgyMCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX0RJU0sJMAotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfUk9NCTEKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX05FVAkyCi0KLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjEpCi0vKiBtYWpvciAjLCBtaW5vciAjIG9mIGZpcnN0IHRocm91Z2ggZm91cnRoIGJvb3QgZGV2aWNlICovCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjBfTUFKCQlOVlJBTV9PRkZTRVQoMHgyMSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMF9NSU4JCU5WUkFNX09GRlNFVCgweDIyKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYxX01BSgkJTlZSQU1fT0ZGU0VUKDB4MjMpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjFfTUlOCQlOVlJBTV9PRkZTRVQoMHgyNCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMl9NQUoJCU5WUkFNX09GRlNFVCgweDI1KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYyX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjYpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjNfTUFKCQlOVlJBTV9PRkZTRVQoMHgyNykKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWM19NSU4JCU5WUkFNX09GRlNFVCgweDI4KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVZfTUFYCQlOVlJBTV9PRkZTRVQoMHgyOCkKLQotLyogY2hlY2tzdW0gb2YgYnl0ZXMgMHhlLTB4N2YgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0NIRUNLU1VNCQlOVlJBTV9PRkZTRVQoMHgyZSkKLQotLyogcnVubmluZyB1cHRpbWUgY291bnRlciwgdW5pdHMgb2YgNSBtaW51dGVzICgzMiBiaXRzID1+IDQxMDAwIHllYXJzKSAqLwotI2RlZmluZSBDT0JUX0NNT1NfVVBUSU1FXzAJCU5WUkFNX09GRlNFVCgweDMwKQotI2RlZmluZSBDT0JUX0NNT1NfVVBUSU1FXzEJCU5WUkFNX09GRlNFVCgweDMxKQotI2RlZmluZSBDT0JUX0NNT1NfVVBUSU1FXzIJCU5WUkFNX09GRlNFVCgweDMyKQotI2RlZmluZSBDT0JUX0NNT1NfVVBUSU1FXzMJCU5WUkFNX09GRlNFVCgweDMzKQotCi0vKiBjb3VudCBvZiBzdWNjZXNzZnVsIGJvb3RzICgzMiBiaXRzKSAqLwotI2RlZmluZSBDT0JUX0NNT1NfQk9PVENPVU5UXzAJCU5WUkFNX09GRlNFVCgweDM4KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVENPVU5UXzEJCU5WUkFNX09GRlNFVCgweDM5KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVENPVU5UXzIJCU5WUkFNX09GRlNFVCgweDNhKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVENPVU5UXzMJCU5WUkFNX09GRlNFVCgweDNiKQotCi0vKiAxMyBieXRlczogc3lzdGVtIHNlcmlhbCBudW1iZXIsIHNhbWUgYXMgb24gdGhlIGJhY2sgb2YgdGhlIHN5c3RlbSAqLwotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV9MRU4JMTMKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMAkJTlZSQU1fT0ZGU0VUKDB4NDApCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzEJCU5WUkFNX09GRlNFVCgweDQxKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8yCQlOVlJBTV9PRkZTRVQoMHg0MikKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMwkJTlZSQU1fT0ZGU0VUKDB4NDMpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzQJCU5WUkFNX09GRlNFVCgweDQ0KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV81CQlOVlJBTV9PRkZTRVQoMHg0NSkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fNgkJTlZSQU1fT0ZGU0VUKDB4NDYpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzcJCU5WUkFNX09GRlNFVCgweDQ3KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV84CQlOVlJBTV9PRkZTRVQoMHg0OCkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fOQkJTlZSQU1fT0ZGU0VUKDB4NDkpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzEwCQlOVlJBTV9PRkZTRVQoMHg0YSkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMTEJCU5WUkFNX09GRlNFVCgweDRiKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8xMgkJTlZSQU1fT0ZGU0VUKDB4NGMpCi0vKiBjaGVja3N1bSBmb3Igc2VyaWFsIG51bSAtIDEgYnl0ZSAqLwotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV9DU1VNCU5WUkFNX09GRlNFVCgweDRmKQotCi0jZGVmaW5lIENPQlRfQ01PU19ST01fUkVWX01BSgkJTlZSQU1fT0ZGU0VUKDB4NTApCi0jZGVmaW5lIENPQlRfQ01PU19ST01fUkVWX01JTgkJTlZSQU1fT0ZGU0VUKDB4NTEpCi0jZGVmaW5lIENPQlRfQ01PU19ST01fUkVWX1JFVgkJTlZSQU1fT0ZGU0VUKDB4NTIpCi0KLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19DT0RFXzAJCU5WUkFNX09GRlNFVCgweDUzKQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0NPREVfMQkJTlZSQU1fT0ZGU0VUKDB4NTQpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fQ09ERV8yCQlOVlJBTV9PRkZTRVQoMHg1NSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19DT0RFXzMJCU5WUkFNX09GRlNFVCgweDU2KQotCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfQ1NVTQkJTlZSQU1fT0ZGU0VUKDB4NTcpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfMAkJTlZSQU1fT0ZGU0VUKDB4NTgpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfMQkJTlZSQU1fT0ZGU0VUKDB4NTkpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfMgkJTlZSQU1fT0ZGU0VUKDB4NWEpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fSVBfMwkJTlZSQU1fT0ZGU0VUKDB4NWIpCi0KLSNlbmRpZiAvKiBDT0JBTFRfTlZSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25maWdmcy5oIGIvaW5jbHVkZS9saW51eC9jb25maWdmcy5oCmluZGV4IGZlZjZmM2QuLjhjNjk2N2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29uZmlnZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmgKQEAgLTQwLDkgKzQwLDkgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNkZWZpbmUgQ09ORklHRlNfSVRFTV9OQU1FX0xFTgkyMAogCkBAIC03NSw3ICs3NSw2IEBACiBleHRlcm4gdm9pZCBjb25maWdfaXRlbV9pbml0X3R5cGVfbmFtZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0sCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgICAgIHN0cnVjdCBjb25maWdfaXRlbV90eXBlICp0eXBlKTsKLWV4dGVybiB2b2lkIGNvbmZpZ19pdGVtX2NsZWFudXAoc3RydWN0IGNvbmZpZ19pdGVtICopOwogCiBleHRlcm4gc3RydWN0IGNvbmZpZ19pdGVtICogY29uZmlnX2l0ZW1fZ2V0KHN0cnVjdCBjb25maWdfaXRlbSAqKTsKIGV4dGVybiB2b2lkIGNvbmZpZ19pdGVtX3B1dChzdHJ1Y3QgY29uZmlnX2l0ZW0gKik7CkBAIC04NywxMiArODYsMTAgQEAKIAlzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlCQkqKmN0X2F0dHJzOwogfTsKIAotCiAvKioKICAqCWdyb3VwIC0gYSBncm91cCBvZiBjb25maWdfaXRlbXMgb2YgYSBzcGVjaWZpYyB0eXBlLCBiZWxvbmdpbmcKICAqCXRvIGEgc3BlY2lmaWMgc3Vic3lzdGVtLgogICovCi0KIHN0cnVjdCBjb25maWdfZ3JvdXAgewogCXN0cnVjdCBjb25maWdfaXRlbQkJY2dfaXRlbTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQljZ19jaGlsZHJlbjsKQEAgLTEwMCwxMyArOTcsMTEgQEAKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwCQkqKmRlZmF1bHRfZ3JvdXBzOwogfTsKIAotCiBleHRlcm4gdm9pZCBjb25maWdfZ3JvdXBfaW5pdChzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCk7CiBleHRlcm4gdm9pZCBjb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsCiAJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCXN0cnVjdCBjb25maWdfaXRlbV90eXBlICp0eXBlKTsKIAotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjb25maWdfZ3JvdXAgKnRvX2NvbmZpZ19ncm91cChzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCiB7CiAJcmV0dXJuIGl0ZW0gPyBjb250YWluZXJfb2YoaXRlbSxzdHJ1Y3QgY29uZmlnX2dyb3VwLGNnX2l0ZW0pIDogTlVMTDsKQEAgLTEyMiw3ICsxMTcsOCBAQAogCWNvbmZpZ19pdGVtX3B1dCgmZ3JvdXAtPmNnX2l0ZW0pOwogfQogCi1leHRlcm4gc3RydWN0IGNvbmZpZ19pdGVtICpjb25maWdfZ3JvdXBfZmluZF9vYmooc3RydWN0IGNvbmZpZ19ncm91cCAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHN0cnVjdCBjb25maWdfaXRlbSAqY29uZmlnX2dyb3VwX2ZpbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2dyb3VwICosCisJCQkJCQkgIGNvbnN0IGNoYXIgKik7CiAKIAogc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSB7CkBAIC0xMzEsNiArMTI3LDIyIEBACiAJbW9kZV90CQkJY2FfbW9kZTsKIH07CiAKKy8qCisgKiBVc2VycyBvZnRlbiBuZWVkIHRvIGNyZWF0ZSBhdHRyaWJ1dGUgc3RydWN0dXJlcyBmb3IgdGhlaXIgY29uZmlndXJhYmxlCisgKiBhdHRyaWJ1dGVzLCBjb250YWluaW5nIGEgY29uZmlnZnNfYXR0cmlidXRlIG1lbWJlciBhbmQgZnVuY3Rpb24gcG9pbnRlcnMKKyAqIGZvciB0aGUgc2hvdygpIGFuZCBzdG9yZSgpIG9wZXJhdGlvbnMgb24gdGhhdCBhdHRyaWJ1dGUuIFRoZXkgY2FuIHVzZQorICogdGhpcyBtYWNybyAoc2ltaWxhciB0byBzeXNmcycgX19BVFRSKSB0byBtYWtlIGRlZmluaW5nIGF0dHJpYnV0ZXMgZWFzaWVyLgorICovCisjZGVmaW5lIF9fQ09ORklHRlNfQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCQkJXAorewkJCQkJCQkJCVwKKwkuYXR0cgk9IHsJCQkJCQkJXAorCQkJLmNhX25hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksCQkJXAorCQkJLmNhX21vZGUgPSBfbW9kZSwJCQkJXAorCQkJLmNhX293bmVyID0gVEhJU19NT0RVTEUsCQkJXAorCX0sCQkJCQkJCQlcCisJLnNob3cJPSBfc2hvdywJCQkJCQlcCisJLnN0b3JlCT0gX3N0b3JlLAkJCQkJCVwKK30KIAogLyoKICAqIElmIGFsbG93X2xpbmsoKSBleGlzdHMsIHRoZSBpdGVtIGNhbiBzeW1saW5rKDIpIG91dCB0byBvdGhlcgpAQCAtMTU3LDEyICsxNjksMTMgQEAKIAlzdHJ1Y3QgY29uZmlnX2l0ZW0gKigqbWFrZV9pdGVtKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwgY29uc3QgY2hhciAqbmFtZSk7CiAJc3RydWN0IGNvbmZpZ19ncm91cCAqKCptYWtlX2dyb3VwKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwgY29uc3QgY2hhciAqbmFtZSk7CiAJaW50ICgqY29tbWl0X2l0ZW0pKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CisJdm9pZCAoKmRpc2Nvbm5lY3Rfbm90aWZ5KShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwgc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKIAl2b2lkICgqZHJvcF9pdGVtKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwgc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKIH07CiAKIHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gewogCXN0cnVjdCBjb25maWdfZ3JvdXAJc3VfZ3JvdXA7Ci0Jc3RydWN0IHNlbWFwaG9yZQlzdV9zZW07CisJc3RydWN0IG11dGV4CQlzdV9tdXRleDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqdG9fY29uZmlnZnNfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwKQpAQCAtMTc1LDYgKzE4OCwxMSBAQAogaW50IGNvbmZpZ2ZzX3JlZ2lzdGVyX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMpOwogdm9pZCBjb25maWdmc191bnJlZ2lzdGVyX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMpOwogCisvKiBUaGVzZSBmdW5jdGlvbnMgY2FuIHNsZWVwIGFuZCBjYW4gYWxsb2Mgd2l0aCBHRlBfS0VSTkVMICovCisvKiBXQVJOSU5HOiBUaGVzZSBjYW5ub3QgYmUgY2FsbGVkIHVuZGVybmVhdGggY29uZmlnZnMgY2FsbGJhY2tzISEgKi8KK2ludCBjb25maWdmc19kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMsIHN0cnVjdCBjb25maWdfaXRlbSAqdGFyZ2V0KTsKK3ZvaWQgY29uZmlnZnNfdW5kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMsIHN0cnVjdCBjb25maWdfaXRlbSAqdGFyZ2V0KTsKKwogI2VuZGlmICAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfQ09ORklHRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29uc29sZS5oIGIvaW5jbHVkZS9saW51eC9jb25zb2xlLmgKaW5kZXggNjJlZjZlMS4uNTZhN2JjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25zb2xlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25zb2xlLmgKQEAgLTE1LDcgKzE1LDYgQEAKICNkZWZpbmUgX0xJTlVYX0NPTlNPTEVfSF8gMQogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdHJ1Y3QgdmNfZGF0YTsKIHN0cnVjdCBjb25zb2xlX2ZvbnRfb3A7CkBAIC05OSw2ICs5OCw3IEBACiAJc3RydWN0IHR0eV9kcml2ZXIgKigqZGV2aWNlKShzdHJ1Y3QgY29uc29sZSAqLCBpbnQgKik7CiAJdm9pZAkoKnVuYmxhbmspKHZvaWQpOwogCWludAkoKnNldHVwKShzdHJ1Y3QgY29uc29sZSAqLCBjaGFyICopOworCWludAkoKmVhcmx5X3NldHVwKSh2b2lkKTsKIAlzaG9ydAlmbGFnczsKIAlzaG9ydAlpbmRleDsKIAlpbnQJY2ZsYWc7CkBAIC0xMDcsNiArMTA3LDcgQEAKIH07CiAKIGV4dGVybiBpbnQgYWRkX3ByZWZlcnJlZF9jb25zb2xlKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm9wdGlvbnMpOworZXh0ZXJuIGludCB1cGRhdGVfY29uc29sZV9jbWRsaW5lKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm5hbWVfbmV3LCBpbnQgaWR4X25ldywgY2hhciAqb3B0aW9ucyk7CiBleHRlcm4gdm9pZCByZWdpc3Rlcl9jb25zb2xlKHN0cnVjdCBjb25zb2xlICopOwogZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2NvbnNvbGUoc3RydWN0IGNvbnNvbGUgKik7CiBleHRlcm4gc3RydWN0IGNvbnNvbGUgKmNvbnNvbGVfZHJpdmVyczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29uc29sZW1hcC5oIGIvaW5jbHVkZS9saW51eC9jb25zb2xlbWFwLmgKaW5kZXggODJjOWExZi4uMDZiMjc2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25zb2xlbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25zb2xlbWFwLmgKQEAgLTgsOSArOCwxMiBAQAogI2RlZmluZSBJQk1QQ19NQVAgMgogI2RlZmluZSBVU0VSX01BUCAzCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiBzdHJ1Y3QgdmNfZGF0YTsKIAotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgaW52ZXJzZV90cmFuc2xhdGUoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGludCBnbHlwaCk7CitleHRlcm4gdTE2IGludmVyc2VfdHJhbnNsYXRlKHN0cnVjdCB2Y19kYXRhICpjb25wLCBpbnQgZ2x5cGgsIGludCB1c2VfdW5pY29kZSk7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgKnNldF90cmFuc2xhdGUoaW50IG0sIHN0cnVjdCB2Y19kYXRhICp2Yyk7CiBleHRlcm4gaW50IGNvbnZfdW5pX3RvX3BjKHN0cnVjdCB2Y19kYXRhICpjb25wLCBsb25nIHVjcyk7CitleHRlcm4gdTMyIGNvbnZfOGJpdF90b191bmkodW5zaWduZWQgY2hhciBjKTsKIHZvaWQgY29uc29sZV9tYXBfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1LmggYi9pbmNsdWRlL2xpbnV4L2NwdS5oCmluZGV4IDNiMmRmMjUuLmMyMjM2YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHUuaApAQCAtMTIwLDcgKzEyMCw2IEBACiAKICNkZWZpbmUgbG9ja19jcHVfaG90cGx1ZygpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgdW5sb2NrX2NwdV9ob3RwbHVnKCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBsb2NrX2NwdV9ob3RwbHVnX2ludGVycnVwdGlibGUoKSAwCiAjZGVmaW5lIGhvdGNwdV9ub3RpZmllcihmbiwgcHJpKQlkbyB7ICh2b2lkKShmbik7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcihuYikJZG8geyAodm9pZCkobmIpOyB9IHdoaWxlICgwKQogI2RlZmluZSB1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcihuYikJZG8geyAodm9pZCkobmIpOyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmM3LmggYi9pbmNsdWRlL2xpbnV4L2NyYzcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg2ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jcmM3LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfTElOVVhfQ1JDN19ICisjZGVmaW5lIF9MSU5VWF9DUkM3X0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitleHRlcm4gY29uc3QgdTggY3JjN19zeW5kcm9tZV90YWJsZVsyNTZdOworCitzdGF0aWMgaW5saW5lIHU4IGNyYzdfYnl0ZSh1OCBjcmMsIHU4IGRhdGEpCit7CisJcmV0dXJuIGNyYzdfc3luZHJvbWVfdGFibGVbKGNyYyA8PCAxKSBeIGRhdGFdOworfQorCitleHRlcm4gdTggY3JjNyh1OCBjcmMsIGNvbnN0IHU4ICpidWZmZXIsIHNpemVfdCBsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaAppbmRleCA5YTY2M2M2Li4yZGMyMWNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCkBAIC0zMSw3ICszMSwxMSBAQAogCQkoZG1hX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpKTsKIH0KIAorI2lmZGVmIENPTkZJR19IQVNfRE1BCiAjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+CisjZWxzZQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oPgorI2VuZGlmCiAKIC8qIEJhY2t3YXJkcyBjb21wYXQsIHJlbW92ZSBpbiAyLjcueCAqLwogI2RlZmluZSBkbWFfc3luY19zaW5nbGUJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RzMTcyODdydGMuaCBiL2luY2x1ZGUvbGludXgvZHMxNzI4N3J0Yy5oCmluZGV4IGMyODFiYTQuLmQ4NWQzZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHMxNzI4N3J0Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvZHMxNzI4N3J0Yy5oCkBAIC0xMSw3ICsxMSw2IEBACiAjZGVmaW5lIF9fTElOVVhfRFMxNzI4N1JUQ19ICiAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4JCQkvKiBnZXQgdGhlIHVzZXItbGV2ZWwgQVBJICovCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4JCS8qIHNwaW5sb2NrX3QgKi8KICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogCiAvKiBSZWdpc3RlciBBICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Vmc19mcy5oIGIvaW5jbHVkZS9saW51eC9lZnNfZnMuaAppbmRleCBkZmVkODAwLi4xNmNiMjVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Vmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZWZzX2ZzLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKIGV4dGVybiBpbnQgZWZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwogCiBleHRlcm4gc3RydWN0IGRlbnRyeSAqZWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmVmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKTsKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICplZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICopOwogZXh0ZXJuIGludCBlZnNfYm1hcChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHBvcnRmcy5oIGIvaW5jbHVkZS9saW51eC9leHBvcnRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzJmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2V4cG9ydGZzLmgKQEAgLTAsMCArMSwxMjYgQEAKKyNpZm5kZWYgTElOVVhfRVhQT1JURlNfSAorI2RlZmluZSBMSU5VWF9FWFBPUlRGU19IIDEKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBkZW50cnk7CitzdHJ1Y3Qgc3VwZXJfYmxvY2s7CitzdHJ1Y3QgdmZzbW91bnQ7CisKKworLyoqCisgKiBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgLSBmb3IgbmZzZCB0byBjb21tdW5pY2F0ZSB3aXRoIGZpbGUgc3lzdGVtcworICogQGRlY29kZV9maDogICAgICBkZWNvZGUgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCBhbmQgcmV0dXJuIGEgJnN0cnVjdCBkZW50cnkKKyAqIEBlbmNvZGVfZmg6ICAgICAgZW5jb2RlIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQgZnJvbSBhIGRlbnRyeQorICogQGdldF9uYW1lOiAgICAgICBmaW5kIHRoZSBuYW1lIGZvciBhIGdpdmVuIGlub2RlIGluIGEgZ2l2ZW4gZGlyZWN0b3J5CisgKiBAZ2V0X3BhcmVudDogICAgIGZpbmQgdGhlIHBhcmVudCBvZiBhIGdpdmVuIGRpcmVjdG9yeQorICogQGdldF9kZW50cnk6ICAgICBmaW5kIGEgZGVudHJ5IGZvciB0aGUgaW5vZGUgZ2l2ZW4gYSBmaWxlIGhhbmRsZSBzdWItZnJhZ21lbnQKKyAqIEBmaW5kX2V4cG9ydGVkX2RlbnRyeToKKyAqCXNldCBieSB0aGUgZXhwb3J0aW5nIG1vZHVsZSB0byBhIHN0YW5kYXJkIGhlbHBlciBmdW5jdGlvbi4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIFRoZSBleHBvcnRfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBtZWFucyBmb3IgbmZzZCB0byBjb21tdW5pY2F0ZQorICogICAgd2l0aCBhIHBhcnRpY3VsYXIgZXhwb3J0ZWQgZmlsZSBzeXN0ZW0gIC0gcGFydGljdWxhcmx5IGVuYWJsaW5nIG5mc2QgYW5kCisgKiAgICB0aGUgZmlsZXN5c3RlbSB0byBjby1vcGVyYXRlIHdoZW4gZGVhbGluZyB3aXRoIGZpbGUgaGFuZGxlcy4KKyAqCisgKiAgICBleHBvcnRfb3BlcmF0aW9ucyBjb250YWlucyB0d28gYmFzaWMgb3BlcmF0aW9uIGZvciBkZWFsaW5nIHdpdGggZmlsZQorICogICAgaGFuZGxlcywgZGVjb2RlX2ZoKCkgYW5kIGVuY29kZV9maCgpLCBhbmQgYWxsb3dzIGZvciBzb21lIG90aGVyCisgKiAgICBvcGVyYXRpb25zIHRvIGJlIGRlZmluZWQgd2hpY2ggc3RhbmRhcmQgaGVscGVyIHJvdXRpbmVzIHVzZSB0byBnZXQKKyAqICAgIHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGVzeXN0ZW0uCisgKgorICogICAgbmZzZCBlbmNvZGVzIGluZm9ybWF0aW9uIHVzZSB0byBkZXRlcm1pbmUgd2hpY2ggZmlsZXN5c3RlbSBhIGZpbGVoYW5kbGUKKyAqICAgIGFwcGxpZXMgdG8gaW4gdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgZmlsZSBoYW5kbGUuICBUaGUgcmVtYWluZGVyLCB0ZXJtZWQKKyAqICAgIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQsIGlzIGNvbnRyb2xsZWQgY29tcGxldGVseSBieSB0aGUgZmlsZXN5c3RlbS4gIFRoZQorICogICAgc3RhbmRhcmQgaGVscGVyIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoaXMgZnJhZ21lbnQgd2lsbCBjb250YWluIG9uZSBvcgorICogICAgdHdvIHN1Yi1mcmFnbWVudHMsIG9uZSB3aGljaCBpZGVudGlmaWVzIHRoZSBmaWxlLCBhbmQgb25lIHdoaWNoIG1heSBiZQorICogICAgdXNlZCB0byBpZGVudGlmeSB0aGUgKGEpIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlLgorICoKKyAqICAgIEluIHNvbWUgc2l0dWF0aW9ucywgbmZzZCBuZWVkcyB0byBnZXQgYSBkZW50cnkgd2hpY2ggaXMgY29ubmVjdGVkIGludG8gYQorICogICAgc3BlY2lmaWMgcGFydCBvZiB0aGUgZmlsZSB0cmVlLiAgVG8gYWxsb3cgZm9yIHRoaXMsIGl0IHBhc3NlcyB0aGUKKyAqICAgIGZ1bmN0aW9uIGFjY2VwdGFibGUoKSB0b2dldGhlciB3aXRoIGEgQGNvbnRleHQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VlCisgKiAgICBpZiB0aGUgZGVudHJ5IGlzIGFjY2VwdGFibGUuICBBcyB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgZGVudHJ5cyBmb3IgYQorICogICAgZ2l2ZW4gZmlsZSwgdGhlIGZpbGVzeXN0ZW0gc2hvdWxkIGNoZWNrIGVhY2ggb25lIGZvciBhY2NlcHRhYmlsaXR5IGJlZm9yZQorICogICAgbG9va2luZyBmb3IgdGhlIG5leHQuICBBcyBzb29uIGFzIGFuIGFjY2VwdGFibGUgb25lIGlzIGZvdW5kLCBpdCBzaG91bGQKKyAqICAgIGJlIHJldHVybmVkLgorICoKKyAqIGRlY29kZV9maDoKKyAqICAgIEBkZWNvZGVfZmggaXMgZ2l2ZW4gYSAmc3RydWN0IHN1cGVyX2Jsb2NrIChAc2IpLCBhIGZpbGUgaGFuZGxlIGZyYWdtZW50CisgKiAgICAoQGZoLCBAZmhfbGVuKSBhbmQgYW4gYWNjZXB0YWJpbGl0eSB0ZXN0aW5nIGZ1bmN0aW9uIChAYWNjZXB0YWJsZSwKKyAqICAgIEBjb250ZXh0KS4gIEl0IHNob3VsZCByZXR1cm4gYSAmc3RydWN0IGRlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHNhbWUKKyAqICAgIGZpbGUgdGhhdCB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQgcmVmZXJzIHRvLCAgYW5kIHdoaWNoIHBhc3NlcyB0aGUKKyAqICAgIGFjY2VwdGFiaWxpdHkgdGVzdC4gIElmIGl0IGNhbm5vdCwgaXQgc2hvdWxkIHJldHVybiBhICVOVUxMIHBvaW50ZXIgaWYKKyAqICAgIHRoZSBmaWxlIHdhcyBmb3VuZCBidXQgbm8gYWNjZXB0YWJsZSAmZGVudHJpZXMgd2VyZSBhdmFpbGFibGUsIG9yIGEKKyAqICAgICVFUlJfUFRSIGVycm9yIGNvZGUgaW5kaWNhdGluZyB3aHkgaXQgY291bGRuJ3QgYmUgZm91bmQgKGUuZy4gJUVOT0VOVCBvcgorICogICAgJUVOT01FTSkuCisgKgorICogZW5jb2RlX2ZoOgorICogICAgQGVuY29kZV9maCBzaG91bGQgc3RvcmUgaW4gdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50IEBmaCAodXNpbmcgYXQgbW9zdAorICogICAgQG1heF9sZW4gYnl0ZXMpIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgQGRlY29kZV9maCB0byByZWNvdmVyIHRoZQorICogICAgZmlsZSByZWZlcmVkIHRvIGJ5IHRoZSAmc3RydWN0IGRlbnRyeSBAZGUuICBJZiB0aGUgQGNvbm5lY3RhYmxlIGZsYWcgaXMKKyAqICAgIHNldCwgdGhlIGVuY29kZV9maCgpIHNob3VsZCBzdG9yZSBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHNvIHRoYXQgYSBnb29kCisgKiAgICBhdHRlbXB0IGNhbiBiZSBtYWRlIHRvIGZpbmQgbm90IG9ubHkgdGhlIGZpbGUgYnV0IGFsc28gaXQncyBwbGFjZSBpbiB0aGUKKyAqICAgIGZpbGVzeXN0ZW0uICAgVGhpcyB0eXBpY2FsbHkgbWVhbnMgc3RvcmluZyBhIHJlZmVyZW5jZSB0byBkZS0+ZF9wYXJlbnQgaW4KKyAqICAgIHRoZSBmaWxlaGFuZGxlIGZyYWdtZW50LiAgZW5jb2RlX2ZoKCkgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiAgICBzdG9yZWQgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIHN1Y2ggYXMgJS1FTk9TUEMKKyAqCisgKiBnZXRfbmFtZToKKyAqICAgIEBnZXRfbmFtZSBzaG91bGQgZmluZCBhIG5hbWUgZm9yIHRoZSBnaXZlbiBAY2hpbGQgaW4gdGhlIGdpdmVuIEBwYXJlbnQKKyAqICAgIGRpcmVjdG9yeS4gIFRoZSBuYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIEBuYW1lICh3aXRoIHRoZQorICogICAgdW5kZXJzdGFuZGluZyB0aGF0IGl0IGlzIGFscmVhZHkgcG9pbnRpbmcgdG8gYSBhICVOQU1FX01BWCsxIHNpemVkCisgKiAgICBidWZmZXIuICAgZ2V0X25hbWUoKSBzaG91bGQgcmV0dXJuICUwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICogICAgb3IgZXJyb3IuICBAZ2V0X25hbWUgd2lsbCBiZSBjYWxsZWQgd2l0aG91dCBAcGFyZW50LT5pX211dGV4IGhlbGQuCisgKgorICogZ2V0X3BhcmVudDoKKyAqICAgIEBnZXRfcGFyZW50IHNob3VsZCBmaW5kIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciB0aGUgZ2l2ZW4gQGNoaWxkIHdoaWNoCisgKiAgICBpcyBhbHNvIGEgZGlyZWN0b3J5LiAgSW4gdGhlIGV2ZW50IHRoYXQgaXQgY2Fubm90IGJlIGZvdW5kLCBvciBzdG9yYWdlCisgKiAgICBzcGFjZSBjYW5ub3QgYmUgYWxsb2NhdGVkLCBhICVFUlJfUFRSIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKiBnZXRfZGVudHJ5OgorICogICAgR2l2ZW4gYSAmc3VwZXJfYmxvY2sgKEBzYikgYW5kIGEgcG9pbnRlciB0byBhIGZpbGUtc3lzdGVtIHNwZWNpZmljIGlub2RlCisgKiAgICBpZGVudGlmaWVyLCBwb3NzaWJseSBhbiBpbm9kZSBudW1iZXIsIChAaW51bXApIGdldF9kZW50cnkoKSBzaG91bGQgZmluZAorICogICAgdGhlIGlkZW50aWZpZWQgaW5vZGUgYW5kIHJldHVybiBhIGRlbnRyeSBmb3IgdGhhdCBpbm9kZS4gIEFueSBzdWl0YWJsZQorICogICAgZGVudHJ5IGNhbiBiZSByZXR1cm5lZCBpbmNsdWRpbmcsIGlmIG5lY2Vzc2FyeSwgYSBuZXcgZGVudHJ5IGNyZWF0ZWQgd2l0aAorICogICAgZF9hbGxvY19yb290LiAgVGhlIGNhbGxlciBjYW4gdGhlbiBmaW5kIGFueSBvdGhlciBleHRhbnQgZGVudHJ5cyBieQorICogICAgZm9sbG93aW5nIHRoZSBkX2FsaWFzIGxpbmtzLiAgSWYgYSBuZXcgZGVudHJ5IHdhcyBjcmVhdGVkIHVzaW5nCisgKiAgICBkX2FsbG9jX3Jvb3QsIERDQUNIRV9ORlNEX0RJU0NPTk5FQ1RFRCBzaG91bGQgYmUgc2V0LCBhbmQgdGhlIGRlbnRyeQorICogICAgc2hvdWxkIGJlIGRfcmVoYXNoKCllZC4KKyAqCisgKiAgICBJZiB0aGUgaW5vZGUgY2Fubm90IGJlIGZvdW5kLCBlaXRoZXIgYSAlTlVMTCBwb2ludGVyIG9yIGFuICVFUlJfUFRSIGNvZGUKKyAqICAgIGNhbiBiZSByZXR1cm5lZC4gIFRoZSBAaW51bXAgd2lsbCBiZSB3aGF0ZXZlciB3YXMgcGFzc2VkIHRvCisgKiAgICBuZnNkX2ZpbmRfZmhfZGVudHJ5KCkgaW4gZWl0aGVyIHRoZSBAb2JqIG9yIEBwYXJlbnQgcGFyYW1ldGVycy4KKyAqCisgKiBMb2NraW5nIHJ1bGVzOgorICogICAgZ2V0X3BhcmVudCBpcyBjYWxsZWQgd2l0aCBjaGlsZC0+ZF9pbm9kZS0+aV9tdXRleCBkb3duCisgKiAgICBnZXRfbmFtZSBpcyBub3QgKHdoaWNoIGlzIHBvc3NpYmx5IGluY29uc2lzdGVudCkKKyAqLworCitzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgeworCXN0cnVjdCBkZW50cnkgKigqZGVjb2RlX2ZoKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBfX3UzMiAqZmgsCisJCQlpbnQgZmhfbGVuLCBpbnQgZmhfdHlwZSwKKwkJCWludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJCXZvaWQgKmNvbnRleHQpOworCWludCAoKmVuY29kZV9maCkoc3RydWN0IGRlbnRyeSAqZGUsIF9fdTMyICpmaCwgaW50ICptYXhfbGVuLAorCQkJaW50IGNvbm5lY3RhYmxlKTsKKwlpbnQgKCpnZXRfbmFtZSkoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjaGFyICpuYW1lLAorCQkJc3RydWN0IGRlbnRyeSAqY2hpbGQpOworCXN0cnVjdCBkZW50cnkgKiAoKmdldF9wYXJlbnQpKHN0cnVjdCBkZW50cnkgKmNoaWxkKTsKKwlzdHJ1Y3QgZGVudHJ5ICogKCpnZXRfZGVudHJ5KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICppbnVtcCk7CisKKwkvKiBUaGlzIGlzIHNldCBieSB0aGUgZXhwb3J0aW5nIG1vZHVsZSB0byBhIHN0YW5kYXJkIGhlbHBlciAqLworCXN0cnVjdCBkZW50cnkgKiAoKmZpbmRfZXhwb3J0ZWRfZGVudHJ5KSgKKwkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwgdm9pZCAqcGFyZW50LAorCQkJaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAorCQkJdm9pZCAqY29udGV4dCk7Cit9OworCitleHRlcm4gc3RydWN0IGRlbnRyeSAqZmluZF9leHBvcnRlZF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqLAorCXZvaWQgKnBhcmVudCwgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAorCXZvaWQgKmNvbnRleHQpOworCitleHRlcm4gaW50IGV4cG9ydGZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICpmaCwgaW50ICptYXhfbGVuLAorCWludCBjb25uZWN0YWJsZSk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqZXhwb3J0ZnNfZGVjb2RlX2ZoKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBfX3UzMiAqZmgsCisJaW50IGZoX2xlbiwgaW50IGZpbGVpZF90eXBlLCBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICosIHN0cnVjdCBkZW50cnkgKiksCisJdm9pZCAqY29udGV4dCk7CisKKyNlbmRpZiAvKiBMSU5VWF9FWFBPUlRGU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCmluZGV4IDRlZGEwZWQuLmQxNDlmMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCkBAIC0zMyw2ICszMyw4IEBACiAJdW5zaWduZWQgbG9uZyBzX2dkYl9jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzICovCiAJdW5zaWduZWQgbG9uZyBzX2Rlc2NfcGVyX2Jsb2NrOwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvcnMgcGVyIGJsb2NrICovCiAJdW5zaWduZWQgbG9uZyBzX2dyb3Vwc19jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgZnMgKi8KKwl1bnNpZ25lZCBsb25nIHNfb3ZlcmhlYWRfbGFzdDsgIC8qIExhc3QgY2FsY3VsYXRlZCBvdmVyaGVhZCAqLworCXVuc2lnbmVkIGxvbmcgc19ibG9ja3NfbGFzdDsgICAgLyogTGFzdCBzZWVuIGJsb2NrIGNvdW50ICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogc19zYmg7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLwogCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKiBzX2dyb3VwX2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCmluZGV4IGY2MTMwOWMuLmQzYzA4MzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCkBAIC0zOCw2ICszOCw4IEBACiAJdW5zaWduZWQgbG9uZyBzX2dkYl9jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzICovCiAJdW5zaWduZWQgbG9uZyBzX2Rlc2NfcGVyX2Jsb2NrOwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvcnMgcGVyIGJsb2NrICovCiAJdW5zaWduZWQgbG9uZyBzX2dyb3Vwc19jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgZnMgKi8KKwl1bnNpZ25lZCBsb25nIHNfb3ZlcmhlYWRfbGFzdDsgIC8qIExhc3QgY2FsY3VsYXRlZCBvdmVyaGVhZCAqLworCXVuc2lnbmVkIGxvbmcgc19ibG9ja3NfbGFzdDsgICAgLyogTGFzdCBzZWVuIGJsb2NrIGNvdW50ICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogc19zYmg7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLwogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKiBzX2dyb3VwX2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDRfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oCmluZGV4IDY5MWE3MTMuLjIzNDc1NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oCkBAIC0zOSw2ICszOSw4IEBACiAJdW5zaWduZWQgbG9uZyBzX2dkYl9jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzICovCiAJdW5zaWduZWQgbG9uZyBzX2Rlc2NfcGVyX2Jsb2NrOwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvcnMgcGVyIGJsb2NrICovCiAJdW5zaWduZWQgbG9uZyBzX2dyb3Vwc19jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgZnMgKi8KKwl1bnNpZ25lZCBsb25nIHNfb3ZlcmhlYWRfbGFzdDsgIC8qIExhc3QgY2FsY3VsYXRlZCBvdmVyaGVhZCAqLworCXVuc2lnbmVkIGxvbmcgc19ibG9ja3NfbGFzdDsgICAgLyogTGFzdCBzZWVuIGJsb2NrIGNvdW50ICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogc19zYmg7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICogc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKiBzX2dyb3VwX2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKaW5kZXggNjYyMjY4Mi4uY2VjNTQxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmIuaApAQCAtMTE5LDYgKzExOSw3IEBACiAjZGVmaW5lIEZCX0FDQ0VMX05WXzQwICAgICAgICAgIDQ2ICAgICAgLyogblZpZGlhIEFyY2ggNDAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1YJNDcJLyogWEdJIFZvbGFyaSBWM1hULCBWNSwgVjggICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1oJNDgJLyogWEdJIFZvbGFyaSBaNyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9PTUFQMTYxMAk0OQkvKiBUSSBPTUFQMTZ4eCAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA3MCA5MAkvKiBOZW9NYWdpYyBOTTIwNzAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MCA5MQkvKiBOZW9NYWdpYyBOTTIwOTAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MyA5MgkvKiBOZW9NYWdpYyBOTTIwOTMgICAgICAgICAgICAgICovCkBAIC01MjksNiArNTMwLDggQEAKICNkZWZpbmUgRkJfRVZFTlRfQ09OQkxBTksgICAgICAgICAgICAgICAweDBDCiAvKiAgICAgIEdldCBkcmF3aW5nIHJlcXVpcmVtZW50cyAgICAgICAgKi8KICNkZWZpbmUgRkJfRVZFTlRfR0VUX1JFUSAgICAgICAgICAgICAgICAweDBECisvKiAgICAgIFVuYmluZCBmcm9tIHRoZSBjb25zb2xlIGlmIHBvc3NpYmxlICovCisjZGVmaW5lIEZCX0VWRU5UX0ZCX1VOQklORCAgICAgICAgICAgICAgMHgwRQogCiBzdHJ1Y3QgZmJfZXZlbnQgewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maWxlLmggYi9pbmNsdWRlL2xpbnV4L2ZpbGUuaAppbmRleCBhNTkwMDFlLi4wMTE0ZmJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZpbGUuaApAQCAtNzMsNiArNzMsNyBAQAogZXh0ZXJuIHZvaWQgRkFTVENBTEwoc2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkLCBpbnQgZmxhZykpOwogZXh0ZXJuIHZvaWQgcHV0X2ZpbHAoc3RydWN0IGZpbGUgKik7CiBleHRlcm4gaW50IGdldF91bnVzZWRfZmQodm9pZCk7CitleHRlcm4gaW50IGdldF91bnVzZWRfZmRfZmxhZ3MoaW50IGZsYWdzKTsKIGV4dGVybiB2b2lkIEZBU1RDQUxMKHB1dF91bnVzZWRfZmQodW5zaWduZWQgaW50IGZkKSk7CiBzdHJ1Y3Qga21lbV9jYWNoZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcmVlemVyLmggYi9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaAppbmRleCA0NjMxMDg2Li4yZDM4YjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaApAQCAtMSw1ICsxLDggQEAKIC8qIEZyZWV6ZXIgZGVjbGFyYXRpb25zICovCiAKKyNpZm5kZWYgRlJFRVpFUl9IX0lOQ0xVREVECisjZGVmaW5lIEZSRUVaRVJfSF9JTkNMVURFRAorCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtMTE1LDYgKzExOCwxNCBAQAogCXJldHVybiAhIShwLT5mbGFncyAmIFBGX0ZSRUVaRVJfU0tJUCk7CiB9CiAKKy8qCisgKiBUZWxsIHRoZSBmcmVlemVyIHRoYXQgdGhlIGN1cnJlbnQgdGFzayBzaG91bGQgYmUgZnJvemVuIGJ5IGl0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnJlZXphYmxlKHZvaWQpCit7CisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX05PRlJFRVpFOworfQorCiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgZnJvemVuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgZnJlZXppbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAwOyB9CkBAIC0xMzAsNCArMTQxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlemVyX2RvX25vdF9jb3VudCh2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZXJfY291bnQodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgaW50IGZyZWV6ZXJfc2hvdWxkX3NraXAoc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZyZWV6YWJsZSh2b2lkKSB7fQogI2VuZGlmCisKKyNlbmRpZgkvKiBGUkVFWkVSX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCA0ZjBiM2JmLi41OGNlMzM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC00NCw3ICs0NCw3IEBACiBzdHJ1Y3QgaW5vZGVzX3N0YXRfdCB7CiAJaW50IG5yX2lub2RlczsKIAlpbnQgbnJfdW51c2VkOwotCWludCBkdW1teVs1XTsKKwlpbnQgZHVtbXlbNV07CQkvKiBwYWRkaW5nIGZvciBzeXNjdGwgQUJJIGNvbXBhdGliaWxpdHkgKi8KIH07CiBleHRlcm4gc3RydWN0IGlub2Rlc19zdGF0X3QgaW5vZGVzX3N0YXQ7CiAKQEAgLTI4MywxMSArMjgzLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zOwogc3RydWN0IGhkX2dlb21ldHJ5Owogc3RydWN0IGlvdmVjOwogc3RydWN0IG5hbWVpZGF0YTsKQEAgLTgyMCw2ICs4MjIsMTAgQEAKIAl1bmlvbiB7CiAJCXN0cnVjdCBuZnNfbG9ja19pbmZvCW5mc19mbDsKIAkJc3RydWN0IG5mczRfbG9ja19pbmZvCW5mczRfZmw7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CS8qIGxpbmsgaW4gQUZTIHZub2RlJ3MgcGVuZGluZ19sb2NrcyBsaXN0ICovCisJCQlpbnQgc3RhdGU7CQkvKiBzdGF0ZSBvZiBncmFudCBvciBlcnJvciBpZiAtdmUgKi8KKwkJfSBhZnM7CiAJfSBmbF91OwogfTsKIApAQCAtMTI3MywxMTkgKzEyNzksNiBAQAogCiBpbnQgc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiAKLS8qKgotICogc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIC0gZm9yIG5mc2QgdG8gY29tbXVuaWNhdGUgd2l0aCBmaWxlIHN5c3RlbXMKLSAqIEBkZWNvZGVfZmg6ICAgICAgZGVjb2RlIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQgYW5kIHJldHVybiBhICZzdHJ1Y3QgZGVudHJ5Ci0gKiBAZW5jb2RlX2ZoOiAgICAgIGVuY29kZSBhIGZpbGUgaGFuZGxlIGZyYWdtZW50IGZyb20gYSBkZW50cnkKLSAqIEBnZXRfbmFtZTogICAgICAgZmluZCB0aGUgbmFtZSBmb3IgYSBnaXZlbiBpbm9kZSBpbiBhIGdpdmVuIGRpcmVjdG9yeQotICogQGdldF9wYXJlbnQ6ICAgICBmaW5kIHRoZSBwYXJlbnQgb2YgYSBnaXZlbiBkaXJlY3RvcnkKLSAqIEBnZXRfZGVudHJ5OiAgICAgZmluZCBhIGRlbnRyeSBmb3IgdGhlIGlub2RlIGdpdmVuIGEgZmlsZSBoYW5kbGUgc3ViLWZyYWdtZW50Ci0gKiBAZmluZF9leHBvcnRlZF9kZW50cnk6Ci0gKglzZXQgYnkgdGhlIGV4cG9ydGluZyBtb2R1bGUgdG8gYSBzdGFuZGFyZCBoZWxwZXIgZnVuY3Rpb24uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBUaGUgZXhwb3J0X29wZXJhdGlvbnMgc3RydWN0dXJlIHByb3ZpZGVzIGEgbWVhbnMgZm9yIG5mc2QgdG8gY29tbXVuaWNhdGUKLSAqICAgIHdpdGggYSBwYXJ0aWN1bGFyIGV4cG9ydGVkIGZpbGUgc3lzdGVtICAtIHBhcnRpY3VsYXJseSBlbmFibGluZyBuZnNkIGFuZAotICogICAgdGhlIGZpbGVzeXN0ZW0gdG8gY28tb3BlcmF0ZSB3aGVuIGRlYWxpbmcgd2l0aCBmaWxlIGhhbmRsZXMuCi0gKgotICogICAgZXhwb3J0X29wZXJhdGlvbnMgY29udGFpbnMgdHdvIGJhc2ljIG9wZXJhdGlvbiBmb3IgZGVhbGluZyB3aXRoIGZpbGUKLSAqICAgIGhhbmRsZXMsIGRlY29kZV9maCgpIGFuZCBlbmNvZGVfZmgoKSwgYW5kIGFsbG93cyBmb3Igc29tZSBvdGhlcgotICogICAgb3BlcmF0aW9ucyB0byBiZSBkZWZpbmVkIHdoaWNoIHN0YW5kYXJkIGhlbHBlciByb3V0aW5lcyB1c2UgdG8gZ2V0Ci0gKiAgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlc3lzdGVtLgotICoKLSAqICAgIG5mc2QgZW5jb2RlcyBpbmZvcm1hdGlvbiB1c2UgdG8gZGV0ZXJtaW5lIHdoaWNoIGZpbGVzeXN0ZW0gYSBmaWxlaGFuZGxlCi0gKiAgICBhcHBsaWVzIHRvIGluIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIGZpbGUgaGFuZGxlLiAgVGhlIHJlbWFpbmRlciwgdGVybWVkCi0gKiAgICBhIGZpbGUgaGFuZGxlIGZyYWdtZW50LCBpcyBjb250cm9sbGVkIGNvbXBsZXRlbHkgYnkgdGhlIGZpbGVzeXN0ZW0uICBUaGUKLSAqICAgIHN0YW5kYXJkIGhlbHBlciByb3V0aW5lcyBhc3N1bWUgdGhhdCB0aGlzIGZyYWdtZW50IHdpbGwgY29udGFpbiBvbmUgb3IKLSAqICAgIHR3byBzdWItZnJhZ21lbnRzLCBvbmUgd2hpY2ggaWRlbnRpZmllcyB0aGUgZmlsZSwgYW5kIG9uZSB3aGljaCBtYXkgYmUKLSAqICAgIHVzZWQgdG8gaWRlbnRpZnkgdGhlIChhKSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZS4KLSAqCi0gKiAgICBJbiBzb21lIHNpdHVhdGlvbnMsIG5mc2QgbmVlZHMgdG8gZ2V0IGEgZGVudHJ5IHdoaWNoIGlzIGNvbm5lY3RlZCBpbnRvIGEKLSAqICAgIHNwZWNpZmljIHBhcnQgb2YgdGhlIGZpbGUgdHJlZS4gIFRvIGFsbG93IGZvciB0aGlzLCBpdCBwYXNzZXMgdGhlCi0gKiAgICBmdW5jdGlvbiBhY2NlcHRhYmxlKCkgdG9nZXRoZXIgd2l0aCBhIEBjb250ZXh0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlZQotICogICAgaWYgdGhlIGRlbnRyeSBpcyBhY2NlcHRhYmxlLiAgQXMgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGRlbnRyeXMgZm9yIGEKLSAqICAgIGdpdmVuIGZpbGUsIHRoZSBmaWxlc3lzdGVtIHNob3VsZCBjaGVjayBlYWNoIG9uZSBmb3IgYWNjZXB0YWJpbGl0eSBiZWZvcmUKLSAqICAgIGxvb2tpbmcgZm9yIHRoZSBuZXh0LiAgQXMgc29vbiBhcyBhbiBhY2NlcHRhYmxlIG9uZSBpcyBmb3VuZCwgaXQgc2hvdWxkCi0gKiAgICBiZSByZXR1cm5lZC4KLSAqCi0gKiBkZWNvZGVfZmg6Ci0gKiAgICBAZGVjb2RlX2ZoIGlzIGdpdmVuIGEgJnN0cnVjdCBzdXBlcl9ibG9jayAoQHNiKSwgYSBmaWxlIGhhbmRsZSBmcmFnbWVudAotICogICAgKEBmaCwgQGZoX2xlbikgYW5kIGFuIGFjY2VwdGFiaWxpdHkgdGVzdGluZyBmdW5jdGlvbiAoQGFjY2VwdGFibGUsCi0gKiAgICBAY29udGV4dCkuICBJdCBzaG91bGQgcmV0dXJuIGEgJnN0cnVjdCBkZW50cnkgd2hpY2ggcmVmZXJzIHRvIHRoZSBzYW1lCi0gKiAgICBmaWxlIHRoYXQgdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50IHJlZmVycyB0bywgIGFuZCB3aGljaCBwYXNzZXMgdGhlCi0gKiAgICBhY2NlcHRhYmlsaXR5IHRlc3QuICBJZiBpdCBjYW5ub3QsIGl0IHNob3VsZCByZXR1cm4gYSAlTlVMTCBwb2ludGVyIGlmCi0gKiAgICB0aGUgZmlsZSB3YXMgZm91bmQgYnV0IG5vIGFjY2VwdGFibGUgJmRlbnRyaWVzIHdlcmUgYXZhaWxhYmxlLCBvciBhCi0gKiAgICAlRVJSX1BUUiBlcnJvciBjb2RlIGluZGljYXRpbmcgd2h5IGl0IGNvdWxkbid0IGJlIGZvdW5kIChlLmcuICVFTk9FTlQgb3IKLSAqICAgICVFTk9NRU0pLgotICoKLSAqIGVuY29kZV9maDoKLSAqICAgIEBlbmNvZGVfZmggc2hvdWxkIHN0b3JlIGluIHRoZSBmaWxlIGhhbmRsZSBmcmFnbWVudCBAZmggKHVzaW5nIGF0IG1vc3QKLSAqICAgIEBtYXhfbGVuIGJ5dGVzKSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IEBkZWNvZGVfZmggdG8gcmVjb3ZlciB0aGUKLSAqICAgIGZpbGUgcmVmZXJlZCB0byBieSB0aGUgJnN0cnVjdCBkZW50cnkgQGRlLiAgSWYgdGhlIEBjb25uZWN0YWJsZSBmbGFnIGlzCi0gKiAgICBzZXQsIHRoZSBlbmNvZGVfZmgoKSBzaG91bGQgc3RvcmUgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBzbyB0aGF0IGEgZ29vZAotICogICAgYXR0ZW1wdCBjYW4gYmUgbWFkZSB0byBmaW5kIG5vdCBvbmx5IHRoZSBmaWxlIGJ1dCBhbHNvIGl0J3MgcGxhY2UgaW4gdGhlCi0gKiAgICBmaWxlc3lzdGVtLiAgIFRoaXMgdHlwaWNhbGx5IG1lYW5zIHN0b3JpbmcgYSByZWZlcmVuY2UgdG8gZGUtPmRfcGFyZW50IGluCi0gKiAgICB0aGUgZmlsZWhhbmRsZSBmcmFnbWVudC4gIGVuY29kZV9maCgpIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcwotICogICAgc3RvcmVkIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBzdWNoIGFzICUtRU5PU1BDCi0gKgotICogZ2V0X25hbWU6Ci0gKiAgICBAZ2V0X25hbWUgc2hvdWxkIGZpbmQgYSBuYW1lIGZvciB0aGUgZ2l2ZW4gQGNoaWxkIGluIHRoZSBnaXZlbiBAcGFyZW50Ci0gKiAgICBkaXJlY3RvcnkuICBUaGUgbmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBAbmFtZSAod2l0aCB0aGUKLSAqICAgIHVuZGVyc3RhbmRpbmcgdGhhdCBpdCBpcyBhbHJlYWR5IHBvaW50aW5nIHRvIGEgYSAlTkFNRV9NQVgrMSBzaXplZAotICogICAgYnVmZmVyLiAgIGdldF9uYW1lKCkgc2hvdWxkIHJldHVybiAlMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKLSAqICAgIG9yIGVycm9yLiAgQGdldF9uYW1lIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgQHBhcmVudC0+aV9tdXRleCBoZWxkLgotICoKLSAqIGdldF9wYXJlbnQ6Ci0gKiAgICBAZ2V0X3BhcmVudCBzaG91bGQgZmluZCB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgdGhlIGdpdmVuIEBjaGlsZCB3aGljaAotICogICAgaXMgYWxzbyBhIGRpcmVjdG9yeS4gIEluIHRoZSBldmVudCB0aGF0IGl0IGNhbm5vdCBiZSBmb3VuZCwgb3Igc3RvcmFnZQotICogICAgc3BhY2UgY2Fubm90IGJlIGFsbG9jYXRlZCwgYSAlRVJSX1BUUiBzaG91bGQgYmUgcmV0dXJuZWQuCi0gKgotICogZ2V0X2RlbnRyeToKLSAqICAgIEdpdmVuIGEgJnN1cGVyX2Jsb2NrIChAc2IpIGFuZCBhIHBvaW50ZXIgdG8gYSBmaWxlLXN5c3RlbSBzcGVjaWZpYyBpbm9kZQotICogICAgaWRlbnRpZmllciwgcG9zc2libHkgYW4gaW5vZGUgbnVtYmVyLCAoQGludW1wKSBnZXRfZGVudHJ5KCkgc2hvdWxkIGZpbmQKLSAqICAgIHRoZSBpZGVudGlmaWVkIGlub2RlIGFuZCByZXR1cm4gYSBkZW50cnkgZm9yIHRoYXQgaW5vZGUuICBBbnkgc3VpdGFibGUKLSAqICAgIGRlbnRyeSBjYW4gYmUgcmV0dXJuZWQgaW5jbHVkaW5nLCBpZiBuZWNlc3NhcnksIGEgbmV3IGRlbnRyeSBjcmVhdGVkIHdpdGgKLSAqICAgIGRfYWxsb2Nfcm9vdC4gIFRoZSBjYWxsZXIgY2FuIHRoZW4gZmluZCBhbnkgb3RoZXIgZXh0YW50IGRlbnRyeXMgYnkKLSAqICAgIGZvbGxvd2luZyB0aGUgZF9hbGlhcyBsaW5rcy4gIElmIGEgbmV3IGRlbnRyeSB3YXMgY3JlYXRlZCB1c2luZwotICogICAgZF9hbGxvY19yb290LCBEQ0FDSEVfTkZTRF9ESVNDT05ORUNURUQgc2hvdWxkIGJlIHNldCwgYW5kIHRoZSBkZW50cnkKLSAqICAgIHNob3VsZCBiZSBkX3JlaGFzaCgpZWQuCi0gKgotICogICAgSWYgdGhlIGlub2RlIGNhbm5vdCBiZSBmb3VuZCwgZWl0aGVyIGEgJU5VTEwgcG9pbnRlciBvciBhbiAlRVJSX1BUUiBjb2RlCi0gKiAgICBjYW4gYmUgcmV0dXJuZWQuICBUaGUgQGludW1wIHdpbGwgYmUgd2hhdGV2ZXIgd2FzIHBhc3NlZCB0bwotICogICAgbmZzZF9maW5kX2ZoX2RlbnRyeSgpIGluIGVpdGhlciB0aGUgQG9iaiBvciBAcGFyZW50IHBhcmFtZXRlcnMuCi0gKgotICogTG9ja2luZyBydWxlczoKLSAqICAgIGdldF9wYXJlbnQgaXMgY2FsbGVkIHdpdGggY2hpbGQtPmRfaW5vZGUtPmlfbXV0ZXggZG93bgotICogICAgZ2V0X25hbWUgaXMgbm90ICh3aGljaCBpcyBwb3NzaWJseSBpbmNvbnNpc3RlbnQpCi0gKi8KLQotc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIHsKLQlzdHJ1Y3QgZGVudHJ5ICooKmRlY29kZV9maCkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKmZoLCBpbnQgZmhfbGVuLCBpbnQgZmhfdHlwZSwKLQkJCSBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCi0JCQkgdm9pZCAqY29udGV4dCk7Ci0JaW50ICgqZW5jb2RlX2ZoKShzdHJ1Y3QgZGVudHJ5ICpkZSwgX191MzIgKmZoLCBpbnQgKm1heF9sZW4sCi0JCQkgaW50IGNvbm5lY3RhYmxlKTsKLQotCS8qIHRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgY2FsbGVkIGZyb20gdGhlIGZpbGVzeXN0ZW0gaXRzZWxmICovCi0JaW50ICgqZ2V0X25hbWUpKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgY2hhciAqbmFtZSwKLQkJCXN0cnVjdCBkZW50cnkgKmNoaWxkKTsKLQlzdHJ1Y3QgZGVudHJ5ICogKCpnZXRfcGFyZW50KShzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7Ci0Jc3RydWN0IGRlbnRyeSAqICgqZ2V0X2RlbnRyeSkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqaW51bXApOwotCi0JLyogVGhpcyBpcyBzZXQgYnkgdGhlIGV4cG9ydGluZyBtb2R1bGUgdG8gYSBzdGFuZGFyZCBoZWxwZXIgKi8KLQlzdHJ1Y3QgZGVudHJ5ICogKCpmaW5kX2V4cG9ydGVkX2RlbnRyeSkoCi0JCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwgdm9pZCAqcGFyZW50LAotCQlpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCi0JCXZvaWQgKmNvbnRleHQpOwotCi0KLX07Ci0KLWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICoKLWZpbmRfZXhwb3J0ZWRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwgdm9pZCAqcGFyZW50LAotCQkgICAgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKLQkJICAgICB2b2lkICpjb250ZXh0KTsKLQogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGZzX2ZsYWdzOwpAQCAtMTUyMiw3ICsxNDE1LDcgQEAKIAogI2lmZGVmIENPTkZJR19CTE9DSwogZXh0ZXJuIGludCByZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2Jsa2Rldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2Jsa2Rldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqYmRnZXQoZGV2X3QpOwogZXh0ZXJuIHZvaWQgYmRfc2V0X3NpemUoc3RydWN0IGJsb2NrX2RldmljZSAqLCBsb2ZmX3Qgc2l6ZSk7CiBleHRlcm4gdm9pZCBiZF9mb3JnZXQoc3RydWN0IGlub2RlICppbm9kZSk7CkBAIC0xNjEwLDYgKzE1MDMsOSBAQAogZXh0ZXJuIGludCBpbnZhbGlkYXRlX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqLCBpbnQpOwogI2VuZGlmCiBleHRlcm4gaW50IGludmFsaWRhdGVfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3Vuc2lnbmVkIGxvbmcgX19pbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kLAorCQkJCQlib29sIGJlX2F0b21pYyk7CiB1bnNpZ25lZCBsb25nIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQpOwogCkBAIC0yMDQzLDUgKzE5MzksOSBAQAogeyB9CiAjZW5kaWYJLyogQ09ORklHX1NFQ1VSSVRZICovCiAKK2ludCBwcm9jX25yX2ZpbGVzKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOworCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0xJTlVYX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaCBiL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaAppbmRleCA3MzcxMGQ2Li42OTU3NDFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCkBAIC0xMTIsNyArMTEyLDcgQEAKIHN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgewogCXUzMiAJaW5pdGlhbF9zcG1vZGU7CS8qIGluaXRpYWwgU1BNT0RFIHZhbHVlICovCiAJdTE2CWJ1c19udW07Ci0KKwlib29sCXFlX21vZGU7CiAJLyogYm9hcmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIAl1MTYJbWF4X2NoaXBzZWxlY3Q7CiAJdm9pZAkoKmFjdGl2YXRlX2NzKSh1OCBjcywgdTggcG9sYXJpdHkpOwpAQCAtMTIwLDUgKzEyMCwxMCBAQAogCXUzMglzeXNjbGs7CiB9OwogCitzdHJ1Y3QgbXBjOHh4X3BjbWNpYV9vcHMgeworCXZvaWQoKmh3X2N0cmwpKGludCBzbG90LCBpbnQgZW5hYmxlKTsKKwlpbnQoKnZvbHRhZ2Vfc2V0KShpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCk7Cit9OworCiAjZW5kaWYgLyogX0ZTTF9ERVZJQ0VfSF8gKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaCBiL2luY2x1ZGUvbGludXgvZnVzZS5oCmluZGV4IDUzNDc0NGUuLjlmYmU5ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnVzZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnVzZS5oCkBAIC0zMzksNyArMzM5LDcgQEAKIAljaGFyIG5hbWVbMF07CiB9OwogCi0jZGVmaW5lIEZVU0VfTkFNRV9PRkZTRVQgKCh1bnNpZ25lZCkgKChzdHJ1Y3QgZnVzZV9kaXJlbnQgKikgMCktPm5hbWUpCisjZGVmaW5lIEZVU0VfTkFNRV9PRkZTRVQgb2Zmc2V0b2Yoc3RydWN0IGZ1c2VfZGlyZW50LCBuYW1lKQogI2RlZmluZSBGVVNFX0RJUkVOVF9BTElHTih4KSAoKCh4KSArIHNpemVvZihfX3U2NCkgLSAxKSAmIH4oc2l6ZW9mKF9fdTY0KSAtIDEpKQogI2RlZmluZSBGVVNFX0RJUkVOVF9TSVpFKGQpIFwKIAlGVVNFX0RJUkVOVF9BTElHTihGVVNFX05BTUVfT0ZGU0VUICsgKGQpLT5uYW1lbGVuKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnAuaCBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKaW5kZXggMGQyZWYwYi4uYmM2OGRkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZnAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dmcC5oCkBAIC0zMCw2ICszMCw5IEBACiAgKiBjYW5ub3QgaGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZXMuCiAgKgogICogX19HRlBfTk9SRVRSWTogVGhlIFZNIGltcGxlbWVudGF0aW9uIG11c3Qgbm90IHJldHJ5IGluZGVmaW5pdGVseS4KKyAqCisgKiBfX0dGUF9NT1ZBQkxFOiBGbGFnIHRoYXQgdGhpcyBwYWdlIHdpbGwgYmUgbW92YWJsZSBieSB0aGUgcGFnZSBtaWdyYXRpb24KKyAqIG1lY2hhbmlzbSBvciByZWNsYWltZWQKICAqLwogI2RlZmluZSBfX0dGUF9XQUlUCSgoX19mb3JjZSBnZnBfdCkweDEwdSkJLyogQ2FuIHdhaXQgYW5kIHJlc2NoZWR1bGU/ICovCiAjZGVmaW5lIF9fR0ZQX0hJR0gJKChfX2ZvcmNlIGdmcF90KTB4MjB1KQkvKiBTaG91bGQgYWNjZXNzIGVtZXJnZW5jeSBwb29scz8gKi8KQEAgLTQ1LDYgKzQ4LDcgQEAKICNkZWZpbmUgX19HRlBfTk9NRU1BTExPQyAoKF9fZm9yY2UgZ2ZwX3QpMHgxMDAwMHUpIC8qIERvbid0IHVzZSBlbWVyZ2VuY3kgcmVzZXJ2ZXMgKi8KICNkZWZpbmUgX19HRlBfSEFSRFdBTEwgICAoKF9fZm9yY2UgZ2ZwX3QpMHgyMDAwMHUpIC8qIEVuZm9yY2UgaGFyZHdhbGwgY3B1c2V0IG1lbW9yeSBhbGxvY3MgKi8KICNkZWZpbmUgX19HRlBfVEhJU05PREUJKChfX2ZvcmNlIGdmcF90KTB4NDAwMDB1KS8qIE5vIGZhbGxiYWNrLCBubyBwb2xpY2llcyAqLworI2RlZmluZSBfX0dGUF9NT1ZBQkxFCSgoX19mb3JjZSBnZnBfdCkweDgwMDAwdSkgLyogUGFnZSBpcyBtb3ZhYmxlICovCiAKICNkZWZpbmUgX19HRlBfQklUU19TSElGVCAyMAkvKiBSb29tIGZvciAyMCBfX0dGUF9GT08gYml0cyAqLwogI2RlZmluZSBfX0dGUF9CSVRTX01BU0sgKChfX2ZvcmNlIGdmcF90KSgoMSA8PCBfX0dGUF9CSVRTX1NISUZUKSAtIDEpKQpAQCAtNTMsNyArNTcsOCBAQAogI2RlZmluZSBHRlBfTEVWRUxfTUFTSyAoX19HRlBfV0FJVHxfX0dGUF9ISUdIfF9fR0ZQX0lPfF9fR0ZQX0ZTfCBcCiAJCQlfX0dGUF9DT0xEfF9fR0ZQX05PV0FSTnxfX0dGUF9SRVBFQVR8IFwKIAkJCV9fR0ZQX05PRkFJTHxfX0dGUF9OT1JFVFJZfF9fR0ZQX0NPTVB8IFwKLQkJCV9fR0ZQX05PTUVNQUxMT0N8X19HRlBfSEFSRFdBTEx8X19HRlBfVEhJU05PREUpCisJCQlfX0dGUF9OT01FTUFMTE9DfF9fR0ZQX0hBUkRXQUxMfF9fR0ZQX1RISVNOT0RFfCBcCisJCQlfX0dGUF9NT1ZBQkxFKQogCiAvKiBUaGlzIGVxdWFscyAwLCBidXQgdXNlIGNvbnN0YW50cyBpbiBjYXNlIHRoZXkgZXZlciBjaGFuZ2UgKi8KICNkZWZpbmUgR0ZQX05PV0FJVAkoR0ZQX0FUT01JQyAmIH5fX0dGUF9ISUdIKQpAQCAtNjUsNiArNzAsMTUgQEAKICNkZWZpbmUgR0ZQX1VTRVIJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgX19HRlBfSEFSRFdBTEwpCiAjZGVmaW5lIEdGUF9ISUdIVVNFUgkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBfX0dGUF9IQVJEV0FMTCB8IFwKIAkJCSBfX0dGUF9ISUdITUVNKQorI2RlZmluZSBHRlBfSElHSFVTRVJfTU9WQUJMRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCisJCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfSElHSE1FTSB8IFwKKwkJCQkgX19HRlBfTU9WQUJMRSkKKyNkZWZpbmUgR0ZQX05PRlNfUEFHRUNBQ0hFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9NT1ZBQkxFKQorI2RlZmluZSBHRlBfVVNFUl9QQUdFQ0FDSEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgXAorCQkJCSBfX0dGUF9IQVJEV0FMTCB8IF9fR0ZQX01PVkFCTEUpCisjZGVmaW5lIEdGUF9ISUdIVVNFUl9QQUdFQ0FDSEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgXAorCQkJCSBfX0dGUF9IQVJEV0FMTCB8IF9fR0ZQX0hJR0hNRU0gfCBcCisJCQkJIF9fR0ZQX01PVkFCTEUpCiAKICNpZmRlZiBDT05GSUdfTlVNQQogI2RlZmluZSBHRlBfVEhJU05PREUJKF9fR0ZQX1RISVNOT0RFIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSkKQEAgLTkyLDYgKzEwNiw5IEBACiAJaWYgKGZsYWdzICYgX19HRlBfRE1BMzIpCiAJCXJldHVybiBaT05FX0RNQTMyOwogI2VuZGlmCisJaWYgKChmbGFncyAmIChfX0dGUF9ISUdITUVNIHwgX19HRlBfTU9WQUJMRSkpID09CisJCQkoX19HRlBfSElHSE1FTSB8IF9fR0ZQX01PVkFCTEUpKQorCQlyZXR1cm4gWk9ORV9NT1ZBQkxFOwogI2lmZGVmIENPTkZJR19ISUdITUVNCiAJaWYgKGZsYWdzICYgX19HRlBfSElHSE1FTSkKIAkJcmV0dXJuIFpPTkVfSElHSE1FTTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlnaG1lbS5oIGIvaW5jbHVkZS9saW51eC9oaWdobWVtLmgKaW5kZXggOThlMmNjZS4uMTJjNWU0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWdobWVtLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWdobWVtLmgKQEAgLTczLDEwICs3MywyNyBAQAogfQogCiAjaWZuZGVmIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCisvKioKKyAqIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UgLSBBbGxvY2F0ZSBhIHplcm9lZCBISUdITUVNIHBhZ2UgZm9yIGEgVk1BIHdpdGggY2FsbGVyLXNwZWNpZmllZCBtb3ZhYmxlIEdGUCBmbGFncworICogQG1vdmFibGVmbGFnczogVGhlIEdGUCBmbGFncyByZWxhdGVkIHRvIHRoZSBwYWdlcyBmdXR1cmUgYWJpbGl0eSB0byBtb3ZlIGxpa2UgX19HRlBfTU9WQUJMRQorICogQHZtYTogVGhlIFZNQSB0aGUgcGFnZSBpcyB0byBiZSBhbGxvY2F0ZWQgZm9yCisgKiBAdmFkZHI6IFRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhlIHBhZ2Ugd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgcGFnZSBmb3IgYSBWTUEgYnV0IHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQKKyAqIHRvIHNwZWNpZnkgdmlhIG1vdmFibGVmbGFncyB3aGV0aGVyIHRoZSBwYWdlIHdpbGwgYmUgbW92YWJsZSBpbiB0aGUKKyAqIGZ1dHVyZSBvciBub3QKKyAqCisgKiBBbiBhcmNoaXRlY3R1cmUgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gYnkgZGVmaW5pbmcKKyAqIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFIGFuZCBwcm92aWRpbmcgdGhlaXIgb3duCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCi1hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB2YWRkcikKK19fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UoZ2ZwX3QgbW92YWJsZWZsYWdzLAorCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQl1bnNpZ25lZCBsb25nIHZhZGRyKQogewotCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSLCB2bWEsIHZhZGRyKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IG1vdmFibGVmbGFncywKKwkJCXZtYSwgdmFkZHIpOwogCiAJaWYgKHBhZ2UpCiAJCWNsZWFyX3VzZXJfaGlnaHBhZ2UocGFnZSwgdmFkZHIpOwpAQCAtODUsNiArMTAyLDM2IEBACiB9CiAjZW5kaWYKIAorLyoqCisgKiBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSAtIEFsbG9jYXRlIGEgemVyb2VkIEhJR0hNRU0gcGFnZSBmb3IgYSBWTUEKKyAqIEB2bWE6IFRoZSBWTUEgdGhlIHBhZ2UgaXMgdG8gYmUgYWxsb2NhdGVkIGZvcgorICogQHZhZGRyOiBUaGUgdmlydHVhbCBhZGRyZXNzIHRoZSBwYWdlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBhIHBhZ2UgZm9yIGEgVk1BIHRoYXQgdGhlIGNhbGxlciBrbm93cyB3aWxsCisgKiBub3QgYmUgYWJsZSB0byBtb3ZlIGluIHRoZSBmdXR1cmUgdXNpbmcgbW92ZV9wYWdlcygpIG9yIHJlY2xhaW0uIElmIGl0CisgKiBpcyBrbm93biB0aGF0IHRoZSBwYWdlIGNhbiBtb3ZlLCB1c2UgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2VfbW92YWJsZQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICoKK2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXJldHVybiBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKDAsIHZtYSwgdmFkZHIpOworfQorCisvKioKKyAqIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlX21vdmFibGUgLSBBbGxvY2F0ZSBhIHplcm9lZCBISUdITUVNIHBhZ2UgZm9yIGEgVk1BIHRoYXQgdGhlIGNhbGxlciBrbm93cyBjYW4gbW92ZQorICogQHZtYTogVGhlIFZNQSB0aGUgcGFnZSBpcyB0byBiZSBhbGxvY2F0ZWQgZm9yCisgKiBAdmFkZHI6IFRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhlIHBhZ2Ugd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgcGFnZSBmb3IgYSBWTUEgdGhhdCB0aGUgY2FsbGVyIGtub3dzIHdpbGwKKyAqIGJlIGFibGUgdG8gbWlncmF0ZSBpbiB0aGUgZnV0dXJlIHVzaW5nIG1vdmVfcGFnZXMoKSBvciByZWNsYWltZWQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCithbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQl1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXJldHVybiBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKF9fR0ZQX01PVkFCTEUsIHZtYSwgdmFkZHIpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfaGlnaHBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IDE3YzI5ZGMuLjU0MDc5OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC0zMjksMTIgKzMyOSwxMyBAQAogI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwogCiBleHRlcm4gdm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAotCQkJCSAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSk7CisJCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKmNvbW0sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdGltZXJfZmxhZyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQogewogCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCi0JCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0pOworCQkJCSB0aW1lci0+ZnVuY3Rpb24sIHRpbWVyLT5zdGFydF9jb21tLCAwKTsKIH0KIAogZXh0ZXJuIHZvaWQgX190aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKaW5kZXggMmMxMzcxNS4uNDliNzA1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9odWdldGxiLmgKKysrIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKQEAgLTE1LDYgKzE1LDcgQEAKIH0KIAogaW50IGh1Z2V0bGJfc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitpbnQgaHVnZXRsYl90cmVhdF9tb3ZhYmxlX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiBpbnQgY29weV9odWdldGxiX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqLCBzdHJ1Y3QgbW1fc3RydWN0ICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIGludCBmb2xsb3dfaHVnZXRsYl9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHN0cnVjdCBwYWdlICoqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiosIHVuc2lnbmVkIGxvbmcgKiwgaW50ICosIGludCk7CiB2b2lkIHVubWFwX2h1Z2VwYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKQEAgLTI5LDYgKzMwLDcgQEAKIHZvaWQgaHVnZXRsYl91bnJlc2VydmVfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBvZmZzZXQsIGxvbmcgZnJlZWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfaHVnZV9wYWdlczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgaHVnZXRsYl96ZXJvLCBodWdldGxiX2luZmluaXR5OwogZXh0ZXJuIGludCBzeXNjdGxfaHVnZXRsYl9zaG1fZ3JvdXA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJvLmggYi9pbmNsdWRlL2xpbnV4L2kyby5oCmluZGV4IDUyZjUzZTIuLjMzM2EzNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMm8uaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4JLyogd29ya19zdHJ1Y3QgKi8KICNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4JLyogTmVlZGVkIGZvciBNVVRFWCBpbml0IG1hY3JvcyAqLwpAQCAtNDI1LDcgKzQyNiw3IEBACiAKIAlzdHJ1Y3QgZGV2aWNlIGRldmljZTsKIAotCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsJLyogZGV2aWNlIGxvY2sgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsJLyogZGV2aWNlIGxvY2sgKi8KIH07CiAKIC8qCkBAIC01NDQsNyArNTQ1LDcgQEAKIAlzdHJ1Y3QgaTJvX2RtYSBocnQ7CS8qIEhXIFJlc291cmNlIFRhYmxlICovCiAJaTJvX2xjdCAqbGN0OwkJLyogTG9naWNhbCBDb25maWcgVGFibGUgKi8KIAlzdHJ1Y3QgaTJvX2RtYSBkbGN0OwkvKiBUZW1wIExDVCAqLwotCXN0cnVjdCBzZW1hcGhvcmUgbGN0X2xvY2s7CS8qIExvY2sgZm9yIExDVCB1cGRhdGVzICovCisJc3RydWN0IG11dGV4IGxjdF9sb2NrOwkvKiBMb2NrIGZvciBMQ1QgdXBkYXRlcyAqLwogCXN0cnVjdCBpMm9fZG1hIHN0YXR1c19ibG9jazsJLyogSU9QIHN0YXR1cyBibG9jayAqLwogCiAJc3RydWN0IGkyb19pbyBiYXNlOwkvKiBjb250cm9sbGVyIG1lc3NhZ2luZyB1bml0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkci5oIGIvaW5jbHVkZS9saW51eC9pZHIuaAppbmRleCA5MTU1NzJmLi4wZWRkYTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRyLmgKQEAgLTc4LDggKzc4LDExIEBACiBpbnQgaWRyX3ByZV9nZXQoc3RydWN0IGlkciAqaWRwLCBnZnBfdCBnZnBfbWFzayk7CiBpbnQgaWRyX2dldF9uZXcoc3RydWN0IGlkciAqaWRwLCB2b2lkICpwdHIsIGludCAqaWQpOwogaW50IGlkcl9nZXRfbmV3X2Fib3ZlKHN0cnVjdCBpZHIgKmlkcCwgdm9pZCAqcHRyLCBpbnQgc3RhcnRpbmdfaWQsIGludCAqaWQpOworaW50IGlkcl9mb3JfZWFjaChzdHJ1Y3QgaWRyICppZHAsCisJCSBpbnQgKCpmbikoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSk7CiB2b2lkICppZHJfcmVwbGFjZShzdHJ1Y3QgaWRyICppZHAsIHZvaWQgKnB0ciwgaW50IGlkKTsKIHZvaWQgaWRyX3JlbW92ZShzdHJ1Y3QgaWRyICppZHAsIGludCBpZCk7Cit2b2lkIGlkcl9yZW1vdmVfYWxsKHN0cnVjdCBpZHIgKmlkcCk7CiB2b2lkIGlkcl9kZXN0cm95KHN0cnVjdCBpZHIgKmlkcCk7CiB2b2lkIGlkcl9pbml0KHN0cnVjdCBpZHIgKmlkcCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdC5oIGIvaW5jbHVkZS9saW51eC9pbml0LmgKaW5kZXggNTZlYzRjNi4uNWI1Mjg1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0LmgKQEAgLTE3MSw5ICsxNzEsNiBAQAogI2RlZmluZSBfX3NldHVwKHN0ciwgZm4pCQkJCQlcCiAJX19zZXR1cF9wYXJhbShzdHIsIGZuLCBmbiwgMCkKIAotI2RlZmluZSBfX29ic29sZXRlX3NldHVwKHN0cikJCQkJCVwKLQlfX3NldHVwX251bGxfcGFyYW0oc3RyLCBfX0xJTkVfXykKLQogLyogTk9URTogZm4gaXMgYXMgcGVyIG1vZHVsZV9wYXJhbSwgbm90IF9fc2V0dXAhICBFbWl0cyB3YXJuaW5nIGlmIGZuCiAgKiByZXR1cm5zIG5vbi16ZXJvLiAqLwogI2RlZmluZSBlYXJseV9wYXJhbShzdHIsIGZuKQkJCQkJXApAQCAtMjM5LDcgKzIzNiw2IEBACiAjZGVmaW5lIF9fc2V0dXBfcGFyYW0oc3RyLCB1bmlxdWVfaWQsIGZuKQkvKiBub3RoaW5nICovCiAjZGVmaW5lIF9fc2V0dXBfbnVsbF9wYXJhbShzdHIsIHVuaXF1ZV9pZCkgCS8qIG5vdGhpbmcgKi8KICNkZWZpbmUgX19zZXR1cChzdHIsIGZ1bmMpIAkJCS8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgX19vYnNvbGV0ZV9zZXR1cChzdHIpIAkJCS8qIG5vdGhpbmcgKi8KICNlbmRpZgogCiAvKiBEYXRhIG1hcmtlZCBub3QgdG8gYmUgc2F2ZWQgYnkgc29mdHdhcmUgc3VzcGVuZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaCBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKaW5kZXggMjc2Y2NhYS4uY2FiNzQxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KIAogI2RlZmluZSBJTklUX0ZEVEFCTEUgXAogewkJCQkJCQlcCkBAIC03OCw2ICs3OSw3IEBACiAJLnV0c19ucwkJPSAmaW5pdF91dHNfbnMsCQkJCQlcCiAJLm1udF9ucwkJPSBOVUxMLAkJCQkJCVwKIAlJTklUX0lQQ19OUyhpcGNfbnMpCQkJCQkJXAorCS51c2VyX25zCT0gJmluaXRfdXNlcl9ucywJCQkJXAogfQogCiAjZGVmaW5lIElOSVRfU0lHSEFORChzaWdoYW5kKSB7CQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pby5oIGIvaW5jbHVkZS9saW51eC9pby5oCmluZGV4IDg0MjNkZDMuLmUzYjJkZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvLmgKQEAgLTYzLDMyICs2Myw3IEBACiB2b2lkIF9faW9tZW0gKiBkZXZtX2lvcmVtYXBfbm9jYWNoZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpOwogdm9pZCBkZXZtX2lvdW5tYXAoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpOwotCi0vKioKLSAqCWNoZWNrX3NpZ25hdHVyZQkJLQlmaW5kIEJJT1Mgc2lnbmF0dXJlcwotICoJQGlvX2FkZHI6IG1taW8gYWRkcmVzcyB0byBjaGVjawotICoJQHNpZ25hdHVyZTogIHNpZ25hdHVyZSBibG9jawotICoJQGxlbmd0aDogbGVuZ3RoIG9mIHNpZ25hdHVyZQotICoKLSAqCVBlcmZvcm0gYSBzaWduYXR1cmUgY29tcGFyaXNvbiB3aXRoIHRoZSBtbWlvIGFkZHJlc3MgaW9fYWRkci4gVGhpcwotICoJYWRkcmVzcyBzaG91bGQgaGF2ZSBiZWVuIG9idGFpbmVkIGJ5IGlvcmVtYXAuCi0gKglSZXR1cm5zIDEgb24gYSBtYXRjaC4KLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19zaWduYXR1cmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICppb19hZGRyLAotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwgaW50IGxlbmd0aCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlkbyB7Ci0JCWlmIChyZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQotCQkJZ290byBvdXQ7Ci0JCWlvX2FkZHIrKzsKLQkJc2lnbmF0dXJlKys7Ci0JCWxlbmd0aC0tOwotCX0gd2hpbGUgKGxlbmd0aCk7Ci0JcmV0dmFsID0gMTsKLW91dDoKLQlyZXR1cm4gcmV0dmFsOwotfQoraW50IGNoZWNrX3NpZ25hdHVyZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmlvX2FkZHIsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpOwogCiAjZW5kaWYgLyogX0xJTlVYX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXBjLmggYi9pbmNsdWRlL2xpbnV4L2lwYy5oCmluZGV4IDE5ODA4NjcuLjNmZDNkZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcGMuaApAQCAtNTIsNiArNTIsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjZGVmaW5lIElQQ01OSSAzMjc2OCAgLyogPD0gTUFYX0lOVCBsaW1pdCBmb3IgaXBjIGFycmF5cyAoaW5jbHVkaW5nIHN5c2N0bCBjaGFuZ2VzKSAqLwogCkBAIC05Miw2ICs5Myw3IEBACiAKICNpZmRlZiBDT05GSUdfU1lTVklQQwogI2RlZmluZSBJTklUX0lQQ19OUyhucykJCS5ucwkJPSAmaW5pdF9pcGNfbnMsCitleHRlcm4gdm9pZCBmcmVlX2lwY19ucyhzdHJ1Y3Qga3JlZiAqa3JlZik7CiBleHRlcm4gc3RydWN0IGlwY19uYW1lc3BhY2UgKmNvcHlfaXBjcyh1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJCQkJc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKTsKICNlbHNlCkBAIC0xMDMsMTMgKzEwNSw5IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19JUENfTlMKLWV4dGVybiB2b2lkIGZyZWVfaXBjX25zKHN0cnVjdCBrcmVmICprcmVmKTsKLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpnZXRfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKLSNpZmRlZiBDT05GSUdfSVBDX05TCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKIAlpZiAobnMpCiAJCWtyZWZfZ2V0KCZucy0+a3JlZik7CiAjZW5kaWYKQEAgLTExOCw3ICsxMTYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2lwY19ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7Ci0jaWZkZWYgQ09ORklHX0lQQ19OUworI2lmZGVmIENPTkZJR19TWVNWSVBDCiAJa3JlZl9wdXQoJm5zLT5rcmVmLCBmcmVlX2lwY19ucyk7CiAjZW5kaWYKIH0KQEAgLTEyNiw1ICsxMjQsMyBAQAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9JUENfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IDE2OTUwNTQuLjQ0NjU3MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnEuaApAQCAtMTYxLDYgKzE2MSw3IEBACiAJdW5zaWduZWQgaW50CQl3YWtlX2RlcHRoOwkvKiBuZXN0ZWQgd2FrZSBlbmFibGVzICovCiAJdW5zaWduZWQgaW50CQlpcnFfY291bnQ7CS8qIEZvciBkZXRlY3RpbmcgYnJva2VuIElSUXMgKi8KIAl1bnNpZ25lZCBpbnQJCWlycXNfdW5oYW5kbGVkOworCXVuc2lnbmVkIGxvbmcJCWxhc3RfdW5oYW5kbGVkOwkvKiBBZ2luZyB0aW1lciBmb3IgdW5oYW5kbGVkIGNvdW50ICovCiAJc3BpbmxvY2tfdAkJbG9jazsKICNpZmRlZiBDT05GSUdfU01QCiAJY3B1bWFza190CQlhZmZpbml0eTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaCBiL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaAppbmRleCA1ZjA2NTI3Li5mNzNkZTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKKysrIGIvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCkBAIC03LDkgKzcsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAotI2RlZmluZSBLU1lNX05BTUVfTEVOIDEyNwotI2RlZmluZSBLU1lNX1NZTUJPTF9MRU4gKHNpemVvZigiJXMrJSNseC8lI2x4IFslc10iKSArIEtTWU1fTkFNRV9MRU4gKwlcCi0JCQkgMiooQklUU19QRVJfTE9ORyozLzEwKSArIE1PRFVMRV9OQU1FX0xFTiArIDEpCisjZGVmaW5lIEtTWU1fTkFNRV9MRU4gMTI4CisjZGVmaW5lIEtTWU1fU1lNQk9MX0xFTiAoc2l6ZW9mKCIlcyslI2x4LyUjbHggWyVzXSIpICsgKEtTWU1fTkFNRV9MRU4gLSAxKSArIFwKKwkJCSAyKihCSVRTX1BFUl9MT05HKjMvMTApICsgKE1PRFVMRV9OQU1FX0xFTiAtIDEpICsgMSkKIAogI2lmZGVmIENPTkZJR19LQUxMU1lNUwogLyogTG9va3VwIHRoZSBhZGRyZXNzIGZvciBhIHN5bWJvbC4gUmV0dXJucyAwIGlmIG5vdCBmb3VuZC4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IDdhNDg1MjUuLjFlYjljZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtMjEwLDYgKzIxMCw3IEBACiAjZGVmaW5lIFRBSU5UX01BQ0hJTkVfQ0hFQ0sJCSgxPDw0KQogI2RlZmluZSBUQUlOVF9CQURfUEFHRQkJCSgxPDw1KQogI2RlZmluZSBUQUlOVF9VU0VSCQkJKDE8PDYpCisjZGVmaW5lIFRBSU5UX0RJRQkJCSgxPDw3KQogCiBleHRlcm4gdm9pZCBkdW1wX3N0YWNrKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaCBiL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCmluZGV4IGFlYTM0ZTc0Li44YzQzNTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaApAQCAtNjQsNyArNjQsNyBAQAogCXVuc2lnbmVkIGxvbmcgbnJlY3ZkYXRhcGt0OwogCXVuc2lnbmVkIGxvbmcgbnNlbnRjdGxwa3Q7CiAJdW5zaWduZWQgbG9uZyBuc2VudGRhdGFwa3Q7Ci0Jc3RydWN0IHNlbWFwaG9yZSByZWN2X3NlbTsKKwlzdHJ1Y3QgbXV0ZXggcmVjdl9tdHg7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCByZWN2X3F1ZXVlOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZWN2X3dvcms7CiAJaW50IHJlbGVhc2VfaW5fcHJvZ3Jlc3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xlZHMuaCBiL2luY2x1ZGUvbGludXgvbGVkcy5oCmluZGV4IDg4YWZjZWYuLjQ5NGJlZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGVkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbGVkcy5oCkBAIC0xMyw3ICsxMyw2IEBACiAjZGVmaW5lIF9fTElOVVhfTEVEU19IX0lOQ0xVREVECiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogc3RydWN0IGRldmljZTsKIHN0cnVjdCBjbGFzc19kZXZpY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oIGIvaW5jbHVkZS9saW51eC9saW1pdHMuaAppbmRleCBlYWYyZTA5Li4yZDBmOTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvbGltaXRzLmgKQEAgLTUsOCArNSw2IEBACiAKICNkZWZpbmUgTkdST1VQU19NQVggICAgNjU1MzYJLyogc3VwcGxlbWVudGFsIGdyb3VwIElEcyBhcmUgYXZhaWxhYmxlICovCiAjZGVmaW5lIEFSR19NQVggICAgICAgMTMxMDcyCS8qICMgYnl0ZXMgb2YgYXJncyArIGVudmlyb24gZm9yIGV4ZWMoKSAqLwotI2RlZmluZSBDSElMRF9NQVggICAgICAgIDk5OSAgICAvKiBubyBsaW1pdCA6LSkgKi8KLSNkZWZpbmUgT1BFTl9NQVggICAgICAgICAyNTYJLyogIyBvcGVuIGZpbGVzIGEgcHJvY2VzcyBtYXkgaGF2ZSAqLwogI2RlZmluZSBMSU5LX01BWCAgICAgICAgIDEyNwkvKiAjIGxpbmtzIGEgZmlsZSBtYXkgaGF2ZSAqLwogI2RlZmluZSBNQVhfQ0FOT04gICAgICAgIDI1NQkvKiBzaXplIG9mIHRoZSBjYW5vbmljYWwgaW5wdXQgcXVldWUgKi8KICNkZWZpbmUgTUFYX0lOUFVUICAgICAgICAyNTUJLyogc2l6ZSBvZiB0aGUgdHlwZS1haGVhZCBidWZmZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGludXhfbG9nby5oIGIvaW5jbHVkZS9saW51eC9saW51eF9sb2dvLmgKaW5kZXggOWMwMWJkZS4uMDhhOTI5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saW51eF9sb2dvLmgKKysrIGIvaW5jbHVkZS9saW51eC9saW51eF9sb2dvLmgKQEAgLTMzLDUgKzMzLDEzIEBACiB9OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmZiX2ZpbmRfbG9nbyhpbnQgZGVwdGgpOworI2lmZGVmIENPTkZJR19GQl9MT0dPX0VYVFJBCitleHRlcm4gdm9pZCBmYl9hcHBlbmRfZXh0cmFfbG9nbyhjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbywKKwkJCQkgdW5zaWduZWQgaW50IG4pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9hcHBlbmRfZXh0cmFfbG9nbyhjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbywKKwkJCQkJdW5zaWduZWQgaW50IG4pCit7fQorI2VuZGlmCiAKICNlbmRpZiAvKiBfTElOVVhfTElOVVhfTE9HT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oCmluZGV4IDI0NmRlMWQuLjZmMTYzN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oCkBAIC0yNyw2ICsyNyw3IEBACiAJCQkJCQlzdHJ1Y3QgbmZzX2ZoICosCiAJCQkJCQlzdHJ1Y3QgZmlsZSAqKik7CiAJdm9pZAkJCSgqZmNsb3NlKShzdHJ1Y3QgZmlsZSAqKTsKKwl1bnNpZ25lZCBsb25nCQkoKmdldF9ncmFjZV9wZXJpb2QpKHZvaWQpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBubG1zdmNfYmluZGluZyAqCW5sbXN2Y19vcHM7CkBAIC0zOCw0ICszOSwxMiBAQAogZXh0ZXJuIGludAlsb2NrZF91cChpbnQgcHJvdG8pOwogZXh0ZXJuIHZvaWQJbG9ja2RfZG93bih2b2lkKTsKIAordW5zaWduZWQgbG9uZyBnZXRfbmZzX2dyYWNlX3BlcmlvZCh2b2lkKTsKKworI2lmZGVmIENPTkZJR19ORlNEX1Y0Cit1bnNpZ25lZCBsb25nIGdldF9uZnM0X2dyYWNlX3BlcmlvZCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X25mczRfZ3JhY2VfcGVyaW9kKHZvaWQpIHtyZXR1cm4gMDt9CisjZW5kaWYKKwogI2VuZGlmIC8qIExJTlVYX0xPQ0tEX0JJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sem8uaCBiL2luY2x1ZGUvbGludXgvbHpvLmgKaW5kZXggNTgyZDhiNy4uZDc5MzQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sem8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2x6by5oCkBAIC0xNyw3ICsxNyw3IEBACiAjZGVmaW5lIExaTzFYX01FTV9DT01QUkVTUwkoMTYzODQgKiBzaXplb2YodW5zaWduZWQgY2hhciAqKSkKICNkZWZpbmUgTFpPMVhfMV9NRU1fQ09NUFJFU1MJTFpPMVhfTUVNX0NPTVBSRVNTCiAKLSNkZWZpbmUgbHpvMXhfd29yc3RfY29tcHJlc3MoeCkgKHggKyAoeCAvIDY0KSArIDE2ICsgMykKKyNkZWZpbmUgbHpvMXhfd29yc3RfY29tcHJlc3MoeCkgKCh4KSArICgoeCkgLyAxNikgKyA2NCArIDMpCiAKIC8qIFRoaXMgcmVxdWlyZXMgJ3dvcmttZW0nIG9mIHNpemUgTFpPMVhfMV9NRU1fQ09NUFJFU1MgKi8KIGludCBsem8xeF8xX2NvbXByZXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgc2l6ZV90IHNyY19sZW4sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAppbmRleCBkYWFiYjNhLi5lMTQ3Y2Y1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKQEAgLTE1OSw3ICsxNTksNyBAQAogCiBleHRlcm4gc3RydWN0IG1lbXBvbGljeSBkZWZhdWx0X3BvbGljeTsKIGV4dGVybiBzdHJ1Y3Qgem9uZWxpc3QgKmh1Z2Vfem9uZWxpc3Qoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCXVuc2lnbmVkIGxvbmcgYWRkcik7CisJCXVuc2lnbmVkIGxvbmcgYWRkciwgZ2ZwX3QgZ2ZwX2ZsYWdzKTsKIGV4dGVybiB1bnNpZ25lZCBzbGFiX25vZGUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5KTsKIAogZXh0ZXJuIGVudW0gem9uZV90eXBlIHBvbGljeV96b25lOwpAQCAtMjU2LDkgKzI1Niw5IEBACiAjZGVmaW5lIHNldF9jcHVzZXRfYmVpbmdfcmVib3VuZCh4KSBkbyB7fSB3aGlsZSAoMCkKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZWxpc3QgKmh1Z2Vfem9uZWxpc3Qoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCXVuc2lnbmVkIGxvbmcgYWRkcikKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCBnZnBfdCBnZnBfZmxhZ3MpCiB7Ci0JcmV0dXJuIE5PREVfREFUQSgwKS0+bm9kZV96b25lbGlzdHMgKyBnZnBfem9uZShHRlBfSElHSFVTRVIpOworCXJldHVybiBOT0RFX0RBVEEoMCktPm5vZGVfem9uZWxpc3RzICsgZ2ZwX3pvbmUoZ2ZwX2ZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZG9fbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCAxYzEyMDc0Li5hNWM0NTE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0yLDcgKzIsNiBAQAogI2RlZmluZSBfTElOVVhfTU1fSAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTI3LDcgKzI2LDYgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbnVtX3BoeXNwYWdlczsKIGV4dGVybiB2b2lkICogaGlnaF9tZW1vcnk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2Vhcmx5cmVzZXJ2ZTsKIGV4dGVybiBpbnQgcGFnZV9jbHVzdGVyOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTApAQCAtNjAxLDYgKzU5OSw3IEBACiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCisJVk1fQlVHX09OKFBhZ2VTbGFiKHBhZ2UpKTsKIAlpZiAodW5saWtlbHkoUGFnZVN3YXBDYWNoZShwYWdlKSkpCiAJCW1hcHBpbmcgPSAmc3dhcHBlcl9zcGFjZTsKICNpZmRlZiBDT05GSUdfU0xVQgpAQCAtODEyLDI3ICs4MTEsMzEgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIG5ld19hZGRyKTsKIAogLyoKLSAqIFByb3RvdHlwZSB0byBhZGQgYSBzaHJpbmtlciBjYWxsYmFjayBmb3IgYWdlYWJsZSBjYWNoZXMuCi0gKiAKLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcGFzc2VkIGEgY291bnQgYG5yX3RvX3NjYW4nIGFuZCBhIGdmcG1hc2suICBUaGV5IHNob3VsZAotICogc2NhbiBgbnJfdG9fc2Nhbicgb2JqZWN0cywgYXR0ZW1wdGluZyB0byBmcmVlIHRoZW0uCisgKiBBIGNhbGxiYWNrIHlvdSBjYW4gcmVnaXN0ZXIgdG8gYXBwbHkgcHJlc3N1cmUgdG8gYWdlYWJsZSBjYWNoZXMuCiAgKgotICogVGhlIGNhbGxiYWNrIG11c3QgcmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB3aGljaCByZW1haW4gaW4gdGhlIGNhY2hlLgorICogJ3NocmluaycgaXMgcGFzc2VkIGEgY291bnQgJ25yX3RvX3NjYW4nIGFuZCBhICdnZnBtYXNrJy4gIEl0IHNob3VsZAorICogbG9vayB0aHJvdWdoIHRoZSBsZWFzdC1yZWNlbnRseS11c2VkICducl90b19zY2FuJyBlbnRyaWVzIGFuZAorICogYXR0ZW1wdCB0byBmcmVlIHRoZW0gdXAuICBJdCBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cworICogd2hpY2ggcmVtYWluIGluIHRoZSBjYWNoZS4gIElmIGl0IHJldHVybnMgLTEsIGl0IG1lYW5zIGl0IGNhbm5vdCBkbworICogYW55IHNjYW5uaW5nIGF0IHRoaXMgdGltZSAoZWcuIHRoZXJlIGlzIGEgcmlzayBvZiBkZWFkbG9jaykuCiAgKgotICogVGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIG5yX3RvX3NjYW4gPT0gMCB3aGVuIHRoZSBWTSBpcyBxdWVyeWluZyB0aGUKLSAqIGNhY2hlIHNpemUsIHNvIGEgZmFzdHBhdGggZm9yIHRoYXQgY2FzZSBpcyBhcHByb3ByaWF0ZS4KKyAqIFRoZSAnZ2ZwbWFzaycgcmVmZXJzIHRvIHRoZSBhbGxvY2F0aW9uIHdlIGFyZSBjdXJyZW50bHkgdHJ5aW5nIHRvCisgKiBmdWxmaWwuCisgKgorICogTm90ZSB0aGF0ICdzaHJpbmsnIHdpbGwgYmUgcGFzc2VkIG5yX3RvX3NjYW4gPT0gMCB3aGVuIHRoZSBWTSBpcworICogcXVlcnlpbmcgdGhlIGNhY2hlIHNpemUsIHNvIGEgZmFzdHBhdGggZm9yIHRoYXQgY2FzZSBpcyBhcHByb3ByaWF0ZS4KICAqLwotdHlwZWRlZiBpbnQgKCpzaHJpbmtlcl90KShpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spOworc3RydWN0IHNocmlua2VyIHsKKwlpbnQgKCpzaHJpbmspKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzayk7CisJaW50IHNlZWtzOwkvKiBzZWVrcyB0byByZWNyZWF0ZSBhbiBvYmogKi8KIAotLyoKLSAqIEFkZCBhbiBhZ2luZyBjYWxsYmFjay4gIFRoZSBpbnQgaXMgdGhlIG51bWJlciBvZiAnc2Vla3MnIGl0IHRha2VzCi0gKiB0byByZWNyZWF0ZSBvbmUgb2YgdGhlIG9iamVjdHMgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYWdlLgotICovCi0KLSNkZWZpbmUgREVGQVVMVF9TRUVLUyAyCi1zdHJ1Y3Qgc2hyaW5rZXI7Ci1leHRlcm4gc3RydWN0IHNocmlua2VyICpzZXRfc2hyaW5rZXIoaW50LCBzaHJpbmtlcl90KTsKLWV4dGVybiB2b2lkIHJlbW92ZV9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyKTsKKwkvKiBUaGVzZSBhcmUgZm9yIGludGVybmFsIHVzZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlsb25nIG5yOwkvKiBvYmpzIHBlbmRpbmcgZGVsZXRlICovCit9OworI2RlZmluZSBERUZBVUxUX1NFRUtTIDIgLyogQSBnb29kIG51bWJlciBpZiB5b3UgZG9uJ3Qga25vdyBiZXR0ZXIuICovCitleHRlcm4gdm9pZCByZWdpc3Rlcl9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKik7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqKTsKIAogLyoKICAqIFNvbWUgc2hhcmVkIG1hcHBpZ25zIHdpbGwgd2FudCB0aGUgcGFnZXMgbWFya2VkIHJlYWQtb25seQpAQCAtMTA3Miw2ICsxMDc1LDEwIEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBkb19tbWFwX3Bnb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKIAl1bnNpZ25lZCBsb25nIGZsYWcsIHVuc2lnbmVkIGxvbmcgcGdvZmYpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW1hcF9yZWdpb24oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncywKKwl1bnNpZ25lZCBpbnQgdm1fZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJaW50IGFjY291bnRhYmxlKTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggZDA5YjEzNC4uZGE4ZWI4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC0yNCw2ICsyNCwxNCBAQAogI2VuZGlmCiAjZGVmaW5lIE1BWF9PUkRFUl9OUl9QQUdFUyAoMSA8PCAoTUFYX09SREVSIC0gMSkpCiAKKy8qCisgKiBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUiBpcyB0aGUgb3JkZXIgYXQgd2hpY2ggYWxsb2NhdGlvbnMgYXJlIGRlZW1lZAorICogY29zdGx5IHRvIHNlcnZpY2UuICBUaGF0IGlzIGJldHdlZW4gYWxsb2NhdGlvbiBvcmRlcnMgd2hpY2ggc2hvdWxkCisgKiBjb2VsZXNjZSBuYXR1cmFsbHkgdW5kZXIgcmVhc29uYWJsZSByZWNsYWltIHByZXNzdXJlIGFuZCB0aG9zZSB3aGljaAorICogd2lsbCBub3QuCisgKi8KKyNkZWZpbmUgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgMworCiBzdHJ1Y3QgZnJlZV9hcmVhIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfbGlzdDsKIAl1bnNpZ25lZCBsb25nCQlucl9mcmVlOwpAQCAtMTQ2LDYgKzE1NCw3IEBACiAJICovCiAJWk9ORV9ISUdITUVNLAogI2VuZGlmCisJWk9ORV9NT1ZBQkxFLAogCU1BWF9OUl9aT05FUwogfTsKIApAQCAtMTY3LDYgKzE3Niw3IEBACiAJKyBkZWZpbmVkKENPTkZJR19aT05FX0RNQTMyKQlcCiAJKyAxCQkJCVwKIAkrIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pCVwKKwkrIDEJCQkJXAogKQogI2lmIF9fWk9ORV9DT1VOVCA8IDIKICNkZWZpbmUgWk9ORVNfU0hJRlQgMApAQCAtNDk5LDEwICs1MDksMjIgQEAKIAlyZXR1cm4gKCEhem9uZS0+cHJlc2VudF9wYWdlcyk7CiB9CiAKK2V4dGVybiBpbnQgbW92YWJsZV96b25lOworCitzdGF0aWMgaW5saW5lIGludCB6b25lX21vdmFibGVfaXNfaGlnaG1lbSh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQKQorCXJldHVybiBtb3ZhYmxlX3pvbmUgPT0gWk9ORV9ISUdITUVNOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCiBzdGF0aWMgaW5saW5lIGludCBpc19oaWdobWVtX2lkeChlbnVtIHpvbmVfdHlwZSBpZHgpCiB7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQlyZXR1cm4gKGlkeCA9PSBaT05FX0hJR0hNRU0pOworCXJldHVybiAoaWR4ID09IFpPTkVfSElHSE1FTSB8fAorCQkoaWR4ID09IFpPTkVfTU9WQUJMRSAmJiB6b25lX21vdmFibGVfaXNfaGlnaG1lbSgpKSk7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC01MjIsNyArNTQ0LDkgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2hpZ2htZW0oc3RydWN0IHpvbmUgKnpvbmUpCiB7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQlyZXR1cm4gem9uZSA9PSB6b25lLT56b25lX3BnZGF0LT5ub2RlX3pvbmVzICsgWk9ORV9ISUdITUVNOworCWludCB6b25lX2lkeCA9IHpvbmUgLSB6b25lLT56b25lX3BnZGF0LT5ub2RlX3pvbmVzOworCXJldHVybiB6b25lX2lkeCA9PSBaT05FX0hJR0hNRU0gfHwKKwkJKHpvbmVfaWR4ID09IFpPTkVfTU9WQUJMRSAmJiB6b25lX21vdmFibGVfaXNfaGlnaG1lbSgpKTsKICNlbHNlCiAJcmV0dXJuIDA7CiAjZW5kaWYKQEAgLTU2Niw2ICs1OTAsMTEgQEAKIGludCBzeXNjdGxfbWluX3NsYWJfcmF0aW9fc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCiAJCQlzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogCitleHRlcm4gaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKKwkJCXN0cnVjdCBmaWxlICosIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitleHRlcm4gY2hhciBudW1hX3pvbmVsaXN0X29yZGVyW107CisjZGVmaW5lIE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOIDE2CS8qIHN0cmluZyBidWZmZXIgc2l6ZSAqLworCiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY3VycmVudCBOb2RlLiAqLwogI2lmbmRlZiBudW1hX25vZGVfaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKaW5kZXggMWZhNGQ5OC4uOGVlZDQ0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKQEAgLTE0LDcgKzE0LDcgQEAKIAlpbnQgZXZlbnQ7CiB9OwogCi1leHRlcm4gc3RydWN0IG1udF9uYW1lc3BhY2UgKmNvcHlfbW50X25zKGludCwgc3RydWN0IG1udF9uYW1lc3BhY2UgKiwKK2V4dGVybiBzdHJ1Y3QgbW50X25hbWVzcGFjZSAqY29weV9tbnRfbnModW5zaWduZWQgbG9uZywgc3RydWN0IG1udF9uYW1lc3BhY2UgKiwKIAkJc3RydWN0IGZzX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIF9fcHV0X21udF9ucyhzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCBlNmUwZjg2Li5iNmE2NDZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTYsNyArNiw2IEBACiAgKiBSZXdyaXR0ZW4gYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4gRGVjIDE5OTYKICAqIFJld3JpdHRlbiBhZ2FpbiBieSBSdXN0eSBSdXNzZWxsLCAyMDAyCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaCBiL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaAppbmRleCAwZTA5YzAwLi5mOTUwOTIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCkBAIC0xNDYsNyArMTQ2LDcgQEAKIH07CiAKIHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgewotCV9fdTgJbmFtZVs4XSxleHRbM107CS8qIG5hbWUgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJbmFtZVtNU0RPU19OQU1FXTsvKiBuYW1lIGFuZCBleHRlbnNpb24gKi8KIAlfX3U4CWF0dHI7CQkvKiBhdHRyaWJ1dGUgYml0cyAqLwogCV9fdTggICAgbGNhc2U7CQkvKiBDYXNlIGZvciBiYXNlIGFuZCBleHRlbnNpb24gKi8KIAlfX3U4CWN0aW1lX2NzOwkvKiBDcmVhdGlvbiB0aW1lLCBjZW50aXNlY29uZHMgKDAtMTk5KSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaCBiL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKaW5kZXggODNlMzllYi4uODg3NjZlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCkBAIC0xNDgsOCArMTQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uY3BfZnNfaS5oPgogI2luY2x1ZGUgPGxpbnV4L25jcF9mc19zYi5oPgogCi0vKiB1bmRlZiBiZWNhdXNlIHB1YmxpYyBkZWZpbmUgaW4gdW1zZG9zX2ZzLmggKG5jcF9mcy5oIGlzbid0IHB1YmxpYykgKi8KLSN1bmRlZiBQUklOVEsKIC8qIGRlZmluZSBiZWNhdXNlIGl0IGlzIGVhc3kgdG8gY2hhbmdlIFBSSU5USyB0byB7Kn1QUklOVEsgKi8KICNkZWZpbmUgUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggMzIyYjVlYS4uZGE3YTEzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC0yNjIsOCArMjYyLDYgQEAKIAlfX0xJTktfU1RBVEVfTElOS1dBVENIX1BFTkRJTkcsCiAJX19MSU5LX1NUQVRFX0RPUk1BTlQsCiAJX19MSU5LX1NUQVRFX1FESVNDX1JVTk5JTkcsCi0JLyogU2V0IGJ5IHRoZSBuZXRwb2xsIE5BUEkgY29kZSAqLwotCV9fTElOS19TVEFURV9QT0xMX0xJU1RfRlJPWkVOLAogfTsKIAogCkBAIC0xMDIyLDE0ICsxMDIwLDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0jaWZkZWYgQ09ORklHX05FVFBPTEwKLQkvKiBQcmV2ZW50IHJhY2Ugd2l0aCBuZXRwb2xsIC0geWVzLCB0aGlzIGlzIGEga2x1ZGdlLgotCSAqIEJ1dCBhdCBsZWFzdCBpdCBkb2Vzbid0IHBlbmFsaXplIHRoZSBub24tbmV0cG9sbAotCSAqIGNvZGUgcGF0aC4gKi8KLQlpZiAodGVzdF9iaXQoX19MSU5LX1NUQVRFX1BPTExfTElTVF9GUk9aRU4sICZkZXYtPnN0YXRlKSkKLQkJcmV0dXJuOwotI2VuZGlmCi0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaAppbmRleCA5ZjYyZDYxLi43OGZlYjdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCkBAIC00Miw2ICs0Miw5IEBACiAjZGVmaW5lCU5GU0VYUF9OT0FDTAkJMHg4MDAwCS8qIHJlc2VydmVkIGZvciBwb3NzaWJsZSBBQ0wgcmVsYXRlZCB1c2UgKi8KICNkZWZpbmUgTkZTRVhQX0FMTEZMQUdTCQkweEZFM0YKIAorLyogVGhlIGZsYWdzIHRoYXQgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHNlY3VyaXR5IGZsYXZvcjogKi8KKyNkZWZpbmUgTkZTRVhQX1NFQ0lORk9fRkxBR1MJKE5GU0VYUF9SRUFET05MWSB8IE5GU0VYUF9ST09UU1FVQVNIIFwKKwkJCQkJfCBORlNFWFBfQUxMU1FVQVNIKQogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC02NCw2ICs2NywxOSBAQAogCWludCBtaWdyYXRlZDsKIH07CiAKKy8qCisgKiBXZSBrZWVwIGFuIGFycmF5IG9mIHBzZXVkb2ZsYXZvcnMgd2l0aCB0aGUgZXhwb3J0LCBpbiBvcmRlciBmcm9tIG1vc3QKKyAqIHRvIGxlYXN0IHByZWZlcnJlZC4gIEZvciB0aGUgZm9yc2VlYWJsZSBmdXR1cmUsIHdlIGRvbid0IGV4cGVjdCBtb3JlCisgKiB0aGFuIHRoZSBlaWdodCBwc2V1ZG9mbGF2b3JzIG51bGwsIHVuaXgsIGtyYjUsIGtyYjVpLCBrcmI1cCwgc2twbTMsCisgKiBzcGttM2ksIGFuZCBzcGttM3AgKGFuZCB1c2luZyBhbGwgOCBhdCBvbmNlIHNob3VsZCBiZSByYXJlKS4KKyAqLworI2RlZmluZSBNQVhfU0VDSU5GT19MSVNUCTgKKworc3RydWN0IGV4cF9mbGF2b3JfaW5mbyB7CisJdTMyCXBzZXVkb2ZsYXZvcjsKKwl1MzIJZmxhZ3M7Cit9OworCiBzdHJ1Y3Qgc3ZjX2V4cG9ydCB7CiAJc3RydWN0IGNhY2hlX2hlYWQJaDsKIAlzdHJ1Y3QgYXV0aF9kb21haW4gKglleF9jbGllbnQ7CkBAIC03Niw2ICs5Miw4IEBACiAJaW50CQkJZXhfZnNpZDsKIAl1bnNpZ25lZCBjaGFyICoJCWV4X3V1aWQ7IC8qIDE2IGJ5dGUgZnNpZCAqLwogCXN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgZXhfZnNsb2NzOworCWludAkJCWV4X25mbGF2b3JzOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8JZXhfZmxhdm9yc1tNQVhfU0VDSU5GT19MSVNUXTsKIH07CiAKIC8qIGFuICJleHBvcnQga2V5IiAoZXhwa2V5KSBtYXBzIGEgZmlsZWhhbmRsZWZyYWdlbWVudCB0byBhbgpAQCAtOTUsMTAgKzExMywyMiBAQAogCiAjZGVmaW5lIEVYX1NFQ1VSRShleHApCQkoISgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfSU5TRUNVUkVfUE9SVCkpCiAjZGVmaW5lIEVYX0lTU1lOQyhleHApCQkoISgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfQVNZTkMpKQotI2RlZmluZSBFWF9SRE9OTFkoZXhwKQkJKChleHApLT5leF9mbGFncyAmIE5GU0VYUF9SRUFET05MWSkKICNkZWZpbmUgRVhfTk9ISURFKGV4cCkJCSgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfTk9ISURFKQogI2RlZmluZSBFWF9XR0FUSEVSKGV4cCkJCSgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfR0FUSEVSRURfV1JJVEVTKQogCitzdGF0aWMgaW5saW5lIGludCBFWF9SRE9OTFkoc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICpmOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmVuZCA9IGV4cC0+ZXhfZmxhdm9ycyArIGV4cC0+ZXhfbmZsYXZvcnM7CisKKwlmb3IgKGYgPSBleHAtPmV4X2ZsYXZvcnM7IGYgPCBlbmQ7IGYrKykgeworCQlpZiAoZi0+cHNldWRvZmxhdm9yID09IHJxc3RwLT5ycV9mbGF2b3IpCisJCQlyZXR1cm4gZi0+ZmxhZ3MgJiBORlNFWFBfUkVBRE9OTFk7CisJfQorCXJldHVybiBleHAtPmV4X2ZsYWdzICYgTkZTRVhQX1JFQURPTkxZOworfQorCitfX2JlMzIgY2hlY2tfbmZzZF9hY2Nlc3Moc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCk7CiAKIC8qCiAgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMKQEAgLTExMiwxMyArMTQyLDE5IEBACiAJCQkJCXN0cnVjdCB2ZnNtb3VudCAqbW50LAogCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCXN0cnVjdCBjYWNoZV9yZXEgKnJlcXApOworc3RydWN0IHN2Y19leHBvcnQgKglycXN0X2V4cF9nZXRfYnlfbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKKwkJCQkJICAgICBzdHJ1Y3QgdmZzbW91bnQgKiwKKwkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICopOwogc3RydWN0IHN2Y19leHBvcnQgKglleHBfcGFyZW50KHN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwLAogCQkJCSAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LAogCQkJCSAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkgICBzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKTsKK3N0cnVjdCBzdmNfZXhwb3J0ICoJcnFzdF9leHBfcGFyZW50KHN0cnVjdCBzdmNfcnFzdCAqLAorCQkJCQlzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGludAkJCWV4cF9yb290Zmgoc3RydWN0IGF1dGhfZG9tYWluICosIAogCQkJCQljaGFyICpwYXRoLCBzdHJ1Y3Qga25mc2RfZmggKiwgaW50IG1heHNpemUpOwotX19iZTMyCQkJZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IGF1dGhfZG9tYWluICosIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGNhY2hlX3JlcSAqY3JlcSk7CitfX2JlMzIJCQlleHBfcHNldWRvcm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqKTsKIF9fYmUzMgkJCW5mc2Vycm5vKGludCBlcnJubyk7CiAKIGV4dGVybiBzdHJ1Y3QgY2FjaGVfZGV0YWlsIHN2Y19leHBvcnRfY2FjaGU7CkBAIC0xMzUsNiArMTcxLDcgQEAKIGV4dGVybiBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCiBleHBfZmluZChzdHJ1Y3QgYXV0aF9kb21haW4gKmNscCwgaW50IGZzaWRfdHlwZSwgdTMyICpmc2lkdiwKIAkgc3RydWN0IGNhY2hlX3JlcSAqcmVxcCk7CitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqIHJxc3RfZXhwX2ZpbmQoc3RydWN0IHN2Y19ycXN0ICosIGludCwgdTMyICopOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvaW50ZXJmYWNlLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDk3OTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvbGludXgvbmZzZC9pbnRlcmZhY2UuaAotICoKLSAqIGRlZmluZXMgaW50ZXJmYWNlIGJldHdlZW4gbmZzZCBhbmQgb3RoZXIgYml0cyBvZgotICogdGhlIGtlcm5lbC4gIFBhcnRpY3VsYXJseSBmaWxlc3lzdGVtcyAoZXZlbnR1YWxseSkuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KLSAqLwotCi0jaWZuZGVmIExJTlVYX05GU0RfSU5URVJGQUNFX0gKLSNkZWZpbmUgTElOVVhfTkZTRF9JTlRFUkZBQ0VfSAotCi0jZW5kaWYgLyogTElOVVhfTkZTRF9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKaW5kZXggNzJmZWFjNS4uZTQ1MjI1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL2F1dGguaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9pbnRlcmZhY2UuaD4KIC8qCiAgKiBuZnNkIHZlcnNpb24KICAqLwpAQCAtNzIsNiArNzEsOSBAQAogCQkgICAgICAgICAgICAgICAgc3RydWN0IHN2Y19leHBvcnQgKipleHBwKTsKIF9fYmUzMgkJbmZzZF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQljb25zdCBjaGFyICosIGludCwgc3RydWN0IHN2Y19maCAqKTsKK19fYmUzMgkJIG5mc2RfbG9va3VwX2RlbnRyeShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorCQkJCWNvbnN0IGNoYXIgKiwgaW50LAorCQkJCXN0cnVjdCBzdmNfZXhwb3J0ICoqLCBzdHJ1Y3QgZGVudHJ5ICoqKTsKIF9fYmUzMgkJbmZzZF9zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJc3RydWN0IGlhdHRyICosIGludCwgdGltZV90KTsKICNpZmRlZiBDT05GSUdfTkZTRF9WNApAQCAtMTIwLDcgKzEyMiw4IEBACiAJCQkJc3RydWN0IGtzdGF0ZnMgKik7CiAKIGludAkJbmZzZF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaWF0dHIgKik7Ci1fX2JlMzIJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitfX2JlMzIJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19leHBvcnQgKiwKKwkJCQlzdHJ1Y3QgZGVudHJ5ICosIGludCk7CiBpbnQJCW5mc2Rfc3luY19kaXIoc3RydWN0IGRlbnRyeSAqZHApOwogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTRF9WMl9BQ0wpIHx8IGRlZmluZWQoQ09ORklHX05GU0RfVjNfQUNMKQpAQCAtMTQ5LDYgKzE1Miw3IEBACiAgKiBORlN2NCBTdGF0ZQogICovCiAjaWZkZWYgQ09ORklHX05GU0RfVjQKK2V4dGVybiB1bnNpZ25lZCBpbnQgbWF4X2RlbGVnYXRpb25zOwogdm9pZCBuZnM0X3N0YXRlX2luaXQodm9pZCk7CiBpbnQgbmZzNF9zdGF0ZV9zdGFydCh2b2lkKTsKIHZvaWQgbmZzNF9zdGF0ZV9zaHV0ZG93bih2b2lkKTsKQEAgLTIzNiw2ICsyNDAsNyBAQAogI2RlZmluZQluZnNlcnJfYmFkbmFtZQkJX19jb25zdGFudF9odG9ubChORlNFUlJfQkFETkFNRSkKICNkZWZpbmUJbmZzZXJyX2NiX3BhdGhfZG93bglfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9DQl9QQVRIX0RPV04pCiAjZGVmaW5lCW5mc2Vycl9sb2NrZWQJCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0xPQ0tFRCkKKyNkZWZpbmUJbmZzZXJyX3dyb25nc2VjCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9XUk9OR1NFQykKICNkZWZpbmUJbmZzZXJyX3JlcGxheV9tZQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9SRVBMQVlfTUUpCiAKIC8qIGVycm9yIGNvZGVzIGZvciBpbnRlcm5hbCB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKaW5kZXggYWI1YzIzNi4uZGIzNDhmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKQEAgLTY3LDcgKzY3LDcgQEAKIAlpbnQJCQljYnJfdHJ1bmM7CiAJc3RhdGVpZF90CQljYnJfc3RhdGVpZDsKIAl1MzIJCQljYnJfZmhsZW47Ci0JdTMyCQkJY2JyX2ZodmFsW05GUzRfRkhTSVpFXTsKKwljaGFyCQkJY2JyX2ZodmFsW05GUzRfRkhTSVpFXTsKIAlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uCSpjYnJfZHA7CiB9OwogCkBAIC0yMjQsNiArMjI0LDcgQEAKIAlzdHJ1Y3QgaW5vZGUJCSpmaV9pbm9kZTsKIAl1MzIgICAgICAgICAgICAgICAgICAgICBmaV9pZDsgICAgICAvKiB1c2VkIHdpdGggc3RhdGVvd25lci0+c29faWQgCiAJCQkJCSAgICAgKiBmb3Igc3RhdGVpZF9oYXNodGJsIGhhc2ggKi8KKwlib29sCQkJZmlfaGFkX2NvbmZsaWN0OwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmggYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCmluZGV4IDA5Nzk5YmMuLjFiNjUzMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaApAQCAtMjkzLDYgKzI5MywxMiBAQAogCXN0cnVjdCBuZnNkNF9jaGFuZ2VfaW5mbyAgcm5fdGluZm87IC8qIHJlc3BvbnNlICovCiB9OwogCitzdHJ1Y3QgbmZzZDRfc2VjaW5mbyB7CisJdTMyIHNpX25hbWVsZW47CQkJCQkvKiByZXF1ZXN0ICovCisJY2hhciAqc2lfbmFtZTsJCQkJCS8qIHJlcXVlc3QgKi8KKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqc2lfZXhwOwkJCS8qIHJlc3BvbnNlICovCit9OworCiBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciB7CiAJc3RhdGVpZF90CXNhX3N0YXRlaWQ7ICAgICAgICAgLyogcmVxdWVzdCAqLwogCXUzMgkJc2FfYm12YWxbMl07ICAgICAgICAvKiByZXF1ZXN0ICovCkBAIC0zNjUsNiArMzcxLDcgQEAKIAkJc3RydWN0IG5mc2Q0X3JlbW92ZQkJcmVtb3ZlOwogCQlzdHJ1Y3QgbmZzZDRfcmVuYW1lCQlyZW5hbWU7CiAJCWNsaWVudGlkX3QJCQlyZW5ldzsKKwkJc3RydWN0IG5mc2Q0X3NlY2luZm8JCXNlY2luZm87CiAJCXN0cnVjdCBuZnNkNF9zZXRhdHRyCQlzZXRhdHRyOwogCQlzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQJc2V0Y2xpZW50aWQ7CiAJCXN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtIHNldGNsaWVudGlkX2NvbmZpcm07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25zcHJveHkuaCBiL2luY2x1ZGUvbGludXgvbnNwcm94eS5oCmluZGV4IDE4OWUwZGMuLmNlMDYxODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbnNwcm94eS5oCisrKyBiL2luY2x1ZGUvbGludXgvbnNwcm94eS5oCkBAIC0yOCwxMCArMjgsMTEgQEAKIAlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqaXBjX25zOwogCXN0cnVjdCBtbnRfbmFtZXNwYWNlICptbnRfbnM7CiAJc3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9uczsKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7CiB9OwogZXh0ZXJuIHN0cnVjdCBuc3Byb3h5IGluaXRfbnNwcm94eTsKIAotaW50IGNvcHlfbmFtZXNwYWNlcyhpbnQgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKK2ludCBjb3B5X25hbWVzcGFjZXModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogdm9pZCBnZXRfdGFza19uYW1lc3BhY2VzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIHZvaWQgZnJlZV9uc3Byb3h5KHN0cnVjdCBuc3Byb3h5ICpucyk7CiBpbnQgdW5zaGFyZV9uc3Byb3h5X25hbWVzcGFjZXModW5zaWduZWQgbG9uZywgc3RydWN0IG5zcHJveHkgKiosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCAzN2E3MTU4Li41ZTg0ZjJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTQzMiw2ICs0MzIsOCBAQAogICogY29kZSwgb3IgcGNpIGNvcmUgY29kZS4gKi8KIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHBjaV9yb290X2J1c2VzOwkvKiBsaXN0IG9mIGFsbCBrbm93biBQQ0kgYnVzZXMgKi8KIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHBjaV9kZXZpY2VzOwkvKiBsaXN0IG9mIGFsbCBkZXZpY2VzICovCisvKiBTb21lIGRldmljZSBkcml2ZXJzIG5lZWQga25vdyBpZiBwY2kgaXMgaW5pdGlhdGVkICovCitleHRlcm4gaW50IG5vX3BjaV9kZXZpY2VzKHZvaWQpOwogCiB2b2lkIHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICopOwogaW50IF9fbXVzdF9jaGVjayBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKiwgaW50IG1hc2spOwpAQCAtNzI0LDYgKzcyNiw3IEBACiB7IHJldHVybiBOVUxMOyB9CiAKICNkZWZpbmUgcGNpX2Rldl9wcmVzZW50KGlkcykJKDApCisjZGVmaW5lIG5vX3BjaV9kZXZpY2VzKCkJKDEpCiAjZGVmaW5lIHBjaV9maW5kX3ByZXNlbnQoaWRzKQkoTlVMTCkKICNkZWZpbmUgcGNpX2Rldl9wdXQoZGV2KQlkbyB7IH0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1LmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCmluZGV4IGI3MmJlMmYuLjkyNmFkYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHUuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19MSU5VWF9QRVJDUFVfSAogI2RlZmluZSBfX0xJTlVYX1BFUkNQVV9ICiAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPiAvKiBGb3IgcHJlZW1wdF9kaXNhYmxlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPiAvKiBGb3Iga21hbGxvYygpICovCiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIEZvciBtZW1zZXQoKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCmluZGV4IGY1YWE1OTMuLjNkOWY3MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTE3LDYgKzE4LDkgQEAKIHN0cnVjdCBwZXJjcHVfY291bnRlciB7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXM2NCBjb3VudDsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIEFsbCBwZXJjcHVfY291bnRlcnMgYXJlIG9uIGEgbGlzdCAqLworI2VuZGlmCiAJczMyICpjb3VudGVyczsKIH07CiAKQEAgLTI2LDE4ICszMCw4IEBACiAjZGVmaW5lIEZCQ19CQVRDSAkoTlJfQ1BVUyo0KQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQotewotCXNwaW5fbG9ja19pbml0KCZmYmMtPmxvY2spOwotCWZiYy0+Y291bnQgPSBhbW91bnQ7Ci0JZmJjLT5jb3VudGVycyA9IGFsbG9jX3BlcmNwdShzMzIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKLXsKLQlmcmVlX3BlcmNwdShmYmMtPmNvdW50ZXJzKTsKLX0KLQordm9pZCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KTsKK3ZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyk7CiB2b2lkIHBlcmNwdV9jb3VudGVyX21vZChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczMyIGFtb3VudCk7CiBzNjQgcGVyY3B1X2NvdW50ZXJfc3VtKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaAppbmRleCAxNjljNmMyLi5iOWExN2UwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaApAQCAtMjksNyArMjksNyBAQAogCWtyZWZfZ2V0KCZucy0+a3JlZik7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY29weV9waWRfbnMoaW50IGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpOworZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpjb3B5X3BpZF9ucyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpOwogZXh0ZXJuIHZvaWQgZnJlZV9waWRfbnMoc3RydWN0IGtyZWYgKmtyZWYpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BpZF9ucyhzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ByY3RsLmggYi9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKaW5kZXggNTJhOWJlNC4uZTJlZmY5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcmN0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJjdGwuaApAQCAtNTksNCArNTksOCBAQAogIyBkZWZpbmUgUFJfRU5ESUFOX0xJVFRMRQkxCS8qIFRydWUgbGl0dGxlIGVuZGlhbiBtb2RlICovCiAjIGRlZmluZSBQUl9FTkRJQU5fUFBDX0xJVFRMRQkyCS8qICJQb3dlclBDIiBwc2V1ZG8gbGl0dGxlIGVuZGlhbiAqLwogCisvKiBHZXQvc2V0IHByb2Nlc3Mgc2VjY29tcCBtb2RlICovCisjZGVmaW5lIFBSX0dFVF9TRUNDT01QCTIxCisjZGVmaW5lIFBSX1NFVF9TRUNDT01QCTIyCisKICNlbmRpZiAvKiBfTElOVVhfUFJDVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oIGIvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oCmluZGV4IGZjODZmMjcuLjFhZGZlNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaAorKysgYi9pbmNsdWRlL2xpbnV4L3ByZWZldGNoLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAkKIAlwcmVmZXRjaCh4KSAgCS0gcHJlZmV0Y2hlcyB0aGUgY2FjaGVsaW5lIGF0ICJ4IiBmb3IgcmVhZAogCXByZWZldGNodyh4KQktIHByZWZldGNoZXMgdGhlIGNhY2hlbGluZSBhdCAieCIgZm9yIHdyaXRlCi0Jc3Bpbl9sb2NrX3ByZWZldGNoKHgpIC0gcHJlZmVjdGNoZXMgdGhlIHNwaW5sb2NrICp4IGZvciB0YWtpbmcKKwlzcGluX2xvY2tfcHJlZmV0Y2goeCkgLSBwcmVmZXRjaGVzIHRoZSBzcGlubG9jayAqeCBmb3IgdGFraW5nCiAJCiAJdGhlcmUgaXMgYWxzbyBQUkVGRVRDSF9TVFJJREUgd2hpY2ggaXMgdGhlIGFyY2hpdGVjdXJlLXByZWZlcmVkIAogCSJsb29rYWhlYWQiIHNpemUgZm9yIHByZWZldGNoaW5nIHN0cmVhbWVkIG9wZXJhdGlvbnMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaCBiL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCmluZGV4IDM0NjlmOTYuLjI4ZTM2NjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCkBAIC03LDYgKzcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCitzdHJ1Y3QgY29tcGxldGlvbjsKKwogLyoKICAqIFRoZSBwcm9jIGZpbGVzeXN0ZW0gY29uc3RhbnRzL3N0cnVjdHVyZXMKICAqLwpAQCAtNTYsNiArNTgsMTQgQEAKIAlnaWRfdCBnaWQ7CiAJbG9mZl90IHNpemU7CiAJY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgKnByb2NfaW9wczsKKwkvKgorCSAqIE5VTEwgLT5wcm9jX2ZvcHMgbWVhbnMgIlBERSBpcyBnb2luZyBhd2F5IFJTTiIgb3IKKwkgKiAiUERFIGlzIGp1c3QgY3JlYXRlZCIuIEluIGVpdGhlciBjYXNlLCBlLmcuIC0+cmVhZF9wcm9jIHdvbid0IGJlCisJICogY2FsbGVkIGJlY2F1c2UgaXQncyB0b28gbGF0ZSBvciB0b28gZWFybHksIHJlc3BlY3RpdmVseS4KKwkgKgorCSAqIElmIHlvdSdyZSBhbGxvY2F0aW5nIC0+cHJvY19mb3BzIGR5bmFtaWNhbGx5LCBzYXZlIGEgcG9pbnRlcgorCSAqIHNvbWV3aGVyZS4KKwkgKi8KIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpwcm9jX2ZvcHM7CiAJZ2V0X2luZm9fdCAqZ2V0X2luZm87CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CkBAIC02Niw2ICs3Niw5IEBACiAJYXRvbWljX3QgY291bnQ7CQkvKiB1c2UgY291bnQgKi8KIAlpbnQgZGVsZXRlZDsJCS8qIGRlbGV0ZSBmbGFnICovCiAJdm9pZCAqc2V0OworCWludCBwZGVfdXNlcnM7CS8qIG51bWJlciBvZiBjYWxsZXJzIGludG8gbW9kdWxlIGluIHByb2dyZXNzICovCisJc3BpbmxvY2tfdCBwZGVfdW5sb2FkX2xvY2s7IC8qIHByb2NfZm9wcyBjaGVja3MgYW5kIHBkZV91c2VycyBidW1wcyAqLworCXN0cnVjdCBjb21wbGV0aW9uICpwZGVfdW5sb2FkX2NvbXBsZXRpb247CiB9OwogCiBzdHJ1Y3Qga2NvcmVfbGlzdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaAppbmRleCBlZWIxOTc2Li5hZTgxNDZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKQEAgLTExMCw2ICsxMTAsOCBAQAogCQlfX3B0cmFjZV91bmxpbmsoY2hpbGQpOwogfQogCitpbnQgZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGxvbmcgYWRkciwgbG9uZyBkYXRhKTsKK2ludCBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbG9uZyBhZGRyLCBsb25nIGRhdGEpOwogCiAjaWZuZGVmIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4KIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKaW5kZXggZGQ1YTA1ZC4uNzVlMTdhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaApAQCAtMjYyLDcgKzI2Miw3IEBACiAKIGNoYXIgKmZpbGVfcGF0aChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBpbnQgY291bnQpOwogdm9pZCBiaXRtYXBfcHJpbnRfc2Ioc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKLWludCBiaXRtYXBfdXBkYXRlX3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Cit2b2lkIGJpdG1hcF91cGRhdGVfc2Ioc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKIAogaW50ICBiaXRtYXBfc2V0YWxsYml0cyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogdm9pZCBiaXRtYXBfd3JpdGVfYWxsKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CkBAIC0yNzgsOCArMjc4LDggQEAKIHZvaWQgYml0bWFwX2VuZF9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgKmJsb2NrcywgaW50IGFib3J0ZWQpOwogdm9pZCBiaXRtYXBfY2xvc2Vfc3luYyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogCi1pbnQgYml0bWFwX3VucGx1ZyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwotaW50IGJpdG1hcF9kYWVtb25fd29yayhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwordm9pZCBiaXRtYXBfdW5wbHVnKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Cit2b2lkIGJpdG1hcF9kYWVtb25fd29yayhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaCBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKaW5kZXggZGU3MmM0OS4uMjhhYzYzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCkBAIC01MSw3ICs1MSw3IEBACiAKIAlzZWN0b3JfdCBzaXplOwkJCS8qIERldmljZSBzaXplIChpbiBibG9ja3MpICovCiAJbWRkZXZfdCAqbWRkZXY7CQkJLyogUkFJRCBhcnJheSBpZiBydW5uaW5nICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X2V2ZW50czsJLyogSU8gZXZlbnQgdGltZXN0YW1wICovCisJbG9uZyBsYXN0X2V2ZW50czsJCS8qIElPIGV2ZW50IHRpbWVzdGFtcCAqLwogCiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsJLyogYmxvY2sgZGV2aWNlIGhhbmRsZSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J0Yy9tNDh0NTkuaCBiL2luY2x1ZGUvbGludXgvcnRjL200OHQ1OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YzdjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3J0Yy9tNDh0NTkuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmgKKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIHBsYXRmb3JtIGRhdGEgb2YgbTQ4dDU5IFJUQyBjaGlwIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuCisgKgorICogTWFyayBaaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1JUQ19NNDhUNTlfSF8KKyNkZWZpbmUgX0xJTlVYX1JUQ19NNDhUNTlfSF8KKworLyoKKyAqIE00OFQ1OSBSZWdpc3RlciBPZmZzZXQKKyAqLworI2RlZmluZSBNNDhUNTlfWUVBUgkJMHgxZmZmCisjZGVmaW5lIE00OFQ1OV9NT05USAkJMHgxZmZlCisjZGVmaW5lIE00OFQ1OV9NREFZCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCisjZGVmaW5lIE00OFQ1OV9XREFZCQkweDFmZmMJLyogRGF5IG9mIFdlZWsgKi8KKyNkZWZpbmUgTTQ4VDU5X1dEQVlfQ0IJCQkweDIwCS8qIENlbnR1cnkgQml0ICovCisjZGVmaW5lIE00OFQ1OV9XREFZX0NFQgkJCTB4MTAJLyogQ2VudHVyeSBFbmFibGUgQml0ICovCisjZGVmaW5lIE00OFQ1OV9IT1VSCQkweDFmZmIKKyNkZWZpbmUgTTQ4VDU5X01JTgkJMHgxZmZhCisjZGVmaW5lIE00OFQ1OV9TRUMJCTB4MWZmOQorI2RlZmluZSBNNDhUNTlfQ05UTAkJMHgxZmY4CisjZGVmaW5lIE00OFQ1OV9DTlRMX1JFQUQJCTB4NDAKKyNkZWZpbmUgTTQ4VDU5X0NOVExfV1JJVEUJCTB4ODAKKyNkZWZpbmUgTTQ4VDU5X1dBVENIRE9HCQkweDFmZjcKKyNkZWZpbmUgTTQ4VDU5X0lOVFIJCTB4MWZmNgorI2RlZmluZSBNNDhUNTlfSU5UUl9BRkUJCQkweDgwCS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTTQ4VDU5X0lOVFJfQUJFCQkJMHgyMAorI2RlZmluZSBNNDhUNTlfQUxBUk1fREFURQkweDFmZjUKKyNkZWZpbmUgTTQ4VDU5X0FMQVJNX0hPVVIJMHgxZmY0CisjZGVmaW5lIE00OFQ1OV9BTEFSTV9NSU4JMHgxZmYzCisjZGVmaW5lIE00OFQ1OV9BTEFSTV9TRUMJMHgxZmYyCisjZGVmaW5lIE00OFQ1OV9VTlVTRUQJCTB4MWZmMQorI2RlZmluZSBNNDhUNTlfRkxBR1MJCTB4MWZmMAorI2RlZmluZSBNNDhUNTlfRkxBR1NfV0RUCQkweDgwCS8qIHdhdGNoZG9nIHRpbWVyIGV4cGlyZWQgKi8KKyNkZWZpbmUgTTQ4VDU5X0ZMQUdTX0FGCQkJMHg0MAkvKiBhbGFybSAqLworI2RlZmluZSBNNDhUNTlfRkxBR1NfQkYJCQkweDEwCS8qIGxvdyBiYXR0ZXJ5ICovCisKKyNkZWZpbmUgTTQ4VDU5X05WUkFNX1NJWkUJMHgxZmYwCisKK3N0cnVjdCBtNDh0NTlfcGxhdF9kYXRhIHsKKwkvKiBUaGUgbWV0aG9kIHRvIGFjY2VzcyBNNDhUNTkgcmVnaXN0ZXJzLAorCSAqIE5PVEU6IFRoZSAnb2ZzJyBzaG91bGQgYmUgMHgwMH4weDFmZmYKKwkgKi8KKwl2b2lkICgqd3JpdGVfYnl0ZSkoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzLCB1OCB2YWwpOworCXVuc2lnbmVkIGNoYXIgKCpyZWFkX2J5dGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIG9mcyk7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX1JUQ19NNDhUNTlfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCBjZmI2ODA1Li43MzFlZGFjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMjYsNiArMjYsNyBAQAogI2RlZmluZSBDTE9ORV9TVE9QUEVECQkweDAyMDAwMDAwCS8qIFN0YXJ0IGluIHN0b3BwZWQgc3RhdGUgKi8KICNkZWZpbmUgQ0xPTkVfTkVXVVRTCQkweDA0MDAwMDAwCS8qIE5ldyB1dHNuYW1lIGdyb3VwPyAqLwogI2RlZmluZSBDTE9ORV9ORVdJUEMJCTB4MDgwMDAwMDAJLyogTmV3IGlwY3MgKi8KKyNkZWZpbmUgQ0xPTkVfTkVXVVNFUgkJMHgxMDAwMDAwMAkvKiBOZXcgdXNlciBuYW1lc3BhY2UgKi8KIAogLyoKICAqIFNjaGVkdWxpbmcgcG9saWNpZXMKQEAgLTI4Nyw2ICsyODgsNyBAQAogYXNtbGlua2FnZSB2b2lkIHNjaGVkdWxlKHZvaWQpOwogCiBzdHJ1Y3QgbnNwcm94eTsKK3N0cnVjdCB1c2VyX25hbWVzcGFjZTsKIAogLyogTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIG1hcCBhcmVhcy4uIFRoaXMgaXMgYSByYW5kb20gKGxhcmdlKSBudW1iZXIgKi8KICNkZWZpbmUgREVGQVVMVF9NQVhfTUFQX0NPVU5UCTY1NTM2CkBAIC01MjksNiArNTMxLDEwIEBACiAjaWZkZWYgQ09ORklHX1RBU0tTVEFUUwogCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVRElUCisJdW5zaWduZWQgYXVkaXRfdHR5OworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICp0dHlfYXVkaXRfYnVmOworI2VuZGlmCiB9OwogCiAvKiBDb250ZXh0IHN3aXRjaCBtdXN0IGJlIHVubG9ja2VkIGlmIGludGVycnVwdHMgYXJlIHRvIGJlIGVuYWJsZWQgKi8KQEAgLTk3Miw3ICs5NzgsOCBAQAogCXVuc2lnbmVkIGludCBydF9wcmlvcml0eTsKIAljcHV0aW1lX3QgdXRpbWUsIHN0aW1lOwogCXVuc2lnbmVkIGxvbmcgbnZjc3csIG5pdmNzdzsgLyogY29udGV4dCBzd2l0Y2ggY291bnRzICovCi0Jc3RydWN0IHRpbWVzcGVjIHN0YXJ0X3RpbWU7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0X3RpbWU7IAkJLyogbW9ub3RvbmljIHRpbWUgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgcmVhbF9zdGFydF90aW1lOwkvKiBib290IGJhc2VkIHRpbWUgKi8KIC8qIG1tIGZhdWx0IGFuZCBzd2FwIGluZm86IHRoaXMgY2FuIGFyZ3VhYmx5IGJlIHNlZW4gYXMgZWl0aGVyIG1tLXNwZWNpZmljIG9yIHRocmVhZC1zcGVjaWZpYyAqLwogCXVuc2lnbmVkIGxvbmcgbWluX2ZsdCwgbWFqX2ZsdDsKIApAQCAtMTQwMyw3ICsxNDEwLDcgQEAKIGV4dGVybiB2b2lkIF9fc2V0X3NwZWNpYWxfcGlkcyhwaWRfdCBzZXNzaW9uLCBwaWRfdCBwZ3JwKTsKIAogLyogcGVyLVVJRCBwcm9jZXNzIGNoYXJnaW5nLiAqLwotZXh0ZXJuIHN0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZCh1aWRfdCk7CitleHRlcm4gc3RydWN0IHVzZXJfc3RydWN0ICogYWxsb2NfdWlkKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqLCB1aWRfdCk7CiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2VyX3N0cnVjdCAqZ2V0X3VpZChzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnUpCiB7CiAJYXRvbWljX2luYygmdS0+X19jb3VudCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjeDIwMF9ncGlvLmggYi9pbmNsdWRlL2xpbnV4L3NjeDIwMF9ncGlvLmgKaW5kZXggMWE4MmQzMC4uZDJiMDU4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY3gyMDBfZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvc2N4MjAwX2dwaW8uaApAQCAtMSw1ICsxLDMgQEAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCiB1MzIgc2N4MjAwX2dwaW9fY29uZmlndXJlKHVuc2lnbmVkIGluZGV4LCB1MzIgc2V0LCB1MzIgY2xlYXIpOwogCiBleHRlcm4gdW5zaWduZWQgc2N4MjAwX2dwaW9fYmFzZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VjY29tcC5oIGIvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKaW5kZXggM2U4YjFjZi4uMjYyYThkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKQEAgLTQsOCArNCw2IEBACiAKICNpZmRlZiBDT05GSUdfU0VDQ09NUAogCi0jZGVmaW5lIE5SX1NFQ0NPTVBfTU9ERVMgMQotCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vc2VjY29tcC5oPgogCkBAIC0xOCwyMCArMTYsMjMgQEAKIAkJX19zZWN1cmVfY29tcHV0aW5nKHRoaXNfc3lzY2FsbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhhc19zZWN1cmVfY29tcHV0aW5nKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCi17Ci0JcmV0dXJuIHVubGlrZWx5KHRlc3RfdGlfdGhyZWFkX2ZsYWcodGksIFRJRl9TRUNDT01QKSk7Ci19CitleHRlcm4gbG9uZyBwcmN0bF9nZXRfc2VjY29tcCh2b2lkKTsKK2V4dGVybiBsb25nIHByY3RsX3NldF9zZWNjb21wKHVuc2lnbmVkIGxvbmcpOwogCiAjZWxzZSAvKiBDT05GSUdfU0VDQ09NUCAqLwogCiB0eXBlZGVmIHN0cnVjdCB7IH0gc2VjY29tcF90OwogCiAjZGVmaW5lIHNlY3VyZV9jb21wdXRpbmcoeCkgZG8geyB9IHdoaWxlICgwKQotLyogc3RhdGljIGlubGluZSB0byBwcmVzZXJ2ZSB0eXBlY2hlY2tpbmcgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGhhc19zZWN1cmVfY29tcHV0aW5nKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBwcmN0bF9nZXRfc2VjY29tcCh2b2lkKQogewotCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgcHJjdGxfc2V0X3NlY2NvbXAodW5zaWduZWQgbG9uZyBhcmcyKQoreworCXJldHVybiAtRUlOVkFMOwogfQogCiAjZW5kaWYgLyogQ09ORklHX1NFQ0NPTVAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCmluZGV4IDMzZmM4Y2IuLmRlYjcxNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWwuaApAQCAtMTc3LDExICsxNzcsNSBAQAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCi0vKiBBbGxvdyBhcmNoaXRlY3R1cmVzIHRvIG92ZXJyaWRlIGVudHJpZXMgaW4gc2VyaWFsODI1MF9wb3J0c1tdIGF0IHJ1biB0aW1lOiAqLwotc3RydWN0IHVhcnRfcG9ydDsJLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotZXh0ZXJuIGludCBlYXJseV9zZXJpYWxfc2V0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7Ci1leHRlcm4gaW50IGVhcmx5X3NlcmlhbF9jb25zb2xlX2luaXQoY2hhciAqb3B0aW9ucyk7Ci1leHRlcm4gaW50IHNlcmlhbDgyNTBfc3RhcnRfY29uc29sZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBjaGFyICpvcHRpb25zKTsKLQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAppbmRleCA3MTMxMGQ4Li43MDZlZTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCkBAIC02MCw0ICs2MCw4IEBACiB2b2lkIHNlcmlhbDgyNTBfc3VzcGVuZF9wb3J0KGludCBsaW5lKTsKIHZvaWQgc2VyaWFsODI1MF9yZXN1bWVfcG9ydChpbnQgbGluZSk7CiAKK2V4dGVybiBpbnQgc2VyaWFsODI1MF9maW5kX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcCk7CitleHRlcm4gaW50IHNlcmlhbDgyNTBfZmluZF9wb3J0X2Zvcl9lYXJseWNvbih2b2lkKTsKK2V4dGVybiBpbnQgc2V0dXBfZWFybHlfc2VyaWFsODI1MF9jb25zb2xlKGNoYXIgKmNtZGxpbmUpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCA3ZjJjOTlkLi45YzcyMWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0xNDIsNiArMTQyLDkgQEAKIC8qIE1pY3JlbCBLUzg2OTUgKi8KICNkZWZpbmUgUE9SVF9LUzg2OTUJNzYKIAorLyogQnJvYWRjb20gU0IxMjUwLCBldGMuIFNPQyAqLworI2RlZmluZSBQT1JUX1NCMTI1MF9EVUFSVAk3NworCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCmluZGV4IDlhNWVhYzUuLmVhOTFhYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaApAQCAtNiw3ICs2LDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogLyoKICAqIFJlYWwgVGltZSBzaWduYWxzIG1heSBiZSBxdWV1ZWQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWIuaCBiL2luY2x1ZGUvbGludXgvc2xhYi5oCmluZGV4IGNlYmNkMzguLjBlMWQwZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYi5oCkBAIC0xNCw4ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotdHlwZWRlZiBzdHJ1Y3Qga21lbV9jYWNoZSBrbWVtX2NhY2hlX3QgX19kZXByZWNhdGVkOwotCiAvKgogICogRmxhZ3MgdG8gcGFzcyB0byBrbWVtX2NhY2hlX2NyZWF0ZSgpLgogICogVGhlIG9uZXMgbWFya2VkIERFQlVHIGFyZSBvbmx5IHZhbGlkIGlmIENPTkZJR19TTEFCX0RFQlVHIGlzIHNldC4KQEAgLTMzLDYgKzMxLDE5IEBACiAjZGVmaW5lIFNMQUJfVFJBQ0UJCTB4MDAyMDAwMDBVTAkvKiBUcmFjZSBhbGxvY2F0aW9ucyBhbmQgZnJlZXMgKi8KIAogLyoKKyAqIFpFUk9fU0laRV9QVFIgd2lsbCBiZSByZXR1cm5lZCBmb3IgemVybyBzaXplZCBrbWFsbG9jIHJlcXVlc3RzLgorICoKKyAqIERlcmVmZXJlbmNpbmcgWkVST19TSVpFX1BUUiB3aWxsIGxlYWQgdG8gYSBkaXN0aW5jdCBhY2Nlc3MgZmF1bHQuCisgKgorICogWkVST19TSVpFX1BUUiBjYW4gYmUgcGFzc2VkIHRvIGtmcmVlIHRob3VnaCBpbiB0aGUgc2FtZSB3YXkgdGhhdCBOVUxMIGNhbi4KKyAqIEJvdGggbWFrZSBrZnJlZSBhIG5vLW9wLgorICovCisjZGVmaW5lIFpFUk9fU0laRV9QVFIgKCh2b2lkICopMTYpCisKKyNkZWZpbmUgWkVST19PUl9OVUxMX1BUUih4KSAoKHVuc2lnbmVkIGxvbmcpKHgpIDwgXAorCQkJCSh1bnNpZ25lZCBsb25nKVpFUk9fU0laRV9QVFIpCisKKy8qCiAgKiBzdHJ1Y3Qga21lbV9jYWNoZSByZWxhdGVkIHByb3RvdHlwZXMKICAqLwogdm9pZCBfX2luaXQga21lbV9jYWNoZV9pbml0KHZvaWQpOwpAQCAtNDQsOCArNTUsNiBAQAogCQkJdm9pZCAoKikodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKSk7CiB2b2lkIGttZW1fY2FjaGVfZGVzdHJveShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKIGludCBrbWVtX2NhY2hlX3NocmluayhzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKLXZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwotdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwogdm9pZCBrbWVtX2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKiwgdm9pZCAqKTsKIHVuc2lnbmVkIGludCBrbWVtX2NhY2hlX3NpemUoc3RydWN0IGttZW1fY2FjaGUgKik7CiBjb25zdCBjaGFyICprbWVtX2NhY2hlX25hbWUoc3RydWN0IGttZW1fY2FjaGUgKik7CkBAIC02MywxNiArNzIsNiBAQAogCQlzaXplb2Yoc3RydWN0IF9fc3RydWN0KSwgX19hbGlnbm9mX18oc3RydWN0IF9fc3RydWN0KSxcCiAJCShfX2ZsYWdzKSwgTlVMTCwgTlVMTCkKIAotI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKLQkJCQkJZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQotewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOwotfQotI2VuZGlmCi0KIC8qCiAgKiBUaGUgbGFyZ2VzdCBrbWFsbG9jIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBzbGFiIGFsbG9jYXRvcnMgaXMKICAqIDMyIG1lZ2FieXRlICgyXjI1KSBvciB0aGUgbWF4aW11bSBhbGxvY2F0YWJsZSBwYWdlIG9yZGVyIGlmIHRoYXQgaXMKQEAgLTkxLDUxICs5MCw0MiBAQAogLyoKICAqIENvbW1vbiBrbWFsbG9jIGZ1bmN0aW9ucyBwcm92aWRlZCBieSBhbGwgYWxsb2NhdG9ycwogICovCi12b2lkICpfX2ttYWxsb2Moc2l6ZV90LCBnZnBfdCk7Ci12b2lkICpfX2t6YWxsb2Moc2l6ZV90LCBnZnBfdCk7CiB2b2lkICogX19tdXN0X2NoZWNrIGtyZWFsbG9jKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBnZnBfdCk7CiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKik7CiBzaXplX3Qga3NpemUoY29uc3Qgdm9pZCAqKTsKIAorLyoKKyAqIEFsbG9jYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucy4gVGhlc2UgYXJlIG1haW5seSB1c2VkIHRvIGVzdGFibGlzaCBvcHRpbWl6ZWQKKyAqIHdheXMgdG8gY29udmVydCBrbWFsbG9jKCkgY2FsbHMgdG8ga21lbV9jYWNoZV9hbGxvYygpIGludm9jYXRpb25zIGJ5CisgKiBzZWxlY3RpbmcgdGhlIGFwcHJvcHJpYXRlIGdlbmVyYWwgY2FjaGUgYXQgY29tcGlsZSB0aW1lLgorICoKKyAqIEFsbG9jYXRvcnMgbXVzdCBkZWZpbmUgYXQgbGVhc3Q6CisgKgorICoJa21lbV9jYWNoZV9hbGxvYygpCisgKglfX2ttYWxsb2MoKQorICoJa21hbGxvYygpCisgKgorICogVGhvc2Ugd2lzaGluZyB0byBzdXBwb3J0IE5VTUEgbXVzdCBhbHNvIGRlZmluZToKKyAqCisgKglrbWVtX2NhY2hlX2FsbG9jX25vZGUoKQorICoJa21hbGxvY19ub2RlKCkKKyAqCisgKiBTZWUgZWFjaCBhbGxvY2F0b3IgZGVmaW5pdGlvbiBmaWxlIGZvciBhZGRpdGlvbmFsIGNvbW1lbnRzIGFuZAorICogaW1wbGVtZW50YXRpb24gbm90ZXMuCisgKi8KKyNpZmRlZiBDT05GSUdfU0xVQgorI2luY2x1ZGUgPGxpbnV4L3NsdWJfZGVmLmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19TTE9CKQorI2luY2x1ZGUgPGxpbnV4L3Nsb2JfZGVmLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3NsYWJfZGVmLmg+CisjZW5kaWYKKwogLyoqCiAgKiBrY2FsbG9jIC0gYWxsb2NhdGUgbWVtb3J5IGZvciBhbiBhcnJheS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KICAqIEBuOiBudW1iZXIgb2YgZWxlbWVudHMuCiAgKiBAc2l6ZTogZWxlbWVudCBzaXplLgogICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqa2NhbGxvYyhzaXplX3Qgbiwgc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCWlmIChuICE9IDAgJiYgc2l6ZSA+IFVMT05HX01BWCAvIG4pCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBfX2t6YWxsb2MobiAqIHNpemUsIGZsYWdzKTsKLX0KLQotLyoKLSAqIEFsbG9jYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucy4gVGhlc2UgYXJlIG1haW5seSB1c2VkIHRvIGVzdGFibGlzaCBvcHRpbWl6ZWQKLSAqIHdheXMgdG8gY29udmVydCBrbWFsbG9jKCkgY2FsbHMgdG8ga21lbV9jYWNoZV9hbGxvYygpIGludm9jYXRpb25zIGJ5IHNlbGVjdGluZwotICogdGhlIGFwcHJvcHJpYXRlIGdlbmVyYWwgY2FjaGUgYXQgY29tcGlsZSB0aW1lLgotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTEFCKSB8fCBkZWZpbmVkKENPTkZJR19TTFVCKQotI2lmZGVmIENPTkZJR19TTFVCCi0jaW5jbHVkZSA8bGludXgvc2x1Yl9kZWYuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvc2xhYl9kZWYuaD4KLSNlbmRpZiAvKiAhQ09ORklHX1NMVUIgKi8KLSNlbHNlCi0KLS8qCi0gKiBGYWxsYmFjayBkZWZpbml0aW9ucyBmb3IgYW4gYWxsb2NhdG9yIG5vdCB3YW50aW5nIHRvIHByb3ZpZGUKLSAqIGl0cyBvd24gb3B0aW1pemVkIGttYWxsb2MgZGVmaW5pdGlvbnMgKGxpa2UgU0xPQikuCi0gKi8KLQotLyoqCi0gKiBrbWFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5Ci0gKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICoKLSAqIGttYWxsb2MgaXMgdGhlIG5vcm1hbCBtZXRob2Qgb2YgYWxsb2NhdGluZyBtZW1vcnkKLSAqIGluIHRoZSBrZXJuZWwuCiAgKgogICogVGhlIEBmbGFncyBhcmd1bWVudCBtYXkgYmUgb25lIG9mOgogICoKQEAgLTE0Myw3ICsxMzMsNyBAQAogICoKICAqICVHRlBfS0VSTkVMIC0gQWxsb2NhdGUgbm9ybWFsIGtlcm5lbCByYW0uICBNYXkgc2xlZXAuCiAgKgotICogJUdGUF9BVE9NSUMgLSBBbGxvY2F0aW9uIHdpbGwgbm90IHNsZWVwLgorICogJUdGUF9BVE9NSUMgLSBBbGxvY2F0aW9uIHdpbGwgbm90IHNsZWVwLiAgTWF5IHVzZSBlbWVyZ2VuY3kgcG9vbHMuCiAgKiAgIEZvciBleGFtcGxlLCB1c2UgdGhpcyBpbnNpZGUgaW50ZXJydXB0IGhhbmRsZXJzLgogICoKICAqICVHRlBfSElHSFVTRVIgLSBBbGxvY2F0ZSBwYWdlcyBmcm9tIGhpZ2ggbWVtb3J5LgpAQCAtMTUyLDE4ICsxNDIsMjIgQEAKICAqCiAgKiAlR0ZQX05PRlMgLSBEbyBub3QgbWFrZSBhbnkgZnMgY2FsbHMgd2hpbGUgdHJ5aW5nIHRvIGdldCBtZW1vcnkuCiAgKgorICogJUdGUF9OT1dBSVQgLSBBbGxvY2F0aW9uIHdpbGwgbm90IHNsZWVwLgorICoKKyAqICVHRlBfVEhJU05PREUgLSBBbGxvY2F0ZSBub2RlLWxvY2FsIG1lbW9yeSBvbmx5LgorICoKKyAqICVHRlBfRE1BIC0gQWxsb2NhdGlvbiBzdWl0YWJsZSBmb3IgRE1BLgorICogICBTaG91bGQgb25seSBiZSB1c2VkIGZvciBrbWFsbG9jKCkgY2FjaGVzLiBPdGhlcndpc2UsIHVzZSBhCisgKiAgIHNsYWIgY3JlYXRlZCB3aXRoIFNMQUJfRE1BLgorICoKICAqIEFsc28gaXQgaXMgcG9zc2libGUgdG8gc2V0IGRpZmZlcmVudCBmbGFncyBieSBPUidpbmcKICAqIGluIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBAZmxhZ3M6CiAgKgogICogJV9fR0ZQX0NPTEQgLSBSZXF1ZXN0IGNhY2hlLWNvbGQgcGFnZXMgaW5zdGVhZCBvZgogICogICB0cnlpbmcgdG8gcmV0dXJuIGNhY2hlLXdhcm0gcGFnZXMuCiAgKgotICogJV9fR0ZQX0RNQSAtIFJlcXVlc3QgbWVtb3J5IGZyb20gdGhlIERNQS1jYXBhYmxlIHpvbmUuCi0gKgogICogJV9fR0ZQX0hJR0ggLSBUaGlzIGFsbG9jYXRpb24gaGFzIGhpZ2ggcHJpb3JpdHkgYW5kIG1heSB1c2UgZW1lcmdlbmN5IHBvb2xzLgogICoKLSAqICVfX0dGUF9ISUdITUVNIC0gQWxsb2NhdGVkIG1lbW9yeSBtYXkgYmUgZnJvbSBoaWdobWVtLgotICoKICAqICVfX0dGUF9OT0ZBSUwgLSBJbmRpY2F0ZSB0aGF0IHRoaXMgYWxsb2NhdGlvbiBpcyBpbiBubyB3YXkgYWxsb3dlZCB0byBmYWlsCiAgKiAgICh0aGluayB0d2ljZSBiZWZvcmUgdXNpbmcpLgogICoKQEAgLTE3MywyNCArMTY3LDI5IEBACiAgKiAlX19HRlBfTk9XQVJOIC0gSWYgYWxsb2NhdGlvbiBmYWlscywgZG9uJ3QgaXNzdWUgYW55IHdhcm5pbmdzLgogICoKICAqICVfX0dGUF9SRVBFQVQgLSBJZiBhbGxvY2F0aW9uIGZhaWxzIGluaXRpYWxseSwgdHJ5IG9uY2UgbW9yZSBiZWZvcmUgZmFpbGluZy4KKyAqCisgKiBUaGVyZSBhcmUgb3RoZXIgZmxhZ3MgYXZhaWxhYmxlIGFzIHdlbGwsIGJ1dCB0aGVzZSBhcmUgbm90IGludGVuZGVkCisgKiBmb3IgZ2VuZXJhbCB1c2UsIGFuZCBzbyBhcmUgbm90IGRvY3VtZW50ZWQgaGVyZS4gRm9yIGEgZnVsbCBsaXN0IG9mCisgKiBwb3RlbnRpYWwgZmxhZ3MsIGFsd2F5cyByZWZlciB0byBsaW51eC9nZnAuaC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa2NhbGxvYyhzaXplX3Qgbiwgc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewotCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOworCWlmIChuICE9IDAgJiYgc2l6ZSA+IFVMT05HX01BWCAvIG4pCisJCXJldHVybiBOVUxMOworCXJldHVybiBfX2ttYWxsb2MobiAqIHNpemUsIGZsYWdzIHwgX19HRlBfWkVSTyk7CiB9CiAKKyNpZiAhZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgIWRlZmluZWQoQ09ORklHX1NMT0IpCiAvKioKLSAqIGt6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCisgKiBrbWFsbG9jX25vZGUgLSBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBhIHNwZWNpZmljIG5vZGUKICAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrbWFsbG9jKS4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga2NhbGxvYykuCisgKiBAbm9kZTogbm9kZSB0byBhbGxvY2F0ZSBmcm9tLgorICoKKyAqIGttYWxsb2MoKSBmb3Igbm9uLWxvY2FsIG5vZGVzLCB1c2VkIHRvIGFsbG9jYXRlIGZyb20gYSBzcGVjaWZpYyBub2RlCisgKiBpZiBhdmFpbGFibGUuIEVxdWl2YWxlbnQgdG8ga21hbGxvYygpIGluIHRoZSBub24tTlVNQSBzaW5nbGUtbm9kZQorICogY2FzZS4KICAqLwotc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlyZXR1cm4gX19remFsbG9jKHNpemUsIGZsYWdzKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIENPTkZJR19OVU1BCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewogCXJldHVybiBrbWFsbG9jKHNpemUsIGZsYWdzKTsKQEAgLTIwMCw3ICsxOTksMTUgQEAKIHsKIAlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KLSNlbmRpZiAvKiAhQ09ORklHX05VTUEgKi8KKwordm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCisJCQkJCWdmcF90IGZsYWdzLCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKK30KKyNlbmRpZiAvKiAhQ09ORklHX05VTUEgJiYgIUNPTkZJR19TTE9CICovCiAKIC8qCiAgKiBrbWFsbG9jX3RyYWNrX2NhbGxlciBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBrbWFsbG9jIHRoYXQgcmVjb3JkcyB0aGUKQEAgLTI0NSw2ICsyNTIsMjMgQEAKIAogI2VuZGlmIC8qIERFQlVHX1NMQUIgKi8KIAorLyoKKyAqIFNob3J0Y3V0cworICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfemFsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICprLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhrLCBmbGFncyB8IF9fR0ZQX1pFUk8pOworfQorCisvKioKKyAqIGt6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCisgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga21hbGxvYykuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MgfCBfX0dGUF9aRVJPKTsKK30KKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfTElOVVhfU0xBQl9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAppbmRleCA4ZDgxYTYwLi4zMmJkYzJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCkBAIC0yNSwxMCArMjUsMTcgQEAKIH07CiBleHRlcm4gc3RydWN0IGNhY2hlX3NpemVzIG1hbGxvY19zaXplc1tdOwogCit2b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90KTsKK3ZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewogCQlpbnQgaSA9IDA7CisKKwkJaWYgKCFzaXplKQorCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisKICNkZWZpbmUgQ0FDSEUoeCkgXAogCQlpZiAoc2l6ZSA8PSB4KSBcCiAJCQlnb3RvIGZvdW5kOyBcCkBAIC01MSwzOSArNTgsMTggQEAKIAlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKLQkJaW50IGkgPSAwOwotI2RlZmluZSBDQUNIRSh4KSBcCi0JCWlmIChzaXplIDw9IHgpIFwKLQkJCWdvdG8gZm91bmQ7IFwKLQkJZWxzZSBcCi0JCQlpKys7Ci0jaW5jbHVkZSAia21hbGxvY19zaXplcy5oIgotI3VuZGVmIENBQ0hFCi0JCXsKLQkJCWV4dGVybiB2b2lkIF9feW91X2Nhbm5vdF9remFsbG9jX3RoYXRfbXVjaCh2b2lkKTsKLQkJCV9feW91X2Nhbm5vdF9remFsbG9jX3RoYXRfbXVjaCgpOwotCQl9Ci1mb3VuZDoKLSNpZmRlZiBDT05GSUdfWk9ORV9ETUEKLQkJaWYgKGZsYWdzICYgR0ZQX0RNQSkKLQkJCXJldHVybiBrbWVtX2NhY2hlX3phbGxvYyhtYWxsb2Nfc2l6ZXNbaV0uY3NfZG1hY2FjaGVwLAotCQkJCQkJZmxhZ3MpOwotI2VuZGlmCi0JCXJldHVybiBrbWVtX2NhY2hlX3phbGxvYyhtYWxsb2Nfc2l6ZXNbaV0uY3NfY2FjaGVwLCBmbGFncyk7Ci0JfQotCXJldHVybiBfX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpOwotfQotCiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiB2b2lkICpfX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKK2V4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKIAogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKIAkJaW50IGkgPSAwOworCisJCWlmICghc2l6ZSkKKwkJCXJldHVybiBaRVJPX1NJWkVfUFRSOworCiAjZGVmaW5lIENBQ0hFKHgpIFwKIAkJaWYgKHNpemUgPD0geCkgXAogCQkJZ290byBmb3VuZDsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZGFmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Nsb2JfZGVmLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBfX0xJTlVYX1NMT0JfREVGX0gKKyNkZWZpbmUgX19MSU5VWF9TTE9CX0RFRl9ICisKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCAtMSk7Cit9CisKK3ZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQoreworCXJldHVybiBfX2ttYWxsb2Nfbm9kZShzaXplLCBmbGFncywgbm9kZSk7Cit9CisKKy8qKgorICoga21hbGxvYyAtIGFsbG9jYXRlIG1lbW9yeQorICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGtjYWxsb2MpLgorICoKKyAqIGttYWxsb2MgaXMgdGhlIG5vcm1hbCBtZXRob2Qgb2YgYWxsb2NhdGluZyBtZW1vcnkKKyAqIGluIHRoZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIF9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCAtMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyk7Cit9CisKKy8qKgorICoga3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrY2FsbG9jKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4gX19remFsbG9jKHNpemUsIGZsYWdzKTsKK30KKworI2VuZGlmIC8qIF9fTElOVVhfU0xPQl9ERUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCmluZGV4IDYyMDdhM2QuLjA3ZjdlNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKQEAgLTE2LDcgKzE2LDkgQEAKIAl1bnNpZ25lZCBsb25nIG5yX3BhcnRpYWw7CiAJYXRvbWljX2xvbmdfdCBucl9zbGFiczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBhcnRpYWw7CisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZ1bGw7CisjZW5kaWYKIH07CiAKIC8qCkBAIC00NCw3ICs0Niw5IEBACiAJaW50IGFsaWduOwkJLyogQWxpZ25tZW50ICovCiAJY29uc3QgY2hhciAqbmFtZTsJLyogTmFtZSAob25seSBmb3IgZGlzcGxheSEpICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBMaXN0IG9mIHNsYWIgY2FjaGVzICovCisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwkvKiBGb3Igc3lzZnMgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX05VTUEKIAlpbnQgZGVmcmFnX3JhdGlvOwpAQCAtMTU5LDE3ICsxNjMsOCBAQAogI2RlZmluZSBTTFVCX0RNQSAwCiAjZW5kaWYKIAotCi0vKgotICogWkVST19TSVpFX1BUUiB3aWxsIGJlIHJldHVybmVkIGZvciB6ZXJvIHNpemVkIGttYWxsb2MgcmVxdWVzdHMuCi0gKgotICogRGVyZWZlcmVuY2luZyBaRVJPX1NJWkVfUFRSIHdpbGwgbGVhZCB0byBhIGRpc3RpbmN0IGFjY2VzcyBmYXVsdC4KLSAqCi0gKiBaRVJPX1NJWkVfUFRSIGNhbiBiZSBwYXNzZWQgdG8ga2ZyZWUgdGhvdWdoIGluIHRoZSBzYW1lIHdheSB0aGF0IE5VTEwgY2FuLgotICogQm90aCBtYWtlIGtmcmVlIGEgbm8tb3AuCi0gKi8KLSNkZWZpbmUgWkVST19TSVpFX1BUUiAoKHZvaWQgKikxNikKLQordm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7Cit2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKTsKIAogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKIHsKQEAgLTE4NCwyMSArMTc5LDkgQEAKIAkJcmV0dXJuIF9fa21hbGxvYyhzaXplLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpICYmICEoZmxhZ3MgJiBTTFVCX0RNQSkpIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBrbWFsbG9jX3NsYWIoc2l6ZSk7Ci0KLQkJaWYgKCFzKQotCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7Ci0KLQkJcmV0dXJuIGttZW1fY2FjaGVfemFsbG9jKHMsIGZsYWdzKTsKLQl9IGVsc2UKLQkJcmV0dXJuIF9fa3phbGxvYyhzaXplLCBmbGFncyk7Ci19Ci0KICNpZmRlZiBDT05GSUdfTlVNQQotZXh0ZXJuIHZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwordm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7Cit2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKIAogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21wX2xvY2suaCBiL2luY2x1ZGUvbGludXgvc21wX2xvY2suaAppbmRleCBjZjcxNWE0Li41ODk2MmM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NtcF9sb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXBfbG9jay5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaWZkZWYgQ09ORklHX0xPQ0tfS0VSTkVMCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjZGVmaW5lIGtlcm5lbF9sb2NrZWQoKQkJKGN1cnJlbnQtPmxvY2tfZGVwdGggPj0gMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKaW5kZXggZmUxOTVjOS4uZjg1MmUxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCkBAIC0yNTMsNiArMjUzLDkgQEAKIAogI2RlZmluZSBNU0dfRU9GICAgICAgICAgTVNHX0ZJTgogCisjZGVmaW5lIE1TR19DTVNHX0NMT0VYRUMgMHg0MDAwMDAwMAkvKiBTZXQgY2xvc2Vfb25fZXhpdCBmb3IgZmlsZQorCQkJCQkgICBkZXNjcmlwdG9yIHJlY2VpdmVkIHRocm91Z2gKKwkJCQkJICAgU0NNX1JJR0hUUyAqLwogI2lmIGRlZmluZWQoQ09ORklHX0NPTVBBVCkKICNkZWZpbmUgTVNHX0NNU0dfQ09NUEFUCTB4ODAwMDAwMDAJLyogVGhpcyBtZXNzYWdlIG5lZWRzIDMyIGJpdCBmaXh1cHMgKi8KICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oIGIvaW5jbHVkZS9saW51eC9zb255cGkuaAppbmRleCAzNGQ0YjA3Li40MGM3YjVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ueXBpLmgKQEAgLTE1Myw4ICsxNTMsNiBAQAogI2RlZmluZSBTT05ZUElfQ09NTUFORF9HRVRDQU1FUkFST01WRVJTSU9OCTE4CS8qIG9ic29sZXRlICovCiAjZGVmaW5lIFNPTllQSV9DT01NQU5EX0dFVENBTUVSQVJFVklTSU9OCTE5CS8qIG9ic29sZXRlICovCiAKLWludCBzb255cGlfY2FtZXJhX2NvbW1hbmQoaW50IGNvbW1hbmQsIHU4IHZhbHVlKTsKLQogI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCQkJCS8qIF9TT05ZUElfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKaW5kZXggMWJlNWVhMC4uMzAyYjgxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKQEAgLTc2LDYgKzc2LDcgQEAKICNkZWZpbmUJU1BJX01PREVfMwkoU1BJX0NQT0x8U1BJX0NQSEEpCiAjZGVmaW5lCVNQSV9DU19ISUdICTB4MDQJCQkvKiBjaGlwc2VsZWN0IGFjdGl2ZSBoaWdoPyAqLwogI2RlZmluZQlTUElfTFNCX0ZJUlNUCTB4MDgJCQkvKiBwZXItd29yZCBiaXRzLW9uLXdpcmUgKi8KKyNkZWZpbmUJU1BJXzNXSVJFCTB4MTAJCQkvKiBTSS9TTyBzaWduYWxzIHNoYXJlZCAqLwogCXU4CQkJYml0c19wZXJfd29yZDsKIAlpbnQJCQlpcnE7CiAJdm9pZAkJCSpjb250cm9sbGVyX3N0YXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKaW5kZXggOWRiY2E2Mi4uYjhkYjMyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCkBAIC0yNiw2ICsyNiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKIAl1OAkJCWJ1c3k7CiAJdTgJCQl1c2VfZG1hOworCXU4CQkJZmxhZ3M7CQkvKiBleHRyYSBzcGktPm1vZGUgc3VwcG9ydCAqLwogCiAJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvdGxlNjJ4MC5oIGIvaW5jbHVkZS9saW51eC9zcGkvdGxlNjJ4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjU5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS90bGU2MngwLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHRsZTYyeDAuaCAtIHBsYXRmb3JtIGdsdWUgdG8gSW5maW5lb24gVExFNjJ4MCBkcml2ZXIgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCitzdHJ1Y3QgdGxlNjJ4MF9wZGF0YSB7CisJdW5zaWduZWQgaW50CQlpbml0X3N0YXRlOworCXVuc2lnbmVkIGludAkJZ3Bpb19jb3VudDsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKaW5kZXggYTk0NjE3Ni4uYzM3NmYzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaApAQCAtMjgyLDYgKzI4MiwxMyBAQAogCTEgOiAoeyBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IDA7IH0pOyBcCiB9KQogCisjZGVmaW5lIHdyaXRlX3RyeWxvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykgXAorKHsgXAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCXdyaXRlX3RyeWxvY2sobG9jaykgPyBcCisJMSA6ICh7IGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgMDsgfSk7IFwKK30pCisKIC8qCiAgKiBMb2NrcyB0d28gc3BpbmxvY2tzIGwxIGFuZCBsMi4KICAqIGwxX2ZpcnN0IGluZGljYXRlcyBpZiBzcGlubG9jayBsMSBzaG91bGQgYmUgdGFrZW4gZmlyc3QuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3NfYXBpLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3NfYXBpLmgKaW5kZXggYmJhYzEwMS4uNDU5YzVmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaApAQCAtNTgsNiArNTgsNyBAQAogdTMyIGdzc19kZWxldGVfc2VjX2NvbnRleHQoCiAJCXN0cnVjdCBnc3NfY3R4CQkqKmN0eF9pZCk7CiAKK3UzMiBnc3Nfc3ZjX3RvX3BzZXVkb2ZsYXZvcihzdHJ1Y3QgZ3NzX2FwaV9tZWNoICosIHUzMiBzZXJ2aWNlKTsKIHUzMiBnc3NfcHNldWRvZmxhdm9yX3RvX3NlcnZpY2Uoc3RydWN0IGdzc19hcGlfbWVjaCAqLCB1MzIgcHNldWRvZmxhdm9yKTsKIGNoYXIgKmdzc19zZXJ2aWNlX3RvX2F1dGhfZG9tYWluX25hbWUoc3RydWN0IGdzc19hcGlfbWVjaCAqLCB1MzIgc2VydmljZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKaW5kZXggMTI5ZDUwZi4uODUzMWE3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKQEAgLTIxMiw2ICsyMTIsNyBAQAogCXN0cnVjdCBzdmNfcG9vbCAqCXJxX3Bvb2w7CS8qIHRocmVhZCBwb29sICovCiAJc3RydWN0IHN2Y19wcm9jZWR1cmUgKglycV9wcm9jaW5mbzsJLyogcHJvY2VkdXJlIGluZm8gKi8KIAlzdHJ1Y3QgYXV0aF9vcHMgKglycV9hdXRob3A7CS8qIGF1dGhlbnRpY2F0aW9uIGZsYXZvdXIgKi8KKwl1MzIJCQlycV9mbGF2b3I7CS8qIHBzZXVkb2ZsYXZvciAqLwogCXN0cnVjdCBzdmNfY3JlZAkJcnFfY3JlZDsJLyogYXV0aCBpbmZvICovCiAJc3RydWN0IHNrX2J1ZmYgKglycV9za2J1ZmY7CS8qIGZhc3QgcmVjdiBpbmV0IGJ1ZmZlciAqLwogCXN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxKnJxX2RlZmVycmVkOwkvKiBkZWZlcnJlZCByZXF1ZXN0IHdlIGFyZSByZXBsYXlpbmcgKi8KQEAgLTI0OCw2ICsyNDksNyBAQAogCQkJCQkJICovCiAJLyogQ2F0ZXJpbmcgdG8gbmZzZCAqLwogCXN0cnVjdCBhdXRoX2RvbWFpbiAqCXJxX2NsaWVudDsJLyogUlBDIHBlZXIgaW5mbyAqLworCXN0cnVjdCBhdXRoX2RvbWFpbiAqCXJxX2dzc2NsaWVudDsJLyogImdzcy8iLXN0eWxlIHBlZXIgaW5mbyAqLwogCXN0cnVjdCBzdmNfY2FjaGVyZXAgKglycV9jYWNoZXJlcDsJLyogY2FjaGUgaW5mbyAqLwogCXN0cnVjdCBrbmZzZF9maCAqCXJxX3JlZmZoOwkvKiBSZWZlcnJlbmNlIGZpbGVoYW5kbGUsIHVzZWQgdG8KIAkJCQkJCSAqIGRldGVybWluZSB3aGF0IGRldmljZSBudW1iZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGguaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGguaAppbmRleCBkZTkyNjE5Li4yMmUxZWY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aC5oCkBAIC0xMjcsNiArMTI3LDcgQEAKIGV4dGVybiBpbnQgYXV0aF91bml4X2ZvcmdldF9vbGQoc3RydWN0IGF1dGhfZG9tYWluICpkb20pOwogZXh0ZXJuIHZvaWQgc3ZjYXV0aF91bml4X3B1cmdlKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3ZjYXV0aF91bml4X2luZm9fcmVsZWFzZSh2b2lkICopOworZXh0ZXJuIGludCBzdmNhdXRoX3VuaXhfc2V0X2NsaWVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc2hfc3RyKGNoYXIgKm5hbWUsIGludCBiaXRzKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmgKaW5kZXggNWE1ZGIxNi4uNDE3YTFkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oCkBAIC0yMiw2ICsyMiw3IEBACiBpbnQgZ3NzX3N2Y19pbml0KHZvaWQpOwogdm9pZCBnc3Nfc3ZjX3NodXRkb3duKHZvaWQpOwogaW50IHN2Y2F1dGhfZ3NzX3JlZ2lzdGVyX3BzZXVkb2ZsYXZvcih1MzIgcHNldWRvZmxhdm9yLCBjaGFyICogbmFtZSk7Cit1MzIgc3ZjYXV0aF9nc3NfZmxhdm9yKHN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfU1VOUlBDX1NWQ0FVVEhfR1NTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggMDA2ODY4OC4uNjY1Zjg1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTE4OCw3ICsxODgsOCBAQAogZXh0ZXJuIHZvaWQgc3dhcF9zZXR1cCh2b2lkKTsKIAogLyogbGludXgvbW0vdm1zY2FuLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lICoqLCBnZnBfdCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqKnpvbmVzLCBpbnQgb3JkZXIsCisJCQkJCWdmcF90IGdmcF9tYXNrKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNocmlua19hbGxfbWVtb3J5KHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOwogZXh0ZXJuIGludCB2bV9zd2FwcGluZXNzOwogZXh0ZXJuIGludCByZW1vdmVfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHBhZ2UgKnBhZ2UpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaCBiL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKaW5kZXggYTQ2MTA0YS4uZGNlMWVkMjA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKQEAgLTMxLDcgKzMxLDcgQEAKICAqLwogCiAKLSNkZWZpbmUgVEFTS1NUQVRTX1ZFUlNJT04JNAorI2RlZmluZSBUQVNLU1RBVFNfVkVSU0lPTgk1CiAjZGVmaW5lIFRTX0NPTU1fTEVOCQkzMgkvKiBzaG91bGQgYmUgPj0gVEFTS19DT01NX0xFTgogCQkJCQkgKiBpbiBsaW51eC9zY2hlZC5oICovCiAKQEAgLTE0OSw2ICsxNDksOSBAQAogCV9fdTY0CXJlYWRfYnl0ZXM7CQkvKiBieXRlcyBvZiByZWFkIEkvTyAqLwogCV9fdTY0CXdyaXRlX2J5dGVzOwkJLyogYnl0ZXMgb2Ygd3JpdGUgSS9PICovCiAJX191NjQJY2FuY2VsbGVkX3dyaXRlX2J5dGVzOwkvKiBieXRlcyBvZiBjYW5jZWxsZWQgd3JpdGUgSS9PICovCisKKwlfX3U2NCAgbnZjc3c7CQkJLyogdm9sdW50YXJ5X2N0eHRfc3dpdGNoZXMgKi8KKwlfX3U2NCAgbml2Y3N3OwkJCS8qIG5vbnZvbHVudGFyeV9jdHh0X3N3aXRjaGVzICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZS5oIGIvaW5jbHVkZS9saW51eC90aW1lLmgKaW5kZXggZGRhOWJlNi4uZWMzYjBjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lLmgKQEAgLTM2LDcgKzM2LDggQEAKICNkZWZpbmUgTlNFQ19QRVJfU0VDCTEwMDAwMDAwMDBMCiAjZGVmaW5lIEZTRUNfUEVSX1NFQwkxMDAwMDAwMDAwMDAwMDAwTAogCi1zdGF0aWMgaW5saW5lIGludCB0aW1lc3BlY19lcXVhbChzdHJ1Y3QgdGltZXNwZWMgKmEsIHN0cnVjdCB0aW1lc3BlYyAqYikKK3N0YXRpYyBpbmxpbmUgaW50IHRpbWVzcGVjX2VxdWFsKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYikKIHsKIAlyZXR1cm4gKGEtPnR2X3NlYyA9PSBiLT50dl9zZWMpICYmIChhLT50dl9uc2VjID09IGItPnR2X25zZWMpOwogfQpAQCAtMTE2LDYgKzExNyw4IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGFsYXJtX3NldGl0aW1lcih1bnNpZ25lZCBpbnQgc2Vjb25kcyk7CiBleHRlcm4gaW50IGRvX2dldGl0aW1lcihpbnQgd2hpY2gsIHN0cnVjdCBpdGltZXJ2YWwgKnZhbHVlKTsKIGV4dGVybiB2b2lkIGdldG5zdGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpOworZXh0ZXJuIHZvaWQgZ2V0Ym9vdHRpbWUoc3RydWN0IHRpbWVzcGVjICp0cyk7CitleHRlcm4gdm9pZCBtb25vdG9uaWNfdG9fYm9vdGJhc2VkKHN0cnVjdCB0aW1lc3BlYyAqdHMpOwogCiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX3RydW5jKHN0cnVjdCB0aW1lc3BlYyB0LCB1bnNpZ25lZCBncmFuKTsKIGV4dGVybiBpbnQgdGltZWtlZXBpbmdfaXNfY29udGludW91cyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZXIuaCBiL2luY2x1ZGUvbGludXgvdGltZXIuaAppbmRleCBjNjYxNzEwLi43OGNmODk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lci5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KIAogc3RydWN0IHR2ZWNfdF9iYXNlX3M7CkBAIC05MSwxNiArOTAsMTMgQEAKICAqLwogI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwogCisjZGVmaW5lIFRJTUVSX1NUQVRTX0ZMQUdfREVGRVJSQUJMRQkweDEKKwogZXh0ZXJuIHZvaWQgaW5pdF90aW1lcl9zdGF0cyh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHZvaWQgKnRpbWVyLCBwaWRfdCBwaWQsIHZvaWQgKnN0YXJ0ZiwKLQkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqIGNvbW0pOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCi17Ci0JdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKLQkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSk7Ci19CisJCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKmNvbW0sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdGltZXJfZmxhZyk7CiAKIGV4dGVybiB2b2lkIF9fdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAogCQkJCQkgICAgICAgdm9pZCAqYWRkcik7CkBAIC0xMTksMTAgKzExNSw2IEBACiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKLXsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5LmggYi9pbmNsdWRlL2xpbnV4L3R0eS5oCmluZGV4IGJiNDU3NjAuLjY5MWExNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5LmgKKysrIGIvaW5jbHVkZS9saW51eC90dHkuaApAQCAtMTc4LDYgKzE3OCw3IEBACiAjZGVmaW5lIExfSUVYVEVOKHR0eSkJX0xfRkxBRygodHR5KSxJRVhURU4pCiAKIHN0cnVjdCBkZXZpY2U7CitzdHJ1Y3Qgc2lnbmFsX3N0cnVjdDsKIC8qCiAgKiBXaGVyZSBhbGwgb2YgdGhlIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCBhIHR0eSBpcyBrZXB0IHdoaWxlIHRoZSB0dHkKICAqIGlzIG9wZW4uICBTaW5jZSB0aGUgdGVybWlvcyBzdGF0ZSBzaG91bGQgYmUga2VwdCBldmVuIGlmIHRoZSB0dHkKQEAgLTMxMCw2ICszMTEsNyBAQAogZXh0ZXJuIHZvaWQgdHR5X3ZoYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwogZXh0ZXJuIHZvaWQgdHR5X3VuaGFuZ3VwKHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgdHR5X2h1bmdfdXBfcChzdHJ1Y3QgZmlsZSAqIGZpbHApOworZXh0ZXJuIGludCBpc190dHkoc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIHZvaWQgZG9fU0FLKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogZXh0ZXJuIHZvaWQgX19kb19TQUsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gdm9pZCBkaXNhc3NvY2lhdGVfY3R0eShpbnQgcHJpdik7CkBAIC0zMzgsOSArMzQwLDQ2IEBACiAKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggdHR5X211dGV4OwogCitleHRlcm4gdm9pZCB0dHlfd3JpdGVfdW5sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIGludCB0dHlfd3JpdGVfbG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbmRlbGF5KTsKKyNkZWZpbmUgdHR5X2lzX3dyaXRlbG9ja2VkKHR0eSkgIChtdXRleF9pc19sb2NrZWQoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKQorCisKKwogLyogbl90dHkuYyAqLwogZXh0ZXJuIHN0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjX05fVFRZOwogCisvKiB0dHlfYXVkaXQuYyAqLworI2lmZGVmIENPTkZJR19BVURJVAorZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X2FkZF9kYXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X2V4aXQodm9pZCk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfZm9yayhzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKTsKK2V4dGVybiB2b2lkIHR0eV9hdWRpdF9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X3B1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdWlkX3QgbG9naW51aWQpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X29wZW5pbmcodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9hZGRfZGF0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9leGl0KHZvaWQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X2Zvcmsoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfYXVkaXRfcHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9wdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVpZF90IGxvZ2ludWlkKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9vcGVuaW5nKHZvaWQpCit7Cit9CisjZW5kaWYKKwogLyogdHR5X2lvY3RsLmMgKi8KIGV4dGVybiBpbnQgbl90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlvLmggYi9pbmNsdWRlL2xpbnV4L3Vpby5oCmluZGV4IDlhZjhiYmMuLmI3ZmUxMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC91aW8uaApAQCAtMTMsMTAgKzEzLDYgQEAKICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLQotLyogQSB3b3JkIG9mIHdhcm5pbmc6IE91ciB1aW8gc3RydWN0dXJlIHdpbGwgY2xhc2ggd2l0aCB0aGUgQyBsaWJyYXJ5IG9uZSAod2hpY2ggaXMgbm93IG9ic29sZXRlKS4gUmVtb3ZlIHRoZSBDCi0gICBsaWJyYXJ5IG9uZSBmcm9tIHN5cy91aW8uaCBpZiB5b3UgaGF2ZSBhIHZlcnkgb2xkIGxpYnJhcnkgc2V0ICovCi0KIHN0cnVjdCBpb3ZlYwogewogCXZvaWQgX191c2VyICppb3ZfYmFzZTsJLyogQlNEIHVzZXMgY2FkZHJfdCAoMTAwMy4xZyByZXF1aXJlcyB2b2lkICopICovCkBAIC0zOCwxMSArMzQsNiBAQAogIAogI2RlZmluZSBVSU9fRkFTVElPVgk4CiAjZGVmaW5lIFVJT19NQVhJT1YJMTAyNAotI2lmIDAKLSNkZWZpbmUgVUlPX01BWElPVgkxNgkvKiBNYXhpbXVtIGlvdmVjJ3MgaW4gb25lIG9wZXJhdGlvbiAKLQkJCQkgICAxNiBtYXRjaGVzIEJTRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCZWcgcGFyZG9uOiBCU0QgaGFzIDEwMjQgLS1BTksgKi8KLSNlbmRpZgogCiAvKgogICogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIGNvdmVyZWQgYnkgYW4gaW92ZWMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzMjA1NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9MSU5VWF9VU0VSX05BTUVTUEFDRV9ICisjZGVmaW5lIF9MSU5VWF9VU0VSX05BTUVTUEFDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNkZWZpbmUgVUlESEFTSF9CSVRTCShDT05GSUdfQkFTRV9TTUFMTCA/IDMgOiA4KQorI2RlZmluZSBVSURIQVNIX1NaCSgxIDw8IFVJREhBU0hfQklUUykKKworc3RydWN0IHVzZXJfbmFtZXNwYWNlIHsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXVpZGhhc2hfdGFibGVbVUlESEFTSF9TWl07CisJc3RydWN0IHVzZXJfc3RydWN0CSpyb290X3VzZXI7Cit9OworCitleHRlcm4gc3RydWN0IHVzZXJfbmFtZXNwYWNlIGluaXRfdXNlcl9uczsKKworI2lmZGVmIENPTkZJR19VU0VSX05TCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpnZXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCWlmIChucykKKwkJa3JlZl9nZXQoJm5zLT5rcmVmKTsKKwlyZXR1cm4gbnM7Cit9CisKK2V4dGVybiBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmNvcHlfdXNlcl9ucyhpbnQgZmxhZ3MsCisJCQkJCSAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqb2xkX25zKTsKK2V4dGVybiB2b2lkIGZyZWVfdXNlcl9ucyhzdHJ1Y3Qga3JlZiAqa3JlZik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCWlmIChucykKKwkJa3JlZl9wdXQoJm5zLT5rcmVmLCBmcmVlX3VzZXJfbnMpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqZ2V0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKKwlyZXR1cm4gJmluaXRfdXNlcl9uczsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmNvcHlfdXNlcl9ucyhpbnQgZmxhZ3MsCisJCQkJCQkgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqb2xkX25zKQoreworCWlmIChmbGFncyAmIENMT05FX05FV1VTRVIpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oIGIvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKaW5kZXggZjhkM2IzMi4uOTIzZGI5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKQEAgLTQ4LDI2ICs0OCwxNCBAQAogCWtyZWZfZ2V0KCZucy0+a3JlZik7CiB9CiAKLSNpZmRlZiBDT05GSUdfVVRTX05TCi1leHRlcm4gc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZShpbnQgZmxhZ3MsIHN0cnVjdCB1dHNfbmFtZXNwYWNlICpucyk7CitleHRlcm4gc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZSh1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCQlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpOwogZXh0ZXJuIHZvaWQgZnJlZV91dHNfbnMoc3RydWN0IGtyZWYgKmtyZWYpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3V0c19ucyhzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpCiB7CiAJa3JlZl9wdXQoJm5zLT5rcmVmLCBmcmVlX3V0c19ucyk7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY29weV91dHNuYW1lKGludCBmbGFncywKLQkJCQkJCXN0cnVjdCB1dHNfbmFtZXNwYWNlICpucykKLXsKLQlyZXR1cm4gbnM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXRzX25zKHN0cnVjdCB1dHNfbmFtZXNwYWNlICpucykKLXsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXdfdXRzbmFtZSAqdXRzbmFtZSh2b2lkKQogewogCXJldHVybiAmY3VycmVudC0+bnNwcm94eS0+dXRzX25zLT5uYW1lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAppbmRleCA0YjdlZTgzLi4xMzJiMjYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaApAQCAtNjUsOSArNjUsMTAgQEAKIAkJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgbm9kZSwKIAkJCQkJICBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqcmVtb3ZlX3ZtX2FyZWEodm9pZCAqYWRkcik7CisKIGV4dGVybiBpbnQgbWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSwgcGdwcm90X3QgcHJvdCwKIAkJCXN0cnVjdCBwYWdlICoqKnBhZ2VzKTsKLWV4dGVybiB2b2lkIHVubWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSk7CitleHRlcm4gdm9pZCB1bm1hcF9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCiAvKgogICoJSW50ZXJuYWxzLiAgRG9udCd0IHVzZS4uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oIGIvaW5jbHVkZS9saW51eC92bXN0YXQuaAppbmRleCBkOTMyNWNmLi43NTM3MGVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1zdGF0LmgKQEAgLTI1LDcgKzI1LDcgQEAKICNkZWZpbmUgSElHSE1FTV9aT05FKHh4KQogI2VuZGlmCiAKLSNkZWZpbmUgRk9SX0FMTF9aT05FUyh4eCkgRE1BX1pPTkUoeHgpIERNQTMyX1pPTkUoeHgpIHh4IyNfTk9STUFMIEhJR0hNRU1fWk9ORSh4eCkKKyNkZWZpbmUgRk9SX0FMTF9aT05FUyh4eCkgRE1BX1pPTkUoeHgpIERNQTMyX1pPTkUoeHgpIHh4IyNfTk9STUFMIEhJR0hNRU1fWk9ORSh4eCkgLCB4eCMjX01PVkFCTEUKIAogZW51bSB2bV9ldmVudF9pdGVtIHsgUEdQR0lOLCBQR1BHT1VULCBQU1dQSU4sIFBTV1BPVVQsCiAJCUZPUl9BTExfWk9ORVMoUEdBTExPQyksCkBAIC0xNzAsNyArMTcwLDggQEAKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCQl6b25lX3BhZ2Vfc3RhdGUoJnpvbmVzW1pPTkVfSElHSE1FTV0sIGl0ZW0pICsKICNlbmRpZgotCQl6b25lX3BhZ2Vfc3RhdGUoJnpvbmVzW1pPTkVfTk9STUFMXSwgaXRlbSk7CisJCXpvbmVfcGFnZV9zdGF0ZSgmem9uZXNbWk9ORV9OT1JNQUxdLCBpdGVtKSArCisJCXpvbmVfcGFnZV9zdGF0ZSgmem9uZXNbWk9ORV9NT1ZBQkxFXSwgaXRlbSk7CiB9CiAKIGV4dGVybiB2b2lkIHpvbmVfc3RhdGlzdGljcyhzdHJ1Y3Qgem9uZWxpc3QgKiwgc3RydWN0IHpvbmUgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Z0X2tlcm4uaCBiL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCmluZGV4IGQ5NjE2MzUuLjY5OWI3ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCisrKyBiL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCkBAIC03NSw2ICs3NSw4IEBACiBpbnQgdnRfd2FpdGFjdGl2ZShpbnQgdnQpOwogdm9pZCBjaGFuZ2VfY29uc29sZShzdHJ1Y3QgdmNfZGF0YSAqbmV3X3ZjKTsKIHZvaWQgcmVzZXRfdmMoc3RydWN0IHZjX2RhdGEgKnZjKTsKK2V4dGVybiBpbnQgdW5iaW5kX2Nvbl9kcml2ZXIoY29uc3Qgc3RydWN0IGNvbnN3ICpjc3csIGludCBmaXJzdCwgaW50IGxhc3QsCisJCQkgICAgIGludCBkZWZsdCk7CiAKIC8qCiAgKiB2Y19zY3JlZW4uYyBzaGFyZXMgdGhpcyB0ZW1wb3JhcnkgYnVmZmVyIHdpdGggdGhlIGNvbnNvbGUgd3JpdGUgY29kZSBzbyB0aGF0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCBjZTA3MTlhLi5jZTZiYWRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTE0OCw3ICsxNDgsNyBAQAogZXh0ZXJuIHZvaWQgaW5pdF93b3JrcXVldWVzKHZvaWQpOwogaW50IGV4ZWN1dGVfaW5fcHJvY2Vzc19jb250ZXh0KHdvcmtfZnVuY190IGZuLCBzdHJ1Y3QgZXhlY3V0ZV93b3JrICopOwogCi1leHRlcm4gdm9pZCBjYW5jZWxfd29ya19zeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gaW50IGNhbmNlbF93b3JrX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyoKICAqIEtpbGwgb2ZmIGEgcGVuZGluZyBzY2hlZHVsZV9kZWxheWVkX3dvcmsoKS4gIE5vdGUgdGhhdCB0aGUgd29yayBjYWxsYmFjawpAQCAtMTY2LDE0ICsxNjYsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1leHRlcm4gdm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspOworZXh0ZXJuIGludCBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yayk7CiAKLS8qIE9ic29sZXRlLiB1c2UgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygpICovCisvKiBPYnNvbGV0ZS4gdXNlIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygpICovCiBzdGF0aWMgaW5saW5lCiB2b2lkIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsCiAJCQkJCXN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspCiB7Ci0JY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayh3b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMod29yayk7Cit9CisKKy8qIE9ic29sZXRlLiB1c2UgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCkgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyh3b3JrKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY20uaCBiL2luY2x1ZGUvbmV0L3NjbS5oCmluZGV4IDU2MzdkNWUuLjQyM2NiMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjbS5oCisrKyBiL2luY2x1ZGUvbmV0L3NjbS5oCkBAIC04LDcgKzgsNyBAQAogLyogV2VsbCwgd2Ugc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIGRlc2NyaXB0b3Igb3BlbgogICogdG8gYWNjZXB0IHBhc3NlZCBGRHMgOCkKICAqLwotI2RlZmluZSBTQ01fTUFYX0ZECShPUEVOX01BWC0xKQorI2RlZmluZSBTQ01fTUFYX0ZECTI1NQogCiBzdHJ1Y3Qgc2NtX2ZwX2xpc3QKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vdGdhZmIuaCBiL2luY2x1ZGUvdmlkZW8vdGdhZmIuaAppbmRleCAwM2QwZGJlLi43YmM1ZTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL3RnYWZiLmgKKysrIGIvaW5jbHVkZS92aWRlby90Z2FmYi5oCkBAIC0yMTYsNiArMjE2LDcgQEAKIAl1MzIgcGxsX2ZyZXE7CQkJLyogcGl4Y2xvY2sgaW4gbWh6ICovCiAJdTMyIGJpdHNfcGVyX3BpeGVsOwkJLyogYml0cyBwZXIgcGl4ZWwgKi8KIAl1MzIgc3luY19vbl9ncmVlbjsJCS8qIHNldCBpZiBzeW5jIGlzIG9uIGdyZWVuICovCisJdTMyIHBhbGV0dGVbMTZdOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggZDlkODc4YS4uZTIwNTY4MiAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMTIwLDE1ICsxMjAsNiBAQAogCSAgc2VjdGlvbiA2LjQgb2YgdGhlIExpbnV4IFByb2dyYW1tZXIncyBHdWlkZSwgYXZhaWxhYmxlIGZyb20KIAkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2d1aWRlcy5odG1sPi4KIAotY29uZmlnIElQQ19OUwotCWJvb2wgIklQQyBOYW1lc3BhY2VzIgotCWRlcGVuZHMgb24gU1lTVklQQwotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFN1cHBvcnQgaXBjIG5hbWVzcGFjZXMuICBUaGlzIGFsbG93cyBjb250YWluZXJzLCBpLmUuIHZpcnR1YWwKLQkgIGVudmlyb25tZW50cywgdG8gdXNlIGlwYyBuYW1lc3BhY2VzIHRvIHByb3ZpZGUgZGlmZmVyZW50IGlwYwotCSAgb2JqZWN0cyBmb3IgZGlmZmVyZW50IHNlcnZlcnMuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgU1lTVklQQ19TWVNDVEwKIAlib29sCiAJZGVwZW5kcyBvbiBTWVNWSVBDCkBAIC0yMTgsMTMgKzIwOSwxNCBAQAogCiAJICBTYXkgTiBpZiB1bnN1cmUuCiAKLWNvbmZpZyBVVFNfTlMKLQlib29sICJVVFMgTmFtZXNwYWNlcyIKK2NvbmZpZyBVU0VSX05TCisJYm9vbCAiVXNlciBOYW1lc3BhY2VzIChFWFBFUklNRU5UQUwpIgogCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAotCSAgU3VwcG9ydCB1dHMgbmFtZXNwYWNlcy4gIFRoaXMgYWxsb3dzIGNvbnRhaW5lcnMsIGkuZS4KLQkgIHZzZXJ2ZXJzLCB0byB1c2UgdXRzIG5hbWVzcGFjZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQKLQkgIHV0cyBpbmZvIGZvciBkaWZmZXJlbnQgc2VydmVycy4gIElmIHVuc3VyZSwgc2F5IE4uCisJICBTdXBwb3J0IHVzZXIgbmFtZXNwYWNlcy4gIFRoaXMgYWxsb3dzIGNvbnRhaW5lcnMsIGkuZS4KKwkgIHZzZXJ2ZXJzLCB0byB1c2UgdXNlciBuYW1lc3BhY2VzIHRvIHByb3ZpZGUgZGlmZmVyZW50CisJICB1c2VyIGluZm8gZm9yIGRpZmZlcmVudCBzZXJ2ZXJzLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIEFVRElUCiAJYm9vbCAiQXVkaXRpbmcgc3VwcG9ydCIKQEAgLTU1NCw3ICs1NDYsNyBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIkNob29zZSBTTEFCIGFsbG9jYXRvciIKLQlkZWZhdWx0IFNMQUIKKwlkZWZhdWx0IFNMVUIKIAloZWxwCiAJICAgVGhpcyBvcHRpb24gYWxsb3dzIHRvIHNlbGVjdCBhIHNsYWIgYWxsb2NhdG9yLgogCkBAIC01NzYsNyArNTY4LDcgQEAKIAkgICBhbmQgaGFzIGVuaGFuY2VkIGRpYWdub3N0aWNzLgogCiBjb25maWcgU0xPQgotCWRlcGVuZHMgb24gRU1CRURERUQgJiYgIVNQQVJTRU1FTQorCWRlcGVuZHMgb24gRU1CRURERUQKIAlib29sICJTTE9CIChTaW1wbGUgQWxsb2NhdG9yKSIKIAloZWxwCiAJICAgU0xPQiByZXBsYWNlcyB0aGUgU0xBQiBhbGxvY2F0b3Igd2l0aCBhIGRyYXN0aWNhbGx5IHNpbXBsZXIKQEAgLTYwMiw5ICs1OTQsNyBAQAogCWRlZmF1bHQgMCBpZiBCQVNFX0ZVTEwKIAlkZWZhdWx0IDEgaWYgIUJBU0VfRlVMTAogCi1tZW51ICJMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydCIKLQotY29uZmlnIE1PRFVMRVMKK21lbnVjb25maWcgTU9EVUxFUwogCWJvb2wgIkVuYWJsZSBsb2FkYWJsZSBtb2R1bGUgc3VwcG9ydCIKIAloZWxwCiAJICBLZXJuZWwgbW9kdWxlcyBhcmUgc21hbGwgcGllY2VzIG9mIGNvbXBpbGVkIGNvZGUgd2hpY2ggY2FuCkBAIC02ODQsNiArNjc0LDUgQEAKIAlkZXBlbmRzIG9uIChTTVAgJiYgTU9EVUxFX1VOTE9BRCkgfHwgSE9UUExVR19DUFUKIAloZWxwCiAJICBOZWVkIHN0b3BfbWFjaGluZSgpIHByaW1pdGl2ZS4KLWVuZG1lbnUKIAogc291cmNlICJibG9jay9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuYyBiL2luaXQvZG9fbW91bnRzLmMKaW5kZXggNDZmZTQwNy4uNGVmYTFlNSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuYworKysgYi9pbml0L2RvX21vdW50cy5jCkBAIC0yNSw2ICsyNSw3IEBACiBpbnQgcm9vdF9tb3VudGZsYWdzID0gTVNfUkRPTkxZIHwgTVNfU0lMRU5UOwogY2hhciAqIF9faW5pdGRhdGEgcm9vdF9kZXZpY2VfbmFtZTsKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgc2F2ZWRfcm9vdF9uYW1lWzY0XTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSByb290X3dhaXQ7CiAKIGRldl90IFJPT1RfREVWOwogCkBAIC0yMTYsNiArMjE3LDE2IEBACiAKIF9fc2V0dXAoInJvb3Q9Iiwgcm9vdF9kZXZfc2V0dXApOwogCitzdGF0aWMgaW50IF9faW5pdCByb290d2FpdF9zZXR1cChjaGFyICpzdHIpCit7CisJaWYgKCpzdHIpCisJCXJldHVybiAwOworCXJvb3Rfd2FpdCA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInJvb3R3YWl0Iiwgcm9vdHdhaXRfc2V0dXApOworCiBzdGF0aWMgY2hhciAqIF9faW5pdGRhdGEgcm9vdF9tb3VudF9kYXRhOwogc3RhdGljIGludCBfX2luaXQgcm9vdF9kYXRhX3NldHVwKGNoYXIgKnN0cikKIHsKQEAgLTQzOCwxMSArNDQ5LDIwIEBACiAJCQlyb290X2RldmljZV9uYW1lICs9IDU7CiAJfQogCi0JaXNfZmxvcHB5ID0gTUFKT1IoUk9PVF9ERVYpID09IEZMT1BQWV9NQUpPUjsKLQogCWlmIChpbml0cmRfbG9hZCgpKQogCQlnb3RvIG91dDsKIAorCS8qIHdhaXQgZm9yIGFueSBhc3luY2hyb25vdXMgc2Nhbm5pbmcgdG8gY29tcGxldGUgKi8KKwlpZiAoKFJPT1RfREVWID09IDApICYmIHJvb3Rfd2FpdCkgeworCQlwcmludGsoS0VSTl9JTkZPICJXYWl0aW5nIGZvciByb290IGRldmljZSAlcy4uLlxuIiwKKwkJCXNhdmVkX3Jvb3RfbmFtZSk7CisJCXdoaWxlIChkcml2ZXJfcHJvYmVfZG9uZSgpICE9IDAgfHwKKwkJCShST09UX0RFViA9IG5hbWVfdG9fZGV2X3Qoc2F2ZWRfcm9vdF9uYW1lKSkgPT0gMCkKKwkJCW1zbGVlcCgxMDApOworCX0KKworCWlzX2Zsb3BweSA9IE1BSk9SKFJPT1RfREVWKSA9PSBGTE9QUFlfTUFKT1I7CisKIAlpZiAoaXNfZmxvcHB5ICYmIHJkX2RvbG9hZCAmJiByZF9sb2FkX2Rpc2soMCkpCiAJCVJPT1RfREVWID0gUm9vdF9SQU0wOwogCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19pbml0cmQuYyBiL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCmluZGV4IGIyMjJjZTkuLmE2YjRjMGMgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCisrKyBiL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCkBAIC01NiwxMiArNTYsOSBAQAogCXN5c19jaHJvb3QoIi4iKTsKIAogCXBpZCA9IGtlcm5lbF90aHJlYWQoZG9fbGludXhyYywgIi9saW51eHJjIiwgU0lHQ0hMRCk7Ci0JaWYgKHBpZCA+IDApIHsKLQkJd2hpbGUgKHBpZCAhPSBzeXNfd2FpdDQoLTEsIE5VTEwsIDAsIE5VTEwpKSB7Ci0JCQl0cnlfdG9fZnJlZXplKCk7CisJaWYgKHBpZCA+IDApCisJCXdoaWxlIChwaWQgIT0gc3lzX3dhaXQ0KC0xLCBOVUxMLCAwLCBOVUxMKSkKIAkJCXlpZWxkKCk7Ci0JCX0KLQl9CiAKIAkvKiBtb3ZlIGluaXRyZCB0byByb290ZnMnIC9vbGQgKi8KIAlzeXNfZmNoZGlyKG9sZF9mZCk7CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IDBlYjFjNzQuLmQzYmNiM2IgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC0xMzIsMjAgKzEzMiw5IEBACiBzdGF0aWMgY2hhciAqZXhlY3V0ZV9jb21tYW5kOwogc3RhdGljIGNoYXIgKnJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kOwogCisjaWZkZWYgQ09ORklHX1NNUAogLyogU2V0dXAgY29uZmlndXJlZCBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHRvIGFjdGl2YXRlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG1heF9jcHVzID0gTlJfQ1BVUzsKLQotLyoKLSAqIElmIHNldCwgdGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBkcml2ZXJzIHRoYXQgcmVzZXQgdGhlIHVuZGVybHlpbmcKLSAqIGRldmljZSBiZWZvcmUgZ29pbmcgYWhlYWQgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gb3RoZXJ3aXNlIGRyaXZlciBtaWdodAotICogcmVseSBvbiB0aGUgQklPUyBhbmQgc2tpcCB0aGUgcmVzZXQgb3BlcmF0aW9uLgotICoKLSAqIFRoaXMgaXMgdXNlZnVsIGlmIGtlcm5lbCBpcyBib290aW5nIGluIGFuIHVucmVsaWFibGUgZW52aXJvbm1lbnQuCi0gKiBGb3IgZXguIGtkdW1wIHNpdHVhaXRvbiB3aGVyZSBwcmV2aW91cyBrZXJuZWwgaGFzIGNyYXNoZWQsIEJJT1MgaGFzIGJlZW4KLSAqIHNraXBwZWQgYW5kIGRldmljZXMgd2lsbCBiZSBpbiB1bmtub3duIHN0YXRlLgotICovCi11bnNpZ25lZCBpbnQgcmVzZXRfZGV2aWNlczsKLUVYUE9SVF9TWU1CT0wocmVzZXRfZGV2aWNlcyk7CitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgbWF4X2NwdXMgPSBOUl9DUFVTOwogCiAvKgogICogU2V0dXAgcm91dGluZSBmb3IgY29udHJvbGxpbmcgU01QIGFjdGl2YXRpb24KQEAgLTE2MCwxMCArMTQ5LDEwIEBACiBzdGF0aWMgaW50IF9faW5pdCBub3NtcChjaGFyICpzdHIpCiB7CiAJbWF4X2NwdXMgPSAwOwotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCi1fX3NldHVwKCJub3NtcCIsIG5vc21wKTsKK2Vhcmx5X3BhcmFtKCJub3NtcCIsIG5vc21wKTsKIAogc3RhdGljIGludCBfX2luaXQgbWF4Y3B1cyhjaGFyICpzdHIpCiB7CkBAIC0xNzIsNiArMTYxLDIxIEBACiB9CiAKIF9fc2V0dXAoIm1heGNwdXM9IiwgbWF4Y3B1cyk7CisjZWxzZQorI2RlZmluZSBtYXhfY3B1cyBOUl9DUFVTCisjZW5kaWYKKworLyoKKyAqIElmIHNldCwgdGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBkcml2ZXJzIHRoYXQgcmVzZXQgdGhlIHVuZGVybHlpbmcKKyAqIGRldmljZSBiZWZvcmUgZ29pbmcgYWhlYWQgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gb3RoZXJ3aXNlIGRyaXZlciBtaWdodAorICogcmVseSBvbiB0aGUgQklPUyBhbmQgc2tpcCB0aGUgcmVzZXQgb3BlcmF0aW9uLgorICoKKyAqIFRoaXMgaXMgdXNlZnVsIGlmIGtlcm5lbCBpcyBib290aW5nIGluIGFuIHVucmVsaWFibGUgZW52aXJvbm1lbnQuCisgKiBGb3IgZXguIGtkdW1wIHNpdHVhaXRvbiB3aGVyZSBwcmV2aW91cyBrZXJuZWwgaGFzIGNyYXNoZWQsIEJJT1MgaGFzIGJlZW4KKyAqIHNraXBwZWQgYW5kIGRldmljZXMgd2lsbCBiZSBpbiB1bmtub3duIHN0YXRlLgorICovCit1bnNpZ25lZCBpbnQgcmVzZXRfZGV2aWNlczsKK0VYUE9SVF9TWU1CT0wocmVzZXRfZGV2aWNlcyk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldF9yZXNldF9kZXZpY2VzKGNoYXIgKnN0cikKIHsKQEAgLTM4NSw2ICszODksMTAgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCisjaWZuZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCWNwdV9wb3NzaWJsZV9tYXAgPSBjcHVfcHJlc2VudF9tYXA7CisjZW5kaWYKKwogCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBkb25lIGluIHVzZXJzcGFjZSAtLVJSICovCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CiAJCWlmIChudW1fb25saW5lX2NwdXMoKSA+PSBtYXhfY3B1cykKQEAgLTQ1Myw3ICs0NjEsMTAgQEAKIAlzdHJ1Y3Qgb2JzX2tlcm5lbF9wYXJhbSAqcDsKIAogCWZvciAocCA9IF9fc2V0dXBfc3RhcnQ7IHAgPCBfX3NldHVwX2VuZDsgcCsrKSB7Ci0JCWlmIChwLT5lYXJseSAmJiBzdHJjbXAocGFyYW0sIHAtPnN0cikgPT0gMCkgeworCQlpZiAoKHAtPmVhcmx5ICYmIHN0cmNtcChwYXJhbSwgcC0+c3RyKSA9PSAwKSB8fAorCQkgICAgKHN0cmNtcChwYXJhbSwgImNvbnNvbGUiKSA9PSAwICYmCisJCSAgICAgc3RyY21wKHAtPnN0ciwgImVhcmx5Y29uIikgPT0gMCkKKwkJKSB7CiAJCQlpZiAocC0+c2V0dXBfZnVuYyh2YWwpICE9IDApCiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCSAgICAgICAiTWFsZm9ybWVkIGVhcmx5IG9wdGlvbiAnJXMnXG4iLCBwYXJhbSk7CkBAIC01MjYsNiArNTM3LDEwIEBACiAJc2V0dXBfYXJjaCgmY29tbWFuZF9saW5lKTsKIAlzZXR1cF9jb21tYW5kX2xpbmUoY29tbWFuZF9saW5lKTsKIAl1bndpbmRfc2V0dXAoKTsKKyNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJaWYgKG1heF9jcHVzIDwgMikKKwkJY3B1X3Bvc3NpYmxlX21hcCA9IGNwdV9vbmxpbmVfbWFwOworI2VuZGlmCiAJc2V0dXBfcGVyX2NwdV9hcmVhcygpOwogCXNtcF9wcmVwYXJlX2Jvb3RfY3B1KCk7CS8qIGFyY2gtc3BlY2lmaWMgYm9vdC1jcHUgaG9va3MgKi8KIApAQCAtNzI1LDYgKzc0MCwxNSBAQAogCWRvX2luaXRjYWxscygpOwogfQogCitzdGF0aWMgaW50IF9faW5pdGRhdGEgbm9zb2Z0bG9ja3VwOworCitzdGF0aWMgaW50IF9faW5pdCBub3NvZnRsb2NrdXBfc2V0dXAoY2hhciAqc3RyKQoreworCW5vc29mdGxvY2t1cCA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJub3NvZnRsb2NrdXAiLCBub3NvZnRsb2NrdXBfc2V0dXApOworCiBzdGF0aWMgdm9pZCBfX2luaXQgZG9fcHJlX3NtcF9pbml0Y2FsbHModm9pZCkKIHsKIAlleHRlcm4gaW50IHNwYXduX2tzb2Z0aXJxZCh2b2lkKTsKQEAgLTczNCw3ICs3NTgsOCBAQAogCW1pZ3JhdGlvbl9pbml0KCk7CiAjZW5kaWYKIAlzcGF3bl9rc29mdGlycWQoKTsKLQlzcGF3bl9zb2Z0bG9ja3VwX3Rhc2soKTsKKwlpZiAoIW5vc29mdGxvY2t1cCkKKwkJc3Bhd25fc29mdGxvY2t1cF90YXNrKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJ1bl9pbml0X3Byb2Nlc3MoY2hhciAqaW5pdF9maWxlbmFtZSkKZGlmZiAtLWdpdCBhL2lwYy9tc2cuYyBiL2lwYy9tc2cuYwppbmRleCBhMzg4ODI0Li5jYmQyN2U1IDEwMDY0NAotLS0gYS9pcGMvbXNnLmMKKysrIGIvaXBjL21zZy5jCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWMgaW50IHN5c3ZpcGNfbXNnX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0KTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2lwY19pbml0IF9fbXNnX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQorc3RhdGljIHZvaWQgX19tc2dfaW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCiB7CiAJbnMtPmlkc1tJUENfTVNHX0lEU10gPSBpZHM7CiAJbnMtPm1zZ19jdGxtYXggPSBNU0dNQVg7CkBAIC05Niw3ICs5Niw2IEBACiAJaXBjX2luaXRfaWRzKGlkcywgbnMtPm1zZ19jdGxtbmkpOwogfQogCi0jaWZkZWYgQ09ORklHX0lQQ19OUwogaW50IG1zZ19pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKIAlzdHJ1Y3QgaXBjX2lkcyAqaWRzOwpAQCAtMTI4LDcgKzEyNyw2IEBACiAJa2ZyZWUobnMtPmlkc1tJUENfTVNHX0lEU10pOwogCW5zLT5pZHNbSVBDX01TR19JRFNdID0gTlVMTDsKIH0KLSNlbmRpZgogCiB2b2lkIF9faW5pdCBtc2dfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IDk5NjRiMjIuLjg5YmZkZmYgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogI2RlZmluZSBzY19zZW1vcG0Jc2VtX2N0bHNbMl0KICNkZWZpbmUgc2Nfc2VtbW5pCXNlbV9jdGxzWzNdCiAKLXN0YXRpYyB2b2lkIF9faXBjX2luaXQgX19zZW1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCitzdGF0aWMgdm9pZCBfX3NlbV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKIHsKIAlucy0+aWRzW0lQQ19TRU1fSURTXSA9IGlkczsKIAlucy0+c2Nfc2VtbXNsID0gU0VNTVNMOwpAQCAtMTMyLDcgKzEzMiw2IEBACiAJaXBjX2luaXRfaWRzKGlkcywgbnMtPnNjX3NlbW1uaSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCiBpbnQgc2VtX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewogCXN0cnVjdCBpcGNfaWRzICppZHM7CkBAIC0xNjQsNyArMTYzLDYgQEAKIAlrZnJlZShucy0+aWRzW0lQQ19TRU1fSURTXSk7CiAJbnMtPmlkc1tJUENfU0VNX0lEU10gPSBOVUxMOwogfQotI2VuZGlmCiAKIHZvaWQgX19pbml0IHNlbV9pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IDA4NTJmMjAuLjI0MmMzZjYgMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTc3LDcgKzc3LDcgQEAKIHN0YXRpYyBpbnQgc3lzdmlwY19zaG1fcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpOwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9faXBjX2luaXQgX19zaG1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCitzdGF0aWMgdm9pZCBfX3NobV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKIHsKIAlucy0+aWRzW0lQQ19TSE1fSURTXSA9IGlkczsKIAlucy0+c2htX2N0bG1heCA9IFNITU1BWDsKQEAgLTk4LDcgKzk4LDYgQEAKIAkJc2htX2Rlc3Ryb3kobnMsIHNocCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCiBpbnQgc2htX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewogCXN0cnVjdCBpcGNfaWRzICppZHM7CkBAIC0xMzAsNyArMTI5LDYgQEAKIAlrZnJlZShucy0+aWRzW0lQQ19TSE1fSURTXSk7CiAJbnMtPmlkc1tJUENfU0hNX0lEU10gPSBOVUxMOwogfQotI2VuZGlmCiAKIHZvaWQgX19pbml0IHNobV9pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuYyBiL2lwYy91dGlsLmMKaW5kZXggNzUzNmE3Mi4uNDRlNTEzNSAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuYworKysgYi9pcGMvdXRpbC5jCkBAIC01MCw3ICs1MCw2IEBACiAJfSwKIH07CiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCiBzdGF0aWMgc3RydWN0IGlwY19uYW1lc3BhY2UgKmNsb25lX2lwY19ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqb2xkX25zKQogewogCWludCBlcnI7CkBAIC0xMTAsMTQgKzEwOSw2IEBACiAJc2htX2V4aXRfbnMobnMpOwogCWtmcmVlKG5zKTsKIH0KLSNlbHNlCi1zdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY29weV9pcGNzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKLXsKLQlpZiAoZmxhZ3MgJiBDTE9ORV9ORVdJUEMpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCXJldHVybiBuczsKLX0KLSNlbmRpZgogCiAvKioKICAqCWlwY19pbml0CS0JaW5pdGlhbGlzZSBJUEMgc3Vic3lzdGVtCkBAIC0xNDUsNyArMTM2LDcgQEAKICAqCWFycmF5IGl0c2VsZi4gCiAgKi8KICAKLXZvaWQgX19pcGNfaW5pdCBpcGNfaW5pdF9pZHMoc3RydWN0IGlwY19pZHMqIGlkcywgaW50IHNpemUpCit2b2lkIGlwY19pbml0X2lkcyhzdHJ1Y3QgaXBjX2lkcyogaWRzLCBpbnQgc2l6ZSkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuaCBiL2lwYy91dGlsLmgKaW5kZXggZTNhYTJjNS4uMzMzZTg5MSAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuaAorKysgYi9pcGMvdXRpbC5oCkBAIC00MSwxMiArNDEsOCBAQAogfTsKIAogc3RydWN0IHNlcV9maWxlOwotI2lmZGVmIENPTkZJR19JUENfTlMKLSNkZWZpbmUgX19pcGNfaW5pdAotI2Vsc2UKLSNkZWZpbmUgX19pcGNfaW5pdAlfX2luaXQKLSNlbmRpZgotdm9pZCBfX2lwY19pbml0IGlwY19pbml0X2lkcyhzdHJ1Y3QgaXBjX2lkcyAqaWRzLCBpbnQgc2l6ZSk7CisKK3ZvaWQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzICppZHMsIGludCBzaXplKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogdm9pZCBfX2luaXQgaXBjX2luaXRfcHJvY19pbnRlcmZhY2UoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqaGVhZGVyLAogCQlpbnQgaWRzLCBpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNjQyZDQyNy4uMmE5OTk4MyAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtNCwxMSArNCwxMiBAQAogCiBvYmoteSAgICAgPSBzY2hlZC5vIGZvcmsubyBleGVjX2RvbWFpbi5vIHBhbmljLm8gcHJpbnRrLm8gcHJvZmlsZS5vIFwKIAkgICAgZXhpdC5vIGl0aW1lci5vIHRpbWUubyBzb2Z0aXJxLm8gcmVzb3VyY2UubyBcCi0JICAgIHN5c2N0bC5vIGNhcGFiaWxpdHkubyBwdHJhY2UubyB0aW1lci5vIHVzZXIubyBcCisJICAgIHN5c2N0bC5vIGNhcGFiaWxpdHkubyBwdHJhY2UubyB0aW1lci5vIHVzZXIubyB1c2VyX25hbWVzcGFjZS5vIFwKIAkgICAgc2lnbmFsLm8gc3lzLm8ga21vZC5vIHdvcmtxdWV1ZS5vIHBpZC5vIFwKIAkgICAgcmN1cGRhdGUubyBleHRhYmxlLm8gcGFyYW1zLm8gcG9zaXgtdGltZXJzLm8gXAogCSAgICBrdGhyZWFkLm8gd2FpdC5vIGtmaWZvLm8gc3lzX25pLm8gcG9zaXgtY3B1LXRpbWVycy5vIG11dGV4Lm8gXAotCSAgICBocnRpbWVyLm8gcndzZW0ubyBsYXRlbmN5Lm8gbnNwcm94eS5vIHNyY3UubyBkaWVfbm90aWZpZXIubworCSAgICBocnRpbWVyLm8gcndzZW0ubyBsYXRlbmN5Lm8gbnNwcm94eS5vIHNyY3UubyBkaWVfbm90aWZpZXIubyBcCisJICAgIHV0c25hbWUubwogCiBvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkgKz0gc3RhY2t0cmFjZS5vCiBvYmoteSArPSB0aW1lLwpAQCAtNDgsNyArNDksNiBAQAogb2JqLSQoQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QpICs9IHJjdXRvcnR1cmUubwogb2JqLSQoQ09ORklHX1JFTEFZKSArPSByZWxheS5vCiBvYmotJChDT05GSUdfU1lTQ1RMKSArPSB1dHNuYW1lX3N5c2N0bC5vCi1vYmotJChDT05GSUdfVVRTX05TKSArPSB1dHNuYW1lLm8KIG9iai0kKENPTkZJR19UQVNLX0RFTEFZX0FDQ1QpICs9IGRlbGF5YWNjdC5vCiBvYmotJChDT05GSUdfVEFTS1NUQVRTKSArPSB0YXNrc3RhdHMubyB0c2FjY3QubwogCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IGQxMzI3NmQuLmViMGY5MTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC01OCw2ICs1OCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VsaW51eC5oPgogI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAKICNpbmNsdWRlICJhdWRpdC5oIgogCkBAIC0zOTEsNiArMzkyLDcgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZhdWRpdF9za2JfcXVldWUpOwogCQl3YWtlX3VwKCZhdWRpdF9iYWNrbG9nX3dhaXQpOwpAQCAtNDIzLDYgKzQyNSwzMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF1ZGl0X3ByZXBhcmVfdXNlcl90dHkocGlkX3QgcGlkLCB1aWRfdCBsb2dpbnVpZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwlpbnQgZXJyOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl0c2sgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CisJZXJyID0gLUVTUkNIOworCWlmICghdHNrKQorCQlnb3RvIG91dDsKKwllcnIgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoIXRzay0+c2lnbmFsLT5hdWRpdF90dHkpCisJCWVyciA9IC1FUEVSTTsKKwlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwl0dHlfYXVkaXRfcHVzaF90YXNrKHRzaywgbG9naW51aWQpOworb3V0OgorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgYXVkaXRfc2VuZF9saXN0KHZvaWQgKl9kZXN0KQogewogCXN0cnVjdCBhdWRpdF9uZXRsaW5rX2xpc3QgKmRlc3QgPSBfZGVzdDsKQEAgLTUxMSw2ICs1MzgsOCBAQAogCWNhc2UgQVVESVRfREVMOgogCWNhc2UgQVVESVRfREVMX1JVTEU6CiAJY2FzZSBBVURJVF9TSUdOQUxfSU5GTzoKKwljYXNlIEFVRElUX1RUWV9HRVQ6CisJY2FzZSBBVURJVF9UVFlfU0VUOgogCQlpZiAoc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYiwgQ0FQX0FVRElUX0NPTlRST0wpKQogCQkJZXJyID0gLUVQRVJNOwogCQlicmVhazsKQEAgLTYyMiw2ICs2NTEsMTEgQEAKIAkJZXJyID0gYXVkaXRfZmlsdGVyX3VzZXIoJk5FVExJTktfQ0Ioc2tiKSwgbXNnX3R5cGUpOwogCQlpZiAoZXJyID09IDEpIHsKIAkJCWVyciA9IDA7CisJCQlpZiAobXNnX3R5cGUgPT0gQVVESVRfVVNFUl9UVFkpIHsKKwkJCQllcnIgPSBhdWRpdF9wcmVwYXJlX3VzZXJfdHR5KHBpZCwgbG9naW51aWQpOworCQkJCWlmIChlcnIpCisJCQkJCWJyZWFrOworCQkJfQogCQkJYWIgPSBhdWRpdF9sb2dfc3RhcnQoTlVMTCwgR0ZQX0tFUk5FTCwgbXNnX3R5cGUpOwogCQkJaWYgKGFiKSB7CiAJCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwKQEAgLTYzOCw4ICs2NzIsMTcgQEAKIAkJCQkJCQkiIHN1Ymo9JXMiLCBjdHgpOwogCQkJCQlrZnJlZShjdHgpOwogCQkJCX0KLQkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG1zZz0nJS4xMDI0cyciLAotCQkJCQkgKGNoYXIgKilkYXRhKTsKKwkJCQlpZiAobXNnX3R5cGUgIT0gQVVESVRfVVNFUl9UVFkpCisJCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbXNnPSclLjEwMjRzJyIsCisJCQkJCQkJIChjaGFyICopZGF0YSk7CisJCQkJZWxzZSB7CisJCQkJCWludCBzaXplOworCisJCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbXNnPSIpOworCQkJCQlzaXplID0gbmxtc2dfbGVuKG5saCk7CisJCQkJCWF1ZGl0X2xvZ19uX3VudHJ1c3RlZHN0cmluZyhhYiwgc2l6ZSwKKwkJCQkJCQkJICAgIGRhdGEpOworCQkJCX0KIAkJCQlhdWRpdF9zZXRfcGlkKGFiLCBwaWQpOwogCQkJCWF1ZGl0X2xvZ19lbmQoYWIpOwogCQkJfQpAQCAtNzMwLDYgKzc3Myw0NSBAQAogCQkJCTAsIDAsIHNpZ19kYXRhLCBzaXplb2YoKnNpZ19kYXRhKSArIGxlbik7CiAJCWtmcmVlKHNpZ19kYXRhKTsKIAkJYnJlYWs7CisJY2FzZSBBVURJVF9UVFlfR0VUOiB7CisJCXN0cnVjdCBhdWRpdF90dHlfc3RhdHVzIHM7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCisJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJCXRzayA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJaWYgKCF0c2spCisJCQllcnIgPSAtRVNSQ0g7CisJCWVsc2UgeworCQkJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJCXMuZW5hYmxlZCA9IHRzay0+c2lnbmFsLT5hdWRpdF90dHkgIT0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJfQorCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCWF1ZGl0X3NlbmRfcmVwbHkoTkVUTElOS19DQihza2IpLnBpZCwgc2VxLCBBVURJVF9UVFlfR0VULCAwLCAwLAorCQkJCSAmcywgc2l6ZW9mKHMpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESVRfVFRZX1NFVDogeworCQlzdHJ1Y3QgYXVkaXRfdHR5X3N0YXR1cyAqczsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisKKwkJaWYgKG5saC0+bmxtc2dfbGVuIDwgc2l6ZW9mKHN0cnVjdCBhdWRpdF90dHlfc3RhdHVzKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzID0gZGF0YTsKKwkJaWYgKHMtPmVuYWJsZWQgIT0gMCAmJiBzLT5lbmFibGVkICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJdHNrID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCQlpZiAoIXRzaykKKwkJCWVyciA9IC1FU1JDSDsKKwkJZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQkJdHNrLT5zaWduYWwtPmF1ZGl0X3R0eSA9IHMtPmVuYWJsZWQgIT0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJfQorCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKQEAgLTExODUsNyArMTI2Nyw3IEBACiB9CiAKIC8qKgotICogYXVkaXRfbG9nX25fdW5zdHJ1c3RlZHN0cmluZyAtIGxvZyBhIHN0cmluZyB0aGF0IG1heSBjb250YWluIHJhbmRvbSBjaGFyYWN0ZXJzCisgKiBhdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcgLSBsb2cgYSBzdHJpbmcgdGhhdCBtYXkgY29udGFpbiByYW5kb20gY2hhcmFjdGVycwogICogQGFiOiBhdWRpdF9idWZmZXIKICAqIEBsZW46IGxlbnRoIG9mIHN0cmluZyAobm90IGluY2x1ZGluZyB0cmFpbGluZyBudWxsKQogICogQHN0cmluZzogc3RyaW5nIHRvIGJlIGxvZ2dlZApAQCAtMTIwMSwyNSArMTI4MywyNCBAQAogY29uc3QgY2hhciAqYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCBzaXplX3QgbGVuLAogCQkJCQljb25zdCBjaGFyICpzdHJpbmcpCiB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHN0cmluZzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOwogCi0Jd2hpbGUgKCpwKSB7CisJZm9yIChwID0gc3RyaW5nOyBwIDwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzdHJpbmcgKyBsZW4gJiYgKnA7IHArKykgewogCQlpZiAoKnAgPT0gJyInIHx8ICpwIDwgMHgyMSB8fCAqcCA+IDB4N2YpIHsKIAkJCWF1ZGl0X2xvZ19oZXgoYWIsIHN0cmluZywgbGVuKTsKIAkJCXJldHVybiBzdHJpbmcgKyBsZW4gKyAxOwogCQl9Ci0JCXArKzsKIAl9CiAJYXVkaXRfbG9nX25fc3RyaW5nKGFiLCBsZW4sIHN0cmluZyk7CiAJcmV0dXJuIHAgKyAxOwogfQogCiAvKioKLSAqIGF1ZGl0X2xvZ191bnN0cnVzdGVkc3RyaW5nIC0gbG9nIGEgc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gcmFuZG9tIGNoYXJhY3RlcnMKKyAqIGF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcgLSBsb2cgYSBzdHJpbmcgdGhhdCBtYXkgY29udGFpbiByYW5kb20gY2hhcmFjdGVycwogICogQGFiOiBhdWRpdF9idWZmZXIKICAqIEBzdHJpbmc6IHN0cmluZyB0byBiZSBsb2dnZWQKICAqCi0gKiBTYW1lIGFzIGF1ZGl0X2xvZ19uX3Vuc3RydXN0ZWRzdHJpbmcoKSwgZXhjZXB0IHRoYXQgc3RybGVuIGlzIHVzZWQgdG8KKyAqIFNhbWUgYXMgYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKCksIGV4Y2VwdCB0aGF0IHN0cmxlbiBpcyB1c2VkIHRvCiAgKiBkZXRlcm1pbmUgc3RyaW5nIGxlbmd0aC4KICAqLwogY29uc3QgY2hhciAqYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwgY29uc3QgY2hhciAqc3RyaW5nKQpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0LmggYi9rZXJuZWwvYXVkaXQuaAppbmRleCA4MTVkNmY1Li45NTg3NzQzIDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXQuaAorKysgYi9rZXJuZWwvYXVkaXQuaApAQCAtMTE1LDcgKzExNSw2IEBACiBleHRlcm4gdm9pZAkJICAgIGF1ZGl0X3NlbmRfcmVwbHkoaW50IHBpZCwgaW50IHNlcSwgaW50IHR5cGUsCiAJCQkJCSAgICAgaW50IGRvbmUsIGludCBtdWx0aSwKIAkJCQkJICAgICB2b2lkICpwYXlsb2FkLCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZAkJICAgIGF1ZGl0X2xvZ19sb3N0KGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwogZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9wYW5pYyhjb25zdCBjaGFyICptZXNzYWdlKTsKIAogc3RydWN0IGF1ZGl0X25ldGxpbmtfbGlzdCB7CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRzYy5jIGIva2VybmVsL2F1ZGl0c2MuYwppbmRleCBlMzY0ODFlLi5iNzY0MGE1IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRzYy5jCisrKyBiL2tlcm5lbC9hdWRpdHNjLmMKQEAgLTcxLDkgKzcxLDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYXVkaXRfZmlsdGVyX2xpc3RbXTsKIAotLyogTm8gc3lzY2FsbCBhdWRpdGluZyB3aWxsIHRha2UgcGxhY2UgdW5sZXNzIGF1ZGl0X2VuYWJsZWQgIT0gMC4gKi8KLWV4dGVybiBpbnQgYXVkaXRfZW5hYmxlZDsKLQogLyogQVVESVRfTkFNRVMgaXMgdGhlIG51bWJlciBvZiBzbG90cyB3ZSByZXNlcnZlIGluIHRoZSBhdWRpdF9jb250ZXh0CiAgKiBmb3Igc2F2aW5nIG5hbWVzIGZyb20gZ2V0bmFtZSgpLiAqLwogI2RlZmluZSBBVURJVF9OQU1FUyAgICAyMApAQCAtMjA0MCw3ICsyMDM3LDcgQEAKIAogLyoqCiAgKiBhdWRpdF9jb3JlX2R1bXBzIC0gcmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IHByb2Nlc3NlcyB0aGF0IGVuZCBhYm5vcm1hbGx5Ci0gKiBAc2lnOiBzaWduYWwgdmFsdWUKKyAqIEBzaWducjogc2lnbmFsIHZhbHVlCiAgKgogICogSWYgYSBwcm9jZXNzIGVuZHMgd2l0aCBhIGNvcmUgZHVtcCwgc29tZXRoaW5nIGZpc2h5IGlzIGdvaW5nIG9uIGFuZCB3ZQogICogc2hvdWxkIHJlY29yZCB0aGUgZXZlbnQgZm9yIGludmVzdGlnYXRpb24uCmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1c2V0LmMgYi9rZXJuZWwvY3B1c2V0LmMKaW5kZXggYzRkMTIzZi4uYjQ3OTZkOCAxMDA2NDQKLS0tIGEva2VybmVsL2NwdXNldC5jCisrKyBiL2tlcm5lbC9jcHVzZXQuYwpAQCAtOTgxLDEwICs5ODEsMTAgQEAKIAkJbW1hcnJheSA9IGttYWxsb2MobnRhc2tzICogc2l6ZW9mKCptbWFycmF5KSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbW1hcnJheSkKIAkJCWdvdG8gZG9uZTsKLQkJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwkJLyogYmxvY2sgZm9yayAqLworCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwkJLyogYmxvY2sgZm9yayAqLwogCQlpZiAoYXRvbWljX3JlYWQoJmNzLT5jb3VudCkgPD0gbnRhc2tzKQogCQkJYnJlYWs7CQkJCS8qIGdvdCBlbm91Z2ggKi8KLQkJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CS8qIHRyeSBhZ2FpbiAqLworCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CQkvKiB0cnkgYWdhaW4gKi8KIAkJa2ZyZWUobW1hcnJheSk7CiAJfQogCkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogCQkJY29udGludWU7CiAJCW1tYXJyYXlbbisrXSA9IG1tOwogCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7Ci0Jd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCiAJLyoKIAkgKiBOb3cgdGhhdCB3ZSd2ZSBkcm9wcGVkIHRoZSB0YXNrbGlzdCBzcGlubG9jaywgd2UgY2FuCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBjYTZhMTFiLi5lOGFmOGQwIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrc3RhdHNfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpAQCAtMzg3LDYgKzM4OCwxMSBAQAogCSAqIHRoZXkgd291bGQgYmUgbG9ja2VkIGludG8gbWVtb3J5LgogCSAqLwogCWV4aXRfbW0oY3VycmVudCk7CisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGhhdmUgVElGX0ZSRUVaRSBzZXQgaWYgdGhlIHN5c3RlbS13aWRlIGhpYmVybmF0aW9uCisJICogb3Igc3VzcGVuZCB0cmFuc2l0aW9uIGJlZ2lucyByaWdodCBub3cuCisJICovCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlzZXRfc3BlY2lhbF9waWRzKDEsIDEpOwogCXByb2NfY2xlYXJfdHR5KGN1cnJlbnQpOwpAQCAtODU4LDYgKzg2NCwzNCBAQAogCQlyZWxlYXNlX3Rhc2sodHNrKTsKIH0KIAorI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS19VU0FHRQorc3RhdGljIHZvaWQgY2hlY2tfc3RhY2tfdXNhZ2Uodm9pZCkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvd193YXRlcl9sb2NrKTsKKwlzdGF0aWMgaW50IGxvd2VzdF90b19kYXRlID0gVEhSRUFEX1NJWkU7CisJdW5zaWduZWQgbG9uZyAqbiA9IGVuZF9vZl9zdGFjayhjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZyZWU7CisKKwl3aGlsZSAoKm4gPT0gMCkKKwkJbisrOworCWZyZWUgPSAodW5zaWduZWQgbG9uZyluIC0gKHVuc2lnbmVkIGxvbmcpZW5kX29mX3N0YWNrKGN1cnJlbnQpOworCisJaWYgKGZyZWUgPj0gbG93ZXN0X3RvX2RhdGUpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmbG93X3dhdGVyX2xvY2spOworCWlmIChmcmVlIDwgbG93ZXN0X3RvX2RhdGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgdXNlZCBncmVhdGVzdCBzdGFjayBkZXB0aDogJWx1IGJ5dGVzICIKKwkJCQkibGVmdFxuIiwKKwkJCQljdXJyZW50LT5jb21tLCBmcmVlKTsKKwkJbG93ZXN0X3RvX2RhdGUgPSBmcmVlOworCX0KKwlzcGluX3VubG9jaygmbG93X3dhdGVyX2xvY2spOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19zdGFja191c2FnZSh2b2lkKSB7fQorI2VuZGlmCisKIGZhc3RjYWxsIE5PUkVUX1RZUEUgdm9pZCBkb19leGl0KGxvbmcgY29kZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CkBAIC05MzcsNiArOTcxLDggQEAKIAlpZiAodW5saWtlbHkodHNrLT5jb21wYXRfcm9idXN0X2xpc3QpKQogCQljb21wYXRfZXhpdF9yb2J1c3RfbGlzdCh0c2spOwogI2VuZGlmCisJaWYgKGdyb3VwX2RlYWQpCisJCXR0eV9hdWRpdF9leGl0KCk7CiAJaWYgKHVubGlrZWx5KHRzay0+YXVkaXRfY29udGV4dCkpCiAJCWF1ZGl0X2ZyZWUodHNrKTsKIApAQCAtOTQ5LDYgKzk4NSw3IEBACiAJZXhpdF9zZW0odHNrKTsKIAlfX2V4aXRfZmlsZXModHNrKTsKIAlfX2V4aXRfZnModHNrKTsKKwljaGVja19zdGFja191c2FnZSgpOwogCWV4aXRfdGhyZWFkKCk7CiAJY3B1c2V0X2V4aXQodHNrKTsKIAlleGl0X2tleXModHNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IGRhM2ExNTUuLmJhMzliZGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0c19rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC04OTcsNiArODk4LDggQEAKIAl9CiAJYWNjdF9pbml0X3BhY2N0KCZzaWctPnBhY2N0KTsKIAorCXR0eV9hdWRpdF9mb3JrKHNpZyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIwLDcgKzkyMyw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBuZXdfZmxhZ3MgPSBwLT5mbGFnczsKIAotCW5ld19mbGFncyAmPSB+KFBGX1NVUEVSUFJJViB8IFBGX05PRlJFRVpFKTsKKwluZXdfZmxhZ3MgJj0gflBGX1NVUEVSUFJJVjsKIAluZXdfZmxhZ3MgfD0gUEZfRk9SS05PRVhFQzsKIAlpZiAoIShjbG9uZV9mbGFncyAmIENMT05FX1BUUkFDRSkpCiAJCXAtPnB0cmFjZSA9IDA7CkBAIC05OTksNyArMTAwMiw3IEBACiAJaWYgKGF0b21pY19yZWFkKCZwLT51c2VyLT5wcm9jZXNzZXMpID49CiAJCQlwLT5zaWduYWwtPnJsaW1bUkxJTUlUX05QUk9DXS5ybGltX2N1cikgewogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgJiYgIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkgJiYKLQkJCQlwLT51c2VyICE9ICZyb290X3VzZXIpCisJCSAgICBwLT51c2VyICE9IGN1cnJlbnQtPm5zcHJveHktPnVzZXJfbnMtPnJvb3RfdXNlcikKIAkJCWdvdG8gYmFkX2ZvcmtfZnJlZTsKIAl9CiAKQEAgLTEwNTksNiArMTA2Miw4IEBACiAKIAlwLT5sb2NrX2RlcHRoID0gLTE7CQkvKiAtMSA9IG5vIGxvY2sgKi8KIAlkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSgmcC0+c3RhcnRfdGltZSk7CisJcC0+cmVhbF9zdGFydF90aW1lID0gcC0+c3RhcnRfdGltZTsKKwltb25vdG9uaWNfdG9fYm9vdGJhc2VkKCZwLT5yZWFsX3N0YXJ0X3RpbWUpOwogCXAtPnNlY3VyaXR5ID0gTlVMTDsKIAlwLT5pb19jb250ZXh0ID0gTlVMTDsKIAlwLT5pb193YWl0ID0gTlVMTDsKQEAgLTE2MDEsNyArMTYwNiw3IEBACiAJZXJyID0gLUVJTlZBTDsKIAlpZiAodW5zaGFyZV9mbGFncyAmIH4oQ0xPTkVfVEhSRUFEfENMT05FX0ZTfENMT05FX05FV05TfENMT05FX1NJR0hBTkR8CiAJCQkJQ0xPTkVfVk18Q0xPTkVfRklMRVN8Q0xPTkVfU1lTVlNFTXwKLQkJCQlDTE9ORV9ORVdVVFN8Q0xPTkVfTkVXSVBDKSkKKwkJCQlDTE9ORV9ORVdVVFN8Q0xPTkVfTkVXSVBDfENMT05FX05FV1VTRVIpKQogCQlnb3RvIGJhZF91bnNoYXJlX291dDsKIAogCWlmICgoZXJyID0gdW5zaGFyZV90aHJlYWQodW5zaGFyZV9mbGFncykpKQpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCA0NTQ5MGJlLi41YzNmNDVkIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMTIxLDYgKzEyMSwyNCBAQAogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqZnV0ZXhfbW50OwogCiAvKgorICogVGFrZSBtbS0+bW1hcF9zZW0sIHdoZW4gZnV0ZXggaXMgc2hhcmVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmdXRleF9sb2NrX21tKHN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQpCit7CisJaWYgKGZzaGFyZWQpCisJCWRvd25fcmVhZChmc2hhcmVkKTsKK30KKworLyoKKyAqIFJlbGVhc2UgbW0tPm1tYXBfc2VtLCB3aGVuIHRoZSBmdXRleCBpcyBzaGFyZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZ1dGV4X3VubG9ja19tbShzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkKQoreworCWlmIChmc2hhcmVkKQorCQl1cF9yZWFkKGZzaGFyZWQpOworfQorCisvKgogICogV2UgaGFzaCBvbiB0aGUga2V5cyByZXR1cm5lZCBmcm9tIGdldF9mdXRleF9rZXkgKHNlZSBiZWxvdykuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhhc2hfZnV0ZXgodW5pb24gZnV0ZXhfa2V5ICprZXkpCkBAIC0yODcsNyArMzA1LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkcm9wX2Z1dGV4X2tleV9yZWZzKTsKIAotc3RhdGljIGlubGluZSBpbnQgZ2V0X2Z1dGV4X3ZhbHVlX2xvY2tlZCh1MzIgKmRlc3QsIHUzMiBfX3VzZXIgKmZyb20pCitzdGF0aWMgdTMyIGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHUzMiBfX3VzZXIgKnVhZGRyLCB1MzIgdXZhbCwgdTMyIG5ld3ZhbCkKK3sKKwl1MzIgY3VydmFsOworCisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKwljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgdXZhbCwgbmV3dmFsKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gY3VydmFsOworfQorCitzdGF0aWMgaW50IGdldF9mdXRleF92YWx1ZV9sb2NrZWQodTMyICpkZXN0LCB1MzIgX191c2VyICpmcm9tKQogewogCWludCByZXQ7CiAKQEAgLTYyMCw5ICs2NDksNyBAQAogCiAJCW5ld3ZhbCA9IEZVVEVYX1dBSVRFUlMgfCBuZXdfb3duZXItPnBpZDsKIAotCQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCQljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgdXZhbCwgbmV3dmFsKTsKLQkJcGFnZWZhdWx0X2VuYWJsZSgpOworCQljdXJ2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgdXZhbCwgbmV3dmFsKTsKIAogCQlpZiAoY3VydmFsID09IC1FRkFVTFQpCiAJCQlyZXQgPSAtRUZBVUxUOwpAQCAtNjU5LDkgKzY4Niw3IEBACiAJICogVGhlcmUgaXMgbm8gd2FpdGVyLCBzbyB3ZSB1bmxvY2sgdGhlIGZ1dGV4LiBUaGUgb3duZXIgZGllZAogCSAqIGJpdCBoYXMgbm90IHRvIGJlIHByZXNlcnZlZCBoZXJlLiBXZSBhcmUgdGhlIG93bmVyOgogCSAqLwotCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0Jb2xkdmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIHV2YWwsIDApOwotCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwlvbGR2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgdXZhbCwgMCk7CiAKIAlpZiAob2xkdmFsID09IC1FRkFVTFQpCiAJCXJldHVybiBvbGR2YWw7CkBAIC03MDAsOCArNzI1LDcgQEAKIAl1bmlvbiBmdXRleF9rZXkga2V5OwogCWludCByZXQ7CiAKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAma2V5KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtNzI1LDggKzc0OSw3IEBACiAKIAlzcGluX3VubG9jaygmaGItPmxvY2spOwogb3V0OgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NDYsOCArNzY5LDcgQEAKIAlpbnQgcmV0LCBvcF9yZXQsIGF0dGVtcHQgPSAwOwogCiByZXRyeWZ1bGw6Ci0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZzaGFyZWQsICZrZXkxKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtNzkzLDcgKzgxNSw3IEBACiAJCSAqLwogCQlpZiAoYXR0ZW1wdCsrKSB7CiAJCQlyZXQgPSBmdXRleF9oYW5kbGVfZmF1bHQoKHVuc2lnbmVkIGxvbmcpdWFkZHIyLAotCQkJCQkJZnNoYXJlZCwgYXR0ZW1wdCk7CisJCQkJCQkgZnNoYXJlZCwgYXR0ZW1wdCk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gb3V0OwogCQkJZ290byByZXRyeTsKQEAgLTgwMyw4ICs4MjUsNyBAQAogCQkgKiBJZiB3ZSB3b3VsZCBoYXZlIGZhdWx0ZWQsIHJlbGVhc2UgbW1hcF9zZW0sCiAJCSAqIGZhdWx0IGl0IGluIGFuZCBzdGFydCBhbGwgb3ZlciBhZ2Fpbi4KIAkJICovCi0JCWlmIChmc2hhcmVkKQotCQkJdXBfcmVhZChmc2hhcmVkKTsKKwkJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJCXJldCA9IGdldF91c2VyKGR1bW15LCB1YWRkcjIpOwogCQlpZiAocmV0KQpAQCAtODQxLDggKzg2Miw4IEBACiAJaWYgKGhiMSAhPSBoYjIpCiAJCXNwaW5fdW5sb2NrKCZoYjItPmxvY2spOwogb3V0OgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg2MSw4ICs4ODIsNyBAQAogCWludCByZXQsIGRyb3BfY291bnQgPSAwOwogCiAgcmV0cnk6Ci0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZzaGFyZWQsICZrZXkxKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtODkwLDggKzkxMCw3IEBACiAJCQkgKiBJZiB3ZSB3b3VsZCBoYXZlIGZhdWx0ZWQsIHJlbGVhc2UgbW1hcF9zZW0sIGZhdWx0CiAJCQkgKiBpdCBpbiBhbmQgc3RhcnQgYWxsIG92ZXIgYWdhaW4uCiAJCQkgKi8KLQkJCWlmIChmc2hhcmVkKQotCQkJCXVwX3JlYWQoZnNoYXJlZCk7CisJCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAkJCXJldCA9IGdldF91c2VyKGN1cnZhbCwgdWFkZHIxKTsKIApAQCAtOTQ0LDggKzk2Myw3IEBACiAJCWRyb3BfZnV0ZXhfa2V5X3JlZnMoJmtleTEpOwogCiBvdXQ6Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMTMsMTAgKzExMzEsNyBAQAogCXdoaWxlICghcmV0KSB7CiAJCW5ld3ZhbCA9ICh1dmFsICYgRlVURVhfT1dORVJfRElFRCkgfCBuZXd0aWQ7CiAKLQkJcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQkJY3VydmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsCi0JCQkJCQkgICAgICAgdXZhbCwgbmV3dmFsKTsKLQkJcGFnZWZhdWx0X2VuYWJsZSgpOworCQljdXJ2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgdXZhbCwgbmV3dmFsKTsKIAogCQlpZiAoY3VydmFsID09IC1FRkFVTFQpCiAJCQlyZXQgPSAtRUZBVUxUOwpAQCAtMTEzNCw2ICsxMTQ5LDcgQEAKICNkZWZpbmUgQVJHM19TSEFSRUQgIDEKIAogc3RhdGljIGxvbmcgZnV0ZXhfd2FpdF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KTsKKwogc3RhdGljIGludCBmdXRleF93YWl0KHUzMiBfX3VzZXIgKnVhZGRyLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkLAogCQkgICAgICB1MzIgdmFsLCBrdGltZV90ICphYnNfdGltZSkKIHsKQEAgLTExNDgsOCArMTE2NCw3IEBACiAKIAlxLnBpX3N0YXRlID0gTlVMTDsKICByZXRyeToKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAmcS5rZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC0xMTg2LDggKzEyMDEsNyBAQAogCQkgKiBJZiB3ZSB3b3VsZCBoYXZlIGZhdWx0ZWQsIHJlbGVhc2UgbW1hcF9zZW0sIGZhdWx0IGl0IGluIGFuZAogCQkgKiBzdGFydCBhbGwgb3ZlciBhZ2Fpbi4KIAkJICovCi0JCWlmIChmc2hhcmVkKQotCQkJdXBfcmVhZChmc2hhcmVkKTsKKwkJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJCXJldCA9IGdldF91c2VyKHV2YWwsIHVhZGRyKTsKIApAQCAtMTIwNiw4ICsxMjIwLDcgQEAKIAkgKiBOb3cgdGhlIGZ1dGV4IGlzIHF1ZXVlZCBhbmQgd2UgaGF2ZSBjaGVja2VkIHRoZSBkYXRhLCB3ZQogCSAqIGRvbid0IHdhbnQgdG8gaG9sZCBtbWFwX3NlbSB3aGlsZSB3ZSBzbGVlcC4KIAkgKi8KLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAkvKgogCSAqIFRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBzY2hlZHVsaW5nIHNpbmNlIHRoZSBxdWV1ZV9tZSgpLCBhcyB3ZQpAQCAtMTI4NSw4ICsxMjk4LDcgQEAKIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKIAogIG91dF9yZWxlYXNlX3NlbToKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTMzMyw4ICsxMzQ1LDcgQEAKIAogCXEucGlfc3RhdGUgPSBOVUxMOwogIHJldHJ5OgotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTEzNTMsOSArMTM2NCw3IEBACiAJICovCiAJbmV3dmFsID0gY3VycmVudC0+cGlkOwogCi0JcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgMCwgbmV3dmFsKTsKLQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIDAsIG5ld3ZhbCk7CiAKIAlpZiAodW5saWtlbHkoY3VydmFsID09IC1FRkFVTFQpKQogCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7CkBAIC0xMzk4LDkgKzE0MDcsNyBAQAogCQlsb2NrX3Rha2VuID0gMTsKIAl9CiAKLQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwotCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwljdXJ2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgdXZhbCwgbmV3dmFsKTsKIAogCWlmICh1bmxpa2VseShjdXJ2YWwgPT0gLUVGQVVMVCkpCiAJCWdvdG8gdWFkZHJfZmF1bHRlZDsKQEAgLTE0MjgsOCArMTQzNSw3IEBACiAJCQkgKiBleGl0IHRvIGNvbXBsZXRlLgogCQkJICovCiAJCQlxdWV1ZV91bmxvY2soJnEsIGhiKTsKLQkJCWlmIChmc2hhcmVkKQotCQkJCXVwX3JlYWQoZnNoYXJlZCk7CisJCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAkJCWdvdG8gcmV0cnk7CiAKQEAgLTE0NjUsOCArMTQ3MSw3IEBACiAJICogTm93IHRoZSBmdXRleCBpcyBxdWV1ZWQgYW5kIHdlIGhhdmUgY2hlY2tlZCB0aGUgZGF0YSwgd2UKIAkgKiBkb24ndCB3YW50IHRvIGhvbGQgbW1hcF9zZW0gd2hpbGUgd2Ugc2xlZXAuCiAJICovCi0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJV0FSTl9PTighcS5waV9zdGF0ZSk7CiAJLyoKQEAgLTE0ODAsOCArMTQ4NSw3IEBACiAJCXJldCA9IHJldCA/IDAgOiAtRVdPVUxEQkxPQ0s7CiAJfQogCi0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCXNwaW5fbG9jayhxLmxvY2tfcHRyKTsKIAogCWlmICghcmV0KSB7CkBAIC0xNTE4LDggKzE1MjIsNyBAQAogCiAJLyogVW5xdWV1ZSBhbmQgZHJvcCB0aGUgbG9jayAqLwogCXVucXVldWVfbWVfcGkoJnEpOwotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCXJldHVybiByZXQgIT0gLUVJTlRSID8gcmV0IDogLUVSRVNUQVJUTk9JTlRSOwogCkBAIC0xNTI3LDggKzE1MzAsNyBAQAogCXF1ZXVlX3VubG9jaygmcSwgaGIpOwogCiAgb3V0X3JlbGVhc2Vfc2VtOgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAlyZXR1cm4gcmV0OwogCiAgdWFkZHJfZmF1bHRlZDoKQEAgLTE1NTAsOCArMTU1Miw3IEBACiAJCWdvdG8gcmV0cnlfdW5sb2NrZWQ7CiAJfQogCi0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwogCWlmICghcmV0ICYmICh1dmFsICE9IC1FRkFVTFQpKQpAQCAtMTU4NSw4ICsxNTg2LDcgQEAKIAkvKgogCSAqIEZpcnN0IHRha2UgYWxsIHRoZSBmdXRleCByZWxhdGVkIGxvY2tzOgogCSAqLwotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZrZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC0xNjAxLDExICsxNjAxLDkgQEAKIAkgKiBhZ2Fpbi4gSWYgaXQgc3VjY2VlZHMgdGhlbiB3ZSBjYW4gcmV0dXJuIHdpdGhvdXQgd2FraW5nCiAJICogYW55b25lIGVsc2UgdXA6CiAJICovCi0JaWYgKCEodXZhbCAmIEZVVEVYX09XTkVSX0RJRUQpKSB7Ci0JCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JCXV2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgY3VycmVudC0+cGlkLCAwKTsKLQkJcGFnZWZhdWx0X2VuYWJsZSgpOwotCX0KKwlpZiAoISh1dmFsICYgRlVURVhfT1dORVJfRElFRCkpCisJCXV2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgY3VycmVudC0+cGlkLCAwKTsKKwogCiAJaWYgKHVubGlrZWx5KHV2YWwgPT0gLUVGQVVMVCkpCiAJCWdvdG8gcGlfZmF1bHRlZDsKQEAgLTE2NDcsOCArMTY0NSw3IEBACiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZoYi0+bG9jayk7CiBvdXQ6Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0dXJuIHJldDsKIApAQCAtMTY3MSw4ICsxNjY4LDcgQEAKIAkJZ290byByZXRyeV91bmxvY2tlZDsKIAl9CiAKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfdXNlcih1dmFsLCB1YWRkcik7CiAJaWYgKCFyZXQgJiYgKHV2YWwgIT0gLUVGQVVMVCkpCkBAIC0xNzI5LDggKzE3MjUsOCBAQAogCiAJaWYgKHByaW50a190aW1lZF9yYXRlbGltaXQoJnByaW50a19pbnRlcnZhbCwgNjAgKiA2MCAqIDEwMDApKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlByb2Nlc3MgYCVzJyB1c2VkIEZVVEVYX0ZELCB3aGljaCAiCi0JCSAgICAJIndpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwgaW4gSnVuZSAyMDA3XG4iLAotCQkJY3VycmVudC0+Y29tbSk7CisJCSAgICAgICAid2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCBpbiBKdW5lIDIwMDdcbiIsCisJCSAgICAgICBjdXJyZW50LT5jb21tKTsKIAl9CiAKIAlyZXQgPSAtRUlOVkFMOwpAQCAtMTkwOCwxMCArMTkwNCw4IEBACiAJCSAqIFdha2Ugcm9idXN0IG5vbi1QSSBmdXRleGVzIGhlcmUuIFRoZSB3YWtldXAgb2YKIAkJICogUEkgZnV0ZXhlcyBoYXBwZW5zIGluIGV4aXRfcGlfc3RhdGUoKToKIAkJICovCi0JCWlmICghcGkpIHsKLQkJCWlmICh1dmFsICYgRlVURVhfV0FJVEVSUykKKwkJaWYgKCFwaSAmJiAodXZhbCAmIEZVVEVYX1dBSVRFUlMpKQogCQkJCWZ1dGV4X3dha2UodWFkZHIsICZjdXJyLT5tbS0+bW1hcF9zZW0sIDEpOwotCQl9CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2hydGltZXIuYyBiL2tlcm5lbC9ocnRpbWVyLmMKaW5kZXggMjNjMDNmNC4uNzJkMDM0MiAxMDA2NDQKLS0tIGEva2VybmVsL2hydGltZXIuYworKysgYi9rZXJuZWwvaHJ0aW1lci5jCkBAIC0xNDA2LDcgKzE0MDYsNyBAQAogc3RhdGljIGludCBfX2NwdWluaXQgaHJ0aW1lcl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKIAkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7Ci0JbG9uZyBjcHUgPSAobG9uZyloY3B1OworCXVuc2lnbmVkIGludCBjcHUgPSAobG9uZyloY3B1OwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9zcHVyaW91cy5jIGIva2VybmVsL2lycS9zcHVyaW91cy5jCmluZGV4IGJkOWUyNzIuLjMyYjE2MTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYworKysgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKQEAgLTE3Miw3ICsxNzIsMTcgQEAKIAkJICAgIGlycXJldHVybl90IGFjdGlvbl9yZXQpCiB7CiAJaWYgKHVubGlrZWx5KGFjdGlvbl9yZXQgIT0gSVJRX0hBTkRMRUQpKSB7Ci0JCWRlc2MtPmlycXNfdW5oYW5kbGVkKys7CisJCS8qCisJCSAqIElmIHdlIGFyZSBzZWVpbmcgb25seSB0aGUgb2RkIHNwdXJpb3VzIElSUSBjYXVzZWQgYnkKKwkJICogYnVzIGFzeW5jaHJvbmljaXR5IHRoZW4gZG9uJ3QgZXZlbnR1YWxseSB0cmlnZ2VyIGFuIGVycm9yLAorCQkgKiBvdGhlcndpc2UgdGhlIGNvdXRlciBiZWNvbWVzIGEgZG9vbXNkYXkgdGltZXIgZm9yIG90aGVyd2lzZQorCQkgKiB3b3JraW5nIHN5c3RlbXMKKwkJICovCisJCWlmIChqaWZmaWVzIC0gZGVzYy0+bGFzdF91bmhhbmRsZWQgPiBIWi8xMCkKKwkJCWRlc2MtPmlycXNfdW5oYW5kbGVkID0gMTsKKwkJZWxzZQorCQkJZGVzYy0+aXJxc191bmhhbmRsZWQrKzsKKwkJZGVzYy0+bGFzdF91bmhhbmRsZWQgPSBqaWZmaWVzOwogCQlpZiAodW5saWtlbHkoYWN0aW9uX3JldCAhPSBJUlFfTk9ORSkpCiAJCQlyZXBvcnRfYmFkX2lycShpcnEsIGRlc2MsIGFjdGlvbl9yZXQpOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9rYWxsc3ltcy5jIGIva2VybmVsL2thbGxzeW1zLmMKaW5kZXggZmVkNTQ0MS4uNDc0MjE5YSAxMDA2NDQKLS0tIGEva2VybmVsL2thbGxzeW1zLmMKKysrIGIva2VybmVsL2thbGxzeW1zLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogLyogTG9va3VwIHRoZSBhZGRyZXNzIGZvciB0aGlzIHN5bWJvbC4gUmV0dXJucyAwIGlmIG5vdCBmb3VuZC4gKi8KIHVuc2lnbmVkIGxvbmcga2FsbHN5bXNfbG9va3VwX25hbWUoY29uc3QgY2hhciAqbmFtZSkKIHsKLQljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTl07CiAJdW5zaWduZWQgbG9uZyBpOwogCXVuc2lnbmVkIGludCBvZmY7CiAKQEAgLTI0OCw3ICsyNDgsNyBAQAogewogCWNvbnN0IGNoYXIgKm1zeW07CiAKLQluYW1lYnVmW0tTWU1fTkFNRV9MRU5dID0gMDsKKwluYW1lYnVmW0tTWU1fTkFNRV9MRU4gLSAxXSA9IDA7CiAJbmFtZWJ1ZlswXSA9IDA7CiAKIAlpZiAoaXNfa3N5bV9hZGRyKGFkZHIpKSB7CkBAIC0yNjUsNyArMjY1LDcgQEAKIAkvKiBzZWUgaWYgaXQncyBpbiBhIG1vZHVsZSAqLwogCW1zeW0gPSBtb2R1bGVfYWRkcmVzc19sb29rdXAoYWRkciwgc3ltYm9sc2l6ZSwgb2Zmc2V0LCBtb2RuYW1lKTsKIAlpZiAobXN5bSkKLQkJcmV0dXJuIHN0cm5jcHkobmFtZWJ1ZiwgbXN5bSwgS1NZTV9OQU1FX0xFTik7CisJCXJldHVybiBzdHJuY3B5KG5hbWVidWYsIG1zeW0sIEtTWU1fTkFNRV9MRU4gLSAxKTsKIAogCXJldHVybiBOVUxMOwogfQpAQCAtMjczLDcgKzI3Myw3IEBACiBpbnQgbG9va3VwX3N5bWJvbF9uYW1lKHVuc2lnbmVkIGxvbmcgYWRkciwgY2hhciAqc3ltbmFtZSkKIHsKIAlzeW1uYW1lWzBdID0gJ1wwJzsKLQlzeW1uYW1lW0tTWU1fTkFNRV9MRU5dID0gJ1wwJzsKKwlzeW1uYW1lW0tTWU1fTkFNRV9MRU4gLSAxXSA9ICdcMCc7CiAKIAlpZiAoaXNfa3N5bV9hZGRyKGFkZHIpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcG9zOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCQl1bnNpZ25lZCBsb25nICpvZmZzZXQsIGNoYXIgKm1vZG5hbWUsIGNoYXIgKm5hbWUpCiB7CiAJbmFtZVswXSA9ICdcMCc7Ci0JbmFtZVtLU1lNX05BTUVfTEVOXSA9ICdcMCc7CisJbmFtZVtLU1lNX05BTUVfTEVOIC0gMV0gPSAnXDAnOwogCiAJaWYgKGlzX2tzeW1fYWRkcihhZGRyKSkgewogCQl1bnNpZ25lZCBsb25nIHBvczsKQEAgLTMxMiwxOCArMzEyLDE3IEBACiAJY2hhciAqbW9kbmFtZTsKIAljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplOwotCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOXTsKIAogCW5hbWUgPSBrYWxsc3ltc19sb29rdXAoYWRkcmVzcywgJnNpemUsICZvZmZzZXQsICZtb2RuYW1lLCBuYW1lYnVmKTsKIAlpZiAoIW5hbWUpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIjB4JWx4IiwgYWRkcmVzcyk7Ci0JZWxzZSB7Ci0JCWlmIChtb2RuYW1lKQotCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IFslc10iLCBuYW1lLCBvZmZzZXQsCisKKwlpZiAobW9kbmFtZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IFslc10iLCBuYW1lLCBvZmZzZXQsCiAJCQkJc2l6ZSwgbW9kbmFtZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzKyUjbHgvJSNseCIsIG5hbWUsIG9mZnNldCwgc2l6ZSk7Ci0JfQorCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IiwgbmFtZSwgb2Zmc2V0LCBzaXplKTsKIH0KIAogLyogTG9vayB1cCBhIGtlcm5lbCBzeW1ib2wgYW5kIHByaW50IGl0IHRvIHRoZSBrZXJuZWwgbWVzc2FnZXMuICovCkBAIC0zNDMsOCArMzQyLDggQEAKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCXVuc2lnbmVkIGludCBuYW1lb2ZmOyAvKiBJZiBpdGVyYXRpbmcgaW4gY29yZSBrZXJuZWwgc3ltYm9scyAqLwogCWNoYXIgdHlwZTsKLQljaGFyIG5hbWVbS1NZTV9OQU1FX0xFTisxXTsKLQljaGFyIG1vZHVsZV9uYW1lW01PRFVMRV9OQU1FX0xFTiArIDFdOworCWNoYXIgbmFtZVtLU1lNX05BTUVfTEVOXTsKKwljaGFyIG1vZHVsZV9uYW1lW01PRFVMRV9OQU1FX0xFTl07CiAJaW50IGV4cG9ydGVkOwogfTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2tmaWZvLmMgYi9rZXJuZWwva2ZpZm8uYwppbmRleCBjZWU0MTkxLi5iYzQxYWQwIDEwMDY0NAotLS0gYS9rZXJuZWwva2ZpZm8uYworKysgYi9rZXJuZWwva2ZpZm8uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogLyoqCiAgKiBrZmlmb19pbml0IC0gYWxsb2NhdGVzIGEgbmV3IEZJRk8gdXNpbmcgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyCkBAIC00MSw3ICs0Miw3IEBACiAJc3RydWN0IGtmaWZvICpmaWZvOwogCiAJLyogc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLwotCUJVR19PTihzaXplICYgKHNpemUgLSAxKSk7CisJQlVHX09OKCFpc19wb3dlcl9vZl8yKHNpemUpKTsKIAogCWZpZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2ZpZm8pLCBnZnBfbWFzayk7CiAJaWYgKCFmaWZvKQpkaWZmIC0tZ2l0IGEva2VybmVsL2t0aHJlYWQuYyBiL2tlcm5lbC9rdGhyZWFkLmMKaW5kZXggYmJkNTFiOC4uYTQwNGY3ZSAxMDA2NDQKLS0tIGEva2VybmVsL2t0aHJlYWQuYworKysgYi9rZXJuZWwva3RocmVhZC5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIEVYUE9SVF9TWU1CT0woa3RocmVhZF9zdG9wKTsKIAogCi1zdGF0aWMgX19pbml0IHZvaWQga3RocmVhZGRfc2V0dXAodm9pZCkKK3N0YXRpYyBub2lubGluZSBfX2luaXRfcmVmb2sgdm9pZCBrdGhyZWFkZF9zZXR1cCh2b2lkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggMWE1ZmYyMi4uZWRiYTJmZiAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC0zNzksNyArMzc5LDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfbG9ja19uYW1lKHN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcykKIHsKLQljaGFyIHN0cltLU1lNX05BTUVfTEVOICsgMV0sIGMxLCBjMiwgYzMsIGM0OworCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU5dLCBjMSwgYzIsIGMzLCBjNDsKIAljb25zdCBjaGFyICpuYW1lOwogCiAJZ2V0X3VzYWdlX2NoYXJzKGNsYXNzLCAmYzEsICZjMiwgJmMzLCAmYzQpOwpAQCAtNDAxLDcgKzQwMSw3IEBACiBzdGF0aWMgdm9pZCBwcmludF9sb2NrZGVwX2NhY2hlKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaykKIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU4gKyAxXTsKKwljaGFyIHN0cltLU1lNX05BTUVfTEVOXTsKIAogCW5hbWUgPSBsb2NrLT5uYW1lOwogCWlmICghbmFtZSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCAwMTVkNjBjLi4zM2MwNGFkIDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC02MSwxMCArNjEsOCBAQAogLyogSWYgdGhpcyBpcyBzZXQsIHRoZSBzZWN0aW9uIGJlbG9uZ3MgaW4gdGhlIGluaXQgcGFydCBvZiB0aGUgbW9kdWxlICovCiAjZGVmaW5lIElOSVRfT0ZGU0VUX01BU0sgKDFVTCA8PCAoQklUU19QRVJfTE9ORy0xKSkKIAotLyogUHJvdGVjdHMgbW9kdWxlIGxpc3QgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobW9kbGlzdF9sb2NrKTsKLQotLyogTGlzdCBvZiBtb2R1bGVzLCBwcm90ZWN0ZWQgYnkgbW9kdWxlX211dGV4IEFORCBtb2RsaXN0X2xvY2sgKi8KKy8qIExpc3Qgb2YgbW9kdWxlcywgcHJvdGVjdGVkIGJ5IG1vZHVsZV9tdXRleCBvciBwcmVlbXB0X2Rpc2FibGUKKyAqIChhZGQvZGVsZXRlIHVzZXMgc3RvcF9tYWNoaW5lKS4gKi8KIHN0YXRpYyBERUZJTkVfTVVURVgobW9kdWxlX211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQobW9kdWxlcyk7CiAKQEAgLTc2MCwxNCArNzU4LDEzIEBACiB2b2lkIF9fc3ltYm9sX3B1dChjb25zdCBjaGFyICpzeW1ib2wpCiB7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAljb25zdCB1bnNpZ25lZCBsb25nICpjcmM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJaWYgKCFfX2ZpbmRfc3ltYm9sKHN5bWJvbCwgJm93bmVyLCAmY3JjLCAxKSkKIAkJQlVHKCk7CiAJbW9kdWxlX3B1dChvd25lcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIH0KIEVYUE9SVF9TWU1CT0woX19zeW1ib2xfcHV0KTsKIApAQCAtMTIyOCwxNCArMTIyNSwxNCBAQAogdm9pZCAqX19zeW1ib2xfZ2V0KGNvbnN0IGNoYXIgKnN5bWJvbCkKIHsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQl1bnNpZ25lZCBsb25nIHZhbHVlLCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmNyYzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAl2YWx1ZSA9IF9fZmluZF9zeW1ib2woc3ltYm9sLCAmb3duZXIsICZjcmMsIDEpOwogCWlmICh2YWx1ZSAmJiAhc3Ryb25nX3RyeV9tb2R1bGVfZ2V0KG93bmVyKSkKIAkJdmFsdWUgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7CiAKIAlyZXR1cm4gKHZvaWQgKil2YWx1ZTsKIH0KQEAgLTIxMzYsNyArMjEzMyw3IEBACiAJCQlzeW0gPSBnZXRfa3N5bWJvbChtb2QsIGFkZHIsIE5VTEwsIE5VTEwpOwogCQkJaWYgKCFzeW0pCiAJCQkJZ290byBvdXQ7Ci0JCQlzdHJsY3B5KHN5bW5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTiArIDEpOworCQkJc3RybGNweShzeW1uYW1lLCBzeW0sIEtTWU1fTkFNRV9MRU4pOwogCQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIxNjEsOSArMjE1OCw5IEBACiAJCQlpZiAoIXN5bSkKIAkJCQlnb3RvIG91dDsKIAkJCWlmIChtb2RuYW1lKQotCQkJCXN0cmxjcHkobW9kbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4gKyAxKTsKKwkJCQlzdHJsY3B5KG1vZG5hbWUsIG1vZC0+bmFtZSwgTU9EVUxFX05BTUVfTEVOKTsKIAkJCWlmIChuYW1lKQotCQkJCXN0cmxjcHkobmFtZSwgc3ltLCBLU1lNX05BTUVfTEVOICsgMSk7CisJCQkJc3RybGNweShuYW1lLCBzeW0sIEtTWU1fTkFNRV9MRU4pOwogCQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIxODQsOCArMjE4MSw4IEBACiAJCQkqdmFsdWUgPSBtb2QtPnN5bXRhYltzeW1udW1dLnN0X3ZhbHVlOwogCQkJKnR5cGUgPSBtb2QtPnN5bXRhYltzeW1udW1dLnN0X2luZm87CiAJCQlzdHJsY3B5KG5hbWUsIG1vZC0+c3RydGFiICsgbW9kLT5zeW10YWJbc3ltbnVtXS5zdF9uYW1lLAotCQkJCUtTWU1fTkFNRV9MRU4gKyAxKTsKLQkJCXN0cmxjcHkobW9kdWxlX25hbWUsIG1vZC0+bmFtZSwgTU9EVUxFX05BTUVfTEVOICsgMSk7CisJCQkJS1NZTV9OQU1FX0xFTik7CisJCQlzdHJsY3B5KG1vZHVsZV9uYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7CiAJCQkqZXhwb3J0ZWQgPSBpc19leHBvcnRlZChuYW1lLCBtb2QpOwogCQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCQkJcmV0dXJuIDA7CkBAIC0yMjMyLDI2ICsyMjI5LDEzIEBACiAvKiBDYWxsZWQgYnkgdGhlIC9wcm9jIGZpbGUgc3lzdGVtIHRvIHJldHVybiBhIGxpc3Qgb2YgbW9kdWxlcy4gKi8KIHN0YXRpYyB2b2lkICptX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaTsKLQlsb2ZmX3QgbiA9IDA7Ci0KIAltdXRleF9sb2NrKCZtb2R1bGVfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2goaSwgJm1vZHVsZXMpIHsKLQkJaWYgKG4rKyA9PSAqcG9zKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09ICZtb2R1bGVzKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gaTsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJm1vZHVsZXMsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaSA9IHA7Ci0JKCpwb3MpKys7Ci0JaWYgKGktPm5leHQgPT0gJm1vZHVsZXMpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBpLT5uZXh0OworCXJldHVybiBzZXFfbGlzdF9uZXh0KHAsICZtb2R1bGVzLCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBtX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQpAQCAtMjMyMSwxMSArMjMwNSwxMCBAQAogLyogR2l2ZW4gYW4gYWRkcmVzcywgbG9vayBmb3IgaXQgaW4gdGhlIG1vZHVsZSBleGNlcHRpb24gdGFibGVzLiAqLwogY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqc2VhcmNoX21vZHVsZV9leHRhYmxlcyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICplID0gTlVMTDsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2QsICZtb2R1bGVzLCBsaXN0KSB7CiAJCWlmIChtb2QtPm51bV9leGVudHJpZXMgPT0gMCkKIAkJCWNvbnRpbnVlOwpAQCAtMjMzNiw3ICsyMzE5LDcgQEAKIAkJaWYgKGUpCiAJCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCS8qIE5vdywgaWYgd2UgZm91bmQgb25lLCB3ZSBhcmUgcnVubmluZyBpbnNpZGUgaXQgbm93LCBoZW5jZQogICAgICAgICAgICB3ZSBjYW5ub3QgdW5sb2FkIHRoZSBtb2R1bGUsIGhlbmNlIG5vIHJlZmNudCBuZWVkZWQuICovCkBAIC0yMzQ4LDI1ICsyMzMxLDI0IEBACiAgKi8KIGludCBpc19tb2R1bGVfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKIAkJaWYgKHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCXJldHVybiAwOwogfQogCiAKLS8qIElzIHRoaXMgYSB2YWxpZCBrZXJuZWwgYWRkcmVzcz8gIFdlIGRvbid0IGdyYWIgdGhlIGxvY2s6IHdlIGFyZSBvb3BzaW5nLiAqLworLyogSXMgdGhpcyBhIHZhbGlkIGtlcm5lbCBhZGRyZXNzPyAqLwogc3RydWN0IG1vZHVsZSAqX19tb2R1bGVfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CkBAIC0yMzgxLDExICsyMzYzLDEwIEBACiBzdHJ1Y3QgbW9kdWxlICptb2R1bGVfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAltb2QgPSBfX21vZHVsZV90ZXh0X2FkZHJlc3MoYWRkcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCXJldHVybiBtb2Q7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvbnNwcm94eS5jIGIva2VybmVsL25zcHJveHkuYwppbmRleCA5ZTgzYjU4Li4xMGYwYmJiIDEwMDY0NAotLS0gYS9rZXJuZWwvbnNwcm94eS5jCisrKyBiL2tlcm5lbC9uc3Byb3h5LmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgogCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm5zcHJveHlfY2FjaGVwOworCiBzdHJ1Y3QgbnNwcm94eSBpbml0X25zcHJveHkgPSBJTklUX05TUFJPWFkoaW5pdF9uc3Byb3h5KTsKIAogc3RhdGljIGlubGluZSB2b2lkIGdldF9uc3Byb3h5KHN0cnVjdCBuc3Byb3h5ICpucykKQEAgLTQzLDkgKzQ1LDExIEBACiB7CiAJc3RydWN0IG5zcHJveHkgKm5zOwogCi0JbnMgPSBrbWVtZHVwKG9yaWcsIHNpemVvZihzdHJ1Y3QgbnNwcm94eSksIEdGUF9LRVJORUwpOwotCWlmIChucykKKwlucyA9IGttZW1fY2FjaGVfYWxsb2MobnNwcm94eV9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmIChucykgeworCQltZW1jcHkobnMsIG9yaWcsIHNpemVvZihzdHJ1Y3QgbnNwcm94eSkpOwogCQlhdG9taWNfc2V0KCZucy0+Y291bnQsIDEpOworCX0KIAlyZXR1cm4gbnM7CiB9CiAKQEAgLTU0LDMzICs1OCw1MSBAQAogICogUmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG5zcHJveHkuICBEbyBub3QgYXR0YWNoIHRoaXMgdG8gdGhlIHRhc2ssCiAgKiBsZWF2ZSBpdCB0byB0aGUgY2FsbGVyIHRvIGRvIHByb3BlciBsb2NraW5nIGFuZCBhdHRhY2ggaXQgdG8gdGFzay4KICAqLwotc3RhdGljIHN0cnVjdCBuc3Byb3h5ICpjcmVhdGVfbmV3X25hbWVzcGFjZXMoaW50IGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJCXN0cnVjdCBmc19zdHJ1Y3QgKm5ld19mcykKK3N0YXRpYyBzdHJ1Y3QgbnNwcm94eSAqY3JlYXRlX25ld19uYW1lc3BhY2VzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKQogewogCXN0cnVjdCBuc3Byb3h5ICpuZXdfbnNwOworCWludCBlcnI7CiAKIAluZXdfbnNwID0gY2xvbmVfbnNwcm94eSh0c2stPm5zcHJveHkpOwogCWlmICghbmV3X25zcCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAluZXdfbnNwLT5tbnRfbnMgPSBjb3B5X21udF9ucyhmbGFncywgdHNrLT5uc3Byb3h5LT5tbnRfbnMsIG5ld19mcyk7Ci0JaWYgKElTX0VSUihuZXdfbnNwLT5tbnRfbnMpKQorCWlmIChJU19FUlIobmV3X25zcC0+bW50X25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPm1udF9ucyk7CiAJCWdvdG8gb3V0X25zOworCX0KIAogCW5ld19uc3AtPnV0c19ucyA9IGNvcHlfdXRzbmFtZShmbGFncywgdHNrLT5uc3Byb3h5LT51dHNfbnMpOwotCWlmIChJU19FUlIobmV3X25zcC0+dXRzX25zKSkKKwlpZiAoSVNfRVJSKG5ld19uc3AtPnV0c19ucykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXdfbnNwLT51dHNfbnMpOwogCQlnb3RvIG91dF91dHM7CisJfQogCiAJbmV3X25zcC0+aXBjX25zID0gY29weV9pcGNzKGZsYWdzLCB0c2stPm5zcHJveHktPmlwY19ucyk7Ci0JaWYgKElTX0VSUihuZXdfbnNwLT5pcGNfbnMpKQorCWlmIChJU19FUlIobmV3X25zcC0+aXBjX25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPmlwY19ucyk7CiAJCWdvdG8gb3V0X2lwYzsKKwl9CiAKIAluZXdfbnNwLT5waWRfbnMgPSBjb3B5X3BpZF9ucyhmbGFncywgdHNrLT5uc3Byb3h5LT5waWRfbnMpOwotCWlmIChJU19FUlIobmV3X25zcC0+cGlkX25zKSkKKwlpZiAoSVNfRVJSKG5ld19uc3AtPnBpZF9ucykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXdfbnNwLT5waWRfbnMpOwogCQlnb3RvIG91dF9waWQ7CisJfQorCisJbmV3X25zcC0+dXNlcl9ucyA9IGNvcHlfdXNlcl9ucyhmbGFncywgdHNrLT5uc3Byb3h5LT51c2VyX25zKTsKKwlpZiAoSVNfRVJSKG5ld19uc3AtPnVzZXJfbnMpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X25zcC0+dXNlcl9ucyk7CisJCWdvdG8gb3V0X3VzZXI7CisJfQogCiAJcmV0dXJuIG5ld19uc3A7CiAKK291dF91c2VyOgorCWlmIChuZXdfbnNwLT5waWRfbnMpCisJCXB1dF9waWRfbnMobmV3X25zcC0+cGlkX25zKTsKIG91dF9waWQ6CiAJaWYgKG5ld19uc3AtPmlwY19ucykKIAkJcHV0X2lwY19ucyhuZXdfbnNwLT5pcGNfbnMpOwpAQCAtOTEsMTUgKzExMywxNSBAQAogCWlmIChuZXdfbnNwLT5tbnRfbnMpCiAJCXB1dF9tbnRfbnMobmV3X25zcC0+bW50X25zKTsKIG91dF9uczoKLQlrZnJlZShuZXdfbnNwKTsKLQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlrbWVtX2NhY2hlX2ZyZWUobnNwcm94eV9jYWNoZXAsIG5ld19uc3ApOworCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIC8qCiAgKiBjYWxsZWQgZnJvbSBjbG9uZS4gIFRoaXMgbm93IGhhbmRsZXMgY29weSBmb3IgbnNwcm94eSBhbmQgYWxsCiAgKiBuYW1lc3BhY2VzIHRoZXJlaW4uCiAgKi8KLWludCBjb3B5X25hbWVzcGFjZXMoaW50IGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK2ludCBjb3B5X25hbWVzcGFjZXModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IG5zcHJveHkgKm9sZF9ucyA9IHRzay0+bnNwcm94eTsKIAlzdHJ1Y3QgbnNwcm94eSAqbmV3X25zOwpAQCAtMTEwLDcgKzEzMiw3IEBACiAKIAlnZXRfbnNwcm94eShvbGRfbnMpOwogCi0JaWYgKCEoZmxhZ3MgJiAoQ0xPTkVfTkVXTlMgfCBDTE9ORV9ORVdVVFMgfCBDTE9ORV9ORVdJUEMpKSkKKwlpZiAoIShmbGFncyAmIChDTE9ORV9ORVdOUyB8IENMT05FX05FV1VUUyB8IENMT05FX05FV0lQQyB8IENMT05FX05FV1VTRVIpKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKQEAgLTE0MCw3ICsxNjIsOSBAQAogCQlwdXRfaXBjX25zKG5zLT5pcGNfbnMpOwogCWlmIChucy0+cGlkX25zKQogCQlwdXRfcGlkX25zKG5zLT5waWRfbnMpOwotCWtmcmVlKG5zKTsKKwlpZiAobnMtPnVzZXJfbnMpCisJCXB1dF91c2VyX25zKG5zLT51c2VyX25zKTsKKwlrbWVtX2NhY2hlX2ZyZWUobnNwcm94eV9jYWNoZXAsIG5zKTsKIH0KIAogLyoKQEAgLTE1MiwxOSArMTc2LDEwIEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoISh1bnNoYXJlX2ZsYWdzICYgKENMT05FX05FV05TIHwgQ0xPTkVfTkVXVVRTIHwgQ0xPTkVfTkVXSVBDKSkpCisJaWYgKCEodW5zaGFyZV9mbGFncyAmIChDTE9ORV9ORVdOUyB8IENMT05FX05FV1VUUyB8IENMT05FX05FV0lQQyB8CisJCQkgICAgICAgQ0xPTkVfTkVXVVNFUikpKQogCQlyZXR1cm4gMDsKIAotI2lmbmRlZiBDT05GSUdfSVBDX05TCi0JaWYgKHVuc2hhcmVfZmxhZ3MgJiBDTE9ORV9ORVdJUEMpCi0JCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX1VUU19OUwotCWlmICh1bnNoYXJlX2ZsYWdzICYgQ0xPTkVfTkVXVVRTKQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCkBAIC0xNzQsMyArMTg5LDEyIEBACiAJCWVyciA9IFBUUl9FUlIoKm5ld19uc3ApOwogCXJldHVybiBlcnI7CiB9CisKK3N0YXRpYyBpbnQgX19pbml0IG5zcHJveHlfY2FjaGVfaW5pdCh2b2lkKQoreworCW5zcHJveHlfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5zcHJveHkiLCBzaXplb2Yoc3RydWN0IG5zcHJveHkpLAorCQkJCQkgICAwLCBTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQobnNwcm94eV9jYWNoZV9pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wYW5pYy5jIGIva2VybmVsL3BhbmljLmMKaW5kZXggNjIzZDE4Mi4uZjY0ZjRjMSAxMDA2NDQKLS0tIGEva2VybmVsL3BhbmljLmMKKysrIGIva2VybmVsL3BhbmljLmMKQEAgLTE1OSwxNCArMTU5LDE1IEBACiB7CiAJc3RhdGljIGNoYXIgYnVmWzIwXTsKIAlpZiAodGFpbnRlZCkgewotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiVGFpbnRlZDogJWMlYyVjJWMlYyVjJWMiLAorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiVGFpbnRlZDogJWMlYyVjJWMlYyVjJWMlYyIsCiAJCQl0YWludGVkICYgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFID8gJ1AnIDogJ0cnLAogCQkJdGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUgPyAnRicgOiAnICcsCiAJCQl0YWludGVkICYgVEFJTlRfVU5TQUZFX1NNUCA/ICdTJyA6ICcgJywKIAkJCXRhaW50ZWQgJiBUQUlOVF9GT1JDRURfUk1NT0QgPyAnUicgOiAnICcsCiAgCQkJdGFpbnRlZCAmIFRBSU5UX01BQ0hJTkVfQ0hFQ0sgPyAnTScgOiAnICcsCiAJCQl0YWludGVkICYgVEFJTlRfQkFEX1BBR0UgPyAnQicgOiAnICcsCi0JCQl0YWludGVkICYgVEFJTlRfVVNFUiA/ICdVJyA6ICcgJyk7CisJCQl0YWludGVkICYgVEFJTlRfVVNFUiA/ICdVJyA6ICcgJywKKwkJCXRhaW50ZWQgJiBUQUlOVF9ESUUgPyAnRCcgOiAnICcpOwogCX0KIAllbHNlCiAJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJOb3QgdGFpbnRlZCIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BpZC5jIGIva2VybmVsL3BpZC5jCmluZGV4IGViNjZiZDIuLmM2ZTNmOWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9waWQuYworKysgYi9rZXJuZWwvcGlkLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZmluZF9nZXRfcGlkKTsKIAotc3RydWN0IHBpZF9uYW1lc3BhY2UgKmNvcHlfcGlkX25zKGludCBmbGFncywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm9sZF9ucykKK3N0cnVjdCBwaWRfbmFtZXNwYWNlICpjb3B5X3BpZF9ucyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqb2xkX25zKQogewogCUJVR19PTighb2xkX25zKTsKIAlnZXRfcGlkX25zKG9sZF9ucyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggMGJiZGVhYy4uMDUxZDI3ZSAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtNDQ5LDEzICs0NDksMTYgQEAKICNlbHNlCiBzdGF0aWMgaW50IHByaW50a190aW1lID0gMDsKICNlbmRpZgotbW9kdWxlX3BhcmFtKHByaW50a190aW1lLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0aW1lLCBwcmludGtfdGltZSwgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwogCiBzdGF0aWMgaW50IF9faW5pdCBwcmludGtfdGltZV9zZXR1cChjaGFyICpzdHIpCiB7CiAJaWYgKCpzdHIpCiAJCXJldHVybiAwOwogCXByaW50a190aW1lID0gMTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlRoZSAndGltZScgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kICIKKwkJImlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbiBlYXJseSAyMDA4XG4iKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlVzZSAncHJpbnRrLnRpbWU9PHZhbHVlPicgaW5zdGVhZFxuIik7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTQ4Myw2ICs0ODYsOSBAQAogICogQGZtdDogZm9ybWF0IHN0cmluZwogICoKICAqIFRoaXMgaXMgcHJpbnRrKCkuICBJdCBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuICBXZSB3YW50IGl0IHRvIHdvcmsuCisgKiBCZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0IGlmIG9vcHNfaW5fcHJvZ3Jlc3MgaXMgbm90IHNldCwgd2UgbWlnaHQgdHJ5IHRvCisgKiB3YWtlIGtsb2dkIHVwIHdoaWNoIGNvdWxkIGRlYWRsb2NrIG9uIHJ1bnF1ZXVlIGxvY2sgaWYgcHJpbnRrKCkgaXMgY2FsbGVkCisgKiBmcm9tIHNjaGVkdWxlciBjb2RlLgogICoKICAqIFdlIHRyeSB0byBncmFiIHRoZSBjb25zb2xlX3NlbS4gIElmIHdlIHN1Y2NlZWQsIGl0J3MgZWFzeSAtIHdlIGxvZyB0aGUgb3V0cHV0IGFuZAogICogY2FsbCB0aGUgY29uc29sZSBkcml2ZXJzLiAgSWYgd2UgZmFpbCB0byBnZXQgdGhlIHNlbWFwaG9yZSB3ZSBwbGFjZSB0aGUgb3V0cHV0CkBAIC02NTQsNyArNjYwLDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgY29uc29sZV9zZXR1cChjaGFyICpzdHIpCiB7Ci0JY2hhciBuYW1lW3NpemVvZihjb25zb2xlX2NtZGxpbmVbMF0ubmFtZSldOworCWNoYXIgYnVmW3NpemVvZihjb25zb2xlX2NtZGxpbmVbMF0ubmFtZSkgKyA0XTsgLyogNCBmb3IgaW5kZXggKi8KIAljaGFyICpzLCAqb3B0aW9uczsKIAlpbnQgaWR4OwogCkBAIC02NjIsMjcgKzY2OCwyNyBAQAogCSAqIERlY29kZSBzdHIgaW50byBuYW1lLCBpbmRleCwgb3B0aW9ucy4KIAkgKi8KIAlpZiAoc3RyWzBdID49ICcwJyAmJiBzdHJbMF0gPD0gJzknKSB7Ci0JCXN0cmNweShuYW1lLCAidHR5UyIpOwotCQlzdHJuY3B5KG5hbWUgKyA0LCBzdHIsIHNpemVvZihuYW1lKSAtIDUpOworCQlzdHJjcHkoYnVmLCAidHR5UyIpOworCQlzdHJuY3B5KGJ1ZiArIDQsIHN0ciwgc2l6ZW9mKGJ1ZikgLSA1KTsKIAl9IGVsc2UgewotCQlzdHJuY3B5KG5hbWUsIHN0ciwgc2l6ZW9mKG5hbWUpIC0gMSk7CisJCXN0cm5jcHkoYnVmLCBzdHIsIHNpemVvZihidWYpIC0gMSk7CiAJfQotCW5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAwOworCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKIAlpZiAoKG9wdGlvbnMgPSBzdHJjaHIoc3RyLCAnLCcpKSAhPSBOVUxMKQogCQkqKG9wdGlvbnMrKykgPSAwOwogI2lmZGVmIF9fc3BhcmNfXwogCWlmICghc3RyY21wKHN0ciwgInR0eWEiKSkKLQkJc3RyY3B5KG5hbWUsICJ0dHlTMCIpOworCQlzdHJjcHkoYnVmLCAidHR5UzAiKTsKIAlpZiAoIXN0cmNtcChzdHIsICJ0dHliIikpCi0JCXN0cmNweShuYW1lLCAidHR5UzEiKTsKKwkJc3RyY3B5KGJ1ZiwgInR0eVMxIik7CiAjZW5kaWYKLQlmb3IgKHMgPSBuYW1lOyAqczsgcysrKQorCWZvciAocyA9IGJ1ZjsgKnM7IHMrKykKIAkJaWYgKCgqcyA+PSAnMCcgJiYgKnMgPD0gJzknKSB8fCAqcyA9PSAnLCcpCiAJCQlicmVhazsKIAlpZHggPSBzaW1wbGVfc3RydG91bChzLCBOVUxMLCAxMCk7CiAJKnMgPSAwOwogCi0JYWRkX3ByZWZlcnJlZF9jb25zb2xlKG5hbWUsIGlkeCwgb3B0aW9ucyk7CisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKGJ1ZiwgaWR4LCBvcHRpb25zKTsKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoImNvbnNvbGU9IiwgY29uc29sZV9zZXR1cCk7CkBAIC03MDksNyArNzE1LDcgQEAKIAkgKglTZWUgaWYgdGhpcyB0dHkgaXMgbm90IHlldCByZWdpc3RlcmVkLCBhbmQKIAkgKglpZiB3ZSBoYXZlIGEgc2xvdCBmcmVlLgogCSAqLwotCWZvcihpID0gMDsgaSA8IE1BWF9DTURMSU5FQ09OU09MRVMgJiYgY29uc29sZV9jbWRsaW5lW2ldLm5hbWVbMF07IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NNRExJTkVDT05TT0xFUyAmJiBjb25zb2xlX2NtZGxpbmVbaV0ubmFtZVswXTsgaSsrKQogCQlpZiAoc3RyY21wKGNvbnNvbGVfY21kbGluZVtpXS5uYW1lLCBuYW1lKSA9PSAwICYmCiAJCQkgIGNvbnNvbGVfY21kbGluZVtpXS5pbmRleCA9PSBpZHgpIHsKIAkJCQlzZWxlY3RlZF9jb25zb2xlID0gaTsKQEAgLTcyNiw2ICs3MzIsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IF9faW5pdCB1cGRhdGVfY29uc29sZV9jbWRsaW5lKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm5hbWVfbmV3LCBpbnQgaWR4X25ldywgY2hhciAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgY29uc29sZV9jbWRsaW5lICpjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTURMSU5FQ09OU09MRVMgJiYgY29uc29sZV9jbWRsaW5lW2ldLm5hbWVbMF07IGkrKykKKwkJaWYgKHN0cmNtcChjb25zb2xlX2NtZGxpbmVbaV0ubmFtZSwgbmFtZSkgPT0gMCAmJgorCQkJICBjb25zb2xlX2NtZGxpbmVbaV0uaW5kZXggPT0gaWR4KSB7CisJCQkJYyA9ICZjb25zb2xlX2NtZGxpbmVbaV07CisJCQkJbWVtY3B5KGMtPm5hbWUsIG5hbWVfbmV3LCBzaXplb2YoYy0+bmFtZSkpOworCQkJCWMtPm5hbWVbc2l6ZW9mKGMtPm5hbWUpIC0gMV0gPSAwOworCQkJCWMtPm9wdGlvbnMgPSBvcHRpb25zOworCQkJCWMtPmluZGV4ID0gaWR4X25ldzsKKwkJCQlyZXR1cm4gaTsKKwkJfQorCS8qIG5vdCBmb3VuZCAqLworCXJldHVybiAtMTsKK30KKwogI2lmbmRlZiBDT05GSUdfRElTQUJMRV9DT05TT0xFX1NVU1BFTkQKIC8qKgogICogc3VzcGVuZF9jb25zb2xlIC0gc3VzcGVuZCB0aGUgY29uc29sZSBzdWJzeXN0ZW0KQEAgLTk0Miw2ICs5NjcsOSBAQAogCWlmIChwcmVmZXJyZWRfY29uc29sZSA8IDAgfHwgYm9vdGNvbnNvbGUgfHwgIWNvbnNvbGVfZHJpdmVycykKIAkJcHJlZmVycmVkX2NvbnNvbGUgPSBzZWxlY3RlZF9jb25zb2xlOwogCisJaWYgKGNvbnNvbGUtPmVhcmx5X3NldHVwKQorCQljb25zb2xlLT5lYXJseV9zZXR1cCgpOworCiAJLyoKIAkgKglTZWUgaWYgd2Ugd2FudCB0byB1c2UgdGhpcyBjb25zb2xlIGRyaXZlci4gSWYgd2UKIAkgKglkaWRuJ3Qgc2VsZWN0IGEgY29uc29sZSB3ZSB0YWtlIHRoZSBmaXJzdCBvbmUKQEAgLTk4NSwxMiArMTAxMywxNSBAQAogCWlmICghKGNvbnNvbGUtPmZsYWdzICYgQ09OX0VOQUJMRUQpKQogCQlyZXR1cm47CiAKLQlpZiAoYm9vdGNvbnNvbGUpIHsKKwlpZiAoYm9vdGNvbnNvbGUgJiYgKGNvbnNvbGUtPmZsYWdzICYgQ09OX0NPTlNERVYpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImNvbnNvbGUgaGFuZG92ZXI6IGJvb3QgWyVzJWRdIC0+IHJlYWwgWyVzJWRdXG4iLAogCQkgICAgICAgYm9vdGNvbnNvbGUtPm5hbWUsIGJvb3Rjb25zb2xlLT5pbmRleCwKIAkJICAgICAgIGNvbnNvbGUtPm5hbWUsIGNvbnNvbGUtPmluZGV4KTsKIAkJdW5yZWdpc3Rlcl9jb25zb2xlKGJvb3Rjb25zb2xlKTsKIAkJY29uc29sZS0+ZmxhZ3MgJj0gfkNPTl9QUklOVEJVRkZFUjsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJjb25zb2xlIFslcyVkXSBlbmFibGVkXG4iLAorCQkgICAgICAgY29uc29sZS0+bmFtZSwgY29uc29sZS0+aW5kZXgpOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9rZXJuZWwvcHRyYWNlLmMgYi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggYWQ3OTQ5YS4uNGExNzQ1ZjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wdHJhY2UuYworKysgYi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE2MSw2ICsxNjEsNyBAQAogaW50IHB0cmFjZV9hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWF1ZGl0X3B0cmFjZSh0YXNrKTsKIApAQCAtMTgxLDkgKzE4Miw3IEBACiAJICogY3B1J3MgdGhhdCBtYXkgaGF2ZSB0YXNrX2xvY2spLgogCSAqLwogCXRhc2tfbG9jayh0YXNrKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWlmICghd3JpdGVfdHJ5bG9jaygmdGFza2xpc3RfbG9jaykpIHsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCWlmICghd3JpdGVfdHJ5bG9ja19pcnFzYXZlKCZ0YXNrbGlzdF9sb2NrLCBmbGFncykpIHsKIAkJdGFza191bmxvY2sodGFzayk7CiAJCWRvIHsKIAkJCWNwdV9yZWxheCgpOwpAQCAtMjExLDcgKzIxMCw3IEBACiAJZm9yY2Vfc2lnX3NwZWNpZmljKFNJR1NUT1AsIHRhc2spOwogCiBiYWQ6Ci0Jd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnRhc2tsaXN0X2xvY2ssIGZsYWdzKTsKIAl0YXNrX3VubG9jayh0YXNrKTsKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNDkxLDMgKzQ5MCwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAjZW5kaWYgLyogX19BUkNIX1NZU19QVFJBQ0UgKi8KKworaW50IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgY29waWVkOworCisJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0odHNrLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7CisJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7Cit9CisKK2ludCBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbG9uZyBhZGRyLCBsb25nIGRhdGEpCit7CisJaW50IGNvcGllZDsKKworCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRzaywgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSk7CisJcmV0dXJuIChjb3BpZWQgPT0gc2l6ZW9mKGRhdGEpKSA/IDAgOiAtRUlPOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggNTViYTgyYS4uZGRmZjMzMiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNTE4LDcgKzUxOSw2IEBACiAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3dyaXRlciB0YXNrIHN0YXJ0ZWQiKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDE5KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWRvIHsKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CkBAIC01NTgsNyArNTU4LDYgQEAKIAogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfZmFrZXdyaXRlciB0YXNrIHN0YXJ0ZWQiKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDE5KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWRvIHsKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSArIHJjdV9yYW5kb20oJnJhbmQpJTEwKTsKQEAgLTU4OSw3ICs1ODgsNiBAQAogCiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9yZWFkZXIgdGFzayBzdGFydGVkIik7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlkbyB7CiAJCWlkeCA9IGN1cl9vcHMtPnJlYWRsb2NrKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jIGIva2VybmVsL3J0bXV0ZXgtZGVidWcuYwppbmRleCBkYThkNmJmLi41YWVkYmVlIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCisrKyBiL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKQEAgLTI5LDEyICsyOSw2IEBACiAKICNpbmNsdWRlICJydG11dGV4X2NvbW1vbi5oIgogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMKLSMgaW5jbHVkZSAicnRtdXRleC1kZWJ1Zy5oIgotI2Vsc2UKLSMgaW5jbHVkZSAicnRtdXRleC5oIgotI2VuZGlmCi0KICMgZGVmaW5lIFRSQUNFX1dBUk5fT04oeCkJCQlXQVJOX09OKHgpCiAjIGRlZmluZSBUUkFDRV9CVUdfT04oeCkJCQlCVUdfT04oeCkKIApkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXgtdGVzdGVyLmMgYi9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYwppbmRleCAwMTVmYzYzLi5lMzA1NWJhIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYworKysgYi9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYwpAQCAtMjYwLDYgKzI2MCw3IEBACiAJaW50IHJldDsKIAogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01VVEVYX1RFU1RFUjsKKwlzZXRfZnJlZXphYmxlKCk7CiAJYWxsb3dfc2lnbmFsKFNJR0hVUCk7CiAKIAlmb3IoOzspIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LmMgYi9rZXJuZWwvcnRtdXRleC5jCmluZGV4IDE3ZDI4Y2UuLjhjZDliZDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LmMKKysrIGIva2VybmVsL3J0bXV0ZXguYwpAQCAtMTcsMTIgKzE3LDYgQEAKIAogI2luY2x1ZGUgInJ0bXV0ZXhfY29tbW9uLmgiCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUlRfTVVURVhFUwotIyBpbmNsdWRlICJydG11dGV4LWRlYnVnLmgiCi0jZWxzZQotIyBpbmNsdWRlICJydG11dGV4LmgiCi0jZW5kaWYKLQogLyoKICAqIGxvY2stPm93bmVyIHN0YXRlIHRyYWNraW5nOgogICoKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oIGIva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKaW5kZXggOWM3NTg1Ni4uMmQzYjgzNSAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKKysrIGIva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqcnRfbXV0ZXhfcmVhbF9vd25lcihzdHJ1Y3QgcnRfbXV0ZXggKmxvY2spCiB7Ci0gCXJldHVybiAoc3RydWN0IHRhc2tfc3RydWN0ICopCisJcmV0dXJuIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKikKIAkJKCh1bnNpZ25lZCBsb25nKWxvY2stPm93bmVyICYgflJUX01VVEVYX0hBU19XQUlURVJTKTsKIH0KIApAQCAtMTIwLDQgKzEyMCwxMSBAQAogCQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb3h5X293bmVyKTsKIGV4dGVybiB2b2lkIHJ0X211dGV4X3Byb3h5X3VubG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssCiAJCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb3h5X293bmVyKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19SVF9NVVRFWEVTCisjIGluY2x1ZGUgInJ0bXV0ZXgtZGVidWcuaCIKKyNlbHNlCisjIGluY2x1ZGUgInJ0bXV0ZXguaCIKKyNlbmRpZgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggMzMzMmJiYi4uY2IzMWZiNCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTczNiw3ICs3MzYsOSBAQAogICoKICAqIFRoZSAiMTAlIGVmZmVjdCIgaXMgcmVsYXRpdmUgYW5kIGN1bXVsYXRpdmU6IGZyb20gX2FueV8gbmljZSBsZXZlbCwKICAqIGlmIHlvdSBnbyB1cCAxIGxldmVsLCBpdCdzIC0xMCUgQ1BVIHVzYWdlLCBpZiB5b3UgZ28gZG93biAxIGxldmVsCi0gKiBpdCdzICsxMCUgQ1BVIHVzYWdlLgorICogaXQncyArMTAlIENQVSB1c2FnZS4gKHRvIGFjaGlldmUgdGhhdCB3ZSB1c2UgYSBtdWx0aXBsaWVyIG9mIDEuMjUuCisgKiBJZiBhIHRhc2sgZ29lcyB1cCBieSB+MTAlIGFuZCBhbm90aGVyIHRhc2sgZ29lcyBkb3duIGJ5IH4xMCUgdGhlbgorICogdGhlIHJlbGF0aXZlIGRpc3RhbmNlIGJldHdlZW4gdGhlbSBpcyB+MjUlLikKICAqLwogc3RhdGljIGNvbnN0IGludCBwcmlvX3RvX3dlaWdodFs0MF0gPSB7CiAvKiAtMjAgKi8gODg4MTgsIDcxMDU0LCA1Njg0MywgNDU0NzUsIDM2MzgwLCAyOTEwNCwgMjMyODMsIDE4NjI2LCAxNDkwMSwgMTE5MjEsCkBAIC03NDYsMTUgKzc0OCwyMiBAQAogLyogIDEwICovICAgMTEwLCAgICA4NywgICAgNzAsICAgIDU2LCAgICA0NSwgICAgMzYsICAgIDI5LCAgICAyMywgICAgMTgsICAgIDE1LAogfTsKIAorLyoKKyAqIEludmVyc2UgKDJeMzIveCkgdmFsdWVzIG9mIHRoZSBwcmlvX3RvX3dlaWdodFtdIGFycmF5LCBwcmVjYWxjdWxhdGVkLgorICoKKyAqIEluIGNhc2VzIHdoZXJlIHRoZSB3ZWlnaHQgZG9lcyBub3QgY2hhbmdlIG9mdGVuLCB3ZSBjYW4gdXNlIHRoZQorICogcHJlY2FsY3VsYXRlZCBpbnZlcnNlIHRvIHNwZWVkIHVwIGFyaXRobWV0aWNzIGJ5IHR1cm5pbmcgZGl2aXNpb25zCisgKiBpbnRvIG11bHRpcGxpY2F0aW9uczoKKyAqLwogc3RhdGljIGNvbnN0IHUzMiBwcmlvX3RvX3dtdWx0WzQwXSA9IHsKLQk0ODM1NiwgICA2MDQ0NiwgICA3NTU1OCwgICA5NDQ0NiwgIDExODA1OCwgIDE0NzU3MywKLQkxODQ0NjcsICAyMzA1ODksICAyODgyMzMsICAzNjAyODUsICA0NTAzNDcsCi0JNTYyOTc5LCAgNzAzNzQ2LCAgODc5NTc1LCAxMDk5NTgyLCAxMzc0Mzg5LAotCTE3MTc5ODYsIDIxNDc0ODMsIDI2ODQzNTQsIDMzNTU0NDMsIDQxOTQzMDQsCi0JNTI0NDE2MCwgNjU1NzIwMSwgODE5NjUwMiwgMTAyNTA1MTgsIDEyNzgyNjQwLAotCTE2MDI1OTk3LCAxOTk3NjU5MiwgMjQ5NzA3NDAsIDMxMzUwMTI2LCAzOTA0NTE1NywKLQk0OTM2NzQ0MCwgNjEzNTY2NzUsIDc2Njk1ODQ0LCA5NTQ0MzcxNywgMTE5MzA0NjQ3LAotCTE0ODEwMjMyMCwgMTg2NzM3NzA4LCAyMzg2MDkyOTQsIDI4NjMzMTE1MywKKy8qIC0yMCAqLyAgICAgNDgzNTYsICAgICA2MDQ0NiwgICAgIDc1NTU4LCAgICAgOTQ0NDYsICAgIDExODA1OCwKKy8qIC0xNSAqLyAgICAxNDc1NzMsICAgIDE4NDQ2NywgICAgMjMwNTg5LCAgICAyODgyMzMsICAgIDM2MDI4NSwKKy8qIC0xMCAqLyAgICA0NTAzNDcsICAgIDU2Mjk3OSwgICAgNzAzNzQ2LCAgICA4Nzk1NzUsICAgMTA5OTU4MiwKKy8qICAtNSAqLyAgIDEzNzQzODksICAgMTcxNzk4NiwgICAyMTQ3NDgzLCAgIDI2ODQzNTQsICAgMzM1NTQ0MywKKy8qICAgMCAqLyAgIDQxOTQzMDQsICAgNTI0NDE2MCwgICA2NTU3MjAxLCAgIDgxOTY1MDIsICAxMDI1MDUxOCwKKy8qICAgNSAqLyAgMTI3ODI2NDAsICAxNjAyNTk5NywgIDE5OTc2NTkyLCAgMjQ5NzA3NDAsICAzMTM1MDEyNiwKKy8qICAxMCAqLyAgMzkwNDUxNTcsICA0OTM2NzQ0MCwgIDYxMzU2Njc1LCAgNzY2OTU4NDQsICA5NTQ0MzcxNywKKy8qICAxNSAqLyAxMTkzMDQ2NDcsIDE0ODEwMjMyMCwgMTg2NzM3NzA4LCAyMzg2MDkyOTQsIDI4NjMzMTE1MywKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNDkwMyw4ICs0OTEyLDYgQEAKIAkJc3RydWN0IG1pZ3JhdGlvbl9yZXEgKnJlcTsKIAkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAotCQl0cnlfdG9fZnJlZXplKCk7Ci0KIAkJc3Bpbl9sb2NrX2lycSgmcnEtPmxvY2spOwogCiAJCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpKSB7CkBAIC01MTM4LDcgKzUxNDUsNiBAQAogCQlwID0ga3RocmVhZF9jcmVhdGUobWlncmF0aW9uX3RocmVhZCwgaGNwdSwgIm1pZ3JhdGlvbi8lZCIsIGNwdSk7CiAJCWlmIChJU19FUlIocCkpCiAJCQlyZXR1cm4gTk9USUZZX0JBRDsKLQkJcC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJCWt0aHJlYWRfYmluZChwLCBjcHUpOwogCQkvKiBNdXN0IGJlIGhpZ2ggcHJpbzogc3RvcF9tYWNoaW5lIGV4cGVjdHMgdG8geWllbGQgdG8gaXQuICovCiAJCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2VjY29tcC5jIGIva2VybmVsL3NlY2NvbXAuYwppbmRleCBjMzM5MWI2Li5hZDY0ZmNiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2VjY29tcC5jCisrKyBiL2tlcm5lbC9zZWNjb21wLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAvKiAjZGVmaW5lIFNFQ0NPTVBfREVCVUcgMSAqLworI2RlZmluZSBOUl9TRUNDT01QX01PREVTIDEKIAogLyoKICAqIFNlY3VyZSBjb21wdXRpbmcgbW9kZSAxIGFsbG93cyBvbmx5IHJlYWQvd3JpdGUvZXhpdC9zaWdyZXR1cm4uCkBAIC01NCwzICs1NSwzMSBAQAogI2VuZGlmCiAJZG9fZXhpdChTSUdLSUxMKTsKIH0KKworbG9uZyBwcmN0bF9nZXRfc2VjY29tcCh2b2lkKQoreworCXJldHVybiBjdXJyZW50LT5zZWNjb21wLm1vZGU7Cit9CisKK2xvbmcgcHJjdGxfc2V0X3NlY2NvbXAodW5zaWduZWQgbG9uZyBzZWNjb21wX21vZGUpCit7CisJbG9uZyByZXQ7CisKKwkvKiBjYW4gc2V0IGl0IG9ubHkgb25jZSB0byBiZSBldmVuIG1vcmUgc2VjdXJlICovCisJcmV0ID0gLUVQRVJNOworCWlmICh1bmxpa2VseShjdXJyZW50LT5zZWNjb21wLm1vZGUpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKHNlY2NvbXBfbW9kZSAmJiBzZWNjb21wX21vZGUgPD0gTlJfU0VDQ09NUF9NT0RFUykgeworCQljdXJyZW50LT5zZWNjb21wLm1vZGUgPSBzZWNjb21wX21vZGU7CisJCXNldF90aHJlYWRfZmxhZyhUSUZfU0VDQ09NUCk7CisjaWZkZWYgVElGX05PVFNDCisJCWRpc2FibGVfVFNDKCk7CisjZW5kaWYKKwkJcmV0ID0gMDsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBmOTQwNTYwLi4zOWQxMjI3IDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC03MTgsNiArNzE4LDM3IEBACiAjZGVmaW5lIExFR0FDWV9RVUVVRShzaWdwdHIsIHNpZykgXAogCSgoKHNpZykgPCBTSUdSVE1JTikgJiYgc2lnaXNtZW1iZXIoJihzaWdwdHIpLT5zaWduYWwsIChzaWcpKSkKIAoraW50IHByaW50X2ZhdGFsX3NpZ25hbHM7CisKK3N0YXRpYyB2b2lkIHByaW50X2ZhdGFsX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHNpZ25yKQoreworCXByaW50aygiJXMvJWQ6IHBvdGVudGlhbGx5IHVuZXhwZWN0ZWQgZmF0YWwgc2lnbmFsICVkLlxuIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBzaWducik7CisKKyNpZmRlZiBfX2kzODZfXworCXByaW50aygiY29kZSBhdCAlMDhseDogIiwgcmVncy0+ZWlwKTsKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJdW5zaWduZWQgY2hhciBpbnNuOworCisJCQlfX2dldF91c2VyKGluc24sICh1bnNpZ25lZCBjaGFyICopKHJlZ3MtPmVpcCArIGkpKTsKKwkJCXByaW50aygiJTAyeCAiLCBpbnNuKTsKKwkJfQorCX0KKyNlbmRpZgorCXByaW50aygiXG4iKTsKKwlzaG93X3JlZ3MocmVncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3ByaW50X2ZhdGFsX3NpZ25hbHMoY2hhciAqc3RyKQoreworCWdldF9vcHRpb24gKCZzdHIsICZwcmludF9mYXRhbF9zaWduYWxzKTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJwcmludC1mYXRhbC1zaWduYWxzPSIsIHNldHVwX3ByaW50X2ZhdGFsX3NpZ25hbHMpOwogCiBzdGF0aWMgaW50CiBzcGVjaWZpY19zZW5kX3NpZ19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCkBAIC0xODU1LDYgKzE4ODYsOCBAQAogCQkgKiBBbnl0aGluZyBlbHNlIGlzIGZhdGFsLCBtYXliZSB3aXRoIGEgY29yZSBkdW1wLgogCQkgKi8KIAkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU0lHTkFMRUQ7CisJCWlmICgoc2lnbnIgIT0gU0lHS0lMTCkgJiYgcHJpbnRfZmF0YWxfc2lnbmFscykKKwkJCXByaW50X2ZhdGFsX3NpZ25hbChyZWdzLCBzaWducik7CiAJCWlmIChzaWdfa2VybmVsX2NvcmVkdW1wKHNpZ25yKSkgewogCQkJLyoKIAkJCSAqIElmIGl0IHdhcyBhYmxlIHRvIGR1bXAgY29yZSwgdGhpcyBraWxscyBhbGwKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0aXJxLmMgYi9rZXJuZWwvc29mdGlycS5jCmluZGV4IDczMjE3YTkuLjBmNTQ2ZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0aXJxLmMKKysrIGIva2VybmVsL3NvZnRpcnEuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtNDg4LDggKzQ4OSw2IEBACiAKIHN0YXRpYyBpbnQga3NvZnRpcnFkKHZvaWQgKiBfX2JpbmRfY3B1KQogewotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CkBAIC02MTQsMTIgKzYxMywxNiBAQAogCQlrdGhyZWFkX2JpbmQocGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSksCiAJCQkgICAgIGFueV9vbmxpbmVfY3B1KGNwdV9vbmxpbmVfbWFwKSk7CiAJY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKKwljYXNlIENQVV9ERUFEX0ZST1pFTjogeworCQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKKwogCQlwID0gcGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSk7CiAJCXBlcl9jcHUoa3NvZnRpcnFkLCBob3RjcHUpID0gTlVMTDsKKwkJc2NoZWRfc2V0c2NoZWR1bGVyKHAsIFNDSEVEX0ZJRk8sICZwYXJhbSk7CiAJCWt0aHJlYWRfc3RvcChwKTsKIAkJdGFrZW92ZXJfdGFza2xldHMoaG90Y3B1KTsKIAkJYnJlYWs7CisJfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMgYi9rZXJuZWwvc29mdGxvY2t1cC5jCmluZGV4IDAxMzFlMjkuLjcwOGQ0ODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMKKysrIGIva2VybmVsL3NvZnRsb2NrdXAuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTExNiw3ICsxMTcsNiBAQAogCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsgLnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8tMSB9OwogCiAJc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZwYXJhbSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAkvKiBpbml0aWFsaXplIHRpbWVzdGFtcCAqLwogCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwppbmRleCBmY2VlMmE4Li4zMTk4MjFlIDEwMDY0NAotLS0gYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKKysrIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCkBAIC05MywxMCArOTMsNiBAQAogc3RhdGljIGludCBzdG9wX21hY2hpbmUodm9pZCkKIHsKIAlpbnQgaSwgcmV0ID0gMDsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKLQotCS8qIE9uZSBoaWdoLXByaW8gdGhyZWFkIHBlciBjcHUuICBXZSdsbCBkbyB0aGlzIG9uZS4gKi8KLQlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKIAogCWF0b21pY19zZXQoJnN0b3BtYWNoaW5lX3RocmVhZF9hY2ssIDApOwogCXN0b3BtYWNoaW5lX251bV90aHJlYWRzID0gMDsKQEAgLTE4OSw2ICsxODUsMTAgQEAKIAogCXAgPSBrdGhyZWFkX2NyZWF0ZShkb19zdG9wLCAmc21kYXRhLCAia3N0b3BtYWNoaW5lIik7CiAJaWYgKCFJU19FUlIocCkpIHsKKwkJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CisKKwkJLyogT25lIGhpZ2gtcHJpbyB0aHJlYWQgcGVyIGNwdS4gIFdlJ2xsIGRvIHRoaXMgb25lLiAqLworCQlzY2hlZF9zZXRzY2hlZHVsZXIocCwgU0NIRURfRklGTywgJnBhcmFtKTsKIAkJa3RocmVhZF9iaW5kKHAsIGNwdSk7CiAJCXdha2VfdXBfcHJvY2VzcyhwKTsKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmc21kYXRhLmRvbmUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDg3MjI3MWMuLjRkMTQxYWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTMxLDEwICszMSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2NuX3Byb2MuaD4KICNpbmNsdWRlIDxsaW51eC9nZXRjcHUuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xMDc4LDEzICsxMDgwLDEzIEBACiB7CiAJc3RydWN0IHVzZXJfc3RydWN0ICpuZXdfdXNlcjsKIAotCW5ld191c2VyID0gYWxsb2NfdWlkKG5ld19ydWlkKTsKKwluZXdfdXNlciA9IGFsbG9jX3VpZChjdXJyZW50LT5uc3Byb3h5LT51c2VyX25zLCBuZXdfcnVpZCk7CiAJaWYgKCFuZXdfdXNlcikKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlpZiAoYXRvbWljX3JlYWQoJm5ld191c2VyLT5wcm9jZXNzZXMpID49CiAJCQkJY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OUFJPQ10ucmxpbV9jdXIgJiYKLQkJCW5ld191c2VyICE9ICZyb290X3VzZXIpIHsKKwkJCW5ld191c2VyICE9IGN1cnJlbnQtPm5zcHJveHktPnVzZXJfbnMtPnJvb3RfdXNlcikgewogCQlmcmVlX3VpZChuZXdfdXNlcik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTIyNDEsNiArMjI0MywxMyBAQAogCQkJZXJyb3IgPSBTRVRfRU5ESUFOKGN1cnJlbnQsIGFyZzIpOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBQUl9HRVRfU0VDQ09NUDoKKwkJCWVycm9yID0gcHJjdGxfZ2V0X3NlY2NvbXAoKTsKKwkJCWJyZWFrOworCQljYXNlIFBSX1NFVF9TRUNDT01QOgorCQkJZXJyb3IgPSBwcmN0bF9zZXRfc2VjY29tcChhcmcyKTsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNfbmkuYyBiL2tlcm5lbC9zeXNfbmkuYwppbmRleCA3ZTExZTJjLi5iMGVjNDk4IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzX25pLmMKKysrIGIva2VybmVsL3N5c19uaS5jCkBAIC0xNCw2ICsxNCw3IEBACiAKIGNvbmRfc3lzY2FsbChzeXNfbmZzc2VydmN0bCk7CiBjb25kX3N5c2NhbGwoc3lzX3F1b3RhY3RsKTsKK2NvbmRfc3lzY2FsbChzeXMzMl9xdW90YWN0bCk7CiBjb25kX3N5c2NhbGwoc3lzX2FjY3QpOwogY29uZF9zeXNjYWxsKHN5c19sb29rdXBfZGNvb2tpZSk7CiBjb25kX3N5c2NhbGwoc3lzX3N3YXBvbik7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggZDkzZTEzZC4uNzA2M2ViYyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CkBAIC00OSw5ICs1MCw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLWV4dGVybiBpbnQgcHJvY19ucl9maWxlcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOwotCiAjaWZkZWYgQ09ORklHX1g4NgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgpAQCAtNjEsNiArNTksNyBAQAogCiAvKiBFeHRlcm5hbCB2YXJpYWJsZXMgbm90IGluIGEgaGVhZGVyIGZpbGUuICovCiBleHRlcm4gaW50IENfQV9EOworZXh0ZXJuIGludCBwcmludF9mYXRhbF9zaWduYWxzOwogZXh0ZXJuIGludCBzeXNjdGxfb3ZlcmNvbW1pdF9tZW1vcnk7CiBleHRlcm4gaW50IHN5c2N0bF9vdmVyY29tbWl0X3JhdGlvOwogZXh0ZXJuIGludCBzeXNjdGxfcGFuaWNfb25fb29tOwpAQCAtMjAyLDcgKzIwMSwxMCBAQAogCQkubW9kZQkJPSAwNTU1LAogCQkuY2hpbGQJCT0gZGV2X3RhYmxlLAogCX0sCi0KKy8qCisgKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKKyAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dAorICovCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTM0MCw2ICszNDIsMTQgQEAKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCX0sCiAjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAicHJpbnQtZmF0YWwtc2lnbmFscyIsCisJCS5kYXRhCQk9ICZwcmludF9mYXRhbF9zaWduYWxzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKICNpZmRlZiBfX3NwYXJjX18KIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fU1BBUkNfUkVCT09ULApAQCAtODE0LDYgKzgyNCwxNCBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJIH0sCisJIHsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSIsCisJCS5kYXRhCQk9ICZodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZodWdldGxiX3RyZWF0X21vdmFibGVfaGFuZGxlciwKKwl9LAogI2VuZGlmCiAJewogCQkuY3RsX25hbWUJPSBWTV9MT1dNRU1fUkVTRVJWRV9SQVRJTywKQEAgLTk1OCw2ICs5NzYsMTcgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvdWxvbmd2ZWNfbWlubWF4LAogCX0sCisjaWZkZWYgQ09ORklHX05VTUEKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibnVtYV96b25lbGlzdF9vcmRlciIsCisJCS5kYXRhCQk9ICZudW1hX3pvbmVsaXN0X29yZGVyLAorCQkubWF4bGVuCQk9IE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJm51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlciwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9zdHJpbmcsCisJfSwKKyNlbmRpZgogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzMyKSB8fCBcCiAgICAoZGVmaW5lZChDT05GSUdfU1VQRVJIKSAmJiBkZWZpbmVkKENPTkZJR19WU1lTQ0FMTCkpCkBAIC05NzIsNiArMTAwMSwxMCBAQAogCQkuZXh0cmExCQk9ICZ6ZXJvLAogCX0sCiAjZW5kaWYKKy8qCisgKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKKyAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dAorICovCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTExMTIsNiArMTE0NSwxMCBAQAogCQkuY2hpbGQJCT0gYmluZm10X21pc2NfdGFibGUsCiAJfSwKICNlbmRpZgorLyoKKyAqIE5PVEU6IGRvIG5vdCBhZGQgbmV3IGVudHJpZXMgdG8gdGhpcyB0YWJsZSB1bmxlc3MgeW91IGhhdmUgcmVhZAorICogRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0CisgKi8KIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Rhc2tzdGF0cy5jIGIva2VybmVsL3Rhc2tzdGF0cy5jCmluZGV4IDkwNmNhZTcuLjA1OTQzMWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90YXNrc3RhdHMuYworKysgYi9rZXJuZWwvdGFza3N0YXRzLmMKQEAgLTE5Niw2ICsxOTYsOCBAQAogCiAJLyogZmlsbCBpbiBiYXNpYyBhY2N0IGZpZWxkcyAqLwogCXN0YXRzLT52ZXJzaW9uID0gVEFTS1NUQVRTX1ZFUlNJT047CisJc3RhdHMtPm52Y3N3ID0gdHNrLT5udmNzdzsKKwlzdGF0cy0+bml2Y3N3ID0gdHNrLT5uaXZjc3c7CiAJYmFjY3RfYWRkX3RzayhzdGF0cywgdHNrKTsKIAogCS8qIGZpbGwgaW4gZXh0ZW5kZWQgYWNjdCBmaWVsZHMgKi8KQEAgLTI0Miw2ICsyNDQsOCBAQAogCQkgKi8KIAkJZGVsYXlhY2N0X2FkZF90c2soc3RhdHMsIHRzayk7CiAKKwkJc3RhdHMtPm52Y3N3ICs9IHRzay0+bnZjc3c7CisJCXN0YXRzLT5uaXZjc3cgKz0gdHNrLT5uaXZjc3c7CiAJfSB3aGlsZV9lYWNoX3RocmVhZChmaXJzdCwgdHNrKTsKIAogCXVubG9ja190YXNrX3NpZ2hhbmQoZmlyc3QsICZmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS5jIGIva2VybmVsL3RpbWUuYwppbmRleCBmMDQ3OTFmLi5mZmUxOTE0IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTU3LDE0ICs1NywxNyBAQAogICovCiBhc21saW5rYWdlIGxvbmcgc3lzX3RpbWUodGltZV90IF9fdXNlciAqIHRsb2MpCiB7Ci0JdGltZV90IGk7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7CisJLyoKKwkgKiBXZSByZWFkIHh0aW1lLnR2X3NlYyBhdG9taWNhbGx5IC0gaXQncyB1cGRhdGVkCisJICogYXRvbWljYWxseSBieSB1cGRhdGVfd2FsbF90aW1lKCksIHNvIG5vIG5lZWQgdG8KKwkgKiBldmVuIHJlYWQtbG9jayB0aGUgeHRpbWUgc2VxbG9jazoKKwkgKi8KKwl0aW1lX3QgaSA9IHh0aW1lLnR2X3NlYzsKIAotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCWkgPSB0di50dl9zZWM7CisJc21wX3JtYigpOyAvKiBzeXNfdGltZSgpIHJlc3VsdHMgYXJlIGNvaGVyZW50ICovCiAKIAlpZiAodGxvYykgewotCQlpZiAocHV0X3VzZXIoaSx0bG9jKSkKKwkJaWYgKHB1dF91c2VyKGksIHRsb2MpKQogCQkJaSA9IC1FRkFVTFQ7CiAJfQogCXJldHVybiBpOwpAQCAtMzczLDEyICszNzYsMjUgQEAKIAogCXR2LT50dl9zZWMgPSBzZWM7CiAJdHYtPnR2X3VzZWMgPSB1c2VjOwotfQogCisJLyoKKwkgKiBNYWtlIHN1cmUgeHRpbWUudHZfc2VjIFtyZXR1cm5lZCBieSBzeXNfdGltZSgpXSBhbHdheXMKKwkgKiBmb2xsb3dzIHRoZSBnZXR0aW1lb2ZkYXkoKSByZXN1bHQgcHJlY2lzZWx5LiBUaGlzCisJICogY29uZGl0aW9uIGlzIGV4dHJlbWVseSB1bmxpa2VseSwgaXQgY2FuIGhpdCBhdCBtb3N0CisJICogb25jZSBwZXIgc2Vjb25kOgorCSAqLworCWlmICh1bmxpa2VseSh4dGltZS50dl9zZWMgIT0gdHYtPnR2X3NlYykpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwkJdXBkYXRlX3dhbGxfdGltZSgpOworCQl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCX0KK30KIEVYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKIAorI2Vsc2UJLyogQ09ORklHX1RJTUVfSU5URVJQT0xBVElPTiAqLwogCi0jZWxzZQogI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCiAvKgogICogU2ltdWxhdGUgZ2V0dGltZW9mZGF5IHVzaW5nIGRvX2dldHRpbWVvZmRheSB3aGljaCBvbmx5IGFsbG93cyBhIHRpbWV2YWwKQEAgLTM5NCw3ICs0MTAsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0bnN0aW1lb2ZkYXkpOwogI2VuZGlmCi0jZW5kaWYKKyNlbmRpZgkvKiBDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OICovCiAKIC8qIENvbnZlcnRzIEdyZWdvcmlhbiBkYXRlIHRvIHNlY29uZHMgc2luY2UgMTk3MC0wMS0wMSAwMDowMDowMC4KICAqIEFzc3VtZXMgaW5wdXQgaW4gbm9ybWFsIGRhdGUgZm9ybWF0LCBpLmUuIDE5ODAtMTItMzEgMjM6NTk6NTkKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCmluZGV4IDc2MjEyYjIuLjJhZDFjMzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwpAQCAtMjA1LDQ3ICsyMDUsNiBAQAogfQogCiAvKioKLSAqIGNsb2NrZXZlbnRzX3JlcXVlc3RfZGV2aWNlCi0gKi8KLXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsb2NrZXZlbnRzX3JlcXVlc3RfZGV2aWNlKHVuc2lnbmVkIGludCBmZWF0dXJlcywKLQkJCQkJCSAgICAgIGNwdW1hc2tfdCBjcHVtYXNrKQotewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmN1ciwgKmRldiA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCi0Jc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2godG1wLCAmY2xvY2tldmVudF9kZXZpY2VzKSB7Ci0JCWN1ciA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKLQotCQlpZiAoKGN1ci0+ZmVhdHVyZXMgJiBmZWF0dXJlcykgPT0gZmVhdHVyZXMgJiYKLQkJICAgIGNwdXNfZXF1YWwoY3B1bWFzaywgY3VyLT5jcHVtYXNrKSkgewotCQkJaWYgKCFkZXYgfHwgZGV2LT5yYXRpbmcgPCBjdXItPnJhdGluZykKLQkJCQlkZXYgPSBjdXI7Ci0JCX0KLQl9Ci0KLQljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoTlVMTCwgZGV2KTsKLQotCXNwaW5fdW5sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCXJldHVybiBkZXY7Ci19Ci0KLS8qKgotICogY2xvY2tldmVudHNfcmVsZWFzZV9kZXZpY2UKLSAqLwotdm9pZCBjbG9ja2V2ZW50c19yZWxlYXNlX2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCi17Ci0Jc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShkZXYsIE5VTEwpOwotCWNsb2NrZXZlbnRzX25vdGlmeV9yZWxlYXNlZCgpOwotCi0Jc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOwotfQotCi0vKioKICAqIGNsb2NrZXZlbnRzX25vdGlmeSAtIG5vdGlmaWNhdGlvbiBhYm91dCByZWxldmFudCBldmVudHMKICAqLwogdm9pZCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggY2Y1M2JiNS4uNDM4YzZiNyAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCmluZGV4IDNkMTA0MmY4Li43MjhjZWRmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKQEAgLTM2LDkgKzM2LDE3IEBACiAgKiBhdCB6ZXJvIGF0IHN5c3RlbSBib290IHRpbWUsIHNvIHdhbGxfdG9fbW9ub3RvbmljIHdpbGwgYmUgbmVnYXRpdmUsCiAgKiBob3dldmVyLCB3ZSB3aWxsIEFMV0FZUyBrZWVwIHRoZSB0dl9uc2VjIHBhcnQgcG9zaXRpdmUgc28gd2UgY2FuIHVzZQogICogdGhlIHVzdWFsIG5vcm1hbGl6YXRpb24uCisgKgorICogd2FsbF90b19tb25vdG9uaWMgaXMgbW92ZWQgYWZ0ZXIgcmVzdW1lIGZyb20gc3VzcGVuZCBmb3IgdGhlIG1vbm90b25pYworICogdGltZSBub3QgdG8ganVtcC4gV2UgbmVlZCB0byBhZGQgdG90YWxfc2xlZXBfdGltZSB0byB3YWxsX3RvX21vbm90b25pYworICogdG8gZ2V0IHRoZSByZWFsIGJvb3QgYmFzZWQgdGltZSBvZmZzZXQuCisgKgorICogLSB3YWxsX3RvX21vbm90b25pYyBpcyBubyBsb25nZXIgdGhlIGJvb3QgdGltZSwgZ2V0Ym9vdHRpbWUgbXVzdCBiZQorICogdXNlZCBpbnN0ZWFkLgogICovCiBzdHJ1Y3QgdGltZXNwZWMgeHRpbWUgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOwogc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX3NsZWVwX3RpbWU7CQkvKiBzZWNvbmRzICovCiAKIEVYUE9SVF9TWU1CT0woeHRpbWUpOwogCkBAIC0yNTEsNiArMjU5LDcgQEAKIAl4dGltZS50dl9uc2VjID0gMDsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCiAJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKwl0b3RhbF9zbGVlcF90aW1lID0gMDsKIAogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiB9CkBAIC0yODIsNiArMjkxLDcgQEAKIAogCQl4dGltZS50dl9zZWMgKz0gc2xlZXBfbGVuZ3RoOwogCQl3YWxsX3RvX21vbm90b25pYy50dl9zZWMgLT0gc2xlZXBfbGVuZ3RoOworCQl0b3RhbF9zbGVlcF90aW1lICs9IHNsZWVwX2xlbmd0aDsKIAl9CiAJLyogcmUtYmFzZSB0aGUgbGFzdCBjeWNsZSB2YWx1ZSAqLwogCWNsb2NrLT5jeWNsZV9sYXN0ID0gY2xvY2tzb3VyY2VfcmVhZChjbG9jayk7CkBAIC00NzYsMyArNDg2LDMwIEBACiAJY2hhbmdlX2Nsb2Nrc291cmNlKCk7CiAJdXBkYXRlX3ZzeXNjYWxsKCZ4dGltZSwgY2xvY2spOwogfQorCisvKioKKyAqIGdldGJvb3R0aW1lIC0gUmV0dXJuIHRoZSByZWFsIHRpbWUgb2Ygc3lzdGVtIGJvb3QuCisgKiBAdHM6CQlwb2ludGVyIHRvIHRoZSB0aW1lc3BlYyB0byBiZSBzZXQKKyAqCisgKiBSZXR1cm5zIHRoZSB0aW1lIG9mIGRheSBpbiBhIHRpbWVzcGVjLgorICoKKyAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIHdhbGxfdG9fbW9ub3RvbmljIG9mZnNldCBhbmQgdGhlIHRvdGFsIHN1c3BlbmQKKyAqIHRpbWUuIENhbGxzIHRvIHNldHRpbWVvZmRheSB3aWxsIGFmZmVjdCB0aGUgdmFsdWUgcmV0dXJuZWQgKHdoaWNoCisgKiBiYXNpY2FsbHkgbWVhbnMgdGhhdCBob3dldmVyIHdyb25nIHlvdXIgcmVhbCB0aW1lIGNsb2NrIGlzIGF0IGJvb3QgdGltZSwKKyAqIHlvdSBnZXQgdGhlIHJpZ2h0IHRpbWUgaGVyZSkuCisgKi8KK3ZvaWQgZ2V0Ym9vdHRpbWUoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYyh0cywKKwkJLSAod2FsbF90b19tb25vdG9uaWMudHZfc2VjICsgdG90YWxfc2xlZXBfdGltZSksCisJCS0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyk7Cit9CisKKy8qKgorICogbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCAtIENvbnZlcnQgdGhlIG1vbm90b25pYyB0aW1lIHRvIGJvb3QgYmFzZWQuCisgKiBAdHM6CQlwb2ludGVyIHRvIHRoZSB0aW1lc3BlYyB0byBiZSBjb252ZXJ0ZWQKKyAqLwordm9pZCBtb25vdG9uaWNfdG9fYm9vdGJhc2VkKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJdHMtPnR2X3NlYyArPSB0b3RhbF9zbGVlcF90aW1lOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jIGIva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCmluZGV4IDhiYmNmYjcuLmU1ZWRjM2EgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYworKysgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfbmFtZV9vZmZzZXQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpzeW0pCiB7Ci0JY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCiAJaWYgKGxvb2t1cF9zeW1ib2xfbmFtZSgodW5zaWduZWQgbG9uZylzeW0sIHN5bW5hbWUpIDwgMCkKIAkJU0VRX3ByaW50ZihtLCAiPCVwPiIsIHN5bSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jIGIva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYwppbmRleCAzMjE2OTM3Li44ZWQ2MmZkIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAkgKiBOdW1iZXIgb2YgdGltZW91dCBldmVudHM6CiAJICovCiAJdW5zaWduZWQgbG9uZwkJY291bnQ7CisJdW5zaWduZWQgaW50CQl0aW1lcl9mbGFnOwogCiAJLyoKIAkgKiBXZSBzYXZlIHRoZSBjb21tYW5kLWxpbmUgc3RyaW5nIHRvIHByZXNlcnZlCkBAIC0yMzEsNyArMjMyLDggQEAKICAqIGluY3JlbWVudGVkLiBPdGhlcndpc2UgdGhlIHRpbWVyIGlzIHJlZ2lzdGVyZWQgaW4gYSBmcmVlIHNsb3QuCiAgKi8KIHZvaWQgdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHZvaWQgKnRpbWVyLCBwaWRfdCBwaWQsIHZvaWQgKnN0YXJ0ZiwKLQkJCSAgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqIGNvbW0pCisJCQkgICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKmNvbW0sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgdGltZXJfZmxhZykKIHsKIAkvKgogCSAqIEl0IGRvZXNudCBtYXR0ZXIgd2hpY2ggbG9jayB3ZSB0YWtlOgpAQCAtMjQ5LDYgKzI1MSw3IEBACiAJaW5wdXQuc3RhcnRfZnVuYyA9IHN0YXJ0ZjsKIAlpbnB1dC5leHBpcmVfZnVuYyA9IHRpbWVyZjsKIAlpbnB1dC5waWQgPSBwaWQ7CisJaW5wdXQudGltZXJfZmxhZyA9IHRpbWVyX2ZsYWc7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CiAJaWYgKCFhY3RpdmUpCkBAIC0yNjYsNyArMjY5LDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfbmFtZV9vZmZzZXQoc3RydWN0IHNlcV9maWxlICptLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCiAJaWYgKGxvb2t1cF9zeW1ib2xfbmFtZShhZGRyLCBzeW1uYW1lKSA8IDApCiAJCXNlcV9wcmludGYobSwgIjwlcD4iLCAodm9pZCAqKWFkZHIpOwpAQCAtMjk1LDcgKzI5OCw3IEBACiAJcGVyaW9kID0ga3RpbWVfdG9fdGltZXNwZWModGltZSk7CiAJbXMgPSBwZXJpb2QudHZfbnNlYyAvIDEwMDAwMDA7CiAKLQlzZXFfcHV0cyhtLCAiVGltZXIgU3RhdHMgVmVyc2lvbjogdjAuMVxuIik7CisJc2VxX3B1dHMobSwgIlRpbWVyIFN0YXRzIFZlcnNpb246IHYwLjJcbiIpOwogCXNlcV9wcmludGYobSwgIlNhbXBsZSBwZXJpb2Q6ICVsZC4lMDNsZCBzXG4iLCBwZXJpb2QudHZfc2VjLCBtcyk7CiAJaWYgKGF0b21pY19yZWFkKCZvdmVyZmxvd19jb3VudCkpCiAJCXNlcV9wcmludGYobSwgIk92ZXJmbG93OiAlZCBlbnRyaWVzXG4iLApAQCAtMzAzLDggKzMwNiwxMyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5yX2VudHJpZXM7IGkrKykgewogCQllbnRyeSA9IGVudHJpZXMgKyBpOwotCQlzZXFfcHJpbnRmKG0sICIlNGx1LCAlNWQgJS0xNnMgIiwKKyAJCWlmIChlbnRyeS0+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/CkBAIC0xMDI3LDYgKzEwMjQsMjQgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAorCXJldHVybiBtbWFwX3JlZ2lvbihmaWxlLCBhZGRyLCBsZW4sIGZsYWdzLCB2bV9mbGFncywgcGdvZmYsCisJCQkgICBhY2NvdW50YWJsZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRvX21tYXBfcGdvZmYpOworCit1bnNpZ25lZCBsb25nIG1tYXBfcmVnaW9uKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJICB1bnNpZ25lZCBpbnQgdm1fZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJCQkgIGludCBhY2NvdW50YWJsZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCAqcHJldjsKKwlpbnQgY29ycmVjdF93Y291bnQgPSAwOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnJiX2xpbmssICpyYl9wYXJlbnQ7CisJdW5zaWduZWQgbG9uZyBjaGFyZ2VkID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gIGZpbGUgPyBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlIDogTlVMTDsKKwogCS8qIENsZWFyIG9sZCBtYXBzICovCiAJZXJyb3IgPSAtRU5PTUVNOwogbXVubWFwX2JhY2s6CkBAIC0xMTc1LDggKzExOTAsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotRVhQT1JUX1NZTUJPTChkb19tbWFwX3Bnb2ZmKTsKLQogLyogR2V0IGFuIGFkZHJlc3MgcmFuZ2Ugd2hpY2ggaXMgY3VycmVudGx5IHVubWFwcGVkLgogICogRm9yIHNobWF0KCkgd2l0aCBhZGRyPTAuCiAgKgpkaWZmIC0tZ2l0IGEvbW0vbm9tbXUuYyBiL21tL25vbW11LmMKaW5kZXggOTg5ZTJlOS4uOGJiYmYxNCAxMDA2NDQKLS0tIGEvbW0vbm9tbXUuYworKysgYi9tbS9ub21tdS5jCkBAIC0zNjcsNiArMzY3LDExIEBACiAJcmV0dXJuIGZpbmRfdm1hKG1tLCBhZGRyKTsKIH0KIAoraW50IGV4cGFuZF9zdGFjayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiAtRU5PTUVNOworfQorCiAvKgogICogbG9vayB1cCB0aGUgZmlyc3QgVk1BIGV4YWN0bHkgdGhhdCBleGFjdGx5IG1hdGNoZXMgYWRkcgogICogLSBzaG91bGQgYmUgY2FsbGVkIHdpdGggbW0tPm1tYXBfc2VtIGF0IGxlYXN0IGhlbGQgcmVhZGxvY2tlZApkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggZWVjMTQ4MS4uODg2ZWEwZCAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC00NzYsMTUgKzQ3NiwxMyBAQAogICogc3lzY3RsIGhhbmRsZXIgZm9yIC9wcm9jL3N5cy92bS9kaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzCiAgKi8KIGludCBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzX2hhbmRsZXIoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKKwlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKIHsKIAlwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzKHRhYmxlLCB3cml0ZSwgZmlsZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwotCWlmIChkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWwpIHsKLQkJbW9kX3RpbWVyKCZ3Yl90aW1lciwKLQkJCWppZmZpZXMgKyBkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWwpOwotCQl9IGVsc2UgeworCWlmIChkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWwpCisJCW1vZF90aW1lcigmd2JfdGltZXIsIGppZmZpZXMgKyBkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWwpOworCWVsc2UKIAkJZGVsX3RpbWVyKCZ3Yl90aW1lcik7Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC04MjYsNiArODI0LDcgQEAKIAkJbWFwcGluZzIgPSBwYWdlX21hcHBpbmcocGFnZSk7CiAJCWlmIChtYXBwaW5nMikgeyAvKiBSYWNlIHdpdGggdHJ1bmNhdGU/ICovCiAJCQlCVUdfT04obWFwcGluZzIgIT0gbWFwcGluZyk7CisJCQlXQVJOX09OX09OQ0UoIVBhZ2VQcml2YXRlKHBhZ2UpICYmICFQYWdlVXB0b2RhdGUocGFnZSkpOwogCQkJaWYgKG1hcHBpbmdfY2FwX2FjY291bnRfZGlydHkobWFwcGluZykpIHsKIAkJCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9ESVJUWSk7CiAJCQkJdGFza19pb19hY2NvdW50X3dyaXRlKFBBR0VfQ0FDSEVfU0laRSk7CmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggMDVhY2U0NC4uZTJhMTBiOSAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtODAsOCArODAsOSBAQAogCSAyNTYsCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCSAzMgorCSAzMiwKICNlbmRpZgorCSAzMiwKIH07CiAKIEVYUE9SVF9TWU1CT0wodG90YWxyYW1fcGFnZXMpOwpAQCAtOTUsOCArOTYsOSBAQAogI2VuZGlmCiAJICJOb3JtYWwiLAogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JICJIaWdoTWVtIgorCSAiSGlnaE1lbSIsCiAjZW5kaWYKKwkgIk1vdmFibGUiLAogfTsKIAogaW50IG1pbl9mcmVlX2tieXRlcyA9IDEwMjQ7CkBAIC0xMjYsMTQgKzEyOCwyMSBAQAogICAgICNlbmRpZgogICAjZW5kaWYKIAotICBzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uIF9fbWVtaW5pdGRhdGEgZWFybHlfbm9kZV9tYXBbTUFYX0FDVElWRV9SRUdJT05TXTsKLSAgaW50IF9fbWVtaW5pdGRhdGEgbnJfbm9kZW1hcF9lbnRyaWVzOwotICB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bTUFYX05SX1pPTkVTXTsKLSAgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOworICBzdGF0aWMgc3RydWN0IG5vZGVfYWN0aXZlX3JlZ2lvbiBfX21lbWluaXRkYXRhIGVhcmx5X25vZGVfbWFwW01BWF9BQ1RJVkVfUkVHSU9OU107CisgIHN0YXRpYyBpbnQgX19tZW1pbml0ZGF0YSBucl9ub2RlbWFwX2VudHJpZXM7CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bTUFYX05SX1pPTkVTXTsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bTUFYX05SX1pPTkVTXTsKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfUkVTRVJWRQotICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bTUFYX05VTU5PREVTXTsKLSAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIG5vZGVfYm91bmRhcnlfZW5kX3BmbltNQVhfTlVNTk9ERVNdOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW01BWF9OVU1OT0RFU107CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9lbmRfcGZuW01BWF9OVU1OT0RFU107CiAjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHX1JFU0VSVkUgKi8KKyAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHJlcXVpcmVkX2tlcm5lbGNvcmU7CisgIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSByZXF1aXJlZF9tb3ZhYmxlY29yZTsKKyAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHpvbmVfbW92YWJsZV9wZm5bTUFYX05VTU5PREVTXTsKKworICAvKiBtb3ZhYmxlX3pvbmUgaXMgdGhlICJyZWFsIiB6b25lIHBhZ2VzIGluIFpPTkVfTU9WQUJMRSBhcmUgdGFrZW4gZnJvbSAqLworICBpbnQgbW92YWJsZV96b25lOworICBFWFBPUlRfU1lNQk9MKG1vdmFibGVfem9uZSk7CiAjZW5kaWYgLyogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQICovCiAKICNpZiBNQVhfTlVNTk9ERVMgPiAxCkBAIC05MDAsMTEgKzkwOSwxMyBAQAogCiAJdTMyIGlnbm9yZV9nZnBfaGlnaG1lbTsKIAl1MzIgaWdub3JlX2dmcF93YWl0OworCXUzMiBtaW5fb3JkZXI7CiAKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiAKIAlzdHJ1Y3QgZGVudHJ5ICppZ25vcmVfZ2ZwX2hpZ2htZW1fZmlsZTsKIAlzdHJ1Y3QgZGVudHJ5ICppZ25vcmVfZ2ZwX3dhaXRfZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICptaW5fb3JkZXJfZmlsZTsKIAogI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMgKi8KIApAQCAtOTEyLDYgKzkyMyw3IEBACiAJLmF0dHIgPSBGQVVMVF9BVFRSX0lOSVRJQUxJWkVSLAogCS5pZ25vcmVfZ2ZwX3dhaXQgPSAxLAogCS5pZ25vcmVfZ2ZwX2hpZ2htZW0gPSAxLAorCS5taW5fb3JkZXIgPSAxLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2V0dXBfZmFpbF9wYWdlX2FsbG9jKGNoYXIgKnN0cikKQEAgLTkyMiw2ICs5MzQsOCBAQAogCiBzdGF0aWMgaW50IHNob3VsZF9mYWlsX2FsbG9jX3BhZ2UoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcikKIHsKKwlpZiAob3JkZXIgPCBmYWlsX3BhZ2VfYWxsb2MubWluX29yZGVyKQorCQlyZXR1cm4gMDsKIAlpZiAoZ2ZwX21hc2sgJiBfX0dGUF9OT0ZBSUwpCiAJCXJldHVybiAwOwogCWlmIChmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtICYmIChnZnBfbWFzayAmIF9fR0ZQX0hJR0hNRU0pKQpAQCAtOTUzLDEyICs5NjcsMTcgQEAKIAlmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUgPQogCQlkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpZ25vcmUtZ2ZwLWhpZ2htZW0iLCBtb2RlLCBkaXIsCiAJCQkJICAgICAgJmZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW0pOworCWZhaWxfcGFnZV9hbGxvYy5taW5fb3JkZXJfZmlsZSA9CisJCWRlYnVnZnNfY3JlYXRlX3UzMigibWluLW9yZGVyIiwgbW9kZSwgZGlyLAorCQkJCSAgICZmYWlsX3BhZ2VfYWxsb2MubWluX29yZGVyKTsKIAogCWlmICghZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfd2FpdF9maWxlIHx8Ci0JCQkhZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlKSB7CisgICAgICAgICAgICAhZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlIHx8CisgICAgICAgICAgICAhZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcl9maWxlKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWRlYnVnZnNfcmVtb3ZlKGZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX3dhaXRfZmlsZSk7CiAJCWRlYnVnZnNfcmVtb3ZlKGZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW1fZmlsZSk7CisJCWRlYnVnZnNfcmVtb3ZlKGZhaWxfcGFnZV9hbGxvYy5taW5fb3JkZXJfZmlsZSk7CiAJCWNsZWFudXBfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbF9wYWdlX2FsbG9jLmF0dHIpOwogCX0KIApAQCAtMTMxNCw3ICsxMzMzLDcgQEAKIAlyZWNsYWltX3N0YXRlLnJlY2xhaW1lZF9zbGFiID0gMDsKIAlwLT5yZWNsYWltX3N0YXRlID0gJnJlY2xhaW1fc3RhdGU7CiAKLQlkaWRfc29tZV9wcm9ncmVzcyA9IHRyeV90b19mcmVlX3BhZ2VzKHpvbmVsaXN0LT56b25lcywgZ2ZwX21hc2spOworCWRpZF9zb21lX3Byb2dyZXNzID0gdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZWxpc3QtPnpvbmVzLCBvcmRlciwgZ2ZwX21hc2spOwogCiAJcC0+cmVjbGFpbV9zdGF0ZSA9IE5VTEw7CiAJcC0+ZmxhZ3MgJj0gflBGX01FTUFMTE9DOwpAQCAtMTM1MSw3ICsxMzcwLDggQEAKIAkgKi8KIAlkb19yZXRyeSA9IDA7CiAJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9OT1JFVFJZKSkgewotCQlpZiAoKG9yZGVyIDw9IDMpIHx8IChnZnBfbWFzayAmIF9fR0ZQX1JFUEVBVCkpCisJCWlmICgob3JkZXIgPD0gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpIHx8CisJCQkJCQkoZ2ZwX21hc2sgJiBfX0dGUF9SRVBFQVQpKQogCQkJZG9fcmV0cnkgPSAxOwogCQlpZiAoZ2ZwX21hc2sgJiBfX0dGUF9OT0ZBSUwpCiAJCQlkb19yZXRyeSA9IDE7CkBAIC0xNDY0LDEzICsxNDg0LDE0IEBACiB7CiAJcmV0dXJuIG5yX2ZyZWVfem9uZV9wYWdlcyhnZnBfem9uZShHRlBfVVNFUikpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobnJfZnJlZV9idWZmZXJfcGFnZXMpOwogCiAvKgogICogQW1vdW50IG9mIGZyZWUgUkFNIGFsbG9jYXRhYmxlIHdpdGhpbiBhbGwgem9uZXMKICAqLwogdW5zaWduZWQgaW50IG5yX2ZyZWVfcGFnZWNhY2hlX3BhZ2VzKHZvaWQpCiB7Ci0JcmV0dXJuIG5yX2ZyZWVfem9uZV9wYWdlcyhnZnBfem9uZShHRlBfSElHSFVTRVIpKTsKKwlyZXR1cm4gbnJfZnJlZV96b25lX3BhZ2VzKGdmcF96b25lKEdGUF9ISUdIVVNFUl9NT1ZBQkxFKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzaG93X25vZGUoc3RydWN0IHpvbmUgKnpvbmUpCkBAIC0xNjIxLDggKzE2NDIsOCBAQAogICoKICAqIEFkZCBhbGwgcG9wdWxhdGVkIHpvbmVzIG9mIGEgbm9kZSB0byB0aGUgem9uZWxpc3QuCiAgKi8KLXN0YXRpYyBpbnQgX19tZW1pbml0IGJ1aWxkX3pvbmVsaXN0c19ub2RlKHBnX2RhdGFfdCAqcGdkYXQsCi0JCQlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LCBpbnQgbnJfem9uZXMsIGVudW0gem9uZV90eXBlIHpvbmVfdHlwZSkKK3N0YXRpYyBpbnQgYnVpbGRfem9uZWxpc3RzX25vZGUocGdfZGF0YV90ICpwZ2RhdCwgc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwKKwkJCQlpbnQgbnJfem9uZXMsIGVudW0gem9uZV90eXBlIHpvbmVfdHlwZSkKIHsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIApAQCAtMTY0MSw5ICsxNjYyLDEwMiBAQAogCXJldHVybiBucl96b25lczsKIH0KIAorCisvKgorICogIHpvbmVsaXN0X29yZGVyOgorICogIDAgPSBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIGJldHRlciBvcmRlcmluZy4KKyAqICAxID0gb3JkZXIgYnkgKFtub2RlXSBkaXN0YW5jZSwgLXpvbmV0eXBlKQorICogIDIgPSBvcmRlciBieSAoLXpvbmV0eXBlLCBbbm9kZV0gZGlzdGFuY2UpCisgKgorICogIElmIG5vdCBOVU1BLCBaT05FTElTVF9PUkRFUl9aT05FIGFuZCBaT05FTElTVF9PUkRFUl9OT0RFIHdpbGwgY3JlYXRlCisgKiAgdGhlIHNhbWUgem9uZWxpc3QuIFNvIG9ubHkgTlVNQSBjYW4gY29uZmlndXJlIHRoaXMgcGFyYW0uCisgKi8KKyNkZWZpbmUgWk9ORUxJU1RfT1JERVJfREVGQVVMVCAgMAorI2RlZmluZSBaT05FTElTVF9PUkRFUl9OT0RFICAgICAxCisjZGVmaW5lIFpPTkVMSVNUX09SREVSX1pPTkUgICAgIDIKKworLyogem9uZWxpc3Qgb3JkZXIgaW4gdGhlIGtlcm5lbC4KKyAqIHNldF96b25lbGlzdF9vcmRlcigpIHdpbGwgc2V0IHRoaXMgdG8gTk9ERSBvciBaT05FLgorICovCitzdGF0aWMgaW50IGN1cnJlbnRfem9uZWxpc3Rfb3JkZXIgPSBaT05FTElTVF9PUkRFUl9ERUZBVUxUOworc3RhdGljIGNoYXIgem9uZWxpc3Rfb3JkZXJfbmFtZVszXVs4XSA9IHsiRGVmYXVsdCIsICJOb2RlIiwgIlpvbmUifTsKKworCiAjaWZkZWYgQ09ORklHX05VTUEKKy8qIFRoZSB2YWx1ZSB1c2VyIHNwZWNpZmllZCAuLi4uY2hhbmdlZCBieSBjb25maWcgKi8KK3N0YXRpYyBpbnQgdXNlcl96b25lbGlzdF9vcmRlciA9IFpPTkVMSVNUX09SREVSX0RFRkFVTFQ7CisvKiBzdHJpbmcgZm9yIHN5c2N0bCAqLworI2RlZmluZSBOVU1BX1pPTkVMSVNUX09SREVSX0xFTgkxNgorY2hhciBudW1hX3pvbmVsaXN0X29yZGVyWzE2XSA9ICJkZWZhdWx0IjsKKworLyoKKyAqIGludGVyZmFjZSBmb3IgY29uZmlndXJlIHpvbmVsaXN0IG9yZGVyaW5nLgorICogY29tbWFuZCBsaW5lIG9wdGlvbiAibnVtYV96b25lbGlzdF9vcmRlciIKKyAqCT0gIltkRF1lZmF1bHQJLSBkZWZhdWx0LCBhdXRvbWF0aWMgY29uZmlndXJhdGlvbi4KKyAqCT0gIltuTl1vZGUgCS0gb3JkZXIgYnkgbm9kZSBsb2NhbGl0eSwgdGhlbiBieSB6b25lIHdpdGhpbiBub2RlCisgKgk9ICJbelpdb25lICAgICAgLSBvcmRlciBieSB6b25lLCB0aGVuIGJ5IGxvY2FsaXR5IHdpdGhpbiB6b25lCisgKi8KKworc3RhdGljIGludCBfX3BhcnNlX251bWFfem9uZWxpc3Rfb3JkZXIoY2hhciAqcykKK3sKKwlpZiAoKnMgPT0gJ2QnIHx8ICpzID09ICdEJykgeworCQl1c2VyX3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfREVGQVVMVDsKKwl9IGVsc2UgaWYgKCpzID09ICduJyB8fCAqcyA9PSAnTicpIHsKKwkJdXNlcl96b25lbGlzdF9vcmRlciA9IFpPTkVMSVNUX09SREVSX05PREU7CisJfSBlbHNlIGlmICgqcyA9PSAneicgfHwgKnMgPT0gJ1onKSB7CisJCXVzZXJfem9uZWxpc3Rfb3JkZXIgPSBaT05FTElTVF9PUkRFUl9aT05FOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJJZ25vcmluZyBpbnZhbGlkIG51bWFfem9uZWxpc3Rfb3JkZXIgdmFsdWU6ICAiCisJCQkiJXNcbiIsIHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHNldHVwX251bWFfem9uZWxpc3Rfb3JkZXIoY2hhciAqcykKK3sKKwlpZiAocykKKwkJcmV0dXJuIF9fcGFyc2VfbnVtYV96b25lbGlzdF9vcmRlcihzKTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJudW1hX3pvbmVsaXN0X29yZGVyIiwgc2V0dXBfbnVtYV96b25lbGlzdF9vcmRlcik7CisKKy8qCisgKiBzeXNjdGwgaGFuZGxlciBmb3IgbnVtYV96b25lbGlzdF9vcmRlcgorICovCitpbnQgbnVtYV96b25lbGlzdF9vcmRlcl9oYW5kbGVyKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLAorCQlsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBzYXZlZF9zdHJpbmdbTlVNQV9aT05FTElTVF9PUkRFUl9MRU5dOworCWludCByZXQ7CisKKwlpZiAod3JpdGUpCisJCXN0cm5jcHkoc2F2ZWRfc3RyaW5nLCAoY2hhciopdGFibGUtPmRhdGEsCisJCQlOVU1BX1pPTkVMSVNUX09SREVSX0xFTik7CisJcmV0ID0gcHJvY19kb3N0cmluZyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh3cml0ZSkgeworCQlpbnQgb2xkdmFsID0gdXNlcl96b25lbGlzdF9vcmRlcjsKKwkJaWYgKF9fcGFyc2VfbnVtYV96b25lbGlzdF9vcmRlcigoY2hhciopdGFibGUtPmRhdGEpKSB7CisJCQkvKgorCQkJICogYm9ndXMgdmFsdWUuICByZXN0b3JlIHNhdmVkIHN0cmluZworCQkJICovCisJCQlzdHJuY3B5KChjaGFyKil0YWJsZS0+ZGF0YSwgc2F2ZWRfc3RyaW5nLAorCQkJCU5VTUFfWk9ORUxJU1RfT1JERVJfTEVOKTsKKwkJCXVzZXJfem9uZWxpc3Rfb3JkZXIgPSBvbGR2YWw7CisJCX0gZWxzZSBpZiAob2xkdmFsICE9IHVzZXJfem9uZWxpc3Rfb3JkZXIpCisJCQlidWlsZF9hbGxfem9uZWxpc3RzKCk7CisJfQorCXJldHVybiAwOworfQorCisKICNkZWZpbmUgTUFYX05PREVfTE9BRCAobnVtX29ubGluZV9ub2RlcygpKQotc3RhdGljIGludCBfX21lbWluaXRkYXRhIG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOworc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTsKKwogLyoqCiAgKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0CiAgKiBAbm9kZTogbm9kZSB3aG9zZSBmYWxsYmFjayBsaXN0IHdlJ3JlIGFwcGVuZGluZwpAQCAtMTY1OCw3ICsxNzcyLDcgQEAKICAqIG9uIHRoZW0gb3RoZXJ3aXNlLgogICogSXQgcmV0dXJucyAtMSBpZiBubyBub2RlIGlzIGZvdW5kLgogICovCi1zdGF0aWMgaW50IF9fbWVtaW5pdCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKK3N0YXRpYyBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spCiB7CiAJaW50IG4sIHZhbDsKIAlpbnQgbWluX3ZhbCA9IElOVF9NQVg7CkBAIC0xNzA0LDEzICsxODE4LDEyOSBAQAogCXJldHVybiBiZXN0X25vZGU7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtaW5pdCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKKworLyoKKyAqIEJ1aWxkIHpvbmVsaXN0cyBvcmRlcmVkIGJ5IG5vZGUgYW5kIHpvbmVzIHdpdGhpbiBub2RlLgorICogVGhpcyByZXN1bHRzIGluIG1heGltdW0gbG9jYWxpdHktLW5vcm1hbCB6b25lIG92ZXJmbG93cyBpbnRvIGxvY2FsCisgKiBETUEgem9uZSwgaWYgYW55LS1idXQgcmlza3MgZXhoYXVzdGluZyBETUEgem9uZS4KKyAqLworc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdfZGF0YV90ICpwZ2RhdCwgaW50IG5vZGUpCiB7Ci0JaW50IGosIG5vZGUsIGxvY2FsX25vZGU7CiAJZW51bSB6b25lX3R5cGUgaTsKLQlpbnQgcHJldl9ub2RlLCBsb2FkOworCWludCBqOwogCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspIHsKKwkJem9uZWxpc3QgPSBwZ2RhdC0+bm9kZV96b25lbGlzdHMgKyBpOworCQlmb3IgKGogPSAwOyB6b25lbGlzdC0+em9uZXNbal0gIT0gTlVMTDsgaisrKQorCQkJOworIAkJaiA9IGJ1aWxkX3pvbmVsaXN0c19ub2RlKE5PREVfREFUQShub2RlKSwgem9uZWxpc3QsIGosIGkpOworCQl6b25lbGlzdC0+em9uZXNbal0gPSBOVUxMOworCX0KK30KKworLyoKKyAqIEJ1aWxkIHpvbmVsaXN0cyBvcmRlcmVkIGJ5IHpvbmUgYW5kIG5vZGVzIHdpdGhpbiB6b25lcy4KKyAqIFRoaXMgcmVzdWx0cyBpbiBjb25zZXJ2aW5nIERNQSB6b25lW3NdIHVudGlsIGFsbCBOb3JtYWwgbWVtb3J5IGlzCisgKiBleGhhdXN0ZWQsIGJ1dCByZXN1bHRzIGluIG92ZXJmbG93aW5nIHRvIHJlbW90ZSBub2RlIHdoaWxlIG1lbW9yeQorICogbWF5IHN0aWxsIGV4aXN0IGluIGxvY2FsIERNQSB6b25lLgorICovCitzdGF0aWMgaW50IG5vZGVfb3JkZXJbTUFYX05VTU5PREVTXTsKKworc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzX2luX3pvbmVfb3JkZXIocGdfZGF0YV90ICpwZ2RhdCwgaW50IG5yX25vZGVzKQoreworCWVudW0gem9uZV90eXBlIGk7CisJaW50IHBvcywgaiwgbm9kZTsKKwlpbnQgem9uZV90eXBlOwkJLyogbmVlZHMgdG8gYmUgc2lnbmVkICovCisJc3RydWN0IHpvbmUgKno7CisJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgeworCQl6b25lbGlzdCA9IHBnZGF0LT5ub2RlX3pvbmVsaXN0cyArIGk7CisJCXBvcyA9IDA7CisJCWZvciAoem9uZV90eXBlID0gaTsgem9uZV90eXBlID49IDA7IHpvbmVfdHlwZS0tKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgbnJfbm9kZXM7IGorKykgeworCQkJCW5vZGUgPSBub2RlX29yZGVyW2pdOworCQkJCXogPSAmTk9ERV9EQVRBKG5vZGUpLT5ub2RlX3pvbmVzW3pvbmVfdHlwZV07CisJCQkJaWYgKHBvcHVsYXRlZF96b25lKHopKSB7CisJCQkJCXpvbmVsaXN0LT56b25lc1twb3MrK10gPSB6OworCQkJCQljaGVja19oaWdoZXN0X3pvbmUoem9uZV90eXBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJem9uZWxpc3QtPnpvbmVzW3Bvc10gPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBkZWZhdWx0X3pvbmVsaXN0X29yZGVyKHZvaWQpCit7CisJaW50IG5pZCwgem9uZV90eXBlOworCXVuc2lnbmVkIGxvbmcgbG93X2ttZW1fc2l6ZSx0b3RhbF9zaXplOworCXN0cnVjdCB6b25lICp6OworCWludCBhdmVyYWdlX3NpemU7CisJLyoKKyAgICAgICAgICogWk9ORV9ETUEgYW5kIFpPTkVfRE1BMzIgY2FuIGJlIHZlcnkgc21hbGwgYXJlYSBpbiB0aGUgc3l0ZW0uCisJICogSWYgdGhleSBhcmUgcmVhbGx5IHNtYWxsIGFuZCB1c2VkIGhlYXZpbHksIHRoZSBzeXN0ZW0gY2FuIGZhbGwKKwkgKiBpbnRvIE9PTSB2ZXJ5IGVhc2lseS4KKwkgKiBUaGlzIGZ1bmN0aW9uIGRldGVjdCBaT05FX0RNQS9ETUEzMiBzaXplIGFuZCBjb25mZ2lndXJlcyB6b25lIG9yZGVyLgorCSAqLworCS8qIElzIHRoZXJlIFpPTkVfTk9STUFMID8gKGV4LiBwcGMgaGFzIG9ubHkgRE1BIHpvbmUuLikgKi8KKwlsb3dfa21lbV9zaXplID0gMDsKKwl0b3RhbF9zaXplID0gMDsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJZm9yICh6b25lX3R5cGUgPSAwOyB6b25lX3R5cGUgPCBNQVhfTlJfWk9ORVM7IHpvbmVfdHlwZSsrKSB7CisJCQl6ID0gJk5PREVfREFUQShuaWQpLT5ub2RlX3pvbmVzW3pvbmVfdHlwZV07CisJCQlpZiAocG9wdWxhdGVkX3pvbmUoeikpIHsKKwkJCQlpZiAoem9uZV90eXBlIDwgWk9ORV9OT1JNQUwpCisJCQkJCWxvd19rbWVtX3NpemUgKz0gei0+cHJlc2VudF9wYWdlczsKKwkJCQl0b3RhbF9zaXplICs9IHotPnByZXNlbnRfcGFnZXM7CisJCQl9CisJCX0KKwl9CisJaWYgKCFsb3dfa21lbV9zaXplIHx8ICAvKiB0aGVyZSBhcmUgbm8gRE1BIGFyZWEuICovCisJICAgIGxvd19rbWVtX3NpemUgPiB0b3RhbF9zaXplLzIpIC8qIERNQS9ETUEzMiBpcyBiaWcuICovCisJCXJldHVybiBaT05FTElTVF9PUkRFUl9OT0RFOworCS8qCisJICogbG9vayBpbnRvIGVhY2ggbm9kZSdzIGNvbmZpZy4KKyAgCSAqIElmIHRoZXJlIGlzIGEgbm9kZSB3aG9zZSBETUEvRE1BMzIgbWVtb3J5IGlzIHZlcnkgYmlnIGFyZWEgb24KKyAJICogbG9jYWwgbWVtb3J5LCBOT0RFX09SREVSIG1heSBiZSBzdWl0YWJsZS4KKyAgICAgICAgICovCisJYXZlcmFnZV9zaXplID0gdG90YWxfc2l6ZSAvIChudW1fb25saW5lX25vZGVzKCkgKyAxKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJbG93X2ttZW1fc2l6ZSA9IDA7CisJCXRvdGFsX3NpemUgPSAwOworCQlmb3IgKHpvbmVfdHlwZSA9IDA7IHpvbmVfdHlwZSA8IE1BWF9OUl9aT05FUzsgem9uZV90eXBlKyspIHsKKwkJCXogPSAmTk9ERV9EQVRBKG5pZCktPm5vZGVfem9uZXNbem9uZV90eXBlXTsKKwkJCWlmIChwb3B1bGF0ZWRfem9uZSh6KSkgeworCQkJCWlmICh6b25lX3R5cGUgPCBaT05FX05PUk1BTCkKKwkJCQkJbG93X2ttZW1fc2l6ZSArPSB6LT5wcmVzZW50X3BhZ2VzOworCQkJCXRvdGFsX3NpemUgKz0gei0+cHJlc2VudF9wYWdlczsKKwkJCX0KKwkJfQorCQlpZiAobG93X2ttZW1fc2l6ZSAmJgorCQkgICAgdG90YWxfc2l6ZSA+IGF2ZXJhZ2Vfc2l6ZSAmJiAvKiBpZ25vcmUgc21hbGwgbm9kZSAqLworCQkgICAgbG93X2ttZW1fc2l6ZSA+IHRvdGFsX3NpemUgKiA3MC8xMDApCisJCQlyZXR1cm4gWk9ORUxJU1RfT1JERVJfTk9ERTsKKwl9CisJcmV0dXJuIFpPTkVMSVNUX09SREVSX1pPTkU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF96b25lbGlzdF9vcmRlcih2b2lkKQoreworCWlmICh1c2VyX3pvbmVsaXN0X29yZGVyID09IFpPTkVMSVNUX09SREVSX0RFRkFVTFQpCisJCWN1cnJlbnRfem9uZWxpc3Rfb3JkZXIgPSBkZWZhdWx0X3pvbmVsaXN0X29yZGVyKCk7CisJZWxzZQorCQljdXJyZW50X3pvbmVsaXN0X29yZGVyID0gdXNlcl96b25lbGlzdF9vcmRlcjsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCit7CisJaW50IGosIG5vZGUsIGxvYWQ7CisJZW51bSB6b25lX3R5cGUgaTsKIAlub2RlbWFza190IHVzZWRfbWFzazsKKwlpbnQgbG9jYWxfbm9kZSwgcHJldl9ub2RlOworCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3Q7CisJaW50IG9yZGVyID0gY3VycmVudF96b25lbGlzdF9vcmRlcjsKIAogCS8qIGluaXRpYWxpemUgem9uZWxpc3RzICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CkBAIC0xNzIzLDYgKzE5NTMsMTEgQEAKIAlsb2FkID0gbnVtX29ubGluZV9ub2RlcygpOwogCXByZXZfbm9kZSA9IGxvY2FsX25vZGU7CiAJbm9kZXNfY2xlYXIodXNlZF9tYXNrKTsKKworCW1lbXNldChub2RlX2xvYWQsIDAsIHNpemVvZihub2RlX2xvYWQpKTsKKwltZW1zZXQobm9kZV9vcmRlciwgMCwgc2l6ZW9mKG5vZGVfb3JkZXIpKTsKKwlqID0gMDsKKwogCXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgJnVzZWRfbWFzaykpID49IDApIHsKIAkJaW50IGRpc3RhbmNlID0gbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBub2RlKTsKIApAQCAtMTczOCwyMyArMTk3MywyNSBAQAogCQkgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lCiAJCSAqIGRpc3RhbmNlIGdyb3VwIHRvIG1ha2UgaXQgcm91bmQtcm9iaW4uCiAJCSAqLwotCiAJCWlmIChkaXN0YW5jZSAhPSBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpCi0JCQlub2RlX2xvYWRbbm9kZV0gKz0gbG9hZDsKKwkJCW5vZGVfbG9hZFtub2RlXSA9IGxvYWQ7CisKIAkJcHJldl9ub2RlID0gbm9kZTsKIAkJbG9hZC0tOwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspIHsKLQkJCXpvbmVsaXN0ID0gcGdkYXQtPm5vZGVfem9uZWxpc3RzICsgaTsKLQkJCWZvciAoaiA9IDA7IHpvbmVsaXN0LT56b25lc1tqXSAhPSBOVUxMOyBqKyspOworCQlpZiAob3JkZXIgPT0gWk9ORUxJU1RfT1JERVJfTk9ERSkKKwkJCWJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnZGF0LCBub2RlKTsKKwkJZWxzZQorCQkJbm9kZV9vcmRlcltqKytdID0gbm9kZTsJLyogcmVtZW1iZXIgb3JkZXIgKi8KKwl9CiAKLQkgCQlqID0gYnVpbGRfem9uZWxpc3RzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lbGlzdCwgaiwgaSk7Ci0JCQl6b25lbGlzdC0+em9uZXNbal0gPSBOVUxMOwotCQl9CisJaWYgKG9yZGVyID09IFpPTkVMSVNUX09SREVSX1pPTkUpIHsKKwkJLyogY2FsY3VsYXRlIG5vZGUgb3JkZXIgLS0gaS5lLiwgRE1BIGxhc3QhICovCisJCWJ1aWxkX3pvbmVsaXN0c19pbl96b25lX29yZGVyKHBnZGF0LCBqKTsKIAl9CiB9CiAKIC8qIENvbnN0cnVjdCB0aGUgem9uZWxpc3QgcGVyZm9ybWFuY2UgY2FjaGUgLSBzZWUgZnVydGhlciBtbXpvbmUuaCAqLwotc3RhdGljIHZvaWQgX19tZW1pbml0IGJ1aWxkX3pvbmVsaXN0X2NhY2hlKHBnX2RhdGFfdCAqcGdkYXQpCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdF9jYWNoZShwZ19kYXRhX3QgKnBnZGF0KQogewogCWludCBpOwogCkBAIC0xNzcxLDkgKzIwMDgsMTUgQEAKIAl9CiB9CiAKKwogI2Vsc2UJLyogQ09ORklHX05VTUEgKi8KIAotc3RhdGljIHZvaWQgX19tZW1pbml0IGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQorc3RhdGljIHZvaWQgc2V0X3pvbmVsaXN0X29yZGVyKHZvaWQpCit7CisJY3VycmVudF96b25lbGlzdF9vcmRlciA9IFpPTkVMSVNUX09SREVSX1pPTkU7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQogewogCWludCBub2RlLCBsb2NhbF9ub2RlOwogCWVudW0gem9uZV90eXBlIGksajsKQEAgLTE4MDksNyArMjA1Miw3IEBACiB9CiAKIC8qIG5vbi1OVU1BIHZhcmlhbnQgb2Ygem9uZWxpc3QgcGVyZm9ybWFuY2UgY2FjaGUgLSBqdXN0IE5VTEwgemxjYWNoZV9wdHIgKi8KLXN0YXRpYyB2b2lkIF9fbWVtaW5pdCBidWlsZF96b25lbGlzdF9jYWNoZShwZ19kYXRhX3QgKnBnZGF0KQorc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RfY2FjaGUocGdfZGF0YV90ICpwZ2RhdCkKIHsKIAlpbnQgaTsKIApAQCAtMTgyMCw3ICsyMDYzLDcgQEAKICNlbmRpZgkvKiBDT05GSUdfTlVNQSAqLwogCiAvKiByZXR1cm4gdmFsdWVzIGludCAuLi4uanVzdCBmb3Igc3RvcF9tYWNoaW5lX3J1bigpICovCi1zdGF0aWMgaW50IF9fbWVtaW5pdCBfX2J1aWxkX2FsbF96b25lbGlzdHModm9pZCAqZHVtbXkpCitzdGF0aWMgaW50IF9fYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkICpkdW1teSkKIHsKIAlpbnQgbmlkOwogCkBAIC0xODMxLDggKzIwNzQsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX21lbWluaXQgYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkKQordm9pZCBidWlsZF9hbGxfem9uZWxpc3RzKHZvaWQpCiB7CisJc2V0X3pvbmVsaXN0X29yZGVyKCk7CisKIAlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7CiAJCV9fYnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTsKIAkJY3B1c2V0X2luaXRfY3VycmVudF9tZW1zX2FsbG93ZWQoKTsKQEAgLTE4NDMsOCArMjA4OCwxMyBAQAogCQkvKiBjcHVzZXQgcmVmcmVzaCByb3V0aW5lIHNob3VsZCBiZSBoZXJlICovCiAJfQogCXZtX3RvdGFsX3BhZ2VzID0gbnJfZnJlZV9wYWdlY2FjaGVfcGFnZXMoKTsKLQlwcmludGsoIkJ1aWx0ICVpIHpvbmVsaXN0cy4gIFRvdGFsIHBhZ2VzOiAlbGRcbiIsCi0JCQludW1fb25saW5lX25vZGVzKCksIHZtX3RvdGFsX3BhZ2VzKTsKKwlwcmludGsoIkJ1aWx0ICVpIHpvbmVsaXN0cyBpbiAlcyBvcmRlci4gIFRvdGFsIHBhZ2VzOiAlbGRcbiIsCisJCQludW1fb25saW5lX25vZGVzKCksCisJCQl6b25lbGlzdF9vcmRlcl9uYW1lW2N1cnJlbnRfem9uZWxpc3Rfb3JkZXJdLAorCQkJdm1fdG90YWxfcGFnZXMpOworI2lmZGVmIENPTkZJR19OVU1BCisJcHJpbnRrKCJQb2xpY3kgem9uZTogJXNcbiIsIHpvbmVfbmFtZXNbcG9saWN5X3pvbmVdKTsKKyNlbmRpZgogfQogCiAvKgpAQCAtMTk1Myw4ICsyMjAzLDggQEAKIAl9CiB9CiAKLXZvaWQgem9uZV9pbml0X2ZyZWVfbGlzdHMoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwgc3RydWN0IHpvbmUgKnpvbmUsCi0JCQkJdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIHZvaWQgX19tZW1pbml0IHpvbmVfaW5pdF9mcmVlX2xpc3RzKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCisJCQkJc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpbnQgb3JkZXI7CiAJZm9yIChvcmRlciA9IDA7IG9yZGVyIDwgTUFYX09SREVSIDsgb3JkZXIrKykgewpAQCAtMjM3MCw3ICsyNjIwLDcgQEAKIH0KIAogLyogSWYgbmVjZXNzYXJ5LCBwdXNoIHRoZSBub2RlIGJvdW5kYXJ5IG91dCBmb3IgcmVzZXJ2ZSBob3RhZGQgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBhY2NvdW50X25vZGVfYm91bmRhcnkodW5zaWduZWQgaW50IG5pZCwKK3N0YXRpYyB2b2lkIF9fbWVtaW5pdCBhY2NvdW50X25vZGVfYm91bmRhcnkodW5zaWduZWQgaW50IG5pZCwKIAkJdW5zaWduZWQgbG9uZyAqc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nICplbmRfcGZuKQogewogCXByaW50ayhLRVJOX0RFQlVHICJFbnRlcmluZyBhY2NvdW50X25vZGVfYm91bmRhcnkoJXUsICVsdSwgJWx1KVxuIiwKQEAgLTIzOTAsNyArMjY0MCw3IEBACiB2b2lkIF9faW5pdCBwdXNoX25vZGVfYm91bmRhcmllcyh1bnNpZ25lZCBpbnQgbmlkLAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKSB7fQogCi1zdGF0aWMgdm9pZCBfX2luaXQgYWNjb3VudF9ub2RlX2JvdW5kYXJ5KHVuc2lnbmVkIGludCBuaWQsCitzdGF0aWMgdm9pZCBfX21lbWluaXQgYWNjb3VudF9ub2RlX2JvdW5kYXJ5KHVuc2lnbmVkIGludCBuaWQsCiAJCXVuc2lnbmVkIGxvbmcgKnN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyAqZW5kX3Bmbikge30KICNlbmRpZgogCkBAIC0yNDI4LDEwICsyNjc4LDY3IEBACiB9CiAKIC8qCisgKiBUaGlzIGZpbmRzIGEgem9uZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBaT05FX01PVkFCTEUgcGFnZXMuIFRoZQorICogYXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQgem9uZXMgd2l0aGluIGEgbm9kZSBhcmUgb3JkZXJlZCBpbiBtb25vdG9uaWMKKyAqIGluY3JlYXNpbmcgbWVtb3J5IGFkZHJlc3NlcyBzbyB0aGF0IHRoZSAiaGlnaGVzdCIgcG9wdWxhdGVkIHpvbmUgaXMgdXNlZAorICovCit2b2lkIF9faW5pdCBmaW5kX3VzYWJsZV96b25lX2Zvcl9tb3ZhYmxlKHZvaWQpCit7CisJaW50IHpvbmVfaW5kZXg7CisJZm9yICh6b25lX2luZGV4ID0gTUFYX05SX1pPTkVTIC0gMTsgem9uZV9pbmRleCA+PSAwOyB6b25lX2luZGV4LS0pIHsKKwkJaWYgKHpvbmVfaW5kZXggPT0gWk9ORV9NT1ZBQkxFKQorCQkJY29udGludWU7CisKKwkJaWYgKGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3Bmblt6b25lX2luZGV4XSA+CisJCQkJYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bem9uZV9pbmRleF0pCisJCQlicmVhazsKKwl9CisKKwlWTV9CVUdfT04oem9uZV9pbmRleCA9PSAtMSk7CisJbW92YWJsZV96b25lID0gem9uZV9pbmRleDsKK30KKworLyoKKyAqIFRoZSB6b25lIHJhbmdlcyBwcm92aWRlZCBieSB0aGUgYXJjaGl0ZWN0dXJlIGRvIG5vdCBpbmNsdWRlIFpPTkVfTU9WQUJMRQorICogYmVjYXVzZSBpdCBpcyBzaXplZCBpbmRlcGVuZGFudCBvZiBhcmNoaXRlY3R1cmUuIFVubGlrZSB0aGUgb3RoZXIgem9uZXMsCisgKiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIFpPTkVfTU9WQUJMRSBpcyBub3QgZml4ZWQuIEl0IG1heSBiZSBkaWZmZXJlbnQKKyAqIGluIGVhY2ggbm9kZSBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgZWFjaCBub2RlIGFuZCBob3cgZXZlbmx5IGtlcm5lbGNvcmUKKyAqIGlzIGRpc3RyaWJ1dGVkLiBUaGlzIGhlbHBlciBmdW5jdGlvbiBhZGp1c3RzIHRoZSB6b25lIHJhbmdlcworICogcHJvdmlkZWQgYnkgdGhlIGFyY2hpdGVjdHVyZSBmb3IgYSBnaXZlbiBub2RlIGJ5IHVzaW5nIHRoZSBlbmQgb2YgdGhlCisgKiBoaWdoZXN0IHVzYWJsZSB6b25lIGZvciBaT05FX01PVkFCTEUuIFRoaXMgcHJlc2VydmVzIHRoZSBhc3N1bXB0aW9uIHRoYXQKKyAqIHpvbmVzIHdpdGhpbiBhIG5vZGUgYXJlIGluIG9yZGVyIG9mIG1vbm90b25pYyBpbmNyZWFzZXMgbWVtb3J5IGFkZHJlc3NlcworICovCit2b2lkIF9fbWVtaW5pdCBhZGp1c3Rfem9uZV9yYW5nZV9mb3Jfem9uZV9tb3ZhYmxlKGludCBuaWQsCisJCQkJCXVuc2lnbmVkIGxvbmcgem9uZV90eXBlLAorCQkJCQl1bnNpZ25lZCBsb25nIG5vZGVfc3RhcnRfcGZuLAorCQkJCQl1bnNpZ25lZCBsb25nIG5vZGVfZW5kX3BmbiwKKwkJCQkJdW5zaWduZWQgbG9uZyAqem9uZV9zdGFydF9wZm4sCisJCQkJCXVuc2lnbmVkIGxvbmcgKnpvbmVfZW5kX3BmbikKK3sKKwkvKiBPbmx5IGFkanVzdCBpZiBaT05FX01PVkFCTEUgaXMgb24gdGhpcyBub2RlICovCisJaWYgKHpvbmVfbW92YWJsZV9wZm5bbmlkXSkgeworCQkvKiBTaXplIFpPTkVfTU9WQUJMRSAqLworCQlpZiAoem9uZV90eXBlID09IFpPTkVfTU9WQUJMRSkgeworCQkJKnpvbmVfc3RhcnRfcGZuID0gem9uZV9tb3ZhYmxlX3BmbltuaWRdOworCQkJKnpvbmVfZW5kX3BmbiA9IG1pbihub2RlX2VuZF9wZm4sCisJCQkJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW21vdmFibGVfem9uZV0pOworCisJCS8qIEFkanVzdCBmb3IgWk9ORV9NT1ZBQkxFIHN0YXJ0aW5nIHdpdGhpbiB0aGlzIHJhbmdlICovCisJCX0gZWxzZSBpZiAoKnpvbmVfc3RhcnRfcGZuIDwgem9uZV9tb3ZhYmxlX3BmbltuaWRdICYmCisJCQkJKnpvbmVfZW5kX3BmbiA+IHpvbmVfbW92YWJsZV9wZm5bbmlkXSkgeworCQkJKnpvbmVfZW5kX3BmbiA9IHpvbmVfbW92YWJsZV9wZm5bbmlkXTsKKworCQkvKiBDaGVjayBpZiB0aGlzIHdob2xlIHJhbmdlIGlzIHdpdGhpbiBaT05FX01PVkFCTEUgKi8KKwkJfSBlbHNlIGlmICgqem9uZV9zdGFydF9wZm4gPj0gem9uZV9tb3ZhYmxlX3BmbltuaWRdKQorCQkJKnpvbmVfc3RhcnRfcGZuID0gKnpvbmVfZW5kX3BmbjsKKwl9Cit9CisKKy8qCiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhIHpvbmUgc3BhbnMgaW4gYSBub2RlLCBpbmNsdWRpbmcgaG9sZXMKICAqIHByZXNlbnRfcGFnZXMgPSB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZSgpIC0gem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZSgpCiAgKi8KLXVuc2lnbmVkIGxvbmcgX19tZW1pbml0IHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKGludCBuaWQsCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXQgem9uZV9zcGFubmVkX3BhZ2VzX2luX25vZGUoaW50IG5pZCwKIAkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3R5cGUsCiAJCQkJCXVuc2lnbmVkIGxvbmcgKmlnbm9yZWQpCiB7CkBAIC0yNDQyLDYgKzI3NDksOSBAQAogCWdldF9wZm5fcmFuZ2VfZm9yX25pZChuaWQsICZub2RlX3N0YXJ0X3BmbiwgJm5vZGVfZW5kX3Bmbik7CiAJem9uZV9zdGFydF9wZm4gPSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3Bmblt6b25lX3R5cGVdOwogCXpvbmVfZW5kX3BmbiA9IGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3Bmblt6b25lX3R5cGVdOworCWFkanVzdF96b25lX3JhbmdlX2Zvcl96b25lX21vdmFibGUobmlkLCB6b25lX3R5cGUsCisJCQkJbm9kZV9zdGFydF9wZm4sIG5vZGVfZW5kX3BmbiwKKwkJCQkmem9uZV9zdGFydF9wZm4sICZ6b25lX2VuZF9wZm4pOwogCiAJLyogQ2hlY2sgdGhhdCB0aGlzIG5vZGUgaGFzIHBhZ2VzIHdpdGhpbiB0aGUgem9uZSdzIHJlcXVpcmVkIHJhbmdlICovCiAJaWYgKHpvbmVfZW5kX3BmbiA8IG5vZGVfc3RhcnRfcGZuIHx8IHpvbmVfc3RhcnRfcGZuID4gbm9kZV9lbmRfcGZuKQpAQCAtMjUxOSw3ICsyODI5LDcgQEAKIH0KIAogLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZSBmcmFtZXMgaW4gaG9sZXMgaW4gYSB6b25lIG9uIGEgbm9kZSAqLwotdW5zaWduZWQgbG9uZyBfX21lbWluaXQgem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0IHpvbmVfYWJzZW50X3BhZ2VzX2luX25vZGUoaW50IG5pZCwKIAkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3R5cGUsCiAJCQkJCXVuc2lnbmVkIGxvbmcgKmlnbm9yZWQpCiB7CkBAIC0yNTMyLDE4ICsyODQyLDIxIEBACiAJem9uZV9lbmRfcGZuID0gbWluKGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3Bmblt6b25lX3R5cGVdLAogCQkJCQkJCW5vZGVfZW5kX3Bmbik7CiAKKwlhZGp1c3Rfem9uZV9yYW5nZV9mb3Jfem9uZV9tb3ZhYmxlKG5pZCwgem9uZV90eXBlLAorCQkJbm9kZV9zdGFydF9wZm4sIG5vZGVfZW5kX3BmbiwKKwkJCSZ6b25lX3N0YXJ0X3BmbiwgJnpvbmVfZW5kX3Bmbik7CiAJcmV0dXJuIF9fYWJzZW50X3BhZ2VzX2luX3JhbmdlKG5pZCwgem9uZV9zdGFydF9wZm4sIHpvbmVfZW5kX3Bmbik7CiB9CiAKICNlbHNlCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgem9uZV9zcGFubmVkX3BhZ2VzX2luX25vZGUoaW50IG5pZCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX21lbWluaXQgem9uZV9zcGFubmVkX3BhZ2VzX2luX25vZGUoaW50IG5pZCwKIAkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3R5cGUsCiAJCQkJCXVuc2lnbmVkIGxvbmcgKnpvbmVzX3NpemUpCiB7CiAJcmV0dXJuIHpvbmVzX3NpemVbem9uZV90eXBlXTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHpvbmVfYWJzZW50X3BhZ2VzX2luX25vZGUoaW50IG5pZCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX21lbWluaXQgem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAogCQkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3R5cGUsCiAJCQkJCQl1bnNpZ25lZCBsb25nICp6aG9sZXNfc2l6ZSkKIHsKQEAgLTI5MDksNiArMzIyMiwxNTcgQEAKIAlyZXR1cm4gbWF4X3BmbjsKIH0KIAordW5zaWduZWQgbG9uZyBfX2luaXQgZWFybHlfY2FsY3VsYXRlX3RvdGFscGFnZXModm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHRvdGFscGFnZXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5yX25vZGVtYXBfZW50cmllczsgaSsrKQorCQl0b3RhbHBhZ2VzICs9IGVhcmx5X25vZGVfbWFwW2ldLmVuZF9wZm4gLQorCQkJCQkJZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuOworCisJcmV0dXJuIHRvdGFscGFnZXM7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBQRk4gdGhlIE1vdmFibGUgem9uZSBiZWdpbnMgaW4gZWFjaCBub2RlLiBLZXJuZWwgbWVtb3J5CisgKiBpcyBzcHJlYWQgZXZlbmx5IGJldHdlZW4gbm9kZXMgYXMgbG9uZyBhcyB0aGUgbm9kZXMgaGF2ZSBlbm91Z2gKKyAqIG1lbW9yeS4gV2hlbiB0aGV5IGRvbid0LCBzb21lIG5vZGVzIHdpbGwgaGF2ZSBtb3JlIGtlcm5lbGNvcmUgdGhhbgorICogb3RoZXJzCisgKi8KK3ZvaWQgX19pbml0IGZpbmRfem9uZV9tb3ZhYmxlX3BmbnNfZm9yX25vZGVzKHVuc2lnbmVkIGxvbmcgKm1vdmFibGVfcGZuKQoreworCWludCBpLCBuaWQ7CisJdW5zaWduZWQgbG9uZyB1c2FibGVfc3RhcnRwZm47CisJdW5zaWduZWQgbG9uZyBrZXJuZWxjb3JlX25vZGUsIGtlcm5lbGNvcmVfcmVtYWluaW5nOworCWludCB1c2FibGVfbm9kZXMgPSBudW1fb25saW5lX25vZGVzKCk7CisKKwkvKgorCSAqIElmIG1vdmFibGVjb3JlIHdhcyBzcGVjaWZpZWQsIGNhbGN1bGF0ZSB3aGF0IHNpemUgb2YKKwkgKiBrZXJuZWxjb3JlIHRoYXQgY29ycmVzcG9uZHMgc28gdGhhdCBtZW1vcnkgdXNhYmxlIGZvcgorCSAqIGFueSBhbGxvY2F0aW9uIHR5cGUgaXMgZXZlbmx5IHNwcmVhZC4gSWYgYm90aCBrZXJuZWxjb3JlCisJICogYW5kIG1vdmFibGVjb3JlIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHZhbHVlIG9mIGtlcm5lbGNvcmUKKwkgKiB3aWxsIGJlIHVzZWQgZm9yIHJlcXVpcmVkX2tlcm5lbGNvcmUgaWYgaXQncyBncmVhdGVyIHRoYW4KKwkgKiB3aGF0IG1vdmFibGVjb3JlIHdvdWxkIGhhdmUgYWxsb3dlZC4KKwkgKi8KKwlpZiAocmVxdWlyZWRfbW92YWJsZWNvcmUpIHsKKwkJdW5zaWduZWQgbG9uZyB0b3RhbHBhZ2VzID0gZWFybHlfY2FsY3VsYXRlX3RvdGFscGFnZXMoKTsKKwkJdW5zaWduZWQgbG9uZyBjb3JlcGFnZXM7CisKKwkJLyoKKwkJICogUm91bmQtdXAgc28gdGhhdCBaT05FX01PVkFCTEUgaXMgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgd2hhdAorCQkgKiB3YXMgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyCisJCSAqLworCQlyZXF1aXJlZF9tb3ZhYmxlY29yZSA9CisJCQlyb3VuZHVwKHJlcXVpcmVkX21vdmFibGVjb3JlLCBNQVhfT1JERVJfTlJfUEFHRVMpOworCQljb3JlcGFnZXMgPSB0b3RhbHBhZ2VzIC0gcmVxdWlyZWRfbW92YWJsZWNvcmU7CisKKwkJcmVxdWlyZWRfa2VybmVsY29yZSA9IG1heChyZXF1aXJlZF9rZXJuZWxjb3JlLCBjb3JlcGFnZXMpOworCX0KKworCS8qIElmIGtlcm5lbGNvcmUgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZXJlIGlzIG5vIFpPTkVfTU9WQUJMRSAqLworCWlmICghcmVxdWlyZWRfa2VybmVsY29yZSkKKwkJcmV0dXJuOworCisJLyogdXNhYmxlX3N0YXJ0cGZuIGlzIHRoZSBsb3dlc3QgcG9zc2libGUgcGZuIFpPTkVfTU9WQUJMRSBjYW4gYmUgYXQgKi8KKwlmaW5kX3VzYWJsZV96b25lX2Zvcl9tb3ZhYmxlKCk7CisJdXNhYmxlX3N0YXJ0cGZuID0gYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bbW92YWJsZV96b25lXTsKKworcmVzdGFydDoKKwkvKiBTcHJlYWQga2VybmVsY29yZSBtZW1vcnkgYXMgZXZlbmx5IGFzIHBvc3NpYmxlIHRocm91Z2hvdXQgbm9kZXMgKi8KKwlrZXJuZWxjb3JlX25vZGUgPSByZXF1aXJlZF9rZXJuZWxjb3JlIC8gdXNhYmxlX25vZGVzOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQkvKgorCQkgKiBSZWNhbGN1bGF0ZSBrZXJuZWxjb3JlX25vZGUgaWYgdGhlIGRpdmlzaW9uIHBlciBub2RlCisJCSAqIG5vdyBleGNlZWRzIHdoYXQgaXMgbmVjZXNzYXJ5IHRvIHNhdGlzZnkgdGhlIHJlcXVlc3RlZAorCQkgKiBhbW91bnQgb2YgbWVtb3J5IGZvciB0aGUga2VybmVsCisJCSAqLworCQlpZiAocmVxdWlyZWRfa2VybmVsY29yZSA8IGtlcm5lbGNvcmVfbm9kZSkKKwkJCWtlcm5lbGNvcmVfbm9kZSA9IHJlcXVpcmVkX2tlcm5lbGNvcmUgLyB1c2FibGVfbm9kZXM7CisKKwkJLyoKKwkJICogQXMgdGhlIG1hcCBpcyB3YWxrZWQsIHdlIHRyYWNrIGhvdyBtdWNoIG1lbW9yeSBpcyB1c2FibGUKKwkJICogYnkgdGhlIGtlcm5lbCB1c2luZyBrZXJuZWxjb3JlX3JlbWFpbmluZy4gV2hlbiBpdCBpcworCQkgKiAwLCB0aGUgcmVzdCBvZiB0aGUgbm9kZSBpcyB1c2FibGUgYnkgWk9ORV9NT1ZBQkxFCisJCSAqLworCQlrZXJuZWxjb3JlX3JlbWFpbmluZyA9IGtlcm5lbGNvcmVfbm9kZTsKKworCQkvKiBHbyB0aHJvdWdoIGVhY2ggcmFuZ2Ugb2YgUEZOcyB3aXRoaW4gdGhpcyBub2RlICovCisJCWZvcl9lYWNoX2FjdGl2ZV9yYW5nZV9pbmRleF9pbl9uaWQoaSwgbmlkKSB7CisJCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwkJCXVuc2lnbmVkIGxvbmcgc2l6ZV9wYWdlczsKKworCQkJc3RhcnRfcGZuID0gbWF4KGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiwKKwkJCQkJCXpvbmVfbW92YWJsZV9wZm5bbmlkXSk7CisJCQllbmRfcGZuID0gZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbjsKKwkJCWlmIChzdGFydF9wZm4gPj0gZW5kX3BmbikKKwkJCQljb250aW51ZTsKKworCQkJLyogQWNjb3VudCBmb3Igd2hhdCBpcyBvbmx5IHVzYWJsZSBmb3Iga2VybmVsY29yZSAqLworCQkJaWYgKHN0YXJ0X3BmbiA8IHVzYWJsZV9zdGFydHBmbikgeworCQkJCXVuc2lnbmVkIGxvbmcga2VybmVsX3BhZ2VzOworCQkJCWtlcm5lbF9wYWdlcyA9IG1pbihlbmRfcGZuLCB1c2FibGVfc3RhcnRwZm4pCisJCQkJCQkJCS0gc3RhcnRfcGZuOworCisJCQkJa2VybmVsY29yZV9yZW1haW5pbmcgLT0gbWluKGtlcm5lbF9wYWdlcywKKwkJCQkJCQlrZXJuZWxjb3JlX3JlbWFpbmluZyk7CisJCQkJcmVxdWlyZWRfa2VybmVsY29yZSAtPSBtaW4oa2VybmVsX3BhZ2VzLAorCQkJCQkJCXJlcXVpcmVkX2tlcm5lbGNvcmUpOworCisJCQkJLyogQ29udGludWUgaWYgcmFuZ2UgaXMgbm93IGZ1bGx5IGFjY291bnRlZCAqLworCQkJCWlmIChlbmRfcGZuIDw9IHVzYWJsZV9zdGFydHBmbikgeworCisJCQkJCS8qCisJCQkJCSAqIFB1c2ggem9uZV9tb3ZhYmxlX3BmbiB0byB0aGUgZW5kIHNvCisJCQkJCSAqIHRoYXQgaWYgd2UgaGF2ZSB0byByZWJhbGFuY2UKKwkJCQkJICoga2VybmVsY29yZSBhY3Jvc3Mgbm9kZXMsIHdlIHdpbGwKKwkJCQkJICogbm90IGRvdWJsZSBhY2NvdW50IGhlcmUKKwkJCQkJICovCisJCQkJCXpvbmVfbW92YWJsZV9wZm5bbmlkXSA9IGVuZF9wZm47CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlzdGFydF9wZm4gPSB1c2FibGVfc3RhcnRwZm47CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGUgdXNhYmxlIFBGTiByYW5nZSBmb3IgWk9ORV9NT1ZBQkxFIGlzIGZyb20KKwkJCSAqIHN0YXJ0X3Bmbi0+ZW5kX3Bmbi4gQ2FsY3VsYXRlIHNpemVfcGFnZXMgYXMgdGhlCisJCQkgKiBudW1iZXIgb2YgcGFnZXMgdXNlZCBhcyBrZXJuZWxjb3JlCisJCQkgKi8KKwkJCXNpemVfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuOworCQkJaWYgKHNpemVfcGFnZXMgPiBrZXJuZWxjb3JlX3JlbWFpbmluZykKKwkJCQlzaXplX3BhZ2VzID0ga2VybmVsY29yZV9yZW1haW5pbmc7CisJCQl6b25lX21vdmFibGVfcGZuW25pZF0gPSBzdGFydF9wZm4gKyBzaXplX3BhZ2VzOworCisJCQkvKgorCQkJICogU29tZSBrZXJuZWxjb3JlIGhhcyBiZWVuIG1ldCwgdXBkYXRlIGNvdW50cyBhbmQKKwkJCSAqIGJyZWFrIGlmIHRoZSBrZXJuZWxjb3JlIGZvciB0aGlzIG5vZGUgaGFzIGJlZW4KKwkJCSAqIHNhdGlzaWZpZWQKKwkJCSAqLworCQkJcmVxdWlyZWRfa2VybmVsY29yZSAtPSBtaW4ocmVxdWlyZWRfa2VybmVsY29yZSwKKwkJCQkJCQkJc2l6ZV9wYWdlcyk7CisJCQlrZXJuZWxjb3JlX3JlbWFpbmluZyAtPSBzaXplX3BhZ2VzOworCQkJaWYgKCFrZXJuZWxjb3JlX3JlbWFpbmluZykKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgc3RpbGwgcmVxdWlyZWRfa2VybmVsY29yZSwgd2UgZG8gYW5vdGhlciBwYXNzIHdpdGggb25lCisJICogbGVzcyBub2RlIGluIHRoZSBjb3VudC4gVGhpcyB3aWxsIHB1c2ggem9uZV9tb3ZhYmxlX3BmbltuaWRdIGZ1cnRoZXIKKwkgKiBhbG9uZyBvbiB0aGUgbm9kZXMgdGhhdCBzdGlsbCBoYXZlIG1lbW9yeSB1bnRpbCBrZXJuZWxjb3JlIGlzCisJICogc2F0aXNpZmllZAorCSAqLworCXVzYWJsZV9ub2Rlcy0tOworCWlmICh1c2FibGVfbm9kZXMgJiYgcmVxdWlyZWRfa2VybmVsY29yZSA+IHVzYWJsZV9ub2RlcykKKwkJZ290byByZXN0YXJ0OworCisJLyogQWxpZ24gc3RhcnQgb2YgWk9ORV9NT1ZBQkxFIG9uIGFsbCBuaWRzIHRvIE1BWF9PUkRFUl9OUl9QQUdFUyAqLworCWZvciAobmlkID0gMDsgbmlkIDwgTUFYX05VTU5PREVTOyBuaWQrKykKKwkJem9uZV9tb3ZhYmxlX3BmbltuaWRdID0KKwkJCXJvdW5kdXAoem9uZV9tb3ZhYmxlX3BmbltuaWRdLCBNQVhfT1JERVJfTlJfUEFHRVMpOworfQorCiAvKioKICAqIGZyZWVfYXJlYV9pbml0X25vZGVzIC0gSW5pdGlhbGlzZSBhbGwgcGdfZGF0YV90IGFuZCB6b25lIGRhdGEKICAqIEBtYXhfem9uZV9wZm46IGFuIGFycmF5IG9mIG1heCBQRk5zIGZvciBlYWNoIHpvbmUKQEAgLTI5MzgsMTkgKzM0MDIsMzcgQEAKIAlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmblswXSA9IGZpbmRfbWluX3Bmbl93aXRoX2FjdGl2ZV9yZWdpb25zKCk7CiAJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuWzBdID0gbWF4X3pvbmVfcGZuWzBdOwogCWZvciAoaSA9IDE7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgeworCQlpZiAoaSA9PSBaT05FX01PVkFCTEUpCisJCQljb250aW51ZTsKIAkJYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5baV0gPQogCQkJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW2ktMV07CiAJCWFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltpXSA9CiAJCQltYXgobWF4X3pvbmVfcGZuW2ldLCBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltpXSk7CiAJfQorCWFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW1pPTkVfTU9WQUJMRV0gPSAwOworCWFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltaT05FX01PVkFCTEVdID0gMDsKKworCS8qIEZpbmQgdGhlIFBGTnMgdGhhdCBaT05FX01PVkFCTEUgYmVnaW5zIGF0IGluIGVhY2ggbm9kZSAqLworCW1lbXNldCh6b25lX21vdmFibGVfcGZuLCAwLCBzaXplb2Yoem9uZV9tb3ZhYmxlX3BmbikpOworCWZpbmRfem9uZV9tb3ZhYmxlX3BmbnNfZm9yX25vZGVzKHpvbmVfbW92YWJsZV9wZm4pOwogCiAJLyogUHJpbnQgb3V0IHRoZSB6b25lIHJhbmdlcyAqLwogCXByaW50aygiWm9uZSBQRk4gcmFuZ2VzOlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgeworCQlpZiAoaSA9PSBaT05FX01PVkFCTEUpCisJCQljb250aW51ZTsKIAkJcHJpbnRrKCIgICUtOHMgJThsdSAtPiAlOGx1XG4iLAogCQkJCXpvbmVfbmFtZXNbaV0sCiAJCQkJYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5baV0sCiAJCQkJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW2ldKTsKKwl9CisKKwkvKiBQcmludCBvdXQgdGhlIFBGTnMgWk9ORV9NT1ZBQkxFIGJlZ2lucyBhdCBpbiBlYWNoIG5vZGUgKi8KKwlwcmludGsoIk1vdmFibGUgem9uZSBzdGFydCBQRk4gZm9yIGVhY2ggbm9kZVxuIik7CisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCWlmICh6b25lX21vdmFibGVfcGZuW2ldKQorCQkJcHJpbnRrKCIgIE5vZGUgJWQ6ICVsdVxuIiwgaSwgem9uZV9tb3ZhYmxlX3BmbltpXSk7CisJfQogCiAJLyogUHJpbnQgb3V0IHRoZSBlYXJseV9ub2RlX21hcFtdICovCiAJcHJpbnRrKCJlYXJseV9ub2RlX21hcFslZF0gYWN0aXZlIFBGTiByYW5nZXNcbiIsIG5yX25vZGVtYXBfZW50cmllcyk7CkBAIC0yOTY3LDYgKzM0NDksNDMgQEAKIAkJCQlmaW5kX21pbl9wZm5fZm9yX25vZGUobmlkKSwgTlVMTCk7CiAJfQogfQorCitzdGF0aWMgaW50IF9faW5pdCBjbWRsaW5lX3BhcnNlX2NvcmUoY2hhciAqcCwgdW5zaWduZWQgbG9uZyAqY29yZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY29yZW1lbTsKKwlpZiAoIXApCisJCXJldHVybiAtRUlOVkFMOworCisJY29yZW1lbSA9IG1lbXBhcnNlKHAsICZwKTsKKwkqY29yZSA9IGNvcmVtZW0gPj4gUEFHRV9TSElGVDsKKworCS8qIFBhcmFub2lkIGNoZWNrIHRoYXQgVUwgaXMgZW5vdWdoIGZvciB0aGUgY29yZW1lbSB2YWx1ZSAqLworCVdBUk5fT04oKGNvcmVtZW0gPj4gUEFHRV9TSElGVCkgPiBVTE9OR19NQVgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBrZXJuZWxjb3JlPXNpemUgc2V0cyB0aGUgYW1vdW50IG9mIG1lbW9yeSBmb3IgdXNlIGZvciBhbGxvY2F0aW9ucyB0aGF0CisgKiBjYW5ub3QgYmUgcmVjbGFpbWVkIG9yIG1pZ3JhdGVkLgorICovCitzdGF0aWMgaW50IF9faW5pdCBjbWRsaW5lX3BhcnNlX2tlcm5lbGNvcmUoY2hhciAqcCkKK3sKKwlyZXR1cm4gY21kbGluZV9wYXJzZV9jb3JlKHAsICZyZXF1aXJlZF9rZXJuZWxjb3JlKTsKK30KKworLyoKKyAqIG1vdmFibGVjb3JlPXNpemUgc2V0cyB0aGUgYW1vdW50IG9mIG1lbW9yeSBmb3IgdXNlIGZvciBhbGxvY2F0aW9ucyB0aGF0CisgKiBjYW4gYmUgcmVjbGFpbWVkIG9yIG1pZ3JhdGVkLgorICovCitzdGF0aWMgaW50IF9faW5pdCBjbWRsaW5lX3BhcnNlX21vdmFibGVjb3JlKGNoYXIgKnApCit7CisJcmV0dXJuIGNtZGxpbmVfcGFyc2VfY29yZShwLCAmcmVxdWlyZWRfbW92YWJsZWNvcmUpOworfQorCitlYXJseV9wYXJhbSgia2VybmVsY29yZSIsIGNtZGxpbmVfcGFyc2Vfa2VybmVsY29yZSk7CitlYXJseV9wYXJhbSgibW92YWJsZWNvcmUiLCBjbWRsaW5lX3BhcnNlX21vdmFibGVjb3JlKTsKKwogI2VuZGlmIC8qIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCAqLwogCiAvKioKQEAgLTMzNTUsMTMgKzM4NzQsMjggQEAKIAkJCWZvciAob3JkZXIgPSAwOyAoKDFVTCA8PCBvcmRlcikgPDwgUEFHRV9TSElGVCkgPCBzaXplOyBvcmRlcisrKQogCQkJCTsKIAkJCXRhYmxlID0gKHZvaWQqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsIG9yZGVyKTsKKwkJCS8qCisJCQkgKiBJZiBidWNrZXRzaXplIGlzIG5vdCBhIHBvd2VyLW9mLXR3bywgd2UgbWF5IGZyZWUKKwkJCSAqIHNvbWUgcGFnZXMgYXQgdGhlIGVuZCBvZiBoYXNoIHRhYmxlLgorCQkJICovCisJCQlpZiAodGFibGUpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGFsbG9jX2VuZCA9ICh1bnNpZ25lZCBsb25nKXRhYmxlICsKKwkJCQkJCShQQUdFX1NJWkUgPDwgb3JkZXIpOworCQkJCXVuc2lnbmVkIGxvbmcgdXNlZCA9ICh1bnNpZ25lZCBsb25nKXRhYmxlICsKKwkJCQkJCVBBR0VfQUxJR04oc2l6ZSk7CisJCQkJc3BsaXRfcGFnZSh2aXJ0X3RvX3BhZ2UodGFibGUpLCBvcmRlcik7CisJCQkJd2hpbGUgKHVzZWQgPCBhbGxvY19lbmQpIHsKKwkJCQkJZnJlZV9wYWdlKHVzZWQpOworCQkJCQl1c2VkICs9IFBBR0VfU0laRTsKKwkJCQl9CisJCQl9CiAJCX0KIAl9IHdoaWxlICghdGFibGUgJiYgc2l6ZSA+IFBBR0VfU0laRSAmJiAtLWxvZzJxdHkpOwogCiAJaWYgKCF0YWJsZSkKIAkJcGFuaWMoIkZhaWxlZCB0byBhbGxvY2F0ZSAlcyBoYXNoIHRhYmxlXG4iLCB0YWJsZW5hbWUpOwogCi0JcHJpbnRrKCIlcyBoYXNoIHRhYmxlIGVudHJpZXM6ICVkIChvcmRlcjogJWQsICVsdSBieXRlcylcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgaGFzaCB0YWJsZSBlbnRyaWVzOiAlZCAob3JkZXI6ICVkLCAlbHUgYnl0ZXMpXG4iLAogCSAgICAgICB0YWJsZW5hbWUsCiAJICAgICAgICgxVSA8PCBsb2cycXR5KSwKIAkgICAgICAgaWxvZzIoc2l6ZSkgLSBQQUdFX1NISUZULApkaWZmIC0tZ2l0IGEvbW0vcGRmbHVzaC5jIGIvbW0vcGRmbHVzaC5jCmluZGV4IDhjZTA5MDAuLjhmNmVlMDcgMTAwNjQ0Ci0tLSBhL21tL3BkZmx1c2guYworKysgYi9tbS9wZGZsdXNoLmMKQEAgLTkyLDYgKzkyLDcgQEAKIHN0YXRpYyBpbnQgX19wZGZsdXNoKHN0cnVjdCBwZGZsdXNoX3dvcmsgKm15X3dvcmspCiB7CiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRkxVU0hFUiB8IFBGX1NXQVBXUklURTsKKwlzZXRfZnJlZXphYmxlKCk7CiAJbXlfd29yay0+Zm4gPSBOVUxMOwogCW15X3dvcmstPndobyA9IGN1cnJlbnQ7CiAJSU5JVF9MSVNUX0hFQUQoJm15X3dvcmstPmxpc3QpOwpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggMDQ5M2U0ZC4uOTZmYTc5ZiAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfYWNsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CkBAIC05Myw4ICs5NCwxMSBAQAogCSAqIFRoZSBhYm92ZSBkZWZpbml0aW9uIG9mIEVOVFJJRVNfUEVSX1BBR0UsIGFuZCB0aGUgdXNlIG9mCiAJICogQkxPQ0tTX1BFUl9QQUdFIG9uIGluZGlyZWN0IHBhZ2VzLCBhc3N1bWUgUEFHRV9DQUNIRV9TSVpFOgogCSAqIG1pZ2h0IGJlIHJlY29uc2lkZXJlZCBpZiBpdCBldmVyIGRpdmVyZ2VzIGZyb20gUEFHRV9TSVpFLgorCSAqCisJICogX19HRlBfTU9WQUJMRSBpcyBtYXNrZWQgb3V0IGFzIHN3YXAgdmVjdG9ycyBjYW5ub3QgbW92ZQogCSAqLwotCXJldHVybiBhbGxvY19wYWdlcyhnZnBfbWFzaywgUEFHRV9DQUNIRV9TSElGVC1QQUdFX1NISUZUKTsKKwlyZXR1cm4gYWxsb2NfcGFnZXMoKGdmcF9tYXNrICYgfl9fR0ZQX01PVkFCTEUpIHwgX19HRlBfWkVSTywKKwkJCQlQQUdFX0NBQ0hFX1NISUZULVBBR0VfU0hJRlQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2htZW1fZGlyX2ZyZWUoc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0zNzIsNyArMzc2LDcgQEAKIAkJfQogCiAJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJcGFnZSA9IHNobWVtX2Rpcl9hbGxvYyhtYXBwaW5nX2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcpIHwgX19HRlBfWkVSTyk7CisJCXBhZ2UgPSBzaG1lbV9kaXJfYWxsb2MobWFwcGluZ19nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nKSk7CiAJCWlmIChwYWdlKQogCQkJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAwKTsKIAkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCBiMzQ0ZTY3Li45NmQzMGVlIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC03NzUsNiArNzc1LDkgQEAKIAkgKi8KIAlCVUdfT04obWFsbG9jX3NpemVzW0lOREVYX0FDXS5jc19jYWNoZXAgPT0gTlVMTCk7CiAjZW5kaWYKKwlpZiAoIXNpemUpCisJCXJldHVybiBaRVJPX1NJWkVfUFRSOworCiAJd2hpbGUgKHNpemUgPiBjc2l6ZXAtPmNzX3NpemUpCiAJCWNzaXplcCsrOwogCkBAIC05MjksNyArOTMyLDcgQEAKICAqIHRoZSBDUFVzIGdldHRpbmcgaW50byBsb2Nrc3RlcCBhbmQgY29udGVuZGluZyBmb3IgdGhlIGdsb2JhbCBjYWNoZSBjaGFpbgogICogbG9jay4KICAqLwotc3RhdGljIHZvaWQgX19kZXZpbml0IHN0YXJ0X2NwdV90aW1lcihpbnQgY3B1KQorc3RhdGljIHZvaWQgX19jcHVpbml0IHN0YXJ0X2NwdV90aW1lcihpbnQgY3B1KQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKnJlYXBfd29yayA9ICZwZXJfY3B1KHJlYXBfd29yaywgY3B1KTsKIApAQCAtMjM1MSw3ICsyMzU0LDcgQEAKIAkJICogdGhpcyBzaG91bGQgbm90IGhhcHBlbiBhdCBhbGwuCiAJCSAqIEJ1dCBsZWF2ZSBhIEJVR19PTiBmb3Igc29tZSBsdWNreSBkdWRlLgogCQkgKi8KLQkJQlVHX09OKCFjYWNoZXAtPnNsYWJwX2NhY2hlKTsKKwkJQlVHX09OKFpFUk9fT1JfTlVMTF9QVFIoY2FjaGVwLT5zbGFicF9jYWNoZSkpOwogCX0KIAljYWNoZXAtPmN0b3IgPSBjdG9yOwogCWNhY2hlcC0+bmFtZSA9IG5hbWU7CkBAIC0yNzQzLDcgKzI3NDYsNyBAQAogCSAqIEJlIGxhenkgYW5kIG9ubHkgY2hlY2sgZm9yIHZhbGlkIGZsYWdzIGhlcmUsICBrZWVwaW5nIGl0IG91dCBvZiB0aGUKIAkgKiBjcml0aWNhbCBwYXRoIGluIGttZW1fY2FjaGVfYWxsb2MoKS4KIAkgKi8KLQlCVUdfT04oZmxhZ3MgJiB+KEdGUF9ETUEgfCBHRlBfTEVWRUxfTUFTSykpOworCUJVR19PTihmbGFncyAmIH4oR0ZQX0RNQSB8IF9fR0ZQX1pFUk8gfCBHRlBfTEVWRUxfTUFTSykpOwogCiAJbG9jYWxfZmxhZ3MgPSAoZmxhZ3MgJiBHRlBfTEVWRUxfTUFTSyk7CiAJLyogVGFrZSB0aGUgbDMgbGlzdCBsb2NrIHRvIGNoYW5nZSB0aGUgY29sb3VyX25leHQgb24gdGhpcyBub2RlICovCkBAIC0zMzg5LDYgKzMzOTIsOSBAQAogCWxvY2FsX2lycV9yZXN0b3JlKHNhdmVfZmxhZ3MpOwogCXB0ciA9IGNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYWZ0ZXIoY2FjaGVwLCBmbGFncywgcHRyLCBjYWxsZXIpOwogCisJaWYgKHVubGlrZWx5KChmbGFncyAmIF9fR0ZQX1pFUk8pICYmIHB0cikpCisJCW1lbXNldChwdHIsIDAsIG9ial9zaXplKGNhY2hlcCkpOworCiAJcmV0dXJuIHB0cjsKIH0KIApAQCAtMzQ0MCw2ICszNDQ2LDkgQEAKIAlvYmpwID0gY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIGZsYWdzLCBvYmpwLCBjYWxsZXIpOwogCXByZWZldGNodyhvYmpwKTsKIAorCWlmICh1bmxpa2VseSgoZmxhZ3MgJiBfX0dGUF9aRVJPKSAmJiBvYmpwKSkKKwkJbWVtc2V0KG9ianAsIDAsIG9ial9zaXplKGNhY2hlcCkpOworCiAJcmV0dXJuIG9ianA7CiB9CiAKQEAgLTM1ODEsMjMgKzM1OTAsNiBAQAogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jKTsKIAogLyoqCi0gKiBrbWVtX2NhY2hlX3phbGxvYyAtIEFsbG9jYXRlIGFuIG9iamVjdC4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KLSAqIEBjYWNoZTogVGhlIGNhY2hlIHRvIGFsbG9jYXRlIGZyb20uCi0gKiBAZmxhZ3M6IFNlZSBrbWFsbG9jKCkuCi0gKgotICogQWxsb2NhdGUgYW4gb2JqZWN0IGZyb20gdGhpcyBjYWNoZSBhbmQgc2V0IHRoZSBhbGxvY2F0ZWQgbWVtb3J5IHRvIHplcm8uCi0gKiBUaGUgZmxhZ3MgYXJlIG9ubHkgcmVsZXZhbnQgaWYgdGhlIGNhY2hlIGhhcyBubyBhdmFpbGFibGUgb2JqZWN0cy4KLSAqLwotdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLCBnZnBfdCBmbGFncykKLXsKLQl2b2lkICpyZXQgPSBfX2NhY2hlX2FsbG9jKGNhY2hlLCBmbGFncywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQlpZiAocmV0KQotCQltZW1zZXQocmV0LCAwLCBvYmpfc2l6ZShjYWNoZSkpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfemFsbG9jKTsKLQotLyoqCiAgKiBrbWVtX3B0cl92YWxpZGF0ZSAtIGNoZWNrIGlmIGFuIHVudHJ1c3RlZCBwb2ludGVyIG1pZ2h0CiAgKgliZSBhIHNsYWIgZW50cnkuCiAgKiBAY2FjaGVwOiB0aGUgY2FjaGUgd2UncmUgY2hlY2tpbmcgYWdhaW5zdApAQCAtMzY1Myw4ICszNjQ1LDggQEAKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwogCiAJY2FjaGVwID0ga21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNpemUsIGZsYWdzKTsKLQlpZiAodW5saWtlbHkoY2FjaGVwID09IE5VTEwpKQotCQlyZXR1cm4gTlVMTDsKKwlpZiAodW5saWtlbHkoWkVST19PUl9OVUxMX1BUUihjYWNoZXApKSkKKwkJcmV0dXJuIGNhY2hlcDsKIAlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG5vZGUpOwogfQogCkBAIC0zNzI2LDUyICszNzE4LDYgQEAKICNlbmRpZgogCiAvKioKLSAqIGtyZWFsbG9jIC0gcmVhbGxvY2F0ZSBtZW1vcnkuIFRoZSBjb250ZW50cyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuCi0gKiBAcDogb2JqZWN0IHRvIHJlYWxsb2NhdGUgbWVtb3J5IGZvci4KLSAqIEBuZXdfc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICoKLSAqIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYXJlIHByZXNlcnZlZCB1cCB0byB0aGUKLSAqIGxlc3NlciBvZiB0aGUgbmV3IGFuZCBvbGQgc2l6ZXMuICBJZiBAcCBpcyAlTlVMTCwga3JlYWxsb2MoKQotICogYmVoYXZlcyBleGFjdGx5IGxpa2Uga21hbGxvYygpLiAgSWYgQHNpemUgaXMgMCBhbmQgQHAgaXMgbm90IGEKLSAqICVOVUxMIHBvaW50ZXIsIHRoZSBvYmplY3QgcG9pbnRlZCB0byBpcyBmcmVlZC4KLSAqLwotdm9pZCAqa3JlYWxsb2MoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG5ld19zaXplLCBnZnBfdCBmbGFncykKLXsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsICpuZXdfY2FjaGU7Ci0Jdm9pZCAqcmV0OwotCi0JaWYgKHVubGlrZWx5KCFwKSkKLQkJcmV0dXJuIGttYWxsb2NfdHJhY2tfY2FsbGVyKG5ld19zaXplLCBmbGFncyk7Ci0KLQlpZiAodW5saWtlbHkoIW5ld19zaXplKSkgewotCQlrZnJlZShwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JY2FjaGUgPSB2aXJ0X3RvX2NhY2hlKHApOwotCW5ld19jYWNoZSA9IF9fZmluZF9nZW5lcmFsX2NhY2hlcChuZXdfc2l6ZSwgZmxhZ3MpOwotCi0JLyoKLSAJICogSWYgbmV3IHNpemUgZml0cyBpbiB0aGUgY3VycmVudCBjYWNoZSwgYmFpbCBvdXQuCi0gCSAqLwotCWlmIChsaWtlbHkoY2FjaGUgPT0gbmV3X2NhY2hlKSkKLQkJcmV0dXJuICh2b2lkICopcDsKLQotCS8qCi0gCSAqIFdlIGFyZSBvbiB0aGUgc2xvdy1wYXRoIGhlcmUgc28gZG8gbm90IHVzZSBfX2NhY2hlX2FsbG9jCi0gCSAqIGJlY2F1c2UgaXQgYmxvYXRzIGtlcm5lbCB0ZXh0LgotIAkgKi8KLQlyZXQgPSBrbWFsbG9jX3RyYWNrX2NhbGxlcihuZXdfc2l6ZSwgZmxhZ3MpOwotCWlmIChyZXQpIHsKLQkJbWVtY3B5KHJldCwgcCwgbWluKG5ld19zaXplLCBrc2l6ZShwKSkpOwotCQlrZnJlZShwKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woa3JlYWxsb2MpOwotCi0vKioKICAqIGttZW1fY2FjaGVfZnJlZSAtIERlYWxsb2NhdGUgYW4gb2JqZWN0CiAgKiBAY2FjaGVwOiBUaGUgY2FjaGUgdGhlIGFsbG9jYXRpb24gd2FzIGZyb20uCiAgKiBAb2JqcDogVGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIG9iamVjdC4KQEAgLTM4MDYsNyArMzc1Miw3IEBACiAJc3RydWN0IGttZW1fY2FjaGUgKmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh1bmxpa2VseSghb2JqcCkpCisJaWYgKHVubGlrZWx5KFpFUk9fT1JfTlVMTF9QVFIob2JqcCkpKQogCQlyZXR1cm47CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWtmcmVlX2RlYnVnY2hlY2sob2JqcCk7CkBAIC00MTU3LDI2ICs0MTAzLDE3IEBACiBzdGF0aWMgdm9pZCAqc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewogCWxvZmZfdCBuID0gKnBvczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJbXV0ZXhfbG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogCWlmICghbikKIAkJcHJpbnRfc2xhYmluZm9faGVhZGVyKG0pOwotCXAgPSBjYWNoZV9jaGFpbi5uZXh0OwotCXdoaWxlIChuLS0pIHsKLQkJcCA9IHAtPm5leHQ7Ci0JCWlmIChwID09ICZjYWNoZV9jaGFpbikKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbmV4dCk7CisKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJmNhY2hlX2NoYWluLCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKnNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBwOwotCSsrKnBvczsKLQlyZXR1cm4gY2FjaGVwLT5uZXh0Lm5leHQgPT0gJmNhY2hlX2NoYWluID8KLQkJTlVMTCA6IGxpc3RfZW50cnkoY2FjaGVwLT5uZXh0Lm5leHQsIHN0cnVjdCBrbWVtX2NhY2hlLCBuZXh0KTsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dChwLCAmY2FjaGVfY2hhaW4sIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCkBAIC00MTg2LDcgKzQxMjMsNyBAQAogCiBzdGF0aWMgaW50IHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCA9IHA7CisJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGttZW1fY2FjaGUsIG5leHQpOwogCXN0cnVjdCBzbGFiICpzbGFicDsKIAl1bnNpZ25lZCBsb25nIGFjdGl2ZV9vYmpzOwogCXVuc2lnbmVkIGxvbmcgbnVtX29ianM7CkBAIC00MzU1LDE3ICs0MjkyLDggQEAKIAogc3RhdGljIHZvaWQgKmxlYWtzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7Ci0JbG9mZl90IG4gPSAqcG9zOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7Ci0KIAltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7Ci0JcCA9IGNhY2hlX2NoYWluLm5leHQ7Ci0Jd2hpbGUgKG4tLSkgewotCQlwID0gcC0+bmV4dDsKLQkJaWYgKHAgPT0gJmNhY2hlX2NoYWluKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBsaXN0X2VudHJ5KHAsIHN0cnVjdCBrbWVtX2NhY2hlLCBuZXh0KTsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJmNhY2hlX2NoYWluLCAqcG9zKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYWRkX2NhbGxlcih1bnNpZ25lZCBsb25nICpuLCB1bnNpZ25lZCBsb25nIHYpCkBAIC00NDE2LDcgKzQzNDQsNyBAQAogewogI2lmZGVmIENPTkZJR19LQUxMU1lNUwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplOwotCWNoYXIgbW9kbmFtZVtNT0RVTEVfTkFNRV9MRU4gKyAxXSwgbmFtZVtLU1lNX05BTUVfTEVOICsgMV07CisJY2hhciBtb2RuYW1lW01PRFVMRV9OQU1FX0xFTl0sIG5hbWVbS1NZTV9OQU1FX0xFTl07CiAKIAlpZiAobG9va3VwX3N5bWJvbF9hdHRycyhhZGRyZXNzLCAmc2l6ZSwgJm9mZnNldCwgbW9kbmFtZSwgbmFtZSkgPT0gMCkgewogCQlzZXFfcHJpbnRmKG0sICIlcyslI2x4LyUjbHgiLCBuYW1lLCBvZmZzZXQsIHNpemUpOwpAQCAtNDQzMCw3ICs0MzU4LDcgQEAKIAogc3RhdGljIGludCBsZWFrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKIHsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gcDsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbmV4dCk7CiAJc3RydWN0IHNsYWIgKnNsYWJwOwogCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtNDUxMSw3ICs0NDM5LDcgQEAKICAqLwogc2l6ZV90IGtzaXplKGNvbnN0IHZvaWQgKm9ianApCiB7Ci0JaWYgKHVubGlrZWx5KG9ianAgPT0gTlVMTCkpCisJaWYgKHVubGlrZWx5KFpFUk9fT1JfTlVMTF9QVFIob2JqcCkpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBvYmpfc2l6ZSh2aXJ0X3RvX2NhY2hlKG9ianApKTsKZGlmZiAtLWdpdCBhL21tL3Nsb2IuYyBiL21tL3Nsb2IuYwppbmRleCA3MTk3NmM1Li5jODllZjExIDEwMDY0NAotLS0gYS9tbS9zbG9iLmMKKysrIGIvbW0vc2xvYi5jCkBAIC0zLDU3ICszLDE1OSBAQAogICoKICAqIE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPiAxMi8zMC8wMwogICoKKyAqIE5VTUEgc3VwcG9ydCBieSBQYXVsIE11bmR0LCAyMDA3LgorICoKICAqIEhvdyBTTE9CIHdvcmtzOgogICoKICAqIFRoZSBjb3JlIG9mIFNMT0IgaXMgYSB0cmFkaXRpb25hbCBLJlIgc3R5bGUgaGVhcCBhbGxvY2F0b3IsIHdpdGgKICAqIHN1cHBvcnQgZm9yIHJldHVybmluZyBhbGlnbmVkIG9iamVjdHMuIFRoZSBncmFudWxhcml0eSBvZiB0aGlzCi0gKiBhbGxvY2F0b3IgaXMgOCBieXRlcyBvbiB4ODYsIHRob3VnaCBpdCdzIHBlcmhhcHMgcG9zc2libGUgdG8gcmVkdWNlCi0gKiB0aGlzIHRvIDQgaWYgaXQncyBkZWVtZWQgd29ydGggdGhlIGVmZm9ydC4gVGhlIHNsb2IgaGVhcCBpcyBhCi0gKiBzaW5nbHktbGlua2VkIGxpc3Qgb2YgcGFnZXMgZnJvbSBfX2dldF9mcmVlX3BhZ2UsIGdyb3duIG9uIGRlbWFuZAotICogYW5kIGFsbG9jYXRpb24gZnJvbSB0aGUgaGVhcCBpcyBjdXJyZW50bHkgZmlyc3QtZml0LgorICogYWxsb2NhdG9yIGlzIGFzIGxpdHRsZSBhcyAyIGJ5dGVzLCBob3dldmVyIHR5cGljYWxseSBtb3N0IGFyY2hpdGVjdHVyZXMKKyAqIHdpbGwgcmVxdWlyZSA0IGJ5dGVzIG9uIDMyLWJpdCBhbmQgOCBieXRlcyBvbiA2NC1iaXQuCisgKgorICogVGhlIHNsb2IgaGVhcCBpcyBhIGxpbmtlZCBsaXN0IG9mIHBhZ2VzIGZyb20gYWxsb2NfcGFnZXMoKSwgYW5kCisgKiB3aXRoaW4gZWFjaCBwYWdlLCB0aGVyZSBpcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBmcmVlIGJsb2NrcyAoc2xvYl90KS4KKyAqIFRoZSBoZWFwIGlzIGdyb3duIG9uIGRlbWFuZCBhbmQgYWxsb2NhdGlvbiBmcm9tIHRoZSBoZWFwIGlzIGN1cnJlbnRseQorICogZmlyc3QtZml0LgogICoKICAqIEFib3ZlIHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Yga21hbGxvYy9rZnJlZS4gQmxvY2tzIHJldHVybmVkCi0gKiBmcm9tIGttYWxsb2MgYXJlIDgtYnl0ZSBhbGlnbmVkIGFuZCBwcmVwZW5kZWQgd2l0aCBhIDgtYnl0ZSBoZWFkZXIuCisgKiBmcm9tIGttYWxsb2MgYXJlIHByZXBlbmRlZCB3aXRoIGEgNC1ieXRlIGhlYWRlciB3aXRoIHRoZSBrbWFsbG9jIHNpemUuCiAgKiBJZiBrbWFsbG9jIGlzIGFza2VkIGZvciBvYmplY3RzIG9mIFBBR0VfU0laRSBvciBsYXJnZXIsIGl0IGNhbGxzCi0gKiBfX2dldF9mcmVlX3BhZ2VzIGRpcmVjdGx5IHNvIHRoYXQgaXQgY2FuIHJldHVybiBwYWdlLWFsaWduZWQgYmxvY2tzCi0gKiBhbmQga2VlcHMgYSBsaW5rZWQgbGlzdCBvZiBzdWNoIHBhZ2VzIGFuZCB0aGVpciBvcmRlcnMuIFRoZXNlCi0gKiBvYmplY3RzIGFyZSBkZXRlY3RlZCBpbiBrZnJlZSgpIGJ5IHRoZWlyIHBhZ2UgYWxpZ25tZW50LgorICogYWxsb2NfcGFnZXMoKSBkaXJlY3RseSwgYWxsb2NhdGluZyBjb21wb3VuZCBwYWdlcyBzbyB0aGUgcGFnZSBvcmRlcgorICogZG9lcyBub3QgaGF2ZSB0byBiZSBzZXBhcmF0ZWx5IHRyYWNrZWQsIGFuZCBhbHNvIHN0b3JlcyB0aGUgZXhhY3QKKyAqIGFsbG9jYXRpb24gc2l6ZSBpbiBwYWdlLT5wcml2YXRlIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gYWNjdXJhdGVseQorICogcHJvdmlkZSBrc2l6ZSgpLiBUaGVzZSBvYmplY3RzIGFyZSBkZXRlY3RlZCBpbiBrZnJlZSgpIGJlY2F1c2Ugc2xvYl9wYWdlKCkKKyAqIGlzIGZhbHNlIGZvciB0aGVtLgogICoKICAqIFNMQUIgaXMgZW11bGF0ZWQgb24gdG9wIG9mIFNMT0IgYnkgc2ltcGx5IGNhbGxpbmcgY29uc3RydWN0b3JzIGFuZAotICogZGVzdHJ1Y3RvcnMgZm9yIGV2ZXJ5IFNMQUIgYWxsb2NhdGlvbi4gT2JqZWN0cyBhcmUgcmV0dXJuZWQgd2l0aAotICogdGhlIDgtYnl0ZSBhbGlnbm1lbnQgdW5sZXNzIHRoZSBTTEFCX0hXQ0FDSEVfQUxJR04gZmxhZyBpcwotICogc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBsb3ctbGV2ZWwgYWxsb2NhdG9yIHdpbGwgZnJhZ21lbnQgYmxvY2tzIHRvCi0gKiBjcmVhdGUgdGhlIHByb3BlciBhbGlnbm1lbnQuIEFnYWluLCBvYmplY3RzIG9mIHBhZ2Utc2l6ZSBvciBncmVhdGVyCi0gKiBhcmUgYWxsb2NhdGVkIGJ5IGNhbGxpbmcgX19nZXRfZnJlZV9wYWdlcy4gQXMgU0xBQiBvYmplY3RzIGtub3cKLSAqIHRoZWlyIHNpemUsIG5vIHNlcGFyYXRlIHNpemUgYm9va2tlZXBpbmcgaXMgbmVjZXNzYXJ5IGFuZCB0aGVyZSBpcwotICogZXNzZW50aWFsbHkgbm8gYWxsb2NhdGlvbiBzcGFjZSBvdmVyaGVhZC4KKyAqIGRlc3RydWN0b3JzIGZvciBldmVyeSBTTEFCIGFsbG9jYXRpb24uIE9iamVjdHMgYXJlIHJldHVybmVkIHdpdGggdGhlCisgKiA0LWJ5dGUgYWxpZ25tZW50IHVubGVzcyB0aGUgU0xBQl9IV0NBQ0hFX0FMSUdOIGZsYWcgaXMgc2V0LCBpbiB3aGljaAorICogY2FzZSB0aGUgbG93LWxldmVsIGFsbG9jYXRvciB3aWxsIGZyYWdtZW50IGJsb2NrcyB0byBjcmVhdGUgdGhlIHByb3BlcgorICogYWxpZ25tZW50LiBBZ2Fpbiwgb2JqZWN0cyBvZiBwYWdlLXNpemUgb3IgZ3JlYXRlciBhcmUgYWxsb2NhdGVkIGJ5CisgKiBjYWxsaW5nIGFsbG9jX3BhZ2VzKCkuIEFzIFNMQUIgb2JqZWN0cyBrbm93IHRoZWlyIHNpemUsIG5vIHNlcGFyYXRlCisgKiBzaXplIGJvb2trZWVwaW5nIGlzIG5lY2Vzc2FyeSBhbmQgdGhlcmUgaXMgZXNzZW50aWFsbHkgbm8gYWxsb2NhdGlvbgorICogc3BhY2Ugb3ZlcmhlYWQsIGFuZCBjb21wb3VuZCBwYWdlcyBhcmVuJ3QgbmVlZGVkIGZvciBtdWx0aS1wYWdlCisgKiBhbGxvY2F0aW9ucy4KKyAqCisgKiBOVU1BIHN1cHBvcnQgaW4gU0xPQiBpcyBmYWlybHkgc2ltcGxpc3RpYywgcHVzaGluZyBtb3N0IG9mIHRoZSByZWFsCisgKiBsb2dpYyBkb3duIHRvIHRoZSBwYWdlIGFsbG9jYXRvciwgYW5kIHNpbXBseSBkb2luZyB0aGUgbm9kZSBhY2NvdW50aW5nCisgKiBvbiB0aGUgdXBwZXIgbGV2ZWxzLiBJbiB0aGUgZXZlbnQgdGhhdCBhIG5vZGUgaWQgaXMgZXhwbGljaXRseQorICogcHJvdmlkZWQsIGFsbG9jX3BhZ2VzX25vZGUoKSB3aXRoIHRoZSBzcGVjaWZpZWQgbm9kZSBpZCBpcyB1c2VkCisgKiBpbnN0ZWFkLiBUaGUgY29tbW9uIGNhc2UgKG9yIHdoZW4gdGhlIG5vZGUgaWQgaXNuJ3QgZXhwbGljaXRseSBwcm92aWRlZCkKKyAqIHdpbGwgZGVmYXVsdCB0byB0aGUgY3VycmVudCBub2RlLCBhcyBwZXIgbnVtYV9ub2RlX2lkKCkuCisgKgorICogTm9kZSBhd2FyZSBwYWdlcyBhcmUgc3RpbGwgaW5zZXJ0ZWQgaW4gdG8gdGhlIGdsb2JhbCBmcmVlbGlzdCwgYW5kCisgKiB0aGVzZSBhcmUgc2Nhbm5lZCBmb3IgYnkgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgbm9kZSBpZCBlbmNvZGVkIGluIHRoZQorICogcGFnZSBmbGFncy4gQXMgYSByZXN1bHQsIGJsb2NrIGFsbG9jYXRpb25zIHRoYXQgY2FuIGJlIHNhdGlzZmllZCBmcm9tCisgKiB0aGUgZnJlZWxpc3Qgd2lsbCBvbmx5IGJlIGRvbmUgc28gb24gcGFnZXMgcmVzaWRpbmcgb24gdGhlIHNhbWUgbm9kZSwKKyAqIGluIG9yZGVyIHRvIHByZXZlbnQgcmFuZG9tIG5vZGUgcGxhY2VtZW50LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworLyoKKyAqIHNsb2JfYmxvY2sgaGFzIGEgZmllbGQgJ3VuaXRzJywgd2hpY2ggaW5kaWNhdGVzIHNpemUgb2YgYmxvY2sgaWYgK3ZlLAorICogb3Igb2Zmc2V0IG9mIG5leHQgYmxvY2sgaWYgLXZlIChpbiBTTE9CX1VOSVRzKS4KKyAqCisgKiBGcmVlIGJsb2NrcyBvZiBzaXplIDEgdW5pdCBzaW1wbHkgY29udGFpbiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGJsb2NrLgorICogVGhvc2Ugd2l0aCBsYXJnZXIgc2l6ZSBjb250YWluIHRoZWlyIHNpemUgaW4gdGhlIGZpcnN0IFNMT0JfVU5JVCBvZgorICogbWVtb3J5LCBhbmQgdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBmcmVlIGJsb2NrIGluIHRoZSBzZWNvbmQgU0xPQl9VTklULgorICovCisjaWYgUEFHRV9TSVpFIDw9ICgzMjc2NyAqIDIpCit0eXBlZGVmIHMxNiBzbG9iaWR4X3Q7CisjZWxzZQordHlwZWRlZiBzMzIgc2xvYmlkeF90OworI2VuZGlmCiAKIHN0cnVjdCBzbG9iX2Jsb2NrIHsKLQlpbnQgdW5pdHM7Ci0Jc3RydWN0IHNsb2JfYmxvY2sgKm5leHQ7CisJc2xvYmlkeF90IHVuaXRzOwogfTsKIHR5cGVkZWYgc3RydWN0IHNsb2JfYmxvY2sgc2xvYl90OwogCisvKgorICogV2UgdXNlIHN0cnVjdCBwYWdlIGZpZWxkcyB0byBtYW5hZ2Ugc29tZSBzbG9iIGFsbG9jYXRpb24gYXNwZWN0cywKKyAqIGhvd2V2ZXIgdG8gYXZvaWQgdGhlIGhvcnJpYmxlIG1lc3MgaW4gaW5jbHVkZS9saW51eC9tbV90eXBlcy5oLCB3ZSdsbAorICoganVzdCBkZWZpbmUgb3VyIG93biBzdHJ1Y3QgcGFnZSB0eXBlIHZhcmlhbnQgaGVyZS4KKyAqLworc3RydWN0IHNsb2JfcGFnZSB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsJLyogbWFuZGF0b3J5ICovCisJCQlhdG9taWNfdCBfY291bnQ7CS8qIG1hbmRhdG9yeSAqLworCQkJc2xvYmlkeF90IHVuaXRzOwkvKiBmcmVlIHVuaXRzIGxlZnQgaW4gcGFnZSAqLworCQkJdW5zaWduZWQgbG9uZyBwYWRbMl07CisJCQlzbG9iX3QgKmZyZWU7CQkvKiBmaXJzdCBmcmVlIHNsb2JfdCBpbiBwYWdlICovCisJCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIGxpbmtlZCBsaXN0IG9mIGZyZWUgcGFnZXMgKi8KKwkJfTsKKwkJc3RydWN0IHBhZ2UgcGFnZTsKKwl9OworfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHJ1Y3Rfc2xvYl9wYWdlX3dyb25nX3NpemUodm9pZCkKK3sgQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgc2xvYl9wYWdlKSAhPSBzaXplb2Yoc3RydWN0IHBhZ2UpKTsgfQorCisvKgorICogZnJlZV9zbG9iX3BhZ2U6IGNhbGwgYmVmb3JlIGEgc2xvYl9wYWdlIGlzIHJldHVybmVkIHRvIHRoZSBwYWdlIGFsbG9jYXRvci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfc2xvYl9wYWdlKHN0cnVjdCBzbG9iX3BhZ2UgKnNwKQoreworCXJlc2V0X3BhZ2VfbWFwY291bnQoJnNwLT5wYWdlKTsKKwlzcC0+cGFnZS5tYXBwaW5nID0gTlVMTDsKK30KKworLyoKKyAqIEFsbCAocGFydGlhbGx5KSBmcmVlIHNsb2IgcGFnZXMgZ28gb24gdGhpcyBsaXN0LgorICovCitzdGF0aWMgTElTVF9IRUFEKGZyZWVfc2xvYl9wYWdlcyk7CisKKy8qCisgKiBzbG9iX3BhZ2U6IFRydWUgZm9yIGFsbCBzbG9iIHBhZ2VzIChmYWxzZSBmb3IgYmlnYmxvY2sgcGFnZXMpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNsb2JfcGFnZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoUEdfYWN0aXZlLCAmc3AtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9zbG9iX3BhZ2Uoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJX19zZXRfYml0KFBHX2FjdGl2ZSwgJnNwLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9zbG9iX3BhZ2Uoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJX19jbGVhcl9iaXQoUEdfYWN0aXZlLCAmc3AtPmZsYWdzKTsKK30KKworLyoKKyAqIHNsb2JfcGFnZV9mcmVlOiB0cnVlIGZvciBwYWdlcyBvbiBmcmVlX3Nsb2JfcGFnZXMgbGlzdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2xvYl9wYWdlX2ZyZWUoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJcmV0dXJuIHRlc3RfYml0KFBHX3ByaXZhdGUsICZzcC0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Nsb2JfcGFnZV9mcmVlKHN0cnVjdCBzbG9iX3BhZ2UgKnNwKQoreworCWxpc3RfYWRkKCZzcC0+bGlzdCwgJmZyZWVfc2xvYl9wYWdlcyk7CisJX19zZXRfYml0KFBHX3ByaXZhdGUsICZzcC0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc2xvYl9wYWdlX2ZyZWUoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJbGlzdF9kZWwoJnNwLT5saXN0KTsKKwlfX2NsZWFyX2JpdChQR19wcml2YXRlLCAmc3AtPmZsYWdzKTsKK30KKwogI2RlZmluZSBTTE9CX1VOSVQgc2l6ZW9mKHNsb2JfdCkKICNkZWZpbmUgU0xPQl9VTklUUyhzaXplKSAoKChzaXplKSArIFNMT0JfVU5JVCAtIDEpL1NMT0JfVU5JVCkKICNkZWZpbmUgU0xPQl9BTElHTiBMMV9DQUNIRV9CWVRFUwogCi1zdHJ1Y3QgYmlnYmxvY2sgewotCWludCBvcmRlcjsKLQl2b2lkICpwYWdlczsKLQlzdHJ1Y3QgYmlnYmxvY2sgKm5leHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgYmlnYmxvY2sgYmlnYmxvY2tfdDsKLQogLyoKICAqIHN0cnVjdCBzbG9iX3JjdSBpcyBpbnNlcnRlZCBhdCB0aGUgdGFpbCBvZiBhbGxvY2F0ZWQgc2xvYiBibG9ja3MsIHdoaWNoCiAgKiB3ZXJlIGNyZWF0ZWQgd2l0aCBhIFNMQUJfREVTVFJPWV9CWV9SQ1Ugc2xhYi4gc2xvYl9yY3UgaXMgdXNlZCB0byBmcmVlCkBAIC02NCwyMTUgKzE2NiwzMjEgQEAKIAlpbnQgc2l6ZTsKIH07CiAKLXN0YXRpYyBzbG9iX3QgYXJlbmEgPSB7IC5uZXh0ID0gJmFyZW5hLCAudW5pdHMgPSAxIH07Ci1zdGF0aWMgc2xvYl90ICpzbG9iZnJlZSA9ICZhcmVuYTsKLXN0YXRpYyBiaWdibG9ja190ICpiaWdibG9ja3M7CisvKgorICogc2xvYl9sb2NrIHByb3RlY3RzIGFsbCBzbG9iIGFsbG9jYXRvciBzdHJ1Y3R1cmVzLgorICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNsb2JfbG9jayk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJsb2NrX2xvY2spOwogCi1zdGF0aWMgdm9pZCBzbG9iX2ZyZWUodm9pZCAqYiwgaW50IHNpemUpOwotc3RhdGljIHZvaWQgc2xvYl90aW1lcl9jYmsodm9pZCk7CisvKgorICogRW5jb2RlIHRoZSBnaXZlbiBzaXplIGFuZCBuZXh0IGluZm8gaW50byBhIGZyZWUgc2xvYiBibG9jayBzLgorICovCitzdGF0aWMgdm9pZCBzZXRfc2xvYihzbG9iX3QgKnMsIHNsb2JpZHhfdCBzaXplLCBzbG9iX3QgKm5leHQpCit7CisJc2xvYl90ICpiYXNlID0gKHNsb2JfdCAqKSgodW5zaWduZWQgbG9uZylzICYgUEFHRV9NQVNLKTsKKwlzbG9iaWR4X3Qgb2Zmc2V0ID0gbmV4dCAtIGJhc2U7CiAKKwlpZiAoc2l6ZSA+IDEpIHsKKwkJc1swXS51bml0cyA9IHNpemU7CisJCXNbMV0udW5pdHMgPSBvZmZzZXQ7CisJfSBlbHNlCisJCXNbMF0udW5pdHMgPSAtb2Zmc2V0OworfQogCi1zdGF0aWMgdm9pZCAqc2xvYl9hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwLCBpbnQgYWxpZ24pCisvKgorICogUmV0dXJuIHRoZSBzaXplIG9mIGEgc2xvYiBibG9jay4KKyAqLworc3RhdGljIHNsb2JpZHhfdCBzbG9iX3VuaXRzKHNsb2JfdCAqcykKK3sKKwlpZiAocy0+dW5pdHMgPiAwKQorCQlyZXR1cm4gcy0+dW5pdHM7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG5leHQgZnJlZSBzbG9iIGJsb2NrIHBvaW50ZXIgYWZ0ZXIgdGhpcyBvbmUuCisgKi8KK3N0YXRpYyBzbG9iX3QgKnNsb2JfbmV4dChzbG9iX3QgKnMpCit7CisJc2xvYl90ICpiYXNlID0gKHNsb2JfdCAqKSgodW5zaWduZWQgbG9uZylzICYgUEFHRV9NQVNLKTsKKwlzbG9iaWR4X3QgbmV4dDsKKworCWlmIChzWzBdLnVuaXRzIDwgMCkKKwkJbmV4dCA9IC1zWzBdLnVuaXRzOworCWVsc2UKKwkJbmV4dCA9IHNbMV0udW5pdHM7CisJcmV0dXJuIGJhc2UrbmV4dDsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBzIGlzIHRoZSBsYXN0IGZyZWUgYmxvY2sgaW4gaXRzIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgc2xvYl9sYXN0KHNsb2JfdCAqcykKK3sKKwlyZXR1cm4gISgodW5zaWduZWQgbG9uZylzbG9iX25leHQocykgJiB+UEFHRV9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgKnNsb2JfbmV3X3BhZ2UoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIGludCBub2RlKQoreworCXZvaWQgKnBhZ2U7CisKKyNpZmRlZiBDT05GSUdfTlVNQQorCWlmIChub2RlICE9IC0xKQorCQlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBnZnAsIG9yZGVyKTsKKwllbHNlCisjZW5kaWYKKwkJcGFnZSA9IGFsbG9jX3BhZ2VzKGdmcCwgb3JkZXIpOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIHNsb2IgYmxvY2sgd2l0aGluIGEgZ2l2ZW4gc2xvYl9wYWdlIHNwLgorICovCitzdGF0aWMgdm9pZCAqc2xvYl9wYWdlX2FsbG9jKHN0cnVjdCBzbG9iX3BhZ2UgKnNwLCBzaXplX3Qgc2l6ZSwgaW50IGFsaWduKQogewogCXNsb2JfdCAqcHJldiwgKmN1ciwgKmFsaWduZWQgPSAwOwogCWludCBkZWx0YSA9IDAsIHVuaXRzID0gU0xPQl9VTklUUyhzaXplKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNsb2JfbG9jaywgZmxhZ3MpOwotCXByZXYgPSBzbG9iZnJlZTsKLQlmb3IgKGN1ciA9IHByZXYtPm5leHQ7IDsgcHJldiA9IGN1ciwgY3VyID0gY3VyLT5uZXh0KSB7CisJZm9yIChwcmV2ID0gTlVMTCwgY3VyID0gc3AtPmZyZWU7IDsgcHJldiA9IGN1ciwgY3VyID0gc2xvYl9uZXh0KGN1cikpIHsKKwkJc2xvYmlkeF90IGF2YWlsID0gc2xvYl91bml0cyhjdXIpOworCiAJCWlmIChhbGlnbikgewogCQkJYWxpZ25lZCA9IChzbG9iX3QgKilBTElHTigodW5zaWduZWQgbG9uZyljdXIsIGFsaWduKTsKIAkJCWRlbHRhID0gYWxpZ25lZCAtIGN1cjsKIAkJfQotCQlpZiAoY3VyLT51bml0cyA+PSB1bml0cyArIGRlbHRhKSB7IC8qIHJvb20gZW5vdWdoPyAqLworCQlpZiAoYXZhaWwgPj0gdW5pdHMgKyBkZWx0YSkgeyAvKiByb29tIGVub3VnaD8gKi8KKwkJCXNsb2JfdCAqbmV4dDsKKwogCQkJaWYgKGRlbHRhKSB7IC8qIG5lZWQgdG8gZnJhZ21lbnQgaGVhZCB0byBhbGlnbj8gKi8KLQkJCQlhbGlnbmVkLT51bml0cyA9IGN1ci0+dW5pdHMgLSBkZWx0YTsKLQkJCQlhbGlnbmVkLT5uZXh0ID0gY3VyLT5uZXh0OwotCQkJCWN1ci0+bmV4dCA9IGFsaWduZWQ7Ci0JCQkJY3VyLT51bml0cyA9IGRlbHRhOworCQkJCW5leHQgPSBzbG9iX25leHQoY3VyKTsKKwkJCQlzZXRfc2xvYihhbGlnbmVkLCBhdmFpbCAtIGRlbHRhLCBuZXh0KTsKKwkJCQlzZXRfc2xvYihjdXIsIGRlbHRhLCBhbGlnbmVkKTsKIAkJCQlwcmV2ID0gY3VyOwogCQkJCWN1ciA9IGFsaWduZWQ7CisJCQkJYXZhaWwgPSBzbG9iX3VuaXRzKGN1cik7CiAJCQl9CiAKLQkJCWlmIChjdXItPnVuaXRzID09IHVuaXRzKSAvKiBleGFjdCBmaXQ/ICovCi0JCQkJcHJldi0+bmV4dCA9IGN1ci0+bmV4dDsgLyogdW5saW5rICovCi0JCQllbHNlIHsgLyogZnJhZ21lbnQgKi8KLQkJCQlwcmV2LT5uZXh0ID0gY3VyICsgdW5pdHM7Ci0JCQkJcHJldi0+bmV4dC0+dW5pdHMgPSBjdXItPnVuaXRzIC0gdW5pdHM7Ci0JCQkJcHJldi0+bmV4dC0+bmV4dCA9IGN1ci0+bmV4dDsKLQkJCQljdXItPnVuaXRzID0gdW5pdHM7CisJCQluZXh0ID0gc2xvYl9uZXh0KGN1cik7CisJCQlpZiAoYXZhaWwgPT0gdW5pdHMpIHsgLyogZXhhY3QgZml0PyB1bmxpbmsuICovCisJCQkJaWYgKHByZXYpCisJCQkJCXNldF9zbG9iKHByZXYsIHNsb2JfdW5pdHMocHJldiksIG5leHQpOworCQkJCWVsc2UKKwkJCQkJc3AtPmZyZWUgPSBuZXh0OworCQkJfSBlbHNlIHsgLyogZnJhZ21lbnQgKi8KKwkJCQlpZiAocHJldikKKwkJCQkJc2V0X3Nsb2IocHJldiwgc2xvYl91bml0cyhwcmV2KSwgY3VyICsgdW5pdHMpOworCQkJCWVsc2UKKwkJCQkJc3AtPmZyZWUgPSBjdXIgKyB1bml0czsKKwkJCQlzZXRfc2xvYihjdXIgKyB1bml0cywgYXZhaWwgLSB1bml0cywgbmV4dCk7CiAJCQl9CiAKLQkJCXNsb2JmcmVlID0gcHJldjsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCQkJc3AtPnVuaXRzIC09IHVuaXRzOworCQkJaWYgKCFzcC0+dW5pdHMpCisJCQkJY2xlYXJfc2xvYl9wYWdlX2ZyZWUoc3ApOwogCQkJcmV0dXJuIGN1cjsKIAkJfQotCQlpZiAoY3VyID09IHNsb2JmcmVlKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG9iX2xvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHNpemUgPT0gUEFHRV9TSVpFKSAvKiB0cnlpbmcgdG8gc2hyaW5rIGFyZW5hPyAqLwotCQkJCXJldHVybiAwOwotCi0JCQljdXIgPSAoc2xvYl90ICopX19nZXRfZnJlZV9wYWdlKGdmcCk7Ci0JCQlpZiAoIWN1cikKLQkJCQlyZXR1cm4gMDsKLQotCQkJc2xvYl9mcmVlKGN1ciwgUEFHRV9TSVpFKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzbG9iX2xvY2ssIGZsYWdzKTsKLQkJCWN1ciA9IHNsb2JmcmVlOwotCQl9CisJCWlmIChzbG9iX2xhc3QoY3VyKSkKKwkJCXJldHVybiBOVUxMOwogCX0KIH0KIAotc3RhdGljIHZvaWQgc2xvYl9mcmVlKHZvaWQgKmJsb2NrLCBpbnQgc2l6ZSkKKy8qCisgKiBzbG9iX2FsbG9jOiBlbnRyeSBwb2ludCBpbnRvIHRoZSBzbG9iIGFsbG9jYXRvci4KKyAqLworc3RhdGljIHZvaWQgKnNsb2JfYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGdmcCwgaW50IGFsaWduLCBpbnQgbm9kZSkKIHsKLQlzbG9iX3QgKmN1ciwgKmIgPSAoc2xvYl90ICopYmxvY2s7CisJc3RydWN0IHNsb2JfcGFnZSAqc3A7CisJc2xvYl90ICpiID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFibG9jaykKLQkJcmV0dXJuOwotCi0JaWYgKHNpemUpCi0JCWItPnVuaXRzID0gU0xPQl9VTklUUyhzaXplKTsKLQotCS8qIEZpbmQgcmVpbnNlcnRpb24gcG9pbnQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvYl9sb2NrLCBmbGFncyk7Ci0JZm9yIChjdXIgPSBzbG9iZnJlZTsgIShiID4gY3VyICYmIGIgPCBjdXItPm5leHQpOyBjdXIgPSBjdXItPm5leHQpCi0JCWlmIChjdXIgPj0gY3VyLT5uZXh0ICYmIChiID4gY3VyIHx8IGIgPCBjdXItPm5leHQpKQotCQkJYnJlYWs7CisJLyogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGFydGlhbGx5IGZyZWUgcGFnZSwgdHJ5IHRvIGZpbmQgcm9vbSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3AsICZmcmVlX3Nsb2JfcGFnZXMsIGxpc3QpIHsKKyNpZmRlZiBDT05GSUdfTlVNQQorCQkvKgorCQkgKiBJZiB0aGVyZSdzIGEgbm9kZSBzcGVjaWZpY2F0aW9uLCBzZWFyY2ggZm9yIGEgcGFydGlhbAorCQkgKiBwYWdlIHdpdGggYSBtYXRjaGluZyBub2RlIGlkIGluIHRoZSBmcmVlbGlzdC4KKwkJICovCisJCWlmIChub2RlICE9IC0xICYmIHBhZ2VfdG9fbmlkKCZzcC0+cGFnZSkgIT0gbm9kZSkKKwkJCWNvbnRpbnVlOworI2VuZGlmCiAKLQlpZiAoYiArIGItPnVuaXRzID09IGN1ci0+bmV4dCkgewotCQliLT51bml0cyArPSBjdXItPm5leHQtPnVuaXRzOwotCQliLT5uZXh0ID0gY3VyLT5uZXh0LT5uZXh0OwotCX0gZWxzZQotCQliLT5uZXh0ID0gY3VyLT5uZXh0OworCQlpZiAoc3AtPnVuaXRzID49IFNMT0JfVU5JVFMoc2l6ZSkpIHsKKwkJCWIgPSBzbG9iX3BhZ2VfYWxsb2Moc3AsIHNpemUsIGFsaWduKTsKKwkJCWlmIChiKQorCQkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGN1ciArIGN1ci0+dW5pdHMgPT0gYikgewotCQljdXItPnVuaXRzICs9IGItPnVuaXRzOwotCQljdXItPm5leHQgPSBiLT5uZXh0OwotCX0gZWxzZQotCQljdXItPm5leHQgPSBiOworCS8qIE5vdCBlbm91Z2ggc3BhY2U6IG11c3QgYWxsb2NhdGUgYSBuZXcgcGFnZSAqLworCWlmICghYikgeworCQliID0gc2xvYl9uZXdfcGFnZShnZnAsIDAsIG5vZGUpOworCQlpZiAoIWIpCisJCQlyZXR1cm4gMDsKKwkJc3AgPSAoc3RydWN0IHNsb2JfcGFnZSAqKXZpcnRfdG9fcGFnZShiKTsKKwkJc2V0X3Nsb2JfcGFnZShzcCk7CiAKLQlzbG9iZnJlZSA9IGN1cjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCQlzcC0+dW5pdHMgPSBTTE9CX1VOSVRTKFBBR0VfU0laRSk7CisJCXNwLT5mcmVlID0gYjsKKwkJSU5JVF9MSVNUX0hFQUQoJnNwLT5saXN0KTsKKwkJc2V0X3Nsb2IoYiwgU0xPQl9VTklUUyhQQUdFX1NJWkUpLCBiICsgU0xPQl9VTklUUyhQQUdFX1NJWkUpKTsKKwkJc2V0X3Nsb2JfcGFnZV9mcmVlKHNwKTsKKwkJYiA9IHNsb2JfcGFnZV9hbGxvYyhzcCwgc2l6ZSwgYWxpZ24pOworCQlCVUdfT04oIWIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG9iX2xvY2ssIGZsYWdzKTsKKwl9CisJaWYgKHVubGlrZWx5KChnZnAgJiBfX0dGUF9aRVJPKSAmJiBiKSkKKwkJbWVtc2V0KGIsIDAsIHNpemUpOworCXJldHVybiBiOworfQogCisvKgorICogc2xvYl9mcmVlOiBlbnRyeSBwb2ludCBpbnRvIHRoZSBzbG9iIGFsbG9jYXRvci4KKyAqLworc3RhdGljIHZvaWQgc2xvYl9mcmVlKHZvaWQgKmJsb2NrLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2xvYl9wYWdlICpzcDsKKwlzbG9iX3QgKnByZXYsICpuZXh0LCAqYiA9IChzbG9iX3QgKilibG9jazsKKwlzbG9iaWR4X3QgdW5pdHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChaRVJPX09SX05VTExfUFRSKGJsb2NrKSkKKwkJcmV0dXJuOworCUJVR19PTighc2l6ZSk7CisKKwlzcCA9IChzdHJ1Y3Qgc2xvYl9wYWdlICopdmlydF90b19wYWdlKGJsb2NrKTsKKwl1bml0cyA9IFNMT0JfVU5JVFMoc2l6ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvYl9sb2NrLCBmbGFncyk7CisKKwlpZiAoc3AtPnVuaXRzICsgdW5pdHMgPT0gU0xPQl9VTklUUyhQQUdFX1NJWkUpKSB7CisJCS8qIEdvIGRpcmVjdGx5IHRvIHBhZ2UgYWxsb2NhdG9yLiBEbyBub3QgcGFzcyBzbG9iIGFsbG9jYXRvciAqLworCQlpZiAoc2xvYl9wYWdlX2ZyZWUoc3ApKQorCQkJY2xlYXJfc2xvYl9wYWdlX2ZyZWUoc3ApOworCQljbGVhcl9zbG9iX3BhZ2Uoc3ApOworCQlmcmVlX3Nsb2JfcGFnZShzcCk7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyliKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFzbG9iX3BhZ2VfZnJlZShzcCkpIHsKKwkJLyogVGhpcyBzbG9iIHBhZ2UgaXMgYWJvdXQgdG8gYmVjb21lIHBhcnRpYWxseSBmcmVlLiBFYXN5ISAqLworCQlzcC0+dW5pdHMgPSB1bml0czsKKwkJc3AtPmZyZWUgPSBiOworCQlzZXRfc2xvYihiLCB1bml0cywKKwkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShiICsKKwkJCQkJU0xPQl9VTklUUyhQQUdFX1NJWkUpKSAmIFBBR0VfTUFTSykpOworCQlzZXRfc2xvYl9wYWdlX2ZyZWUoc3ApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIE90aGVyd2lzZSB0aGUgcGFnZSBpcyBhbHJlYWR5IHBhcnRpYWxseSBmcmVlLCBzbyBmaW5kIHJlaW5zZXJ0aW9uCisJICogcG9pbnQuCisJICovCisJc3AtPnVuaXRzICs9IHVuaXRzOworCisJaWYgKGIgPCBzcC0+ZnJlZSkgeworCQlzZXRfc2xvYihiLCB1bml0cywgc3AtPmZyZWUpOworCQlzcC0+ZnJlZSA9IGI7CisJfSBlbHNlIHsKKwkJcHJldiA9IHNwLT5mcmVlOworCQluZXh0ID0gc2xvYl9uZXh0KHByZXYpOworCQl3aGlsZSAoYiA+IG5leHQpIHsKKwkJCXByZXYgPSBuZXh0OworCQkJbmV4dCA9IHNsb2JfbmV4dChwcmV2KTsKKwkJfQorCisJCWlmICghc2xvYl9sYXN0KHByZXYpICYmIGIgKyB1bml0cyA9PSBuZXh0KSB7CisJCQl1bml0cyArPSBzbG9iX3VuaXRzKG5leHQpOworCQkJc2V0X3Nsb2IoYiwgdW5pdHMsIHNsb2JfbmV4dChuZXh0KSk7CisJCX0gZWxzZQorCQkJc2V0X3Nsb2IoYiwgdW5pdHMsIG5leHQpOworCisJCWlmIChwcmV2ICsgc2xvYl91bml0cyhwcmV2KSA9PSBiKSB7CisJCQl1bml0cyA9IHNsb2JfdW5pdHMoYikgKyBzbG9iX3VuaXRzKHByZXYpOworCQkJc2V0X3Nsb2IocHJldiwgdW5pdHMsIHNsb2JfbmV4dChiKSk7CisJCX0gZWxzZQorCQkJc2V0X3Nsb2IocHJldiwgc2xvYl91bml0cyhwcmV2KSwgYik7CisJfQorb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOwogfQogCi12b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGdmcCkKLXsKLQlzbG9iX3QgKm07Ci0JYmlnYmxvY2tfdCAqYmI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzaXplIDwgUEFHRV9TSVpFIC0gU0xPQl9VTklUKSB7Ci0JCW0gPSBzbG9iX2FsbG9jKHNpemUgKyBTTE9CX1VOSVQsIGdmcCwgMCk7Ci0JCXJldHVybiBtID8gKHZvaWQgKikobSArIDEpIDogMDsKLQl9Ci0KLQliYiA9IHNsb2JfYWxsb2Moc2l6ZW9mKGJpZ2Jsb2NrX3QpLCBnZnAsIDApOwotCWlmICghYmIpCi0JCXJldHVybiAwOwotCi0JYmItPm9yZGVyID0gZ2V0X29yZGVyKHNpemUpOwotCWJiLT5wYWdlcyA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhnZnAsIGJiLT5vcmRlcik7Ci0KLQlpZiAoYmItPnBhZ2VzKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZibG9ja19sb2NrLCBmbGFncyk7Ci0JCWJiLT5uZXh0ID0gYmlnYmxvY2tzOwotCQliaWdibG9ja3MgPSBiYjsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxvY2tfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gYmItPnBhZ2VzOwotCX0KLQotCXNsb2JfZnJlZShiYiwgc2l6ZW9mKGJpZ2Jsb2NrX3QpKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woX19rbWFsbG9jKTsKLQotLyoqCi0gKiBrcmVhbGxvYyAtIHJlYWxsb2NhdGUgbWVtb3J5LiBUaGUgY29udGVudHMgd2lsbCByZW1haW4gdW5jaGFuZ2VkLgotICoKLSAqIEBwOiBvYmplY3QgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgZm9yLgotICogQG5ld19zaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBhcmUgcHJlc2VydmVkIHVwIHRvIHRoZQotICogbGVzc2VyIG9mIHRoZSBuZXcgYW5kIG9sZCBzaXplcy4gIElmIEBwIGlzICVOVUxMLCBrcmVhbGxvYygpCi0gKiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBrbWFsbG9jKCkuICBJZiBAc2l6ZSBpcyAwIGFuZCBAcCBpcyBub3QgYQotICogJU5VTEwgcG9pbnRlciwgdGhlIG9iamVjdCBwb2ludGVkIHRvIGlzIGZyZWVkLgorLyoKKyAqIEVuZCBvZiBzbG9iIGFsbG9jYXRvciBwcm9wZXIuIEJlZ2luIGttZW1fY2FjaGVfYWxsb2MgYW5kIGttYWxsb2MgZnJvbnRlbmQuCiAgKi8KLXZvaWQgKmtyZWFsbG9jKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBuZXdfc2l6ZSwgZ2ZwX3QgZmxhZ3MpCisKKyNpZm5kZWYgQVJDSF9LTUFMTE9DX01JTkFMSUdOCisjZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKQorI2VuZGlmCisKKyNpZm5kZWYgQVJDSF9TTEFCX01JTkFMSUdOCisjZGVmaW5lIEFSQ0hfU0xBQl9NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKQorI2VuZGlmCisKK3ZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBnZnAsIGludCBub2RlKQogewotCXZvaWQgKnJldDsKKwl1bnNpZ25lZCBpbnQgKm07CisJaW50IGFsaWduID0gbWF4KEFSQ0hfS01BTExPQ19NSU5BTElHTiwgQVJDSF9TTEFCX01JTkFMSUdOKTsKIAotCWlmICh1bmxpa2VseSghcCkpCi0JCXJldHVybiBrbWFsbG9jX3RyYWNrX2NhbGxlcihuZXdfc2l6ZSwgZmxhZ3MpOworCWlmIChzaXplIDwgUEFHRV9TSVpFIC0gYWxpZ24pIHsKKwkJaWYgKCFzaXplKQorCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CiAKLQlpZiAodW5saWtlbHkoIW5ld19zaXplKSkgewotCQlrZnJlZShwKTsKLQkJcmV0dXJuIE5VTEw7CisJCW0gPSBzbG9iX2FsbG9jKHNpemUgKyBhbGlnbiwgZ2ZwLCBhbGlnbiwgbm9kZSk7CisJCWlmIChtKQorCQkJKm0gPSBzaXplOworCQlyZXR1cm4gKHZvaWQgKiltICsgYWxpZ247CisJfSBlbHNlIHsKKwkJdm9pZCAqcmV0OworCisJCXJldCA9IHNsb2JfbmV3X3BhZ2UoZ2ZwIHwgX19HRlBfQ09NUCwgZ2V0X29yZGVyKHNpemUpLCBub2RlKTsKKwkJaWYgKHJldCkgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCQlwYWdlID0gdmlydF90b19wYWdlKHJldCk7CisJCQlwYWdlLT5wcml2YXRlID0gc2l6ZTsKKwkJfQorCQlyZXR1cm4gcmV0OwogCX0KLQotCXJldCA9IGttYWxsb2NfdHJhY2tfY2FsbGVyKG5ld19zaXplLCBmbGFncyk7Ci0JaWYgKHJldCkgewotCQltZW1jcHkocmV0LCBwLCBtaW4obmV3X3NpemUsIGtzaXplKHApKSk7Ci0JCWtmcmVlKHApOwotCX0KLQlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChrcmVhbGxvYyk7CitFWFBPUlRfU1lNQk9MKF9fa21hbGxvY19ub2RlKTsKIAogdm9pZCBrZnJlZShjb25zdCB2b2lkICpibG9jaykKIHsKLQliaWdibG9ja190ICpiYiwgKipsYXN0ID0gJmJpZ2Jsb2NrczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzbG9iX3BhZ2UgKnNwOwogCi0JaWYgKCFibG9jaykKKwlpZiAoWkVST19PUl9OVUxMX1BUUihibG9jaykpCiAJCXJldHVybjsKIAotCWlmICghKCh1bnNpZ25lZCBsb25nKWJsb2NrICYgKFBBR0VfU0laRS0xKSkpIHsKLQkJLyogbWlnaHQgYmUgb24gdGhlIGJpZyBibG9jayBsaXN0ICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZibG9ja19sb2NrLCBmbGFncyk7Ci0JCWZvciAoYmIgPSBiaWdibG9ja3M7IGJiOyBsYXN0ID0gJmJiLT5uZXh0LCBiYiA9IGJiLT5uZXh0KSB7Ci0JCQlpZiAoYmItPnBhZ2VzID09IGJsb2NrKSB7Ci0JCQkJKmxhc3QgPSBiYi0+bmV4dDsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibG9ja19sb2NrLCBmbGFncyk7Ci0JCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylibG9jaywgYmItPm9yZGVyKTsKLQkJCQlzbG9iX2ZyZWUoYmIsIHNpemVvZihiaWdibG9ja190KSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlzbG9iX2ZyZWUoKHNsb2JfdCAqKWJsb2NrIC0gMSwgMCk7Ci0JcmV0dXJuOworCXNwID0gKHN0cnVjdCBzbG9iX3BhZ2UgKil2aXJ0X3RvX3BhZ2UoYmxvY2spOworCWlmIChzbG9iX3BhZ2Uoc3ApKSB7CisJCWludCBhbGlnbiA9IG1heChBUkNIX0tNQUxMT0NfTUlOQUxJR04sIEFSQ0hfU0xBQl9NSU5BTElHTik7CisJCXVuc2lnbmVkIGludCAqbSA9ICh1bnNpZ25lZCBpbnQgKikoYmxvY2sgLSBhbGlnbik7CisJCXNsb2JfZnJlZShtLCAqbSArIGFsaWduKTsKKwl9IGVsc2UKKwkJcHV0X3BhZ2UoJnNwLT5wYWdlKTsKIH0KLQogRVhQT1JUX1NZTUJPTChrZnJlZSk7CiAKKy8qIGNhbid0IHVzZSBrc2l6ZSBmb3Iga21lbV9jYWNoZV9hbGxvYyBtZW1vcnksIG9ubHkga21hbGxvYyAqLwogc2l6ZV90IGtzaXplKGNvbnN0IHZvaWQgKmJsb2NrKQogewotCWJpZ2Jsb2NrX3QgKmJiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNsb2JfcGFnZSAqc3A7CiAKLQlpZiAoIWJsb2NrKQorCWlmIChaRVJPX09SX05VTExfUFRSKGJsb2NrKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoISgodW5zaWduZWQgbG9uZylibG9jayAmIChQQUdFX1NJWkUtMSkpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZibG9ja19sb2NrLCBmbGFncyk7Ci0JCWZvciAoYmIgPSBiaWdibG9ja3M7IGJiOyBiYiA9IGJiLT5uZXh0KQotCQkJaWYgKGJiLT5wYWdlcyA9PSBibG9jaykgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOwotCQkJCXJldHVybiBQQUdFX1NJWkUgPDwgYmItPm9yZGVyOwotCQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibG9ja19sb2NrLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuICgoc2xvYl90ICopYmxvY2sgLSAxKS0+dW5pdHMgKiBTTE9CX1VOSVQ7CisJc3AgPSAoc3RydWN0IHNsb2JfcGFnZSAqKXZpcnRfdG9fcGFnZShibG9jayk7CisJaWYgKHNsb2JfcGFnZShzcCkpCisJCXJldHVybiAoKHNsb2JfdCAqKWJsb2NrIC0gMSktPnVuaXRzICsgU0xPQl9VTklUOworCWVsc2UKKwkJcmV0dXJuIHNwLT5wYWdlLnByaXZhdGU7CiB9CiAKIHN0cnVjdCBrbWVtX2NhY2hlIHsKQEAgLTI4OSw3ICs0OTcsNyBAQAogewogCXN0cnVjdCBrbWVtX2NhY2hlICpjOwogCi0JYyA9IHNsb2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlKSwgZmxhZ3MsIDApOworCWMgPSBzbG9iX2FsbG9jKHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZSksIGZsYWdzLCAwLCAtMSk7CiAKIAlpZiAoYykgewogCQljLT5uYW1lID0gbmFtZTsKQEAgLTMwMiw2ICs1MTAsOCBAQAogCQljLT5jdG9yID0gY3RvcjsKIAkJLyogaWdub3JlIGFsaWdubWVudCB1bmxlc3MgaXQncyBmb3JjZWQgKi8KIAkJYy0+YWxpZ24gPSAoZmxhZ3MgJiBTTEFCX0hXQ0FDSEVfQUxJR04pID8gU0xPQl9BTElHTiA6IDA7CisJCWlmIChjLT5hbGlnbiA8IEFSQ0hfU0xBQl9NSU5BTElHTikKKwkJCWMtPmFsaWduID0gQVJDSF9TTEFCX01JTkFMSUdOOwogCQlpZiAoYy0+YWxpZ24gPCBhbGlnbikKIAkJCWMtPmFsaWduID0gYWxpZ247CiAJfSBlbHNlIGlmIChmbGFncyAmIFNMQUJfUEFOSUMpCkBAIC0zMTcsMzEgKzUyNywyMSBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2Rlc3Ryb3kpOwogCi12b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpjLCBnZnBfdCBmbGFncykKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqYywgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewogCXZvaWQgKmI7CiAKIAlpZiAoYy0+c2l6ZSA8IFBBR0VfU0laRSkKLQkJYiA9IHNsb2JfYWxsb2MoYy0+c2l6ZSwgZmxhZ3MsIGMtPmFsaWduKTsKKwkJYiA9IHNsb2JfYWxsb2MoYy0+c2l6ZSwgZmxhZ3MsIGMtPmFsaWduLCBub2RlKTsKIAllbHNlCi0JCWIgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZmxhZ3MsIGdldF9vcmRlcihjLT5zaXplKSk7CisJCWIgPSBzbG9iX25ld19wYWdlKGZsYWdzLCBnZXRfb3JkZXIoYy0+c2l6ZSksIG5vZGUpOwogCiAJaWYgKGMtPmN0b3IpCiAJCWMtPmN0b3IoYiwgYywgMCk7CiAKIAlyZXR1cm4gYjsKIH0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvYyk7Ci0KLXZvaWQgKmttZW1fY2FjaGVfemFsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpjLCBnZnBfdCBmbGFncykKLXsKLQl2b2lkICpyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKGMsIGZsYWdzKTsKLQlpZiAocmV0KQotCQltZW1zZXQocmV0LCAwLCBjLT5zaXplKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfemFsbG9jKTsKK0VYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKIAogc3RhdGljIHZvaWQgX19rbWVtX2NhY2hlX2ZyZWUodm9pZCAqYiwgaW50IHNpemUpCiB7CkBAIC0zODUsOSArNTg1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9uYW1lKTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNsb2JfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUigKLQkodm9pZCAoKikodW5zaWduZWQgbG9uZykpc2xvYl90aW1lcl9jYmssIDAsIDApOwotCiBpbnQga21lbV9jYWNoZV9zaHJpbmsoc3RydWN0IGttZW1fY2FjaGUgKmQpCiB7CiAJcmV0dXJuIDA7CkBAIC0zOTksMTcgKzU5NiwxNCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9faW5pdCBrbWVtX2NhY2hlX2luaXQodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2xvYl9yZWFkeSBfX3JlYWRfbW9zdGx5OworCitpbnQgc2xhYl9pc19hdmFpbGFibGUodm9pZCkKIHsKLQlzbG9iX3RpbWVyX2NiaygpOworCXJldHVybiBzbG9iX3JlYWR5OwogfQogCi1zdGF0aWMgdm9pZCBzbG9iX3RpbWVyX2Niayh2b2lkKQordm9pZCBfX2luaXQga21lbV9jYWNoZV9pbml0KHZvaWQpCiB7Ci0Jdm9pZCAqcCA9IHNsb2JfYWxsb2MoUEFHRV9TSVpFLCAwLCBQQUdFX1NJWkUtMSk7Ci0KLQlpZiAocCkKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXApOwotCi0JbW9kX3RpbWVyKCZzbG9iX3RpbWVyLCBqaWZmaWVzICsgSFopOworCXNsb2JfcmVhZHkgPSAxOwogfQpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IGUwY2Y2MjEuLjUyYTRmNDQgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTIwNSw2ICsyMDUsMTEgQEAKICNkZWZpbmUgQVJDSF9TTEFCX01JTkFMSUdOIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcgbG9uZykKICNlbmRpZgogCisvKgorICogVGhlIHBhZ2UtPmludXNlIGZpZWxkIGlzIDE2IGJpdCB0aHVzIHdlIGhhdmUgdGhpcyBsaW1pdGF0aW9uCisgKi8KKyNkZWZpbmUgTUFYX09CSkVDVFNfUEVSX1NMQUIgNjU1MzUKKwogLyogSW50ZXJuYWwgU0xVQiBmbGFncyAqLwogI2RlZmluZSBfX09CSkVDVF9QT0lTT04gMHg4MDAwMDAwMAkvKiBQb2lzb24gb2JqZWN0ICovCiAKQEAgLTIyOCw3ICsyMzMsNyBAQAogCiAvKiBBIGxpc3Qgb2YgYWxsIHNsYWIgY2FjaGVzIG9uIHRoZSBzeXN0ZW0gKi8KIHN0YXRpYyBERUNMQVJFX1JXU0VNKHNsdWJfbG9jayk7Ci1MSVNUX0hFQUQoc2xhYl9jYWNoZXMpOworc3RhdGljIExJU1RfSEVBRChzbGFiX2NhY2hlcyk7CiAKIC8qCiAgKiBUcmFja2luZyB1c2VyIG9mIGEgc2xhYi4KQEAgLTI0Nyw5ICsyNTIsMTAgQEAKIHN0YXRpYyBpbnQgc3lzZnNfc2xhYl9hbGlhcyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBjb25zdCBjaGFyICopOwogc3RhdGljIHZvaWQgc3lzZnNfc2xhYl9yZW1vdmUoc3RydWN0IGttZW1fY2FjaGUgKik7CiAjZWxzZQotc3RhdGljIGludCBzeXNmc19zbGFiX2FkZChzdHJ1Y3Qga21lbV9jYWNoZSAqcykgeyByZXR1cm4gMDsgfQotc3RhdGljIGludCBzeXNmc19zbGFiX2FsaWFzKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjb25zdCBjaGFyICpwKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgdm9pZCBzeXNmc19zbGFiX3JlbW92ZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykge30KK3N0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX3NsYWJfYWRkKHN0cnVjdCBrbWVtX2NhY2hlICpzKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBzeXNmc19zbGFiX2FsaWFzKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjb25zdCBjaGFyICpwKQorCQkJCQkJCXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNmc19zbGFiX3JlbW92ZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykge30KICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMyMyw3ICszMjksMTEgQEAKIC8qCiAgKiBEZWJ1ZyBzZXR0aW5nczoKICAqLworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHX09OCitzdGF0aWMgaW50IHNsdWJfZGVidWcgPSBERUJVR19ERUZBVUxUX0ZMQUdTOworI2Vsc2UKIHN0YXRpYyBpbnQgc2x1Yl9kZWJ1ZzsKKyNlbmRpZgogCiBzdGF0aWMgY2hhciAqc2x1Yl9kZWJ1Z19zbGFiczsKIApAQCAtMzQwLDcgKzM1MCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJaWYgKG5ld2xpbmUpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJTEwcyAweCVwOiAiLCB0ZXh0LCBhZGRyICsgaSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiU4cyAweCVwOiAiLCB0ZXh0LCBhZGRyICsgaSk7CiAJCQluZXdsaW5lID0gMDsKIAkJfQogCQlwcmludGsoIiAlMDJ4IiwgYWRkcltpXSk7CkBAIC0zOTcsMTAgKzQwNywxMSBAQAogCiBzdGF0aWMgdm9pZCBpbml0X3RyYWNraW5nKHN0cnVjdCBrbWVtX2NhY2hlICpzLCB2b2lkICpvYmplY3QpCiB7Ci0JaWYgKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSB7Ci0JCXNldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0ZSRUUsIE5VTEwpOwotCQlzZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19BTExPQywgTlVMTCk7Ci0JfQorCWlmICghKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSkKKwkJcmV0dXJuOworCisJc2V0X3RyYWNrKHMsIG9iamVjdCwgVFJBQ0tfRlJFRSwgTlVMTCk7CisJc2V0X3RyYWNrKHMsIG9iamVjdCwgVFJBQ0tfQUxMT0MsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF90cmFjayhjb25zdCBjaGFyICpzLCBzdHJ1Y3QgdHJhY2sgKnQpCkBAIC00MDgsNjUgKzQxOSwxMDYgQEAKIAlpZiAoIXQtPmFkZHIpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6ICIsIHMpOworCXByaW50ayhLRVJOX0VSUiAiSU5GTzogJXMgaW4gIiwgcyk7CiAJX19wcmludF9zeW1ib2woIiVzIiwgKHVuc2lnbmVkIGxvbmcpdC0+YWRkcik7Ci0JcHJpbnRrKCIgamlmZmllc19hZ289JWx1IGNwdT0ldSBwaWQ9JWRcbiIsIGppZmZpZXMgLSB0LT53aGVuLCB0LT5jcHUsIHQtPnBpZCk7CisJcHJpbnRrKCIgYWdlPSVsdSBjcHU9JXUgcGlkPSVkXG4iLCBqaWZmaWVzIC0gdC0+d2hlbiwgdC0+Y3B1LCB0LT5waWQpOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF90cmFpbGVyKHN0cnVjdCBrbWVtX2NhY2hlICpzLCB1OCAqcCkKK3N0YXRpYyB2b2lkIHByaW50X3RyYWNraW5nKHN0cnVjdCBrbWVtX2NhY2hlICpzLCB2b2lkICpvYmplY3QpCit7CisJaWYgKCEocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpKQorCQlyZXR1cm47CisKKwlwcmludF90cmFjaygiQWxsb2NhdGVkIiwgZ2V0X3RyYWNrKHMsIG9iamVjdCwgVFJBQ0tfQUxMT0MpKTsKKwlwcmludF90cmFjaygiRnJlZWQiLCBnZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19GUkVFKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3BhZ2VfaW5mbyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlwcmludGsoS0VSTl9FUlIgIklORk86IFNsYWIgMHglcCB1c2VkPSV1IGZwPTB4JXAgZmxhZ3M9MHglMDRseFxuIiwKKwkJcGFnZSwgcGFnZS0+aW51c2UsIHBhZ2UtPmZyZWVsaXN0LCBwYWdlLT5mbGFncyk7CisKK30KKworc3RhdGljIHZvaWQgc2xhYl9idWcoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1ZlsxMDBdOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcHJpbnRrKEtFUk5fRVJSICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorCQkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXByaW50ayhLRVJOX0VSUiAiQlVHICVzOiAlc1xuIiwgcy0+bmFtZSwgYnVmKTsKKwlwcmludGsoS0VSTl9FUlIgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKK30KKworc3RhdGljIHZvaWQgc2xhYl9maXgoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1ZlsxMDBdOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcHJpbnRrKEtFUk5fRVJSICJGSVggJXM6ICVzXG4iLCBzLT5uYW1lLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBwcmludF90cmFpbGVyKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdTggKnApCiB7CiAJdW5zaWduZWQgaW50IG9mZjsJLyogT2Zmc2V0IG9mIGxhc3QgYnl0ZSAqLworCXU4ICphZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCisJcHJpbnRfdHJhY2tpbmcocywgcCk7CisKKwlwcmludF9wYWdlX2luZm8ocGFnZSk7CisKKwlwcmludGsoS0VSTl9FUlIgIklORk86IE9iamVjdCAweCVwIEBvZmZzZXQ9JXR1IGZwPTB4JXBcblxuIiwKKwkJCXAsIHAgLSBhZGRyLCBnZXRfZnJlZXBvaW50ZXIocywgcCkpOworCisJaWYgKHAgPiBhZGRyICsgMTYpCisJCXByaW50X3NlY3Rpb24oIkJ5dGVzIGI0IiwgcCAtIDE2LCAxNik7CisKKwlwcmludF9zZWN0aW9uKCJPYmplY3QiLCBwLCBtaW4ocy0+b2Jqc2l6ZSwgMTI4KSk7CiAKIAlpZiAocy0+ZmxhZ3MgJiBTTEFCX1JFRF9aT05FKQogCQlwcmludF9zZWN0aW9uKCJSZWR6b25lIiwgcCArIHMtPm9ianNpemUsCiAJCQlzLT5pbnVzZSAtIHMtPm9ianNpemUpOwogCi0JcHJpbnRrKEtFUk5fRVJSICJGcmVlUG9pbnRlciAweCVwIC0+IDB4JXBcbiIsCi0JCQlwICsgcy0+b2Zmc2V0LAotCQkJZ2V0X2ZyZWVwb2ludGVyKHMsIHApKTsKLQogCWlmIChzLT5vZmZzZXQpCiAJCW9mZiA9IHMtPm9mZnNldCArIHNpemVvZih2b2lkICopOwogCWVsc2UKIAkJb2ZmID0gcy0+aW51c2U7CiAKLQlpZiAocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpIHsKLQkJcHJpbnRfdHJhY2soIkxhc3QgYWxsb2MiLCBnZXRfdHJhY2socywgcCwgVFJBQ0tfQUxMT0MpKTsKLQkJcHJpbnRfdHJhY2soIkxhc3QgZnJlZSAiLCBnZXRfdHJhY2socywgcCwgVFJBQ0tfRlJFRSkpOworCWlmIChzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikKIAkJb2ZmICs9IDIgKiBzaXplb2Yoc3RydWN0IHRyYWNrKTsKLQl9CiAKIAlpZiAob2ZmICE9IHMtPnNpemUpCiAJCS8qIEJlZ2lubmluZyBvZiB0aGUgZmlsbGVyIGlzIHRoZSBmcmVlIHBvaW50ZXIgKi8KLQkJcHJpbnRfc2VjdGlvbigiRmlsbGVyIiwgcCArIG9mZiwgcy0+c2l6ZSAtIG9mZik7CisJCXByaW50X3NlY3Rpb24oIlBhZGRpbmciLCBwICsgb2ZmLCBzLT5zaXplIC0gb2ZmKTsKKworCWR1bXBfc3RhY2soKTsKIH0KIAogc3RhdGljIHZvaWQgb2JqZWN0X2VycihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQl1OCAqb2JqZWN0LCBjaGFyICpyZWFzb24pCiB7Ci0JdTggKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0KLQlwcmludGsoS0VSTl9FUlIgIioqKiBTTFVCICVzOiAlc0AweCVwIHNsYWIgMHglcFxuIiwKLQkJCXMtPm5hbWUsIHJlYXNvbiwgb2JqZWN0LCBwYWdlKTsKLQlwcmludGsoS0VSTl9FUlIgIiAgICBvZmZzZXQ9JXR1IGZsYWdzPTB4JTA0bHggaW51c2U9JXUgZnJlZWxpc3Q9MHglcFxuIiwKLQkJb2JqZWN0IC0gYWRkciwgcGFnZS0+ZmxhZ3MsIHBhZ2UtPmludXNlLCBwYWdlLT5mcmVlbGlzdCk7Ci0JaWYgKG9iamVjdCA+IGFkZHIgKyAxNikKLQkJcHJpbnRfc2VjdGlvbigiQnl0ZXMgYjQiLCBvYmplY3QgLSAxNiwgMTYpOwotCXByaW50X3NlY3Rpb24oIk9iamVjdCIsIG9iamVjdCwgbWluKHMtPm9ianNpemUsIDEyOCkpOwotCXByaW50X3RyYWlsZXIocywgb2JqZWN0KTsKLQlkdW1wX3N0YWNrKCk7CisJc2xhYl9idWcocywgcmVhc29uKTsKKwlwcmludF90cmFpbGVyKHMsIHBhZ2UsIG9iamVjdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNsYWJfZXJyKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgY2hhciAqcmVhc29uLCAuLi4pCitzdGF0aWMgdm9pZCBzbGFiX2VycihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAljaGFyIGJ1ZlsxMDBdOwogCi0JdmFfc3RhcnQoYXJncywgcmVhc29uKTsKLQl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgcmVhc29uLCBhcmdzKTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKLQlwcmludGsoS0VSTl9FUlIgIioqKiBTTFVCICVzOiAlcyBpbiBzbGFiIEAweCVwXG4iLCBzLT5uYW1lLCBidWYsCi0JCXBhZ2UpOworCXNsYWJfYnVnKHMsIGZtdCk7CisJcHJpbnRfcGFnZV9pbmZvKHBhZ2UpOwogCWR1bXBfc3RhY2soKTsKIH0KIApAQCAtNDg1LDE1ICs1MzcsNDYgQEAKIAkJCXMtPmludXNlIC0gcy0+b2Jqc2l6ZSk7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfYnl0ZXModTggKnN0YXJ0LCB1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKK3N0YXRpYyB1OCAqY2hlY2tfYnl0ZXModTggKnN0YXJ0LCB1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKIHsKIAl3aGlsZSAoYnl0ZXMpIHsKIAkJaWYgKCpzdGFydCAhPSAodTgpdmFsdWUpCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBzdGFydDsKIAkJc3RhcnQrKzsKIAkJYnl0ZXMtLTsKIAl9Ci0JcmV0dXJuIDE7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfYnl0ZXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNoYXIgKm1lc3NhZ2UsIHU4IGRhdGEsCisJCQkJCQl2b2lkICpmcm9tLCB2b2lkICp0bykKK3sKKwlzbGFiX2ZpeChzLCAiUmVzdG9yaW5nIDB4JXAtMHglcD0weCV4XG4iLCBmcm9tLCB0byAtIDEsIGRhdGEpOworCW1lbXNldChmcm9tLCBkYXRhLCB0byAtIGZyb20pOworfQorCitzdGF0aWMgaW50IGNoZWNrX2J5dGVzX2FuZF9yZXBvcnQoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJdTggKm9iamVjdCwgY2hhciAqd2hhdCwKKwkJCXU4KiBzdGFydCwgdW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCit7CisJdTggKmZhdWx0OworCXU4ICplbmQ7CisKKwlmYXVsdCA9IGNoZWNrX2J5dGVzKHN0YXJ0LCB2YWx1ZSwgYnl0ZXMpOworCWlmICghZmF1bHQpCisJCXJldHVybiAxOworCisJZW5kID0gc3RhcnQgKyBieXRlczsKKwl3aGlsZSAoZW5kID4gZmF1bHQgJiYgZW5kWy0xXSA9PSB2YWx1ZSkKKwkJZW5kLS07CisKKwlzbGFiX2J1ZyhzLCAiJXMgb3ZlcndyaXR0ZW4iLCB3aGF0KTsKKwlwcmludGsoS0VSTl9FUlIgIklORk86IDB4JXAtMHglcC4gRmlyc3QgYnl0ZSAweCV4IGluc3RlYWQgb2YgMHgleFxuIiwKKwkJCQkJZmF1bHQsIGVuZCAtIDEsIGZhdWx0WzBdLCB2YWx1ZSk7CisJcHJpbnRfdHJhaWxlcihzLCBwYWdlLCBvYmplY3QpOworCisJcmVzdG9yZV9ieXRlcyhzLCB3aGF0LCB2YWx1ZSwgZmF1bHQsIGVuZCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC01MzQsMTQgKzYxNyw2IEBACiAgKiBtYXkgYmUgdXNlZCB3aXRoIG1lcmdlZCBzbGFiY2FjaGVzLgogICovCiAKLXN0YXRpYyB2b2lkIHJlc3RvcmVfYnl0ZXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNoYXIgKm1lc3NhZ2UsIHU4IGRhdGEsCi0JCQkJCQl2b2lkICpmcm9tLCB2b2lkICp0bykKLXsKLQlwcmludGsoS0VSTl9FUlIgIkBAQCBTTFVCICVzOiBSZXN0b3JpbmcgJXMgKDB4JXgpIGZyb20gMHglcC0weCVwXG4iLAotCQlzLT5uYW1lLCBtZXNzYWdlLCBkYXRhLCBmcm9tLCB0byAtIDEpOwotCW1lbXNldChmcm9tLCBkYXRhLCB0byAtIGZyb20pOwotfQotCiBzdGF0aWMgaW50IGNoZWNrX3BhZF9ieXRlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIHU4ICpwKQogewogCXVuc2lnbmVkIGxvbmcgb2ZmID0gcy0+aW51c2U7CS8qIFRoZSBlbmQgb2YgaW5mbyAqLwpAQCAtNTU3LDM5ICs2MzIsMzkgQEAKIAlpZiAocy0+c2l6ZSA9PSBvZmYpCiAJCXJldHVybiAxOwogCi0JaWYgKGNoZWNrX2J5dGVzKHAgKyBvZmYsIFBPSVNPTl9JTlVTRSwgcy0+c2l6ZSAtIG9mZikpCi0JCXJldHVybiAxOwotCi0Jb2JqZWN0X2VycihzLCBwYWdlLCBwLCAiT2JqZWN0IHBhZGRpbmcgY2hlY2sgZmFpbHMiKTsKLQotCS8qCi0JICogUmVzdG9yZSBwYWRkaW5nCi0JICovCi0JcmVzdG9yZV9ieXRlcyhzLCAib2JqZWN0IHBhZGRpbmciLCBQT0lTT05fSU5VU0UsIHAgKyBvZmYsIHAgKyBzLT5zaXplKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gY2hlY2tfYnl0ZXNfYW5kX3JlcG9ydChzLCBwYWdlLCBwLCAiT2JqZWN0IHBhZGRpbmciLAorCQkJCXAgKyBvZmYsIFBPSVNPTl9JTlVTRSwgcy0+c2l6ZSAtIG9mZik7CiB9CiAKIHN0YXRpYyBpbnQgc2xhYl9wYWRfY2hlY2soc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXU4ICpwOwotCWludCBsZW5ndGgsIHJlbWFpbmRlcjsKKwl1OCAqc3RhcnQ7CisJdTggKmZhdWx0OworCXU4ICplbmQ7CisJaW50IGxlbmd0aDsKKwlpbnQgcmVtYWluZGVyOwogCiAJaWYgKCEocy0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikpCiAJCXJldHVybiAxOwogCi0JcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlzdGFydCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwllbmQgPSBzdGFydCArIChQQUdFX1NJWkUgPDwgcy0+b3JkZXIpOwogCWxlbmd0aCA9IHMtPm9iamVjdHMgKiBzLT5zaXplOwotCXJlbWFpbmRlciA9IChQQUdFX1NJWkUgPDwgcy0+b3JkZXIpIC0gbGVuZ3RoOworCXJlbWFpbmRlciA9IGVuZCAtIChzdGFydCArIGxlbmd0aCk7CiAJaWYgKCFyZW1haW5kZXIpCiAJCXJldHVybiAxOwogCi0JaWYgKCFjaGVja19ieXRlcyhwICsgbGVuZ3RoLCBQT0lTT05fSU5VU0UsIHJlbWFpbmRlcikpIHsKLQkJc2xhYl9lcnIocywgcGFnZSwgIlBhZGRpbmcgY2hlY2sgZmFpbGVkIik7Ci0JCXJlc3RvcmVfYnl0ZXMocywgInNsYWIgcGFkZGluZyIsIFBPSVNPTl9JTlVTRSwgcCArIGxlbmd0aCwKLQkJCXAgKyBsZW5ndGggKyByZW1haW5kZXIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisJZmF1bHQgPSBjaGVja19ieXRlcyhzdGFydCArIGxlbmd0aCwgUE9JU09OX0lOVVNFLCByZW1haW5kZXIpOworCWlmICghZmF1bHQpCisJCXJldHVybiAxOworCXdoaWxlIChlbmQgPiBmYXVsdCAmJiBlbmRbLTFdID09IFBPSVNPTl9JTlVTRSkKKwkJZW5kLS07CisKKwlzbGFiX2VycihzLCBwYWdlLCAiUGFkZGluZyBvdmVyd3JpdHRlbi4gMHglcC0weCVwIiwgZmF1bHQsIGVuZCAtIDEpOworCXByaW50X3NlY3Rpb24oIlBhZGRpbmciLCBzdGFydCwgbGVuZ3RoKTsKKworCXJlc3RvcmVfYnl0ZXMocywgInNsYWIgcGFkZGluZyIsIFBPSVNPTl9JTlVTRSwgc3RhcnQsIGVuZCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfb2JqZWN0KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKQEAgLTYwMiw0MSArNjc3LDIyIEBACiAJCXVuc2lnbmVkIGludCByZWQgPQogCQkJYWN0aXZlID8gU0xVQl9SRURfQUNUSVZFIDogU0xVQl9SRURfSU5BQ1RJVkU7CiAKLQkJaWYgKCFjaGVja19ieXRlcyhlbmRvYmplY3QsIHJlZCwgcy0+aW51c2UgLSBzLT5vYmpzaXplKSkgewotCQkJb2JqZWN0X2VycihzLCBwYWdlLCBvYmplY3QsCi0JCQlhY3RpdmUgPyAiUmVkem9uZSBBY3RpdmUiIDogIlJlZHpvbmUgSW5hY3RpdmUiKTsKLQkJCXJlc3RvcmVfYnl0ZXMocywgInJlZHpvbmUiLCByZWQsCi0JCQkJZW5kb2JqZWN0LCBvYmplY3QgKyBzLT5pbnVzZSk7CisJCWlmICghY2hlY2tfYnl0ZXNfYW5kX3JlcG9ydChzLCBwYWdlLCBvYmplY3QsICJSZWR6b25lIiwKKwkJCWVuZG9iamVjdCwgcmVkLCBzLT5pbnVzZSAtIHMtPm9ianNpemUpKQogCQkJcmV0dXJuIDA7Ci0JCX0KIAl9IGVsc2UgewotCQlpZiAoKHMtPmZsYWdzICYgU0xBQl9QT0lTT04pICYmIHMtPm9ianNpemUgPCBzLT5pbnVzZSAmJgotCQkJIWNoZWNrX2J5dGVzKGVuZG9iamVjdCwgUE9JU09OX0lOVVNFLAotCQkJCQlzLT5pbnVzZSAtIHMtPm9ianNpemUpKSB7Ci0JCW9iamVjdF9lcnIocywgcGFnZSwgcCwgIkFsaWdubWVudCBwYWRkaW5nIGNoZWNrIGZhaWxzIik7Ci0JCS8qCi0JCSAqIEZpeCBpdCBzbyB0aGF0IHRoZXJlIHdpbGwgbm90IGJlIGFub3RoZXIgcmVwb3J0LgotCQkgKgotCQkgKiBIbW1tLi4uIFdlIG1heSBiZSBjb3JydXB0aW5nIGFuIG9iamVjdCB0aGF0IG5vdyBleHBlY3RzCi0JCSAqIHRvIGJlIGxvbmdlciB0aGFuIGFsbG93ZWQuCi0JCSAqLwotCQlyZXN0b3JlX2J5dGVzKHMsICJhbGlnbm1lbnQgcGFkZGluZyIsIFBPSVNPTl9JTlVTRSwKLQkJCWVuZG9iamVjdCwgb2JqZWN0ICsgcy0+aW51c2UpOwotCQl9CisJCWlmICgocy0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikgJiYgcy0+b2Jqc2l6ZSA8IHMtPmludXNlKQorCQkJY2hlY2tfYnl0ZXNfYW5kX3JlcG9ydChzLCBwYWdlLCBwLCAiQWxpZ25tZW50IHBhZGRpbmciLCBlbmRvYmplY3QsCisJCQkJUE9JU09OX0lOVVNFLCBzLT5pbnVzZSAtIHMtPm9ianNpemUpOwogCX0KIAogCWlmIChzLT5mbGFncyAmIFNMQUJfUE9JU09OKSB7CiAJCWlmICghYWN0aXZlICYmIChzLT5mbGFncyAmIF9fT0JKRUNUX1BPSVNPTikgJiYKLQkJCSghY2hlY2tfYnl0ZXMocCwgUE9JU09OX0ZSRUUsIHMtPm9ianNpemUgLSAxKSB8fAotCQkJCXBbcy0+b2Jqc2l6ZSAtIDFdICE9IFBPSVNPTl9FTkQpKSB7Ci0KLQkJCW9iamVjdF9lcnIocywgcGFnZSwgcCwgIlBvaXNvbiBjaGVjayBmYWlsZWQiKTsKLQkJCXJlc3RvcmVfYnl0ZXMocywgIlBvaXNvbiIsIFBPSVNPTl9GUkVFLAotCQkJCQkJcCwgcCArIHMtPm9ianNpemUgLTEpOwotCQkJcmVzdG9yZV9ieXRlcyhzLCAiUG9pc29uIiwgUE9JU09OX0VORCwKLQkJCQkJcCArIHMtPm9ianNpemUgLSAxLCBwICsgcy0+b2Jqc2l6ZSk7CisJCQkoIWNoZWNrX2J5dGVzX2FuZF9yZXBvcnQocywgcGFnZSwgcCwgIlBvaXNvbiIsIHAsCisJCQkJCVBPSVNPTl9GUkVFLCBzLT5vYmpzaXplIC0gMSkgfHwKKwkJCSAhY2hlY2tfYnl0ZXNfYW5kX3JlcG9ydChzLCBwYWdlLCBwLCAiUG9pc29uIiwKKwkJCSAJcCArIHMtPm9ianNpemUgLTEsIFBPSVNPTl9FTkQsIDEpKSkKIAkJCXJldHVybiAwOwotCQl9CiAJCS8qCiAJCSAqIGNoZWNrX3BhZF9ieXRlcyBjbGVhbnMgdXAgb24gaXRzIG93bi4KIAkJICovCkBAIC02NjksMjUgKzcyNSwxNyBAQAogCVZNX0JVR19PTighaXJxc19kaXNhYmxlZCgpKTsKIAogCWlmICghUGFnZVNsYWIocGFnZSkpIHsKLQkJc2xhYl9lcnIocywgcGFnZSwgIk5vdCBhIHZhbGlkIHNsYWIgcGFnZSBmbGFncz0lbHggIgotCQkJIm1hcHBpbmc9MHglcCBjb3VudD0lZCIsIHBhZ2UtPmZsYWdzLCBwYWdlLT5tYXBwaW5nLAotCQkJcGFnZV9jb3VudChwYWdlKSk7CisJCXNsYWJfZXJyKHMsIHBhZ2UsICJOb3QgYSB2YWxpZCBzbGFiIHBhZ2UiKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChwYWdlLT5vZmZzZXQgKiBzaXplb2Yodm9pZCAqKSAhPSBzLT5vZmZzZXQpIHsKLQkJc2xhYl9lcnIocywgcGFnZSwgIkNvcnJ1cHRlZCBvZmZzZXQgJWx1IGZsYWdzPTB4JWx4ICIKLQkJCSJtYXBwaW5nPTB4JXAgY291bnQ9JWQiLAotCQkJKHVuc2lnbmVkIGxvbmcpKHBhZ2UtPm9mZnNldCAqIHNpemVvZih2b2lkICopKSwKLQkJCXBhZ2UtPmZsYWdzLAotCQkJcGFnZS0+bWFwcGluZywKLQkJCXBhZ2VfY291bnQocGFnZSkpOworCQlzbGFiX2VycihzLCBwYWdlLCAiQ29ycnVwdGVkIG9mZnNldCAlbHUiLAorCQkJKHVuc2lnbmVkIGxvbmcpKHBhZ2UtPm9mZnNldCAqIHNpemVvZih2b2lkICopKSk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAocGFnZS0+aW51c2UgPiBzLT5vYmplY3RzKSB7Ci0JCXNsYWJfZXJyKHMsIHBhZ2UsICJpbnVzZSAldSA+IG1heCAldSBAMHglcCBmbGFncz0lbHggIgotCQkJIm1hcHBpbmc9MHglcCBjb3VudD0lZCIsCi0JCQlzLT5uYW1lLCBwYWdlLT5pbnVzZSwgcy0+b2JqZWN0cywgcGFnZS0+ZmxhZ3MsCi0JCQlwYWdlLT5tYXBwaW5nLCBwYWdlX2NvdW50KHBhZ2UpKTsKKwkJc2xhYl9lcnIocywgcGFnZSwgImludXNlICV1ID4gbWF4ICV1IiwKKwkJCXMtPm5hbWUsIHBhZ2UtPmludXNlLCBzLT5vYmplY3RzKTsKIAkJcmV0dXJuIDA7CiAJfQogCS8qIFNsYWJfcGFkX2NoZWNrIGZpeGVzIHRoaW5ncyB1cCBhZnRlciBpdHNlbGYgKi8KQEAgLTcxNSwxMyArNzYzLDEwIEBACiAJCQkJc2V0X2ZyZWVwb2ludGVyKHMsIG9iamVjdCwgTlVMTCk7CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgewotCQkJCXNsYWJfZXJyKHMsIHBhZ2UsICJGcmVlcG9pbnRlciAweCVwIGNvcnJ1cHQiLAotCQkJCQkJCQkJZnApOworCQkJCXNsYWJfZXJyKHMsIHBhZ2UsICJGcmVlcG9pbnRlciBjb3JydXB0Iik7CiAJCQkJcGFnZS0+ZnJlZWxpc3QgPSBOVUxMOwogCQkJCXBhZ2UtPmludXNlID0gcy0+b2JqZWN0czsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkBAQCBTTFVCICVzOiBGcmVlbGlzdCAiCi0JCQkJCSJjbGVhcmVkLiBTbGFiIDB4JXBcbiIsCi0JCQkJCXMtPm5hbWUsIHBhZ2UpOworCQkJCXNsYWJfZml4KHMsICJGcmVlbGlzdCBjbGVhcmVkIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlicmVhazsKQEAgLTczMywxMSArNzc4LDkgQEAKIAogCWlmIChwYWdlLT5pbnVzZSAhPSBzLT5vYmplY3RzIC0gbnIpIHsKIAkJc2xhYl9lcnIocywgcGFnZSwgIldyb25nIG9iamVjdCBjb3VudC4gQ291bnRlciBpcyAlZCBidXQgIgotCQkJImNvdW50ZWQgd2VyZSAlZCIsIHMsIHBhZ2UsIHBhZ2UtPmludXNlLAotCQkJCQkJCXMtPm9iamVjdHMgLSBucik7CisJCQkiY291bnRlZCB3ZXJlICVkIiwgcGFnZS0+aW51c2UsIHMtPm9iamVjdHMgLSBucik7CiAJCXBhZ2UtPmludXNlID0gcy0+b2JqZWN0cyAtIG5yOwotCQlwcmludGsoS0VSTl9FUlIgIkBAQCBTTFVCICVzOiBPYmplY3QgY291bnQgYWRqdXN0ZWQuICIKLQkJCSJTbGFiIEAweCVwXG4iLCBzLT5uYW1lLCBwYWdlKTsKKwkJc2xhYl9maXgocywgIk9iamVjdCBjb3VudCBhZGp1c3RlZC4iKTsKIAl9CiAJcmV0dXJuIHNlYXJjaCA9PSBOVUxMOwogfQpAQCAtNzk5LDcgKzg0Miw3IEBACiAJCWdvdG8gYmFkOwogCiAJaWYgKG9iamVjdCAmJiAhb25fZnJlZWxpc3QocywgcGFnZSwgb2JqZWN0KSkgewotCQlzbGFiX2VycihzLCBwYWdlLCAiT2JqZWN0IDB4JXAgYWxyZWFkeSBhbGxvY2F0ZWQiLCBvYmplY3QpOworCQlvYmplY3RfZXJyKHMsIHBhZ2UsIG9iamVjdCwgIk9iamVjdCBhbHJlYWR5IGFsbG9jYXRlZCIpOwogCQlnb3RvIGJhZDsKIAl9CiAKQEAgLTgyNSw4ICs4NjgsNyBAQAogCQkgKiB0byBhdm9pZCBpc3N1ZXMgaW4gdGhlIGZ1dHVyZS4gTWFya2luZyBhbGwgb2JqZWN0cwogCQkgKiBhcyB1c2VkIGF2b2lkcyB0b3VjaGluZyB0aGUgcmVtYWluaW5nIG9iamVjdHMuCiAJCSAqLwotCQlwcmludGsoS0VSTl9FUlIgIkBAQCBTTFVCOiAlcyBzbGFiIDB4JXAuIE1hcmtpbmcgYWxsIG9iamVjdHMgdXNlZC5cbiIsCi0JCQlzLT5uYW1lLCBwYWdlKTsKKwkJc2xhYl9maXgocywgIk1hcmtpbmcgYWxsIG9iamVjdHMgdXNlZCIpOwogCQlwYWdlLT5pbnVzZSA9IHMtPm9iamVjdHM7CiAJCXBhZ2UtPmZyZWVsaXN0ID0gTlVMTDsKIAkJLyogRml4IHVwIGZpZWxkcyB0aGF0IG1heSBiZSBjb3JydXB0ZWQgKi8KQEAgLTg0Nyw3ICs4ODksNyBAQAogCX0KIAogCWlmIChvbl9mcmVlbGlzdChzLCBwYWdlLCBvYmplY3QpKSB7Ci0JCXNsYWJfZXJyKHMsIHBhZ2UsICJPYmplY3QgMHglcCBhbHJlYWR5IGZyZWUiLCBvYmplY3QpOworCQlvYmplY3RfZXJyKHMsIHBhZ2UsIG9iamVjdCwgIk9iamVjdCBhbHJlYWR5IGZyZWUiKTsKIAkJZ290byBmYWlsOwogCX0KIApAQCAtODY2LDggKzkwOCw4IEBACiAJCQlkdW1wX3N0YWNrKCk7CiAJCX0KIAkJZWxzZQotCQkJc2xhYl9lcnIocywgcGFnZSwgIm9iamVjdCBhdCAweCVwIGJlbG9uZ3MgIgotCQkJCSJ0byBzbGFiICVzIiwgb2JqZWN0LCBwYWdlLT5zbGFiLT5uYW1lKTsKKwkJCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LAorCQkJCQkicGFnZSBzbGFiIHBvaW50ZXIgY29ycnVwdC4iKTsKIAkJZ290byBmYWlsOwogCX0KIApAQCAtODgxLDQ1ICs5MjMsNjMgQEAKIAlyZXR1cm4gMTsKIAogZmFpbDoKLQlwcmludGsoS0VSTl9FUlIgIkBAQCBTTFVCOiAlcyBzbGFiIDB4JXAgb2JqZWN0IGF0IDB4JXAgbm90IGZyZWVkLlxuIiwKLQkJcy0+bmFtZSwgcGFnZSwgb2JqZWN0KTsKKwlzbGFiX2ZpeChzLCAiT2JqZWN0IGF0IDB4JXAgbm90IGZyZWVkIiwgb2JqZWN0KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc2V0dXBfc2x1Yl9kZWJ1ZyhjaGFyICpzdHIpCiB7Ci0JaWYgKCFzdHIgfHwgKnN0ciAhPSAnPScpCi0JCXNsdWJfZGVidWcgPSBERUJVR19ERUZBVUxUX0ZMQUdTOwotCWVsc2UgewotCQlzdHIrKzsKLQkJaWYgKCpzdHIgPT0gMCB8fCAqc3RyID09ICcsJykKLQkJCXNsdWJfZGVidWcgPSBERUJVR19ERUZBVUxUX0ZMQUdTOwotCQllbHNlCi0JCWZvciggOypzdHIgJiYgKnN0ciAhPSAnLCc7IHN0cisrKQotCQkJc3dpdGNoICgqc3RyKSB7Ci0JCQljYXNlICdmJyA6IGNhc2UgJ0YnIDoKLQkJCQlzbHViX2RlYnVnIHw9IFNMQUJfREVCVUdfRlJFRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3onIDogY2FzZSAnWicgOgotCQkJCXNsdWJfZGVidWcgfD0gU0xBQl9SRURfWk9ORTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3AnIDogY2FzZSAnUCcgOgotCQkJCXNsdWJfZGVidWcgfD0gU0xBQl9QT0lTT047Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICd1JyA6IGNhc2UgJ1UnIDoKLQkJCQlzbHViX2RlYnVnIHw9IFNMQUJfU1RPUkVfVVNFUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3QnIDogY2FzZSAnVCcgOgotCQkJCXNsdWJfZGVidWcgfD0gU0xBQl9UUkFDRTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJzbHViX2RlYnVnIG9wdGlvbiAnJWMnICIKLQkJCQkJInVua25vd24uIHNraXBwZWRcbiIsKnN0cik7Ci0JCQl9Ci0JfQorCXNsdWJfZGVidWcgPSBERUJVR19ERUZBVUxUX0ZMQUdTOworCWlmICgqc3RyKysgIT0gJz0nIHx8ICEqc3RyKQorCQkvKgorCQkgKiBObyBvcHRpb25zIHNwZWNpZmllZC4gU3dpdGNoIG9uIGZ1bGwgZGVidWdnaW5nLgorCQkgKi8KKwkJZ290byBvdXQ7CiAKIAlpZiAoKnN0ciA9PSAnLCcpCisJCS8qCisJCSAqIE5vIG9wdGlvbnMgYnV0IHJlc3RyaWN0aW9uIG9uIHNsYWJzLiBUaGlzIG1lYW5zIGZ1bGwKKwkJICogZGVidWdnaW5nIGZvciBzbGFicyBtYXRjaGluZyBhIHBhdHRlcm4uCisJCSAqLworCQlnb3RvIGNoZWNrX3NsYWJzOworCisJc2x1Yl9kZWJ1ZyA9IDA7CisJaWYgKCpzdHIgPT0gJy0nKQorCQkvKgorCQkgKiBTd2l0Y2ggb2ZmIGFsbCBkZWJ1Z2dpbmcgbWVhc3VyZXMuCisJCSAqLworCQlnb3RvIG91dDsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoaWNoIGRlYnVnIGZlYXR1cmVzIHNob3VsZCBiZSBzd2l0Y2hlZCBvbgorCSAqLworCWZvciAoIDsqc3RyICYmICpzdHIgIT0gJywnOyBzdHIrKykgeworCQlzd2l0Y2ggKHRvbG93ZXIoKnN0cikpIHsKKwkJY2FzZSAnZic6CisJCQlzbHViX2RlYnVnIHw9IFNMQUJfREVCVUdfRlJFRTsKKwkJCWJyZWFrOworCQljYXNlICd6JzoKKwkJCXNsdWJfZGVidWcgfD0gU0xBQl9SRURfWk9ORTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXNsdWJfZGVidWcgfD0gU0xBQl9QT0lTT047CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlzbHViX2RlYnVnIHw9IFNMQUJfU1RPUkVfVVNFUjsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXNsdWJfZGVidWcgfD0gU0xBQl9UUkFDRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJzbHViX2RlYnVnIG9wdGlvbiAnJWMnICIKKwkJCQkidW5rbm93bi4gc2tpcHBlZFxuIiwqc3RyKTsKKwkJfQorCX0KKworY2hlY2tfc2xhYnM6CisJaWYgKCpzdHIgPT0gJywnKQogCQlzbHViX2RlYnVnX3NsYWJzID0gc3RyICsgMTsKK291dDoKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTAxOCw3ICsxMDc4LDcgQEAKIAl2b2lkICpsYXN0OwogCXZvaWQgKnA7CiAKLQlCVUdfT04oZmxhZ3MgJiB+KEdGUF9ETUEgfCBHRlBfTEVWRUxfTUFTSykpOworCUJVR19PTihmbGFncyAmIH4oR0ZQX0RNQSB8IF9fR0ZQX1pFUk8gfCBHRlBfTEVWRUxfTUFTSykpOwogCiAJaWYgKGZsYWdzICYgX19HRlBfV0FJVCkKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwpAQCAtMTMzNiw3ICsxMzk2LDcgQEAKIAl1bmZyZWV6ZV9zbGFiKHMsIHBhZ2UpOwogfQogCi1zdGF0aWMgdm9pZCBmbHVzaF9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGNwdSkKIHsKIAlzbGFiX2xvY2socGFnZSk7CiAJZGVhY3RpdmF0ZV9zbGFiKHMsIHBhZ2UsIGNwdSk7CkBAIC0xMzQ2LDcgKzE0MDYsNyBAQAogICogRmx1c2ggY3B1IHNsYWIuCiAgKiBDYWxsZWQgZnJvbSBJUEkgaGFuZGxlciB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCiAgKi8KLXN0YXRpYyB2b2lkIF9fZmx1c2hfY3B1X3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIGludCBjcHUpCitzdGF0aWMgaW5saW5lIHZvaWQgX19mbHVzaF9jcHVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHMtPmNwdV9zbGFiW2NwdV07CiAKQEAgLTE0ODEsNyArMTU0MSw3IEBACiAgKiBPdGhlcndpc2Ugd2UgY2FuIHNpbXBseSBwaWNrIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBsb2NrbGVzcyBmcmVlIGxpc3QuCiAgKi8KIHN0YXRpYyB2b2lkIF9fYWx3YXlzX2lubGluZSAqc2xhYl9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywKLQkJCQlnZnBfdCBnZnBmbGFncywgaW50IG5vZGUsIHZvaWQgKmFkZHIpCisJCWdmcF90IGdmcGZsYWdzLCBpbnQgbm9kZSwgdm9pZCAqYWRkcikKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl2b2lkICoqb2JqZWN0OwpAQCAtMTQ5OSw2ICsxNTU5LDEwIEBACiAJCXBhZ2UtPmxvY2tsZXNzX2ZyZWVsaXN0ID0gb2JqZWN0W3BhZ2UtPm9mZnNldF07CiAJfQogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWlmICh1bmxpa2VseSgoZ2ZwZmxhZ3MgJiBfX0dGUF9aRVJPKSAmJiBvYmplY3QpKQorCQltZW1zZXQob2JqZWN0LCAwLCBzLT5vYmpzaXplKTsKKwogCXJldHVybiBvYmplY3Q7CiB9CiAKQEAgLTE2ODIsOCArMTc0NiwxNyBAQAogewogCWludCBvcmRlcjsKIAlpbnQgcmVtOworCWludCBtaW5fb3JkZXIgPSBzbHViX21pbl9vcmRlcjsKIAotCWZvciAob3JkZXIgPSBtYXgoc2x1Yl9taW5fb3JkZXIsCisJLyoKKwkgKiBJZiB3ZSB3b3VsZCBjcmVhdGUgdG9vIG1hbnkgb2JqZWN0IHBlciBzbGFiIHRoZW4gcmVkdWNlCisJICogdGhlIHNsYWIgb3JkZXIgZXZlbiBpZiBpdCBnb2VzIGJlbG93IHNsdWJfbWluX29yZGVyLgorCSAqLworCXdoaWxlIChtaW5fb3JkZXIgPiAwICYmCisJCShQQUdFX1NJWkUgPDwgbWluX29yZGVyKSA+PSBNQVhfT0JKRUNUU19QRVJfU0xBQiAqIHNpemUpCisJCQltaW5fb3JkZXItLTsKKworCWZvciAob3JkZXIgPSBtYXgobWluX29yZGVyLAogCQkJCWZscyhtaW5fb2JqZWN0cyAqIHNpemUgLSAxKSAtIFBBR0VfU0hJRlQpOwogCQkJb3JkZXIgPD0gbWF4X29yZGVyOyBvcmRlcisrKSB7CiAKQEAgLTE2OTcsNiArMTc3MCw5IEBACiAJCWlmIChyZW0gPD0gc2xhYl9zaXplIC8gZnJhY3RfbGVmdG92ZXIpCiAJCQlicmVhazsKIAorCQkvKiBJZiB0aGUgbmV4dCBzaXplIGlzIHRvbyBoaWdoIHRoZW4gZXhpdCBub3cgKi8KKwkJaWYgKHNsYWJfc2l6ZSAqIDIgPj0gTUFYX09CSkVDVFNfUEVSX1NMQUIgKiBzaXplKQorCQkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIG9yZGVyOwpAQCAtMTc3Nyw3ICsxODUzLDkgQEAKIAlhdG9taWNfbG9uZ19zZXQoJm4tPm5yX3NsYWJzLCAwKTsKIAlzcGluX2xvY2tfaW5pdCgmbi0+bGlzdF9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbi0+cGFydGlhbCk7CisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKIAlJTklUX0xJU1RfSEVBRCgmbi0+ZnVsbCk7CisjZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19OVU1BCkBAIC0xODA1LDcgKzE4ODMsMTAgQEAKIAlwYWdlLT5mcmVlbGlzdCA9IGdldF9mcmVlcG9pbnRlcihrbWFsbG9jX2NhY2hlcywgbik7CiAJcGFnZS0+aW51c2UrKzsKIAlrbWFsbG9jX2NhY2hlcy0+bm9kZVtub2RlXSA9IG47Ci0Jc2V0dXBfb2JqZWN0X2RlYnVnKGttYWxsb2NfY2FjaGVzLCBwYWdlLCBuKTsKKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRworCWluaXRfb2JqZWN0KGttYWxsb2NfY2FjaGVzLCBuLCAxKTsKKwlpbml0X3RyYWNraW5nKGttYWxsb2NfY2FjaGVzLCBuKTsKKyNlbmRpZgogCWluaXRfa21lbV9jYWNoZV9ub2RlKG4pOwogCWF0b21pY19sb25nX2luYygmbi0+bnJfc2xhYnMpOwogCWFkZF9wYXJ0aWFsKG4sIHBhZ2UpOwpAQCAtMTk4Myw3ICsyMDY0LDcgQEAKIAkgKiBUaGUgcGFnZS0+aW51c2UgZmllbGQgaXMgb25seSAxNiBiaXQgd2lkZSEgU28gd2UgY2Fubm90IGhhdmUKIAkgKiBtb3JlIHRoYW4gNjRrIG9iamVjdHMgcGVyIHNsYWIuCiAJICovCi0JaWYgKCFzLT5vYmplY3RzIHx8IHMtPm9iamVjdHMgPiA2NTUzNSkKKwlpZiAoIXMtPm9iamVjdHMgfHwgcy0+b2JqZWN0cyA+IE1BWF9PQkpFQ1RTX1BFUl9TTEFCKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gMTsKIApAQCAtMjA4Nyw3ICsyMTY4LDcgQEAKIC8qCiAgKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgdXNlZCBieSBhIHNsYWIgY2FjaGUuCiAgKi8KLXN0YXRpYyBpbnQga21lbV9jYWNoZV9jbG9zZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykKK3N0YXRpYyBpbmxpbmUgaW50IGttZW1fY2FjaGVfY2xvc2Uoc3RydWN0IGttZW1fY2FjaGUgKnMpCiB7CiAJaW50IG5vZGU7CiAKQEAgLTIxMTUsMTIgKzIxOTYsMTMgQEAKIAlzLT5yZWZjb3VudC0tOwogCWlmICghcy0+cmVmY291bnQpIHsKIAkJbGlzdF9kZWwoJnMtPmxpc3QpOworCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKIAkJaWYgKGttZW1fY2FjaGVfY2xvc2UocykpCiAJCQlXQVJOX09OKDEpOwogCQlzeXNmc19zbGFiX3JlbW92ZShzKTsKIAkJa2ZyZWUocyk7Ci0JfQotCXVwX3dyaXRlKCZzbHViX2xvY2spOworCX0gZWxzZQorCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9kZXN0cm95KTsKIApAQCAtMjE5Myw0NyArMjI3NSw5MiBAQAogCXBhbmljKCJDcmVhdGlvbiBvZiBrbWFsbG9jIHNsYWIgJXMgc2l6ZT0lZCBmYWlsZWQuXG4iLCBuYW1lLCBzaXplKTsKIH0KIAotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpnZXRfc2xhYihzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0JaW50IGluZGV4ID0ga21hbGxvY19pbmRleChzaXplKTsKLQotCWlmICghaW5kZXgpCi0JCXJldHVybiBOVUxMOwotCi0JLyogQWxsb2NhdGlvbiB0b28gbGFyZ2U/ICovCi0JQlVHX09OKGluZGV4IDwgMCk7Ci0KICNpZmRlZiBDT05GSUdfWk9ORV9ETUEKLQlpZiAoKGZsYWdzICYgU0xVQl9ETUEpKSB7Ci0JCXN0cnVjdCBrbWVtX2NhY2hlICpzOwotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqeDsKLQkJY2hhciAqdGV4dDsKLQkJc2l6ZV90IHJlYWxzaXplOworc3RhdGljIG5vaW5saW5lIHN0cnVjdCBrbWVtX2NhY2hlICpkbWFfa21hbGxvY19jYWNoZShpbnQgaW5kZXgsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBrbWVtX2NhY2hlICpzOworCXN0cnVjdCBrbWVtX2NhY2hlICp4OworCWNoYXIgKnRleHQ7CisJc2l6ZV90IHJlYWxzaXplOwogCi0JCXMgPSBrbWFsbG9jX2NhY2hlc19kbWFbaW5kZXhdOwotCQlpZiAocykKLQkJCXJldHVybiBzOworCXMgPSBrbWFsbG9jX2NhY2hlc19kbWFbaW5kZXhdOworCWlmIChzKQorCQlyZXR1cm4gczsKIAotCQkvKiBEeW5hbWljYWxseSBjcmVhdGUgZG1hIGNhY2hlICovCi0JCXggPSBrbWFsbG9jKGttZW1fc2l6ZSwgZmxhZ3MgJiB+U0xVQl9ETUEpOwotCQlpZiAoIXgpCi0JCQlwYW5pYygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZG1hIGNhY2hlXG4iKTsKKwkvKiBEeW5hbWljYWxseSBjcmVhdGUgZG1hIGNhY2hlICovCisJeCA9IGttYWxsb2Moa21lbV9zaXplLCBmbGFncyAmIH5TTFVCX0RNQSk7CisJaWYgKCF4KQorCQlwYW5pYygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZG1hIGNhY2hlXG4iKTsKIAotCQlpZiAoaW5kZXggPD0gS01BTExPQ19TSElGVF9ISUdIKQotCQkJcmVhbHNpemUgPSAxIDw8IGluZGV4OwotCQllbHNlIHsKLQkJCWlmIChpbmRleCA9PSAxKQotCQkJCXJlYWxzaXplID0gOTY7Ci0JCQllbHNlCi0JCQkJcmVhbHNpemUgPSAxOTI7Ci0JCX0KLQotCQl0ZXh0ID0ga2FzcHJpbnRmKGZsYWdzICYgflNMVUJfRE1BLCAia21hbGxvY19kbWEtJWQiLAotCQkJCSh1bnNpZ25lZCBpbnQpcmVhbHNpemUpOwotCQlzID0gY3JlYXRlX2ttYWxsb2NfY2FjaGUoeCwgdGV4dCwgcmVhbHNpemUsIGZsYWdzKTsKKwlyZWFsc2l6ZSA9IGttYWxsb2NfY2FjaGVzW2luZGV4XS5vYmpzaXplOworCXRleHQgPSBrYXNwcmludGYoZmxhZ3MgJiB+U0xVQl9ETUEsICJrbWFsbG9jX2RtYS0lZCIsCisJCQkodW5zaWduZWQgaW50KXJlYWxzaXplKTsKKwlzID0gY3JlYXRlX2ttYWxsb2NfY2FjaGUoeCwgdGV4dCwgcmVhbHNpemUsIGZsYWdzKTsKKwlkb3duX3dyaXRlKCZzbHViX2xvY2spOworCWlmICgha21hbGxvY19jYWNoZXNfZG1hW2luZGV4XSkgewogCQlrbWFsbG9jX2NhY2hlc19kbWFbaW5kZXhdID0gczsKKwkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJCXJldHVybiBzOwogCX0KKwl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kocyk7CisJcmV0dXJuIGttYWxsb2NfY2FjaGVzX2RtYVtpbmRleF07Cit9CisjZW5kaWYKKworLyoKKyAqIENvbnZlcnNpb24gdGFibGUgZm9yIHNtYWxsIHNsYWJzIHNpemVzIC8gOCB0byB0aGUgaW5kZXggaW4gdGhlCisgKiBrbWFsbG9jIGFycmF5LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igc2xhYnMgPCAxOTIgc2luY2Ugd2UgaGF2ZSBub24gcG93ZXIKKyAqIG9mIHR3byBjYWNoZSBzaXplcyB0aGVyZS4gVGhlIHNpemUgb2YgbGFyZ2VyIHNsYWJzIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nCisgKiBmbHMuCisgKi8KK3N0YXRpYyBzOCBzaXplX2luZGV4WzI0XSA9IHsKKwkzLAkvKiA4ICovCisJNCwJLyogMTYgKi8KKwk1LAkvKiAyNCAqLworCTUsCS8qIDMyICovCisJNiwJLyogNDAgKi8KKwk2LAkvKiA0OCAqLworCTYsCS8qIDU2ICovCisJNiwJLyogNjQgKi8KKwkxLAkvKiA3MiAqLworCTEsCS8qIDgwICovCisJMSwJLyogODggKi8KKwkxLAkvKiA5NiAqLworCTcsCS8qIDEwNCAqLworCTcsCS8qIDExMiAqLworCTcsCS8qIDEyMCAqLworCTcsCS8qIDEyOCAqLworCTIsCS8qIDEzNiAqLworCTIsCS8qIDE0NCAqLworCTIsCS8qIDE1MiAqLworCTIsCS8qIDE2MCAqLworCTIsCS8qIDE2OCAqLworCTIsCS8qIDE3NiAqLworCTIsCS8qIDE4NCAqLworCTIJLyogMTkyICovCit9OworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmdldF9zbGFiKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAoc2l6ZSA8PSAxOTIpIHsKKwkJaWYgKCFzaXplKQorCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisKKwkJaW5kZXggPSBzaXplX2luZGV4WyhzaXplIC0gMSkgLyA4XTsKKwl9IGVsc2UgeworCQlpZiAoc2l6ZSA+IEtNQUxMT0NfTUFYX1NJWkUpCisJCQlyZXR1cm4gTlVMTDsKKworCQlpbmRleCA9IGZscyhzaXplIC0gMSk7CisJfQorCisjaWZkZWYgQ09ORklHX1pPTkVfRE1BCisJaWYgKHVubGlrZWx5KChmbGFncyAmIFNMVUJfRE1BKSkpCisJCXJldHVybiBkbWFfa21hbGxvY19jYWNoZShpbmRleCwgZmxhZ3MpOworCiAjZW5kaWYKIAlyZXR1cm4gJmttYWxsb2NfY2FjaGVzW2luZGV4XTsKIH0KQEAgLTIyNDIsOSArMjM2OSwxMCBAQAogewogCXN0cnVjdCBrbWVtX2NhY2hlICpzID0gZ2V0X3NsYWIoc2l6ZSwgZmxhZ3MpOwogCi0JaWYgKHMpCi0JCXJldHVybiBzbGFiX2FsbG9jKHMsIGZsYWdzLCAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwlpZiAoWkVST19PUl9OVUxMX1BUUihzKSkKKwkJcmV0dXJuIHM7CisKKwlyZXR1cm4gc2xhYl9hbGxvYyhzLCBmbGFncywgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fa21hbGxvYyk7CiAKQEAgLTIyNTMsOSArMjM4MSwxMCBAQAogewogCXN0cnVjdCBrbWVtX2NhY2hlICpzID0gZ2V0X3NsYWIoc2l6ZSwgZmxhZ3MpOwogCi0JaWYgKHMpCi0JCXJldHVybiBzbGFiX2FsbG9jKHMsIGZsYWdzLCBub2RlLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCXJldHVybiBaRVJPX1NJWkVfUFRSOworCWlmIChaRVJPX09SX05VTExfUFRSKHMpKQorCQlyZXR1cm4gczsKKworCXJldHVybiBzbGFiX2FsbG9jKHMsIGZsYWdzLCBub2RlLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogRVhQT1JUX1NZTUJPTChfX2ttYWxsb2Nfbm9kZSk7CiAjZW5kaWYKQEAgLTIzMDYsNyArMjQzNSw3IEBACiAJICogdGhpcyBjb21wYXJpc29uIHdvdWxkIGJlIHRydWUgZm9yIGFsbCAibmVnYXRpdmUiIHBvaW50ZXJzCiAJICogKHdoaWNoIHdvdWxkIGNvdmVyIHRoZSB3aG9sZSB1cHBlciBoYWxmIG9mIHRoZSBhZGRyZXNzIHNwYWNlKS4KIAkgKi8KLQlpZiAoKHVuc2lnbmVkIGxvbmcpeCA8PSAodW5zaWduZWQgbG9uZylaRVJPX1NJWkVfUFRSKQorCWlmIChaRVJPX09SX05VTExfUFRSKHgpKQogCQlyZXR1cm47CiAKIAlwYWdlID0gdmlydF90b19oZWFkX3BhZ2UoeCk7CkBAIC0yMzk1LDQzICsyNTI0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9zaHJpbmspOwogCi0vKioKLSAqIGtyZWFsbG9jIC0gcmVhbGxvY2F0ZSBtZW1vcnkuIFRoZSBjb250ZW50cyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuCi0gKiBAcDogb2JqZWN0IHRvIHJlYWxsb2NhdGUgbWVtb3J5IGZvci4KLSAqIEBuZXdfc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICoKLSAqIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYXJlIHByZXNlcnZlZCB1cCB0byB0aGUKLSAqIGxlc3NlciBvZiB0aGUgbmV3IGFuZCBvbGQgc2l6ZXMuICBJZiBAcCBpcyAlTlVMTCwga3JlYWxsb2MoKQotICogYmVoYXZlcyBleGFjdGx5IGxpa2Uga21hbGxvYygpLiAgSWYgQHNpemUgaXMgMCBhbmQgQHAgaXMgbm90IGEKLSAqICVOVUxMIHBvaW50ZXIsIHRoZSBvYmplY3QgcG9pbnRlZCB0byBpcyBmcmVlZC4KLSAqLwotdm9pZCAqa3JlYWxsb2MoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG5ld19zaXplLCBnZnBfdCBmbGFncykKLXsKLQl2b2lkICpyZXQ7Ci0Jc2l6ZV90IGtzOwotCi0JaWYgKHVubGlrZWx5KCFwIHx8IHAgPT0gWkVST19TSVpFX1BUUikpCi0JCXJldHVybiBrbWFsbG9jKG5ld19zaXplLCBmbGFncyk7Ci0KLQlpZiAodW5saWtlbHkoIW5ld19zaXplKSkgewotCQlrZnJlZShwKTsKLQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7Ci0JfQotCi0Ja3MgPSBrc2l6ZShwKTsKLQlpZiAoa3MgPj0gbmV3X3NpemUpCi0JCXJldHVybiAodm9pZCAqKXA7Ci0KLQlyZXQgPSBrbWFsbG9jKG5ld19zaXplLCBmbGFncyk7Ci0JaWYgKHJldCkgewotCQltZW1jcHkocmV0LCBwLCBtaW4obmV3X3NpemUsIGtzKSk7Ci0JCWtmcmVlKHApOwotCX0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChrcmVhbGxvYyk7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlCYXNpYyBzZXR1cCBvZiBzbGFicwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDc0LDYgKzI1NjYsMjQgQEAKIAkJY2FjaGVzKys7CiAJfQogCisKKwkvKgorCSAqIFBhdGNoIHVwIHRoZSBzaXplX2luZGV4IHRhYmxlIGlmIHdlIGhhdmUgc3RyYW5nZSBsYXJnZSBhbGlnbm1lbnQKKwkgKiByZXF1aXJlbWVudHMgZm9yIHRoZSBrbWFsbG9jIGFycmF5LiBUaGlzIGlzIG9ubHkgdGhlIGNhc2UgZm9yCisJICogbWlwcyBpdCBzZWVtcy4gVGhlIHN0YW5kYXJkIGFyY2hlcyB3aWxsIG5vdCBnZW5lcmF0ZSBhbnkgY29kZSBoZXJlLgorCSAqCisJICogTGFyZ2VzdCBwZXJtaXR0ZWQgYWxpZ25tZW50IGlzIDI1NiBieXRlcyBkdWUgdG8gdGhlIHdheSB3ZQorCSAqIGhhbmRsZSB0aGUgaW5kZXggZGV0ZXJtaW5hdGlvbiBmb3IgdGhlIHNtYWxsZXIgY2FjaGVzLgorCSAqCisJICogTWFrZSBzdXJlIHRoYXQgbm90aGluZyBjcmF6eSBoYXBwZW5zIGlmIHNvbWVvbmUgc3RhcnRzIHRpbmtlcmluZworCSAqIGFyb3VuZCB3aXRoIEFSQ0hfS01BTExPQ19NSU5BTElHTgorCSAqLworCUJVSUxEX0JVR19PTihLTUFMTE9DX01JTl9TSVpFID4gMjU2IHx8CisJCShLTUFMTE9DX01JTl9TSVpFICYgKEtNQUxMT0NfTUlOX1NJWkUgLSAxKSkpOworCisJZm9yIChpID0gODsgaSA8IEtNQUxMT0NfTUlOX1NJWkU7IGkgKz0gOCkKKwkJc2l6ZV9pbmRleFsoaSAtIDEpIC8gOF0gPSBLTUFMTE9DX1NISUZUX0xPVzsKKwogCXNsYWJfc3RhdGUgPSBVUDsKIAogCS8qIFByb3ZpZGUgdGhlIGNvcnJlY3Qga21hbGxvYyBuYW1lcyBub3cgdGhhdCB0aGUgY2FjaGVzIGFyZSB1cCAqLwpAQCAtMjUxOSw3ICsyNjI5LDcgQEAKIAkJc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQl2b2lkICgqY3Rvcikodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoOworCXN0cnVjdCBrbWVtX2NhY2hlICpzOwogCiAJaWYgKHNsdWJfbm9tZXJnZSB8fCAoZmxhZ3MgJiBTTFVCX05FVkVSX01FUkdFKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNTMxLDEwICsyNjQxLDcgQEAKIAlhbGlnbiA9IGNhbGN1bGF0ZV9hbGlnbm1lbnQoZmxhZ3MsIGFsaWduLCBzaXplKTsKIAlzaXplID0gQUxJR04oc2l6ZSwgYWxpZ24pOwogCi0JbGlzdF9mb3JfZWFjaChoLCAmc2xhYl9jYWNoZXMpIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnMgPQotCQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBrbWVtX2NhY2hlLCBsaXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJnNsYWJfY2FjaGVzLCBsaXN0KSB7CiAJCWlmIChzbGFiX3VubWVyZ2VhYmxlKHMpKQogCQkJY29udGludWU7CiAKQEAgLTI1NzcsMjUgKzI2ODQsMjYgQEAKIAkJICovCiAJCXMtPm9ianNpemUgPSBtYXgocy0+b2Jqc2l6ZSwgKGludClzaXplKTsKIAkJcy0+aW51c2UgPSBtYXhfdChpbnQsIHMtPmludXNlLCBBTElHTihzaXplLCBzaXplb2Yodm9pZCAqKSkpOworCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKIAkJaWYgKHN5c2ZzX3NsYWJfYWxpYXMocywgbmFtZSkpCiAJCQlnb3RvIGVycjsKLQl9IGVsc2UgewotCQlzID0ga21hbGxvYyhrbWVtX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAocyAmJiBrbWVtX2NhY2hlX29wZW4ocywgR0ZQX0tFUk5FTCwgbmFtZSwKKwkJcmV0dXJuIHM7CisJfQorCXMgPSBrbWFsbG9jKGttZW1fc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHMpIHsKKwkJaWYgKGttZW1fY2FjaGVfb3BlbihzLCBHRlBfS0VSTkVMLCBuYW1lLAogCQkJCXNpemUsIGFsaWduLCBmbGFncywgY3RvcikpIHsKLQkJCWlmIChzeXNmc19zbGFiX2FkZChzKSkgewotCQkJCWtmcmVlKHMpOwotCQkJCWdvdG8gZXJyOwotCQkJfQogCQkJbGlzdF9hZGQoJnMtPmxpc3QsICZzbGFiX2NhY2hlcyk7Ci0JCX0gZWxzZQotCQkJa2ZyZWUocyk7CisJCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKKwkJCWlmIChzeXNmc19zbGFiX2FkZChzKSkKKwkJCQlnb3RvIGVycjsKKwkJCXJldHVybiBzOworCQl9CisJCWtmcmVlKHMpOwogCX0KIAl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKLQlyZXR1cm4gczsKIAogZXJyOgotCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCWlmIChmbGFncyAmIFNMQUJfUEFOSUMpCiAJCXBhbmljKCJDYW5ub3QgY3JlYXRlIHNsYWJjYWNoZSAlc1xuIiwgbmFtZSk7CiAJZWxzZQpAQCAtMjYwNCw0NSArMjcxMiw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfY3JlYXRlKTsKIAotdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKnMsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKng7Ci0KLQl4ID0gc2xhYl9hbGxvYyhzLCBmbGFncywgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JaWYgKHgpCi0JCW1lbXNldCh4LCAwLCBzLT5vYmpzaXplKTsKLQlyZXR1cm4geDsKLX0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV96YWxsb2MpOwotCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgZm9yX2FsbF9zbGFicyh2b2lkICgqZnVuYykoc3RydWN0IGttZW1fY2FjaGUgKiwgaW50KSwgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoOwotCi0JZG93bl9yZWFkKCZzbHViX2xvY2spOwotCWxpc3RfZm9yX2VhY2goaCwgJnNsYWJfY2FjaGVzKSB7Ci0JCXN0cnVjdCBrbWVtX2NhY2hlICpzID0KLQkJCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbGlzdCk7Ci0KLQkJZnVuYyhzLCBjcHUpOwotCX0KLQl1cF9yZWFkKCZzbHViX2xvY2spOwotfQotCi0vKgotICogVmVyc2lvbiBvZiBfX2ZsdXNoX2NwdV9zbGFiIGZvciB0aGUgY2FzZSB0aGF0IGludGVycnVwdHMKLSAqIGFyZSBlbmFibGVkLgotICovCi1zdGF0aWMgdm9pZCBjcHVfc2xhYl9mbHVzaChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgaW50IGNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCV9fZmx1c2hfY3B1X3NsYWIocywgY3B1KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KIC8qCiAgKiBVc2UgdGhlIGNwdSBub3RpZmllciB0byBpbnN1cmUgdGhhdCB0aGUgY3B1IHNsYWJzIGFyZSBmbHVzaGVkIHdoZW4KICAqIG5lY2Vzc2FyeS4KQEAgLTI2NTEsMTMgKzI3MjEsMjEgQEAKIAkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CiAJbG9uZyBjcHUgPSAobG9uZyloY3B1OworCXN0cnVjdCBrbWVtX2NhY2hlICpzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEX0ZST1pFTjoKIAljYXNlIENQVV9ERUFEOgogCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQlmb3JfYWxsX3NsYWJzKGNwdV9zbGFiX2ZsdXNoLCBjcHUpOworCQlkb3duX3JlYWQoJnNsdWJfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJnNsYWJfY2FjaGVzLCBsaXN0KSB7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlfX2ZsdXNoX2NwdV9zbGFiKHMsIGNwdSk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCX0KKwkJdXBfcmVhZCgmc2x1Yl9sb2NrKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0yNjc0LDggKzI3NTIsOCBAQAogewogCXN0cnVjdCBrbWVtX2NhY2hlICpzID0gZ2V0X3NsYWIoc2l6ZSwgZ2ZwZmxhZ3MpOwogCi0JaWYgKCFzKQotCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwlpZiAoWkVST19PUl9OVUxMX1BUUihzKSkKKwkJcmV0dXJuIHM7CiAKIAlyZXR1cm4gc2xhYl9hbGxvYyhzLCBnZnBmbGFncywgLTEsIGNhbGxlcik7CiB9CkBAIC0yNjg1LDE4ICsyNzYzLDE4IEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBnZXRfc2xhYihzaXplLCBnZnBmbGFncyk7CiAKLQlpZiAoIXMpCi0JCXJldHVybiBaRVJPX1NJWkVfUFRSOworCWlmIChaRVJPX09SX05VTExfUFRSKHMpKQorCQlyZXR1cm4gczsKIAogCXJldHVybiBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCBub2RlLCBjYWxsZXIpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfU1lTRlMpICYmIGRlZmluZWQoQ09ORklHX1NMVUJfREVCVUcpCi1zdGF0aWMgaW50IHZhbGlkYXRlX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGludCB2YWxpZGF0ZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgKm1hcCkKIHsKIAl2b2lkICpwOwogCXZvaWQgKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JREVDTEFSRV9CSVRNQVAobWFwLCBzLT5vYmplY3RzKTsKIAogCWlmICghY2hlY2tfc2xhYihzLCBwYWdlKSB8fAogCQkJIW9uX2ZyZWVsaXN0KHMsIHBhZ2UsIE5VTEwpKQpAQCAtMjcxOCwxMCArMjc5NiwxMSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCB2YWxpZGF0ZV9zbGFiX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHZvaWQgdmFsaWRhdGVfc2xhYl9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgKm1hcCkKIHsKIAlpZiAoc2xhYl90cnlsb2NrKHBhZ2UpKSB7Ci0JCXZhbGlkYXRlX3NsYWIocywgcGFnZSk7CisJCXZhbGlkYXRlX3NsYWIocywgcGFnZSwgbWFwKTsKIAkJc2xhYl91bmxvY2socGFnZSk7CiAJfSBlbHNlCiAJCXByaW50ayhLRVJOX0lORk8gIlNMVUIgJXM6IFNraXBwZWQgYnVzeSBzbGFiIDB4JXBcbiIsCkBAIC0yNzM4LDcgKzI4MTcsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCB2YWxpZGF0ZV9zbGFiX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4pCitzdGF0aWMgaW50IHZhbGlkYXRlX3NsYWJfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKKwkJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwgdW5zaWduZWQgbG9uZyAqbWFwKQogewogCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMjc0Nyw3ICsyODI3LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbi0+bGlzdF9sb2NrLCBmbGFncyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZuLT5wYXJ0aWFsLCBscnUpIHsKLQkJdmFsaWRhdGVfc2xhYl9zbGFiKHMsIHBhZ2UpOworCQl2YWxpZGF0ZV9zbGFiX3NsYWIocywgcGFnZSwgbWFwKTsKIAkJY291bnQrKzsKIAl9CiAJaWYgKGNvdW50ICE9IG4tPm5yX3BhcnRpYWwpCkBAIC0yNzU4LDcgKzI4MzgsNyBAQAogCQlnb3RvIG91dDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGFnZSwgJm4tPmZ1bGwsIGxydSkgewotCQl2YWxpZGF0ZV9zbGFiX3NsYWIocywgcGFnZSk7CisJCXZhbGlkYXRlX3NsYWJfc2xhYihzLCBwYWdlLCBtYXApOwogCQljb3VudCsrOwogCX0KIAlpZiAoY291bnQgIT0gYXRvbWljX2xvbmdfcmVhZCgmbi0+bnJfc2xhYnMpKQpAQCAtMjc3MSwxNyArMjg1MSwyMyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdmFsaWRhdGVfc2xhYl9jYWNoZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykKK3N0YXRpYyBsb25nIHZhbGlkYXRlX3NsYWJfY2FjaGUoc3RydWN0IGttZW1fY2FjaGUgKnMpCiB7CiAJaW50IG5vZGU7CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyAqbWFwID0ga21hbGxvYyhCSVRTX1RPX0xPTkdTKHMtPm9iamVjdHMpICoKKwkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCisJaWYgKCFtYXApCisJCXJldHVybiAtRU5PTUVNOwogCiAJZmx1c2hfYWxsKHMpOwogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKIAkJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiA9IGdldF9ub2RlKHMsIG5vZGUpOwogCi0JCWNvdW50ICs9IHZhbGlkYXRlX3NsYWJfbm9kZShzLCBuKTsKKwkJY291bnQgKz0gdmFsaWRhdGVfc2xhYl9ub2RlKHMsIG4sIG1hcCk7CiAJfQorCWtmcmVlKG1hcCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0yODcwLDE4ICsyOTU2LDE0IEBACiAJCQlnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBsb2NhdGlvbikgKiB0LT5tYXgpKTsKIH0KIAotc3RhdGljIGludCBhbGxvY19sb2NfdHJhY2soc3RydWN0IGxvY190cmFjayAqdCwgdW5zaWduZWQgbG9uZyBtYXgpCitzdGF0aWMgaW50IGFsbG9jX2xvY190cmFjayhzdHJ1Y3QgbG9jX3RyYWNrICp0LCB1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZmxhZ3MpCiB7CiAJc3RydWN0IGxvY2F0aW9uICpsOwogCWludCBvcmRlcjsKIAotCWlmICghbWF4KQotCQltYXggPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGxvY2F0aW9uKTsKLQogCW9yZGVyID0gZ2V0X29yZGVyKHNpemVvZihzdHJ1Y3QgbG9jYXRpb24pICogbWF4KTsKIAotCWwgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgb3JkZXIpOwotCisJbCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgb3JkZXIpOwogCWlmICghbCkKIAkJcmV0dXJuIDA7CiAKQEAgLTI5NDcsNyArMzAyOSw3IEBACiAJLyoKIAkgKiBOb3QgZm91bmQuIEluc2VydCBuZXcgdHJhY2tpbmcgZWxlbWVudC4KIAkgKi8KLQlpZiAodC0+Y291bnQgPj0gdC0+bWF4ICYmICFhbGxvY19sb2NfdHJhY2sodCwgMiAqIHQtPm1heCkpCisJaWYgKHQtPmNvdW50ID49IHQtPm1heCAmJiAhYWxsb2NfbG9jX3RyYWNrKHQsIDIgKiB0LT5tYXgsIEdGUF9BVE9NSUMpKQogCQlyZXR1cm4gMDsKIAogCWwgPSB0LT5sb2MgKyBwb3M7CkBAIC0yOTkwLDExICszMDcyLDEyIEBACiB7CiAJaW50IG4gPSAwOwogCXVuc2lnbmVkIGxvbmcgaTsKLQlzdHJ1Y3QgbG9jX3RyYWNrIHQ7CisJc3RydWN0IGxvY190cmFjayB0ID0geyAwLCAwLCBOVUxMIH07CiAJaW50IG5vZGU7CiAKLQl0LmNvdW50ID0gMDsKLQl0Lm1heCA9IDA7CisJaWYgKCFhbGxvY19sb2NfdHJhY2soJnQsIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbG9jYXRpb24pLAorCQkJR0ZQX0tFUk5FTCkpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIk91dCBvZiBtZW1vcnlcbiIpOwogCiAJLyogUHVzaCBiYWNrIGNwdSBzbGFicyAqLwogCWZsdXNoX2FsbChzKTsKQEAgLTMzOTgsMTEgKzM0ODEsMTQgQEAKIHN0YXRpYyBzc2l6ZV90IHZhbGlkYXRlX3N0b3JlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuZ3RoKQogewotCWlmIChidWZbMF0gPT0gJzEnKQotCQl2YWxpZGF0ZV9zbGFiX2NhY2hlKHMpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIGxlbmd0aDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChidWZbMF0gPT0gJzEnKSB7CisJCXJldCA9IHZhbGlkYXRlX3NsYWJfY2FjaGUocyk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IGxlbmd0aDsKKwl9CisJcmV0dXJuIHJldDsKIH0KIFNMQUJfQVRUUih2YWxpZGF0ZSk7CiAKQEAgLTM1NTYsNyArMzY0Miw3IEBACiAJLmZpbHRlciA9IHVldmVudF9maWx0ZXIsCiB9OwogCi1kZWNsX3N1YnN5cyhzbGFiLCAmc2xhYl9rdHlwZSwgJnNsYWJfdWV2ZW50X29wcyk7CitzdGF0aWMgZGVjbF9zdWJzeXMoc2xhYiwgJnNsYWJfa3R5cGUsICZzbGFiX3VldmVudF9vcHMpOwogCiAjZGVmaW5lIElEX1NUUl9MRU5HVEggNjQKIApAQCAtMzY1NCw3ICszNzQwLDcgQEAKIAlzdHJ1Y3Qgc2F2ZWRfYWxpYXMgKm5leHQ7CiB9OwogCi1zdHJ1Y3Qgc2F2ZWRfYWxpYXMgKmFsaWFzX2xpc3Q7CitzdGF0aWMgc3RydWN0IHNhdmVkX2FsaWFzICphbGlhc19saXN0OwogCiBzdGF0aWMgaW50IHN5c2ZzX3NsYWJfYWxpYXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC0zNjgyLDcgKzM3NjgsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzbGFiX3N5c2ZzX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoOworCXN0cnVjdCBrbWVtX2NhY2hlICpzOwogCWludCBlcnI7CiAKIAllcnIgPSBzdWJzeXN0ZW1fcmVnaXN0ZXIoJnNsYWJfc3Vic3lzKTsKQEAgLTM2OTMsMTAgKzM3NzksNyBAQAogCiAJc2xhYl9zdGF0ZSA9IFNZU0ZTOwogCi0JbGlzdF9mb3JfZWFjaChoLCAmc2xhYl9jYWNoZXMpIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnMgPQotCQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBrbWVtX2NhY2hlLCBsaXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJnNsYWJfY2FjaGVzLCBsaXN0KSB7CiAJCWVyciA9IHN5c2ZzX3NsYWJfYWRkKHMpOwogCQlCVUdfT04oZXJyKTsKIAl9CmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmMKaW5kZXggNWY3Y2YyYS4uNjdkYWVjYiAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCisrKyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAvKgogICogc3dhcHBlcl9zcGFjZSBpcyBhIGZpY3Rpb24sIHJldGFpbmVkIHRvIHNpbXBsaWZ5IHRoZSBwYXRoIHRocm91Z2gKLSAqIHZtc2NhbidzIHNocmlua19saXN0LCB0byBtYWtlIHN5bmNfcGFnZSBsb29rIG5pY2VyLCBhbmQgdG8gYWxsb3cKKyAqIHZtc2NhbidzIHNocmlua19wYWdlX2xpc3QsIHRvIG1ha2Ugc3luY19wYWdlIGxvb2sgbmljZXIsIGFuZCB0byBhbGxvdwogICogZnV0dXJlIHVzZSBvZiByYWRpeF90cmVlIHRhZ3MgaW4gdGhlIHN3YXAgY2FjaGUuCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHN3YXBfYW9wcyA9IHsKQEAgLTMzNCw3ICszMzQsOCBAQAogCQkgKiBHZXQgYSBuZXcgcGFnZSB0byByZWFkIGludG8gZnJvbSBzd2FwLgogCQkgKi8KIAkJaWYgKCFuZXdfcGFnZSkgewotCQkJbmV3X3BhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgYWRkcik7CisJCQluZXdfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUl9NT1ZBQkxFLAorCQkJCQkJCQl2bWEsIGFkZHIpOwogCQkJaWYgKCFuZXdfcGFnZSkKIAkJCQlicmVhazsJCS8qIE91dCBvZiBtZW1vcnkgKi8KIAkJfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggYWNjMTcyYy4uN2ZmMGE4MSAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC04ODUsNyArODg1LDcgQEAKIAkJLyoKIAkJICogU28gd2UgY291bGQgc2tpcCBzZWFyY2hpbmcgbW1zIG9uY2Ugc3dhcCBjb3VudCB3ZW50CiAJCSAqIHRvIDEsIHdlIGRpZCBub3QgbWFyayBhbnkgcHJlc2VudCBwdGVzIGFzIGRpcnR5OiBtdXN0Ci0JCSAqIG1hcmsgcGFnZSBkaXJ0eSBzbyBzaHJpbmtfbGlzdCB3aWxsIHByZXNlcnZlIGl0LgorCQkgKiBtYXJrIHBhZ2UgZGlydHkgc28gc2hyaW5rX3BhZ2VfbGlzdCB3aWxsIHByZXNlcnZlIGl0LgogCQkgKi8KIAkJU2V0UGFnZURpcnR5KHBhZ2UpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jCmluZGV4IDRmYmUxYTIuLmY0N2U0NmQgMTAwNjQ0Ci0tLSBhL21tL3RydW5jYXRlLmMKKysrIGIvbW0vdHJ1bmNhdGUuYwpAQCAtMTAwLDkgKzEwMCw5IEBACiAJaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKQogCQlkb19pbnZhbGlkYXRlcGFnZShwYWdlLCAwKTsKIAorCXJlbW92ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7CiAJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CiAJQ2xlYXJQYWdlTWFwcGVkVG9EaXNrKHBhZ2UpOwotCXJlbW92ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwkvKiBwYWdlY2FjaGUgcmVmICovCiB9CiAKQEAgLTI1MywyMSArMjUzLDggQEAKIH0KIEVYUE9SVF9TWU1CT0wodHJ1bmNhdGVfaW5vZGVfcGFnZXMpOwogCi0vKioKLSAqIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyAtIEludmFsaWRhdGUgYWxsIHRoZSB1bmxvY2tlZCBwYWdlcyBvZiBvbmUgaW5vZGUKLSAqIEBtYXBwaW5nOiB0aGUgYWRkcmVzc19zcGFjZSB3aGljaCBob2xkcyB0aGUgcGFnZXMgdG8gaW52YWxpZGF0ZQotICogQHN0YXJ0OiB0aGUgb2Zmc2V0ICdmcm9tJyB3aGljaCB0byBpbnZhbGlkYXRlCi0gKiBAZW5kOiB0aGUgb2Zmc2V0ICd0bycgd2hpY2ggdG8gaW52YWxpZGF0ZSAoaW5jbHVzaXZlKQotICoKLSAqIFRoaXMgZnVuY3Rpb24gb25seSByZW1vdmVzIHRoZSB1bmxvY2tlZCBwYWdlcywgaWYgeW91IHdhbnQgdG8KLSAqIHJlbW92ZSBhbGwgdGhlIHBhZ2VzIG9mIG9uZSBpbm9kZSwgeW91IG11c3QgY2FsbCB0cnVuY2F0ZV9pbm9kZV9wYWdlcy4KLSAqCi0gKiBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoKSB3aWxsIG5vdCBibG9jayBvbiBJTyBhY3Rpdml0eS4gSXQgd2lsbCBub3QKLSAqIGludmFsaWRhdGUgcGFnZXMgd2hpY2ggYXJlIGRpcnR5LCBsb2NrZWQsIHVuZGVyIHdyaXRlYmFjayBvciBtYXBwZWQgaW50bwotICogcGFnZXRhYmxlcy4KLSAqLwotdW5zaWduZWQgbG9uZyBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQpCit1bnNpZ25lZCBsb25nIF9faW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kLCBib29sIGJlX2F0b21pYykKIHsKIAlzdHJ1Y3QgcGFnZXZlYyBwdmVjOwogCXBnb2ZmX3QgbmV4dCA9IHN0YXJ0OwpAQCAtMzA4LDE3ICsyOTUsMzggQEAKIAkJCQlicmVhazsKIAkJfQogCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCQlpZiAobGlrZWx5KCFiZV9hdG9taWMpKQorCQkJY29uZF9yZXNjaGVkKCk7CiAJfQogCXJldHVybiByZXQ7CiB9CisKKy8qKgorICogaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzIC0gSW52YWxpZGF0ZSBhbGwgdGhlIHVubG9ja2VkIHBhZ2VzIG9mIG9uZSBpbm9kZQorICogQG1hcHBpbmc6IHRoZSBhZGRyZXNzX3NwYWNlIHdoaWNoIGhvbGRzIHRoZSBwYWdlcyB0byBpbnZhbGlkYXRlCisgKiBAc3RhcnQ6IHRoZSBvZmZzZXQgJ2Zyb20nIHdoaWNoIHRvIGludmFsaWRhdGUKKyAqIEBlbmQ6IHRoZSBvZmZzZXQgJ3RvJyB3aGljaCB0byBpbnZhbGlkYXRlIChpbmNsdXNpdmUpCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IHJlbW92ZXMgdGhlIHVubG9ja2VkIHBhZ2VzLCBpZiB5b3Ugd2FudCB0bworICogcmVtb3ZlIGFsbCB0aGUgcGFnZXMgb2Ygb25lIGlub2RlLCB5b3UgbXVzdCBjYWxsIHRydW5jYXRlX2lub2RlX3BhZ2VzLgorICoKKyAqIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcygpIHdpbGwgbm90IGJsb2NrIG9uIElPIGFjdGl2aXR5LiBJdCB3aWxsIG5vdAorICogaW52YWxpZGF0ZSBwYWdlcyB3aGljaCBhcmUgZGlydHksIGxvY2tlZCwgdW5kZXIgd3JpdGViYWNrIG9yIG1hcHBlZCBpbnRvCisgKiBwYWdldGFibGVzLgorICovCit1bnNpZ25lZCBsb25nIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCkKK3sKKwlyZXR1cm4gX19pbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMobWFwcGluZywgc3RhcnQsIGVuZCwgZmFsc2UpOworfQogRVhQT1JUX1NZTUJPTChpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMpOwogCiAvKgogICogVGhpcyBpcyBsaWtlIGludmFsaWRhdGVfY29tcGxldGVfcGFnZSgpLCBleGNlcHQgaXQgaWdub3JlcyB0aGUgcGFnZSdzCiAgKiByZWZjb3VudC4gIFdlIGRvIHRoaXMgYmVjYXVzZSBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMigpIG5lZWRzIHN0cm9uZ2VyCiAgKiBpbnZhbGlkYXRpb24gZ3VhcmFudGVlcywgYW5kIGNhbm5vdCBhZmZvcmQgdG8gbGVhdmUgcGFnZXMgYmVoaW5kIGJlY2F1c2UKLSAqIHNocmlua19saXN0KCkgaGFzIGEgdGVtcCByZWYgb24gdGhlbSwgb3IgYmVjYXVzZSB0aGV5J3JlIHRyYW5zaWVudGx5IHNpdHRpbmcKLSAqIGluIHRoZSBscnVfY2FjaGVfYWRkKCkgcGFnZXZlY3MuCisgKiBzaHJpbmtfcGFnZV9saXN0KCkgaGFzIGEgdGVtcCByZWYgb24gdGhlbSwgb3IgYmVjYXVzZSB0aGV5J3JlIHRyYW5zaWVudGx5CisgKiBzaXR0aW5nIGluIHRoZSBscnVfY2FjaGVfYWRkKCkgcGFnZXZlY3MuCiAgKi8KIHN0YXRpYyBpbnQKIGludmFsaWRhdGVfY29tcGxldGVfcGFnZTIoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBwYWdlICpwYWdlKQpkaWZmIC0tZ2l0IGEvbW0vdXRpbC5jIGIvbW0vdXRpbC5jCmluZGV4IGFjZTJhZWEuLjc4ZjM3ODMgMTAwNjQ0Ci0tLSBhL21tL3V0aWwuYworKysgYi9tbS91dGlsLmMKQEAgLTUsMjAgKzUsNiBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKIC8qKgotICogX19remFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgotICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqLwotdm9pZCAqX19remFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQl2b2lkICpyZXQgPSBrbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncyk7Ci0JaWYgKHJldCkKLQkJbWVtc2V0KHJldCwgMCwgc2l6ZSk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woX19remFsbG9jKTsKLQotLyoKICAqIGtzdHJkdXAgLSBhbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIGNvcHkgYW4gZXhpc3Rpbmcgc3RyaW5nCiAgKgogICogQHM6IHRoZSBzdHJpbmcgdG8gZHVwbGljYXRlCkBAIC01OCw2ICs0NCw0MCBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtZHVwKTsKIAorLyoqCisgKiBrcmVhbGxvYyAtIHJlYWxsb2NhdGUgbWVtb3J5LiBUaGUgY29udGVudHMgd2lsbCByZW1haW4gdW5jaGFuZ2VkLgorICogQHA6IG9iamVjdCB0byByZWFsbG9jYXRlIG1lbW9yeSBmb3IuCisgKiBAbmV3X3NpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBwb2ludGVkIHRvIGFyZSBwcmVzZXJ2ZWQgdXAgdG8gdGhlCisgKiBsZXNzZXIgb2YgdGhlIG5ldyBhbmQgb2xkIHNpemVzLiAgSWYgQHAgaXMgJU5VTEwsIGtyZWFsbG9jKCkKKyAqIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGttYWxsb2MoKS4gIElmIEBzaXplIGlzIDAgYW5kIEBwIGlzIG5vdCBhCisgKiAlTlVMTCBwb2ludGVyLCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gaXMgZnJlZWQuCisgKi8KK3ZvaWQgKmtyZWFsbG9jKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBuZXdfc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJdm9pZCAqcmV0OworCXNpemVfdCBrczsKKworCWlmICh1bmxpa2VseSghbmV3X3NpemUpKSB7CisJCWtmcmVlKHApOworCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwl9CisKKwlrcyA9IGtzaXplKHApOworCWlmIChrcyA+PSBuZXdfc2l6ZSkKKwkJcmV0dXJuICh2b2lkICopcDsKKworCXJldCA9IGttYWxsb2NfdHJhY2tfY2FsbGVyKG5ld19zaXplLCBmbGFncyk7CisJaWYgKHJldCkgeworCQltZW1jcHkocmV0LCBwLCBtaW4obmV3X3NpemUsIGtzKSk7CisJCWtmcmVlKHApOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChrcmVhbGxvYyk7CisKIC8qCiAgKiBzdHJuZHVwX3VzZXIgLSBkdXBsaWNhdGUgYW4gZXhpc3Rpbmcgc3RyaW5nIGZyb20gdXNlciBzcGFjZQogICoKZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCBkM2E5YzUzLi44ZTA1YTExIDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC02OCwxMiArNjgsMTIgQEAKIAl9IHdoaWxlIChwdWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIH0KIAotdm9pZCB1bm1hcF92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEpCit2b2lkIHVubWFwX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlwZ2RfdCAqcGdkOwogCXVuc2lnbmVkIGxvbmcgbmV4dDsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZykgYXJlYS0+YWRkcjsKLQl1bnNpZ25lZCBsb25nIGVuZCA9IGFkZHIgKyBhcmVhLT5zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyOworCXVuc2lnbmVkIGxvbmcgZW5kID0gYWRkciArIHNpemU7CiAKIAlCVUdfT04oYWRkciA+PSBlbmQpOwogCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKQEAgLTg0LDcgKzg0LDEyIEBACiAJCQljb250aW51ZTsKIAkJdnVubWFwX3B1ZF9yYW5nZShwZ2QsIGFkZHIsIG5leHQpOwogCX0gd2hpbGUgKHBnZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwotCWZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIGFyZWEtPmFkZHIsIGVuZCk7CisJZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydCwgZW5kKTsKK30KKworc3RhdGljIHZvaWQgdW5tYXBfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhKQoreworCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZylhcmVhLT5hZGRyLCBhcmVhLT5zaXplKTsKIH0KIAogc3RhdGljIGludCB2bWFwX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsCkBAIC00MjcsMTEgKzQzMiwxMiBAQAogCWFyZWEtPm5yX3BhZ2VzID0gbnJfcGFnZXM7CiAJLyogUGxlYXNlIG5vdGUgdGhhdCB0aGUgcmVjdXJzaW9uIGlzIHN0cmljdGx5IGJvdW5kZWQuICovCiAJaWYgKGFycmF5X3NpemUgPiBQQUdFX1NJWkUpIHsKLQkJcGFnZXMgPSBfX3ZtYWxsb2Nfbm9kZShhcnJheV9zaXplLCBnZnBfbWFzaywgUEFHRV9LRVJORUwsIG5vZGUpOworCQlwYWdlcyA9IF9fdm1hbGxvY19ub2RlKGFycmF5X3NpemUsIGdmcF9tYXNrIHwgX19HRlBfWkVSTywKKwkJCQkJUEFHRV9LRVJORUwsIG5vZGUpOwogCQlhcmVhLT5mbGFncyB8PSBWTV9WUEFHRVM7CiAJfSBlbHNlIHsKIAkJcGFnZXMgPSBrbWFsbG9jX25vZGUoYXJyYXlfc2l6ZSwKLQkJCQkoZ2ZwX21hc2sgJiBHRlBfTEVWRUxfTUFTSyksCisJCQkJKGdmcF9tYXNrICYgR0ZQX0xFVkVMX01BU0spIHwgX19HRlBfWkVSTywKIAkJCQlub2RlKTsKIAl9CiAJYXJlYS0+cGFnZXMgPSBwYWdlczsKQEAgLTQ0MCw3ICs0NDYsNiBAQAogCQlrZnJlZShhcmVhKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCW1lbXNldChhcmVhLT5wYWdlcywgMCwgYXJyYXlfc2l6ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXJlYS0+bnJfcGFnZXM7IGkrKykgewogCQlpZiAobm9kZSA8IDApCmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IDFiZTVhNjMuLmQ0MTllMTAgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC02NiwxNyArNjYsOCBAQAogCWludCBzd2FwcGluZXNzOwogCiAJaW50IGFsbF91bnJlY2xhaW1hYmxlOwotfTsKIAotLyoKLSAqIFRoZSBsaXN0IG9mIHNocmlua2VyIGNhbGxiYWNrcyB1c2VkIGJ5IHRvIGFwcGx5IHByZXNzdXJlIHRvCi0gKiBhZ2VhYmxlIGNhY2hlcy4KLSAqLwotc3RydWN0IHNocmlua2VyIHsKLQlzaHJpbmtlcl90CQlzaHJpbmtlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0JaW50CQkJc2Vla3M7CS8qIHNlZWtzIHRvIHJlY3JlYXRlIGFuIG9iaiAqLwotCWxvbmcJCQlucjsJLyogb2JqcyBwZW5kaW5nIGRlbGV0ZSAqLworCWludCBvcmRlcjsKIH07CiAKICNkZWZpbmUgbHJ1X3RvX3BhZ2UoX2hlYWQpIChsaXN0X2VudHJ5KChfaGVhZCktPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpKQpAQCAtMTIxLDM0ICsxMTIsMjUgQEAKIC8qCiAgKiBBZGQgYSBzaHJpbmtlciBjYWxsYmFjayB0byBiZSBjYWxsZWQgZnJvbSB0aGUgdm0KICAqLwotc3RydWN0IHNocmlua2VyICpzZXRfc2hyaW5rZXIoaW50IHNlZWtzLCBzaHJpbmtlcl90IHRoZXNocmlua2VyKQordm9pZCByZWdpc3Rlcl9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyKQogewotICAgICAgICBzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyOwotCi0gICAgICAgIHNocmlua2VyID0ga21hbGxvYyhzaXplb2YoKnNocmlua2VyKSwgR0ZQX0tFUk5FTCk7Ci0gICAgICAgIGlmIChzaHJpbmtlcikgewotCSAgICAgICAgc2hyaW5rZXItPnNocmlua2VyID0gdGhlc2hyaW5rZXI7Ci0JICAgICAgICBzaHJpbmtlci0+c2Vla3MgPSBzZWVrczsKLQkgICAgICAgIHNocmlua2VyLT5uciA9IDA7Ci0JICAgICAgICBkb3duX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7Ci0JICAgICAgICBsaXN0X2FkZF90YWlsKCZzaHJpbmtlci0+bGlzdCwgJnNocmlua2VyX2xpc3QpOwotCSAgICAgICAgdXBfd3JpdGUoJnNocmlua2VyX3J3c2VtKTsKLQl9Ci0JcmV0dXJuIHNocmlua2VyOworCXNocmlua2VyLT5uciA9IDA7CisJZG93bl93cml0ZSgmc2hyaW5rZXJfcndzZW0pOworCWxpc3RfYWRkX3RhaWwoJnNocmlua2VyLT5saXN0LCAmc2hyaW5rZXJfbGlzdCk7CisJdXBfd3JpdGUoJnNocmlua2VyX3J3c2VtKTsKIH0KLUVYUE9SVF9TWU1CT0woc2V0X3Nocmlua2VyKTsKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfc2hyaW5rZXIpOwogCiAvKgogICogUmVtb3ZlIG9uZQogICovCi12b2lkIHJlbW92ZV9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyKQordm9pZCB1bnJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIpCiB7CiAJZG93bl93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwogCWxpc3RfZGVsKCZzaHJpbmtlci0+bGlzdCk7CiAJdXBfd3JpdGUoJnNocmlua2VyX3J3c2VtKTsKLQlrZnJlZShzaHJpbmtlcik7CiB9Ci1FWFBPUlRfU1lNQk9MKHJlbW92ZV9zaHJpbmtlcik7CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfc2hyaW5rZXIpOwogCiAjZGVmaW5lIFNIUklOS19CQVRDSCAxMjgKIC8qCkBAIC0xODUsNyArMTY3LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNocmlua2VyLCAmc2hyaW5rZXJfbGlzdCwgbGlzdCkgewogCQl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGE7CiAJCXVuc2lnbmVkIGxvbmcgdG90YWxfc2NhbjsKLQkJdW5zaWduZWQgbG9uZyBtYXhfcGFzcyA9ICgqc2hyaW5rZXItPnNocmlua2VyKSgwLCBnZnBfbWFzayk7CisJCXVuc2lnbmVkIGxvbmcgbWF4X3Bhc3MgPSAoKnNocmlua2VyLT5zaHJpbmspKDAsIGdmcF9tYXNrKTsKIAogCQlkZWx0YSA9ICg0ICogc2Nhbm5lZCkgLyBzaHJpbmtlci0+c2Vla3M7CiAJCWRlbHRhICo9IG1heF9wYXNzOwpAQCAtMjEzLDggKzE5NSw4IEBACiAJCQlpbnQgc2hyaW5rX3JldDsKIAkJCWludCBucl9iZWZvcmU7CiAKLQkJCW5yX2JlZm9yZSA9ICgqc2hyaW5rZXItPnNocmlua2VyKSgwLCBnZnBfbWFzayk7Ci0JCQlzaHJpbmtfcmV0ID0gKCpzaHJpbmtlci0+c2hyaW5rZXIpKHRoaXNfc2NhbiwgZ2ZwX21hc2spOworCQkJbnJfYmVmb3JlID0gKCpzaHJpbmtlci0+c2hyaW5rKSgwLCBnZnBfbWFzayk7CisJCQlzaHJpbmtfcmV0ID0gKCpzaHJpbmtlci0+c2hyaW5rKSh0aGlzX3NjYW4sIGdmcF9tYXNrKTsKIAkJCWlmIChzaHJpbmtfcmV0ID09IC0xKQogCQkJCWJyZWFrOwogCQkJaWYgKHNocmlua19yZXQgPCBucl9iZWZvcmUpCkBAIC00ODEsNyArNDYzLDggQEAKIAogCQlyZWZlcmVuY2VkID0gcGFnZV9yZWZlcmVuY2VkKHBhZ2UsIDEpOwogCQkvKiBJbiBhY3RpdmUgdXNlIG9yIHJlYWxseSB1bmZyZWVhYmxlPyAgQWN0aXZhdGUgaXQuICovCi0JCWlmIChyZWZlcmVuY2VkICYmIHBhZ2VfbWFwcGluZ19pbnVzZShwYWdlKSkKKwkJaWYgKHNjLT5vcmRlciA8PSBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUiAmJgorCQkJCQlyZWZlcmVuY2VkICYmIHBhZ2VfbWFwcGluZ19pbnVzZShwYWdlKSkKIAkJCWdvdG8gYWN0aXZhdGVfbG9ja2VkOwogCiAjaWZkZWYgQ09ORklHX1NXQVAKQEAgLTUxNCw3ICs0OTcsNyBAQAogCQl9CiAKIAkJaWYgKFBhZ2VEaXJ0eShwYWdlKSkgewotCQkJaWYgKHJlZmVyZW5jZWQpCisJCQlpZiAoc2MtPm9yZGVyIDw9IFBBR0VfQUxMT0NfQ09TVExZX09SREVSICYmIHJlZmVyZW5jZWQpCiAJCQkJZ290byBrZWVwX2xvY2tlZDsKIAkJCWlmICghbWF5X2VudGVyX2ZzKQogCQkJCWdvdG8ga2VlcF9sb2NrZWQ7CkBAIC01OTgsNiArNTgxLDUxIEBACiAJcmV0dXJuIG5yX3JlY2xhaW1lZDsKIH0KIAorLyogTFJVIElzb2xhdGlvbiBtb2Rlcy4gKi8KKyNkZWZpbmUgSVNPTEFURV9JTkFDVElWRSAwCS8qIElzb2xhdGUgaW5hY3RpdmUgcGFnZXMuICovCisjZGVmaW5lIElTT0xBVEVfQUNUSVZFIDEJLyogSXNvbGF0ZSBhY3RpdmUgcGFnZXMuICovCisjZGVmaW5lIElTT0xBVEVfQk9USCAyCQkvKiBJc29sYXRlIGJvdGggYWN0aXZlIGFuZCBpbmFjdGl2ZSBwYWdlcy4gKi8KKworLyoKKyAqIEF0dGVtcHQgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGFnZSBmcm9tIGl0cyBMUlUuICBPbmx5IHRha2UgdGhpcyBwYWdlCisgKiBpZiBpdCBpcyBvZiB0aGUgYXBwcm9wcmlhdGUgUGFnZUFjdGl2ZSBzdGF0dXMuICBQYWdlcyB3aGljaCBhcmUgYmVpbmcKKyAqIGZyZWVkIGVsc2V3aGVyZSBhcmUgYWxzbyBpZ25vcmVkLgorICoKKyAqIHBhZ2U6CXBhZ2UgdG8gY29uc2lkZXIKKyAqIG1vZGU6CW9uZSBvZiB0aGUgTFJVIGlzb2xhdGlvbiBtb2RlcyBkZWZpbmVkIGFib3ZlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC12ZSBlcnJubyBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1vZGUpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwkvKiBPbmx5IHRha2UgcGFnZXMgb24gdGhlIExSVS4gKi8KKwlpZiAoIVBhZ2VMUlUocGFnZSkpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFdoZW4gY2hlY2tpbmcgdGhlIGFjdGl2ZSBzdGF0ZSwgd2UgbmVlZCB0byBiZSBzdXJlIHdlIGFyZQorCSAqIGRlYWxpbmcgd2l0aCBjb21wYXJpYmxlIGJvb2xlYW4gdmFsdWVzLiAgVGFrZSB0aGUgbG9naWNhbCBub3QKKwkgKiBvZiBlYWNoLgorCSAqLworCWlmIChtb2RlICE9IElTT0xBVEVfQk9USCAmJiAoIVBhZ2VBY3RpdmUocGFnZSkgIT0gIW1vZGUpKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gLUVCVVNZOworCWlmIChsaWtlbHkoZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZSkpKSB7CisJCS8qCisJCSAqIEJlIGNhcmVmdWwgbm90IHRvIGNsZWFyIFBhZ2VMUlUgdW50aWwgYWZ0ZXIgd2UncmUKKwkJICogc3VyZSB0aGUgcGFnZSBpcyBub3QgYmVpbmcgZnJlZWQgZWxzZXdoZXJlIC0tIHRoZQorCQkgKiBwYWdlIHJlbGVhc2UgY29kZSByZWxpZXMgb24gaXQuCisJCSAqLworCQlDbGVhclBhZ2VMUlUocGFnZSk7CisJCXJldCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIHpvbmUtPmxydV9sb2NrIGlzIGhlYXZpbHkgY29udGVuZGVkLiAgU29tZSBvZiB0aGUgZnVuY3Rpb25zIHRoYXQKICAqIHNocmluayB0aGUgbGlzdHMgcGVyZm9ybSBiZXR0ZXIgYnkgdGFraW5nIG91dCBhIGJhdGNoIG9mIHBhZ2VzCkBAIC02MTIsMzggKzY0MCw5MCBAQAogICogQHNyYzoJVGhlIExSVSBsaXN0IHRvIHB1bGwgcGFnZXMgb2ZmLgogICogQGRzdDoJVGhlIHRlbXAgbGlzdCB0byBwdXQgcGFnZXMgb24gdG8uCiAgKiBAc2Nhbm5lZDoJVGhlIG51bWJlciBvZiBwYWdlcyB0aGF0IHdlcmUgc2Nhbm5lZC4KKyAqIEBvcmRlcjoJVGhlIGNhbGxlcidzIGF0dGVtcHRlZCBhbGxvY2F0aW9uIG9yZGVyCisgKiBAbW9kZToJT25lIG9mIHRoZSBMUlUgaXNvbGF0aW9uIG1vZGVzCiAgKgogICogcmV0dXJucyBob3cgbWFueSBwYWdlcyB3ZXJlIG1vdmVkIG9udG8gKkBkc3QuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlzb2xhdGVfbHJ1X3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKIAkJc3RydWN0IGxpc3RfaGVhZCAqc3JjLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCi0JCXVuc2lnbmVkIGxvbmcgKnNjYW5uZWQpCisJCXVuc2lnbmVkIGxvbmcgKnNjYW5uZWQsIGludCBvcmRlciwgaW50IG1vZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBucl90YWtlbiA9IDA7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBzY2FuOwogCiAJZm9yIChzY2FuID0gMDsgc2NhbiA8IG5yX3RvX3NjYW4gJiYgIWxpc3RfZW1wdHkoc3JjKTsgc2NhbisrKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldDsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXVuc2lnbmVkIGxvbmcgcGZuOworCQl1bnNpZ25lZCBsb25nIGVuZF9wZm47CisJCXVuc2lnbmVkIGxvbmcgcGFnZV9wZm47CisJCWludCB6b25lX2lkOworCiAJCXBhZ2UgPSBscnVfdG9fcGFnZShzcmMpOwogCQlwcmVmZXRjaHdfcHJldl9scnVfcGFnZShwYWdlLCBzcmMsIGZsYWdzKTsKIAogCQlWTV9CVUdfT04oIVBhZ2VMUlUocGFnZSkpOwogCi0JCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCQl0YXJnZXQgPSBzcmM7Ci0JCWlmIChsaWtlbHkoZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZSkpKSB7Ci0JCQkvKgotCQkJICogQmUgY2FyZWZ1bCBub3QgdG8gY2xlYXIgUGFnZUxSVSB1bnRpbCBhZnRlciB3ZSdyZQotCQkJICogc3VyZSB0aGUgcGFnZSBpcyBub3QgYmVpbmcgZnJlZWQgZWxzZXdoZXJlIC0tIHRoZQotCQkJICogcGFnZSByZWxlYXNlIGNvZGUgcmVsaWVzIG9uIGl0LgotCQkJICovCi0JCQlDbGVhclBhZ2VMUlUocGFnZSk7Ci0JCQl0YXJnZXQgPSBkc3Q7CisJCXN3aXRjaCAoX19pc29sYXRlX2xydV9wYWdlKHBhZ2UsIG1vZGUpKSB7CisJCWNhc2UgMDoKKwkJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCBkc3QpOwogCQkJbnJfdGFrZW4rKzsKLQkJfSAvKiBlbHNlIGl0IGlzIGJlaW5nIGZyZWVkIGVsc2V3aGVyZSAqLworCQkJYnJlYWs7CiAKLQkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgdGFyZ2V0KTsKKwkJY2FzZSAtRUJVU1k6CisJCQkvKiBlbHNlIGl0IGlzIGJlaW5nIGZyZWVkIGVsc2V3aGVyZSAqLworCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsIHNyYyk7CisJCQljb250aW51ZTsKKworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKworCQlpZiAoIW9yZGVyKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogQXR0ZW1wdCB0byB0YWtlIGFsbCBwYWdlcyBpbiB0aGUgb3JkZXIgYWxpZ25lZCByZWdpb24KKwkJICogc3Vycm91bmRpbmcgdGhlIHRhZyBwYWdlLiAgT25seSB0YWtlIHRob3NlIHBhZ2VzIG9mCisJCSAqIHRoZSBzYW1lIGFjdGl2ZSBzdGF0ZSBhcyB0aGF0IHRhZyBwYWdlLiAgV2UgbWF5IHNhZmVseQorCQkgKiByb3VuZCB0aGUgdGFyZ2V0IHBhZ2UgcGZuIGRvd24gdG8gdGhlIHJlcXVlc3RlZCBvcmRlcgorCQkgKiBhcyB0aGUgbWVtX21hcCBpcyBndWFyZW50ZWVkIHZhbGlkIG91dCB0byBNQVhfT1JERVIsCisJCSAqIHdoZXJlIHRoYXQgcGFnZSBpcyBpbiBhIGRpZmZlcmVudCB6b25lIHdlIHdpbGwgZGV0ZWN0CisJCSAqIGl0IGZyb20gaXRzIHpvbmUgaWQgYW5kIGFib3J0IHRoaXMgYmxvY2sgc2Nhbi4KKwkJICovCisJCXpvbmVfaWQgPSBwYWdlX3pvbmVfaWQocGFnZSk7CisJCXBhZ2VfcGZuID0gcGFnZV90b19wZm4ocGFnZSk7CisJCXBmbiA9IHBhZ2VfcGZuICYgfigoMSA8PCBvcmRlcikgLSAxKTsKKwkJZW5kX3BmbiA9IHBmbiArICgxIDw8IG9yZGVyKTsKKwkJZm9yICg7IHBmbiA8IGVuZF9wZm47IHBmbisrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqY3Vyc29yX3BhZ2U7CisKKwkJCS8qIFRoZSB0YXJnZXQgcGFnZSBpcyBpbiB0aGUgYmxvY2ssIGlnbm9yZSBpdC4gKi8KKwkJCWlmICh1bmxpa2VseShwZm4gPT0gcGFnZV9wZm4pKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBBdm9pZCBob2xlcyB3aXRoaW4gdGhlIHpvbmUuICovCisJCQlpZiAodW5saWtlbHkoIXBmbl92YWxpZF93aXRoaW4ocGZuKSkpCisJCQkJYnJlYWs7CisKKwkJCWN1cnNvcl9wYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwkJCS8qIENoZWNrIHRoYXQgd2UgaGF2ZSBub3QgY3Jvc3NlZCBhIHpvbmUgYm91bmRhcnkuICovCisJCQlpZiAodW5saWtlbHkocGFnZV96b25lX2lkKGN1cnNvcl9wYWdlKSAhPSB6b25lX2lkKSkKKwkJCQljb250aW51ZTsKKwkJCXN3aXRjaCAoX19pc29sYXRlX2xydV9wYWdlKGN1cnNvcl9wYWdlLCBtb2RlKSkgeworCQkJY2FzZSAwOgorCQkJCWxpc3RfbW92ZSgmY3Vyc29yX3BhZ2UtPmxydSwgZHN0KTsKKwkJCQlucl90YWtlbisrOworCQkJCXNjYW4rKzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAtRUJVU1k6CisJCQkJLyogZWxzZSBpdCBpcyBiZWluZyBmcmVlZCBlbHNld2hlcmUgKi8KKwkJCQlsaXN0X21vdmUoJmN1cnNvcl9wYWdlLT5scnUsIHNyYyk7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CiAJfQogCiAJKnNjYW5uZWQgPSBzY2FuOwpAQCAtNjUxLDYgKzczMSwyNCBAQAogfQogCiAvKgorICogY2xlYXJfYWN0aXZlX2ZsYWdzKCkgaXMgYSBoZWxwZXIgZm9yIHNocmlua19hY3RpdmVfbGlzdCgpLCBjbGVhcmluZworICogYW55IGFjdGl2ZSBiaXRzIGZyb20gdGhlIHBhZ2VzIGluIHRoZSBsaXN0LgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGVhcl9hY3RpdmVfZmxhZ3Moc3RydWN0IGxpc3RfaGVhZCAqcGFnZV9saXN0KQoreworCWludCBucl9hY3RpdmUgPSAwOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCBwYWdlX2xpc3QsIGxydSkKKwkJaWYgKFBhZ2VBY3RpdmUocGFnZSkpIHsKKwkJCUNsZWFyUGFnZUFjdGl2ZShwYWdlKTsKKwkJCW5yX2FjdGl2ZSsrOworCQl9CisKKwlyZXR1cm4gbnJfYWN0aXZlOworfQorCisvKgogICogc2hyaW5rX2luYWN0aXZlX2xpc3QoKSBpcyBhIGhlbHBlciBmb3Igc2hyaW5rX3pvbmUoKS4gIEl0IHJldHVybnMgdGhlIG51bWJlcgogICogb2YgcmVjbGFpbWVkIHBhZ2VzCiAgKi8KQEAgLTY3MSwxMSArNzY5LDE4IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfdGFrZW47CiAJCXVuc2lnbmVkIGxvbmcgbnJfc2NhbjsKIAkJdW5zaWduZWQgbG9uZyBucl9mcmVlZDsKKwkJdW5zaWduZWQgbG9uZyBucl9hY3RpdmU7CiAKIAkJbnJfdGFrZW4gPSBpc29sYXRlX2xydV9wYWdlcyhzYy0+c3dhcF9jbHVzdGVyX21heCwKLQkJCQkJICAgICAmem9uZS0+aW5hY3RpdmVfbGlzdCwKLQkJCQkJICAgICAmcGFnZV9saXN0LCAmbnJfc2Nhbik7Ci0JCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRSwgLW5yX3Rha2VuKTsKKwkJCSAgICAgJnpvbmUtPmluYWN0aXZlX2xpc3QsCisJCQkgICAgICZwYWdlX2xpc3QsICZucl9zY2FuLCBzYy0+b3JkZXIsCisJCQkgICAgIChzYy0+b3JkZXIgPiBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUik/CisJCQkJCSAgICAgSVNPTEFURV9CT1RIIDogSVNPTEFURV9JTkFDVElWRSk7CisJCW5yX2FjdGl2ZSA9IGNsZWFyX2FjdGl2ZV9mbGFncygmcGFnZV9saXN0KTsKKworCQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFLCAtbnJfYWN0aXZlKTsKKwkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFLAorCQkJCQkJLShucl90YWtlbiAtIG5yX2FjdGl2ZSkpOwogCQl6b25lLT5wYWdlc19zY2FubmVkICs9IG5yX3NjYW47CiAJCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCkBAIC04MjAsNyArOTI1LDcgQEAKIAlscnVfYWRkX2RyYWluKCk7CiAJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCXBnbW92ZWQgPSBpc29sYXRlX2xydV9wYWdlcyhucl9wYWdlcywgJnpvbmUtPmFjdGl2ZV9saXN0LAotCQkJCSAgICAmbF9ob2xkLCAmcGdzY2FubmVkKTsKKwkJCSAgICAmbF9ob2xkLCAmcGdzY2FubmVkLCBzYy0+b3JkZXIsIElTT0xBVEVfQUNUSVZFKTsKIAl6b25lLT5wYWdlc19zY2FubmVkICs9IHBnc2Nhbm5lZDsKIAlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFLCAtcGdtb3ZlZCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CkBAIC0xMDExLDcgKzExMTYsNyBAQAogICogaG9sZHMgZmlsZXN5c3RlbSBsb2NrcyB3aGljaCBwcmV2ZW50IHdyaXRlb3V0IHRoaXMgbWlnaHQgbm90IHdvcmssIGFuZCB0aGUKICAqIGFsbG9jYXRpb24gYXR0ZW1wdCB3aWxsIGZhaWwuCiAgKi8KLXVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKip6b25lcywgZ2ZwX3QgZ2ZwX21hc2spCit1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lICoqem9uZXMsIGludCBvcmRlciwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJaW50IHByaW9yaXR5OwogCWludCByZXQgPSAwOwpAQCAtMTAyNiw2ICsxMTMxLDcgQEAKIAkJLnN3YXBfY2x1c3Rlcl9tYXggPSBTV0FQX0NMVVNURVJfTUFYLAogCQkubWF5X3N3YXAgPSAxLAogCQkuc3dhcHBpbmVzcyA9IHZtX3N3YXBwaW5lc3MsCisJCS5vcmRlciA9IG9yZGVyLAogCX07CiAKIAljb3VudF92bV9ldmVudChBTExPQ1NUQUxMKTsKQEAgLTExMzEsNiArMTIzNyw3IEBACiAJCS5tYXlfc3dhcCA9IDEsCiAJCS5zd2FwX2NsdXN0ZXJfbWF4ID0gU1dBUF9DTFVTVEVSX01BWCwKIAkJLnN3YXBwaW5lc3MgPSB2bV9zd2FwcGluZXNzLAorCQkub3JkZXIgPSBvcmRlciwKIAl9OwogCS8qCiAJICogdGVtcF9wcmlvcml0eSBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBzY2FubmluZyBwcmlvcml0eSBhdCB3aGljaApAQCAtMTMxNCw2ICsxNDIxLDcgQEAKIAkgKiB0cnlpbmcgdG8gZnJlZSB0aGUgZmlyc3QgcGllY2Ugb2YgbWVtb3J5IGluIHRoZSBmaXJzdCBwbGFjZSkuCiAJICovCiAJdHNrLT5mbGFncyB8PSBQRl9NRU1BTExPQyB8IFBGX1NXQVBXUklURSB8IFBGX0tTV0FQRDsKKwlzZXRfZnJlZXphYmxlKCk7CiAKIAlvcmRlciA9IDA7CiAJZm9yICggOyA7ICkgewpkaWZmIC0tZ2l0IGEvbW0vdm1zdGF0LmMgYi9tbS92bXN0YXQuYwppbmRleCBlY2VhZjQ5Li5mYWRmNzkxIDEwMDY0NAotLS0gYS9tbS92bXN0YXQuYworKysgYi9tbS92bXN0YXQuYwpAQCAtNDcyLDcgKzQ3Miw3IEBACiAjZW5kaWYKIAogI2RlZmluZSBURVhUU19GT1JfWk9ORVMoeHgpIFRFWFRfRk9SX0RNQSh4eCkgVEVYVF9GT1JfRE1BMzIoeHgpIHh4ICJfbm9ybWFsIiwgXAotCQkJCQlURVhUX0ZPUl9ISUdITUVNKHh4KQorCQkJCQlURVhUX0ZPUl9ISUdITUVNKHh4KSB4eCAiX21vdmFibGUiLAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtc3RhdF90ZXh0W10gPSB7CiAJLyogWm9uZWQgVk0gY291bnRlcnMgKi8KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCmluZGV4IDFjOGY0YTAuLjFmNzhjM2UgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KQEAgLTQ3NCw3ICs0NzUsNiBAQAogCiAJZGFlbW9uaXplKCJrYm5lcGQgJXMiLCBkZXYtPm5hbWUpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTE1KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCmluZGV4IDY2YmVmMWMuLmNhNjBhNDUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KQEAgLTI4Nyw3ICsyODgsNiBAQAogCiAJZGFlbW9uaXplKCJrY210cGRfY3RyXyVkIiwgc2Vzc2lvbi0+bnVtKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwppbmRleCA0NTBlYjAyLi42NGQ4OWNhIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CkBAIC01NDcsNyArNTQ4LDYgQEAKIAogCWRhZW1vbml6ZSgia2hpZHBkXyUwNHglMDR4IiwgdmVuZG9yLCBwcm9kdWN0KTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmY3RybF93YWl0LCBjdXJyZW50KTsKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmaW50cl93YWl0LCBjdXJyZW50KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYwppbmRleCA1MmUwNGRmLi5iYjcyMjA3IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KQEAgLTE5NDAsNyArMTk0MSw2IEBACiAKIAlkYWVtb25pemUoImtyZmNvbW1kIik7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTApOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJQlRfREJHKCIiKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvbXBhdC5jIGIvbmV0L2NvbXBhdC5jCmluZGV4IDlhMGY1ZjIuLmQ3NGQ4MjEgMTAwNjQ0Ci0tLSBhL25ldC9jb21wYXQuYworKysgYi9uZXQvY29tcGF0LmMKQEAgLTI3Niw3ICsyNzYsOCBAQAogCQllcnIgPSBzZWN1cml0eV9maWxlX3JlY2VpdmUoZnBbaV0pOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7Ci0JCWVyciA9IGdldF91bnVzZWRfZmQoKTsKKwkJZXJyID0gZ2V0X3VudXNlZF9mZF9mbGFncyhNU0dfQ01TR19DTE9FWEVDICYga21zZy0+bXNnX2ZsYWdzCisJCQkJCSAgPyBPX0NMT0VYRUMgOiAwKTsKIAkJaWYgKGVyciA8IDApCiAJCQlicmVhazsKIAkJbmV3X2ZkID0gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IGQxMjY0ZTkuLmRlMWIyNmEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTEyNCwxMyArMTI0LDYgQEAKIAlpZiAodGVzdF9iaXQoX19MSU5LX1NUQVRFX1JYX1NDSEVELCAmbnAtPmRldi0+c3RhdGUpICYmCiAJICAgIG5waW5mby0+cG9sbF9vd25lciAhPSBzbXBfcHJvY2Vzc29yX2lkKCkgJiYKIAkgICAgc3Bpbl90cnlsb2NrKCZucGluZm8tPnBvbGxfbG9jaykpIHsKLQkJLyogV2hlbiBjYWxsaW5nIGRldi0+cG9sbCBmcm9tIHBvbGxfbmFwaSwgd2UgbWF5IGVuZCB1cCBpbgotCQkgKiBuZXRpZl9yeF9jb21wbGV0ZS4gSG93ZXZlciwgb25seSB0aGUgQ1BVIHRvIHdoaWNoIHRoZQotCQkgKiBkZXZpY2Ugd2FzIHF1ZXVlZCBpcyBhbGxvd2VkIHRvIHJlbW92ZSBpdCBmcm9tIHBvbGxfbGlzdC4KLQkJICogU2V0dGluZyBQT0xMX0xJU1RfRlJPWkVOIHRlbGxzIG5ldGlmX3J4X2NvbXBsZXRlCi0JCSAqIHRvIGxlYXZlIHRoZSBOQVBJIHN0YXRlIGFsb25lLgotCQkgKi8KLQkJc2V0X2JpdChfX0xJTktfU1RBVEVfUE9MTF9MSVNUX0ZST1pFTiwgJm5wLT5kZXYtPnN0YXRlKTsKIAkJbnBpbmZvLT5yeF9mbGFncyB8PSBORVRQT0xMX1JYX0RST1A7CiAJCWF0b21pY19pbmMoJnRyYXBwZWQpOwogCkBAIC0xMzgsNyArMTMxLDYgQEAKIAogCQlhdG9taWNfZGVjKCZ0cmFwcGVkKTsKIAkJbnBpbmZvLT5yeF9mbGFncyAmPSB+TkVUUE9MTF9SWF9EUk9QOwotCQljbGVhcl9iaXQoX19MSU5LX1NUQVRFX1BPTExfTElTVF9GUk9aRU4sICZucC0+ZGV2LT5zdGF0ZSk7CiAJCXNwaW5fdW5sb2NrKCZucGluZm8tPnBvbGxfbG9jayk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcGt0Z2VuLmMgYi9uZXQvY29yZS9wa3RnZW4uYwppbmRleCA3NTIxNTMzLi5iY2E3ODdmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9wa3RnZW4uYworKysgYi9uZXQvY29yZS9wa3RnZW4uYwpAQCAtMzQ2NSw2ICszNDY1LDggQEAKIAogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CisKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlwa3RfZGV2ID0gbmV4dF90b19ydW4odCk7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NjbS5jIGIvbmV0L2NvcmUvc2NtLmMKaW5kZXggMjkyYWQ4ZC4uNDRjNGVjMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2NtLmMKKysrIGIvbmV0L2NvcmUvc2NtLmMKQEAgLTIyOCw3ICsyMjgsOCBAQAogCQllcnIgPSBzZWN1cml0eV9maWxlX3JlY2VpdmUoZnBbaV0pOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7Ci0JCWVyciA9IGdldF91bnVzZWRfZmQoKTsKKwkJZXJyID0gZ2V0X3VudXNlZF9mZF9mbGFncyhNU0dfQ01TR19DTE9FWEVDICYgbXNnLT5tc2dfZmxhZ3MKKwkJCQkJICA/IE9fQ0xPRVhFQyA6IDApOwogCQlpZiAoZXJyIDwgMCkKIAkJCWJyZWFrOwogCQluZXdfZmQgPSBlcnI7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYwppbmRleCBjYzgxMTBiLi5hZmI2YzY2IDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jCisrKyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMKQEAgLTI3MSw4ICsyNzEsMTEgQEAKIAkJCSAqLwogCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJBc3NvY2lhdGU6IFNjYW5uaW5nIGZvciBuZXR3b3JrcyBmaXJzdC5cbiIpOwogCQkJaWVlZTgwMjExc29mdG1hY19ub3RpZnkobWFjLT5kZXYsIElFRUU4MDIxMVNPRlRNQUNfRVZFTlRfU0NBTl9GSU5JU0hFRCwgaWVlZTgwMjExc29mdG1hY19hc3NvY19ub3RpZnlfc2NhbiwgTlVMTCk7Ci0JCQlpZiAoaWVlZTgwMjExc29mdG1hY19zdGFydF9zY2FuKG1hYykpCisJCQlpZiAoaWVlZTgwMjExc29mdG1hY19zdGFydF9zY2FuKG1hYykpIHsKIAkJCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFzc29jaWF0ZTogZmFpbGVkIHRvIGluaXRpYXRlIHNjYW4uIElzIGRldmljZSB1cD9cbiIpOworCQkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMDsKKwkJCQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkID0gMDsKKwkJCX0KIAkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewogCQkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMKaW5kZXggNDJmMTJiZC4uODlkY2M0OCAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jCkBAIC00NiwxMCArNDYsNiBAQAogI2luY2x1ZGUgIm5ldGxhYmVsX2NpcHNvX3Y0LmgiCiAjaW5jbHVkZSAibmV0bGFiZWxfdXNlci5oIgogCi0vKiBkbyBub3QgZG8gYW55IGF1ZGl0aW5nIGlmIGF1ZGl0X2VuYWJsZWQgPT0gMCwgc2VlIGtlcm5lbC9hdWRpdC5jIGZvcgotICogZGV0YWlscyAqLwotZXh0ZXJuIGludCBhdWRpdF9lbmFibGVkOwotCiAvKgogICogTmV0TGFiZWwgTkVUTElOSyBTZXR1cCBGdW5jdGlvbnMKICAqLwpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IGY0NTMwMTkuLmI3MTExNDIgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTE5MzksOSArMTkzOSw3IEBACiAJdG90YWxfbGVuID0gZXJyOwogCiAJY21zZ19wdHIgPSAodW5zaWduZWQgbG9uZyltc2dfc3lzLm1zZ19jb250cm9sOwotCW1zZ19zeXMubXNnX2ZsYWdzID0gMDsKLQlpZiAoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpCi0JCW1zZ19zeXMubXNnX2ZsYWdzID0gTVNHX0NNU0dfQ09NUEFUOworCW1zZ19zeXMubXNnX2ZsYWdzID0gZmxhZ3MgJiAoTVNHX0NNU0dfQ0xPRVhFQ3xNU0dfQ01TR19DT01QQVQpOwogCiAJaWYgKHNvY2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQogCQlmbGFncyB8PSBNU0dfRE9OVFdBSVQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGguYyBiL25ldC9zdW5ycGMvYXV0aC5jCmluZGV4IGFhNTVkMGEuLjI5YThlY2MgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aC5jCkBAIC01NDMsMTcgKzU0MywxOCBAQAogCQl0ZXN0X2JpdChSUENBVVRIX0NSRURfVVBUT0RBVEUsICZjcmVkLT5jcl9mbGFncykgIT0gMDsKIH0KIAotCi1zdGF0aWMgc3RydWN0IHNocmlua2VyICpycGNfY3JlZF9zaHJpbmtlcjsKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgcnBjX2NyZWRfc2hyaW5rZXIgPSB7CisJLnNocmluayA9IHJwY2F1dGhfY2FjaGVfc2hyaW5rZXIsCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CiAKIHZvaWQgX19pbml0IHJwY2F1dGhfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlycGNfaW5pdF9hdXRodW5peCgpOwotCXJwY19jcmVkX3Nocmlua2VyID0gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHJwY2F1dGhfY2FjaGVfc2hyaW5rZXIpOworCXJlZ2lzdGVyX3Nocmlua2VyKCZycGNfY3JlZF9zaHJpbmtlcik7CiB9CiAKIHZvaWQgX19leGl0IHJwY2F1dGhfcmVtb3ZlX21vZHVsZSh2b2lkKQogewotCWlmIChycGNfY3JlZF9zaHJpbmtlciAhPSBOVUxMKQotCQlyZW1vdmVfc2hyaW5rZXIocnBjX2NyZWRfc2hyaW5rZXIpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJnJwY19jcmVkX3Nocmlua2VyKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwppbmRleCBiYWY0MDk2ZC4uYWJmZGEzMyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aC5oPgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwppbmRleCA3MWI5ZGFlLi45ODQzZWFjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwpAQCAtMjMxLDYgKzIzMSw3IEBACiBzdGF0aWMgc3RydWN0IGdzc19hcGlfbWVjaCBnc3Nfa2VyYmVyb3NfbWVjaCA9IHsKIAkuZ21fbmFtZQk9ICJrcmI1IiwKIAkuZ21fb3duZXIJPSBUSElTX01PRFVMRSwKKwkuZ21fb2lkCQk9IHs5LCAodm9pZCAqKSJceDJhXHg4Nlx4NDhceDg2XHhmN1x4MTJceDAxXHgwMlx4MDIifSwKIAkuZ21fb3BzCQk9ICZnc3Nfa2VyYmVyb3Nfb3BzLAogCS5nbV9wZl9udW0JPSBBUlJBWV9TSVpFKGdzc19rZXJiZXJvc19wZnMpLAogCS5nbV9wZnMJCT0gZ3NzX2tlcmJlcm9zX3BmcywKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jCmluZGV4IDI2ODcyNTEuLjYxODAxYTAgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYwpAQCAtMTk0LDYgKzE5NCwyMCBAQAogRVhQT1JUX1NZTUJPTChnc3NfbWVjaF9nZXRfYnlfcHNldWRvZmxhdm9yKTsKIAogdTMyCitnc3Nfc3ZjX3RvX3BzZXVkb2ZsYXZvcihzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSwgdTMyIHNlcnZpY2UpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ20tPmdtX3BmX251bTsgaSsrKSB7CisJCWlmIChnbS0+Z21fcGZzW2ldLnNlcnZpY2UgPT0gc2VydmljZSkgeworCQkJcmV0dXJuIGdtLT5nbV9wZnNbaV0ucHNldWRvZmxhdm9yOworCQl9CisJfQorCXJldHVybiBSUENfQVVUSF9NQVhGTEFWT1I7IC8qIGlsbGVnYWwgdmFsdWUgKi8KK30KK0VYUE9SVF9TWU1CT0woZ3NzX3N2Y190b19wc2V1ZG9mbGF2b3IpOworCit1MzIKIGdzc19wc2V1ZG9mbGF2b3JfdG9fc2VydmljZShzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSwgdTMyIHBzZXVkb2ZsYXZvcikKIHsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYwppbmRleCA1NzdkNTkwLi41ZGViNGI2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCkBAIC0yMTcsNiArMjE3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZ3NzX2FwaV9tZWNoIGdzc19zcGttM19tZWNoID0gewogCS5nbV9uYW1lCT0gInNwa20zIiwKIAkuZ21fb3duZXIJPSBUSElTX01PRFVMRSwKKwkuZ21fb2lkCQk9IHs3LCAiXDA1M1wwMDZcMDAxXDAwNVwwMDVcMDAxXDAwMyJ9LAogCS5nbV9vcHMJCT0gJmdzc19zcGttM19vcHMsCiAJLmdtX3BmX251bQk9IEFSUkFZX1NJWkUoZ3NzX3Nwa20zX3BmcyksCiAJLmdtX3BmcwkJPSBnc3Nfc3BrbTNfcGZzLApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCmluZGV4IGMwOTQ1ODMuLjQ5MDY5NzUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKQEAgLTc0Myw2ICs3NDMsMTUgQEAKIAogc3RhdGljIHN0cnVjdCBhdXRoX29wcyBzdmNhdXRob3BzX2dzczsKIAordTMyIHN2Y2F1dGhfZ3NzX2ZsYXZvcihzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSkKK3sKKwlzdHJ1Y3QgZ3NzX2RvbWFpbiAqZ2QgPSBjb250YWluZXJfb2YoZG9tLCBzdHJ1Y3QgZ3NzX2RvbWFpbiwgaCk7CisKKwlyZXR1cm4gZ2QtPnBzZXVkb2ZsYXZvcjsKK30KKworRVhQT1JUX1NZTUJPTChzdmNhdXRoX2dzc19mbGF2b3IpOworCiBpbnQKIHN2Y2F1dGhfZ3NzX3JlZ2lzdGVyX3BzZXVkb2ZsYXZvcih1MzIgcHNldWRvZmxhdm9yLCBjaGFyICogbmFtZSkKIHsKQEAgLTkxMywxMCArOTIyLDIzIEBACiAJc3RydWN0IGdzc19zdmNfZGF0YSAqc3ZjZGF0YSA9IHJxc3RwLT5ycV9hdXRoX2RhdGE7CiAJc3RydWN0IHJzYyAqcnNjaSA9IHN2Y2RhdGEtPnJzY2k7CiAJc3RydWN0IHJwY19nc3Nfd2lyZV9jcmVkICpnYyA9ICZzdmNkYXRhLT5jbGNyZWQ7CisJaW50IHN0YXQ7CiAKLQlycXN0cC0+cnFfY2xpZW50ID0gZmluZF9nc3NfYXV0aF9kb21haW4ocnNjaS0+bWVjaGN0eCwgZ2MtPmdjX3N2Yyk7Ci0JaWYgKHJxc3RwLT5ycV9jbGllbnQgPT0gTlVMTCkKKwkvKgorCSAqIEEgZ3NzIGV4cG9ydCBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBieToKKwkgKiAJZXhwb3J0CSooc2VjPWtyYjUscncpCisJICogb3IgYnkKKwkgKiAJZXhwb3J0IGdzcy9rcmI1KHJ3KQorCSAqIFRoZSBsYXR0ZXIgaXMgZGVwcmVjYXRlZDsgYnV0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zCisJICogdGhlIG5mc2QgY29kZSB3aWxsIHN0aWxsIGZhbGwgYmFjayBvbiB0cnlpbmcgaXQgaWYgdGhlIGZvcm1lcgorCSAqIGRvZXNuJ3Qgd29yazsgc28gd2UgdHJ5IHRvIG1ha2UgYm90aCBhdmFpbGFibGUgdG8gbmZzZCwgYmVsb3cuCisJICovCisJcnFzdHAtPnJxX2dzc2NsaWVudCA9IGZpbmRfZ3NzX2F1dGhfZG9tYWluKHJzY2ktPm1lY2hjdHgsIGdjLT5nY19zdmMpOworCWlmIChycXN0cC0+cnFfZ3NzY2xpZW50ID09IE5VTEwpCiAJCXJldHVybiBTVkNfREVOSUVEOworCXN0YXQgPSBzdmNhdXRoX3VuaXhfc2V0X2NsaWVudChycXN0cCk7CisJaWYgKHN0YXQgPT0gU1ZDX0RST1ApCisJCXJldHVybiBzdGF0OwogCXJldHVybiBTVkNfT0s7CiB9CiAKQEAgLTEwODgsNyArMTExMCw2IEBACiAJCQlzdmNfcHV0bmwocmVzdiwgR1NTX1NFUV9XSU4pOwogCQkJaWYgKHN2Y19zYWZlX3B1dG5ldG9iaihyZXN2LCAmcnNpcC0+b3V0X3Rva2VuKSkKIAkJCQlnb3RvIGRyb3A7Ci0JCQlycXN0cC0+cnFfY2xpZW50ID0gTlVMTDsKIAkJfQogCQlnb3RvIGNvbXBsZXRlOwogCWNhc2UgUlBDX0dTU19QUk9DX0RFU1RST1k6CkBAIC0xMTMxLDYgKzExNTIsOCBAQAogCQl9CiAJCXN2Y2RhdGEtPnJzY2kgPSByc2NpOwogCQljYWNoZV9nZXQoJnJzY2ktPmgpOworCQlycXN0cC0+cnFfZmxhdm9yID0gZ3NzX3N2Y190b19wc2V1ZG9mbGF2b3IoCisJCQkJCXJzY2ktPm1lY2hjdHgtPm1lY2hfdHlwZSwgZ2MtPmdjX3N2Yyk7CiAJCXJldCA9IFNWQ19PSzsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTMxNyw2ICsxMzQwLDkgQEAKIAlpZiAocnFzdHAtPnJxX2NsaWVudCkKIAkJYXV0aF9kb21haW5fcHV0KHJxc3RwLT5ycV9jbGllbnQpOwogCXJxc3RwLT5ycV9jbGllbnQgPSBOVUxMOworCWlmIChycXN0cC0+cnFfZ3NzY2xpZW50KQorCQlhdXRoX2RvbWFpbl9wdXQocnFzdHAtPnJxX2dzc2NsaWVudCk7CisJcnFzdHAtPnJxX2dzc2NsaWVudCA9IE5VTEw7CiAJaWYgKHJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8pCiAJCXB1dF9ncm91cF9pbmZvKHJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8pOwogCXJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKaW5kZXggMDdkY2QyMC4uNDExNDc5NCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoLmg+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==