ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL2FuY2hvcnMudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvYW5jaG9ycy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwNGJjZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdXNiL2FuY2hvcnMudHh0CkBAIC0wLDAgKzEsNTAgQEAKK1doYXQgaXMgYW5jaG9yPworPT09PT09PT09PT09PT09CisKK0EgVVNCIGRyaXZlciBuZWVkcyB0byBzdXBwb3J0IHNvbWUgY2FsbGJhY2tzIHJlcXVpcmluZworYSBkcml2ZXIgdG8gY2Vhc2UgYWxsIElPIHRvIGFuIGludGVyZmFjZS4gVG8gZG8gc28sIGEKK2RyaXZlciBoYXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgVVJCcyBpdCBoYXMgc3VibWl0dGVkCit0byBrbm93IHRoZXkndmUgYWxsIGNvbXBsZXRlZCBvciB0byBjYWxsIHVzYl9raWxsX3VyYgorZm9yIHRoZW0uIFRoZSBhbmNob3IgaXMgYSBkYXRhIHN0cnVjdHVyZSB0YWtlcyBjYXJlIG9mCitrZWVwaW5nIHRyYWNrIG9mIFVSQnMgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gZGVhbCB3aXRoCittdWx0aXBsZSBVUkJzLgorCitBbGxvY2F0aW9uIGFuZCBJbml0aWFsaXNhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUncyBubyBBUEkgdG8gYWxsb2NhdGUgYW4gYW5jaG9yLiBJdCBpcyBzaW1wbHkgZGVjbGFyZWQKK2FzIHN0cnVjdCB1c2JfYW5jaG9yLiBpbml0X3VzYl9hbmNob3IoKSBtdXN0IGJlIGNhbGxlZCB0bworaW5pdGlhbGlzZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuCisKK0RlYWxsb2NhdGlvbgorPT09PT09PT09PT09CisKK09uY2UgaXQgaGFzIG5vIG1vcmUgVVJCcyBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZSBhbmNob3IgY2FuIGJlCitmcmVlZCB3aXRoIG5vcm1hbCBtZW1vcnkgbWFuYWdlbWVudCBvcGVyYXRpb25zLgorCitBc3NvY2lhdGlvbiBhbmQgZGlzYXNzb2NpYXRpb24gb2YgVVJCcyB3aXRoIGFuY2hvcnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBbiBhc3NvY2lhdGlvbiBvZiBVUkJzIHRvIGFuIGFuY2hvciBpcyBtYWRlIGJ5IGFuIGV4cGxpY2l0CitjYWxsIHRvIHVzYl9hbmNob3JfdXJiKCkuIFRoZSBhc3NvY2lhdGlvbiBpcyBtYWludGFpbmVkIHVudGlsCithbiBVUkIgaXMgZmluaXNoZWQgYnkgKHN1Y2Nlc3NmdWxsKSBjb21wbGV0aW9uLiBUaHVzIGRpc2Fzc29jaWF0aW9uCitpcyBhdXRvbWF0aWMuIEEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gZm9yY2libHkgZmluaXNoIChraWxsKQorYWxsIFVSQnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFuY2hvci4KK0Z1cnRoZXJtb3JlLCBkaXNhc3NvY2lhdGlvbiBjYW4gYmUgbWFkZSB3aXRoIHVzYl91bmFuY2hvcl91cmIoKQorCitPcGVyYXRpb25zIG9uIG11bHRpdHVkZXMgb2YgVVJCcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordXNiX2tpbGxfYW5jaG9yZWRfdXJicygpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBmdW5jdGlvbiBraWxscyBhbGwgVVJCcyBhc3NvY2lhdGVkIHdpdGggYW4gYW5jaG9yLiBUaGUgVVJCcworYXJlIGNhbGxlZCBpbiB0aGUgcmV2ZXJzZSB0ZW1wb3JhbCBvcmRlciB0aGV5IHdlcmUgc3VibWl0dGVkLgorVGhpcyB3YXkgbm8gZGF0YSBjYW4gYmUgcmVvcmRlcmVkLgorCit1c2Jfd2FpdF9hbmNob3JfZW1wdHlfdGltZW91dCgpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIGFsbCBVUkJzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbmNob3IgdG8gZmluaXNoCitvciBhIHRpbWVvdXQsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4gSXRzIHJldHVybiB2YWx1ZSB3aWxsIHRlbGwgeW91Cit3aGV0aGVyIHRoZSB0aW1lb3V0IHdhcyByZWFjaGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvY2FsbGJhY2tzLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL2NhbGxiYWNrcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4MTI0MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdXNiL2NhbGxiYWNrcy50eHQKQEAgLTAsMCArMSwxMzIgQEAKK1doYXQgY2FsbGJhY2tzIHdpbGwgdXNiY29yZSBkbz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVXNiY29yZSB3aWxsIGNhbGwgaW50byBhIGRyaXZlciB0aHJvdWdoIGNhbGxiYWNrcyBkZWZpbmVkIGluIHRoZSBkcml2ZXIKK3N0cnVjdHVyZSBhbmQgdGhyb3VnaCB0aGUgY29tcGxldGlvbiBoYW5kbGVyIG9mIFVSQnMgYSBkcml2ZXIgc3VibWl0cy4KK09ubHkgdGhlIGZvcm1lciBhcmUgaW4gdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuIFRoZXNlIHR3byBraW5kcyBvZgorY2FsbGJhY2tzIGFyZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuIEluZm9ybWF0aW9uIG9uIHRoZQorY29tcGxldGlvbiBjYWxsYmFjayBjYW4gYmUgZm91bmQgaW4gRG9jdW1lbnRhdGlvbi91c2IvVVJCLnR4dC4KKworVGhlIGNhbGxiYWNrcyBkZWZpbmVkIGluIHRoZSBkcml2ZXIgc3RydWN0dXJlIGFyZToKKworMS4gSG90cGx1Z2dpbmcgY2FsbGJhY2tzOgorCisgKiBAcHJvYmU6IENhbGxlZCB0byBzZWUgaWYgdGhlIGRyaXZlciBpcyB3aWxsaW5nIHRvIG1hbmFnZSBhIHBhcnRpY3VsYXIKKyAqCWludGVyZmFjZSBvbiBhIGRldmljZS4KKyAqIEBkaXNjb25uZWN0OiBDYWxsZWQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciBhY2Nlc3NpYmxlLCB1c3VhbGx5CisgKgliZWNhdXNlIGl0cyBkZXZpY2UgaGFzIGJlZW4gKG9yIGlzIGJlaW5nKSBkaXNjb25uZWN0ZWQgb3IgdGhlCisgKglkcml2ZXIgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLgorCisyLiBPZGQgYmFja2Rvb3IgdGhyb3VnaCB1c2JmczoKKworICogQGlvY3RsOiBVc2VkIGZvciBkcml2ZXJzIHRoYXQgd2FudCB0byB0YWxrIHRvIHVzZXJzcGFjZSB0aHJvdWdoCisgKgl0aGUgInVzYmZzIiBmaWxlc3lzdGVtLiAgVGhpcyBsZXRzIGRldmljZXMgcHJvdmlkZSB3YXlzIHRvCisgKglleHBvc2UgaW5mb3JtYXRpb24gdG8gdXNlciBzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZXkKKyAqCWRvIChvciBkb24ndCkgc2hvdyB1cCBvdGhlcndpc2UgaW4gdGhlIGZpbGVzeXN0ZW0uCisKKzMuIFBvd2VyIG1hbmFnZW1lbnQgKFBNKSBjYWxsYmFja3M6CisKKyAqIEBzdXNwZW5kOiBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIGdvaW5nIHRvIGJlIHN1c3BlbmRlZC4KKyAqIEByZXN1bWU6IENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMgYmVpbmcgcmVzdW1lZC4KKyAqIEByZXNldF9yZXN1bWU6IENhbGxlZCB3aGVuIHRoZSBzdXNwZW5kZWQgZGV2aWNlIGhhcyBiZWVuIHJlc2V0IGluc3RlYWQKKyAqCW9mIGJlaW5nIHJlc3VtZWQuCisKKzQuIERldmljZSBsZXZlbCBvcGVyYXRpb25zOgorCisgKiBAcHJlX3Jlc2V0OiBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIGFib3V0IHRvIGJlIHJlc2V0LgorICogQHBvc3RfcmVzZXQ6IENhbGxlZCBhZnRlciB0aGUgZGV2aWNlIGhhcyBiZWVuIHJlc2V0CisKK1RoZSBpb2N0bCBpbnRlcmZhY2UgKDIpIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IGhhdmUgYSB2ZXJ5IGdvb2QKK3JlYXNvbi4gU3lzZnMgaXMgcHJlZmVycmVkIHRoZXNlIGRheXMuIFRoZSBQTSBjYWxsYmFja3MgYXJlIGNvdmVyZWQKK3NlcGFyYXRlbHkgaW4gRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQuCisKK0NhbGxpbmcgY29udmVudGlvbnMKKz09PT09PT09PT09PT09PT09PT0KKworQWxsIGNhbGxiYWNrcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBUaGVyZSdzIG5vIG5lZWQgZm9yIGxvY2tpbmcKK2FnYWluc3Qgb3RoZXIgVVNCIGNhbGxiYWNrcy4gQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGZyb20gYSB0YXNrCitjb250ZXh0LiBZb3UgbWF5IHNsZWVwLiBIb3dldmVyLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCBhbGwgc2xlZXBzIGhhdmUgYQorc21hbGwgZml4ZWQgdXBwZXIgbGltaXQgaW4gdGltZS4gSW4gcGFydGljdWxhciB5b3UgbXVzdCBub3QgY2FsbCBvdXQgdG8KK3VzZXIgc3BhY2UgYW5kIGF3YWl0IHJlc3VsdHMuCisKK0hvdHBsdWdnaW5nIGNhbGxiYWNrcworPT09PT09PT09PT09PT09PT09PT09CisKK1RoZXNlIGNhbGxiYWNrcyBhcmUgaW50ZW5kZWQgdG8gYXNzb2NpYXRlIGFuZCBkaXNhc3NvY2lhdGUgYSBkcml2ZXIgd2l0aAorYW4gaW50ZXJmYWNlLiBBIGRyaXZlcidzIGJvbmQgdG8gYW4gaW50ZXJmYWNlIGlzIGV4Y2x1c2l2ZS4KKworVGhlIHByb2JlKCkgY2FsbGJhY2sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCAoKnByb2JlKSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CisKK0FjY2VwdCBvciBkZWNsaW5lIGFuIGludGVyZmFjZS4gSWYgeW91IGFjY2VwdCB0aGUgZGV2aWNlIHJldHVybiAwLAorb3RoZXJ3aXNlIC1FTk9ERVYgb3IgLUVOWElPLiBPdGhlciBlcnJvciBjb2RlcyBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIGEKK2dlbnVpbmUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uIHdoaWNoIHByZXZlbnRlZCBhIGRyaXZlcgorZnJvbSBhY2NlcHRpbmcgYSBkZXZpY2UgdGhhdCB3b3VsZCBlbHNlIGhhdmUgYmVlbiBhY2NlcHRlZC4KK1lvdSBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1c2UgdXNiY29yZSdzZmFjaWxpdHksCit1c2Jfc2V0X2ludGZkYXRhKCksIHRvIGFzc29jaWF0ZSBhIGRhdGEgc3RydWN0dXJlIHdpdGggYW4gaW50ZXJmYWNlLCBzbwordGhhdCB5b3Uga25vdyB3aGljaCBpbnRlcm5hbCBzdGF0ZSBhbmQgaWRlbnRpdHkgeW91IGFzc29jaWF0ZSB3aXRoIGEKK3BhcnRpY3VsYXIgaW50ZXJmYWNlLiBUaGUgZGV2aWNlIHdpbGwgbm90IGJlIHN1c3BlbmRlZCBhbmQgeW91IG1heSBkbyBJTwordG8gdGhlIGludGVyZmFjZSB5b3UgYXJlIGNhbGxlZCBmb3IgYW5kIGVuZHBvaW50IDAgb2YgdGhlIGRldmljZS4gRGV2aWNlCitpbml0aWFsaXNhdGlvbiB0aGF0IGRvZXNuJ3QgdGFrZSB0b28gbG9uZyBpcyBhIGdvb2QgaWRlYSBoZXJlLgorCitUaGUgZGlzY29ubmVjdCgpIGNhbGxiYWNrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgKCpkaXNjb25uZWN0KSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCitUaGlzIGNhbGxiYWNrIGlzIGEgc2lnbmFsIHRvIGJyZWFrIGFueSBjb25uZWN0aW9uIHdpdGggYW4gaW50ZXJmYWNlLgorWW91IGFyZSBub3QgYWxsb3dlZCBhbnkgSU8gdG8gYSBkZXZpY2UgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhpcworY2FsbGJhY2suIFlvdSBhbHNvIG1heSBub3QgZG8gYW55IG90aGVyIG9wZXJhdGlvbiB0aGF0IG1heSBpbnRlcmZlcmUKK3dpdGggYW5vdGhlciBkcml2ZXIgYm91bmQgdGhlIGludGVyZmFjZSwgZWcuIGEgcG93ZXIgbWFuYWdlbWVudAorb3BlcmF0aW9uLgorSWYgeW91IGFyZSBjYWxsZWQgZHVlIHRvIGEgcGh5c2ljYWwgZGlzY29ubmVjdGlvbiwgYWxsIHlvdXIgVVJCcyB3aWxsIGJlCitraWxsZWQgYnkgdXNiY29yZS4gTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBkaXNjb25uZWN0IHdpbGwgYmUgY2FsbGVkIHNvbWUKK3RpbWUgYWZ0ZXIgdGhlIHBoeXNpY2FsIGRpc2Nvbm5lY3Rpb24uIFRodXMgeW91ciBkcml2ZXIgbXVzdCBiZSBwcmVwYXJlZAordG8gZGVhbCB3aXRoIGZhaWxpbmcgSU8gZXZlbiBwcmlvciB0byB0aGUgY2FsbGJhY2suCisKK0RldmljZSBsZXZlbCBjYWxsYmFja3MKKz09PT09PT09PT09PT09PT09PT09PT0KKworcHJlX3Jlc2V0CistLS0tLS0tLS0KKworaW50ICgqcHJlX3Jlc2V0KShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKK0Fub3RoZXIgZHJpdmVyIG9yIHVzZXIgc3BhY2UgaXMgdHJpZ2dlcmluZyBhIHJlc2V0IG9uIHRoZSBkZXZpY2Ugd2hpY2gKK2NvbnRhaW5zIHRoZSBpbnRlcmZhY2UgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LiBDZWFzZSBJTyBhbmQgc2F2ZSBhbnkKK2RldmljZSBzdGF0ZSB5b3UgbmVlZCB0byByZXN0b3JlLgorCitJZiB5b3UgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkgaGVyZSwgdXNlIEdGUF9OT0lPIG9yIEdGUF9BVE9NSUMsIGlmIHlvdQorYXJlIGluIGF0b21pYyBjb250ZXh0LgorCitwb3N0X3Jlc2V0CistLS0tLS0tLS0tCisKK2ludCAoKnBvc3RfcmVzZXQpKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKworVGhlIHJlc2V0IGhhcyBjb21wbGV0ZWQuICBSZXN0b3JlIGFueSBzYXZlZCBkZXZpY2Ugc3RhdGUgYW5kIGJlZ2luCit1c2luZyB0aGUgZGV2aWNlIGFnYWluLgorCitJZiB5b3UgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkgaGVyZSwgdXNlIEdGUF9OT0lPIG9yIEdGUF9BVE9NSUMsIGlmIHlvdQorYXJlIGluIGF0b21pYyBjb250ZXh0LgorCitDYWxsIHNlcXVlbmNlcworPT09PT09PT09PT09PT0KKworTm8gY2FsbGJhY2tzIG90aGVyIHRoYW4gcHJvYmUgd2lsbCBiZSBpbnZva2VkIGZvciBhbiBpbnRlcmZhY2UKK3RoYXQgaXNuJ3QgYm91bmQgdG8geW91ciBkcml2ZXIuCisKK1Byb2JlIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIGZvciBhbiBpbnRlcmZhY2UgYm91bmQgdG8gYSBkcml2ZXIuCitIZW5jZSBmb2xsb3dpbmcgYSBzdWNjZXNzZnVsIHByb2JlLCBkaXNjb25uZWN0IHdpbGwgYmUgY2FsbGVkCitiZWZvcmUgdGhlcmUgaXMgYW5vdGhlciBwcm9iZSBmb3IgdGhlIHNhbWUgaW50ZXJmYWNlLgorCitPbmNlIHlvdXIgZHJpdmVyIGlzIGJvdW5kIHRvIGFuIGludGVyZmFjZSwgZGlzY29ubmVjdCBjYW4gYmUKK2NhbGxlZCBhdCBhbnkgdGltZSBleGNlcHQgaW4gYmV0d2VlbiBwcmVfcmVzZXQgYW5kIHBvc3RfcmVzZXQuCitwcmVfcmVzZXQgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IHBvc3RfcmVzZXQsIGV2ZW4gaWYgdGhlIHJlc2V0CitmYWlsZWQgb3IgdGhlIGRldmljZSBoYXMgYmVlbiB1bnBsdWdnZWQuCisKK3N1c3BlbmQgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IG9uZSBvZjogcmVzdW1lLCByZXNldF9yZXN1bWUsIG9yCitkaXNjb25uZWN0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvcGVyc2lzdC50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9wZXJzaXN0LnR4dAppbmRleCBkZjU0ZDY0Li5kNTZjYjFhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9wZXJzaXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9wZXJzaXN0LnR4dApAQCAtMiw3ICsyLDcgQEAKIAogCQkgICBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgogCi0JCSBTZXB0ZW1iZXIgMiwgMjAwNiAoVXBkYXRlZCBNYXkgMjksIDIwMDcpCisJCVNlcHRlbWJlciAyLCAyMDA2IChVcGRhdGVkIEZlYnJ1YXJ5IDI1LCAyMDA4KQogCiAKIAlXaGF0IGlzIHRoZSBwcm9ibGVtPwpAQCAtNjUsOSArNjUsMTAgQEAKIAogCVdoYXQgaXMgdGhlIHNvbHV0aW9uPwogCi1TZXR0aW5nIENPTkZJR19VU0JfUEVSU0lTVCB3aWxsIGNhdXNlIHRoZSBrZXJuZWwgdG8gd29yayBhcm91bmQgdGhlc2UKLWlzc3Vlcy4gIEl0IGVuYWJsZXMgYSBtb2RlIGluIHdoaWNoIHRoZSBjb3JlIFVTQiBkZXZpY2UgZGF0YQotc3RydWN0dXJlcyBhcmUgYWxsb3dlZCB0byBwZXJzaXN0IGFjcm9zcyBhIHBvd2VyLXNlc3Npb24gZGlzcnVwdGlvbi4KK1RoZSBrZXJuZWwgaW5jbHVkZXMgYSBmZWF0dXJlIGNhbGxlZCBVU0ItcGVyc2lzdC4gIEl0IHRyaWVzIHRvIHdvcmsKK2Fyb3VuZCB0aGVzZSBpc3N1ZXMgYnkgYWxsb3dpbmcgdGhlIGNvcmUgVVNCIGRldmljZSBkYXRhIHN0cnVjdHVyZXMgdG8KK3BlcnNpc3QgYWNyb3NzIGEgcG93ZXItc2Vzc2lvbiBkaXNydXB0aW9uLgorCiBJdCB3b3JrcyBsaWtlIHRoaXMuICBJZiB0aGUga2VybmVsIHNlZXMgdGhhdCBhIFVTQiBob3N0IGNvbnRyb2xsZXIgaXMKIG5vdCBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUgZHVyaW5nIHJlc3VtZSAoaS5lLiwgaWYgdGhlIGNvbnRyb2xsZXIgd2FzCiByZXNldCBvciBvdGhlcndpc2UgaGFkIGxvc3QgcG93ZXIpIHRoZW4gaXQgYXBwbGllcyBhIHBlcnNpc3RlbmNlIGNoZWNrCkBAIC04MCwyOCArODEsMzAgQEAKIHNhbWUgZGVzY3JpcHRvcnMgYXMgYmVmb3JlLCBpbmNsdWRpbmcgdGhlIFZlbmRvciBhbmQgUHJvZHVjdCBJRHMsIHRoZW4KIHRoZSBrZXJuZWwgY29udGludWVzIHRvIHVzZSB0aGUgc2FtZSBkZXZpY2Ugc3RydWN0dXJlLiAgSW4gZWZmZWN0LCB0aGUKIGtlcm5lbCB0cmVhdHMgdGhlIGRldmljZSBhcyB0aG91Z2ggaXQgaGFkIG1lcmVseSBiZWVuIHJlc2V0IGluc3RlYWQgb2YKLXVucGx1Z2dlZC4KK3VucGx1Z2dlZC4gIFRoZSBzYW1lIHRoaW5nIGhhcHBlbnMgaWYgdGhlIGhvc3QgY29udHJvbGxlciBpcyBpbiB0aGUKK2V4cGVjdGVkIHN0YXRlIGJ1dCBhIFVTQiBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBhbmQgdGhlbiByZXBsdWdnZWQuCiAKIElmIG5vIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gdGhlIHBvcnQsIG9yIGlmIHRoZSBkZXNjcmlwdG9ycyBhcmUKIGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlIGtlcm5lbCByZW1lbWJlcnMsIHRoZW4gdGhlIHRyZWF0bWVudCBpcyB3aGF0CiB5b3Ugd291bGQgZXhwZWN0LiAgVGhlIGtlcm5lbCBkZXN0cm95cyB0aGUgb2xkIGRldmljZSBzdHJ1Y3R1cmUgYW5kCiBiZWhhdmVzIGFzIHRob3VnaCB0aGUgb2xkIGRldmljZSBoYWQgYmVlbiB1bnBsdWdnZWQgYW5kIGEgbmV3IGRldmljZQotcGx1Z2dlZCBpbiwganVzdCBhcyBpdCB3b3VsZCB3aXRob3V0IHRoZSBDT05GSUdfVVNCX1BFUlNJU1Qgb3B0aW9uLgorcGx1Z2dlZCBpbi4KIAogVGhlIGVuZCByZXN1bHQgaXMgdGhhdCB0aGUgVVNCIGRldmljZSByZW1haW5zIGF2YWlsYWJsZSBhbmQgdXNhYmxlLgogRmlsZXN5c3RlbSBtb3VudHMgYW5kIG1lbW9yeSBtYXBwaW5ncyBhcmUgdW5hZmZlY3RlZCwgYW5kIHRoZSB3b3JsZCBpcwogbm93IGEgZ29vZCBhbmQgaGFwcHkgcGxhY2UuCiAKLU5vdGUgdGhhdCBldmVuIHdoZW4gQ09ORklHX1VTQl9QRVJTSVNUIGlzIHNldCwgdGhlICJwZXJzaXN0IiBmZWF0dXJlCi13aWxsIGJlIGFwcGxpZWQgb25seSB0byB0aG9zZSBkZXZpY2VzIGZvciB3aGljaCBpdCBpcyBlbmFibGVkLiAgWW91Ci1jYW4gZW5hYmxlIHRoZSBmZWF0dXJlIGJ5IGRvaW5nIChhcyByb290KToKK05vdGUgdGhhdCB0aGUgIlVTQi1wZXJzaXN0IiBmZWF0dXJlIHdpbGwgYmUgYXBwbGllZCBvbmx5IHRvIHRob3NlCitkZXZpY2VzIGZvciB3aGljaCBpdCBpcyBlbmFibGVkLiAgWW91IGNhbiBlbmFibGUgdGhlIGZlYXR1cmUgYnkgZG9pbmcKKyhhcyByb290KToKIAogCWVjaG8gMSA+L3N5cy9idXMvdXNiL2RldmljZXMvLi4uL3Bvd2VyL3BlcnNpc3QKIAogd2hlcmUgdGhlICIuLi4iIHNob3VsZCBiZSBmaWxsZWQgaW4gdGhlIHdpdGggdGhlIGRldmljZSdzIElELiAgRGlzYWJsZQogdGhlIGZlYXR1cmUgYnkgd3JpdGluZyAwIGluc3RlYWQgb2YgMS4gIEZvciBodWJzIHRoZSBmZWF0dXJlIGlzCi1hdXRvbWF0aWNhbGx5IGFuZCBwZXJtYW5lbnRseSBlbmFibGVkLCBzbyB5b3Ugb25seSBoYXZlIHRvIHdvcnJ5IGFib3V0Ci1zZXR0aW5nIGl0IGZvciBkZXZpY2VzIHdoZXJlIGl0IHJlYWxseSBtYXR0ZXJzLgorYXV0b21hdGljYWxseSBhbmQgcGVybWFuZW50bHkgZW5hYmxlZCBhbmQgdGhlIHBvd2VyL3BlcnNpc3QgZmlsZQorZG9lc24ndCBldmVuIGV4aXN0LCBzbyB5b3Ugb25seSBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgaXQgZm9yCitkZXZpY2VzIHdoZXJlIGl0IHJlYWxseSBtYXR0ZXJzLgogCiAKIAlJcyB0aGlzIHRoZSBiZXN0IHNvbHV0aW9uPwpAQCAtMTEyLDE5ICsxMTUsMTkgQEAKIHRvIHBsdWcgaW4gYSBVU0IgZmxhc2ggZGV2aWNlLCBjcmVhdGUgYSBwZXJzaXN0ZW50IHZvbHVtZSBhc3NvY2lhdGVkCiB3aXRoIGl0LCB1bnBsdWcgdGhlIGZsYXNoIGRldmljZSwgcGx1ZyBpdCBiYWNrIGluIGxhdGVyLCBhbmQgc3RpbGwKIGhhdmUgdGhlIHNhbWUgcGVyc2lzdGVudCB2b2x1bWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UuICBBcyBzdWNoCi1pdCB3b3VsZCBiZSBtb3JlIGZhci1yZWFjaGluZyB0aGFuIENPTkZJR19VU0JfUEVSU0lTVC4KK2l0IHdvdWxkIGJlIG1vcmUgZmFyLXJlYWNoaW5nIHRoYW4gVVNCLXBlcnNpc3QuCiAKIE9uIHRoZSBvdGhlciBoYW5kLCB3cml0aW5nIGEgcGVyc2lzdGVudCB2b2x1bWUgbWFuYWdlciB3b3VsZCBiZSBhIGJpZwogam9iIGFuZCB1c2luZyBpdCB3b3VsZCByZXF1aXJlIHNpZ25pZmljYW50IGlucHV0IGZyb20gdGhlIHVzZXIuICBUaGlzCiBzb2x1dGlvbiBpcyBtdWNoIHF1aWNrZXIgYW5kIGVhc2llciAtLSBhbmQgaXQgZXhpc3RzIG5vdywgYSBnaWFudAogcG9pbnQgaW4gaXRzIGZhdm9yIQogCi1GdXJ0aGVybW9yZSwgdGhlIFVTQl9QRVJTSVNUIG9wdGlvbiBhcHBsaWVzIHRvIF9hbGxfIFVTQiBkZXZpY2VzLCBub3QKK0Z1cnRoZXJtb3JlLCB0aGUgVVNCLXBlcnNpc3QgZmVhdHVyZSBhcHBsaWVzIHRvIF9hbGxfIFVTQiBkZXZpY2VzLCBub3QKIGp1c3QgbWFzcy1zdG9yYWdlIGRldmljZXMuICBJdCBtaWdodCB0dXJuIG91dCB0byBiZSBlcXVhbGx5IHVzZWZ1bCBmb3IKIG90aGVyIGRldmljZSB0eXBlcywgc3VjaCBhcyBuZXR3b3JrIGludGVyZmFjZXMuCiAKIAotCVdBUk5JTkc6IFVzaW5nIENPTkZJR19VU0JfUEVSU0lTVCBjYW4gYmUgZGFuZ2Vyb3VzISEKKwlXQVJOSU5HOiBVU0ItcGVyc2lzdCBjYW4gYmUgZGFuZ2Vyb3VzISEKIAogV2hlbiByZWNvdmVyaW5nIGFuIGludGVycnVwdGVkIHBvd2VyIHNlc3Npb24gdGhlIGtlcm5lbCBkb2VzIGl0cyBiZXN0CiB0byBtYWtlIHN1cmUgdGhlIFVTQiBkZXZpY2UgaGFzbid0IGJlZW4gY2hhbmdlZDsgdGhhdCBpcywgdGhlIHNhbWUKQEAgLTEzMywxMCArMTM2LDEwIEBACiAKIElmIHlvdSByZXBsYWNlIG9uZSBVU0IgZGV2aWNlIHdpdGggYW5vdGhlciBvZiB0aGUgc2FtZSB0eXBlIChzYW1lCiBtYW51ZmFjdHVyZXIsIHNhbWUgSURzLCBhbmQgc28gb24pIHRoZXJlJ3MgYW4gZXhjZWxsZW50IGNoYW5jZSB0aGUKLWtlcm5lbCB3b24ndCBkZXRlY3QgdGhlIGNoYW5nZS4gIFNlcmlhbCBudW1iZXJzIGFuZCBvdGhlciBzdHJpbmdzIGFyZQotbm90IGNvbXBhcmVkLiAgSW4gbWFueSBjYXNlcyBpdCB3b3VsZG4ndCBoZWxwIGlmIHRoZXkgd2VyZSwgYmVjYXVzZQotbWFudWZhY3R1cmVycyBmcmVxdWVudGx5IG9taXQgc2VyaWFsIG51bWJlcnMgZW50aXJlbHkgaW4gdGhlaXIKLWRldmljZXMuCitrZXJuZWwgd29uJ3QgZGV0ZWN0IHRoZSBjaGFuZ2UuICBUaGUgc2VyaWFsIG51bWJlciBzdHJpbmcgYW5kIG90aGVyCitkZXNjcmlwdG9ycyBhcmUgY29tcGFyZWQgd2l0aCB0aGUga2VybmVsJ3Mgc3RvcmVkIHZhbHVlcywgYnV0IHRoaXMKK21pZ2h0IG5vdCBoZWxwIHNpbmNlIG1hbnVmYWN0dXJlcnMgZnJlcXVlbnRseSBvbWl0IHNlcmlhbCBudW1iZXJzCitlbnRpcmVseSBpbiB0aGVpciBkZXZpY2VzLgogCiBGdXJ0aGVybW9yZSBpdCdzIHF1aXRlIHBvc3NpYmxlIHRvIGxlYXZlIGEgVVNCIGRldmljZSBleGFjdGx5IHRoZSBzYW1lCiB3aGlsZSBjaGFuZ2luZyBpdHMgbWVkaWEuICBJZiB5b3UgcmVwbGFjZSB0aGUgZmxhc2ggbWVtb3J5IGNhcmQgaW4gYQpAQCAtMTUyLDUgKzE1NSw1IEBACiBZT1UgSEFWRSBCRUVOIFdBUk5FRCEgIFVTRSBBVCBZT1VSIE9XTiBSSVNLIQogCiBUaGF0IGhhdmluZyBiZWVuIHNhaWQsIG1vc3Qgb2YgdGhlIHRpbWUgdGhlcmUgc2hvdWxkbid0IGJlIGFueSB0cm91YmxlCi1hdCBhbGwuICBUaGUgInBlcnNpc3QiIGZlYXR1cmUgY2FuIGJlIGV4dHJlbWVseSB1c2VmdWwuICBNYWtlIHRoZSBtb3N0Ci1vZiBpdC4KK2F0IGFsbC4gIFRoZSBVU0ItcGVyc2lzdCBmZWF0dXJlIGNhbiBiZSBleHRyZW1lbHkgdXNlZnVsLiAgTWFrZSB0aGUKK21vc3Qgb2YgaXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CmluZGV4IDhiMDc3ZTQuLmZmMmMxZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CkBAIC0xOTIsMTIgKzE5Miw5IEBACiAKIEZUREkgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlcgogCi0gIFRoaXMgaXMgYSBzaW5nbGUgcG9ydCBEQi0yNSBzZXJpYWwgYWRhcHRlci4gTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzCi0gIGRldmljZSBhbmQgdGhlIExpbnV4IGRyaXZlciBjYW4gYmUgZm91bmQgYXQ6Ci0JaHR0cDovL3JlYWxpdHkuc2dpLmNvbS9icnlkZXJfd2VsbGluZ3Rvbi9mdGRpX3Npby8KKyAgVGhpcyBpcyBhIHNpbmdsZSBwb3J0IERCLTI1IHNlcmlhbCBhZGFwdGVyLgogCi0gIEZvciBhbnkgcXVlc3Rpb25zIG9yIHByb2JsZW1zIHdpdGggdGhpcyBkcml2ZXIsIHBsZWFzZSBjb250YWN0IEJpbGwgUnlkZXIKLSAgYXQgYnJ5ZGVyQHNnaS5jb20KKyAgRm9yIGFueSBxdWVzdGlvbnMgb3IgcHJvYmxlbXMgd2l0aCB0aGlzIGRyaXZlciwgcGxlYXNlIGNvbnRhY3QgQmlsbCBSeWRlci4KIAogCiBaeVhFTCBvbW5pLm5ldCBsY2QgcGx1cyBJU0ROIFRBCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCmluZGV4IDUyZGRiMDQuLjRiMDdiZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCkBAIC00MDUsOSArNDA1LDExIEBACiBzdGF0aWMgdm9pZCB4cGFkX2lycV9pbihzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHVzYl94cGFkICp4cGFkID0gdXJiLT5jb250ZXh0OwotCWludCByZXR2YWw7CisJaW50IHJldHZhbCwgc3RhdHVzOwogCi0Jc3dpdGNoICh1cmItPnN0YXR1cykgeworCXN0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CiAJCS8qIHN1Y2Nlc3MgKi8KIAkJYnJlYWs7CkBAIC00MTYsMTEgKzQxOCwxMSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCi0JCQlfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC00NDUsOSArNDQ3LDExIEBACiAjaWYgZGVmaW5lZChDT05GSUdfSk9ZU1RJQ0tfWFBBRF9GRikgfHwgZGVmaW5lZChDT05GSUdfSk9ZU1RJQ0tfWFBBRF9MRURTKQogc3RhdGljIHZvaWQgeHBhZF9pcnFfb3V0KHN0cnVjdCB1cmIgKnVyYikKIHsKLQlpbnQgcmV0dmFsOworCWludCByZXR2YWwsIHN0YXR1czsKIAotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwlzdGF0dXMgPSB1cmItPnN0YXR1czsKKworCXN3aXRjaCAoc3RhdHVzKSB7CiAJCWNhc2UgMDoKIAkJLyogc3VjY2VzcyAqLwogCQlicmVhazsKQEAgLTQ1NiwxMSArNDYwLDExIEBACiAJCWNhc2UgLUVTSFVURE9XTjoKIAkJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiAJCQlyZXR1cm47CiAJCWRlZmF1bHQ6CiAJCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOwogCQkJZ290byBleGl0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCmluZGV4IGE1MWVlZWQuLmQ0NzBjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYworKysgYi9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKQEAgLTQ0NCw3ICs0NDQsNyBAQAogLyogdGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgYXJlIHN0b2xlbiBmcm9tIGRyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jICovCiBzdGF0aWMgdm9pZCBjeGFjcnVfYmxvY2tpbmdfY29tcGxldGlvbihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JY29tcGxldGUoKHN0cnVjdCBjb21wbGV0aW9uICopdXJiLT5jb250ZXh0KTsKKwljb21wbGV0ZSh1cmItPmNvbnRleHQpOwogfQogCiBzdGF0aWMgdm9pZCBjeGFjcnVfdGltZW91dF9raWxsKHVuc2lnbmVkIGxvbmcgZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCmluZGV4IGM1ZWMxYTUuLmFiYjdkNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwpAQCAtODMsNyArODMsNyBAQAogCQlpZiAoZGVidWcgPj0gMSkgXAogCQkJZGV2X2RiZygmKHVzYl9kZXYpLT5kZXYsIFwKIAkJCQkiW3VlYWdsZS1hdG0gZGJnXSAlczogIiBmb3JtYXQsIFwKLQkJCQkJX19GVU5DVElPTl9fLCAjI2FyZ3MpOyBcCisJCQkJCV9fZnVuY19fLCAjI2FyZ3MpOyBcCiAJfSB3aGlsZSAoMCkKIAogI2RlZmluZSB1ZWFfdmRiZyh1c2JfZGV2LCBmb3JtYXQsIGFyZ3MuLi4pCVwKQEAgLTk0LDEwICs5NCwxMCBAQAogCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgdWVhX2VudGVycyh1c2JfZGV2KSBcCi0JdWVhX3ZkYmcodXNiX2RldiwgImVudGVyaW5nICVzXG4iLCBfX0ZVTkNUSU9OX18pCisJdWVhX3ZkYmcodXNiX2RldiwgImVudGVyaW5nICVzXG4iLCBfX2Z1bmNfXykKIAogI2RlZmluZSB1ZWFfbGVhdmVzKHVzYl9kZXYpIFwKLQl1ZWFfdmRiZyh1c2JfZGV2LCAibGVhdmluZyAgJXNcbiIsIF9fRlVOQ1RJT05fXykKKwl1ZWFfdmRiZyh1c2JfZGV2LCAibGVhdmluZyAgJXNcbiIsIF9fZnVuY19fKQogCiAjZGVmaW5lIHVlYV9lcnIodXNiX2RldiwgZm9ybWF0LGFyZ3MuLi4pIFwKIAlkZXZfZXJyKCYodXNiX2RldiktPmRldiAsIltVRUFHTEUtQVRNXSAiIGZvcm1hdCAsICMjYXJncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwppbmRleCBlNzE3ZjViLi4wNzIyODcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC04MCw2ICs4MCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KIAogI2lmZGVmIFZFUkJPU0VfREVCVUcKIHN0YXRpYyBpbnQgdXNiYXRtX3ByaW50X3BhY2tldChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKQEAgLTEwMTQsMTAgKzEwMTUsNyBAQAogCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSBhcmc7CiAJaW50IHJldDsKIAotCWRhZW1vbml6ZShpbnN0YW5jZS0+ZHJpdmVyLT5kcml2ZXJfbmFtZSk7CiAJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCWluc3RhbmNlLT50aHJlYWRfcGlkID0gY3VycmVudC0+cGlkOwotCiAJY29tcGxldGUoJmluc3RhbmNlLT50aHJlYWRfc3RhcnRlZCk7CiAKIAlyZXQgPSBpbnN0YW5jZS0+ZHJpdmVyLT5oZWF2eV9pbml0KGluc3RhbmNlLCBpbnN0YW5jZS0+dXNiX2ludGYpOwpAQCAtMTAyNiw3ICsxMDI0LDcgQEAKIAkJcmV0ID0gdXNiYXRtX2F0bV9pbml0KGluc3RhbmNlKTsKIAogCW11dGV4X2xvY2soJmluc3RhbmNlLT5zZXJpYWxpemUpOwotCWluc3RhbmNlLT50aHJlYWRfcGlkID0gLTE7CisJaW5zdGFuY2UtPnRocmVhZCA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKIAogCWNvbXBsZXRlX2FuZF9leGl0KCZpbnN0YW5jZS0+dGhyZWFkX2V4aXRlZCwgcmV0KTsKQEAgLTEwMzQsMTMgKzEwMzIsMTggQEAKIAogc3RhdGljIGludCB1c2JhdG1faGVhdnlfaW5pdChzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlKQogewotCWludCByZXQgPSBrZXJuZWxfdGhyZWFkKHVzYmF0bV9kb19oZWF2eV9pbml0LCBpbnN0YW5jZSwgQ0xPTkVfRlMgfCBDTE9ORV9GSUxFUyk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCi0JaWYgKHJldCA8IDApIHsKLQkJdXNiX2VycihpbnN0YW5jZSwgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIGtlcm5lbF90aHJlYWQgKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OworCXQgPSBrdGhyZWFkX2NyZWF0ZSh1c2JhdG1fZG9faGVhdnlfaW5pdCwgaW5zdGFuY2UsCisJCQlpbnN0YW5jZS0+ZHJpdmVyLT5kcml2ZXJfbmFtZSk7CisJaWYgKElTX0VSUih0KSkgeworCQl1c2JfZXJyKGluc3RhbmNlLCAiJXM6IGZhaWxlZCB0byBjcmVhdGUga2VybmVsX3RocmVhZCAoJWxkKSFcbiIsCisJCQkJX19mdW5jX18sIFBUUl9FUlIodCkpOworCQlyZXR1cm4gUFRSX0VSUih0KTsKIAl9CiAKKwlpbnN0YW5jZS0+dGhyZWFkID0gdDsKKwl3YWtlX3VwX3Byb2Nlc3ModCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmaW5zdGFuY2UtPnRocmVhZF9zdGFydGVkKTsKIAogCXJldHVybiAwOwpAQCAtMTEyNCw3ICsxMTI3LDcgQEAKIAlrcmVmX2luaXQoJmluc3RhbmNlLT5yZWZjb3VudCk7CQkvKiBkcm9wcGVkIGluIHVzYmF0bV91c2JfZGlzY29ubmVjdCAqLwogCW11dGV4X2luaXQoJmluc3RhbmNlLT5zZXJpYWxpemUpOwogCi0JaW5zdGFuY2UtPnRocmVhZF9waWQgPSAtMTsKKwlpbnN0YW5jZS0+dGhyZWFkID0gTlVMTDsKIAlpbml0X2NvbXBsZXRpb24oJmluc3RhbmNlLT50aHJlYWRfc3RhcnRlZCk7CiAJaW5pdF9jb21wbGV0aW9uKCZpbnN0YW5jZS0+dGhyZWFkX2V4aXRlZCk7CiAKQEAgLTEyODcsOCArMTI5MCw4IEBACiAKIAltdXRleF9sb2NrKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKIAlpbnN0YW5jZS0+ZGlzY29ubmVjdGVkID0gMTsKLQlpZiAoaW5zdGFuY2UtPnRocmVhZF9waWQgPj0gMCkKLQkJa2lsbF9wcm9jKGluc3RhbmNlLT50aHJlYWRfcGlkLCBTSUdURVJNLCAxKTsKKwlpZiAoaW5zdGFuY2UtPnRocmVhZCAhPSBOVUxMKQorCQlzZW5kX3NpZyhTSUdURVJNLCBpbnN0YW5jZS0+dGhyZWFkLCAxKTsKIAltdXRleF91bmxvY2soJmluc3RhbmNlLT5zZXJpYWxpemUpOwogCiAJd2FpdF9mb3JfY29tcGxldGlvbigmaW5zdGFuY2UtPnRocmVhZF9leGl0ZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5oIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5oCmluZGV4IGZjNmMyYmUuLmU2ODg3YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uaAorKysgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmgKQEAgLTE3NSw3ICsxNzUsNyBAQAogCWludCBkaXNjb25uZWN0ZWQ7CiAKIAkvKiBoZWF2eSBpbml0ICovCi0JaW50IHRocmVhZF9waWQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CiAJc3RydWN0IGNvbXBsZXRpb24gdGhyZWFkX3N0YXJ0ZWQ7CiAJc3RydWN0IGNvbXBsZXRpb24gdGhyZWFkX2V4aXRlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCmluZGV4IDAxNDdlYTMuLjdiNTcyZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqCXYwLjIzIC0gdXNlIHNvZnRpcnEgZm9yIHJ4IHByb2Nlc3NpbmcsIGFzIG5lZWRlZCBieSB0dHkgbGF5ZXIKICAqCXYwLjI0IC0gY2hhbmdlIHByb2JlIG1ldGhvZCB0byBldmFsdWF0ZSBDREMgdW5pb24gZGVzY3JpcHRvcgogICoJdjAuMjUgLSBkb3duc3RyZWFtIHRhc2tzIHBhcmFsZWxpemVkIHRvIG1heGltaXplIHRocm91Z2hwdXQKKyAqCXYwLjI2IC0gbXVsdGlwbGUgd3JpdGUgdXJicywgd3JpdGVzaXplIGluY3JlYXNlZAogICovCiAKIC8qCkBAIC03Miw3ICs3Myw3IEBACiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC4yNSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjI2IgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJBcm1pbiBGdWVyc3QsIFBhdmVsIE1hY2hlaywgSm9oYW5uZXMgRXJkZmVsdCwgVm9qdGVjaCBQYXZsaWssIERhdmlkIEt1YmljZWsiCiAjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgQWJzdHJhY3QgQ29udHJvbCBNb2RlbCBkcml2ZXIgZm9yIFVTQiBtb2RlbXMgYW5kIElTRE4gYWRhcHRlcnMiCiAKQEAgLTExOCw3ICsxMTksNyBAQAogCWludCBpLCB3Ym47CiAJc3RydWN0IGFjbV93YiAqd2I7CiAKLQl3Ym4gPSBhY20tPndyaXRlX2N1cnJlbnQ7CisJd2JuID0gMDsKIAlpID0gMDsKIAlmb3IgKDs7KSB7CiAJCXdiID0gJmFjbS0+d2Jbd2JuXTsKQEAgLTEzMiwxMSArMTMzLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGFjbV93Yl9mcmVlKHN0cnVjdCBhY20gKmFjbSwgaW50IHdibikKLXsKLQlhY20tPndiW3dibl0udXNlID0gMDsKLX0KLQogc3RhdGljIGludCBhY21fd2JfaXNfYXZhaWwoc3RydWN0IGFjbSAqYWNtKQogewogCWludCBpLCBuOwpAQCAtMTU2LDI2ICsxNTIsMjIgQEAKIC8qCiAgKiBGaW5pc2ggd3JpdGUuCiAgKi8KLXN0YXRpYyB2b2lkIGFjbV93cml0ZV9kb25lKHN0cnVjdCBhY20gKmFjbSkKK3N0YXRpYyB2b2lkIGFjbV93cml0ZV9kb25lKHN0cnVjdCBhY20gKmFjbSwgc3RydWN0IGFjbV93YiAqd2IpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgd2JuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwogCWFjbS0+d3JpdGVfcmVhZHkgPSAxOwotCXdibiA9IGFjbS0+d3JpdGVfY3VycmVudDsKLQlhY21fd2JfZnJlZShhY20sIHdibik7Ci0JYWNtLT53cml0ZV9jdXJyZW50ID0gKHdibiArIDEpICUgQUNNX05XOworCXdiLT51c2UgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwogfQogCiAvKgogICogUG9rZSB3cml0ZS4KICAqLwotc3RhdGljIGludCBhY21fd3JpdGVfc3RhcnQoc3RydWN0IGFjbSAqYWNtKQorc3RhdGljIGludCBhY21fd3JpdGVfc3RhcnQoc3RydWN0IGFjbSAqYWNtLCBpbnQgd2JuKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHdibjsKIAlzdHJ1Y3QgYWNtX3diICp3YjsKIAlpbnQgcmM7CiAKQEAgLTE5MCwyNCArMTgyLDI0IEBACiAJCXJldHVybiAwOwkvKiBBIHdoaXRlIGxpZSAqLwogCX0KIAotCXdibiA9IGFjbS0+d3JpdGVfY3VycmVudDsKIAlpZiAoIWFjbV93Yl9pc191c2VkKGFjbSwgd2JuKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCXdiID0gJmFjbS0+d2Jbd2JuXTsKIAotCWFjbS0+d3JpdGVfcmVhZHkgPSAwOworCWlmKGFjbV93Yl9pc19hdmFpbChhY20pIDw9IDEpCisJCWFjbS0+d3JpdGVfcmVhZHkgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwogCi0JYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gd2ItPmJ1ZjsKLQlhY20tPndyaXRldXJiLT50cmFuc2Zlcl9kbWEgPSB3Yi0+ZG1haDsKLQlhY20tPndyaXRldXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gd2ItPmxlbjsKLQlhY20tPndyaXRldXJiLT5kZXYgPSBhY20tPmRldjsKKwl3Yi0+dXJiLT50cmFuc2Zlcl9idWZmZXIgPSB3Yi0+YnVmOworCXdiLT51cmItPnRyYW5zZmVyX2RtYSA9IHdiLT5kbWFoOworCXdiLT51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB3Yi0+bGVuOworCXdiLT51cmItPmRldiA9IGFjbS0+ZGV2OwogCi0JaWYgKChyYyA9IHVzYl9zdWJtaXRfdXJiKGFjbS0+d3JpdGV1cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKKwlpZiAoKHJjID0gdXNiX3N1Ym1pdF91cmIod2ItPnVyYiwgR0ZQX0FUT01JQykpIDwgMCkgewogCQlkYmcoInVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZDogJWQiLCByYyk7Ci0JCWFjbV93cml0ZV9kb25lKGFjbSk7CisJCWFjbV93cml0ZV9kb25lKGFjbSwgd2IpOwogCX0KIAlyZXR1cm4gcmM7CiB9CkBAIC0yNjgsMTAgKzI2MCwxMCBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6Ci0JCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0zMTUsNyArMzA3LDcgQEAKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0dmFsKQogCQllcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCi0JCSAgICAgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkgICAgIF9fZnVuY19fLCByZXR2YWwpOwogfQogCiAvKiBkYXRhIGludGVyZmFjZSByZXR1cm5zIGluY29taW5nIGJ5dGVzLCBvciB3ZSBnb3QgdW50aHJvdHRsZWQgKi8KQEAgLTQ1MCwxMiArNDQyLDEzIEBACiAvKiBkYXRhIGludGVyZmFjZSB3cm90ZSB0aG9zZSBvdXRnb2luZyBieXRlcyAqLwogc3RhdGljIHZvaWQgYWNtX3dyaXRlX2J1bGsoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBhY20gKmFjbSA9IChzdHJ1Y3QgYWNtICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBhY20gKmFjbTsKKwlzdHJ1Y3QgYWNtX3diICp3YiA9IHVyYi0+Y29udGV4dDsKIAogCWRiZygiRW50ZXJpbmcgYWNtX3dyaXRlX2J1bGsgd2l0aCBzdGF0dXMgJWQiLCB1cmItPnN0YXR1cyk7CiAKLQlhY21fd3JpdGVfZG9uZShhY20pOwotCWFjbV93cml0ZV9zdGFydChhY20pOworCWFjbSA9IHdiLT5pbnN0YW5jZTsKKwlhY21fd3JpdGVfZG9uZShhY20sIHdiKTsKIAlpZiAoQUNNX1JFQURZKGFjbSkpCiAJCXNjaGVkdWxlX3dvcmsoJmFjbS0+d29yayk7CiB9CkBAIC00ODksNiArNDgyLDcgQEAKIAllbHNlCiAJCXJ2ID0gMDsKIAorCXNldF9iaXQoVFRZX05PX1dSSVRFX1NQTElULCAmdHR5LT5mbGFncyk7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IGFjbTsKIAlhY20tPnR0eSA9IHR0eTsKIApAQCAtNTU2LDcgKzU1MCw4IEBACiAJdXNiX3B1dF9pbnRmKGFjbS0+Y29udHJvbCk7CiAJYWNtX3RhYmxlW2FjbS0+bWlub3JdID0gTlVMTDsKIAl1c2JfZnJlZV91cmIoYWNtLT5jdHJsdXJiKTsKLQl1c2JfZnJlZV91cmIoYWNtLT53cml0ZXVyYik7CisJZm9yIChpID0gMDsgaSA8IEFDTV9OVzsgaSsrKQorCQl1c2JfZnJlZV91cmIoYWNtLT53YltpXS51cmIpOwogCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQogCQl1c2JfZnJlZV91cmIoYWNtLT5ydVtpXS51cmIpOwogCWtmcmVlKGFjbS0+Y291bnRyeV9jb2Rlcyk7CkBAIC01NzcsNyArNTcyLDggQEAKIAkJaWYgKGFjbS0+ZGV2KSB7CiAJCQlhY21fc2V0X2NvbnRyb2woYWNtLCBhY20tPmN0cmxvdXQgPSAwKTsKIAkJCXVzYl9raWxsX3VyYihhY20tPmN0cmx1cmIpOwotCQkJdXNiX2tpbGxfdXJiKGFjbS0+d3JpdGV1cmIpOworCQkJZm9yIChpID0gMDsgaSA8IEFDTV9OVzsgaSsrKQorCQkJCXVzYl9raWxsX3VyYihhY20tPndiW2ldLnVyYik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKIAkJCQl1c2Jfa2lsbF91cmIoYWNtLT5ydVtpXS51cmIpOwogCQkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGFjbS0+Y29udHJvbCk7CkBAIC02MDUsNyArNjAxLDYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CiAJaWYgKCh3Ym4gPSBhY21fd2JfYWxsb2MoYWNtKSkgPCAwKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwotCQlhY21fd3JpdGVfc3RhcnQoYWNtKTsKIAkJcmV0dXJuIDA7CiAJfQogCXdiID0gJmFjbS0+d2Jbd2JuXTsKQEAgLTYxNiw3ICs2MTEsNyBAQAogCXdiLT5sZW4gPSBjb3VudDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKIAotCWlmICgoc3RhdCA9IGFjbV93cml0ZV9zdGFydChhY20pKSA8IDApCisJaWYgKChzdGF0ID0gYWNtX3dyaXRlX3N0YXJ0KGFjbSwgd2JuKSkgPCAwKQogCQlyZXR1cm4gc3RhdDsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC04MDksNyArODA0LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjICp1bmlvbl9oZWFkZXIgPSBOVUxMOwogCXN0cnVjdCB1c2JfY2RjX2NvdW50cnlfZnVuY3Rpb25hbF9kZXNjICpjZmQgPSBOVUxMOwotCWNoYXIgKmJ1ZmZlciA9IGludGYtPmFsdHNldHRpbmctPmV4dHJhOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IGludGYtPmFsdHNldHRpbmctPmV4dHJhOwogCWludCBidWZsZW4gPSBpbnRmLT5hbHRzZXR0aW5nLT5leHRyYWxlbjsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqY29udHJvbF9pbnRlcmZhY2U7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmRhdGFfaW50ZXJmYWNlOwpAQCAtODg2LDkgKzg4MSwxMyBAQAogCQkJCWlmICgoY2FsbF9tYW5hZ2VtZW50X2Z1bmN0aW9uICYgMykgIT0gMykKIAkJCQkJZXJyKCJUaGlzIGRldmljZSBjYW5ub3QgZG8gY2FsbHMgb24gaXRzIG93bi4gSXQgaXMgbm8gbW9kZW0uIik7CiAJCQkJYnJlYWs7Ci0JCQkJCiAJCQlkZWZhdWx0OgotCQkJCWVycigiSWdub3JpbmcgZXh0cmEgaGVhZGVyLCB0eXBlICVkLCBsZW5ndGggJWQiLCBidWZmZXJbMl0sIGJ1ZmZlclswXSk7CisJCQkJLyogdGhlcmUgYXJlIExPVFMgbW9yZSBDREMgZGVzY3JpcHRvcnMgdGhhdAorCQkJCSAqIGNvdWxkIGxlZ2l0aW1hdGVseSBiZSBmb3VuZCBoZXJlLgorCQkJCSAqLworCQkJCWRldl9kYmcoJmludGYtPmRldiwgIklnbm9yaW5nIGRlc2NyaXB0b3I6ICIKKwkJCQkJCSJ0eXBlICUwMngsIGxlbmd0aCAlZFxuIiwKKwkJCQkJCWJ1ZmZlclsyXSwgYnVmZmVyWzBdKTsKIAkJCQlicmVhazsKIAkJCX0KIG5leHRfZGVzYzoKQEAgLTk3Niw3ICs5NzUsNyBAQAogCiAJY3RybHNpemUgPSBsZTE2X3RvX2NwdShlcGN0cmwtPndNYXhQYWNrZXRTaXplKTsKIAlyZWFkc2l6ZSA9IGxlMTZfdG9fY3B1KGVwcmVhZC0+d01heFBhY2tldFNpemUpKiAoIHF1aXJrcyA9PSBTSU5HTEVfUlhfVVJCID8gMSA6IDIpOwotCWFjbS0+d3JpdGVzaXplID0gbGUxNl90b19jcHUoZXB3cml0ZS0+d01heFBhY2tldFNpemUpOworCWFjbS0+d3JpdGVzaXplID0gbGUxNl90b19jcHUoZXB3cml0ZS0+d01heFBhY2tldFNpemUpICogMjA7CiAJYWNtLT5jb250cm9sID0gY29udHJvbF9pbnRlcmZhY2U7CiAJYWNtLT5kYXRhID0gZGF0YV9pbnRlcmZhY2U7CiAJYWNtLT5taW5vciA9IG1pbm9yOwpAQCAtMTAzMSwxMCArMTAzMCwxOSBAQAogCQkJZ290byBhbGxvY19mYWlsNzsKIAkJfQogCX0KLQlhY20tPndyaXRldXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFjbS0+d3JpdGV1cmIpIHsKLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAib3V0IG9mIG1lbW9yeSAod3JpdGV1cmIga21hbGxvYylcbiIpOwotCQlnb3RvIGFsbG9jX2ZhaWw3OworCWZvcihpID0gMDsgaSA8IEFDTV9OVzsgaSsrKQorCXsKKwkJc3RydWN0IGFjbV93YiAqc25kID0gJihhY20tPndiW2ldKTsKKworCQlpZiAoIShzbmQtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKSB7CisJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJvdXQgb2YgbWVtb3J5ICh3cml0ZSB1cmJzIHVzYl9hbGxvY191cmIpIik7CisJCQlnb3RvIGFsbG9jX2ZhaWw3OworCQl9CisKKwkJdXNiX2ZpbGxfYnVsa191cmIoc25kLT51cmIsIHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBlcHdyaXRlLT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCQlOVUxMLCBhY20tPndyaXRlc2l6ZSwgYWNtX3dyaXRlX2J1bGssIHNuZCk7CisJCXNuZC0+dXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJc25kLT5pbnN0YW5jZSA9IGFjbTsKIAl9CiAKIAl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBhY20pOwpAQCAtMTA3MCwxMCArMTA3OCw2IEBACiAJYWNtLT5jdHJsdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAlhY20tPmN0cmx1cmItPnRyYW5zZmVyX2RtYSA9IGFjbS0+Y3RybF9kbWE7CiAKLQl1c2JfZmlsbF9idWxrX3VyYihhY20tPndyaXRldXJiLCB1c2JfZGV2LCB1c2Jfc25kYnVsa3BpcGUodXNiX2RldiwgZXB3cml0ZS0+YkVuZHBvaW50QWRkcmVzcyksCi0JCQkgIE5VTEwsIGFjbS0+d3JpdGVzaXplLCBhY21fd3JpdGVfYnVsaywgYWNtKTsKLQlhY20tPndyaXRldXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fRlNCUiB8IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCiAJZGV2X2luZm8oJmludGYtPmRldiwgInR0eUFDTSVkOiBVU0IgQUNNIGRldmljZVxuIiwgbWlub3IpOwogCiAJYWNtX3NldF9jb250cm9sKGFjbSwgYWNtLT5jdHJsb3V0KTsKQEAgLTEwOTEsNyArMTA5NSw4IEBACiAKIAlyZXR1cm4gMDsKIGFsbG9jX2ZhaWw4OgotCXVzYl9mcmVlX3VyYihhY20tPndyaXRldXJiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspCisJCXVzYl9mcmVlX3VyYihhY20tPndiW2ldLnVyYik7CiBhbGxvY19mYWlsNzoKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3J4X2J1ZjsgaSsrKQogCQl1c2JfYnVmZmVyX2ZyZWUodXNiX2RldiwgYWNtLT5yZWFkc2l6ZSwgYWNtLT5yYltpXS5iYXNlLCBhY20tPnJiW2ldLmRtYSk7CkBAIC0xMTE1LDcgKzExMjAsOCBAQAogCXRhc2tsZXRfZGlzYWJsZSgmYWNtLT51cmJfdGFzayk7CiAKIAl1c2Jfa2lsbF91cmIoYWNtLT5jdHJsdXJiKTsKLQl1c2Jfa2lsbF91cmIoYWNtLT53cml0ZXVyYik7CisJZm9yKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspCisJCXVzYl9raWxsX3VyYihhY20tPndiW2ldLnVyYik7CiAJZm9yIChpID0gMDsgaSA8IGFjbS0+cnhfYnVmbGltaXQ7IGkrKykKIAkJdXNiX2tpbGxfdXJiKGFjbS0+cnVbaV0udXJiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCmluZGV4IDhkZjZhNTcuLjA0NmUwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaAorKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKQEAgLTU5LDcgKzU5LDcgQEAKICAqIHdoZW4gcHJvY2Vzc2luZyBvbmxjciwgc28gd2Ugb25seSBuZWVkIDIgYnVmZmVycy4gVGhlc2UgdmFsdWVzIG11c3QgYmUKICAqIHBvd2VycyBvZiAyLgogICovCi0jZGVmaW5lIEFDTV9OVyAgMgorI2RlZmluZSBBQ01fTlcgIDE2CiAjZGVmaW5lIEFDTV9OUiAgMTYKIAogc3RydWN0IGFjbV93YiB7CkBAIC02Nyw2ICs2Nyw4IEBACiAJZG1hX2FkZHJfdCBkbWFoOwogCWludCBsZW47CiAJaW50IHVzZTsKKwlzdHJ1Y3QgdXJiCQkqdXJiOworCXN0cnVjdCBhY20JCSppbnN0YW5jZTsKIH07CiAKIHN0cnVjdCBhY21fcmIgewpAQCAtODgsNyArOTAsNyBAQAogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpjb250cm9sOwkJCS8qIGNvbnRyb2wgaW50ZXJmYWNlICovCiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmRhdGE7CQkJLyogZGF0YSBpbnRlcmZhY2UgKi8KIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwkJCQkvKiB0aGUgY29ycmVzcG9uZGluZyB0dHkgKi8KLQlzdHJ1Y3QgdXJiICpjdHJsdXJiLCAqd3JpdGV1cmI7CQkJLyogdXJicyAqLworCXN0cnVjdCB1cmIgKmN0cmx1cmI7CQkJLyogdXJicyAqLwogCXU4ICpjdHJsX2J1ZmZlcjsJCQkJLyogYnVmZmVycyBvZiB1cmJzICovCiAJZG1hX2FkZHJfdCBjdHJsX2RtYTsJCQkJLyogZG1hIGhhbmRsZXMgb2YgYnVmZmVycyAqLwogCXU4ICpjb3VudHJ5X2NvZGVzOwkJCQkvKiBjb3VudHJ5IGNvZGVzIGZyb20gZGV2aWNlICovCkBAIC0xMDMsNyArMTA1LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNwYXJlX3JlYWRfdXJiczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNwYXJlX3JlYWRfYnVmczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGxlZF9yZWFkX2J1ZnM7Ci0JaW50IHdyaXRlX2N1cnJlbnQ7CQkJCS8qIGN1cnJlbnQgd3JpdGUgYnVmZmVyICovCiAJaW50IHdyaXRlX3VzZWQ7CQkJCQkvKiBudW1iZXIgb2Ygbm9uLWVtcHR5IHdyaXRlIGJ1ZmZlcnMgKi8KIAlpbnQgd3JpdGVfcmVhZHk7CQkJCS8qIHdyaXRlIHVyYiBpcyBub3QgcnVubmluZyAqLwogCXNwaW5sb2NrX3Qgd3JpdGVfbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZwppbmRleCBhMmIwYWE0Li5jYzlmMzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvY29yZS9LY29uZmlnCkBAIC03Niw4ICs3Niw4IEBACiAJICAgIE5BTUU9ImJ1cy91c2IvJGVudntCVVNOVU19LyRlbnZ7REVWTlVNfSIsIE1PREU9IjA2NDQiCiAKIGNvbmZpZyBVU0JfRFlOQU1JQ19NSU5PUlMKLQlib29sICJEeW5hbWljIFVTQiBtaW5vciBhbGxvY2F0aW9uIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCICYmIEVYUEVSSU1FTlRBTAorCWJvb2wgIkR5bmFtaWMgVVNCIG1pbm9yIGFsbG9jYXRpb24iCisJZGVwZW5kcyBvbiBVU0IKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIFVTQiBzdWJzeXN0ZW0gd2lsbCB1c2UgZHluYW1pYyBtaW5vcgogCSAgYWxsb2NhdGlvbiBmb3IgYW55IGRldmljZSB0aGF0IHVzZXMgdGhlIFVTQiBtYWpvciBudW1iZXIuCkBAIC0xMDIsMzEgKzEwMiw2IEBACiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHRoaXMsIHNheSBOIGhlcmUuCiAKLWNvbmZpZyBVU0JfUEVSU0lTVAotCWJvb2wgIlVTQiBkZXZpY2UgcGVyc2lzdGVuY2UgZHVyaW5nIHN5c3RlbSBzdXNwZW5kIChEQU5HRVJPVVMpIgotCWRlcGVuZHMgb24gVVNCICYmIFBNICYmIEVYUEVSSU1FTlRBTAotCWRlZmF1bHQgbgotCWhlbHAKLQotCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGVuYWJsZSB0aGUgInBvd2VyL3BlcnNpc3QiIGF0dHJpYnV0ZQotCSAgZm9yIGEgVVNCIGRldmljZSwgdGhlIGRldmljZSdzIGRhdGEgc3RydWN0dXJlcyB3aWxsIHJlbWFpbgotCSAgcGVyc2lzdGVudCBhY3Jvc3Mgc3lzdGVtIHN1c3BlbmQsIGV2ZW4gaWYgdGhlIFVTQiBidXMgbG9zZXMKLQkgIHBvd2VyLiAgKFRoaXMgaW5jbHVkZXMgaGliZXJuYXRpb24sIGFsc28ga25vd24gYXMgc3dzdXNwIG9yCi0JICBzdXNwZW5kLXRvLWRpc2suKSAgVGhlIGRldmljZXMgd2lsbCByZWFwcGVhciBhcyBpZiBieSBtYWdpYwotCSAgd2hlbiB0aGUgc3lzdGVtIHdha2VzIHVwLCB3aXRoIG5vIG5lZWQgdG8gdW5tb3VudCBVU0IKLQkgIGZpbGVzeXN0ZW1zLCBybW1vZCBob3N0LWNvbnRyb2xsZXIgZHJpdmVycywgb3IgZG8gYW55dGhpbmcKLQkgIGVsc2UuCi0KLQkgIAlXQVJOSU5HOiBUaGlzIG9wdGlvbiBjYW4gYmUgZGFuZ2Vyb3VzIQotCi0JICBJZiBhIFVTQiBkZXZpY2UgaXMgcmVwbGFjZWQgYnkgYW5vdGhlciBvZiB0aGUgc2FtZSB0eXBlIHdoaWxlCi0JICB0aGUgc3lzdGVtIGlzIGFzbGVlcCwgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoZSBrZXJuZWwgd29uJ3QKLQkgIGRldGVjdCB0aGUgY2hhbmdlLiAgTGlrZXdpc2UgaWYgdGhlIG1lZGlhIGluIGEgVVNCIHN0b3JhZ2UKLQkgIGRldmljZSBpcyByZXBsYWNlZC4gIFdoZW4gdGhpcyBoYXBwZW5zIGl0J3MgYWxtb3N0IGNlcnRhaW4gdG8KLQkgIGNhdXNlIGRhdGEgY29ycnVwdGlvbiBhbmQgbWF5YmUgZXZlbiBjcmFzaCB5b3VyIHN5c3RlbS4KLQotCSAgSWYgeW91IGFyZSB1bnN1cmUsIHNheSBOIGhlcmUuCi0KIGNvbmZpZyBVU0JfT1RHCiAJYm9vbAogCWRlcGVuZHMgb24gVVNCICYmIEVYUEVSSU1FTlRBTApAQCAtMTM2LDE0ICsxMTEsMTYgQEAKIAogY29uZmlnIFVTQl9PVEdfV0hJVEVMSVNUCiAJYm9vbCAiUmVseSBvbiBPVEcgVGFyZ2V0ZWQgUGVyaXBoZXJhbHMgTGlzdCIKLQlkZXBlbmRzIG9uIFVTQl9PVEcKLQlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVTQl9PVEcgfHwgRU1CRURERUQKKwlkZWZhdWx0IHkgaWYgVVNCX09URworCWRlZmF1bHQgbiBpZiBFTUJFRERFRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgIm90Z193aGl0ZWxpc3QuaCIgZmlsZSB3aWxsIGJlIHVzZWQgYXMgYQogCSAgcHJvZHVjdCB3aGl0ZWxpc3QsIHNvIFVTQiBwZXJpcGhlcmFscyBub3QgbGlzdGVkIHRoZXJlIHdpbGwgYmUKIAkgIHJlamVjdGVkIGR1cmluZyBlbnVtZXJhdGlvbi4gIFRoaXMgYmVoYXZpb3IgaXMgcmVxdWlyZWQgYnkgdGhlCiAJICBVU0IgT1RHIHNwZWNpZmljYXRpb24gZm9yIGFsbCBkZXZpY2VzIG5vdCBvbiB5b3VyIHByb2R1Y3QncwotCSAgIlRhcmdldGVkIFBlcmlwaGVyYWxzIExpc3QiLgorCSAgIlRhcmdldGVkIFBlcmlwaGVyYWxzIExpc3QiLiAgIkVtYmVkZGVkIEhvc3RzIiBhcmUgbGlrZXdpc2UKKwkgIGFsbG93ZWQgdG8gc3VwcG9ydCBvbmx5IGEgbGltaXRlZCBudW1iZXIgb2YgcGVyaXBoZXJhbHMuCiAKIAkgIE90aGVyd2lzZSwgcGVyaXBoZXJhbHMgbm90IGxpc3RlZCB0aGVyZSB3aWxsIG9ubHkgZ2VuZXJhdGUgYQogCSAgd2FybmluZyBhbmQgZW51bWVyYXRpb24gd2lsbCBjb250aW51ZS4gIFRoYXQncyBtb3JlIGxpa2Ugd2hhdApAQCAtMTUyLDkgKzEyOSwxMCBAQAogCiBjb25maWcgVVNCX09UR19CTEFDS0xJU1RfSFVCCiAJYm9vbCAiRGlzYWJsZSBleHRlcm5hbCBodWJzIgotCWRlcGVuZHMgb24gVVNCX09URworCWRlcGVuZHMgb24gVVNCX09URyB8fCBFTUJFRERFRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIExpbnV4IHdpbGwgcmVmdXNlIHRvIGVudW1lcmF0ZQogCSAgZXh0ZXJuYWwgaHVicy4gIE9URyBob3N0cyBhcmUgYWxsb3dlZCB0byByZWR1Y2UgaGFyZHdhcmUKLQkgIGFuZCBzb2Z0d2FyZSBjb3N0cyBieSBub3Qgc3VwcG9ydGluZyBleHRlcm5hbCBodWJzLgorCSAgYW5kIHNvZnR3YXJlIGNvc3RzIGJ5IG5vdCBzdXBwb3J0aW5nIGV4dGVybmFsIGh1YnMuICBTbworCSAgYXJlICJFbWVkZGVkIEhvc3RzIiB0aGF0IGRvbid0IG9mZmVyIE9URyBzdXBwb3J0LgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jIGIvZHJpdmVycy91c2IvY29yZS9jb25maWcuYwppbmRleCBhOTIxMjJhLi41NjgyNDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKQEAgLTE0NSw2ICsxNDUsMjMgQEAKIAkJCWVuZHBvaW50LT5kZXNjLndNYXhQYWNrZXRTaXplID0gY3B1X3RvX2xlMTYoOCk7CiAJfQogCisJLyoKKwkgKiBTb21lIGJ1Z2d5IGhpZ2ggc3BlZWQgZGV2aWNlcyBoYXZlIGJ1bGsgZW5kcG9pbnRzIHVzaW5nCisJICogbWF4cGFja2V0IHNpemVzIG90aGVyIHRoYW4gNTEyLiAgSGlnaCBzcGVlZCBIQ0RzIG1heSBub3QKKwkgKiBiZSBhYmxlIHRvIGhhbmRsZSB0aGF0IHBhcnRpY3VsYXIgYnVnLCBzbyBsZXQncyB3YXJuLi4uCisJICovCisJaWYgKHRvX3VzYl9kZXZpY2UoZGRldiktPnNwZWVkID09IFVTQl9TUEVFRF9ISUdICisJCQkmJiB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGQpKSB7CisJCXVuc2lnbmVkIG1heHA7CisKKwkJbWF4cCA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT5kZXNjLndNYXhQYWNrZXRTaXplKSAmIDB4MDdmZjsKKwkJaWYgKG1heHAgIT0gNTEyKQorCQkJZGV2X3dhcm4oZGRldiwgImNvbmZpZyAlZCBpbnRlcmZhY2UgJWQgYWx0c2V0dGluZyAlZCAiCisJCQkJImJ1bGsgZW5kcG9pbnQgMHglWCBoYXMgaW52YWxpZCBtYXhwYWNrZXQgJWRcbiIsCisJCQkJY2Znbm8sIGludW0sIGFzbnVtLCBkLT5iRW5kcG9pbnRBZGRyZXNzLAorCQkJCW1heHApOworCX0KKwogCS8qIFNraXAgb3ZlciBhbnkgQ2xhc3MgU3BlY2lmaWMgb3IgVmVuZG9yIFNwZWNpZmljIGRlc2NyaXB0b3JzOwogCSAqIGZpbmQgdGhlIG5leHQgZW5kcG9pbnQgb3IgaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8KIAllbmRwb2ludC0+ZXh0cmEgPSBidWZmZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggYWU5NDE3Ni4uZGUxNzczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtNjQ3LDYgKzY0Nyw3IEBACiAJc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlciBjdHJsOwogCXVuc2lnbmVkIGludCB0bW87CiAJdW5zaWduZWQgY2hhciAqdGJ1ZjsKKwl1bnNpZ25lZCB3TGVuZ3RoOwogCWludCBpLCBqLCByZXQ7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmN0cmwsIGFyZywgc2l6ZW9mKGN0cmwpKSkKQEAgLTY1NCw3ICs2NTUsOCBAQAogCXJldCA9IGNoZWNrX2N0cmxyZWNpcChwcywgY3RybC5iUmVxdWVzdFR5cGUsIGN0cmwud0luZGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCWlmIChjdHJsLndMZW5ndGggPiBQQUdFX1NJWkUpCisJd0xlbmd0aCA9IGN0cmwud0xlbmd0aDsJCS8qIFRvIHN1cHByZXNzIDY0ayBQQUdFX1NJWkUgd2FybmluZyAqLworCWlmICh3TGVuZ3RoID4gUEFHRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAl0YnVmID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCF0YnVmKQpAQCAtOTQ2LDggKzk0OCwxMSBAQAogCWludCByZXQsIGlmbnVtID0gLTE7CiAJaW50IGlzX2luOwogCi0JaWYgKHV1cmItPmZsYWdzICYgfihVU0JERVZGU19VUkJfSVNPX0FTQVB8VVNCREVWRlNfVVJCX1NIT1JUX05PVF9PS3wKLQkJCSAgIFVSQl9OT19GU0JSfFVSQl9aRVJPX1BBQ0tFVCkpCisJaWYgKHV1cmItPmZsYWdzICYgfihVU0JERVZGU19VUkJfSVNPX0FTQVAgfAorCQkJCVVTQkRFVkZTX1VSQl9TSE9SVF9OT1RfT0sgfAorCQkJCVVTQkRFVkZTX1VSQl9OT19GU0JSIHwKKwkJCQlVU0JERVZGU19VUkJfWkVST19QQUNLRVQgfAorCQkJCVVTQkRFVkZTX1VSQl9OT19JTlRFUlJVUFQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIXV1cmItPmJ1ZmZlcikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTAyLDggKzExMDcsMjQgQEAKIAlhcy0+dXJiLT5waXBlID0gKHV1cmItPnR5cGUgPDwgMzApIHwKIAkJCV9fY3JlYXRlX3BpcGUocHMtPmRldiwgdXVyYi0+ZW5kcG9pbnQgJiAweGYpIHwKIAkJCSh1dXJiLT5lbmRwb2ludCAmIFVTQl9ESVJfSU4pOwotCWFzLT51cmItPnRyYW5zZmVyX2ZsYWdzID0gdXVyYi0+ZmxhZ3MgfAotCQkJKGlzX2luID8gVVJCX0RJUl9JTiA6IFVSQl9ESVJfT1VUKTsKKworCS8qIFRoaXMgdGVkaW91cyBzZXF1ZW5jZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgVVJCXyogZmxhZ3MKKwkgKiBhcmUgaW50ZXJuYWwgdG8gdGhlIGtlcm5lbCBhbmQgc3ViamVjdCB0byBjaGFuZ2UsIHdoZXJlYXMKKwkgKiB0aGUgVVNCREVWRlNfVVJCXyogZmxhZ3MgYXJlIGEgdXNlciBBUEkgYW5kIG11c3Qgbm90IGJlIGNoYW5nZWQuCisJICovCisJdSA9IChpc19pbiA/IFVSQl9ESVJfSU4gOiBVUkJfRElSX09VVCk7CisJaWYgKHV1cmItPmZsYWdzICYgVVNCREVWRlNfVVJCX0lTT19BU0FQKQorCQl1IHw9IFVSQl9JU09fQVNBUDsKKwlpZiAodXVyYi0+ZmxhZ3MgJiBVU0JERVZGU19VUkJfU0hPUlRfTk9UX09LKQorCQl1IHw9IFVSQl9TSE9SVF9OT1RfT0s7CisJaWYgKHV1cmItPmZsYWdzICYgVVNCREVWRlNfVVJCX05PX0ZTQlIpCisJCXUgfD0gVVJCX05PX0ZTQlI7CisJaWYgKHV1cmItPmZsYWdzICYgVVNCREVWRlNfVVJCX1pFUk9fUEFDS0VUKQorCQl1IHw9IFVSQl9aRVJPX1BBQ0tFVDsKKwlpZiAodXVyYi0+ZmxhZ3MgJiBVU0JERVZGU19VUkJfTk9fSU5URVJSVVBUKQorCQl1IHw9IFVSQl9OT19JTlRFUlJVUFQ7CisJYXMtPnVyYi0+dHJhbnNmZXJfZmxhZ3MgPSB1OworCiAJYXMtPnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHV1cmItPmJ1ZmZlcl9sZW5ndGg7CiAJYXMtPnVyYi0+c2V0dXBfcGFja2V0ID0gKHVuc2lnbmVkIGNoYXIgKilkcjsKIAlhcy0+dXJiLT5zdGFydF9mcmFtZSA9IHV1cmItPnN0YXJ0X2ZyYW1lOwpAQCAtMTUwOSw2MCArMTUzMCw2MCBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFVTQkRFVkZTX0NPTlRST0w6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBDT05UUk9MXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQ09OVFJPTFxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX2NvbnRyb2wocHMsIHApOwogCQlpZiAocmV0ID49IDApCiAJCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX0JVTEs6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBCVUxLXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQlVMS1xuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX2J1bGsocHMsIHApOwogCQlpZiAocmV0ID49IDApCiAJCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1JFU0VURVA6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBSRVNFVEVQXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVTRVRFUFxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3Jlc2V0ZXAocHMsIHApOwogCQlpZiAocmV0ID49IDApCiAJCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1JFU0VUOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVTRVRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBSRVNFVFxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3Jlc2V0ZGV2aWNlKHBzKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX0NMRUFSX0hBTFQ6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBDTEVBUl9IQUxUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQ0xFQVJfSEFMVFxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX2NsZWFyaGFsdChwcywgcCk7CiAJCWlmIChyZXQgPj0gMCkKIAkJCWlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfR0VURFJJVkVSOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogR0VURFJJVkVSXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogR0VURFJJVkVSXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfZ2V0ZHJpdmVyKHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX0NPTk5FQ1RJTkZPOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQ09OTkVDVElORk9cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBDT05ORUNUSU5GT1xuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX2Nvbm5lY3RpbmZvKHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1NFVElOVEVSRkFDRToKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFNFVElOVEVSRkFDRVxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFNFVElOVEVSRkFDRVxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3NldGludGYocHMsIHApOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfU0VUQ09ORklHVVJBVElPTjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFNFVENPTkZJR1VSQVRJT05cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBTRVRDT05GSUdVUkFUSU9OXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2Nfc2V0Y29uZmlnKHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX1NVQk1JVFVSQjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFNVQk1JVFVSQlxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFNVQk1JVFVSQlxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3N1Ym1pdHVyYihwcywgcCk7CiAJCWlmIChyZXQgPj0gMCkKIAkJCWlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwpAQCAtMTU3MSw2MCArMTU5Miw2MCBAQAogI2lmZGVmIENPTkZJR19DT01QQVQKIAogCWNhc2UgVVNCREVWRlNfU1VCTUlUVVJCMzI6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBTVUJNSVRVUkIzMlxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFNVQk1JVFVSQjMyXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2Nfc3VibWl0dXJiX2NvbXBhdChwcywgcCk7CiAJCWlmIChyZXQgPj0gMCkKIAkJCWlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfUkVBUFVSQjMyOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVBUFVSQjMyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVBUFVSQjMyXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfcmVhcHVyYl9jb21wYXQocHMsIHApOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfUkVBUFVSQk5ERUxBWTMyOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVBUFVSQkRFTEFZMzJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBSRUFQVVJCREVMQVkzMlxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX3JlYXB1cmJub25ibG9ja19jb21wYXQocHMsIHApOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfSU9DVEwzMjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IElPQ1RMXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogSU9DVExcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19pb2N0bF9jb21wYXQocHMsIHB0cl90b19jb21wYXQocCkpOwogCQlicmVhazsKICNlbmRpZgogCiAJY2FzZSBVU0JERVZGU19ESVNDQVJEVVJCOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogRElTQ0FSRFVSQlxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IERJU0NBUkRVUkJcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY191bmxpbmt1cmIocHMsIHApOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfUkVBUFVSQjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFQVBVUkJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBSRUFQVVJCXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfcmVhcHVyYihwcywgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19SRUFQVVJCTkRFTEFZOgotCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVBUFVSQkRFTEFZXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogUkVBUFVSQkRFTEFZXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfcmVhcHVyYm5vbmJsb2NrKHBzLCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQkRFVkZTX0RJU0NTSUdOQUw6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBESVNDU0lHTkFMXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogRElTQ1NJR05BTFxuIiwgX19mdW5jX18pOwogCQlyZXQgPSBwcm9jX2Rpc2Nvbm5lY3RzaWduYWwocHMsIHApOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfQ0xBSU1JTlRFUkZBQ0U6Ci0JCXNub29wKCZkZXYtPmRldiwgIiVzOiBDTEFJTUlOVEVSRkFDRVxuIiwgX19GVU5DVElPTl9fKTsKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IENMQUlNSU5URVJGQUNFXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfY2xhaW1pbnRlcmZhY2UocHMsIHApOwogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfUkVMRUFTRUlOVEVSRkFDRToKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFJFTEVBU0VJTlRFUkZBQ0VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBSRUxFQVNFSU5URVJGQUNFXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfcmVsZWFzZWludGVyZmFjZShwcywgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19JT0NUTDoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IElPQ1RMXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzbm9vcCgmZGV2LT5kZXYsICIlczogSU9DVExcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gcHJvY19pb2N0bF9kZWZhdWx0KHBzLCBwKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKaW5kZXggODAxYjZmMS4uMWU1NmYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAlpbnQgZXJyb3IgPSAtRU5PREVWOwogCi0JZGV2X2RiZyhkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoIWlzX3VzYl9kZXZpY2UoZGV2KSkJLyogU2FuaXR5IGNoZWNrICovCiAJCXJldHVybiBlcnJvcjsKQEAgLTE5NCw3ICsxOTQsNyBAQAogCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZDsKIAlpbnQgZXJyb3IgPSAtRU5PREVWOwogCi0JZGV2X2RiZyhkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoaXNfdXNiX2RldmljZShkZXYpKQkJLyogU2FuaXR5IGNoZWNrICovCiAJCXJldHVybiBlcnJvcjsKQEAgLTIxMSw3ICsyMTEsNyBAQAogCWlmICghaWQpCiAJCWlkID0gdXNiX21hdGNoX2R5bmFtaWNfaWQoaW50ZiwgZHJpdmVyKTsKIAlpZiAoaWQpIHsKLQkJZGV2X2RiZyhkZXYsICIlcyAtIGdvdCBpZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2RiZyhkZXYsICIlcyAtIGdvdCBpZFxuIiwgX19mdW5jX18pOwogCiAJCWVycm9yID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYpOwogCQlpZiAoZXJyb3IpCkBAIC03OTMsOSArNzkzLDcgQEAKIAlzdGF0dXMgPSB1ZHJpdmVyLT5zdXNwZW5kKHVkZXYsIG1zZyk7CiAKICBkb25lOgotCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JaWYgKHN0YXR1cyA9PSAwKQotCQl1ZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPSBtc2cuZXZlbnQ7CisJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTgyMywxMSArODIxLDkgQEAKIAlzdGF0dXMgPSB1ZHJpdmVyLT5yZXN1bWUodWRldik7CiAKICBkb25lOgotCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7CisJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gMCkKIAkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IDA7Ci0JCXVkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9IFBNX0VWRU5UX09OOwotCX0KIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC04NjQsNyArODYwLDcgQEAKIAl9CiAKICBkb25lOgotCWRldl92ZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJZGV2X3ZkYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTkxNCw3ICs5MTAsNyBAQAogCX0KIAogZG9uZToKLQlkZXZfdmRiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCWRldl92ZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlpZiAoc3RhdHVzID09IDApCiAJCW1hcmtfYWN0aXZlKGludGYpOwogCkBAIC05MzYsNyArOTMyLDYgQEAKIAkgKiBpcyBkaXNhYmxlZC4gIEFsc28gZmFpbCBpZiBhbnkgaW50ZXJmYWNlcyByZXF1aXJlIHJlbW90ZSB3YWtldXAKIAkgKiBidXQgaXQgaXNuJ3QgYXZhaWxhYmxlLgogCSAqLwotCXVkZXYtPmRvX3JlbW90ZV93YWtldXAgPSBkZXZpY2VfbWF5X3dha2V1cCgmdWRldi0+ZGV2KTsKIAlpZiAodWRldi0+cG1fdXNhZ2VfY250ID4gMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAlpZiAodWRldi0+YXV0b3N1c3BlbmRfZGVsYXkgPCAwIHx8IHVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkKQpAQCAtMTA5OCw3ICsxMDkzLDcgQEAKIAl9CiAKICBkb25lOgotCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTExODAsOCArMTE3NSw3IEBACiAJCX0KIAl9IGVsc2UgewogCi0JCS8qIE5lZWRlZCBmb3Igc2V0dGluZyB1ZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQsCi0JCSAqIGZvciBwb3NzaWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZSwgYW5kIGZvciByZXNldF9yZXN1bWUuICovCisJCS8qIE5lZWRlZCBmb3IgcmVzZXQtcmVzdW1lICovCiAJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYpOwogCX0KIApAQCAtMTE5Myw4ICsxMTg3LDkgQEAKIAl9CiAKICBkb25lOgotCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JdWRldi0+cmVzZXRfcmVzdW1lID0gMDsKKwlkZXZfdmRiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJaWYgKCFzdGF0dXMpCisJCXVkZXYtPnJlc2V0X3Jlc3VtZSA9IDA7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTI2Miw3ICsxMjU3LDcgQEAKIAogCXN0YXR1cyA9IHVzYl9hdXRvcG1fZG9fZGV2aWNlKHVkZXYsIC0xKTsKIAlkZXZfdmRiZygmdWRldi0+ZGV2LCAiJXM6IGNudCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgdWRldi0+cG1fdXNhZ2VfY250KTsKKwkJCV9fZnVuY19fLCB1ZGV2LT5wbV91c2FnZV9jbnQpOwogfQogCiAvKioKQEAgLTEyODIsNyArMTI3Nyw3IEBACiB7CiAJdXNiX2F1dG9wbV9kb19kZXZpY2UodWRldiwgMCk7CiAJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBjbnQgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHVkZXYtPnBtX3VzYWdlX2NudCk7CisJCQlfX2Z1bmNfXywgdWRldi0+cG1fdXNhZ2VfY250KTsKIH0KIAogLyoqCkBAIC0xMzEwLDcgKzEzMDUsNyBAQAogCiAJc3RhdHVzID0gdXNiX2F1dG9wbV9kb19kZXZpY2UodWRldiwgMSk7CiAJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMsIHVkZXYtPnBtX3VzYWdlX2NudCk7CisJCQlfX2Z1bmNfXywgc3RhdHVzLCB1ZGV2LT5wbV91c2FnZV9jbnQpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTEzODIsNyArMTM3Nyw3IEBACiAKIAlzdGF0dXMgPSB1c2JfYXV0b3BtX2RvX2ludGVyZmFjZShpbnRmLCAtMSk7CiAJZGV2X3ZkYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7CisJCQlfX2Z1bmNfXywgc3RhdHVzLCBpbnRmLT5wbV91c2FnZV9jbnQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKTsKIApAQCAtMTQyNiw3ICsxNDIxLDcgQEAKIAogCXN0YXR1cyA9IHVzYl9hdXRvcG1fZG9faW50ZXJmYWNlKGludGYsIDEpOwogCWRldl92ZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkIGNudCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzLCBpbnRmLT5wbV91c2FnZV9jbnQpOworCQkJX19mdW5jX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKTsKQEAgLTE0NDgsNyArMTQ0Myw3IEBACiAKIAlzdGF0dXMgPSB1c2JfYXV0b3BtX2RvX2ludGVyZmFjZShpbnRmLCAwKTsKIAlkZXZfdmRiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZCBjbnQgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKKwkJCV9fZnVuY19fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZSk7CkBAIC0xNTIzLDkgKzE1MTgsMTQgQEAKIAl1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwogCiAJLyogSWYgdWRldiBpcyBhbHJlYWR5IHN1c3BlbmRlZCwgd2UgY2FuIHNraXAgdGhpcyBzdXNwZW5kIGFuZAotCSAqIHdlIHNob3VsZCBhbHNvIHNraXAgdGhlIHVwY29taW5nIHN5c3RlbSByZXN1bWUuICovCisJICogd2Ugc2hvdWxkIGFsc28gc2tpcCB0aGUgdXBjb21pbmcgc3lzdGVtIHJlc3VtZS4gIEhpZ2gtc3BlZWQKKwkgKiByb290IGh1YnMgYXJlIGFuIGV4Y2VwdGlvbjsgdGhleSBuZWVkIHRvIHJlc3VtZSB3aGVuZXZlciB0aGUKKwkgKiBzeXN0ZW0gd2FrZXMgdXAgaW4gb3JkZXIgZm9yIFVTQi1QRVJTSVNUIHBvcnQgaGFuZG92ZXIgdG8gd29yaworCSAqIHByb3Blcmx5LgorCSAqLwogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKSB7Ci0JCXVkZXYtPnNraXBfc3lzX3Jlc3VtZSA9IDE7CisJCWlmICh1ZGV2LT5wYXJlbnQgfHwgdWRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpCisJCQl1ZGV2LT5za2lwX3N5c19yZXN1bWUgPSAxOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKaW5kZXggODQ3NjBkZC4uNWI4N2FlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKQEAgLTczLDcgKzczLDYgQEAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSA8IDApCiAJCXJldHVybiAtRU5PREVWOwogCWRldi0+Y3VycmVudF9zdGF0ZSA9IFBDSV9EMDsKLQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAKIAlpZiAoIWRldi0+aXJxKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LApAQCAtMjE2LDkgKzIxNSw5IEBACiAJCQloY2QtPnN0YXRlID09IEhDX1NUQVRFX0hBTFQpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JaWYgKGhjZC0+ZHJpdmVyLT5zdXNwZW5kKSB7Ci0JCXJldHZhbCA9IGhjZC0+ZHJpdmVyLT5zdXNwZW5kKGhjZCwgbWVzc2FnZSk7Ci0JCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChoY2QtPmRyaXZlci0+c3VzcGVuZCwgcmV0dmFsKTsKKwlpZiAoaGNkLT5kcml2ZXItPnBjaV9zdXNwZW5kKSB7CisJCXJldHZhbCA9IGhjZC0+ZHJpdmVyLT5wY2lfc3VzcGVuZChoY2QsIG1lc3NhZ2UpOworCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoaGNkLT5kcml2ZXItPnBjaV9zdXNwZW5kLCByZXR2YWwpOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBkb25lOwogCX0KQEAgLTMwMiw4ICszMDEsNiBAQAogCiBkb25lOgogCWlmIChyZXR2YWwgPT0gMCkgewotCQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKLQogI2lmZGVmIENPTkZJR19QUENfUE1BQwogCQkvKiBEaXNhYmxlIEFTSUMgY2xvY2tzIGZvciBVU0IgKi8KIAkJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKSB7CkBAIC00MDYsMTIgKzQwMywxMCBAQAogCXBjaV9zZXRfbWFzdGVyKGRldik7CiAJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAotCWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQogCWNsZWFyX2JpdChIQ0RfRkxBR19TQVdfSVJRLCAmaGNkLT5mbGFncyk7CiAKLQlpZiAoaGNkLT5kcml2ZXItPnJlc3VtZSkgewotCQlyZXR2YWwgPSBoY2QtPmRyaXZlci0+cmVzdW1lKGhjZCk7CisJaWYgKGhjZC0+ZHJpdmVyLT5wY2lfcmVzdW1lKSB7CisJCXJldHZhbCA9IGhjZC0+ZHJpdmVyLT5wY2lfcmVzdW1lKGhjZCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCiAJCQkJIlBDSSBwb3N0LXJlc3VtZSBlcnJvciAlZCFcbiIsIHJldHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCBlNTJlZDE2Li5iZjEwZTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJMHgwOSwJICAgIC8qICBfX3U4ICBiRGV2aWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KIAkweDAwLAkgICAgLyogIF9fdTggIGJEZXZpY2VTdWJDbGFzczsgKi8KLQkweDAxLCAgICAgICAvKiAgX191OCAgYkRldmljZVByb3RvY29sOyBbIHVzYiAyLjAgc2luZ2xlIFRUIF0qLworCTB4MDAsICAgICAgIC8qICBfX3U4ICBiRGV2aWNlUHJvdG9jb2w7IFsgdXNiIDIuMCBubyBUVCBdICovCiAJMHg0MCwgICAgICAgLyogIF9fdTggIGJNYXhQYWNrZXRTaXplMDsgNjQgQnl0ZXMgKi8KIAogCTB4NmIsIDB4MWQsIC8qICBfX2xlMTYgaWRWZW5kb3I7IExpbnV4IEZvdW5kYXRpb24gKi8KQEAgLTI5MSw3ICsyOTEsNiBAQAogICogcmhfc3RyaW5nIC0gcHJvdmlkZXMgbWFudWZhY3R1cmVyLCBwcm9kdWN0IGFuZCBzZXJpYWwgc3RyaW5ncyBmb3Igcm9vdCBodWIKICAqIEBpZDogdGhlIHN0cmluZyBJRCBudW1iZXIgKDE6IHNlcmlhbCBudW1iZXIsIDI6IHByb2R1Y3QsIDM6IHZlbmRvcikKICAqIEBoY2Q6IHRoZSBob3N0IGNvbnRyb2xsZXIgZm9yIHRoaXMgcm9vdCBodWIKLSAqIEB0eXBlOiBzdHJpbmcgZGVzY3JpYmluZyBvdXIgZHJpdmVyIAogICogQGRhdGE6IHJldHVybiBwYWNrZXQgaW4gVVRGLTE2IExFCiAgKiBAbGVuOiBsZW5ndGggb2YgdGhlIHJldHVybiBwYWNrZXQKICAqCkBAIC0zNTUsOSArMzU0LDEwIEBACiAJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKIAljb25zdCB1OAkqYnVmcCA9IHRidWY7CiAJaW50CQlsZW4gPSAwOwotCWludAkJcGF0Y2hfd2FrZXVwID0gMDsKIAlpbnQJCXN0YXR1czsKIAlpbnQJCW47CisJdTgJCXBhdGNoX3dha2V1cCA9IDA7CisJdTgJCXBhdGNoX3Byb3RvY29sID0gMDsKIAogCW1pZ2h0X3NsZWVwKCk7CiAKQEAgLTQzNCw2ICs0MzQsOCBAQAogCQkJZWxzZQogCQkJCWdvdG8gZXJyb3I7CiAJCQlsZW4gPSAxODsKKwkJCWlmIChoY2QtPmhhc190dCkKKwkJCQlwYXRjaF9wcm90b2NvbCA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfRFRfQ09ORklHIDw8IDg6CiAJCQlpZiAoaGNkLT5kcml2ZXItPmZsYWdzICYgSENEX1VTQjIpIHsKQEAgLTUyOCw2ICs1MzAsMTMgQEAKIAkJCQkJCWJtQXR0cmlidXRlcykpCiAJCQkoKHN0cnVjdCB1c2JfY29uZmlnX2Rlc2NyaXB0b3IgKil1YnVmKS0+Ym1BdHRyaWJ1dGVzCiAJCQkJfD0gVVNCX0NPTkZJR19BVFRfV0FLRVVQOworCisJCS8qIHJlcG9ydCB3aGV0aGVyIFJIIGhhcmR3YXJlIGhhcyBhbiBpbnRlZ3JhdGVkIFRUICovCisJCWlmIChwYXRjaF9wcm90b2NvbCAmJgorCQkJCWxlbiA+IG9mZnNldG9mKHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IsCisJCQkJCQliRGV2aWNlUHJvdG9jb2wpKQorCQkJKChzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICopIHVidWYpLT4KKwkJCQkJYkRldmljZVByb3RvY29sID0gMTsKIAl9CiAKIAkvKiBhbnkgZXJyb3JzIGdldCByZXR1cm5lZCB0aHJvdWdoIHRoZSB1cmIgY29tcGxldGlvbiAqLwpAQCAtOTE1LDE1ICs5MjQsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXZvaWQgdXNiX2VuYWJsZV9yb290X2h1Yl9pcnEgKHN0cnVjdCB1c2JfYnVzICpidXMpCi17Ci0Jc3RydWN0IHVzYl9oY2QgKmhjZDsKLQotCWhjZCA9IGNvbnRhaW5lcl9vZiAoYnVzLCBzdHJ1Y3QgdXNiX2hjZCwgc2VsZik7Ci0JaWYgKGhjZC0+ZHJpdmVyLT5odWJfaXJxX2VuYWJsZSAmJiBoY2QtPnN0YXRlICE9IEhDX1NUQVRFX0hBTFQpCi0JCWhjZC0+ZHJpdmVyLT5odWJfaXJxX2VuYWJsZSAoaGNkKTsKLX0KLQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xNjc3LDcgKzE2NzcsNiBAQAogICogdXNiX2hjZF9pcnEgLSBob29rIElSUXMgdG8gSENEIGZyYW1ld29yayAoYnVzIGdsdWUpCiAgKiBAaXJxOiB0aGUgSVJRIGJlaW5nIHJhaXNlZAogICogQF9faGNkOiBwb2ludGVyIHRvIHRoZSBIQ0Qgd2hvc2UgSVJRIGlzIGJlaW5nIHNpZ25hbGVkCi0gKiBAcjogc2F2ZWQgaGFyZHdhcmUgcmVnaXN0ZXJzCiAgKgogICogSWYgdGhlIGNvbnRyb2xsZXIgaXNuJ3QgSEFMVGVkLCBjYWxscyB0aGUgZHJpdmVyJ3MgaXJxIGhhbmRsZXIuCiAgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udHJvbGxlciBpcyBub3cgZGVhZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmggYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCmluZGV4IDJkMWMzZDVlLi4xZTRiODFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKQEAgLTI4LDcgKzI4LDcgQEAKIC8qCiAgKiBVU0IgUGFja2V0IElEcyAoUElEcykKICAqLwotI2RlZmluZSBVU0JfUElEX1VOREVGXzAJCQkweGYwCisjZGVmaW5lIFVTQl9QSURfRVhUCQkJMHhmMAkvKiBVU0IgMi4wIExQTSBFQ04gKi8KICNkZWZpbmUgVVNCX1BJRF9PVVQJCQkweGUxCiAjZGVmaW5lIFVTQl9QSURfQUNLCQkJMHhkMgogI2RlZmluZSBVU0JfUElEX0RBVEEwCQkJMHhjMwpAQCAtOTksNiArOTksNyBAQAogCXVuc2lnbmVkCQlwb2xsX3BlbmRpbmc6MTsJLyogc3RhdHVzIGhhcyBjaGFuZ2VkPyAqLwogCXVuc2lnbmVkCQl3aXJlbGVzczoxOwkvKiBXaXJlbGVzcyBVU0IgSENEICovCiAJdW5zaWduZWQJCWF1dGhvcml6ZWRfZGVmYXVsdDoxOworCXVuc2lnbmVkCQloYXNfdHQ6MTsJLyogSW50ZWdyYXRlZCBUVCBpbiByb290IGh1YiAqLwogCiAJaW50CQkJaXJxOwkJLyogaXJxIGFsbG9jYXRlZCAqLwogCXZvaWQgX19pb21lbQkJKnJlZ3M7CQkvKiBkZXZpY2UgbWVtb3J5L2lvICovCkBAIC0xNzcsMTAgKzE3OCwxMCBAQAogCSAqIGEgd2hvbGUsIG5vdCBqdXN0IHRoZSByb290IGh1YjsgdGhleSdyZSBmb3IgUENJIGJ1cyBnbHVlLgogCSAqLwogCS8qIGNhbGxlZCBhZnRlciBzdXNwZW5kaW5nIHRoZSBodWIsIGJlZm9yZSBlbnRlcmluZyBEMyBldGMgKi8KLQlpbnQJKCpzdXNwZW5kKSAoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOworCWludAkoKnBjaV9zdXNwZW5kKSAoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOwogCiAJLyogY2FsbGVkIGFmdGVyIGVudGVyaW5nIEQwIChldGMpLCBiZWZvcmUgcmVzdW1pbmcgdGhlIGh1YiAqLwotCWludAkoKnJlc3VtZSkgKHN0cnVjdCB1c2JfaGNkICpoY2QpOworCWludAkoKnBjaV9yZXN1bWUpIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKIAogCS8qIGNsZWFubHkgbWFrZSBIQ0Qgc3RvcCB3cml0aW5nIG1lbW9yeSBhbmQgZG9pbmcgSS9PICovCiAJdm9pZAkoKnN0b3ApIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKQEAgLTIwOSw4ICsyMTAsNiBAQAogCWludAkoKmJ1c19zdXNwZW5kKShzdHJ1Y3QgdXNiX2hjZCAqKTsKIAlpbnQJKCpidXNfcmVzdW1lKShzdHJ1Y3QgdXNiX2hjZCAqKTsKIAlpbnQJKCpzdGFydF9wb3J0X3Jlc2V0KShzdHJ1Y3QgdXNiX2hjZCAqLCB1bnNpZ25lZCBwb3J0X251bSk7Ci0Jdm9pZAkoKmh1Yl9pcnFfZW5hYmxlKShzdHJ1Y3QgdXNiX2hjZCAqKTsKLQkJLyogTmVlZGVkIG9ubHkgaWYgcG9ydC1jaGFuZ2UgSVJRcyBhcmUgbGV2ZWwtdHJpZ2dlcmVkICovCiAKIAkJLyogZm9yY2UgaGFuZG92ZXIgb2YgaGlnaC1zcGVlZCBwb3J0IHRvIGZ1bGwtc3BlZWQgY29tcGFuaW9uICovCiAJdm9pZAkoKnJlbGlucXVpc2hfcG9ydCkoc3RydWN0IHVzYl9oY2QgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDU3YWVjYTEuLmViNTdmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMzAsMTIgKzMwLDYgQEAKICNpbmNsdWRlICJoY2QuaCIKICNpbmNsdWRlICJodWIuaCIKIAotI2lmZGVmCUNPTkZJR19VU0JfUEVSU0lTVAotI2RlZmluZQlVU0JfUEVSU0lTVAkxCi0jZWxzZQotI2RlZmluZQlVU0JfUEVSU0lTVAkwCi0jZW5kaWYKLQogLyogaWYgd2UgYXJlIGluIGRlYnVnIG1vZGUsIGFsd2F5cyBhbm5vdW5jZSBuZXcgZGV2aWNlcyAqLwogI2lmZGVmIERFQlVHCiAjaWZuZGVmIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMKQEAgLTMzMyw2ICszMjcsMjcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgaW50IGh1Yl9wb3J0X3N0YXR1cyhzdHJ1Y3QgdXNiX2h1YiAqaHViLCBpbnQgcG9ydDEsCisJCXUxNiAqc3RhdHVzLCB1MTYgKmNoYW5nZSkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmaHViLT5zdGF0dXNfbXV0ZXgpOworCXJldCA9IGdldF9wb3J0X3N0YXR1cyhodWItPmhkZXYsIHBvcnQxLCAmaHViLT5zdGF0dXMtPnBvcnQpOworCWlmIChyZXQgPCA0KSB7CisJCWRldl9lcnIoaHViLT5pbnRmZGV2LAorCQkJIiVzIGZhaWxlZCAoZXJyID0gJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVJTzsKKwl9IGVsc2UgeworCQkqc3RhdHVzID0gbGUxNl90b19jcHUoaHViLT5zdGF0dXMtPnBvcnQud1BvcnRTdGF0dXMpOworCQkqY2hhbmdlID0gbGUxNl90b19jcHUoaHViLT5zdGF0dXMtPnBvcnQud1BvcnRDaGFuZ2UpOworCQlyZXQgPSAwOworCX0KKwltdXRleF91bmxvY2soJmh1Yi0+c3RhdHVzX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBraWNrX2todWJkKHN0cnVjdCB1c2JfaHViICpodWIpCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKQEAgLTU2MCw3ICs1NzUsNyBAQAogCXJldCA9IGdldF9odWJfc3RhdHVzKGh1Yi0+aGRldiwgJmh1Yi0+c3RhdHVzLT5odWIpOwogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyIChodWItPmludGZkZXYsCi0JCQkiJXMgZmFpbGVkIChlcnIgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJCSIlcyBmYWlsZWQgKGVyciA9ICVkKVxuIiwgX19mdW5jX18sIHJldCk7CiAJZWxzZSB7CiAJCSpzdGF0dXMgPSBsZTE2X3RvX2NwdShodWItPnN0YXR1cy0+aHViLndIdWJTdGF0dXMpOwogCQkqY2hhbmdlID0gbGUxNl90b19jcHUoaHViLT5zdGF0dXMtPmh1Yi53SHViQ2hhbmdlKTsgCkBAIC02MTAsOSArNjI1LDggQEAKIH0KIAogLyogY2FsbGVyIGhhcyBsb2NrZWQgdGhlIGh1YiBkZXZpY2UgKi8KLXN0YXRpYyBpbnQgaHViX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyB2b2lkIGh1Yl9zdG9wKHN0cnVjdCB1c2JfaHViICpodWIpCiB7Ci0Jc3RydWN0IHVzYl9odWIgKmh1YiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYgPSBodWItPmhkZXY7CiAJaW50IGk7CiAKQEAgLTYyMiw2ICs2MzYsODkgQEAKIAkJCXVzYl9kaXNjb25uZWN0KCZoZGV2LT5jaGlsZHJlbltpXSk7CiAJfQogCWh1Yl9xdWllc2NlKGh1Yik7Cit9CisKKyNkZWZpbmUgSFVCX1JFU0VUCQkxCisjZGVmaW5lIEhVQl9SRVNVTUUJCTIKKyNkZWZpbmUgSFVCX1JFU0VUX1JFU1VNRQkzCisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIHZvaWQgaHViX3Jlc3RhcnQoc3RydWN0IHVzYl9odWIgKmh1YiwgaW50IHR5cGUpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYgPSBodWItPmhkZXY7CisJaW50IHBvcnQxOworCisJLyogQ2hlY2sgZWFjaCBvZiB0aGUgY2hpbGRyZW4gdG8gc2VlIGlmIHRoZXkgcmVxdWlyZQorCSAqIFVTQi1QRVJTSVNUIGhhbmRsaW5nIG9yIGRpc2Nvbm5lY3Rpb24uICBBbHNvIGNoZWNrCisJICogZWFjaCB1bm9jY3VwaWVkIHBvcnQgdG8gbWFrZSBzdXJlIGl0IGlzIHN0aWxsIGRpc2FibGVkLgorCSAqLworCWZvciAocG9ydDEgPSAxOyBwb3J0MSA8PSBoZGV2LT5tYXhjaGlsZDsgKytwb3J0MSkgeworCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGhkZXYtPmNoaWxkcmVuW3BvcnQxLTFdOworCQlpbnQgc3RhdHVzID0gMDsKKwkJdTE2IHBvcnRzdGF0dXMsIHBvcnRjaGFuZ2U7CisKKwkJaWYgKCF1ZGV2IHx8IHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgeworCQkJaWYgKHR5cGUgIT0gSFVCX1JFU0VUKSB7CisJCQkJc3RhdHVzID0gaHViX3BvcnRfc3RhdHVzKGh1YiwgcG9ydDEsCisJCQkJCQkmcG9ydHN0YXR1cywgJnBvcnRjaGFuZ2UpOworCQkJCWlmIChzdGF0dXMgPT0gMCAmJiAocG9ydHN0YXR1cyAmCisJCQkJCQlVU0JfUE9SVF9TVEFUX0VOQUJMRSkpCisJCQkJCWNsZWFyX3BvcnRfZmVhdHVyZShoZGV2LCBwb3J0MSwKKwkJCQkJCQlVU0JfUE9SVF9GRUFUX0VOQUJMRSk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFdhcyB0aGUgcG93ZXIgc2Vzc2lvbiBsb3N0IHdoaWxlIHdlIHdlcmUgc3VzcGVuZGVkPyAqLworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBIVUJfUkVTRVRfUkVTVU1FOgorCQkJcG9ydHN0YXR1cyA9IDA7CisJCQlwb3J0Y2hhbmdlID0gVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT047CisJCQlicmVhazsKKworCQljYXNlIEhVQl9SRVNFVDoKKwkJY2FzZSBIVUJfUkVTVU1FOgorCQkJc3RhdHVzID0gaHViX3BvcnRfc3RhdHVzKGh1YiwgcG9ydDEsCisJCQkJCSZwb3J0c3RhdHVzLCAmcG9ydGNoYW5nZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEZvciAiVVNCX1BFUlNJU1QiLWVuYWJsZWQgY2hpbGRyZW4gd2UgbXVzdAorCQkgKiBtYXJrIHRoZSBjaGlsZCBkZXZpY2UgZm9yIHJlc2V0LXJlc3VtZSBhbmQKKwkJICogdHVybiBvZmYgdGhlIHZhcmlvdXMgc3RhdHVzIGNoYW5nZXMgdG8gcHJldmVudAorCQkgKiBraHViZCBmcm9tIGRpc2Nvbm5lY3RpbmcgaXQgbGF0ZXIuCisJCSAqLworCQlpZiAodWRldi0+cGVyc2lzdF9lbmFibGVkICYmIHN0YXR1cyA9PSAwICYmCisJCQkJIShwb3J0c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpKSB7CisJCQlpZiAocG9ydGNoYW5nZSAmIFVTQl9QT1JUX1NUQVRfQ19FTkFCTEUpCisJCQkJY2xlYXJfcG9ydF9mZWF0dXJlKGh1Yi0+aGRldiwgcG9ydDEsCisJCQkJCQlVU0JfUE9SVF9GRUFUX0NfRU5BQkxFKTsKKwkJCWlmIChwb3J0Y2hhbmdlICYgVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04pCisJCQkJY2xlYXJfcG9ydF9mZWF0dXJlKGh1Yi0+aGRldiwgcG9ydDEsCisJCQkJCQlVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7CisJCQl1ZGV2LT5yZXNldF9yZXN1bWUgPSAxOworCQl9CisKKwkJLyogT3RoZXJ3aXNlIGZvciBhIHJlc2V0X3Jlc3VtZSB3ZSBtdXN0IGRpc2Nvbm5lY3QgdGhlIGNoaWxkLAorCQkgKiBidXQgYXMgd2UgbWF5IG5vdCBsb2NrIHRoZSBjaGlsZCBkZXZpY2UgaGVyZQorCQkgKiB3ZSBoYXZlIHRvIGRvIGEgImxvZ2ljYWwiIGRpc2Nvbm5lY3QuCisJCSAqLworCQllbHNlIGlmICh0eXBlID09IEhVQl9SRVNFVF9SRVNVTUUpCisJCQlodWJfcG9ydF9sb2dpY2FsX2Rpc2Nvbm5lY3QoaHViLCBwb3J0MSk7CisJfQorCisJaHViX2FjdGl2YXRlKGh1Yik7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKworLyogY2FsbGVyIGhhcyBsb2NrZWQgdGhlIGh1YiBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgaHViX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2h1YiAqaHViID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCWh1Yl9zdG9wKGh1Yik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkxMCw3ICsxMDA3LDcgQEAKIAogCS8qIERpc2Nvbm5lY3QgYWxsIGNoaWxkcmVuIGFuZCBxdWllc2NlIHRoZSBodWIgKi8KIAlodWItPmVycm9yID0gMDsKLQlodWJfcHJlX3Jlc2V0KGludGYpOworCWh1Yl9zdG9wKGh1Yik7CiAKIAl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBOVUxMKTsKIApAQCAtMTA5OCwyMSArMTE5NSw0MiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9zdGF0ZV9sb2NrLCBmbGFncyk7CiB9CiAKKy8qCisgKiBXVVNCIGRldmljZXMgYXJlIHNpbXBsZTogdGhleSBoYXZlIG5vIGh1YnMgYmVoaW5kLCBzbyB0aGUgbWFwcGluZworICogZGV2aWNlIDwtPiB2aXJ0dWFsIHBvcnQgbnVtYmVyIGJlY29tZXMgMToxLiBXaHk/IHRvIHNpbXBsaWZ5IHRoZQorICogbGlmZSBvZiB0aGUgZGV2aWNlIGNvbm5lY3Rpb24gbG9naWMgaW4KKyAqIGRyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYy4gV2hlbiB3ZSBkbyB0aGUgaW5pdGlhbCBzZWNyZXQKKyAqIGhhbmRzaGFrZSB3ZSBuZWVkIHRvIGFzc2lnbiBhIHRlbXBvcmFyeSBhZGRyZXNzIGluIHRoZSB1bmF1dGhvcml6ZWQKKyAqIHNwYWNlLiBGb3Igc2ltcGxpY2l0eSB3ZSB1c2UgdGhlIGZpcnN0IHZpcnR1YWwgcG9ydCBudW1iZXIgZm91bmQgdG8KKyAqIGJlIGZyZWUgW2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYzp3dXNiaGNfZGV2Y29ubmVjdF9hY2soKV0KKyAqIGFuZCB0aGF0IGJlY29tZXMgaXQncyBhZGRyZXNzIFtYIDwgMTI4XSBvciBpdHMgdW5hdXRob3JpemVkIGFkZHJlc3MKKyAqIFtYIHwgMHg4MF0uCisgKgorICogV2UgYWRkIDEgYXMgYW4gb2Zmc2V0IHRvIHRoZSBvbmUtYmFzZWQgVVNCLXN0YWNrIHBvcnQgbnVtYmVyCisgKiAoemVyby1iYXNlZCB3dXNiIHZpcnR1YWwgcG9ydCBpbmRleCkgZm9yIHR3byByZWFzb25zOiAoYSkgZGV2IGFkZHIKKyAqIDAgaXMgcmVzZXJ2ZWQgYnkgVVNCIGZvciBkZWZhdWx0IGFkZHJlc3M7IChiKSBMaW51eCdzIFVTQiBzdGFjaworICogdXNlcyBhbHdheXMgIzEgZm9yIHRoZSByb290IGh1YiBvZiB0aGUgY29udHJvbGxlci4gU28gVVNCIHN0YWNrJ3MKKyAqIHBvcnQgIzEsIHdoaWNoIGlzIHd1c2IgdmlydHVhbC1wb3J0ICMwIGhhcyBhZGRyZXNzICMyLgorICovCiBzdGF0aWMgdm9pZCBjaG9vc2VfYWRkcmVzcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlpbnQJCWRldm51bTsKIAlzdHJ1Y3QgdXNiX2J1cwkqYnVzID0gdWRldi0+YnVzOwogCiAJLyogSWYga2h1YmQgZXZlciBiZWNvbWVzIG11bHRpdGhyZWFkZWQsIHRoaXMgd2lsbCBuZWVkIGEgbG9jayAqLwotCi0JLyogVHJ5IHRvIGFsbG9jYXRlIHRoZSBuZXh0IGRldm51bSBiZWdpbm5pbmcgYXQgYnVzLT5kZXZudW1fbmV4dC4gKi8KLQlkZXZudW0gPSBmaW5kX25leHRfemVyb19iaXQoYnVzLT5kZXZtYXAuZGV2aWNlbWFwLCAxMjgsCi0JCQlidXMtPmRldm51bV9uZXh0KTsKLQlpZiAoZGV2bnVtID49IDEyOCkKLQkJZGV2bnVtID0gZmluZF9uZXh0X3plcm9fYml0KGJ1cy0+ZGV2bWFwLmRldmljZW1hcCwgMTI4LCAxKTsKLQotCWJ1cy0+ZGV2bnVtX25leHQgPSAoIGRldm51bSA+PSAxMjcgPyAxIDogZGV2bnVtICsgMSk7Ci0KKwlpZiAodWRldi0+d3VzYikgeworCQlkZXZudW0gPSB1ZGV2LT5wb3J0bnVtICsgMTsKKwkJQlVHX09OKHRlc3RfYml0KGRldm51bSwgYnVzLT5kZXZtYXAuZGV2aWNlbWFwKSk7CisJfSBlbHNlIHsKKwkJLyogVHJ5IHRvIGFsbG9jYXRlIHRoZSBuZXh0IGRldm51bSBiZWdpbm5pbmcgYXQKKwkJICogYnVzLT5kZXZudW1fbmV4dC4gKi8KKwkJZGV2bnVtID0gZmluZF9uZXh0X3plcm9fYml0KGJ1cy0+ZGV2bWFwLmRldmljZW1hcCwgMTI4LAorCQkJCQkgICAgYnVzLT5kZXZudW1fbmV4dCk7CisJCWlmIChkZXZudW0gPj0gMTI4KQorCQkJZGV2bnVtID0gZmluZF9uZXh0X3plcm9fYml0KGJ1cy0+ZGV2bWFwLmRldmljZW1hcCwKKwkJCQkJCSAgICAxMjgsIDEpOworCQlidXMtPmRldm51bV9uZXh0ID0gKCBkZXZudW0gPj0gMTI3ID8gMSA6IGRldm51bSArIDEpOworCX0KIAlpZiAoZGV2bnVtIDwgMTI4KSB7CiAJCXNldF9iaXQoZGV2bnVtLCBidXMtPmRldm1hcC5kZXZpY2VtYXApOwogCQl1ZGV2LT5kZXZudW0gPSBkZXZudW07CkBAIC0xMTI3LDYgKzEyNDUsMTMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHVwZGF0ZV9hZGRyZXNzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgZGV2bnVtKQoreworCS8qIFRoZSBhZGRyZXNzIGZvciBhIFdVU0IgZGV2aWNlIGlzIG1hbmFnZWQgYnkgd3VzYmNvcmUuICovCisJaWYgKCF1ZGV2LT53dXNiKQorCQl1ZGV2LT5kZXZudW0gPSBkZXZudW07Cit9CisKICNpZmRlZglDT05GSUdfVVNCX1NVU1BFTkQKIAogc3RhdGljIHZvaWQgdXNiX3N0b3BfcG0oc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCkBAIC0xMTczLDcgKzEyOTgsNyBAQAogCWludAkJCWk7CiAKIAlpZiAoIXVkZXYpIHsKLQkJcHJfZGVidWcgKCIlcyBub2RldlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJfZGVidWcgKCIlcyBub2RldlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNTEwLDI4ICsxNjM1LDYgQEAKIH0KIAogCi1zdGF0aWMgaW50IGh1Yl9wb3J0X3N0YXR1cyhzdHJ1Y3QgdXNiX2h1YiAqaHViLCBpbnQgcG9ydDEsCi0JCQkgICAgICAgdTE2ICpzdGF0dXMsIHUxNiAqY2hhbmdlKQotewotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZodWItPnN0YXR1c19tdXRleCk7Ci0JcmV0ID0gZ2V0X3BvcnRfc3RhdHVzKGh1Yi0+aGRldiwgcG9ydDEsICZodWItPnN0YXR1cy0+cG9ydCk7Ci0JaWYgKHJldCA8IDQpIHsKLQkJZGV2X2VyciAoaHViLT5pbnRmZGV2LAotCQkJIiVzIGZhaWxlZCAoZXJyID0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0JCWlmIChyZXQgPj0gMCkKLQkJCXJldCA9IC1FSU87Ci0JfSBlbHNlIHsKLQkJKnN0YXR1cyA9IGxlMTZfdG9fY3B1KGh1Yi0+c3RhdHVzLT5wb3J0LndQb3J0U3RhdHVzKTsKLQkJKmNoYW5nZSA9IGxlMTZfdG9fY3B1KGh1Yi0+c3RhdHVzLT5wb3J0LndQb3J0Q2hhbmdlKTsgCi0JCXJldCA9IDA7Ci0JfQotCW11dGV4X3VubG9jaygmaHViLT5zdGF0dXNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQogLyogUmV0dXJucyAxIGlmIEBodWIgaXMgYSBXVVNCIHJvb3QgaHViLCAwIG90aGVyd2lzZSAqLwogc3RhdGljIHVuc2lnbmVkIGh1Yl9pc193dXNiKHN0cnVjdCB1c2JfaHViICpodWIpCiB7CkBAIC0xNjM3LDcgKzE3NDAsNyBAQAogCQljYXNlIDA6CiAJCQkvKiBUUlNUUkNZID0gMTAgbXM7IHBsdXMgc29tZSBleHRyYSAqLwogCQkJbXNsZWVwKDEwICsgNDApOwotCQkgIAl1ZGV2LT5kZXZudW0gPSAwOwkvKiBEZXZpY2Ugbm93IGF0IGFkZHJlc3MgMCAqLworCQkJdXBkYXRlX2FkZHJlc3ModWRldiwgMCk7CiAJCQkvKiBGQUxMIFRIUk9VR0ggKi8KIAkJY2FzZSAtRU5PVENPTk46CiAJCWNhc2UgLUVOT0RFVjoKQEAgLTE4NDIsOSArMTk0NSw4IEBACiAgKiB0aGUgaG9zdCBhbmQgdGhlIGRldmljZSBpcyB0aGUgc2FtZSBhcyBpdCB3YXMgd2hlbiB0aGUgZGV2aWNlCiAgKiBzdXNwZW5kZWQuCiAgKgotICogSWYgQ09ORklHX1VTQl9QRVJTSVNUIGFuZCBAdWRldi0+cmVzZXRfcmVzdW1lIGFyZSBib3RoIHNldCB0aGVuIHRoaXMKLSAqIHJvdXRpbmUgd29uJ3QgY2hlY2sgdGhhdCB0aGUgcG9ydCBpcyBzdGlsbCBlbmFibGVkLiAgRnVydGhlcm1vcmUsCi0gKiBpZiBAdWRldi0+cmVzZXRfcmVzdW1lIGlzIHNldCB0aGVuIGZpbmlzaF9wb3J0X3Jlc3VtZSgpIGFib3ZlIHdpbGwKKyAqIElmIEB1ZGV2LT5yZXNldF9yZXN1bWUgaXMgc2V0IHRoZW4gdGhpcyByb3V0aW5lIHdvbid0IGNoZWNrIHRoYXQgdGhlCisgKiBwb3J0IGlzIHN0aWxsIGVuYWJsZWQuICBGdXJ0aGVybW9yZSwgZmluaXNoX3BvcnRfcmVzdW1lKCkgYWJvdmUgd2lsbAogICogcmVzZXQgQHVkZXYuICBUaGUgZW5kIHJlc3VsdCBpcyB0aGF0IGEgYnJva2VuIHBvd2VyIHNlc3Npb24gY2FuIGJlCiAgKiByZWNvdmVyZWQgYW5kIEB1ZGV2IHdpbGwgYXBwZWFyIHRvIHBlcnNpc3QgYWNyb3NzIGEgbG9zcyBvZiBWQlVTIHBvd2VyLgogICoKQEAgLTE4NTYsOCArMTk1OCw4IEBACiAgKiB0byBpdCB3aWxsIGJlIGxvc3QuICBVc2luZyB0aGUgVVNCX1BFUlNJU1QgZmFjaWxpdHksIHRoZSBkZXZpY2UgY2FuIGJlCiAgKiBtYWRlIHRvIGFwcGVhciBhcyBpZiBpdCBoYWQgbm90IGRpc2Nvbm5lY3RlZC4KICAqCi0gKiBUaGlzIGZhY2lsaXR5IGlzIGluaGVyZW50bHkgZGFuZ2Vyb3VzLiAgQWx0aG91Z2ggdXNiX3Jlc2V0X2RldmljZSgpCi0gKiBtYWtlcyBldmVyeSBlZmZvcnQgdG8gaW5zdXJlIHRoYXQgdGhlIHNhbWUgZGV2aWNlIGlzIHByZXNlbnQgYWZ0ZXIgdGhlCisgKiBUaGlzIGZhY2lsaXR5IGNhbiBiZSBkYW5nZXJvdXMuICBBbHRob3VnaCB1c2JfcmVzZXRfZGV2aWNlKCkgbWFrZXMKKyAqIGV2ZXJ5IGVmZm9ydCB0byBpbnN1cmUgdGhhdCB0aGUgc2FtZSBkZXZpY2UgaXMgcHJlc2VudCBhZnRlciB0aGUKICAqIHJlc2V0IGFzIGJlZm9yZSwgaXQgY2Fubm90IHByb3ZpZGUgYSAxMDAlIGd1YXJhbnRlZS4gIEZ1cnRoZXJtb3JlIGl0J3MKICAqIHF1aXRlIHBvc3NpYmxlIGZvciBhIGRldmljZSB0byByZW1haW4gdW5hbHRlcmVkIGJ1dCBpdHMgbWVkaWEgdG8gYmUKICAqIGNoYW5nZWQuICBJZiB0aGUgdXNlciByZXBsYWNlcyBhIGZsYXNoIG1lbW9yeSBjYXJkIHdoaWxlIHRoZSBzeXN0ZW0gaXMKQEAgLTE5MDIsNyArMjAwNCw3IEBACiAJCXN0YXR1cyA9IGh1Yl9wb3J0X3N0YXR1cyhodWIsIHBvcnQxLCAmcG9ydHN0YXR1cywgJnBvcnRjaGFuZ2UpOwogCiAgU3VzcGVuZENsZWFyZWQ6Ci0JCWlmIChVU0JfUEVSU0lTVCAmJiB1ZGV2LT5yZXNldF9yZXN1bWUpCisJCWlmICh1ZGV2LT5yZXNldF9yZXN1bWUpCiAJCQl3YW50X2ZsYWdzID0gVVNCX1BPUlRfU1RBVF9QT1dFUgogCQkJCQl8IFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTjsKIAkJZWxzZQpAQCAtMTkyNyw4ICsyMDI5LDYgQEAKIAl9CiAKIAljbGVhcl9iaXQocG9ydDEsIGh1Yi0+YnVzeV9iaXRzKTsKLQlpZiAoIWh1Yi0+aGRldi0+cGFyZW50ICYmICFodWItPmJ1c3lfYml0c1swXSkKLQkJdXNiX2VuYWJsZV9yb290X2h1Yl9pcnEoaHViLT5oZGV2LT5idXMpOwogCiAJaWYgKHN0YXR1cyA9PSAwKQogCQlzdGF0dXMgPSBmaW5pc2hfcG9ydF9yZXN1bWUodWRldik7CkBAIC0yMDAwLDcgKzIxMDAsNyBAQAogCQl9CiAJfQogCi0JZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIHN0b3Aga2h1YmQgYW5kIHJlbGF0ZWQgYWN0aXZpdHkgKi8KIAlodWJfcXVpZXNjZShodWIpOwpAQCAtMjAwOSw0OSArMjEwOSwyMCBAQAogCiBzdGF0aWMgaW50IGh1Yl9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0Jc3RydWN0IHVzYl9odWIJCSpodWIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwlzdHJ1Y3QgdXNiX2h1YiAqaHViID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAotCWRldl9kYmcoJmludGYtPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JLyogdGVsbCBraHViZCB0byBsb29rIGZvciBjaGFuZ2VzIG9uIHRoaXMgaHViICovCi0JaHViX2FjdGl2YXRlKGh1Yik7CisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlodWJfcmVzdGFydChodWIsIEhVQl9SRVNVTUUpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGh1Yl9yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYl9odWIgKmh1YiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYgPSBodWItPmhkZXY7Ci0JaW50IHBvcnQxOwogCisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlodWJfcG93ZXJfb24oaHViKTsKLQotCWZvciAocG9ydDEgPSAxOyBwb3J0MSA8PSBoZGV2LT5tYXhjaGlsZDsgKytwb3J0MSkgewotCQlzdHJ1Y3QgdXNiX2RldmljZSAqY2hpbGQgPSBoZGV2LT5jaGlsZHJlbltwb3J0MS0xXTsKLQotCQlpZiAoY2hpbGQpIHsKLQotCQkJLyogRm9yICJVU0JfUEVSU0lTVCItZW5hYmxlZCBjaGlsZHJlbiB3ZSBtdXN0Ci0JCQkgKiBtYXJrIHRoZSBjaGlsZCBkZXZpY2UgZm9yIHJlc2V0LXJlc3VtZSBhbmQKLQkJCSAqIHR1cm4gb2ZmIHRoZSBjb25uZWN0LWNoYW5nZSBzdGF0dXMgdG8gcHJldmVudAotCQkJICoga2h1YmQgZnJvbSBkaXNjb25uZWN0aW5nIGl0IGxhdGVyLgotCQkJICovCi0JCQlpZiAoVVNCX1BFUlNJU1QgJiYgY2hpbGQtPnBlcnNpc3RfZW5hYmxlZCkgewotCQkJCWNoaWxkLT5yZXNldF9yZXN1bWUgPSAxOwotCQkJCWNsZWFyX3BvcnRfZmVhdHVyZShoZGV2LCBwb3J0MSwKLQkJCQkJCVVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OKTsKLQotCQkJLyogT3RoZXJ3aXNlIHdlIG11c3QgZGlzY29ubmVjdCB0aGUgY2hpbGQsCi0JCQkgKiBidXQgYXMgd2UgbWF5IG5vdCBsb2NrIHRoZSBjaGlsZCBkZXZpY2UgaGVyZQotCQkJICogd2UgaGF2ZSB0byBkbyBhICJsb2dpY2FsIiBkaXNjb25uZWN0LgotCQkJICovCi0JCQl9IGVsc2UgewotCQkJCWh1Yl9wb3J0X2xvZ2ljYWxfZGlzY29ubmVjdChodWIsIHBvcnQxKTsKLQkJCX0KLQkJfQotCX0KLQotCWh1Yl9hY3RpdmF0ZShodWIpOworCWh1Yl9yZXN0YXJ0KGh1YiwgSFVCX1JFU0VUX1JFU1VNRSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwNjEsMTAgKzIxMzIsMTAgQEAKICAqCiAgKiBUaGUgVVNCIGhvc3QgY29udHJvbGxlciBkcml2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0cyByb290IGh1YgogICogaXMgcmVzdW1lZCBhbmQgVmJ1cyBwb3dlciBoYXMgYmVlbiBpbnRlcnJ1cHRlZCBvciB0aGUgY29udHJvbGxlcgotICogaGFzIGJlZW4gcmVzZXQuICBUaGUgcm91dGluZSBtYXJrcyBAcmhkZXYgYXMgaGF2aW5nIGxvc3QgcG93ZXIuICBXaGVuCi0gKiB0aGUgaHViIGRyaXZlciBpcyByZXN1bWVkIGl0IHdpbGwgdGFrZSBub3RpY2U7IGlmIENPTkZJR19VU0JfUEVSU0lTVAotICogaXMgZW5hYmxlZCB0aGVuIGl0IHdpbGwgY2Fycnkgb3V0IHBvd2VyLXNlc3Npb24gcmVjb3ZlcnksIG90aGVyd2lzZQotICogaXQgd2lsbCBkaXNjb25uZWN0IGFsbCB0aGUgY2hpbGQgZGV2aWNlcy4KKyAqIGhhcyBiZWVuIHJlc2V0LiAgVGhlIHJvdXRpbmUgbWFya3MgQHJoZGV2IGFzIGhhdmluZyBsb3N0IHBvd2VyLgorICogV2hlbiB0aGUgaHViIGRyaXZlciBpcyByZXN1bWVkIGl0IHdpbGwgdGFrZSBub3RpY2UgYW5kIGNhcnJ5IG91dAorICogcG93ZXItc2Vzc2lvbiByZWNvdmVyeSBmb3IgYWxsIHRoZSAiVVNCLVBFUlNJU1QiLWVuYWJsZWQgY2hpbGQgZGV2aWNlczsKKyAqIHRoZSBvdGhlcnMgd2lsbCBiZSBkaXNjb25uZWN0ZWQuCiAgKi8KIHZvaWQgdXNiX3Jvb3RfaHViX2xvc3RfcG93ZXIoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2KQogewpAQCAtMjE0NywxMiArMjIxOCwxMyBAQAogCXJldHVybiBwb3J0c3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZCBlcDBfcmVpbml0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQordm9pZCB1c2JfZXAwX3JlaW5pdChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAl1c2JfZGlzYWJsZV9lbmRwb2ludCh1ZGV2LCAwICsgVVNCX0RJUl9JTik7CiAJdXNiX2Rpc2FibGVfZW5kcG9pbnQodWRldiwgMCArIFVTQl9ESVJfT1VUKTsKIAl1c2JfZW5hYmxlX2VuZHBvaW50KHVkZXYsICZ1ZGV2LT5lcDApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VwMF9yZWluaXQpOwogCiAjZGVmaW5lIHVzYl9zbmRhZGRyMHBpcGUoKQkoUElQRV9DT05UUk9MIDw8IDMwKQogI2RlZmluZSB1c2JfcmN2YWRkcjBwaXBlKCkJKChQSVBFX0NPTlRST0wgPDwgMzApIHwgVVNCX0RJUl9JTikKQEAgLTIxNzEsOSArMjI0MywxMCBAQAogCQlVU0JfUkVRX1NFVF9BRERSRVNTLCAwLCBkZXZudW0sIDAsCiAJCU5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAlpZiAocmV0dmFsID09IDApIHsKLQkJdWRldi0+ZGV2bnVtID0gZGV2bnVtOwkvKiBEZXZpY2Ugbm93IHVzaW5nIHByb3BlciBhZGRyZXNzICovCisJCS8qIERldmljZSBub3cgdXNpbmcgcHJvcGVyIGFkZHJlc3MuICovCisJCXVwZGF0ZV9hZGRyZXNzKHVkZXYsIGRldm51bSk7CiAJCXVzYl9zZXRfZGV2aWNlX3N0YXRlKHVkZXYsIFVTQl9TVEFURV9BRERSRVNTKTsKLQkJZXAwX3JlaW5pdCh1ZGV2KTsKKwkJdXNiX2VwMF9yZWluaXQodWRldik7CiAJfQogCXJldHVybiByZXR2YWw7CiB9CkBAIC0yMzU1LDI2ICsyNDI4LDMzIEBACiAjdW5kZWYgR0VUX0RFU0NSSVBUT1JfQlVGU0laRQogCQl9CiAKLQkJZm9yIChqID0gMDsgaiA8IFNFVF9BRERSRVNTX1RSSUVTOyArK2opIHsKLQkJCXJldHZhbCA9IGh1Yl9zZXRfYWRkcmVzcyh1ZGV2LCBkZXZudW0pOwotCQkJaWYgKHJldHZhbCA+PSAwKQorIAkJLyoKKyAJCSAqIElmIGRldmljZSBpcyBXVVNCLCB3ZSBhbHJlYWR5IGFzc2lnbmVkIGFuCisgCQkgKiB1bmF1dGhvcml6ZWQgYWRkcmVzcyBpbiB0aGUgQ29ubmVjdCBBY2sgc2VxdWVuY2U7CisgCQkgKiBhdXRob3JpemF0aW9uIHdpbGwgYXNzaWduIHRoZSBmaW5hbCBhZGRyZXNzLgorIAkJICovCisgCQlpZiAodWRldi0+d3VzYiA9PSAwKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgU0VUX0FERFJFU1NfVFJJRVM7ICsraikgeworCQkJCXJldHZhbCA9IGh1Yl9zZXRfYWRkcmVzcyh1ZGV2LCBkZXZudW0pOworCQkJCWlmIChyZXR2YWwgPj0gMCkKKwkJCQkJYnJlYWs7CisJCQkJbXNsZWVwKDIwMCk7CisJCQl9CisJCQlpZiAocmV0dmFsIDwgMCkgeworCQkJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCQkJImRldmljZSBub3QgYWNjZXB0aW5nIGFkZHJlc3MgJWQsIGVycm9yICVkXG4iLAorCQkJCQlkZXZudW0sIHJldHZhbCk7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQkvKiBjb3BlIHdpdGggaGFyZHdhcmUgcXVpcmtpbmVzczoKKwkJCSAqICAtIGxldCBTRVRfQUREUkVTUyBzZXR0bGUsIHNvbWUgZGV2aWNlIGhhcmR3YXJlIHdhbnRzIGl0CisJCQkgKiAgLSByZWFkIGVwMCBtYXhwYWNrZXQgZXZlbiBmb3IgaGlnaCBhbmQgbG93IHNwZWVkLAorCQkJICovCisJCQltc2xlZXAoMTApOworCQkJaWYgKFVTRV9ORVdfU0NIRU1FKHJldHJ5X2NvdW50ZXIpKQogCQkJCWJyZWFrOwotCQkJbXNsZWVwKDIwMCk7Ci0JCX0KLQkJaWYgKHJldHZhbCA8IDApIHsKLQkJCWRldl9lcnIoJnVkZXYtPmRldiwKLQkJCQkiZGV2aWNlIG5vdCBhY2NlcHRpbmcgYWRkcmVzcyAlZCwgZXJyb3IgJWRcbiIsCi0JCQkJZGV2bnVtLCByZXR2YWwpOwotCQkJZ290byBmYWlsOwotCQl9Ci0gCi0JCS8qIGNvcGUgd2l0aCBoYXJkd2FyZSBxdWlya2luZXNzOgotCQkgKiAgLSBsZXQgU0VUX0FERFJFU1Mgc2V0dGxlLCBzb21lIGRldmljZSBoYXJkd2FyZSB3YW50cyBpdAotCQkgKiAgLSByZWFkIGVwMCBtYXhwYWNrZXQgZXZlbiBmb3IgaGlnaCBhbmQgbG93IHNwZWVkLAotICAJCSAqLwotCQltc2xlZXAoMTApOwotCQlpZiAoVVNFX05FV19TQ0hFTUUocmV0cnlfY291bnRlcikpCi0JCQlicmVhazsKKyAgCQl9CiAKIAkJcmV0dmFsID0gdXNiX2dldF9kZXZpY2VfZGVzY3JpcHRvcih1ZGV2LCA4KTsKIAkJaWYgKHJldHZhbCA8IDgpIHsKQEAgLTIzOTEsNyArMjQ3MSw3IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBmYWlsOwogCi0JaSA9IHVkZXYtPmRlc2NyaXB0b3IuYk1heFBhY2tldFNpemUwID09IDB4ZmY/CisJaSA9IHVkZXYtPmRlc2NyaXB0b3IuYk1heFBhY2tldFNpemUwID09IDB4ZmY/CS8qIHd1c2IgZGV2aWNlPyAqLwogCSAgICA1MTIgOiB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMDsKIAlpZiAobGUxNl90b19jcHUodWRldi0+ZXAwLmRlc2Mud01heFBhY2tldFNpemUpICE9IGkpIHsKIAkJaWYgKHVkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9GVUxMIHx8CkBAIC0yNDAyLDcgKzI0ODIsNyBAQAogCQl9CiAJCWRldl9kYmcoJnVkZXYtPmRldiwgImVwMCBtYXhwYWNrZXQgPSAlZFxuIiwgaSk7CiAJCXVkZXYtPmVwMC5kZXNjLndNYXhQYWNrZXRTaXplID0gY3B1X3RvX2xlMTYoaSk7Ci0JCWVwMF9yZWluaXQodWRldik7CisJCXVzYl9lcDBfcmVpbml0KHVkZXYpOwogCX0KICAgCiAJcmV0dmFsID0gdXNiX2dldF9kZXZpY2VfZGVzY3JpcHRvcih1ZGV2LCBVU0JfRFRfREVWSUNFX1NJWkUpOwpAQCAtMjQxOSw3ICsyNDk5LDcgQEAKIGZhaWw6CiAJaWYgKHJldHZhbCkgewogCQlodWJfcG9ydF9kaXNhYmxlKGh1YiwgcG9ydDEsIDApOwotCQl1ZGV2LT5kZXZudW0gPSBkZXZudW07CS8qIGZvciBkaXNjb25uZWN0IHByb2Nlc3NpbmcgKi8KKwkJdXBkYXRlX2FkZHJlc3ModWRldiwgZGV2bnVtKTsJLyogZm9yIGRpc2Nvbm5lY3QgcHJvY2Vzc2luZyAqLwogCX0KIAltdXRleF91bmxvY2soJnVzYl9hZGRyZXNzMF9tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTI1NjgsNiArMjY0OCw3IEBACiAJCXVkZXYtPnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CiAgCQl1ZGV2LT5idXNfbUEgPSBodWItPm1BX3Blcl9wb3J0OwogCQl1ZGV2LT5sZXZlbCA9IGhkZXYtPmxldmVsICsgMTsKKwkJdWRldi0+d3VzYiA9IGh1Yl9pc193dXNiKGh1Yik7CiAKIAkJLyogc2V0IHRoZSBhZGRyZXNzICovCiAJCWNob29zZV9hZGRyZXNzKHVkZXYpOwpAQCAtMjY1NywxMiArMjczOCwxMyBAQAogbG9vcF9kaXNhYmxlOgogCQlodWJfcG9ydF9kaXNhYmxlKGh1YiwgcG9ydDEsIDEpOwogbG9vcDoKLQkJZXAwX3JlaW5pdCh1ZGV2KTsKKwkJdXNiX2VwMF9yZWluaXQodWRldik7CiAJCXJlbGVhc2VfYWRkcmVzcyh1ZGV2KTsKIAkJdXNiX3B1dF9kZXYodWRldik7CiAJCWlmICgoc3RhdHVzID09IC1FTk9UQ09OTikgfHwgKHN0YXR1cyA9PSAtRU5PVFNVUFApKQogCQkJYnJlYWs7CiAJfQorCWRldl9lcnIoaHViX2RldiwgInVuYWJsZSB0byBlbnVtZXJhdGUgVVNCIGRldmljZSBvbiBwb3J0ICVkXG4iLCBwb3J0MSk7CiAgCiBkb25lOgogCWh1Yl9wb3J0X2Rpc2FibGUoaHViLCBwb3J0MSwgMSk7CkBAIC0yNzI2LDcgKzI4MDgsNyBAQAogCQkvKiBJZiB0aGUgaHViIGhhcyBkaWVkLCBjbGVhbiB1cCBhZnRlciBpdCAqLwogCQlpZiAoaGRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKSB7CiAJCQlodWItPmVycm9yID0gLUVOT0RFVjsKLQkJCWh1Yl9wcmVfcmVzZXQoaW50Zik7CisJCQlodWJfc3RvcChodWIpOwogCQkJZ290byBsb29wOwogCQl9CiAKQEAgLTI4NzIsMTEgKzI5NTQsNiBAQAogCiAJCWh1Yi0+YWN0aXZhdGluZyA9IDA7CiAKLQkJLyogSWYgdGhpcyBpcyBhIHJvb3QgaHViLCB0ZWxsIHRoZSBIQ0QgaXQncyBva2F5IHRvCi0JCSAqIHJlLWVuYWJsZSBwb3J0LWNoYW5nZSBpbnRlcnJ1cHRzIG5vdy4gKi8KLQkJaWYgKCFoZGV2LT5wYXJlbnQgJiYgIWh1Yi0+YnVzeV9iaXRzWzBdKQotCQkJdXNiX2VuYWJsZV9yb290X2h1Yl9pcnEoaGRldi0+YnVzKTsKLQogbG9vcF9hdXRvcG06CiAJCS8qIEFsbG93IGF1dG9zdXNwZW5kIGlmIHdlJ3JlIG5vdCBnb2luZyB0byBydW4gYWdhaW4gKi8KIAkJaWYgKGxpc3RfZW1wdHkoJmh1Yi0+ZXZlbnRfbGlzdCkpCkBAIC0yODkwLDcgKzI5NjcsMTMgQEAKIAogc3RhdGljIGludCBodWJfdGhyZWFkKHZvaWQgKl9fdW51c2VkKQogeworCS8qIGtodWJkIG5lZWRzIHRvIGJlIGZyZWV6YWJsZSB0byBhdm9pZCBpbnRlZmVyaW5nIHdpdGggVVNCLVBFUlNJU1QKKwkgKiBwb3J0IGhhbmRvdmVyLiAgT3RoZXJ3aXNlIGl0IG1pZ2h0IHNlZSB0aGF0IGEgZnVsbC1zcGVlZCBkZXZpY2UKKwkgKiB3YXMgZ29uZSBiZWZvcmUgdGhlIEVIQ0kgY29udHJvbGxlciBoYWQgaGFuZGVkIGl0cyBwb3J0IG92ZXIgdG8KKwkgKiB0aGUgY29tcGFuaW9uIGZ1bGwtc3BlZWQgY29udHJvbGxlci4KKwkgKi8KIAlzZXRfZnJlZXphYmxlKCk7CisKIAlkbyB7CiAJCWh1Yl9ldmVudHMoKTsKIAkJd2FpdF9ldmVudF9mcmVlemFibGUoa2h1YmRfd2FpdCwKQEAgLTI5NTksMTYgKzMwNDIsMzYgQEAKIAl1c2JfZGVyZWdpc3RlcigmaHViX2RyaXZlcik7CiB9IC8qIHVzYl9odWJfY2xlYW51cCgpICovCiAKLXN0YXRpYyBpbnQgY29uZmlnX2Rlc2NyaXB0b3JzX2NoYW5nZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW50IGRlc2NyaXB0b3JzX2NoYW5nZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCXN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKm9sZF9kZXZpY2VfZGVzY3JpcHRvcikKIHsKLQl1bnNpZ25lZAkJCWluZGV4OwotCXVuc2lnbmVkCQkJbGVuID0gMDsKLQlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yCSpidWY7CisJaW50CQljaGFuZ2VkID0gMDsKKwl1bnNpZ25lZAlpbmRleDsKKwl1bnNpZ25lZAlzZXJpYWxfbGVuID0gMDsKKwl1bnNpZ25lZAlsZW47CisJdW5zaWduZWQJb2xkX2xlbmd0aDsKKwlpbnQJCWxlbmd0aDsKKwljaGFyCQkqYnVmOwogCisJaWYgKG1lbWNtcCgmdWRldi0+ZGVzY3JpcHRvciwgb2xkX2RldmljZV9kZXNjcmlwdG9yLAorCQkJc2l6ZW9mKCpvbGRfZGV2aWNlX2Rlc2NyaXB0b3IpKSAhPSAwKQorCQlyZXR1cm4gMTsKKworCS8qIFNpbmNlIHRoZSBpZFZlbmRvciwgaWRQcm9kdWN0LCBhbmQgYmNkRGV2aWNlIHZhbHVlcyBpbiB0aGUKKwkgKiBkZXZpY2UgZGVzY3JpcHRvciBoYXZlbid0IGNoYW5nZWQsIHdlIHdpbGwgYXNzdW1lIHRoZQorCSAqIE1hbnVmYWN0dXJlciBhbmQgUHJvZHVjdCBzdHJpbmdzIGhhdmVuJ3QgY2hhbmdlZCBlaXRoZXIuCisJICogQnV0IHRoZSBTZXJpYWxOdW1iZXIgc3RyaW5nIGNvdWxkIGJlIGRpZmZlcmVudCAoZS5nLiwgYQorCSAqIGRpZmZlcmVudCBmbGFzaCBjYXJkIG9mIHRoZSBzYW1lIGJyYW5kKS4KKwkgKi8KKwlpZiAodWRldi0+c2VyaWFsKQorCQlzZXJpYWxfbGVuID0gc3RybGVuKHVkZXYtPnNlcmlhbCkgKyAxOworCisJbGVuID0gc2VyaWFsX2xlbjsKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1ZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9uczsgaW5kZXgrKykgewotCQlpZiAobGVuIDwgbGUxNl90b19jcHUodWRldi0+Y29uZmlnW2luZGV4XS5kZXNjLndUb3RhbExlbmd0aCkpCi0JCQlsZW4gPSBsZTE2X3RvX2NwdSh1ZGV2LT5jb25maWdbaW5kZXhdLmRlc2Mud1RvdGFsTGVuZ3RoKTsKKwkJb2xkX2xlbmd0aCA9IGxlMTZfdG9fY3B1KHVkZXYtPmNvbmZpZ1tpbmRleF0uZGVzYy53VG90YWxMZW5ndGgpOworCQlsZW4gPSBtYXgobGVuLCBvbGRfbGVuZ3RoKTsKIAl9CisKIAlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX05PSU8pOwogCWlmIChidWYgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJubyBtZW0gdG8gcmUtcmVhZCBjb25maWdzIGFmdGVyIHJlc2V0XG4iKTsKQEAgLTI5NzYsMjUgKzMwNzksNDEgQEAKIAkJcmV0dXJuIDE7CiAJfQogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHVkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zOyBpbmRleCsrKSB7Ci0JCWludCBsZW5ndGg7Ci0JCWludCBvbGRfbGVuZ3RoID0gbGUxNl90b19jcHUodWRldi0+Y29uZmlnW2luZGV4XS5kZXNjLndUb3RhbExlbmd0aCk7Ci0KKwkJb2xkX2xlbmd0aCA9IGxlMTZfdG9fY3B1KHVkZXYtPmNvbmZpZ1tpbmRleF0uZGVzYy53VG90YWxMZW5ndGgpOwogCQlsZW5ndGggPSB1c2JfZ2V0X2Rlc2NyaXB0b3IodWRldiwgVVNCX0RUX0NPTkZJRywgaW5kZXgsIGJ1ZiwKIAkJCQlvbGRfbGVuZ3RoKTsKLQkJaWYgKGxlbmd0aCA8IG9sZF9sZW5ndGgpIHsKKwkJaWYgKGxlbmd0aCAhPSBvbGRfbGVuZ3RoKSB7CiAJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJjb25maWcgaW5kZXggJWQsIGVycm9yICVkXG4iLAogCQkJCQlpbmRleCwgbGVuZ3RoKTsKKwkJCWNoYW5nZWQgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKG1lbWNtcCAoYnVmLCB1ZGV2LT5yYXdkZXNjcmlwdG9yc1tpbmRleF0sIG9sZF9sZW5ndGgpCiAJCQkJIT0gMCkgewogCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAiY29uZmlnIGluZGV4ICVkIGNoYW5nZWQgKCMlZClcbiIsCi0JCQkJaW5kZXgsIGJ1Zi0+YkNvbmZpZ3VyYXRpb25WYWx1ZSk7CisJCQkJaW5kZXgsCisJCQkJKChzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yICopIGJ1ZiktPgorCQkJCQliQ29uZmlndXJhdGlvblZhbHVlKTsKKwkJCWNoYW5nZWQgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9CisKKwlpZiAoIWNoYW5nZWQgJiYgc2VyaWFsX2xlbikgeworCQlsZW5ndGggPSB1c2Jfc3RyaW5nKHVkZXYsIHVkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwKKwkJCQlidWYsIHNlcmlhbF9sZW4pOworCQlpZiAobGVuZ3RoICsgMSAhPSBzZXJpYWxfbGVuKSB7CisJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJzZXJpYWwgc3RyaW5nIGVycm9yICVkXG4iLAorCQkJCQlsZW5ndGgpOworCQkJY2hhbmdlZCA9IDE7CisJCX0gZWxzZSBpZiAobWVtY21wKGJ1ZiwgdWRldi0+c2VyaWFsLCBsZW5ndGgpICE9IDApIHsKKwkJCWRldl9kYmcoJnVkZXYtPmRldiwgInNlcmlhbCBzdHJpbmcgY2hhbmdlZFxuIik7CisJCQljaGFuZ2VkID0gMTsKKwkJfQorCX0KKwogCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIGluZGV4ICE9IHVkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zOworCXJldHVybiBjaGFuZ2VkOwogfQogCiAvKioKQEAgLTMwNDQsNyArMzE2Myw3IEBACiAKIAlpZiAoIXBhcmVudF9oZGV2KSB7CiAJCS8qIHRoaXMgcmVxdWlyZXMgaGNkLXNwZWNpZmljIGxvZ2ljOyBzZWUgT0hDSSBoY19yZXN0YXJ0KCkgKi8KLQkJZGV2X2RiZygmdWRldi0+ZGV2LCAiJXMgZm9yIHJvb3QgaHViIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2RiZygmdWRldi0+ZGV2LCAiJXMgZm9yIHJvb3QgaHViIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJU0RJUjsKIAl9CiAJcGFyZW50X2h1YiA9IGhkZXZfdG9faHViKHBhcmVudF9oZGV2KTsKQEAgLTMwNTQsMjEgKzMxNzMsMTggQEAKIAogCQkvKiBlcDAgbWF4cGFja2V0IHNpemUgbWF5IGNoYW5nZTsgbGV0IHRoZSBIQ0Qga25vdyBhYm91dCBpdC4KIAkJICogT3RoZXIgZW5kcG9pbnRzIHdpbGwgYmUgaGFuZGxlZCBieSByZS1lbnVtZXJhdGlvbi4gKi8KLQkJZXAwX3JlaW5pdCh1ZGV2KTsKKwkJdXNiX2VwMF9yZWluaXQodWRldik7CiAJCXJldCA9IGh1Yl9wb3J0X2luaXQocGFyZW50X2h1YiwgdWRldiwgcG9ydDEsIGkpOwogCQlpZiAocmV0ID49IDAgfHwgcmV0ID09IC1FTk9UQ09OTiB8fCByZXQgPT0gLUVOT0RFVikKIAkJCWJyZWFrOwogCX0KIAljbGVhcl9iaXQocG9ydDEsIHBhcmVudF9odWItPmJ1c3lfYml0cyk7Ci0JaWYgKCFwYXJlbnRfaGRldi0+cGFyZW50ICYmICFwYXJlbnRfaHViLT5idXN5X2JpdHNbMF0pCi0JCXVzYl9lbmFibGVfcm9vdF9odWJfaXJxKHBhcmVudF9oZGV2LT5idXMpOwogCiAJaWYgKHJldCA8IDApCiAJCWdvdG8gcmVfZW51bWVyYXRlOwogIAogCS8qIERldmljZSBtaWdodCBoYXZlIGNoYW5nZWQgZmlybXdhcmUgKERGVSBvciBzaW1pbGFyKSAqLwotCWlmIChtZW1jbXAoJnVkZXYtPmRlc2NyaXB0b3IsICZkZXNjcmlwdG9yLCBzaXplb2YgZGVzY3JpcHRvcikKLQkJCXx8IGNvbmZpZ19kZXNjcmlwdG9yc19jaGFuZ2VkICh1ZGV2KSkgeworCWlmIChkZXNjcmlwdG9yc19jaGFuZ2VkKHVkZXYsICZkZXNjcmlwdG9yKSkgewogCQlkZXZfaW5mbygmdWRldi0+ZGV2LCAiZGV2aWNlIGZpcm13YXJlIGNoYW5nZWRcbiIpOwogCQl1ZGV2LT5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsJLyogZm9yIGRpc2Nvbm5lY3QoKSBjYWxscyAqLwogCQlnb3RvIHJlX2VudW1lcmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmggYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCmluZGV4IDE1NTFhZWQuLjJhMTE2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuaApAQCAtNDEsOSArNDEsMTAgQEAKICAqLwogI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NPTk5FQ1RJT04JMAogI2RlZmluZSBVU0JfUE9SVF9GRUFUX0VOQUJMRQkJMQotI2RlZmluZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQJCTIKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9TVVNQRU5ECQkyCS8qIEwyIHN1c3BlbmQgKi8KICNkZWZpbmUgVVNCX1BPUlRfRkVBVF9PVkVSX0NVUlJFTlQJMwogI2RlZmluZSBVU0JfUE9SVF9GRUFUX1JFU0VUCQk0CisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfTDEJCTUJLyogTDEgc3VzcGVuZCAqLwogI2RlZmluZSBVU0JfUE9SVF9GRUFUX1BPV0VSCQk4CiAjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfTE9XU1BFRUQJCTkKICNkZWZpbmUgVVNCX1BPUlRfRkVBVF9ISUdIU1BFRUQJCTEwCkBAIC01NCw2ICs1NSw3IEBACiAjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ19SRVNFVAkJMjAKICNkZWZpbmUgVVNCX1BPUlRfRkVBVF9URVNUICAgICAgICAgICAgICAyMQogI2RlZmluZSBVU0JfUE9SVF9GRUFUX0lORElDQVRPUiAgICAgICAgIDIyCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfQ19QT1JUX0wxICAgICAgICAgMjMKIAogLyoKICAqIEh1YiBTdGF0dXMgYW5kIEh1YiBDaGFuZ2UgcmVzdWx0cwpAQCAtNzMsNyArNzUsOCBAQAogI2RlZmluZSBVU0JfUE9SVF9TVEFUX1NVU1BFTkQJCTB4MDAwNAogI2RlZmluZSBVU0JfUE9SVF9TVEFUX09WRVJDVVJSRU5UCTB4MDAwOAogI2RlZmluZSBVU0JfUE9SVF9TVEFUX1JFU0VUCQkweDAwMTAKLS8qIGJpdHMgNSB0byA3IGFyZSByZXNlcnZlZCAqLworI2RlZmluZSBVU0JfUE9SVF9TVEFUX0wxCQkweDAwMjAKKy8qIGJpdHMgNiB0byA3IGFyZSByZXNlcnZlZCAqLwogI2RlZmluZSBVU0JfUE9SVF9TVEFUX1BPV0VSCQkweDAxMDAKICNkZWZpbmUgVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQJCTB4MDIwMAogI2RlZmluZSBVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQgICAgICAgIDB4MDQwMApAQCAtOTEsNiArOTQsNyBAQAogI2RlZmluZSBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORAkJMHgwMDA0CiAjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVAkweDAwMDgKICNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX1JFU0VUCQkweDAwMTAKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX0wxCQkweDAwMjAKIAogLyoKICAqIHdIdWJDaGFyYWN0ZXJpc3RpY3MgKG1hc2tzKQpAQCAtMTkxLDUgKzE5NSw2IEBACiB9OwogCiBleHRlcm4gdm9pZCB1c2JfaHViX3R0X2NsZWFyX2J1ZmZlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgcGlwZSk7CitleHRlcm4gdm9pZCB1c2JfZXAwX3JlaW5pdChzdHJ1Y3QgdXNiX2RldmljZSAqKTsKIAogI2VuZGlmIC8qIF9fTElOVVhfSFVCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwppbmRleCA4M2EzNzNlLi44NjA3ODQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCkBAIC00NjMsMTMgKzQ2MywxMyBAQAogCWlub2RlID0gdXNiZnNfZ2V0X2lub2RlKHNiLCBTX0lGRElSIHwgMDc1NSwgMCk7CiAKIAlpZiAoIWlub2RlKSB7Ci0JCWRiZygiJXM6IGNvdWxkIG5vdCBnZXQgaW5vZGUhIixfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzOiBjb3VsZCBub3QgZ2V0IGlub2RlISIsX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlyb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKIAlpZiAoIXJvb3QpIHsKLQkJZGJnKCIlczogY291bGQgbm90IGdldCByb290IGRlbnRyeSEiLF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXM6IGNvdWxkIG5vdCBnZXQgcm9vdCBkZW50cnkhIixfX2Z1bmNfXyk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IGMzMTFmNjcuLmU4MTllNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkJCQkgICAgcmV0dmFsICE9IC1FQlVTWSkKIAkJCQkJZGV2X2VycigmaW8tPmRldi0+ZGV2LAogCQkJCQkJIiVzLCB1bmxpbmsgLS0+ICVkXG4iLAotCQkJCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJCQkJX19mdW5jX18sIHJldHZhbCk7CiAJCQl9IGVsc2UgaWYgKHVyYiA9PSBpby0+dXJicyBbaV0pCiAJCQkJZm91bmQgPSAxOwogCQl9CkBAIC01NTAsNyArNTUwLDcgQEAKIAkJCWlvLT51cmJzW2ldLT5kZXYgPSBOVUxMOwogCQkJaW8tPnVyYnNbaV0tPnN0YXR1cyA9IHJldHZhbDsKIAkJCWRldl9kYmcoJmlvLT5kZXYtPmRldiwgIiVzLCBzdWJtaXQgLS0+ICVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCQlfX2Z1bmNfXywgcmV0dmFsKTsKIAkJCXVzYl9zZ19jYW5jZWwoaW8pOwogCQl9CiAJCXNwaW5fbG9ja19pcnEoJmlvLT5sb2NrKTsKQEAgLTYwMCw3ICs2MDAsNyBAQAogCQkJcmV0dmFsID0gdXNiX3VubGlua191cmIoaW8tPnVyYnMgW2ldKTsKIAkJCWlmIChyZXR2YWwgIT0gLUVJTlBST0dSRVNTICYmIHJldHZhbCAhPSAtRUJVU1kpCiAJCQkJZGV2X3dhcm4oJmlvLT5kZXYtPmRldiwgIiVzLCB1bmxpbmsgLS0+ICVkXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJCV9fZnVuY19fLCByZXR2YWwpOwogCQl9CiAJCXNwaW5fbG9jaygmaW8tPmxvY2spOwogCX0KQEAgLTc4NCw3ICs3ODQsNyBAQAogCWlmIChzaXplIDw9IDAgfHwgIWJ1ZiB8fCAhaW5kZXgpCiAJCXJldHVybiAtRUlOVkFMOwogCWJ1ZlswXSA9IDA7Ci0JdGJ1ZiA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKKwl0YnVmID0ga21hbGxvYygyNTYsIEdGUF9OT0lPKTsKIAlpZiAoIXRidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMDY4LDcgKzEwNjgsNyBAQAogewogCWludCBpOwogCi0JZGV2X2RiZygmZGV2LT5kZXYsICIlcyBudWtpbmcgJXMgVVJCc1xuIiwgX19GVU5DVElPTl9fLAorCWRldl9kYmcoJmRldi0+ZGV2LCAiJXMgbnVraW5nICVzIFVSQnNcbiIsIF9fZnVuY19fLAogCQlza2lwX2VwMCA/ICJub24tZXAwIiA6ICJhbGwiKTsKIAlmb3IgKGkgPSBza2lwX2VwMDsgaSA8IDE2OyArK2kpIHsKIAkJdXNiX2Rpc2FibGVfZW5kcG9pbnQoZGV2LCBpKTsKQEAgLTEwODksOCArMTA4OSw4IEBACiAJCQkJY29udGludWU7CiAJCQlkZXZfZGJnKCZkZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgaW50ZXJmYWNlICVzXG4iLAogCQkJCWludGVyZmFjZS0+ZGV2LmJ1c19pZCk7Ci0JCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaW50ZXJmYWNlKTsKIAkJCWRldmljZV9kZWwoJmludGVyZmFjZS0+ZGV2KTsKKwkJCXVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhpbnRlcmZhY2UpOwogCQl9CiAKIAkJLyogTm93IHRoYXQgdGhlIGludGVyZmFjZXMgYXJlIHVuYm91bmQsIG5vYm9keSBzaG91bGQKQEAgLTEyMzEsNyArMTIzMSw3IEBACiAJICovCiAKIAkvKiBwcmV2ZW50IHN1Ym1pc3Npb25zIHVzaW5nIHByZXZpb3VzIGVuZHBvaW50IHNldHRpbmdzICovCi0JaWYgKGlmYWNlLT5jdXJfYWx0c2V0dGluZyAhPSBhbHQgJiYgZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmlmYWNlLT5kZXYpKQorCWlmIChpZmFjZS0+Y3VyX2FsdHNldHRpbmcgIT0gYWx0KQogCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaWZhY2UpOwogCXVzYl9kaXNhYmxlX2ludGVyZmFjZShkZXYsIGlmYWNlKTsKIApAQCAtMTMzMCw4ICsxMzMwLDcgQEAKIAkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSBjb25maWctPmludGVyZmFjZVtpXTsKIAkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OwogCi0JCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmaW50Zi0+ZGV2KSkKLQkJCXVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhpbnRmKTsKKwkJdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKGludGYpOwogCQlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgMCk7CiAKIAkJLyogTm8gYWx0c2V0dGluZyAwPyAgV2UnbGwgYXNzdW1lIHRoZSBmaXJzdCBhbHRzZXR0aW5nLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9xdWlya3MuYyBiL2RyaXZlcnMvdXNiL2NvcmUvcXVpcmtzLmMKaW5kZXggZGZjNTQxOC4uMmUyMDE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9xdWlya3MuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3F1aXJrcy5jCkBAIC05Nyw0ICs5NywxOCBAQAogCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyAhPSBVU0JfQ0xBU1NfSFVCKQogCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDE7CiAjZW5kaWYKKworCS8qIEZvciB0aGUgcHJlc2VudCwgYWxsIGRldmljZXMgZGVmYXVsdCB0byBVU0ItUEVSU0lTVCBlbmFibGVkICovCisjaWYgMAkJLyogd2FzOiAjaWZkZWYgQ09ORklHX1BNICovCisJLyogSHVicyBhcmUgYXV0b21hdGljYWxseSBlbmFibGVkIGZvciBVU0ItUEVSU0lTVCAqLworCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyA9PSBVU0JfQ0xBU1NfSFVCKQorCQl1ZGV2LT5wZXJzaXN0X2VuYWJsZWQgPSAxOworCisjZWxzZQorCS8qIEluIHRoZSBhYnNlbmNlIG9mIFBNLCB3ZSBjYW4gc2FmZWx5IGVuYWJsZSBVU0ItUEVSU0lTVAorCSAqIGZvciBhbGwgZGV2aWNlcy4gIEl0IHdpbGwgYWZmZWN0IHRoaW5ncyBsaWtlIGh1YiByZXNldHMKKwkgKiBhbmQgRU1GLXJlbGF0ZWQgcG9ydCBkaXNhYmxlcy4KKwkgKi8KKwl1ZGV2LT5wZXJzaXN0X2VuYWJsZWQgPSAxOworI2VuZGlmCS8qIENPTkZJR19QTSAqLwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jIGIvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCmluZGV4IGEzN2NjYmQuLjViMjBhNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKQEAgLTE4MCwxMSArMTgwLDkgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUih1cmJudW0sIFNfSVJVR08sIHNob3dfdXJibnVtLCBOVUxMKTsKIAogCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX1BFUlNJU1QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9TVVNQRU5EKQotc3RhdGljIGNvbnN0IGNoYXIgcG93ZXJfZ3JvdXBbXSA9ICJwb3dlciI7Ci0jZW5kaWYKKyNpZmRlZglDT05GSUdfUE0KIAotI2lmZGVmCUNPTkZJR19VU0JfUEVSU0lTVAorc3RhdGljIGNvbnN0IGNoYXIgcG93ZXJfZ3JvdXBbXSA9ICJwb3dlciI7CiAKIHN0YXRpYyBzc2l6ZV90CiBzaG93X3BlcnNpc3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMjIyLDEyICsyMjAsMTMgQEAKIAlpZiAoaXNfdXNiX2RldmljZShkZXYpKSB7CiAJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwogCi0JCS8qIEh1YnMgYXJlIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBmb3IgVVNCX1BFUlNJU1QgKi8KLQkJaWYgKHVkZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzID09IFVTQl9DTEFTU19IVUIpCi0JCQl1ZGV2LT5wZXJzaXN0X2VuYWJsZWQgPSAxOwotCQlyYyA9IHN5c2ZzX2FkZF9maWxlX3RvX2dyb3VwKCZkZXYtPmtvYmosCi0JCQkJJmRldl9hdHRyX3BlcnNpc3QuYXR0ciwKLQkJCQlwb3dlcl9ncm91cCk7CisJCS8qIEh1YnMgYXJlIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBmb3IgVVNCX1BFUlNJU1QsCisJCSAqIG5vIHBvaW50IGluIGNyZWF0aW5nIHRoZSBhdHRyaWJ1dGUgZmlsZS4KKwkJICovCisJCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyAhPSBVU0JfQ0xBU1NfSFVCKQorCQkJcmMgPSBzeXNmc19hZGRfZmlsZV90b19ncm91cCgmZGV2LT5rb2JqLAorCQkJCQkmZGV2X2F0dHJfcGVyc2lzdC5hdHRyLAorCQkJCQlwb3dlcl9ncm91cCk7CiAJfQogCXJldHVybiByYzsKIH0KQEAgLTIzOCwxMyArMjM3LDEyIEBACiAJCQkmZGV2X2F0dHJfcGVyc2lzdC5hdHRyLAogCQkJcG93ZXJfZ3JvdXApOwogfQotCiAjZWxzZQogCiAjZGVmaW5lIGFkZF9wZXJzaXN0X2F0dHJpYnV0ZXMoZGV2KQkwCiAjZGVmaW5lIHJlbW92ZV9wZXJzaXN0X2F0dHJpYnV0ZXMoZGV2KQlkbyB7fSB3aGlsZSAoMCkKIAotI2VuZGlmCS8qIENPTkZJR19VU0JfUEVSU0lTVCAqLworI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCiAjaWZkZWYJQ09ORklHX1VTQl9TVVNQRU5ECiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCmluZGV4IDlkN2U2MzIuLmMwYjFhZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwpAQCAtMzM0LDcgKzMzNCw3IEBACiAJCWRldl9kYmcoJmRldi0+ZGV2LAogCQkJImJvZ3VzIGVuZHBvaW50IGVwJWQlcyBpbiAlcyAoYmFkIG1heHBhY2tldCAlZClcbiIsCiAJCQl1c2JfZW5kcG9pbnRfbnVtKCZlcC0+ZGVzYyksIGlzX291dCA/ICJvdXQiIDogImluIiwKLQkJCV9fRlVOQ1RJT05fXywgbWF4KTsKKwkJCV9fZnVuY19fLCBtYXgpOwogCQlyZXR1cm4gLUVNU0dTSVpFOwogCX0KIApAQCAtNTkwLDYgKzU5MCwzMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2tpbGxfYW5jaG9yZWRfdXJicyk7CiAKIC8qKgorICogdXNiX3VubGlua19hbmNob3JlZF91cmJzIC0gYXN5bmNocm9ub3VzbHkgY2FuY2VsIHRyYW5zZmVyIHJlcXVlc3RzIGVuIG1hc3NlCisgKiBAYW5jaG9yOiBhbmNob3IgdGhlIHJlcXVlc3RzIGFyZSBib3VuZCB0bworICoKKyAqIHRoaXMgYWxsb3dzIGFsbCBvdXRzdGFuZGluZyBVUkJzIHRvIGJlIHVubGlua2VkIHN0YXJ0aW5nCisgKiBmcm9tIHRoZSBiYWNrIG9mIHRoZSBxdWV1ZS4gVGhpcyBmdW5jdGlvbiBpcyBhc3luY2hyb25vdXMuCisgKiBUaGUgdW5saW5raW5nIGlzIGp1c3QgdGlnZ2VyZWQuIEl0IG1heSBoYXBwZW4gYWZ0ZXIgdGhpcworICogZnVuY3Rpb24gaGFzIHJldHVybmVkLgorICovCit2b2lkIHVzYl91bmxpbmtfYW5jaG9yZWRfdXJicyhzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKQoreworCXN0cnVjdCB1cmIgKnZpY3RpbTsKKworCXNwaW5fbG9ja19pcnEoJmFuY2hvci0+bG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZhbmNob3ItPnVyYl9saXN0KSkgeworCQl2aWN0aW0gPSBsaXN0X2VudHJ5KGFuY2hvci0+dXJiX2xpc3QucHJldiwgc3RydWN0IHVyYiwKKwkJCQkgICAgYW5jaG9yX2xpc3QpOworCQkvKiB0aGlzIHdpbGwgdW5hbmNob3IgdGhlIFVSQiAqLworCQl1c2JfdW5saW5rX3VyYih2aWN0aW0pOworCX0KKwlzcGluX3VubG9ja19pcnEoJmFuY2hvci0+bG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfdW5saW5rX2FuY2hvcmVkX3VyYnMpOworCisvKioKICAqIHVzYl93YWl0X2FuY2hvcl9lbXB0eV90aW1lb3V0IC0gd2FpdCBmb3IgYW4gYW5jaG9yIHRvIGJlIHVudXNlZAogICogQGFuY2hvcjogdGhlIGFuY2hvciB5b3Ugd2FudCB0byBiZWNvbWUgdW51c2VkCiAgKiBAdGltZW91dDogaG93IGxvbmcgeW91IGFyZSB3aWxsaW5nIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oIGIvZHJpdmVycy91c2IvY29yZS91c2IuaAppbmRleCAyMzc1MTk0Li4xYmY4Y2NiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKQEAgLTExNCwxMyArMTE0LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbWFya19hY3RpdmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmYpCiB7CiAJZi0+aXNfYWN0aXZlID0gMTsKLQlmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9PTjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG1hcmtfcXVpZXNjZWQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmYpCiB7CiAJZi0+aXNfYWN0aXZlID0gMDsKLQlmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9TVVNQRU5EOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpc19hY3RpdmUoY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCmluZGV4IGQ2ODFiYjIuLmY3YjU0NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCkBAIC00NCw4ICs0NCw4IEBACiBpZiBVU0JfR0FER0VUCiAKIGNvbmZpZyBVU0JfR0FER0VUX0RFQlVHCi0JYm9vbGVhbiAiRGVidWdnaW5nIG1lc3NhZ2VzIgotCWRlcGVuZHMgb24gVVNCX0dBREdFVCAmJiBERUJVR19LRVJORUwgJiYgRVhQRVJJTUVOVEFMCisJYm9vbGVhbiAiRGVidWdnaW5nIG1lc3NhZ2VzIChERVZFTE9QTUVOVCkiCisJZGVwZW5kcyBvbiBVU0JfR0FER0VUICYmIERFQlVHX0tFUk5FTAogCWhlbHAKIAkgICBNYW55IGNvbnRyb2xsZXIgYW5kIGdhZGdldCBkcml2ZXJzIHdpbGwgcHJpbnQgc29tZSBkZWJ1Z2dpbmcKIAkgICBtZXNzYWdlcyBpZiB5b3UgdXNlIHRoaXMgb3B0aW9uIHRvIGFzayBmb3IgdGhvc2UgbWVzc2FnZXMuCkBAIC01OCw3ICs1OCw3IEBACiAJICAgcHJvZHVjdGlvbiBidWlsZC4KIAogY29uZmlnIFVTQl9HQURHRVRfREVCVUdfRklMRVMKLQlib29sZWFuICJEZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmlsZXMiCisJYm9vbGVhbiAiRGVidWdnaW5nIGluZm9ybWF0aW9uIGZpbGVzIChERVZFTE9QTUVOVCkiCiAJZGVwZW5kcyBvbiBVU0JfR0FER0VUICYmIFBST0NfRlMKIAloZWxwCiAJICAgU29tZSBvZiB0aGUgZHJpdmVycyBpbiB0aGUgImdhZGdldCIgZnJhbWV3b3JrIGNhbiBleHBvc2UKQEAgLTY5LDcgKzY5LDcgQEAKIAkgICBoZXJlLiAgSWYgaW4gZG91YnQsIG9yIHRvIGNvbnNlcnZlIGtlcm5lbCBtZW1vcnksIHNheSAiTiIuCiAKIGNvbmZpZyBVU0JfR0FER0VUX0RFQlVHX0ZTCi0JYm9vbGVhbiAiRGVidWdnaW5nIGluZm9ybWF0aW9uIGZpbGVzIGluIGRlYnVnZnMiCisJYm9vbGVhbiAiRGVidWdnaW5nIGluZm9ybWF0aW9uIGZpbGVzIGluIGRlYnVnZnMgKERFVkVMT1BNRU5UKSIKIAlkZXBlbmRzIG9uIFVTQl9HQURHRVQgJiYgREVCVUdfRlMKIAloZWxwCiAJICAgU29tZSBvZiB0aGUgZHJpdmVycyBpbiB0aGUgImdhZGdldCIgZnJhbWV3b3JrIGNhbiBleHBvc2UKQEAgLTMzNyw3ICszMzcsNyBAQAogCiBjb25maWcgVVNCX0dBREdFVF9EVU1NWV9IQ0QKIAlib29sZWFuICJEdW1teSBIQ0QgKERFVkVMT1BNRU5UKSIKLQlkZXBlbmRzIG9uIChVU0I9eSB8fCAoVVNCPW0gJiYgVVNCX0dBREdFVD1tKSkgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBVU0I9eSB8fCAoVVNCPW0gJiYgVVNCX0dBREdFVD1tKQogCXNlbGVjdCBVU0JfR0FER0VUX0RVQUxTUEVFRAogCWhlbHAKIAkgIFRoaXMgaG9zdCBjb250cm9sbGVyIGRyaXZlciBlbXVsYXRlcyBVU0IsIGxvb3BpbmcgYWxsIGRhdGEgdHJhbnNmZXIKQEAgLTQwNCw3ICs0MDQsNiBAQAogCiBjb25maWcgVVNCX1pFUk8KIAl0cmlzdGF0ZSAiR2FkZ2V0IFplcm8gKERFVkVMT1BNRU5UKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIEdhZGdldCBaZXJvIGlzIGEgdHdvLWNvbmZpZ3VyYXRpb24gZGV2aWNlLiAgSXQgZWl0aGVyIHNpbmtzIGFuZAogCSAgc291cmNlcyBidWxrIGRhdGE7IG9yIGl0IGxvb3BzIGJhY2sgYSBjb25maWd1cmFibGUgbnVtYmVyIG9mCkBAIC00NjgsOCArNDY3LDggQEAKIAkgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJnX2V0aGVyIi4KIAogY29uZmlnIFVTQl9FVEhfUk5ESVMKLQlib29sICJSTkRJUyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX0VUSCAmJiBFWFBFUklNRU5UQUwKKwlib29sICJSTkRJUyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX0VUSAogCWRlZmF1bHQgeQogCWhlbHAKIAkgICBNaWNyb3NvZnQgV2luZG93cyBYUCBidW5kbGVzIHRoZSAiUmVtb3RlIE5ESVMiIChSTkRJUykgcHJvdG9jb2wsCkBAIC00OTUsNiArNDk0LDkgQEAKIAkgIEFsbCBlbmRwb2ludHMsIHRyYW5zZmVyIHNwZWVkcywgYW5kIHRyYW5zZmVyIHR5cGVzIHN1cHBvcnRlZCBieQogCSAgdGhlIGhhcmR3YXJlIGFyZSBhdmFpbGFibGUsIHRocm91Z2ggcmVhZCgpIGFuZCB3cml0ZSgpIGNhbGxzLgogCisJICBDdXJyZW50bHksIHRoaXMgb3B0aW9uIGlzIHN0aWxsIGxhYmVsbGVkIGFzIEVYUEVSSU1FTlRBTCBiZWNhdXNlCisJICBvZiBleGlzdGluZyByYWNlIGNvbmRpdGlvbnMgaW4gdGhlIHVuZGVybHlpbmcgaW4ta2VybmVsIEFJTyBjb3JlLgorCiAJICBTYXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQgYQogCSAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImdhZGdldGZzIi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2FtZDU1MzZ1ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hbWQ1NTM2dWRjLmMKaW5kZXggYjY2M2YyMy4uZmM2ZjM0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2FtZDU1MzZ1ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYW1kNTUzNnVkYy5jCkBAIC0zMjQ4LDYgKzMyNDgsOCBAQAogCiAJLyogcGNpIHNldHVwICovCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpIDwgMCkgeworCQlrZnJlZShkZXYpOworCQlkZXYgPSAwOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGZpbmlzaGVkOwogCX0KQEAgLTMyNTksNiArMzI2MSw4IEBACiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXNvdXJjZSwgbGVuLCBuYW1lKSkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwY2kgZGV2aWNlIHVzZWQgYWxyZWFkeVxuIik7CisJCWtmcmVlKGRldik7CisJCWRldiA9IDA7CiAJCXJldHZhbCA9IC1FQlVTWTsKIAkJZ290byBmaW5pc2hlZDsKIAl9CkBAIC0zMjY3LDE4ICszMjcxLDI0IEBACiAJZGV2LT52aXJ0X2FkZHIgPSBpb3JlbWFwX25vY2FjaGUocmVzb3VyY2UsIGxlbik7CiAJaWYgKGRldi0+dmlydF9hZGRyID09IE5VTEwpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAic3RhcnQgYWRkcmVzcyBjYW5ub3QgYmUgbWFwcGVkXG4iKTsKKwkJa2ZyZWUoZGV2KTsKKwkJZGV2ID0gMDsKIAkJcmV0dmFsID0gLUVGQVVMVDsKIAkJZ290byBmaW5pc2hlZDsKIAl9CiAKIAlpZiAoIXBkZXYtPmlycSkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImlycSBub3Qgc2V0XG4iKTsKKwkJa2ZyZWUoZGV2KTsKKwkJZGV2ID0gMDsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBmaW5pc2hlZDsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCB1ZGNfaXJxLCBJUlFGX1NIQVJFRCwgbmFtZSwgZGV2KSAhPSAwKSB7CiAJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAicmVxdWVzdF9pcnEoJWQpIGZhaWxcbiIsIHBkZXYtPmlycSk7CisJCWtmcmVlKGRldik7CisJCWRldiA9IDA7CiAJCXJldHZhbCA9IC1FQlVTWTsKIAkJZ290byBmaW5pc2hlZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCmluZGV4IGZkMTVjZWQuLjliOTEzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCkBAIC0zODksNiArMzg5LDcgQEAKIAl1MzIJCWNzciA9IF9fcmF3X3JlYWRsKGNyZWcpOwogCXU4IF9faW9tZW0JKmRyZWcgPSBlcC0+Y3JlZyArIChBVDkxX1VEUF9GRFIoMCkgLSBBVDkxX1VEUF9DU1IoMCkpOwogCXVuc2lnbmVkCXRvdGFsLCBjb3VudCwgaXNfbGFzdDsKKwl1OAkJKmJ1ZjsKIAogCS8qCiAJICogVE9ETzogYWxsb3cgZm9yIHdyaXRpbmcgdHdvIHBhY2tldHMgdG8gdGhlIGZpZm8gLi4uIHRoYXQnbGwKQEAgLTQxMyw2ICs0MTQsOCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCisJYnVmID0gcmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsOworCXByZWZldGNoKGJ1Zik7CiAJdG90YWwgPSByZXEtPnJlcS5sZW5ndGggLSByZXEtPnJlcS5hY3R1YWw7CiAJaWYgKGVwLT5lcC5tYXhwYWNrZXQgPCB0b3RhbCkgewogCQljb3VudCA9IGVwLT5lcC5tYXhwYWNrZXQ7CkBAIC00MzUsNyArNDM4LDcgQEAKIAkgKiByZWNvdmVyIHdoZW4gdGhlIGFjdHVhbCBieXRlY291bnQgbWF0dGVycyAoZS5nLiBmb3IgVVNCIFRlc3QKIAkgKiBhbmQgTWVhc3VyZW1lbnQgQ2xhc3MgZGV2aWNlcykuCiAJICovCi0JX19yYXdfd3JpdGVzYihkcmVnLCByZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWwsIGNvdW50KTsKKwlfX3Jhd193cml0ZXNiKGRyZWcsIGJ1ZiwgY291bnQpOwogCWNzciAmPSB+U0VUX0ZYOwogCWNzciB8PSBDTFJfRlggfCBBVDkxX1VEUF9UWFBLVFJEWTsKIAlfX3Jhd193cml0ZWwoY3NyLCBjcmVnKTsKQEAgLTQ1Nyw3ICs0NjAsNyBAQAogCWlmIChsaXN0X2VtcHR5KCZlcC0+cXVldWUpKQogCQlyZXR1cm47CiAKLQlWREJHKCIlcyAlc1xuIiwgX19GVU5DVElPTl9fLCBlcC0+ZXAubmFtZSk7CisJVkRCRygiJXMgJXNcbiIsIF9fZnVuY19fLCBlcC0+ZXAubmFtZSk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CiAJCXJlcSA9IGxpc3RfZW50cnkoZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBhdDkxX3JlcXVlc3QsIHF1ZXVlKTsKIAkJZG9uZShlcCwgcmVxLCBzdGF0dXMpOwpAQCAtNzkyLDcgKzc5NSw3IEBACiAJaW50CQlzdGF0dXMgPSAtRUlOVkFMOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLQlEQkcoIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwlEQkcoIiVzXG4iLCBfX2Z1bmNfXyApOwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogCWlmICghdWRjLT5jbG9ja2VkIHx8ICF1ZGMtPnN1c3BlbmRlZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYwppbmRleCBjYmU0NDUzLi42NjI5MzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jCkBAIC0zNjUsMTYgKzM2NSwxNCBAQAogCQljYXNlIFVTQl9TUEVFRF9ISUdIOgogCQkJaWYgKG1heCA9PSA1MTIpCiAJCQkJYnJlYWs7Ci0JCQkvKiBjb25zZXJ2ZSByZXR1cm4gc3RhdGVtZW50cyAqLwotCQlkZWZhdWx0OgotCQkJc3dpdGNoIChtYXgpIHsKLQkJCWNhc2UgODogY2FzZSAxNjogY2FzZSAzMjogY2FzZSA2NDoKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSBVU0JfU1BFRURfRlVMTDoKKwkJCWlmIChtYXggPT0gOCB8fCBtYXggPT0gMTYgfHwgbWF4ID09IDMyIHx8IG1heCA9PSA2NCkKIAkJCQkvKiB3ZSdsbCBmYWtlIGFueSBsZWdhbCBzaXplICovCiAJCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQljYXNlIFVTQl9TUEVFRF9MT1c6Ci0JCQkJZ290byBkb25lOwotCQkJfQorCQkJLyogc2F2ZSBhIHJldHVybiBzdGF0ZW1lbnQgKi8KKwkJZGVmYXVsdDoKKwkJCWdvdG8gZG9uZTsKIAkJfQogCQlicmVhazsKIAljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKQEAgLTg5NCwxMyArODkyLDEyIEBACiB7CiAJc3RydWN0IGR1bW15CSpkdW0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWRldl9kYmcgKCZwZGV2LT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnICgmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlzcGluX2xvY2tfaXJxICgmZHVtLT5sb2NrKTsKIAlkdW0tPnVkY19zdXNwZW5kZWQgPSAxOwogCXNldF9saW5rX3N0YXRlIChkdW0pOwogCXNwaW5fdW5sb2NrX2lycSAoJmR1bS0+bG9jayk7CiAKLQlwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBzdGF0ZTsKIAl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzIChkdW1teV90b19oY2QgKGR1bSkpOwogCXJldHVybiAwOwogfQpAQCAtOTA5LDEzICs5MDYsMTIgQEAKIHsKIAlzdHJ1Y3QgZHVtbXkJKmR1bSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JZGV2X2RiZyAoJnBkZXYtPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcgKCZwZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCXNwaW5fbG9ja19pcnEgKCZkdW0tPmxvY2spOwogCWR1bS0+dWRjX3N1c3BlbmRlZCA9IDA7CiAJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CiAJc3Bpbl91bmxvY2tfaXJxICgmZHVtLT5sb2NrKTsKIAotCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyAoZHVtbXlfdG9faGNkIChkdW0pKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MTEsNyArMTcwNyw3IEBACiB7CiAJc3RydWN0IGR1bW15ICpkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7CiAKLQlkZXZfZGJnICgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnICgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7CiAJZHVtLT5yaF9zdGF0ZSA9IERVTU1ZX1JIX1NVU1BFTkRFRDsKQEAgLTE3MjYsNyArMTcyMiw3IEBACiAJc3RydWN0IGR1bW15ICpkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7CiAJaW50IHJjID0gMDsKIAotCWRldl9kYmcgKCZoY2QtPnNlbGYucm9vdF9odWItPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcgKCZoY2QtPnNlbGYucm9vdF9odWItPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxICgmZHVtLT5sb2NrKTsKIAlpZiAoIXRlc3RfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKSkgewpAQCAtMTkwMCw3ICsxODk2LDcgQEAKIAlzdHJ1Y3QgZHVtbXkJCSpkdW07CiAJaW50CQkJcmMgPSAwOwogCi0JZGV2X2RiZyAoJnBkZXYtPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcgKCZwZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEgKHBkZXYpOwogCWR1bSA9IGhjZF90b19kdW1teSAoaGNkKTsKQEAgLTE5MTYsNyArMTkxMiw3IEBACiB7CiAJc3RydWN0IHVzYl9oY2QJCSpoY2Q7CiAKLQlkZXZfZGJnICgmcGRldi0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyAoJnBkZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAloY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSAocGRldik7CiAJc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CkBAIC0xOTM3LDY5ICsxOTMzLDU3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIFRoZXNlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYmVjYXVzZSB0aGUgcGRldiBzdHJ1Y3R1cmVzIGFyZQotICogc3RhdGljYWxseSBhbGxvY2F0ZWQuICovCi1zdGF0aWMgdm9pZAotZHVtbXlfdWRjX3JlbGVhc2UgKHN0cnVjdCBkZXZpY2UgKmRldikge30KLQotc3RhdGljIHZvaWQKLWR1bW15X2hjZF9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQl0aGVfdWRjX3BkZXYgPSB7Ci0JLm5hbWUJCT0gKGNoYXIgKikgZ2FkZ2V0X25hbWUsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkucmVsZWFzZQk9IGR1bW15X3VkY19yZWxlYXNlLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZQkJdGhlX2hjZF9wZGV2ID0gewotCS5uYW1lCQk9IChjaGFyICopIGRyaXZlcl9uYW1lLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnJlbGVhc2UJPSBkdW1teV9oY2RfcmVsZWFzZSwKLQl9LAotfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0aGVfdWRjX3BkZXY7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGhlX2hjZF9wZGV2OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0ICh2b2lkKQogewotCWludAlyZXR2YWw7CisJaW50CXJldHZhbCA9IC1FTk9NRU07CiAKIAlpZiAodXNiX2Rpc2FibGVkICgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlciAoJmR1bW15X2hjZF9kcml2ZXIpOwotCWlmIChyZXR2YWwgPCAwKQorCXRoZV9oY2RfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhkcml2ZXJfbmFtZSwgLTEpOworCWlmICghdGhlX2hjZF9wZGV2KQogCQlyZXR1cm4gcmV0dmFsOworCXRoZV91ZGNfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhnYWRnZXRfbmFtZSwgLTEpOworCWlmICghdGhlX3VkY19wZGV2KQorCQlnb3RvIGVycl9hbGxvY191ZGM7CiAKLQlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgKCZkdW1teV91ZGNfZHJpdmVyKTsKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmR1bW15X2hjZF9kcml2ZXIpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycl9yZWdpc3Rlcl9oY2RfZHJpdmVyOworCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHVtbXlfdWRjX2RyaXZlcik7CiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gZXJyX3JlZ2lzdGVyX3VkY19kcml2ZXI7CiAKLQlyZXR2YWwgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIgKCZ0aGVfaGNkX3BkZXYpOworCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGQodGhlX2hjZF9wZGV2KTsKIAlpZiAocmV0dmFsIDwgMCkKLQkJZ290byBlcnJfcmVnaXN0ZXJfaGNkOwotCi0JcmV0dmFsID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyICgmdGhlX3VkY19wZGV2KTsKKwkJZ290byBlcnJfYWRkX2hjZDsKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHRoZV91ZGNfcGRldik7CiAJaWYgKHJldHZhbCA8IDApCi0JCWdvdG8gZXJyX3JlZ2lzdGVyX3VkYzsKKwkJZ290byBlcnJfYWRkX3VkYzsKIAlyZXR1cm4gcmV0dmFsOwogCi1lcnJfcmVnaXN0ZXJfdWRjOgotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyICgmdGhlX2hjZF9wZGV2KTsKLWVycl9yZWdpc3Rlcl9oY2Q6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIgKCZkdW1teV91ZGNfZHJpdmVyKTsKK2Vycl9hZGRfdWRjOgorCXBsYXRmb3JtX2RldmljZV9kZWwodGhlX2hjZF9wZGV2KTsKK2Vycl9hZGRfaGNkOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkdW1teV91ZGNfZHJpdmVyKTsKIGVycl9yZWdpc3Rlcl91ZGNfZHJpdmVyOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyICgmZHVtbXlfaGNkX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR1bW15X2hjZF9kcml2ZXIpOworZXJyX3JlZ2lzdGVyX2hjZF9kcml2ZXI6CisJcGxhdGZvcm1fZGV2aWNlX3B1dCh0aGVfdWRjX3BkZXYpOworZXJyX2FsbG9jX3VkYzoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHRoZV9oY2RfcGRldik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIG1vZHVsZV9pbml0IChpbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXAgKHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIgKCZ0aGVfdWRjX3BkZXYpOwotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyICgmdGhlX2hjZF9wZGV2KTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlciAoJmR1bW15X3VkY19kcml2ZXIpOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyICgmZHVtbXlfaGNkX2RyaXZlcik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodGhlX3VkY19wZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0aGVfaGNkX3BkZXYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkdW1teV91ZGNfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHVtbXlfaGNkX2RyaXZlcik7CiB9CiBtb2R1bGVfZXhpdCAoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYwppbmRleCBmOWQwNzEwLi44YmRhZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKQEAgLTM0LDEyICszNCwxMiBAQAogCiAKIC8qIHdlIG11c3QgYXNzaWduIGFkZHJlc3NlcyBmb3IgY29uZmlndXJhYmxlIGVuZHBvaW50cyAobGlrZSBuZXQyMjgwKSAqLwotc3RhdGljIF9fZGV2aW5pdGRhdGEgdW5zaWduZWQgZXBudW07CitzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBlcG51bTsKIAogLy8gI2RlZmluZSBNQU5ZX0VORFBPSU5UUwogI2lmZGVmIE1BTllfRU5EUE9JTlRTCiAvKiBtb3JlIHRoYW4gMTUgY29uZmlndXJhYmxlIGVuZHBvaW50cyAqLwotc3RhdGljIF9fZGV2aW5pdGRhdGEgdW5zaWduZWQgaW5fZXBudW07CitzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBpbl9lcG51bTsKICNlbmRpZgogCiAKQEAgLTU5LDcgKzU5LDcgQEAKICAqIE5PVEU6ICBlYWNoIGVuZHBvaW50IGlzIHVuaWRpcmVjdGlvbmFsLCBhcyBzcGVjaWZpZWQgYnkgaXRzIFVTQgogICogZGVzY3JpcHRvcjsgYW5kIGlzbid0IHNwZWNpZmljIHRvIGEgY29uZmlndXJhdGlvbiBvciBhbHRzZXR0aW5nLgogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdAorc3RhdGljIGludCBfX2luaXQKIGVwX21hdGNoZXMgKAogCXN0cnVjdCB1c2JfZ2FkZ2V0CQkqZ2FkZ2V0LAogCXN0cnVjdCB1c2JfZXAJCQkqZXAsCkBAIC0xODYsNyArMTg2LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCB1c2JfZXAgKiBfX2RldmluaXQKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VwICogX19pbml0CiBmaW5kX2VwIChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCB1c2JfZXAJKmVwOwpAQCAtMjI4LDcgKzIyOCw3IEBACiAgKgogICogT24gZmFpbHVyZSwgdGhpcyByZXR1cm5zIGEgbnVsbCBlbmRwb2ludCBkZXNjcmlwdG9yLgogICovCi1zdHJ1Y3QgdXNiX2VwICogX19kZXZpbml0IHVzYl9lcF9hdXRvY29uZmlnICgKK3N0cnVjdCB1c2JfZXAgKiBfX2luaXQgdXNiX2VwX2F1dG9jb25maWcgKAogCXN0cnVjdCB1c2JfZ2FkZ2V0CQkqZ2FkZ2V0LAogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqZGVzYwogKQpAQCAtMjk1LDcgKzI5NSw3IEBACiAgKiBzdGF0ZSBzdWNoIGFzIGVwLT5kcml2ZXJfZGF0YSBhbmQgdGhlIHJlY29yZCBvZiBhc3NpZ25lZCBlbmRwb2ludHMKICAqIHVzZWQgYnkgdXNiX2VwX2F1dG9jb25maWcoKS4KICAqLwotdm9pZCBfX2RldmluaXQgdXNiX2VwX2F1dG9jb25maWdfcmVzZXQgKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit2b2lkIF9faW5pdCB1c2JfZXBfYXV0b2NvbmZpZ19yZXNldCAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKIHsKIAlzdHJ1Y3QgdXNiX2VwCSplcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwppbmRleCBlOTk4NzIzLi5iYjkzYmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKIAlpZiAoZGV2LT5jb25maWcgPT0gMCkKIAkJcmV0dXJuOwogCi0JREVCVUcgKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURFQlVHIChkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2LT5uZXQpOwogCW5ldGlmX2NhcnJpZXJfb2ZmIChkZXYtPm5ldCk7CkBAIC0xMjYzLDcgKzEyNjMsNyBAQAogCXN0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbgkqZXZlbnQ7CiAJaW50CQkJCXZhbHVlOwogCi0JREVCVUcgKGRldiwgIiVzLCBmbHVzaCBvbGQgc3RhdHVzIGZpcnN0XG4iLCBfX0ZVTkNUSU9OX18pOworCURFQlVHIChkZXYsICIlcywgZmx1c2ggb2xkIHN0YXR1cyBmaXJzdFxuIiwgX19mdW5jX18pOwogCiAJLyogZmx1c2ggb2xkIHN0YXR1cwogCSAqCkBAIC0xMzI5LDcgKzEzMjksNyBAQAogCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKIAlzdGF0dXMgPSBybmRpc19tc2dfcGFyc2VyIChkZXYtPnJuZGlzX2NvbmZpZywgKHU4ICopIHJlcS0+YnVmKTsKIAlpZiAoc3RhdHVzIDwgMCkKLQkJRVJST1IoZGV2LCAiJXM6IHJuZGlzIHBhcnNlIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCUVSUk9SKGRldiwgIiVzOiBybmRpcyBwYXJzZSBlcnJvciAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CiB9CiAKQEAgLTIxMTMsNyArMjExMyw3IEBACiAKIHN0YXRpYyB2b2lkIGV0aF9zdGFydCAoc3RydWN0IGV0aF9kZXYgKmRldiwgZ2ZwX3QgZ2ZwX2ZsYWdzKQogewotCURFQlVHIChkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlERUJVRyAoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIGZpbGwgdGhlIHJ4IHF1ZXVlICovCiAJcnhfZmlsbCAoZGV2LCBnZnBfZmxhZ3MpOwpAQCAtMjEzMyw3ICsyMTMzLDcgQEAKIHsKIAlzdHJ1Y3QgZXRoX2RldgkJKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKLQlERUJVRyAoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREVCVUcgKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJaWYgKG5ldGlmX2NhcnJpZXJfb2sgKGRldi0+bmV0KSkKIAkJZXRoX3N0YXJ0IChkZXYsIEdGUF9LRVJORUwpOwogCXJldHVybiAwOwpAQCAtMjE0Myw3ICsyMTQzLDcgQEAKIHsKIAlzdHJ1Y3QgZXRoX2RldgkJKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKLQlWREVCVUcgKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCVZERUJVRyAoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAluZXRpZl9zdG9wX3F1ZXVlIChuZXQpOwogCiAJREVCVUcgKGRldiwgInN0b3Agc3RhdHM6IHJ4L3R4ICVsZC8lbGQsIGVycnMgJWxkLyVsZFxuIiwKQEAgLTIyMjksNyArMjIyOSw3IEBACiAJc2V0X2dhZGdldF9kYXRhIChnYWRnZXQsIE5VTEwpOwogfQogCi1zdGF0aWMgdTggX19kZXZpbml0IG5pYmJsZSAodW5zaWduZWQgY2hhciBjKQorc3RhdGljIHU4IF9faW5pdCBuaWJibGUgKHVuc2lnbmVkIGNoYXIgYykKIHsKIAlpZiAobGlrZWx5IChpc2RpZ2l0IChjKSkpCiAJCXJldHVybiBjIC0gJzAnOwpAQCAtMjIzOSw3ICsyMjM5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgZ2V0X2V0aGVyX2FkZHIoY29uc3QgY2hhciAqc3RyLCB1OCAqZGV2X2FkZHIpCitzdGF0aWMgaW50IF9faW5pdCBnZXRfZXRoZXJfYWRkcihjb25zdCBjaGFyICpzdHIsIHU4ICpkZXZfYWRkcikKIHsKIAlpZiAoc3RyKSB7CiAJCXVuc2lnbmVkCWk7CkBAIC0yMjYwLDcgKzIyNjAsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdAorc3RhdGljIGludCBfX2luaXQKIGV0aF9iaW5kIChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQogewogCXN0cnVjdCBldGhfZGV2CQkqZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCmluZGV4IDAxN2ExOTYuLmJmM2Y5NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKQEAgLTY0NCw3ICs2NDQsNyBAQAogCiAJdW5zaWduZWQgbG9uZwkJYXRvbWljX2JpdGZsYWdzOwogI2RlZmluZSBSRUdJU1RFUkVECQkwCi0jZGVmaW5lIENMRUFSX0JVTEtfSEFMVFMJMQorI2RlZmluZSBJR05PUkVfQlVMS19PVVQJCTEKICNkZWZpbmUgU1VTUEVOREVECQkyCiAKIAlzdHJ1Y3QgdXNiX2VwCQkqYnVsa19pbjsKQEAgLTExMDQsNyArMTEwNCw3IEBACiAJaWYgKHJlcS0+YWN0dWFsID4gMCkKIAkJZHVtcF9tc2coZnNnLCBmc2ctPmVwMHJlcV9uYW1lLCByZXEtPmJ1ZiwgcmVxLT5hY3R1YWwpOwogCWlmIChyZXEtPnN0YXR1cyB8fCByZXEtPmFjdHVhbCAhPSByZXEtPmxlbmd0aCkKLQkJREJHKGZzZywgIiVzIC0tPiAlZCwgJXUvJXVcbiIsIF9fRlVOQ1RJT05fXywKKwkJREJHKGZzZywgIiVzIC0tPiAlZCwgJXUvJXVcbiIsIF9fZnVuY19fLAogCQkJCXJlcS0+c3RhdHVzLCByZXEtPmFjdHVhbCwgcmVxLT5sZW5ndGgpOwogCWlmIChyZXEtPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkJCS8vIFJlcXVlc3Qgd2FzIGNhbmNlbGxlZAogCQl1c2JfZXBfZmlmb19mbHVzaChlcCk7CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogCXN0cnVjdCBmc2dfYnVmZmhkCSpiaCA9IHJlcS0+Y29udGV4dDsKIAogCWlmIChyZXEtPnN0YXR1cyB8fCByZXEtPmFjdHVhbCAhPSByZXEtPmxlbmd0aCkKLQkJREJHKGZzZywgIiVzIC0tPiAlZCwgJXUvJXVcbiIsIF9fRlVOQ1RJT05fXywKKwkJREJHKGZzZywgIiVzIC0tPiAlZCwgJXUvJXVcbiIsIF9fZnVuY19fLAogCQkJCXJlcS0+c3RhdHVzLCByZXEtPmFjdHVhbCwgcmVxLT5sZW5ndGgpOwogCWlmIChyZXEtPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkJCS8vIFJlcXVlc3Qgd2FzIGNhbmNlbGxlZAogCQl1c2JfZXBfZmlmb19mbHVzaChlcCk7CkBAIC0xMTQ2LDcgKzExNDYsNyBAQAogCiAJZHVtcF9tc2coZnNnLCAiYnVsay1vdXQiLCByZXEtPmJ1ZiwgcmVxLT5hY3R1YWwpOwogCWlmIChyZXEtPnN0YXR1cyB8fCByZXEtPmFjdHVhbCAhPSBiaC0+YnVsa19vdXRfaW50ZW5kZWRfbGVuZ3RoKQotCQlEQkcoZnNnLCAiJXMgLS0+ICVkLCAldS8ldVxuIiwgX19GVU5DVElPTl9fLAorCQlEQkcoZnNnLCAiJXMgLS0+ICVkLCAldS8ldVxuIiwgX19mdW5jX18sCiAJCQkJcmVxLT5zdGF0dXMsIHJlcS0+YWN0dWFsLAogCQkJCWJoLT5idWxrX291dF9pbnRlbmRlZF9sZW5ndGgpOwogCWlmIChyZXEtPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkJCS8vIFJlcXVlc3Qgd2FzIGNhbmNlbGxlZApAQCAtMTE2OSw3ICsxMTY5LDcgQEAKIAlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmggPSByZXEtPmNvbnRleHQ7CiAKIAlpZiAocmVxLT5zdGF0dXMgfHwgcmVxLT5hY3R1YWwgIT0gcmVxLT5sZW5ndGgpCi0JCURCRyhmc2csICIlcyAtLT4gJWQsICV1LyV1XG4iLCBfX0ZVTkNUSU9OX18sCisJCURCRyhmc2csICIlcyAtLT4gJWQsICV1LyV1XG4iLCBfX2Z1bmNfXywKIAkJCQlyZXEtPnN0YXR1cywgcmVxLT5hY3R1YWwsIHJlcS0+bGVuZ3RoKTsKIAlpZiAocmVxLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpCQkvLyBSZXF1ZXN0IHdhcyBjYW5jZWxsZWQKIAkJdXNiX2VwX2ZpZm9fZmx1c2goZXApOwpAQCAtMjkzNiw4ICsyOTM2LDggQEAKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcSA9IGJoLT5vdXRyZXE7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcAkqY2J3ID0gcmVxLT5idWY7CiAKLQkvKiBXYXMgdGhpcyBhIHJlYWwgcGFja2V0PyAqLwotCWlmIChyZXEtPnN0YXR1cykKKwkvKiBXYXMgdGhpcyBhIHJlYWwgcGFja2V0PyAgU2hvdWxkIGl0IGJlIGlnbm9yZWQ/ICovCisJaWYgKHJlcS0+c3RhdHVzIHx8IHRlc3RfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBJcyB0aGUgQ0JXIHZhbGlkPyAqLwpAQCAtMjk0OCwxMyArMjk0OCwxNyBAQAogCQkJCXJlcS0+YWN0dWFsLAogCQkJCWxlMzJfdG9fY3B1KGNidy0+U2lnbmF0dXJlKSk7CiAKLQkJLyogVGhlIEJ1bGstb25seSBzcGVjIHNheXMgd2UgTVVTVCBzdGFsbCB0aGUgYnVsayBwaXBlcyEKLQkJICogSWYgd2Ugd2FudCB0byBhdm9pZCBzdGFsbHMsIHNldCBhIGZsYWcgc28gdGhhdCB3ZSB3aWxsCi0JCSAqIGNsZWFyIHRoZSBlbmRwb2ludCBoYWx0cyBhdCB0aGUgbmV4dCByZXNldC4gKi8KLQkJaWYgKCFtb2RfZGF0YS5jYW5fc3RhbGwpCi0JCQlzZXRfYml0KENMRUFSX0JVTEtfSEFMVFMsICZmc2ctPmF0b21pY19iaXRmbGFncyk7Ci0JCWZzZ19zZXRfaGFsdChmc2csIGZzZy0+YnVsa19vdXQpOworCQkvKiBUaGUgQnVsay1vbmx5IHNwZWMgc2F5cyB3ZSBNVVNUIHN0YWxsIHRoZSBJTiBlbmRwb2ludAorCQkgKiAoNi42LjEpLCBzbyBpdCdzIHVuYXZvaWRhYmxlLiAgSXQgYWxzbyBzYXlzIHdlIG11c3QKKwkJICogcmV0YWluIHRoaXMgc3RhdGUgdW50aWwgdGhlIG5leHQgcmVzZXQsIGJ1dCB0aGVyZSdzCisJCSAqIG5vIHdheSB0byB0ZWxsIHRoZSBjb250cm9sbGVyIGRyaXZlciBpdCBzaG91bGQgaWdub3JlCisJCSAqIENsZWFyLUZlYXR1cmUoSEFMVCkgcmVxdWVzdHMuCisJCSAqCisJCSAqIFdlIGFyZW4ndCByZXF1aXJlZCB0byBoYWx0IHRoZSBPVVQgZW5kcG9pbnQ7IGluc3RlYWQKKwkJICogd2UgY2FuIHNpbXBseSBhY2NlcHQgYW5kIGRpc2NhcmQgYW55IGRhdGEgcmVjZWl2ZWQKKwkJICogdW50aWwgdGhlIG5leHQgcmVzZXQuICovCiAJCWhhbHRfYnVsa19pbl9lbmRwb2ludChmc2cpOworCQlzZXRfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMTQwLDYgKzMxNDQsNyBAQAogCQlnb3RvIHJlc2V0OwogCWZzZy0+YnVsa19vdXRfZW5hYmxlZCA9IDE7CiAJZnNnLT5idWxrX291dF9tYXhwYWNrZXQgPSBsZTE2X3RvX2NwdShkLT53TWF4UGFja2V0U2l6ZSk7CisJY2xlYXJfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKTsKIAogCWlmICh0cmFuc3BvcnRfaXNfY2JpKCkpIHsKIAkJZCA9IGVwX2Rlc2MoZnNnLT5nYWRnZXQsICZmc19pbnRyX2luX2Rlc2MsICZoc19pbnRyX2luX2Rlc2MpOwpAQCAtMzMyMSwxMSArMzMyNiw4IEBACiAJCS8qIEluIGNhc2Ugd2Ugd2VyZSBmb3JjZWQgYWdhaW5zdCBvdXIgd2lsbCB0byBoYWx0IGEKIAkJICogYnVsayBlbmRwb2ludCwgY2xlYXIgdGhlIGhhbHQgbm93LiAgKFRoZSBTdXBlckggVURDCiAJCSAqIHJlcXVpcmVzIHRoaXMuKSAqLwotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENMRUFSX0JVTEtfSEFMVFMsCi0JCQkJJmZzZy0+YXRvbWljX2JpdGZsYWdzKSkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKSkKIAkJCXVzYl9lcF9jbGVhcl9oYWx0KGZzZy0+YnVsa19pbik7Ci0JCQl1c2JfZXBfY2xlYXJfaGFsdChmc2ctPmJ1bGtfb3V0KTsKLQkJfQogCiAJCWlmICh0cmFuc3BvcnRfaXNfYmJiKCkpIHsKIAkJCWlmIChmc2ctPmVwMF9yZXFfdGFnID09IGV4Y2VwdGlvbl9yZXFfdGFnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5jCmluZGV4IDI1NDAxMmEuLjY1MWI4MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmMKQEAgLTc3MywxMSArNzczLDExIEBACiAJLyogY2F0Y2ggdmFyaW91cyBib2d1cyBwYXJhbWV0ZXJzICovCiAJaWYgKCFfcmVxIHx8ICFyZXEtPnJlcS5jb21wbGV0ZSB8fCAhcmVxLT5yZXEuYnVmCiAJCQl8fCAhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpIHsKLQkJVkRCRygiJXMsIGJhZCBwYXJhbXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVZEQkcoIiVzLCBiYWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAodW5saWtlbHkoIV9lcCB8fCAhZXAtPmRlc2MpKSB7Ci0JCVZEQkcoIiVzLCBiYWQgZXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVZEQkcoIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChlcC0+ZGVzYy0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuaAppbmRleCA5ZmIwYjFlLi45OGIxNDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5oCkBAIC01MTIsNyArNTEyLDcgQEAKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pIAlwcmludGsoS0VSTl9ERUJVRyAiWyVzXSAgIiBmbXQgIlxuIiwgXAotCQkJCV9fRlVOQ1RJT05fXywgIyMgYXJncykKKwkJCQlfX2Z1bmNfXywgIyMgYXJncykKICNlbHNlCiAjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pCWRve313aGlsZSgwKQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jCmluZGV4IDViNDJjY2QuLmZmM2E4NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jCkBAIC0xMTQ5LDcgKzExNDksNyBAQAogLyoKICAqIENyZWF0ZXMgYW4gb3V0cHV0IGVuZHBvaW50LCBhbmQgaW5pdGlhbGl6ZXMgb3V0cHV0IHBvcnRzLgogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBnbWlkaV9iaW5kKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCitzdGF0aWMgaW50IF9faW5pdCBnbWlkaV9iaW5kKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCiB7CiAJc3RydWN0IGdtaWRpX2RldmljZSAqZGV2OwogCXN0cnVjdCB1c2JfZXAgKmluX2VwLCAqb3V0X2VwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYwppbmRleCBkM2U3MDI1Li42NGE1OTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYwpAQCAtNjkyLDcgKzY5Miw3IEBACiAJcmVxLT5yZXEuYWN0dWFsID0gKGN1cnIgLSByZXEtPnJlcS5kbWEpICsgMTsKIAlyZXEtPnJlcS5zdGF0dXMgPSBzdGF0dXM7CiAKLQlWREJHKGVwLT5kZXYsICIlcyAlcyAlcyAlZC8lZFxuIiwgX19GVU5DVElPTl9fLCBlcC0+ZXAubmFtZSwKKwlWREJHKGVwLT5kZXYsICIlcyAlcyAlcyAlZC8lZFxuIiwgX19mdW5jX18sIGVwLT5lcC5uYW1lLAogCQllcC0+aXNfaW4gPyAiSU4iIDogIk9VVCIsCiAJCXJlcS0+cmVxLmFjdHVhbCwgcmVxLT5yZXEubGVuZ3RoKTsKIApAQCAtODI2LDcgKzgyNiw3IEBACiAJaWYgKGRldi0+ZXAwc3RhdGUgPT0gRVAwX1NVU1BFTkQpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlWREJHKGRldiwgIiVzICVzICVzICVzICVwXG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSwKKwlWREJHKGRldiwgIiVzICVzICVzICVzICVwXG4iLCBfX2Z1bmNfXywgX2VwLT5uYW1lLAogCQllcC0+aXNfaW4gPyAiSU4iIDogIk9VVCIsCiAJCWVwLT5kbWEgPyAiZG1hIiA6ICJwaW8iLAogCQlfcmVxKTsKQEAgLTg5OCw3ICs4OTgsNyBAQAogCiAJLyogZG9uJ3QgY2hhbmdlIEVQeFNUQVRVU19FUF9JTlZBTElEIHRvIFJFQURZICovCiAJfSBlbHNlIGlmICghZXAtPmRlc2MpIHsKLQkJREJHKGVwLT5kZXYsICIlcyAlcyBpbmFjdGl2ZT9cbiIsIF9fRlVOQ1RJT05fXywgZXAtPmVwLm5hbWUpOworCQlEQkcoZXAtPmRldiwgIiVzICVzIGluYWN0aXZlP1xuIiwgX19mdW5jX18sIGVwLT5lcC5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC05NDAsNyArOTQwLDcgQEAKIAlyZWdzID0gZXAtPmRldi0+cmVnczsKIAlzaXplID0gcmVhZGwoJnJlZ3MtPkVQeFNpemVMQVtlcC0+bnVtXSkgJiBEQVRBU0laRTsKIAlzaXplICs9IHJlYWRsKCZyZWdzLT5FUHhTaXplTEJbZXAtPm51bV0pICYgREFUQVNJWkU7Ci0JVkRCRyhlcC0+ZGV2LCAiJXMgJXMgJXVcbiIsIF9fRlVOQ1RJT05fXywgZXAtPmVwLm5hbWUsIHNpemUpOworCVZEQkcoZXAtPmRldiwgIiVzICVzICV1XG4iLCBfX2Z1bmNfXywgZXAtPmVwLm5hbWUsIHNpemUpOwogCXJldHVybiBzaXplOwogfQogCkBAIC05NTMsMTEgKzk1MywxMSBAQAogCWlmICghX2VwKQogCQlyZXR1cm47CiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgZ29rdV9lcCwgZXApOwotCVZEQkcoZXAtPmRldiwgIiVzICVzXG4iLCBfX0ZVTkNUSU9OX18sIGVwLT5lcC5uYW1lKTsKKwlWREJHKGVwLT5kZXYsICIlcyAlc1xuIiwgX19mdW5jX18sIGVwLT5lcC5uYW1lKTsKIAogCS8qIGRvbid0IGNoYW5nZSBFUHhTVEFUVVNfRVBfSU5WQUxJRCB0byBSRUFEWSAqLwogCWlmICghZXAtPmRlc2MgJiYgZXAtPm51bSAhPSAwKSB7Ci0JCURCRyhlcC0+ZGV2LCAiJXMgJXMgaW5hY3RpdmU/XG4iLCBfX0ZVTkNUSU9OX18sIGVwLT5lcC5uYW1lKTsKKwkJREJHKGVwLT5kZXYsICIlcyAlcyBpbmFjdGl2ZT9cbiIsIF9fZnVuY19fLCBlcC0+ZXAubmFtZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyODYsNyArMTI4Niw3IEBACiAJc3RydWN0IGdva3VfdWRjX3JlZ3MgX19pb21lbQkqcmVncyA9IGRldi0+cmVnczsKIAl1bnNpZ25lZAkJCWk7CiAKLQlWREJHKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCVZEQkcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCXVkY19yZXNldChkZXYpOwogCXVkY19yZWluaXQgKGRldik7CkBAIC0xMzIyLDcgKzEzMjIsNyBAQAogCWlmIChyZWFkbCgmZGV2LT5yZWdzLT5wb3dlcl9kZXRlY3QpICYgUFdfREVURUNUKQogCQllcDBfc3RhcnQoZGV2KTsKIAllbHNlIHsKLQkJREJHKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAkJZGV2LT5pbnRfZW5hYmxlID0gSU5UX1BXUkRFVEVDVDsKIAkJd3JpdGVsKGRldi0+aW50X2VuYWJsZSwgJmRldi0+cmVncy0+aW50X2VuYWJsZSk7CiAJfQpAQCAtMTM4Nyw3ICsxMzg3LDcgQEAKIHsKIAl1bnNpZ25lZAlpOwogCi0JREJHIChkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEQkcgKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pCiAJCWRyaXZlciA9IE5VTEw7CkBAIC0xNzI2LDcgKzE3MjYsNyBAQAogewogCXN0cnVjdCBnb2t1X3VkYwkJKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCURCRyhkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEQkcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCUJVR19PTihkZXYtPmRyaXZlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKaW5kZXggMGE2ZmVhZi4uNjliMGEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKQEAgLTExMDcsMTMgKzExMDcsMTMgQEAKIAogCXN3aXRjaCAoc3RhdGUpIHsKIAlkZWZhdWx0OgotCQlEQkcgKGRldiwgImZhaWwgJXMsIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKKwkJREJHIChkZXYsICJmYWlsICVzLCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKIAkJcmV0dmFsID0gLUVTUkNIOwogCQlicmVhazsKIAljYXNlIFNUQVRFX0RFVl9VTkNPTk5FQ1RFRDoKIAljYXNlIFNUQVRFX0RFVl9DT05ORUNURUQ6CiAJCXNwaW5fdW5sb2NrX2lycSAoJmRldi0+bG9jayk7Ci0JCURCRyAoZGV2LCAiJXMgd2FpdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHIChkZXYsICIlcyB3YWl0XG4iLCBfX2Z1bmNfXyk7CiAKIAkJLyogd2FpdCBmb3IgZXZlbnRzICovCiAJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSAoZGV2LT53YWl0LApAQCAtMTIyMiw3ICsxMjIyLDcgQEAKIAkJCURCRyhkZXYsICJib2d1cyBlcDBvdXQgc3RhbGwhXG4iKTsKIAkJfQogCX0gZWxzZQotCQlEQkcgKGRldiwgImZhaWwgJXMsIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+c3RhdGUpOworCQlEQkcgKGRldiwgImZhaWwgJXMsIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgZGV2LT5zdGF0ZSk7CiAKIAlzcGluX3VubG9ja19pcnEgKCZkZXYtPmxvY2spOwogCXJldHVybiByZXR2YWw7CkBAIC0xMjMzLDcgKzEyMzMsNyBAQAogewogCXN0cnVjdCBkZXZfZGF0YQkJKmRldiA9IGZkLT5wcml2YXRlX2RhdGE7CiAJLy8gY2FsbGVyIG11c3QgRl9TRVRPV04gYmVmb3JlIHNpZ25hbCBkZWxpdmVyeSBoYXBwZW5zCi0JVkRFQlVHIChkZXYsICIlcyAlc1xuIiwgX19GVU5DVElPTl9fLCBvbiA/ICJvbiIgOiAib2ZmIik7CisJVkRFQlVHIChkZXYsICIlcyAlc1xuIiwgX19mdW5jX18sIG9uID8gIm9uIiA6ICJvZmYiKTsKIAlyZXR1cm4gZmFzeW5jX2hlbHBlciAoZiwgZmQsIG9uLCAmZGV2LT5mYXN5bmMpOwogfQogCkBAIC0xNTc1LDcgKzE1NzUsNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQJKmVudHJ5LCAqdG1wOwogCi0JREJHIChkZXYsICIlcyAlZFxuIiwgX19GVU5DVElPTl9fLCBkZXYtPnN0YXRlKTsKKwlEQkcgKGRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgZGV2LT5zdGF0ZSk7CiAKIAkvKiBkZXYtPnN0YXRlIG11c3QgcHJldmVudCBpbnRlcmZlcmVuY2UgKi8KIHJlc3RhcnQ6CkBAIC0xNjYyLDcgKzE2NjIsNyBAQAogCXB1dF9kZXYgKGRldik7CiAJa2ZyZWUgKGRhdGEpOwogZW5vbWVtMDoKLQlEQkcgKGRldiwgIiVzIGVub21lbVxuIiwgX19GVU5DVElPTl9fKTsKKwlEQkcgKGRldiwgIiVzIGVub21lbVxuIiwgX19mdW5jX18pOwogCWRlc3Ryb3lfZXBfZmlsZXMgKGRldik7CiAJcmV0dXJuIC1FTk9NRU07CiB9CkBAIC0xNjcyLDcgKzE2NzIsNyBAQAogewogCXN0cnVjdCBkZXZfZGF0YQkJKmRldiA9IGdldF9nYWRnZXRfZGF0YSAoZ2FkZ2V0KTsKIAotCURCRyAoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHIChkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycSAoJmRldi0+bG9jayk7CiAJZGV2LT5zdGF0ZSA9IFNUQVRFX0RFVl9VTkJPVU5EOwpAQCAtMTY4NSw3ICsxNjg1LDcgQEAKIAkvKiB3ZSd2ZSBhbHJlYWR5IGJlZW4gZGlzY29ubmVjdGVkIC4uLiBubyBpL28gaXMgYWN0aXZlICovCiAJaWYgKGRldi0+cmVxKQogCQl1c2JfZXBfZnJlZV9yZXF1ZXN0IChnYWRnZXQtPmVwMCwgZGV2LT5yZXEpOwotCURCRyAoZGV2LCAiJXMgZG9uZVxuIiwgX19GVU5DVElPTl9fKTsKKwlEQkcgKGRldiwgIiVzIGRvbmVcbiIsIF9fZnVuY19fKTsKIAlwdXRfZGV2IChkZXYpOwogfQogCkBAIC0xOTMzLDcgKzE5MzMsNyBAQAogCiBmYWlsOgogCXNwaW5fdW5sb2NrX2lycSAoJmRldi0+bG9jayk7Ci0JcHJfZGVidWcgKCIlczogJXMgZmFpbCAlWmQsICVwXG4iLCBzaG9ydG5hbWUsIF9fRlVOQ1RJT05fXywgdmFsdWUsIGRldik7CisJcHJfZGVidWcgKCIlczogJXMgZmFpbCAlWmQsICVwXG4iLCBzaG9ydG5hbWUsIF9fZnVuY19fLCB2YWx1ZSwgZGV2KTsKIAlrZnJlZSAoZGV2LT5idWYpOwogCWRldi0+YnVmID0gTlVMTDsKIAlyZXR1cm4gdmFsdWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCmluZGV4IDA3OGY3MjQuLjgyNWFiZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCkBAIC0yNTMsNyArMjUzLDcgQEAKICAqLwogc3RhdGljIHZvaWQgdWRjX2Rpc2FibGUoc3RydWN0IGxoN2E0MHhfdWRjICpkZXYpCiB7Ci0JREVCVUcoIiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBkZXYpOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBkZXYpOwogCiAJdWRjX3NldF9hZGRyZXNzKGRldiwgMCk7CiAKQEAgLTI4NSw3ICsyODUsNyBAQAogewogCXUzMiBpOwogCi0JREVCVUcoIiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBkZXYpOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBkZXYpOwogCiAJLyogZGV2aWNlL2VwMCByZWNvcmRzIGluaXQgKi8KIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5nYWRnZXQuZXBfbGlzdCk7CkBAIC0zMTgsNyArMzE4LDcgQEAKIHsKIAlpbnQgZXA7CiAKLQlERUJVRygiJXMsICVwXG4iLCBfX0ZVTkNUSU9OX18sIGRldik7CisJREVCVUcoIiVzLCAlcFxuIiwgX19mdW5jX18sIGRldik7CiAKIAlkZXYtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOwogCkBAIC00MTIsNyArNDEyLDcgQEAKIAlzdHJ1Y3QgbGg3YTQweF91ZGMgKmRldiA9IHRoZV9jb250cm9sbGVyOwogCWludCByZXR2YWw7CiAKLQlERUJVRygiJXM6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGRyaXZlci0+ZHJpdmVyLm5hbWUpOworCURFQlVHKCIlczogJXNcbiIsIF9fZnVuY19fLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKIAogCWlmICghZHJpdmVyCiAJCQl8fCBkcml2ZXItPnNwZWVkICE9IFVTQl9TUEVFRF9GVUxMCkBAIC01MjEsNyArNTIxLDcgQEAKIAkJCWlzX3Nob3J0ID0gdW5saWtlbHkobWF4IDwgZXBfbWF4cGFja2V0KGVwKSk7CiAJCX0KIAotCQlERUJVRygiJXM6IHdyb3RlICVzICVkIGJ5dGVzJXMlcyAlZCBsZWZ0ICVwXG4iLCBfX0ZVTkNUSU9OX18sCisJCURFQlVHKCIlczogd3JvdGUgJXMgJWQgYnl0ZXMlcyVzICVkIGxlZnQgJXBcbiIsIF9fZnVuY19fLAogCQkgICAgICBlcC0+ZXAubmFtZSwgY291bnQsCiAJCSAgICAgIGlzX2xhc3QgPyAiL0wiIDogIiIsIGlzX3Nob3J0ID8gIi9TIiA6ICIiLAogCQkgICAgICByZXEtPnJlcS5sZW5ndGggLSByZXEtPnJlcS5hY3R1YWwsIHJlcSk7CkBAIC01NTUsNyArNTU1LDcgQEAKIAkvKiBtYWtlIHN1cmUgdGhlcmUncyBhIHBhY2tldCBpbiB0aGUgRklGTy4gKi8KIAljc3IgPSB1c2JfcmVhZChlcC0+Y3NyMSk7CiAJaWYgKCEoY3NyICYgVVNCX09VVF9DU1IxX09VVF9QS1RfUkRZKSkgewotCQlERUJVRygiJXM6IFBhY2tldCBOT1QgcmVhZHkhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVRygiJXM6IFBhY2tldCBOT1QgcmVhZHkhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjE0LDcgKzYxNCw3IEBACiAJdW5zaWduZWQgaW50IHN0b3BwZWQgPSBlcC0+c3RvcHBlZDsKIAl1MzIgaW5kZXg7CiAKLQlERUJVRygiJXMsICVwXG4iLCBfX0ZVTkNUSU9OX18sIGVwKTsKKwlERUJVRygiJXMsICVwXG4iLCBfX2Z1bmNfXywgZXApOwogCWxpc3RfZGVsX2luaXQoJnJlcS0+cXVldWUpOwogCiAJaWYgKGxpa2VseShyZXEtPnJlcS5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKQEAgLTY0NCw3ICs2NDQsNyBAQAogLyoqIEVuYWJsZSBFUCBpbnRlcnJ1cHQgKi8KIHN0YXRpYyB2b2lkIHBpb19pcnFfZW5hYmxlKGludCBlcCkKIHsKLQlERUJVRygiJXM6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVwKTsKKwlERUJVRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgZXApOwogCiAJc3dpdGNoIChlcCkgewogCWNhc2UgMToKQEAgLTY2NSw3ICs2NjUsNyBAQAogLyoqIERpc2FibGUgRVAgaW50ZXJydXB0ICovCiBzdGF0aWMgdm9pZCBwaW9faXJxX2Rpc2FibGUoaW50IGVwKQogewotCURFQlVHKCIlczogJWRcbiIsIF9fRlVOQ1RJT05fXywgZXApOworCURFQlVHKCIlczogJWRcbiIsIF9fZnVuY19fLCBlcCk7CiAKIAlzd2l0Y2ggKGVwKSB7CiAJY2FzZSAxOgpAQCAtNjkwLDcgKzY5MCw3IEBACiB7CiAJc3RydWN0IGxoN2E0MHhfcmVxdWVzdCAqcmVxOwogCi0JREVCVUcoIiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBlcCk7CisJREVCVUcoIiVzLCAlcFxuIiwgX19mdW5jX18sIGVwKTsKIAogCS8qIEZsdXNoIEZJRk8gKi8KIAlmbHVzaChlcCk7CkBAIC03MzQsNyArNzM0LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZmx1c2goc3RydWN0IGxoN2E0MHhfZXAgKmVwKQogewotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgZXApOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBlcCk7CiAKIAlzd2l0Y2ggKGVwLT5lcF90eXBlKSB7CiAJY2FzZSBlcF9jb250cm9sOgpAQCAtNzY2LDcgKzc2Niw3IEBACiAJdXNiX3NldF9pbmRleChlcF9pZHgpOwogCiAJY3NyID0gdXNiX3JlYWQoZXAtPmNzcjEpOwotCURFQlVHKCIlczogJWQsIGNzciAleFxuIiwgX19GVU5DVElPTl9fLCBlcF9pZHgsIGNzcik7CisJREVCVUcoIiVzOiAlZCwgY3NyICV4XG4iLCBfX2Z1bmNfXywgZXBfaWR4LCBjc3IpOwogCiAJaWYgKGNzciAmIFVTQl9JTl9DU1IxX1NFTlRfU1RBTEwpIHsKIAkJREVCVUcoIlVTQl9JTl9DU1IxX1NFTlRfU1RBTExcbiIpOwpAQCAtNzc2LDcgKzc3Niw3IEBACiAJfQogCiAJaWYgKCFlcC0+ZGVzYykgewotCQlERUJVRygiJXM6IE5PIEVQIERFU0NcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHKCIlczogTk8gRVAgREVTQ1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC04MDIsNyArODAyLDcgQEAKIAlzdHJ1Y3QgbGg3YTQweF9lcCAqZXAgPSAmZGV2LT5lcFtlcF9pZHhdOwogCXN0cnVjdCBsaDdhNDB4X3JlcXVlc3QgKnJlcTsKIAotCURFQlVHKCIlczogJWRcbiIsIF9fRlVOQ1RJT05fXywgZXBfaWR4KTsKKwlERUJVRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgZXBfaWR4KTsKIAogCXVzYl9zZXRfaW5kZXgoZXBfaWR4KTsKIApAQCAtODE0LDExICs4MTQsMTEgQEAKIAkJCXVzYl9yZWFkKGVwLT4KIAkJCQkgY3NyMSkpICYgKFVTQl9PVVRfQ1NSMV9PVVRfUEtUX1JEWSB8CiAJCQkJCSAgIFVTQl9PVVRfQ1NSMV9TRU5UX1NUQUxMKSkgewotCQkJREVCVUcoIiVzOiAleFxuIiwgX19GVU5DVElPTl9fLCBjc3IpOworCQkJREVCVUcoIiVzOiAleFxuIiwgX19mdW5jX18sIGNzcik7CiAKIAkJCWlmIChjc3IgJiBVU0JfT1VUX0NTUjFfU0VOVF9TVEFMTCkgewogCQkJCURFQlVHKCIlczogc3RhbGwgc2VudCwgZmx1c2ggZmlmb1xuIiwKLQkJCQkgICAgICBfX0ZVTkNUSU9OX18pOworCQkJCSAgICAgIF9fZnVuY19fKTsKIAkJCQkvKiB1c2Jfc2V0KFVTQl9PVVRfQ1NSMV9GSUZPX0ZMVVNILCBlcC0+Y3NyMSk7ICovCiAJCQkJZmx1c2goZXApOwogCQkJfSBlbHNlIGlmIChjc3IgJiBVU0JfT1VUX0NTUjFfT1VUX1BLVF9SRFkpIHsKQEAgLTgzMiw3ICs4MzIsNyBAQAogCiAJCQkJaWYgKCFyZXEpIHsKIAkJCQkJcHJpbnRrKCIlczogTlVMTCBSRVEgJWRcbiIsCi0JCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGVwX2lkeCk7CisJCQkJCSAgICAgICBfX2Z1bmNfXywgZXBfaWR4KTsKIAkJCQkJZmx1c2goZXApOwogCQkJCQlicmVhazsKIAkJCQl9IGVsc2UgewpAQCAtODQ0LDcgKzg0NCw3IEBACiAKIAl9IGVsc2UgewogCQkvKiBUaHJvdyBwYWNrZXQgYXdheS4uICovCi0JCXByaW50aygiJXM6IE5vIGRlc2NyaXB0b3I/IT9cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXByaW50aygiJXM6IE5vIGRlc2NyaXB0b3I/IT9cbiIsIF9fZnVuY19fKTsKIAkJZmx1c2goZXApOwogCX0KIH0KQEAgLTg4Niw3ICs4ODYsNyBAQAogI2lmIDAJCQkJLyogZGVmIENPTkZJR19BUkNIX0xIN0E0MDQgKi8KIAkvKiBEb2VzIG5vdCB3b3JrIGFsd2F5cy4uLiAqLwogCi0JREVCVUcoIiVzOiAlZFxuIiwgX19GVU5DVElPTl9fLCBkZXYtPnVzYl9hZGRyZXNzKTsKKwlERUJVRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgZGV2LT51c2JfYWRkcmVzcyk7CiAKIAlpZiAoIWRldi0+dXNiX2FkZHJlc3MpIHsKIAkJLyp1c2Jfc2V0KFVTQl9SRVNFVF9JTywgVVNCX1JFU0VUKTsKQEAgLTkzNiw3ICs5MzYsNyBAQAogCQlpZiAoIWludHJfb3V0ICYmICFpbnRyX2luICYmICFpbnRyX2ludCkKIAkJCWJyZWFrOwogCi0JCURFQlVHKCIlcyAob24gc3RhdGUgJXMpXG4iLCBfX0ZVTkNUSU9OX18sCisJCURFQlVHKCIlcyAob24gc3RhdGUgJXMpXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgc3RhdGVfbmFtZXNbZGV2LT5lcDBzdGF0ZV0pOwogCQlERUJVRygiaW50cl9vdXQgPSAleFxuIiwgaW50cl9vdXQpOwogCQlERUJVRygiaW50cl9pbiAgPSAleFxuIiwgaW50cl9pbik7CkBAIC0xMDE2LDE0ICsxMDE2LDE0IEBACiAJc3RydWN0IGxoN2E0MHhfdWRjICpkZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgX2VwKTsKKwlERUJVRygiJXMsICVwXG4iLCBfX2Z1bmNfXywgX2VwKTsKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGxoN2E0MHhfZXAsIGVwKTsKIAlpZiAoIV9lcCB8fCAhZGVzYyB8fCBlcC0+ZGVzYyB8fCBfZXAtPm5hbWUgPT0gZXAwbmFtZQogCSAgICB8fCBkZXNjLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UCiAJICAgIHx8IGVwLT5iRW5kcG9pbnRBZGRyZXNzICE9IGRlc2MtPmJFbmRwb2ludEFkZHJlc3MKIAkgICAgfHwgZXBfbWF4cGFja2V0KGVwKSA8IGxlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKSkgewotCQlERUJVRygiJXMsIGJhZCBlcCBvciBkZXNjcmlwdG9yXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVRygiJXMsIGJhZCBlcCBvciBkZXNjcmlwdG9yXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTAzMSw3ICsxMDMxLDcgQEAKIAlpZiAoZXAtPmJtQXR0cmlidXRlcyAhPSBkZXNjLT5ibUF0dHJpYnV0ZXMKIAkgICAgJiYgZXAtPmJtQXR0cmlidXRlcyAhPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCiAJICAgICYmIGRlc2MtPmJtQXR0cmlidXRlcyAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpIHsKLQkJREVCVUcoIiVzLCAlcyB0eXBlIG1pc21hdGNoXG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSk7CisJCURFQlVHKCIlcywgJXMgdHlwZSBtaXNtYXRjaFxuIiwgX19mdW5jX18sIF9lcC0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTAzOSwxMyArMTAzOSwxMyBAQAogCWlmICgoZGVzYy0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKIAkgICAgICYmIGxlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKSAhPSBlcF9tYXhwYWNrZXQoZXApKQogCSAgICB8fCAhZGVzYy0+d01heFBhY2tldFNpemUpIHsKLQkJREVCVUcoIiVzLCBiYWQgJXMgbWF4cGFja2V0XG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSk7CisJCURFQlVHKCIlcywgYmFkICVzIG1heHBhY2tldFxuIiwgX19mdW5jX18sIF9lcC0+bmFtZSk7CiAJCXJldHVybiAtRVJBTkdFOwogCX0KIAogCWRldiA9IGVwLT5kZXY7CiAJaWYgKCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgewotCQlERUJVRygiJXMsIGJvZ3VzIGRldmljZSBzdGF0ZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREVCVUcoIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FU0hVVERPV047CiAJfQogCkBAIC0xMDYxLDcgKzEwNjEsNyBAQAogCS8qIFJlc2V0IGhhbHQgc3RhdGUgKGRvZXMgZmx1c2gpICovCiAJbGg3YTQweF9zZXRfaGFsdChfZXAsIDApOwogCi0JREVCVUcoIiVzOiBlbmFibGVkICVzXG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSk7CisJREVCVUcoIiVzOiBlbmFibGVkICVzXG4iLCBfX2Z1bmNfXywgX2VwLT5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA3MywxMSArMTA3MywxMSBAQAogCXN0cnVjdCBsaDdhNDB4X2VwICplcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JREVCVUcoIiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBfZXApOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBfZXApOwogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbGg3YTQweF9lcCwgZXApOwogCWlmICghX2VwIHx8ICFlcC0+ZGVzYykgewotCQlERUJVRygiJXMsICVzIG5vdCBlbmFibGVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCURFQlVHKCIlcywgJXMgbm90IGVuYWJsZWRcbiIsIF9fZnVuY19fLAogCQkgICAgICBfZXAgPyBlcC0+ZXAubmFtZSA6IE5VTEwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDk3LDcgKzEwOTcsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmRldi0+bG9jaywgZmxhZ3MpOwogCi0JREVCVUcoIiVzOiBkaXNhYmxlZCAlc1xuIiwgX19GVU5DVElPTl9fLCBfZXAtPm5hbWUpOworCURFQlVHKCIlczogZGlzYWJsZWQgJXNcbiIsIF9fZnVuY19fLCBfZXAtPm5hbWUpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTA2LDcgKzExMDYsNyBAQAogewogCXN0cnVjdCBsaDdhNDB4X3JlcXVlc3QgKnJlcTsKIAotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgZXApOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBlcCk7CiAKIAlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgZ2ZwX2ZsYWdzKTsKIAlpZiAoIXJlcSkKQEAgLTExMjEsNyArMTEyMSw3IEBACiB7CiAJc3RydWN0IGxoN2E0MHhfcmVxdWVzdCAqcmVxOwogCi0JREVCVUcoIiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBlcCk7CisJREVCVUcoIiVzLCAlcFxuIiwgX19mdW5jX18sIGVwKTsKIAogCXJlcSA9IGNvbnRhaW5lcl9vZihfcmVxLCBzdHJ1Y3QgbGg3YTQweF9yZXF1ZXN0LCByZXEpOwogCVdBUk5fT04oIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKTsKQEAgLTExNDAsMjUgKzExNDAsMjUgQEAKIAlzdHJ1Y3QgbGg3YTQweF91ZGMgKmRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JREVCVUcoIlxuXG5cbiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBfZXApOworCURFQlVHKCJcblxuXG4lcywgJXBcbiIsIF9fZnVuY19fLCBfZXApOwogCiAJcmVxID0gY29udGFpbmVyX29mKF9yZXEsIHN0cnVjdCBsaDdhNDB4X3JlcXVlc3QsIHJlcSk7CiAJaWYgKHVubGlrZWx5CiAJICAgICghX3JlcSB8fCAhX3JlcS0+Y29tcGxldGUgfHwgIV9yZXEtPmJ1ZgogCSAgICAgfHwgIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKSkgewotCQlERUJVRygiJXMsIGJhZCBwYXJhbXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHKCIlcywgYmFkIHBhcmFtc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBsaDdhNDB4X2VwLCBlcCk7CiAJaWYgKHVubGlrZWx5KCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+ZXAubmFtZSAhPSBlcDBuYW1lKSkpIHsKLQkJREVCVUcoIiVzLCBiYWQgZXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWRldiA9IGVwLT5kZXY7CiAJaWYgKHVubGlrZWx5KCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikpIHsKLQkJREVCVUcoIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGUgJXBcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5kcml2ZXIpOworCQlERUJVRygiJXMsIGJvZ3VzIGRldmljZSBzdGF0ZSAlcFxuIiwgX19mdW5jX18sIGRldi0+ZHJpdmVyKTsKIAkJcmV0dXJuIC1FU0hVVERPV047CiAJfQogCkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogCXN0cnVjdCBsaDdhNDB4X3JlcXVlc3QgKnJlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JREVCVUcoIiVzLCAlcFxuIiwgX19GVU5DVElPTl9fLCBfZXApOworCURFQlVHKCIlcywgJXBcbiIsIF9fZnVuY19fLCBfZXApOwogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbGg3YTQweF9lcCwgZXApOwogCWlmICghX2VwIHx8IGVwLT5lcC5uYW1lID09IGVwMG5hbWUpCkBAIC0xMjUzLDEzICsxMjUzLDEzIEBACiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBsaDdhNDB4X2VwLCBlcCk7CiAJaWYgKHVubGlrZWx5KCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+ZXAubmFtZSAhPSBlcDBuYW1lKSkpIHsKLQkJREVCVUcoIiVzLCBiYWQgZXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXVzYl9zZXRfaW5kZXgoZXBfaW5kZXgoZXApKTsKIAotCURFQlVHKCIlcywgZXAgJWQsIHZhbCAlZFxuIiwgX19GVU5DVElPTl9fLCBlcF9pbmRleChlcCksIHZhbHVlKTsKKwlERUJVRygiJXMsIGVwICVkLCB2YWwgJWRcbiIsIF9fZnVuY19fLCBlcF9pbmRleChlcCksIHZhbHVlKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlcC0+ZGV2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTEzMjUsMTEgKzEzMjUsMTEgQEAKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGxoN2E0MHhfZXAsIGVwKTsKIAlpZiAoIV9lcCkgewotCQlERUJVRygiJXMsIGJhZCBlcFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREVCVUcoIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JREVCVUcoIiVzLCAlZFxuIiwgX19GVU5DVElPTl9fLCBlcF9pbmRleChlcCkpOworCURFQlVHKCIlcywgJWRcbiIsIF9fZnVuY19fLCBlcF9pbmRleChlcCkpOwogCiAJLyogTFBEIGNhbid0IHJlcG9ydCB1bmNsYWltZWQgYnl0ZXMgZnJvbSBJTiBmaWZvcyAqLwogCWlmIChlcF9pc19pbihlcCkpCkBAIC0xMzU1LDcgKzEzNTUsNyBAQAogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbGg3YTQweF9lcCwgZXApOwogCWlmICh1bmxpa2VseSghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXAtPmVwLm5hbWUgIT0gZXAwbmFtZSkpKSB7Ci0JCURFQlVHKCIlcywgYmFkIGVwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVRygiJXMsIGJhZCBlcFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogCiAJbWF4ID0gZXBfbWF4cGFja2V0KGVwKTsKIAotCURFQlVHX0VQMCgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREVCVUdfRVAwKCIlc1xuIiwgX19mdW5jX18pOwogCiAJY291bnQgPSB3cml0ZV9wYWNrZXQoZXAsIHJlcSwgbWF4KTsKIApAQCAtMTM5MCw3ICsxMzkwLDcgQEAKIAkJCWlzX2xhc3QgPSAxOwogCX0KIAotCURFQlVHX0VQMCgiJXM6IHdyb3RlICVzICVkIGJ5dGVzJXMgJWQgbGVmdCAlcFxuIiwgX19GVU5DVElPTl9fLAorCURFQlVHX0VQMCgiJXM6IHdyb3RlICVzICVkIGJ5dGVzJXMgJWQgbGVmdCAlcFxuIiwgX19mdW5jX18sCiAJCSAgZXAtPmVwLm5hbWUsIGNvdW50LAogCQkgIGlzX2xhc3QgPyAiL0wiIDogIiIsIHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbCwgcmVxKTsKIApAQCAtMTQzNCw3ICsxNDM0LDcgQEAKIAl1bnNpZ25lZCBidWZmZXJzcGFjZSwgY291bnQsIGlzX3Nob3J0OwogCXZvbGF0aWxlIHUzMiAqZmlmbyA9ICh2b2xhdGlsZSB1MzIgKillcC0+ZmlmbzsKIAotCURFQlVHX0VQMCgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREVCVUdfRVAwKCIlc1xuIiwgX19mdW5jX18pOwogCiAJY3NyID0gdXNiX3JlYWQoVVNCX0VQMF9DU1IpOwogCWlmICghKGNzciAmIFVTQl9PVVRfQ1NSMV9PVVRfUEtUX1JEWSkpCkBAIC0xNDkyLDcgKzE0OTIsNyBAQAogICovCiBzdGF0aWMgdm9pZCB1ZGNfc2V0X2FkZHJlc3Moc3RydWN0IGxoN2E0MHhfdWRjICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcykKIHsKLQlERUJVR19FUDAoIiVzOiAlZFxuIiwgX19GVU5DVElPTl9fLCBhZGRyZXNzKTsKKwlERUJVR19FUDAoIiVzOiAlZFxuIiwgX19mdW5jX18sIGFkZHJlc3MpOwogCS8qIGMuZi4gMTUuMS4yLjIgVGFibGUgMTUtNCBhZGRyZXNzIHdpbGwgYmUgdXNlZCBhZnRlciBEQVRBX0VORCBpcyBzZXQgKi8KIAlkZXYtPnVzYl9hZGRyZXNzID0gYWRkcmVzczsKIAl1c2Jfc2V0KChhZGRyZXNzICYgVVNCX0ZBX0ZVTkNUSU9OX0FERFIpLCBVU0JfRkEpOwpAQCAtMTUxNCw3ICsxNTE0LDcgQEAKIAlzdHJ1Y3QgbGg3YTQweF9lcCAqZXAgPSAmZGV2LT5lcFswXTsKIAlpbnQgcmV0OwogCi0JREVCVUdfRVAwKCIlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgY3NyKTsKKwlERUJVR19FUDAoIiVzOiAleFxuIiwgX19mdW5jX18sIGNzcik7CiAKIAlpZiAobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkKIAkJcmVxID0gMDsKQEAgLTE1MzMsMTMgKzE1MzMsMTMgQEAKIAkJaWYgKHJldCkgewogCQkJLyogRG9uZSEgKi8KIAkJCURFQlVHX0VQMCgiJXM6IGZpbmlzaGVkLCB3YWl0aW5nIGZvciBzdGF0dXNcbiIsCi0JCQkJICBfX0ZVTkNUSU9OX18pOworCQkJCSAgX19mdW5jX18pOwogCiAJCQl1c2Jfc2V0KChFUDBfQ0xSX09VVCB8IEVQMF9EQVRBX0VORCksIFVTQl9FUDBfQ1NSKTsKIAkJCWRldi0+ZXAwc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKIAkJfSBlbHNlIHsKIAkJCS8qIE5vdCBkb25lIHlldC4uICovCi0JCQlERUJVR19FUDAoIiVzOiBub3QgZmluaXNoZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlERUJVR19FUDAoIiVzOiBub3QgZmluaXNoZWRcbiIsIF9fZnVuY19fKTsKIAkJCXVzYl9zZXQoRVAwX0NMUl9PVVQsIFVTQl9FUDBfQ1NSKTsKIAkJfQogCX0gZWxzZSB7CkBAIC0xNTU2LDcgKzE1NTYsNyBAQAogCXN0cnVjdCBsaDdhNDB4X2VwICplcCA9ICZkZXYtPmVwWzBdOwogCWludCByZXQsIG5lZWRfemxwID0gMDsKIAotCURFQlVHX0VQMCgiJXM6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGNzcik7CisJREVCVUdfRVAwKCIlczogJXhcbiIsIF9fZnVuY19fLCBjc3IpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCiAJCXJlcSA9IDA7CkBAIC0xNTY0LDcgKzE1NjQsNyBAQAogCQlyZXEgPSBsaXN0X2VudHJ5KGVwLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgbGg3YTQweF9yZXF1ZXN0LCBxdWV1ZSk7CiAKIAlpZiAoIXJlcSkgewotCQlERUJVR19FUDAoIiVzOiBOVUxMIFJFUVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREVCVUdfRVAwKCIlczogTlVMTCBSRVFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNTg1LDE3ICsxNTg1LDE3IEBACiAKIAlpZiAocmV0ID09IDEgJiYgIW5lZWRfemxwKSB7CiAJCS8qIExhc3QgcGFja2V0ICovCi0JCURFQlVHX0VQMCgiJXM6IGZpbmlzaGVkLCB3YWl0aW5nIGZvciBzdGF0dXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURFQlVHX0VQMCgiJXM6IGZpbmlzaGVkLCB3YWl0aW5nIGZvciBzdGF0dXNcbiIsIF9fZnVuY19fKTsKIAogCQl1c2Jfc2V0KChFUDBfSU5fUEtUX1JEWSB8IEVQMF9EQVRBX0VORCksIFVTQl9FUDBfQ1NSKTsKIAkJZGV2LT5lcDBzdGF0ZSA9IFdBSVRfRk9SX1NFVFVQOwogCX0gZWxzZSB7Ci0JCURFQlVHX0VQMCgiJXM6IG5vdCBmaW5pc2hlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREVCVUdfRVAwKCIlczogbm90IGZpbmlzaGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXVzYl9zZXQoRVAwX0lOX1BLVF9SRFksIFVTQl9FUDBfQ1NSKTsKIAl9CiAKIAlpZiAobmVlZF96bHApIHsKLQkJREVCVUdfRVAwKCIlczogTmVlZCBaTFAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlERUJVR19FUDAoIiVzOiBOZWVkIFpMUCFcbiIsIF9fZnVuY19fKTsKIAkJdXNiX3NldChFUDBfSU5fUEtUX1JEWSwgVVNCX0VQMF9DU1IpOwogCQlkZXYtPmVwMHN0YXRlID0gREFUQV9TVEFURV9ORUVEX1pMUDsKIAl9CkBAIC0xNjk0LDcgKzE2OTQsNyBAQAogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgY3RybDsKIAlpbnQgaSwgYnl0ZXMsIGlzX2luOwogCi0JREVCVUdfU0VUVVAoIiVzOiAleFxuIiwgX19GVU5DVElPTl9fLCBjc3IpOworCURFQlVHX1NFVFVQKCIlczogJXhcbiIsIF9fZnVuY19fLCBjc3IpOwogCiAJLyogTnVrZSBhbGwgcHJldmlvdXMgdHJhbnNmZXJzICovCiAJbnVrZShlcCwgLUVQUk9UTyk7CkBAIC0xNzk5LDcgKzE3OTksNyBAQAogICovCiBzdGF0aWMgdm9pZCBsaDdhNDB4X2VwMF9pbl96bHAoc3RydWN0IGxoN2E0MHhfdWRjICpkZXYsIHUzMiBjc3IpCiB7Ci0JREVCVUdfRVAwKCIlczogJXhcbiIsIF9fRlVOQ1RJT05fXywgY3NyKTsKKwlERUJVR19FUDAoIiVzOiAleFxuIiwgX19mdW5jX18sIGNzcik7CiAKIAkvKiBjLmYuIFRhYmxlIDE1LTE0ICovCiAJdXNiX3NldCgoRVAwX0lOX1BLVF9SRFkgfCBFUDBfREFUQV9FTkQpLCBVU0JfRVAwX0NTUik7CkBAIC0xODE4LDcgKzE4MTgsNyBAQAogCXVzYl9zZXRfaW5kZXgoMCk7CiAgCWNzciA9IHVzYl9yZWFkKFVTQl9FUDBfQ1NSKTsKIAotCURFQlVHX0VQMCgiJXM6IGNzciA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGNzcik7CisJREVCVUdfRVAwKCIlczogY3NyID0gJXhcbiIsIF9fZnVuY19fLCBjc3IpOwogCiAJLyoKIAkgKiBGb3Igb3ZlcnZpZXcgb2Ygd2hhdCB3ZSBzaG91bGQgYmUgZG9pbmcgc2VlIGMuZi4gQ2hhcHRlciAxOC4xLjIuNApAQCAtMTgzMiw3ICsxODMyLDcgQEAKIAkgKiAgICAgIC0gY2xlYXIgdGhlIFNFTlRfU1RBTEwgYml0CiAJICovCiAJaWYgKGNzciAmIEVQMF9TRU5UX1NUQUxMKSB7Ci0JCURFQlVHX0VQMCgiJXM6IEVQMF9TRU5UX1NUQUxMIGlzIHNldDogJXhcbiIsIF9fRlVOQ1RJT05fXywgY3NyKTsKKwkJREVCVUdfRVAwKCIlczogRVAwX1NFTlRfU1RBTEwgaXMgc2V0OiAleFxuIiwgX19mdW5jX18sIGNzcik7CiAJCXVzYl9jbGVhcigoRVAwX1NFTlRfU1RBTEwgfCBFUDBfU0VORF9TVEFMTCksIFVTQl9FUDBfQ1NSKTsKIAkJbnVrZShlcCwgLUVDT05OQUJPUlRFRCk7CiAJCWRldi0+ZXAwc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKQEAgLTE4NDksNyArMTg0OSw3IEBACiAJICovCiAJaWYgKCEoY3NyICYgKEVQMF9JTl9QS1RfUkRZIHwgRVAwX09VVF9QS1RfUkRZKSkpIHsKIAkJREVCVUdfRVAwKCIlczogSU5fUEtUX1JEWSBhbmQgT1VUX1BLVF9SRFkgYXJlIGNsZWFyXG4iLAotCQkJICBfX0ZVTkNUSU9OX18pOworCQkJICBfX2Z1bmNfXyk7CiAKIAkJc3dpdGNoIChkZXYtPmVwMHN0YXRlKSB7CiAJCWNhc2UgREFUQV9TVEFURV9YTUlUOgpAQCAtMTg3Nyw3ICsxODc3LDcgQEAKIAkgKiAgICAgIC0gc2V0IFNFUlZJQ0VEX1NFVFVQX0VORF9CSVQKIAkgKi8KIAlpZiAoY3NyICYgRVAwX1NFVFVQX0VORCkgewotCQlERUJVR19FUDAoIiVzOiBFUDBfU0VUVVBfRU5EIGlzIHNldDogJXhcbiIsIF9fRlVOQ1RJT05fXywgY3NyKTsKKwkJREVCVUdfRVAwKCIlczogRVAwX1NFVFVQX0VORCBpcyBzZXQ6ICV4XG4iLCBfX2Z1bmNfXywgY3NyKTsKIAogCQl1c2Jfc2V0KEVQMF9DTFJfU0VUVVBfRU5ELCBVU0JfRVAwX0NTUik7CiAKQEAgLTE4OTYsNyArMTg5Niw3IEBACiAJICovCiAJaWYgKGNzciAmIEVQMF9PVVRfUEtUX1JEWSkgewogCi0JCURFQlVHX0VQMCgiJXM6IEVQMF9PVVRfUEtUX1JEWSBpcyBzZXQ6ICV4XG4iLCBfX0ZVTkNUSU9OX18sCisJCURFQlVHX0VQMCgiJXM6IEVQMF9PVVRfUEtUX1JEWSBpcyBzZXQ6ICV4XG4iLCBfX2Z1bmNfXywKIAkJCSAgY3NyKTsKIAogCQlzd2l0Y2ggKGRldi0+ZXAwc3RhdGUpIHsKQEAgLTE5MjYsNyArMTkyNiw3IEBACiAJdXNiX3NldF9pbmRleCgwKTsKIAljc3IgPSB1c2JfcmVhZChVU0JfRVAwX0NTUik7CiAKLQlERUJVR19FUDAoIiVzOiAleFxuIiwgX19GVU5DVElPTl9fLCBjc3IpOworCURFQlVHX0VQMCgiJXM6ICV4XG4iLCBfX2Z1bmNfXywgY3NyKTsKIAogCS8qIENsZWFyICJvdXQgcGFja2V0IHJlYWR5IiAqLwogCXVzYl9zZXQoRVAwX0NMUl9PVVQsIFVTQl9FUDBfQ1NSKTsKQEAgLTE5NDksNyArMTk0OSw3IEBACiB7CiAJdTMyIGZyYW1lMSA9IHVzYl9yZWFkKFVTQl9GUk1fTlVNMSk7CS8qIExlYXN0IHNpZ25pZmljYW50IDggYml0cyAqLwogCXUzMiBmcmFtZTIgPSB1c2JfcmVhZChVU0JfRlJNX05VTTIpOwkvKiBNb3N0IHNpZ25pZmljYW50IDMgYml0cyAqLwotCURFQlVHKCIlcywgJXBcbiIsIF9fRlVOQ1RJT05fXywgX2dhZGdldCk7CisJREVCVUcoIiVzLCAlcFxuIiwgX19mdW5jX18sIF9nYWRnZXQpOwogCXJldHVybiAoKGZyYW1lMiAmIDB4MDcpIDw8IDgpIHwgKGZyYW1lMSAmIDB4ZmYpOwogfQogCkBAIC0xOTcwLDcgKzE5NzAsNyBAQAogCiBzdGF0aWMgdm9pZCBub3BfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JREVCVUcoIiVzICVzXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+YnVzX2lkKTsKKwlERUJVRygiJXMgJXNcbiIsIF9fZnVuY19fLCBkZXYtPmJ1c19pZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGg3YTQweF91ZGMgbWVtb3J5ID0gewpAQCAtMjA2NSw3ICsyMDY1LDcgQEAKIAlzdHJ1Y3QgbGg3YTQweF91ZGMgKmRldiA9ICZtZW1vcnk7CiAJaW50IHJldHZhbDsKIAotCURFQlVHKCIlczogJXBcbiIsIF9fRlVOQ1RJT05fXywgcGRldik7CisJREVCVUcoIiVzOiAlcFxuIiwgX19mdW5jX18sIHBkZXYpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CiAJZGV2LT5kZXYgPSAmcGRldi0+ZGV2OwpAQCAtMjA5OCw3ICsyMDk4LDcgQEAKIHsKIAlzdHJ1Y3QgbGg3YTQweF91ZGMgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JREVCVUcoIiVzOiAlcFxuIiwgX19GVU5DVElPTl9fLCBwZGV2KTsKKwlERUJVRygiJXM6ICVwXG4iLCBfX2Z1bmNfXywgcGRldik7CiAKIAlpZiAoZGV2LT5kcml2ZXIpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0yMTMxLDcgKzIxMzEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB1ZGNfaW5pdCh2b2lkKQogewotCURFQlVHKCIlczogJXMgdmVyc2lvbiAlc1xuIiwgX19GVU5DVElPTl9fLCBkcml2ZXJfbmFtZSwgRFJJVkVSX1ZFUlNJT04pOworCURFQlVHKCIlczogJXMgdmVyc2lvbiAlc1xuIiwgX19mdW5jX18sIGRyaXZlcl9uYW1lLCBEUklWRVJfVkVSU0lPTik7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdWRjX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5oCmluZGV4IDE3Yjc5MmIuLmJlMGE0YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuaApAQCAtNDg2LDEwICs0ODYsMTAgQEAKIAogCXN0cnVjdCB1c2JfcmVxdWVzdAkqZXAwX3JlcTsJLyogZm9yIGludGVybmFsIHJlcXVlc3QgKi8KIAl1MTYJCQllcDBfZGF0YTsJLyogZm9yIGludGVybmFsIHJlcXVlc3QgKi8KKwl1MTYJCQlvbGRfdmJ1czsKIAogCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwogCi0JdTE2CQkJb2xkX3ZidXM7CiAJaW50CQkJc2NvdW50OwogCiAJaW50CQkJb2xkX2R2c3E7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuaAppbmRleCA0NGNhMTM5Li4xZjJhZjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmgKQEAgLTI5OSw3ICsyOTksNyBAQAogCQkJJmVwLT5yZWdzLT5lcF9yc3ApOwogCX0KIH0KLSNkZWZpbmUgQVNTRVJUX09VVF9OQUtJTkcoZXApIGFzc2VydF9vdXRfbmFraW5nKGVwLF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgQVNTRVJUX09VVF9OQUtJTkcoZXApIGFzc2VydF9vdXRfbmFraW5nKGVwLF9fZnVuY19fKQogI2Vsc2UKICNkZWZpbmUgQVNTRVJUX09VVF9OQUtJTkcoZXApIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCmluZGV4IGVlMWU5YTMuLjk1Zjc2NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkJCXx8IGVwLT5iRW5kcG9pbnRBZGRyZXNzICE9IGRlc2MtPmJFbmRwb2ludEFkZHJlc3MKIAkJCXx8IGVwLT5tYXhwYWNrZXQgPCBsZTE2X3RvX2NwdQogCQkJCQkJKGRlc2MtPndNYXhQYWNrZXRTaXplKSkgewotCQlEQkcoIiVzLCBiYWQgZXAgb3IgZGVzY3JpcHRvclxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlcywgYmFkIGVwIG9yIGRlc2NyaXB0b3JcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCW1heHAgPSBsZTE2X3RvX2NwdSAoZGVzYy0+d01heFBhY2tldFNpemUpOwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCQkJJiYgbWF4cCAhPSBlcC0+bWF4cGFja2V0KQogCQkJfHwgbGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpID4gZXAtPm1heHBhY2tldAogCQkJfHwgIWRlc2MtPndNYXhQYWNrZXRTaXplKSB7Ci0JCURCRygiJXMsIGJhZCAlcyBtYXhwYWNrZXRcbiIsIF9fRlVOQ1RJT05fXywgX2VwLT5uYW1lKTsKKwkJREJHKCIlcywgYmFkICVzIG1heHBhY2tldFxuIiwgX19mdW5jX18sIF9lcC0+bmFtZSk7CiAJCXJldHVybiAtRVJBTkdFOwogCX0KIApAQCAtMTk0LDEzICsxOTQsMTMgQEAKIAlpZiAoZXAtPmJtQXR0cmlidXRlcyAhPSBkZXNjLT5ibUF0dHJpYnV0ZXMKIAkJCSYmIGVwLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSwogCQkJJiYgZGVzYy0+Ym1BdHRyaWJ1dGVzICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgewotCQlEQkcoIiVzLCAlcyB0eXBlIG1pc21hdGNoXG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSk7CisJCURCRygiJXMsICVzIHR5cGUgbWlzbWF0Y2hcbiIsIF9fZnVuY19fLCBfZXAtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl1ZGMgPSBlcC0+dWRjOwogCWlmICghdWRjLT5kcml2ZXIgfHwgdWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKLQkJREJHKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FU0hVVERPV047CiAJfQogCkBAIC0yNDksNyArMjQ5LDcgQEAKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCiAJaWYgKCFfZXAgfHwgIWVwLT5kZXNjKSB7Ci0JCURCRygiJXMsICVzIG5vdCBlbmFibGVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCURCRygiJXMsICVzIG5vdCBlbmFibGVkXG4iLCBfX2Z1bmNfXywKIAkJCV9lcCA/IGVwLT5lcC5uYW1lIDogTlVMTCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTkzNiwxMSArOTM2LDExIEBACiAJLyogY2F0Y2ggdmFyaW91cyBib2d1cyBwYXJhbWV0ZXJzICovCiAJaWYgKCFfcmVxIHx8ICFyZXEtPnJlcS5jb21wbGV0ZSB8fCAhcmVxLT5yZXEuYnVmCiAJCQl8fCAhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpIHsKLQkJREJHKCIlcywgYmFkIHBhcmFtc1xuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlcywgYmFkIHBhcmFtc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+YkVuZHBvaW50QWRkcmVzcykpIHsKLQkJREJHKCIlcywgYmFkIGVwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKQEAgLTk1OSw3ICs5NTksNyBAQAogCQkJJiYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgPT0gMAogCQkJJiYgIWNwdV9jbGFzc19pc19vbWFwMigpCiAJCQkmJiAocmVxLT5yZXEubGVuZ3RoICUgZXAtPmVwLm1heHBhY2tldCkgIT0gMCkgewotCQlEQkcoIiVzLCBubyBwYXJ0aWFsIHBhY2tldCBPVVQgcmVhZHNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXMsIG5vIHBhcnRpYWwgcGFja2V0IE9VVCByZWFkc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVNU0dTSVpFOwogCX0KIApAQCAtMTI2NSw4ICsxMjY1LDYgQEAKIAogc3RhdGljIHZvaWQgcHVsbHVwX2VuYWJsZShzdHJ1Y3Qgb21hcF91ZGMgKnVkYykKIHsKLQl1ZGMtPmdhZGdldC5kZXYucGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047Ci0JdWRjLT5nYWRnZXQuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKIAlVRENfU1lTQ09OMV9SRUcgfD0gVURDX1BVTExVUF9FTjsKIAlpZiAoIWdhZGdldF9pc19vdGcoJnVkYy0+Z2FkZ2V0KSAmJiAhY3B1X2lzX29tYXAxNXh4KCkpCiAJCU9UR19DVFJMX1JFRyB8PSBPVEdfQlNFU1NWTEQ7CkBAIC0zMDYxLDggKzMwNTksNiBAQAogCQlvbWFwX3B1bGx1cCgmdWRjLT5nYWRnZXQsIDApOwogCX0KIAotCXVkYy0+Z2FkZ2V0LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKLQl1ZGMtPmdhZGdldC5kZXYucGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMKaW5kZXggMmMzMmJkMC4uNzZiZTc1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHJpbnRlci5jCkBAIC0zOTAsOSArMzkwLDEyIEBACiAKIAkvKiBub3JtYWwgY29tcGxldGlvbiAqLwogCWNhc2UgMDoKLQkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZGV2LT5yeF9idWZmZXJzKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJ4X3dhaXQpOwotCQlEQkcoZGV2LCAiR19QcmludGVyIDogcnggbGVuZ3RoICVkXG4iLCByZXEtPmFjdHVhbCk7CisJCWlmIChyZXEtPmFjdHVhbCA+IDApIHsKKwkJCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJmRldi0+cnhfYnVmZmVycyk7CisJCQlEQkcoZGV2LCAiR19QcmludGVyIDogcnggbGVuZ3RoICVkXG4iLCByZXEtPmFjdHVhbCk7CisJCX0gZWxzZSB7CisJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKKwkJfQogCQlicmVhazsKIAogCS8qIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24gKi8KQEAgLTQxNyw2ICs0MjAsOCBAQAogCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKIAkJYnJlYWs7CiAJfQorCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJ4X3dhaXQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC00OTQsNiArNDk5LDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIHR1cm5lZCBvZmYuICovCitzdGF0aWMgdm9pZAorc2V0dXBfcnhfcmVxcyhzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgICAgICAgICAgICAgICpyZXE7CisKKwl3aGlsZSAobGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnJ4X3JlcXMpKSkgeworCQlpbnQgZXJyb3I7CisKKwkJcmVxID0gY29udGFpbmVyX29mKGRldi0+cnhfcmVxcy5uZXh0LAorCQkJCXN0cnVjdCB1c2JfcmVxdWVzdCwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7CisKKwkJLyogVGhlIFVTQiBIb3N0IHNlbmRzIHVzIHdoYXRldmVyIGFtb3VudCBvZiBkYXRhIGl0IHdhbnRzIHRvCisJCSAqIHNvIHdlIGFsd2F5cyBzZXQgdGhlIGxlbmd0aCBmaWVsZCB0byB0aGUgZnVsbCBVU0JfQlVGU0laRS4KKwkJICogSWYgdGhlIGFtb3VudCBvZiBkYXRhIGlzIG1vcmUgdGhhbiB0aGUgcmVhZCgpIGNhbGxlciBhc2tlZAorCQkgKiBmb3IgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHJlcXVlc3QgYnVmZmVyIHVudGlsIGl0IGlzCisJCSAqIGFza2VkIGZvciBieSByZWFkKCkuCisJCSAqLworCQlyZXEtPmxlbmd0aCA9IFVTQl9CVUZTSVpFOworCQlyZXEtPmNvbXBsZXRlID0gcnhfY29tcGxldGU7CisKKwkJZXJyb3IgPSB1c2JfZXBfcXVldWUoZGV2LT5vdXRfZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnJvcikgeworCQkJREJHKGRldiwgInJ4IHN1Ym1pdCAtLT4gJWRcbiIsIGVycm9yKTsKKwkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzX2FjdGl2ZSk7CisJCX0KKwl9Cit9CisKIHN0YXRpYyBzc2l6ZV90CiBwcmludGVyX3JlYWQoc3RydWN0IGZpbGUgKmZkLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnB0cikKIHsKQEAgLTUyMiwzMSArNTYwLDcgQEAKIAkgKi8KIAlkZXYtPnJlc2V0X3ByaW50ZXIgPSAwOwogCi0Jd2hpbGUgKGxpa2VseSghbGlzdF9lbXB0eSgmZGV2LT5yeF9yZXFzKSkpIHsKLQkJaW50IGVycm9yOwotCi0JCXJlcSA9IGNvbnRhaW5lcl9vZihkZXYtPnJ4X3JlcXMubmV4dCwKLQkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOwotCi0JCS8qIFRoZSBVU0IgSG9zdCBzZW5kcyB1cyB3aGF0ZXZlciBhbW91bnQgb2YgZGF0YSBpdCB3YW50cyB0bwotCQkgKiBzbyB3ZSBhbHdheXMgc2V0IHRoZSBsZW5ndGggZmllbGQgdG8gdGhlIGZ1bGwgVVNCX0JVRlNJWkUuCi0JCSAqIElmIHRoZSBhbW91bnQgb2YgZGF0YSBpcyBtb3JlIHRoYW4gdGhlIHJlYWQoKSBjYWxsZXIgYXNrZWQKLQkJICogZm9yIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSByZXF1ZXN0IGJ1ZmZlciB1bnRpbCBpdCBpcwotCQkgKiBhc2tlZCBmb3IgYnkgcmVhZCgpLgotCQkgKi8KLQkJcmVxLT5sZW5ndGggPSBVU0JfQlVGU0laRTsKLQkJcmVxLT5jb21wbGV0ZSA9IHJ4X2NvbXBsZXRlOwotCi0JCWVycm9yID0gdXNiX2VwX3F1ZXVlKGRldi0+b3V0X2VwLCByZXEsIEdGUF9BVE9NSUMpOwotCQlpZiAoZXJyb3IpIHsKLQkJCURCRyhkZXYsICJyeCBzdWJtaXQgLS0+ICVkXG4iLCBlcnJvcik7Ci0JCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxc19hY3RpdmUpOwotCQl9Ci0JfQorCXNldHVwX3J4X3JlcXMoZGV2KTsKIAogCWJ5dGVzX2NvcGllZCA9IDA7CiAJY3VycmVudF9yeF9yZXEgPSBkZXYtPmN1cnJlbnRfcnhfcmVxOwpAQCAtNjE1LDkgKzYyOSw5IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOwogCi0JCS8qIFdlJ3ZlIGRpc2Nvbm5lY3RlZCBvciByZXNldCBmcmVlIHRoZSByZXEgYW5kIGJ1ZmZlciAqLworCQkvKiBXZSd2ZSBkaXNjb25uZWN0ZWQgb3IgcmVzZXQgc28gcmV0dXJuLiAqLwogCQlpZiAoZGV2LT5yZXNldF9wcmludGVyKSB7Ci0JCQlwcmludGVyX3JlcV9mcmVlKGRldi0+b3V0X2VwLCBjdXJyZW50X3J4X3JlcSk7CisJCQlsaXN0X2FkZCgmY3VycmVudF9yeF9yZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAJCQlzcGluX3VubG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOwogCQkJcmV0dXJuIC1FQUdBSU47CkBAIC03MzUsNyArNzQ5LDcgQEAKIAogCQkvKiBXZSd2ZSBkaXNjb25uZWN0ZWQgb3IgcmVzZXQgc28gZnJlZSB0aGUgcmVxIGFuZCBidWZmZXIgKi8KIAkJaWYgKGRldi0+cmVzZXRfcHJpbnRlcikgewotCQkJcHJpbnRlcl9yZXFfZnJlZShkZXYtPmluX2VwLCByZXEpOworCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+dHhfcmVxcyk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKIAkJCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7CiAJCQlyZXR1cm4gLUVBR0FJTjsKQEAgLTc5MSw2ICs4MDUsMTIgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlpbnQJCQlzdGF0dXMgPSAwOwogCisJc3Bpbl9sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCXNldHVwX3J4X3JlcXMoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOworCiAJcG9sbF93YWl0KGZkLCAmZGV2LT5yeF93YWl0LCB3YWl0KTsKIAlwb2xsX3dhaXQoZmQsICZkZXYtPnR4X3dhaXQsIHdhaXQpOwogCkBAIC03OTgsNyArODE4LDggQEAKIAlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXMpKSkKIAkJc3RhdHVzIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCi0JaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmZGV2LT5yeF9idWZmZXJzKSkpCisJaWYgKGxpa2VseShkZXYtPmN1cnJlbnRfcnhfYnl0ZXMpIHx8CisJCQlsaWtlbHkoIWxpc3RfZW1wdHkoJmRldi0+cnhfYnVmZmVycykpKQogCQlzdGF0dXMgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwpAQCAtODk0LDcgKzkxNSw3IEBACiAJaWYgKGRldi0+aW50ZXJmYWNlIDwgMCkKIAkJcmV0dXJuOwogCi0JREJHKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURCRyhkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGRldi0+aW4pCiAJCXVzYl9lcF9kaXNhYmxlKGRldi0+aW5fZXApOwpAQCAtMTA4NCw2ICsxMTA1LDcgQEAKIAlpZiAodXNiX2VwX2VuYWJsZShkZXYtPm91dF9lcCwgZGV2LT5vdXQpKQogCQlEQkcoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBVU0Igb3V0X2VwXG4iKTsKIAorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yeF93YWl0KTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+dHhfd2FpdCk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnR4X2ZsdXNoX3dhaXQpOwogfQpAQCAtMTI2Miw3ICsxMjg0LDcgQEAKIAlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldiA9IGdldF9nYWRnZXRfZGF0YShnYWRnZXQpOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCi0JREJHKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURCRyhkZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMjc4LDcgKzEzMDAsNyBAQAogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwogCiAKLQlEQkcoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBSZW1vdmUgc3lzZnMgZmlsZXMgKi8KIAlkZXZpY2VfZGVzdHJveSh1c2JfZ2FkZ2V0X2NsYXNzLCBnX3ByaW50ZXJfZGV2bm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKaW5kZXggYzAwY2Q4Yi4uMDhmNjk5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCkBAIC0yMzUsNyArMjM1LDcgQEAKIAkJCXx8IGVwLT5iRW5kcG9pbnRBZGRyZXNzICE9IGRlc2MtPmJFbmRwb2ludEFkZHJlc3MKIAkJCXx8IGVwLT5maWZvX3NpemUgPCBsZTE2X3RvX2NwdQogCQkJCQkJKGRlc2MtPndNYXhQYWNrZXRTaXplKSkgewotCQlETVNHKCIlcywgYmFkIGVwIG9yIGRlc2NyaXB0b3JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURNU0coIiVzLCBiYWQgZXAgb3IgZGVzY3JpcHRvclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI0Myw3ICsyNDMsNyBAQAogCWlmIChlcC0+Ym1BdHRyaWJ1dGVzICE9IGRlc2MtPmJtQXR0cmlidXRlcwogCQkJJiYgZXAtPmJtQXR0cmlidXRlcyAhPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCiAJCQkmJiBkZXNjLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7Ci0JCURNU0coIiVzLCAlcyB0eXBlIG1pc21hdGNoXG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSk7CisJCURNU0coIiVzLCAlcyB0eXBlIG1pc21hdGNoXG4iLCBfX2Z1bmNfXywgX2VwLT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNTIsMTMgKzI1MiwxMyBAQAogCQkJCSYmIGxlMTZfdG9fY3B1IChkZXNjLT53TWF4UGFja2V0U2l6ZSkKIAkJCQkJCSE9IEJVTEtfRklGT19TSVpFKQogCQkJfHwgIWRlc2MtPndNYXhQYWNrZXRTaXplKSB7Ci0JCURNU0coIiVzLCBiYWQgJXMgbWF4cGFja2V0XG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSk7CisJCURNU0coIiVzLCBiYWQgJXMgbWF4cGFja2V0XG4iLCBfX2Z1bmNfXywgX2VwLT5uYW1lKTsKIAkJcmV0dXJuIC1FUkFOR0U7CiAJfQogCiAJZGV2ID0gZXAtPmRldjsKIAlpZiAoIWRldi0+ZHJpdmVyIHx8IGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7Ci0JCURNU0coIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURNU0coIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FU0hVVERPV047CiAJfQogCkBAIC0yODMsNyArMjgzLDcgQEAKIAogCWVwID0gY29udGFpbmVyX29mIChfZXAsIHN0cnVjdCBweGEyeHhfZXAsIGVwKTsKIAlpZiAoIV9lcCB8fCAhZXAtPmRlc2MpIHsKLQkJRE1TRygiJXMsICVzIG5vdCBlbmFibGVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCURNU0coIiVzLCAlcyBub3QgZW5hYmxlZFxuIiwgX19mdW5jX18sCiAJCQlfZXAgPyBlcC0+ZXAubmFtZSA6IE5VTEwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00NjEsNyArNDYxLDcgQEAKIAlVU0lSMCA9IFVTSVIwX0lSMDsKIAlkZXYtPnJlcV9wZW5kaW5nID0gMDsKIAlEQkcoREJHX1ZFUllfTk9JU1ksICIlcyAlcywgJTAyeC8lMDJ4XG4iLAotCQlfX0ZVTkNUSU9OX18sIHRhZywgVURDQ1MwLCBmbGFncyk7CisJCV9fZnVuY19fLCB0YWcsIFVEQ0NTMCwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CkBAIC02NTEsMjAgKzY1MSwyMCBAQAogCXJlcSA9IGNvbnRhaW5lcl9vZihfcmVxLCBzdHJ1Y3QgcHhhMnh4X3JlcXVlc3QsIHJlcSk7CiAJaWYgKHVubGlrZWx5ICghX3JlcSB8fCAhX3JlcS0+Y29tcGxldGUgfHwgIV9yZXEtPmJ1ZgogCQkJfHwgIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKSkgewotCQlETVNHKCIlcywgYmFkIHBhcmFtc1xuIiwgX19GVU5DVElPTl9fKTsKKwkJRE1TRygiJXMsIGJhZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgcHhhMnh4X2VwLCBlcCk7CiAJaWYgKHVubGlrZWx5ICghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXAtPmVwLm5hbWUgIT0gZXAwbmFtZSkpKSB7Ci0JCURNU0coIiVzLCBiYWQgZXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURNU0coIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZGV2ID0gZXAtPmRldjsKIAlpZiAodW5saWtlbHkgKCFkZXYtPmRyaXZlcgogCQkJfHwgZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pKSB7Ci0JCURNU0coIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURNU0coIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FU0hVVERPV047CiAJfQogCkBAIC04MDcsNyArODA3LDcgQEAKIAlpZiAodW5saWtlbHkgKCFfZXAKIAkJCXx8ICghZXAtPmRlc2MgJiYgZXAtPmVwLm5hbWUgIT0gZXAwbmFtZSkpCiAJCQl8fCBlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKLQkJRE1TRygiJXMsIGJhZCBlcFxuIiwgX19GVU5DVElPTl9fKTsKKwkJRE1TRygiJXMsIGJhZCBlcFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHZhbHVlID09IDApIHsKQEAgLTg1OSw3ICs4NTksNyBAQAogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgcHhhMnh4X2VwLCBlcCk7CiAJaWYgKCFfZXApIHsKLQkJRE1TRygiJXMsIGJhZCBlcFxuIiwgX19GVU5DVElPTl9fKTsKKwkJRE1TRygiJXMsIGJhZCBlcFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJLyogcHhhIGNhbid0IHJlcG9ydCB1bmNsYWltZWQgYnl0ZXMgZnJvbSBJTiBmaWZvcyAqLwpAQCAtODc4LDcgKzg3OCw3IEBACiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBweGEyeHhfZXAsIGVwKTsKIAlpZiAoIV9lcCB8fCBlcC0+ZXAubmFtZSA9PSBlcDBuYW1lIHx8ICFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7Ci0JCURNU0coIiVzLCBiYWQgZXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURNU0coIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTgxMyw3ICsxODEzLDcgQEAKIAogc3RhdGljIHZvaWQgbm9wX3JlbGVhc2UgKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlETVNHKCIlcyAlc1xuIiwgX19GVU5DVElPTl9fLCBkZXYtPmJ1c19pZCk7CisJRE1TRygiJXMgJXNcbiIsIF9fZnVuY19fLCBkZXYtPmJ1c19pZCk7CiB9CiAKIC8qIHRoaXMgdXNlcyBsb2FkLXRpbWUgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gKGluc3RlYWQgb2YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKaW5kZXggM2QwMzY2NC4uYmQ1OGRkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1NVUFBPUlRFRF9MSVNUOgotCQlEQkcoIiVzOiBPSURfR0VOX1NVUFBPUlRFRF9MSVNUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX1NVUFBPUlRFRF9MSVNUXG4iLCBfX2Z1bmNfXyk7CiAJCWxlbmd0aCA9IHNpemVvZiAob2lkX3N1cHBvcnRlZF9saXN0KTsKIAkJY291bnQgID0gbGVuZ3RoIC8gc2l6ZW9mICh1MzIpOwogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKQEAgLTIxNCw3ICsyMTQsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX0hBUkRXQVJFX1NUQVRVUzoKLQkJREJHKCIlczogT0lEX0dFTl9IQVJEV0FSRV9TVEFUVVNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fSEFSRFdBUkVfU1RBVFVTXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIEJvZ3VzIHF1ZXN0aW9uIQogCQkgKiBIYXJkd2FyZSBtdXN0IGJlIHJlYWR5IHRvIHJlY2VpdmUgaGlnaCBsZXZlbCBwcm90b2NvbHMuCiAJCSAqIEJUVzoKQEAgLTIyNywxNCArMjI3LDE0IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fTUVESUFfU1VQUE9SVEVEOgotCQlEQkcoIiVzOiBPSURfR0VOX01FRElBX1NVUFBPUlRFRFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9NRURJQV9TVVBQT1JURURcbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLm1lZGl1bSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01FRElBX0lOX1VTRToKLQkJREJHKCIlczogT0lEX0dFTl9NRURJQV9JTl9VU0VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fTUVESUFfSU5fVVNFXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIG9uZSBtZWRpdW0sIG9uZSB0cmFuc3BvcnQuLi4gKG1heWJlIHlvdSBkbyBpdCBiZXR0ZXIpICovCiAJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5tZWRpdW0pOwogCQlyZXR2YWwgPSAwOwpAQCAtMjQyLDcgKzI0Miw3IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fTUFYSU1VTV9GUkFNRV9TSVpFOgotCQlEQkcoIiVzOiBPSURfR0VOX01BWElNVU1fRlJBTUVfU0laRVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9NQVhJTVVNX0ZSQU1FX1NJWkVcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2LT5tdHUpOwpAQCAtMjUzLDcgKzI1Myw3IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX0xJTktfU1BFRUQ6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX0xJTktfU1BFRURcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlEQkcoIiVzOiBPSURfR0VOX0xJTktfU1BFRURcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaWFfc3RhdGUKIAkJCQk9PSBORElTX01FRElBX1NUQVRFX0RJU0NPTk5FQ1RFRCkKIAkJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1RSQU5TTUlUX0JMT0NLX1NJWkU6Ci0JCURCRygiJXM6IE9JRF9HRU5fVFJBTlNNSVRfQkxPQ0tfU0laRVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9UUkFOU01JVF9CTE9DS19TSVpFXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldikgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldi0+bXR1KTsKQEAgLTI3NSw3ICsyNzUsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1JFQ0VJVkVfQkxPQ0tfU0laRToKLQkJREJHKCIlczogT0lEX0dFTl9SRUNFSVZFX0JMT0NLX1NJWkVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fUkVDRUlWRV9CTE9DS19TSVpFXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldikgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldi0+bXR1KTsKQEAgLTI4NSw3ICsyODUsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1ZFTkRPUl9JRDoKLQkJREJHKCIlczogT0lEX0dFTl9WRU5ET1JfSURcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fVkVORE9SX0lEXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnZlbmRvcklEKTsKIAkJcmV0dmFsID0gMDsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1ZFTkRPUl9ERVNDUklQVElPTjoKLQkJREJHKCIlczogT0lEX0dFTl9WRU5ET1JfREVTQ1JJUFRJT05cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fVkVORE9SX0RFU0NSSVBUSU9OXG4iLCBfX2Z1bmNfXyk7CiAJCWxlbmd0aCA9IHN0cmxlbiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS52ZW5kb3JEZXNjcik7CiAJCW1lbWNweSAob3V0YnVmLAogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS52ZW5kb3JEZXNjciwgbGVuZ3RoKTsKQEAgLTMwMSw3ICszMDEsNyBAQAogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9WRU5ET1JfRFJJVkVSX1ZFUlNJT046Ci0JCURCRygiJXM6IE9JRF9HRU5fVkVORE9SX0RSSVZFUl9WRVJTSU9OXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX1ZFTkRPUl9EUklWRVJfVkVSU0lPTlxuIiwgX19mdW5jX18pOwogCQkvKiBDcmVhdGVkIGFzIExFICovCiAJCSpvdXRidWYgPSBybmRpc19kcml2ZXJfdmVyc2lvbjsKIAkJcmV0dmFsID0gMDsKQEAgLTMwOSwxNCArMzA5LDE0IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSOgotCQlEQkcoIiVzOiBPSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVJcbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgqcm5kaXNfcGVyX2Rldl9wYXJhbXNbY29uZmlnTnJdLmZpbHRlcik7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01BWElNVU1fVE9UQUxfU0laRToKLQkJREJHKCIlczogT0lEX0dFTl9NQVhJTVVNX1RPVEFMX1NJWkVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fTUFYSU1VTV9UT1RBTF9TSVpFXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKFJORElTX01BWF9UT1RBTF9TSVpFKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CkBAIC0zMjQsMTQgKzMyNCwxNCBAQAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKIAkJaWYgKHJuZGlzX2RlYnVnID4gMSkKLQkJCURCRygiJXM6IE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlEQkcoIiVzOiBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkJLm1lZGlhX3N0YXRlKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fUEhZU0lDQUxfTUVESVVNOgotCQlEQkcoIiVzOiBPSURfR0VOX1BIWVNJQ0FMX01FRElVTVxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9QSFlTSUNBTF9NRURJVU1cbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKQEAgLTM0MSw3ICszNDEsNyBAQAogCSAqIHZlcnNpb25zIGVtaXQgdW5kZWZpbmVkIFJORElTIG1lc3NhZ2VzLiBET0NVTUVOVCBBTEwgVEhFU0UhCiAJICovCiAJY2FzZSBPSURfR0VOX01BQ19PUFRJT05TOgkJLyogZnJvbSBXaW5NRSAqLwotCQlEQkcoIiVzOiBPSURfR0VOX01BQ19PUFRJT05TXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX01BQ19PUFRJT05TXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKAogCQkJICBORElTX01BQ19PUFRJT05fUkVDRUlWRV9TRVJJQUxJWkVECiAJCQl8IE5ESVNfTUFDX09QVElPTl9GVUxMX0RVUExFWCk7CkBAIC0zNTMsNyArMzUzLDcgQEAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fWE1JVF9PSzoKIAkJaWYgKHJuZGlzX2RlYnVnID4gMSkKLQkJCURCRygiJXM6IE9JRF9HRU5fWE1JVF9PS1xuIiwgX19GVU5DVElPTl9fKTsKKwkJCURCRygiJXM6IE9JRF9HRU5fWE1JVF9PS1xuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCSAgICBybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzLT50eF9wYWNrZXRzIC0KQEAgLTM2Niw3ICszNjYsNyBAQAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9SQ1ZfT0s6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX1JDVl9PS1xuIiwgX19GVU5DVElPTl9fKTsKKwkJCURCRygiJXM6IE9JRF9HRU5fUkNWX09LXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJICAgIHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMtPnJ4X3BhY2tldHMgLQpAQCAtMzc5LDcgKzM3OSw3IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1hNSVRfRVJST1I6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX1hNSVRfRVJST1JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlEQkcoIiVzOiBPSURfR0VOX1hNSVRfRVJST1JcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnR4X2Vycm9ycyk7CkBAIC0zOTAsNyArMzkwLDcgQEAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fUkNWX0VSUk9SOgogCQlpZiAocm5kaXNfZGVidWcgPiAxKQotCQkJREJHKCIlczogT0lEX0dFTl9SQ1ZfRVJST1JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlEQkcoIiVzOiBPSURfR0VOX1JDVl9FUlJPUlxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+cnhfZXJyb3JzKTsKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6Ci0JCURCRygiJXM6IE9JRF9HRU5fUkNWX05PX0JVRkZFUlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5yeF9kcm9wcGVkKTsKQEAgLTQxMCw3ICs0MTAsNyBAQAogCiAjaWZkZWYJUk5ESVNfT1BUSU9OQUxfU1RBVFMKIAljYXNlIE9JRF9HRU5fRElSRUNURURfQllURVNfWE1JVDoKLQkJREJHKCIlczogT0lEX0dFTl9ESVJFQ1RFRF9CWVRFU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1hNSVRcbiIsIF9fZnVuY19fKTsKIAkJLyoKIAkJICogQXVudCBUaWxseSdzIHNpemUgb2Ygc2hvZXMKIAkJICogbWludXMgYW50YXJjdGljYSBjb3VudCBvZiBwZW5ndWlucwpAQCAtNDMwLDcgKzQzMCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19YTUlUOgotCQlEQkcoIiVzOiBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19YTUlUXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIGRpdG8gKi8KIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCkBAIC00NDYsNyArNDQ2LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1hNSVQ6Ci0JCURCRygiJXM6IE9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1hNSVRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1hNSVRcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPm11bHRpY2FzdCoxMjM0KTsKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1hNSVQ6Ci0JCURCRygiJXM6IE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfWE1JVFxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+bXVsdGljYXN0KTsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9CUk9BRENBU1RfQllURVNfWE1JVDoKLQkJREJHKCIlczogT0lEX0dFTl9CUk9BRENBU1RfQllURVNfWE1JVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9CUk9BRENBU1RfQllURVNfWE1JVFxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+dHhfcGFja2V0cy80MioyNTUpOwpAQCAtNDczLDcgKzQ3Myw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfWE1JVDoKLQkJREJHKCIlczogT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1hNSVRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlUXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT50eF9wYWNrZXRzLzQyKTsKQEAgLTQ4MiwxOSArNDgyLDE5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1JDVjoKLQkJREJHKCIlczogT0lEX0dFTl9ESVJFQ1RFRF9CWVRFU19SQ1ZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fRElSRUNURURfQllURVNfUkNWXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDVjoKLQkJREJHKCIlczogT0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX0RJUkVDVEVEX0ZSQU1FU19SQ1ZcbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfUkNWOgotCQlEQkcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19SQ1ZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1JDVlxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+bXVsdGljYXN0ICogMTExMSk7CkBAIC01MDMsNyArNTAzLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19SQ1Y6Ci0JCURCRygiJXM6IE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19SQ1ZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19SQ1ZcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPm11bHRpY2FzdCk7CkBAIC01MTIsNyArNTEyLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1JDVjoKLQkJREJHKCIlczogT0lEX0dFTl9CUk9BRENBU1RfQllURVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19SQ1ZcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X3BhY2tldHMvNDIqMjU1KTsKQEAgLTUyMSw3ICs1MjEsNyBAQAogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDVjoKLQkJREJHKCIlczogT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDVlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDVlxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+cnhfcGFja2V0cy80Mik7CkBAIC01MzAsNyArNTMwLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fUkNWX0NSQ19FUlJPUjoKLQkJREJHKCIlczogT0lEX0dFTl9SQ1ZfQ1JDX0VSUk9SXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfR0VOX1JDVl9DUkNfRVJST1JcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X2NyY19lcnJvcnMpOwpAQCAtNTM5LDcgKzUzOSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSURfR0VOX1RSQU5TTUlUX1FVRVVFX0xFTkdUSDoKLQkJREJHKCIlczogT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEhcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RIXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CkBAIC01NDksNyArNTQ5LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTOgotCQlEQkcoIiVzOiBPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1NcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTU1xuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCWxlbmd0aCA9IEVUSF9BTEVOOwogCQkJbWVtY3B5IChvdXRidWYsCkBAIC01NjEsNyArNTYxLDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKLQkJREJHKCIlczogT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTU1xuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCWxlbmd0aCA9IEVUSF9BTEVOOwogCQkJbWVtY3B5IChvdXRidWYsCkBAIC01NzMsNyArNTczLDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUOgotCQlEQkcoIiVzOiBPSURfODAyXzNfTVVMVElDQVNUX0xJU1RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19NVUxUSUNBU1RfTElTVFxuIiwgX19mdW5jX18pOwogCQkvKiBNdWx0aWNhc3QgYmFzZSBhZGRyZXNzIG9ubHkgKi8KIAkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDB4RTAwMDAwMDApOwogCQlyZXR2YWwgPSAwOwpAQCAtNTgxLDIxICs1ODEsMjEgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX01BWElNVU1fTElTVF9TSVpFOgotCQlEQkcoIiVzOiBPSURfODAyXzNfTUFYSU1VTV9MSVNUX1NJWkVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19NQVhJTVVNX0xJU1RfU0laRVxuIiwgX19mdW5jX18pOwogCQkvKiBNdWx0aWNhc3QgYmFzZSBhZGRyZXNzIG9ubHkgKi8KIAkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDEpOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCWNhc2UgT0lEXzgwMl8zX01BQ19PUFRJT05TOgotCQlEQkcoIiVzOiBPSURfODAyXzNfTUFDX09QVElPTlNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19NQUNfT1BUSU9OU1xuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAogCS8qIGllZWU4MDIuMyBzdGF0aXN0aWNzIE9JRHMgKHRhYmxlIDQtNCkgKi8KIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX1JDVl9FUlJPUl9BTElHTk1FTlQ6Ci0JCURCRygiJXM6IE9JRF84MDJfM19SQ1ZfRVJST1JfQUxJR05NRU5UXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVFxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+cnhfZnJhbWVfZXJyb3JzKTsKQEAgLTYwNSw1MSArNjA1LDUxIEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT046Ci0JCURCRygiJXM6IE9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT05cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT05cbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TOgotCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9NT1JFX0NPTExJU0lPTlNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19YTUlUX01PUkVfQ09MTElTSU9OU1xuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAjaWZkZWYJUk5ESVNfT1BUSU9OQUxfU1RBVFMKIAljYXNlIE9JRF84MDJfM19YTUlUX0RFRkVSUkVEOgotCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9ERUZFUlJFRFxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfREVGRVJSRURcbiIsIF9fZnVuY19fKTsKIAkJLyogVE9ETyAqLwogCQlicmVhazsKIAogCWNhc2UgT0lEXzgwMl8zX1hNSVRfTUFYX0NPTExJU0lPTlM6Ci0JCURCRygiJXM6IE9JRF84MDJfM19YTUlUX01BWF9DT0xMSVNJT05TXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9NQVhfQ09MTElTSU9OU1xuIiwgX19mdW5jX18pOwogCQkvKiBUT0RPICovCiAJCWJyZWFrOwogCiAJY2FzZSBPSURfODAyXzNfUkNWX09WRVJSVU46Ci0JCURCRygiJXM6IE9JRF84MDJfM19SQ1ZfT1ZFUlJVTlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX1JDVl9PVkVSUlVOXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIFRPRE8gKi8KIAkJYnJlYWs7CiAKIAljYXNlIE9JRF84MDJfM19YTUlUX1VOREVSUlVOOgotCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9VTkRFUlJVTlxuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfVU5ERVJSVU5cbiIsIF9fZnVuY19fKTsKIAkJLyogVE9ETyAqLwogCQlicmVhazsKIAogCWNhc2UgT0lEXzgwMl8zX1hNSVRfSEVBUlRCRUFUX0ZBSUxVUkU6Ci0JCURCRygiJXM6IE9JRF84MDJfM19YTUlUX0hFQVJUQkVBVF9GQUlMVVJFXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9IRUFSVEJFQVRfRkFJTFVSRVxuIiwgX19mdW5jX18pOwogCQkvKiBUT0RPICovCiAJCWJyZWFrOwogCiAJY2FzZSBPSURfODAyXzNfWE1JVF9USU1FU19DUlNfTE9TVDoKLQkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfVElNRVNfQ1JTX0xPU1RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCRygiJXM6IE9JRF84MDJfM19YTUlUX1RJTUVTX0NSU19MT1NUXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIFRPRE8gKi8KIAkJYnJlYWs7CiAKIAljYXNlIE9JRF84MDJfM19YTUlUX0xBVEVfQ09MTElTSU9OUzoKLQkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfTEFURV9DT0xMSVNJT05TXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfWE1JVF9MQVRFX0NPTExJU0lPTlNcbiIsIF9fZnVuY19fKTsKIAkJLyogVE9ETyAqLwogCQlicmVhazsKICNlbmRpZgkvKiBSTkRJU19PUFRJT05BTF9TVEFUUyAqLwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAjaWZkZWYJUk5ESVNfUE0KIAkvKiBwb3dlciBtYW5hZ2VtZW50IE9JRHMgKHRhYmxlIDQtNSkgKi8KIAljYXNlIE9JRF9QTlBfQ0FQQUJJTElUSUVTOgotCQlEQkcoIiVzOiBPSURfUE5QX0NBUEFCSUxJVElFU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJREJHKCIlczogT0lEX1BOUF9DQVBBQklMSVRJRVNcbiIsIF9fZnVuY19fKTsKIAogCQkvKiBmb3Igbm93LCBubyB3YWtldXAgY2FwYWJpbGl0aWVzICovCiAJCWxlbmd0aCA9IHNpemVvZiAoc3RydWN0IE5ESVNfUE5QX0NBUEFCSUxJVElFUyk7CkBAIC02NjUsNyArNjY1LDcgQEAKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBPSURfUE5QX1FVRVJZX1BPV0VSOgotCQlEQkcoIiVzOiBPSURfUE5QX1FVRVJZX1BPV0VSIEQlZFxuIiwgX19GVU5DVElPTl9fLAorCQlEQkcoIiVzOiBPSURfUE5QX1FVRVJZX1BPV0VSIEQlZFxuIiwgX19mdW5jX18sCiAJCQkJbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19sZTMyICopYnVmKSkgLSAxKTsKIAkJLyogb25seSBzdXNwZW5kIGlzIGEgcmVhbCBwb3dlciBzdGF0ZSwgYW5kCiAJCSAqIGl0IGNhbid0IGJlIGVudGVyZWQgYnkgT0lEX1BOUF9TRVRfUE9XRVIuLi4KQEAgLTY3Nyw3ICs2NzcsNyBAQAogCiAJZGVmYXVsdDoKIAkJcHJfd2FybmluZygiJXM6IHF1ZXJ5IHVua25vd24gT0lEIDB4JTA4WFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sIE9JRCk7CisJCQkgX19mdW5jX18sIE9JRCk7CiAJfQogCWlmIChyZXR2YWwgPCAwKQogCQlsZW5ndGggPSAwOwpAQCAtNzI5LDcgKzcyOSw3IEBACiAJCSpwYXJhbXMtPmZpbHRlciA9ICh1MTYpIGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoCiAJCQkJKF9fbGUzMiAqKWJ1ZikpOwogCQlEQkcoIiVzOiBPSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUiAlMDh4XG4iLAotCQkJX19GVU5DVElPTl9fLCAqcGFyYW1zLT5maWx0ZXIpOworCQkJX19mdW5jX18sICpwYXJhbXMtPmZpbHRlcik7CiAKIAkJLyogdGhpcyBjYWxsIGhhcyBhIHNpZ25pZmljYW50IHNpZGUgZWZmZWN0OiAgaXQncwogCQkgKiB3aGF0IG1ha2VzIHRoZSBwYWNrZXQgZmxvdyBzdGFydCBhbmQgc3RvcCwgbGlrZQpAQCAtNzUzLDcgKzc1Myw3IEBACiAKIAljYXNlIE9JRF84MDJfM19NVUxUSUNBU1RfTElTVDoKIAkJLyogSSB0aGluayB3ZSBjYW4gaWdub3JlIHRoaXMgKi8KLQkJREJHKCIlczogT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkcoIiVzOiBPSURfODAyXzNfTVVMVElDQVNUX0xJU1RcbiIsIF9fZnVuY19fKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAjaWYgMApAQCAtNzYyLDcgKzc2Miw3IEBACiAJCXN0cnVjdCBybmRpc19jb25maWdfcGFyYW1ldGVyCSpwYXJhbTsKIAkJcGFyYW0gPSAoc3RydWN0IHJuZGlzX2NvbmZpZ19wYXJhbWV0ZXIgKikgYnVmOwogCQlEQkcoIiVzOiBPSURfR0VOX1JORElTX0NPTkZJR19QQVJBTUVURVIgJyUqcydcbiIsCi0JCQlfX0ZVTkNUSU9OX18sCisJCQlfX2Z1bmNfXywKIAkJCW1pbihjcHVfdG9fbGUzMihwYXJhbS0+UGFyYW1ldGVyTmFtZUxlbmd0aCksODApLAogCQkJYnVmICsgcGFyYW0tPlBhcmFtZXRlck5hbWVPZmZzZXQpOwogCQlyZXR2YWwgPSAwOwpAQCAtNzc4LDcgKzc3OCw3IEBACiAJCSAqIEZJWE1FIC4uLiB0aGVuIHRoaW5ncyBnbyBiYXR0eTsgV2luZG93cyB3ZWRnZXMgaXRzZWxmLgogCQkgKi8KIAkJaSA9IGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUzMiAqKWJ1ZikpOwotCQlEQkcoIiVzOiBPSURfUE5QX1NFVF9QT1dFUiBEJWRcbiIsIF9fRlVOQ1RJT05fXywgaSAtIDEpOworCQlEQkcoIiVzOiBPSURfUE5QX1NFVF9QT1dFUiBEJWRcbiIsIF9fZnVuY19fLCBpIC0gMSk7CiAJCXN3aXRjaCAoaSkgewogCQljYXNlIE5kaXNEZXZpY2VTdGF0ZUQwOgogCQkJKnBhcmFtcy0+ZmlsdGVyID0gcGFyYW1zLT5zYXZlZF9maWx0ZXI7CkBAIC04MDIsNyArODAyLDcgQEAKIAogCWRlZmF1bHQ6CiAJCXByX3dhcm5pbmcoIiVzOiBzZXQgdW5rbm93biBPSUQgMHglMDhYLCBzaXplICVkXG4iLAotCQkJIF9fRlVOQ1RJT05fXywgT0lELCBidWZfbGVuKTsKKwkJCSBfX2Z1bmNfXywgT0lELCBidWZfbGVuKTsKIAl9CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtODU1LDcgKzg1NSw3IEBACiAJcm5kaXNfcXVlcnlfY21wbHRfdHlwZSAqcmVzcDsKIAlybmRpc19yZXNwX3QgICAgICAgICAgICAqcjsKIAotCS8vIERCRygiJXM6IE9JRCA9ICUwOFhcbiIsIF9fRlVOQ1RJT05fXywgY3B1X3RvX2xlMzIoYnVmLT5PSUQpKTsKKwkvLyBEQkcoIiVzOiBPSUQgPSAlMDhYXG4iLCBfX2Z1bmNfXywgY3B1X3RvX2xlMzIoYnVmLT5PSUQpKTsKIAlpZiAoIXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSByZXR1cm4gLUVOT1RTVVBQOwogCiAJLyoKQEAgLTkwOCw5ICs5MDgsOSBAQAogCUJ1Zk9mZnNldCA9IGxlMzJfdG9fY3B1IChidWYtPkluZm9ybWF0aW9uQnVmZmVyT2Zmc2V0KTsKIAogI2lmZGVmCVZFUkJPU0UKLQlEQkcoIiVzOiBMZW5ndGg6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIEJ1Zkxlbmd0aCk7Ci0JREJHKCIlczogT2Zmc2V0OiAlZFxuIiwgX19GVU5DVElPTl9fLCBCdWZPZmZzZXQpOwotCURCRygiJXM6IEluZm9CdWZmZXI6ICIsIF9fRlVOQ1RJT05fXyk7CisJREJHKCIlczogTGVuZ3RoOiAlZFxuIiwgX19mdW5jX18sIEJ1Zkxlbmd0aCk7CisJREJHKCIlczogT2Zmc2V0OiAlZFxuIiwgX19mdW5jX18sIEJ1Zk9mZnNldCk7CisJREJHKCIlczogSW5mb0J1ZmZlcjogIiwgX19mdW5jX18pOwogCiAJZm9yIChpID0gMDsgaSA8IEJ1Zkxlbmd0aDsgaSsrKSB7CiAJCURCRygiJTAyeCAiLCAqKCgodTggKikgYnVmKSArIGkgKyA4ICsgQnVmT2Zmc2V0KSk7CkBAIC0xMDgwLDE0ICsxMDgwLDE0IEBACiAJc3dpdGNoIChNc2dUeXBlKSB7CiAJY2FzZSBSRU1PVEVfTkRJU19JTklUSUFMSVpFX01TRzoKIAkJREJHKCIlczogUkVNT1RFX05ESVNfSU5JVElBTElaRV9NU0dcbiIsCi0JCQlfX0ZVTkNUSU9OX18gKTsKKwkJCV9fZnVuY19fICk7CiAJCXBhcmFtcy0+c3RhdGUgPSBSTkRJU19JTklUSUFMSVpFRDsKIAkJcmV0dXJuICBybmRpc19pbml0X3Jlc3BvbnNlIChjb25maWdOciwKIAkJCQkJKHJuZGlzX2luaXRfbXNnX3R5cGUgKikgYnVmKTsKIAogCWNhc2UgUkVNT1RFX05ESVNfSEFMVF9NU0c6CiAJCURCRygiJXM6IFJFTU9URV9ORElTX0hBTFRfTVNHXG4iLAotCQkJX19GVU5DVElPTl9fICk7CisJCQlfX2Z1bmNfXyApOwogCQlwYXJhbXMtPnN0YXRlID0gUk5ESVNfVU5JTklUSUFMSVpFRDsKIAkJaWYgKHBhcmFtcy0+ZGV2KSB7CiAJCQluZXRpZl9jYXJyaWVyX29mZiAocGFyYW1zLT5kZXYpOwpAQCAtMTEwNSw3ICsxMTA1LDcgQEAKIAogCWNhc2UgUkVNT1RFX05ESVNfUkVTRVRfTVNHOgogCQlEQkcoIiVzOiBSRU1PVEVfTkRJU19SRVNFVF9NU0dcbiIsCi0JCQlfX0ZVTkNUSU9OX18gKTsKKwkJCV9fZnVuY19fICk7CiAJCXJldHVybiBybmRpc19yZXNldF9yZXNwb25zZSAoY29uZmlnTnIsCiAJCQkJCShybmRpc19yZXNldF9tc2dfdHlwZSAqKSBidWYpOwogCkBAIC0xMTEzLDcgKzExMTMsNyBAQAogCQkvKiBGb3IgVVNCOiBob3N0IGRvZXMgdGhpcyBldmVyeSA1IHNlY29uZHMgKi8KIAkJaWYgKHJuZGlzX2RlYnVnID4gMSkKIAkJCURCRygiJXM6IFJFTU9URV9ORElTX0tFRVBBTElWRV9NU0dcbiIsCi0JCQkJX19GVU5DVElPTl9fICk7CisJCQkJX19mdW5jX18gKTsKIAkJcmV0dXJuIHJuZGlzX2tlZXBhbGl2ZV9yZXNwb25zZSAoY29uZmlnTnIsCiAJCQkJCQkgKHJuZGlzX2tlZXBhbGl2ZV9tc2dfdHlwZSAqKQogCQkJCQkJIGJ1Zik7CkBAIC0xMTI0LDcgKzExMjQsNyBAQAogCQkgKiBzdXNwZW5kaW5nIGl0c2VsZi4KIAkJICovCiAJCXByX3dhcm5pbmcoIiVzOiB1bmtub3duIFJORElTIG1lc3NhZ2UgMHglMDhYIGxlbiAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXyAsIE1zZ1R5cGUsIE1zZ0xlbmd0aCk7CisJCQlfX2Z1bmNfXyAsIE1zZ1R5cGUsIE1zZ0xlbmd0aCk7CiAJCXsKIAkJCXVuc2lnbmVkIGk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgTXNnTGVuZ3RoOyBpICs9IDE2KSB7CkBAIC0xMTU5LDcgKzExNTksNyBAQAogCQlpZiAoIXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtpXS51c2VkKSB7CiAJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbaV0udXNlZCA9IDE7CiAJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbaV0uYWNrID0gcm5kaXNfY29udHJvbF9hY2s7Ci0JCQlEQkcoIiVzOiBjb25maWdOciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGkpOworCQkJREJHKCIlczogY29uZmlnTnIgPSAlZFxuIiwgX19mdW5jX18sIGkpOwogCQkJcmV0dXJuIGk7CiAJCX0KIAl9CkBAIC0xMTcwLDcgKzExNzAsNyBAQAogCiB2b2lkIHJuZGlzX2RlcmVnaXN0ZXIgKGludCBjb25maWdOcikKIHsKLQlEQkcoIiVzOiBcbiIsIF9fRlVOQ1RJT05fXyApOworCURCRygiJXM6IFxuIiwgX19mdW5jX18gKTsKIAogCWlmIChjb25maWdOciA+PSBSTkRJU19NQVhfQ09ORklHUykgcmV0dXJuOwogCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0udXNlZCA9IDA7CkBAIC0xMTgyLDcgKzExODIsNyBAQAogCQkJIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywKIAkJCSB1MTYgKmNkY19maWx0ZXIpCiB7Ci0JREJHKCIlczpcbiIsIF9fRlVOQ1RJT05fXyApOworCURCRygiJXM6XG4iLCBfX2Z1bmNfXyApOwogCWlmICghZGV2IHx8ICFzdGF0cykgcmV0dXJuIC0xOwogCWlmIChjb25maWdOciA+PSBSTkRJU19NQVhfQ09ORklHUykgcmV0dXJuIC0xOwogCkBAIC0xMTk1LDcgKzExOTUsNyBAQAogCiBpbnQgcm5kaXNfc2V0X3BhcmFtX3ZlbmRvciAodTggY29uZmlnTnIsIHUzMiB2ZW5kb3JJRCwgY29uc3QgY2hhciAqdmVuZG9yRGVzY3IpCiB7Ci0JREJHKCIlczpcbiIsIF9fRlVOQ1RJT05fXyApOworCURCRygiJXM6XG4iLCBfX2Z1bmNfXyApOwogCWlmICghdmVuZG9yRGVzY3IpIHJldHVybiAtMTsKIAlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpIHJldHVybiAtMTsKIApAQCAtMTIwNyw3ICsxMjA3LDcgQEAKIAogaW50IHJuZGlzX3NldF9wYXJhbV9tZWRpdW0gKHU4IGNvbmZpZ05yLCB1MzIgbWVkaXVtLCB1MzIgc3BlZWQpCiB7Ci0JREJHKCIlczogJXUgJXVcbiIsIF9fRlVOQ1RJT05fXywgbWVkaXVtLCBzcGVlZCk7CisJREJHKCIlczogJXUgJXVcbiIsIF9fZnVuY19fLCBtZWRpdW0sIHNwZWVkKTsKIAlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpIHJldHVybiAtMTsKIAogCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaXVtID0gbWVkaXVtOwpAQCAtMTQwMyw3ICsxNDAzLDcgQEAKICNlbmRpZgkvKiBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyAqLwogCiAKLWludCBfX2RldmluaXQgcm5kaXNfaW5pdCAodm9pZCkKK2ludCBfX2luaXQgcm5kaXNfaW5pdCAodm9pZCkKIHsKIAl1OCBpOwogCkBAIC0xNDE1LDcgKzE0MTUsNyBAQAogCQlpZiAoIShybmRpc19jb25uZWN0X3N0YXRlIFtpXQogCQkJCT0gY3JlYXRlX3Byb2NfZW50cnkgKG5hbWUsIDA2NjAsIE5VTEwpKSkKIAkJewotCQkJREJHKCIlcyA6cmVtb3ZlIGVudHJpZXMiLCBfX0ZVTkNUSU9OX18pOworCQkJREJHKCIlcyA6cmVtb3ZlIGVudHJpZXMiLCBfX2Z1bmNfXyk7CiAJCQl3aGlsZSAoaSkgewogCQkJCXNwcmludGYgKG5hbWUsIE5BTUVfVEVNUExBVEUsIC0taSk7CiAJCQkJcmVtb3ZlX3Byb2NfZW50cnkgKG5hbWUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCmluZGV4IGY1YzM4OTYuLjQzM2IzZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKQEAgLTIxNjMsOCArMjE2Myw3IEBACiAJCQkJcG9ydC0+cG9ydF9kZXYgPSBOVUxMOwogCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+cG9ydF93cml0ZV93YWl0KTsKIAkJCQlpZiAocG9ydC0+cG9ydF90dHkpIHsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5wb3J0X3R0eS0+cmVhZF93YWl0KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5wb3J0X3R0eS0+d3JpdGVfd2FpdCk7CisJCQkJCXR0eV9oYW5ndXAocG9ydC0+cG9ydF90dHkpOwogCQkJCX0KIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5wb3J0X2xvY2ssIGZsYWdzKTsKIAkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggYmY4YmUyYS4uMGI4NzQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwpAQCAtMzAsOCArMzAsOCBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVoY2ktaGNkLgogCiBjb25maWcgVVNCX0VIQ0lfUk9PVF9IVUJfVFQKLQlib29sICJSb290IEh1YiBUcmFuc2FjdGlvbiBUcmFuc2xhdG9ycyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9FSENJX0hDRCAmJiBFWFBFUklNRU5UQUwKKwlib29sICJSb290IEh1YiBUcmFuc2FjdGlvbiBUcmFuc2xhdG9ycyIKKwlkZXBlbmRzIG9uIFVTQl9FSENJX0hDRAogCS0tLWhlbHAtLS0KIAkgIFNvbWUgRUhDSSBjaGlwcyBoYXZlIHZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zIHRvIGludGVncmF0ZQogCSAgdHJhbnNhY3Rpb24gdHJhbnNsYXRvcnMsIHNvIHRoYXQgbm8gT0hDSSBvciBVSENJIGNvbXBhbmlvbgpAQCAtMjYwLDMgKzI2MCw5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByOGE2NjU5Ny1oY2QuCiAKK2NvbmZpZyBTVVBFUkhfT05fQ0hJUF9SOEE2NjU5NworCWJvb2xlYW4gIkVuYWJsZSBTdXBlckggb24tY2hpcCBVU0IgbGlrZSB0aGUgUjhBNjY1OTciCisJZGVwZW5kcyBvbiBVU0JfUjhBNjY1OTdfSENEICYmIENQVV9TVUJUWVBFX1NINzM2NgorCWhlbHAKKwkgICBSZW5lc2FzIFN1cGVySCBwcm9jZXNzb3IgaGFzIFVTQiBsaWtlIHRoZSBSOEE2NjU5Ny4KKwkgICBUaGlzIGRyaXZlciBzdXBwb3J0ZWQgcHJvY2Vzc29yIGlzIFNINzM2Ni4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1hdTF4eHguYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1hdTF4eHguYwppbmRleCBkYTc1MzJkLi44YjVmOTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXUxeHh4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWF1MXh4eC5jCkBAIC0yMzcsNiArMjM3LDcgQEAKIAlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogRklYTUUgd2Ugb25seSB3YW50IG9uZSBvbmUgcHJvYmUoKSBub3QgdHdvICovCiAJcmV0ID0gdXNiX2VoY2lfYXUxeHh4X3Byb2JlKCZlaGNpX2F1MXh4eF9oY19kcml2ZXIsICZoY2QsIHBkZXYpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yNDUsNiArMjQ2LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwkvKiBGSVhNRSB3ZSBvbmx5IHdhbnQgb25lIG9uZSByZW1vdmUoKSBub3QgdHdvICovCiAJdXNiX2VoY2lfYXUxeHh4X3JlbW92ZShoY2QsIHBkZXYpOwogCXJldHVybiAwOwogfQpAQCAtMjY1LDcgKzI2Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAqLwotTU9EVUxFX0FMSUFTKCJhdTF4eHgtZWhjaSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphdTF4eHgtZWhjaSIpOwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWhjaV9oY2RfYXUxeHh4X2RyaXZlciA9IHsKIAkucHJvYmUgPSBlaGNpX2hjZF9hdTF4eHhfZHJ2X3Byb2JlLAogCS5yZW1vdmUgPSBlaGNpX2hjZF9hdTF4eHhfZHJ2X3JlbW92ZSwKQEAgLTI3NCw2ICsyNzYsNSBAQAogCS8qLnJlc3VtZSAgICAgICA9IGVoY2lfaGNkX2F1MXh4eF9kcnZfcmVzdW1lLCAqLwogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImF1MXh4eC1laGNpIiwKLQkJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZQogCX0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKaW5kZXggNjRlYmZjNS4uNGFmOTBkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYwpAQCAtMjcsNyArMjcsNyBAQAogI2RlZmluZSBlaGNpX3dhcm4oZWhjaSwgZm10LCBhcmdzLi4uKSBcCiAJZGV2X3dhcm4gKGVoY2lfdG9faGNkKGVoY2kpLT5zZWxmLmNvbnRyb2xsZXIgLCBmbXQgLCAjIyBhcmdzICkKIAotI2lmZGVmIEVIQ0lfVkVSQk9TRV9ERUJVRworI2lmZGVmIFZFUkJPU0VfREVCVUcKICMJZGVmaW5lIHZkYmcgZGJnCiAjCWRlZmluZSBlaGNpX3ZkYmcgZWhjaV9kYmcKICNlbHNlCkBAIC02NzAsNyArNjcwLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGJ1Zi0+YnVzLT5jb250cm9sbGVyLT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkgeworCWlmICghdGVzdF9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwgJmhjZC0+ZmxhZ3MpKSB7CiAJCXNpemUgPSBzY25wcmludGYgKG5leHQsIHNpemUsCiAJCQkiYnVzICVzLCBkZXZpY2UgJXMgKGRyaXZlciAiIERSSVZFUl9WRVJTSU9OICIpXG4iCiAJCQkiJXNcbiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1mc2wuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1mc2wuYwppbmRleCBhZGIwZGVmLi42ZDliZWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZnNsLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWZzbC5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIChDKSBDb3B5cmlnaHQgRGF2aWQgQnJvd25lbGwgMjAwMC0yMDAyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTW9udGFWaXN0YSBTb2Z0d2FyZQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw3ICsyNyw2IEBACiAvKiBGSVhNRTogUG93ZXIgTWFuYWdlbWVudCBpcyB1bi1wb3J0ZWQgc28gdGVtcG9yYXJpbHkgZGlzYWJsZSBpdCAqLwogI3VuZGVmIENPTkZJR19QTQogCi0vKiBQQ0ktYmFzZWQgSENzIGFyZSBjb21tb24sIGJ1dCBwbGVudHkgb2Ygbm9uLVBDSSBIQ3MgYXJlIHVzZWQgdG9vICovCiAKIC8qIGNvbmZpZ3VyZSBzbyBhbiBIQyBkZXZpY2UgYW5kIGlkIGFyZSBhbHdheXMgcHJvdmlkZWQgKi8KIC8qIGFsd2F5cyBjYWxsZWQgd2l0aCBwcm9jZXNzIGNvbnRleHQ7IHNsZWVwaW5nIGlzIE9LICovCkBAIC0zMzEsNiArMzI5LDcgQEAKIAlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogRklYTUUgd2Ugb25seSB3YW50IG9uZSBvbmUgcHJvYmUoKSBub3QgdHdvICovCiAJcmV0dXJuIHVzYl9oY2RfZnNsX3Byb2JlKCZlaGNpX2ZzbF9oY19kcml2ZXIsIHBkZXYpOwogfQogCkBAIC0zMzgsMTIgKzMzNywxMiBAQAogewogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCS8qIEZJWE1FIHdlIG9ubHkgd2FudCBvbmUgb25lIHJlbW92ZSgpIG5vdCB0d28gKi8KIAl1c2JfaGNkX2ZzbF9yZW1vdmUoaGNkLCBwZGV2KTsKLQogCXJldHVybiAwOwogfQogCi1NT0RVTEVfQUxJQVMoImZzbC1laGNpIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmZzbC1laGNpIik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVoY2lfZnNsX2RyaXZlciA9IHsKIAkucHJvYmUgPSBlaGNpX2ZzbF9kcnZfcHJvYmUsCkBAIC0zNTEsNSArMzUwLDUgQEAKIAkuc2h1dGRvd24gPSB1c2JfaGNkX3BsYXRmb3JtX3NodXRkb3duLAogCS5kcml2ZXIgPSB7CiAJCSAgIC5uYW1lID0gImZzbC1laGNpIiwKLQkJICAgfSwKKwl9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwppbmRleCA4NTA3NGNiLi4zNjlhOGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCkBAIC01NywzNSArNTcsNiBAQAogICogU3BlY2lhbCB0aGFua3MgdG8gSW50ZWwgYW5kIFZJQSBmb3IgcHJvdmlkaW5nIGhvc3QgY29udHJvbGxlcnMgdG8KICAqIHRlc3QgdGhpcyBkcml2ZXIgb24sIGFuZCBDeXByZXNzIChpbmNsdWRpbmcgSW4tU3lzdGVtIERlc2lnbikgZm9yCiAgKiBwcm92aWRpbmcgZWFybHkgZGV2aWNlcyBmb3IgdGhvc2UgaG9zdCBjb250cm9sbGVycyB0byB0YWxrIHRvIQotICoKLSAqIEhJU1RPUlk6Ci0gKgotICogMjAwNC0wNS0xMCBSb290IGh1YiBhbmQgUENJIHN1c3BlbmQvcmVzdW1lIHN1cHBvcnQ7IHJlbW90ZSB3YWtldXAuIChkYikKLSAqIDIwMDQtMDItMjQgUmVwbGFjZSBwY2lfKiB3aXRoIGdlbmVyaWMgZG1hXyogQVBJIGNhbGxzIChkc2F4ZW5hQHBsZXhpdHkubmV0KQotICogMjAwMy0xMi0yOSBSZXdyaXR0ZW4gaGlnaCBzcGVlZCBpc28gdHJhbnNmZXIgc3VwcG9ydCAoYnkgTWljaGFsIFNvamthLAotICoJPHNvamthbUBjZW50cnVtLmN6PiwgdXBkYXRlcyBieSBEQikuCi0gKgotICogMjAwMi0xMS0yOQlDb3JyZWN0IGhhbmRsaW5nIGZvciBodyBhc3luY19uZXh0IHJlZ2lzdGVyLgotICogMjAwMi0wOC0wNglIYW5kbGluZyBmb3IgYnVsayBhbmQgaW50ZXJydXB0IHRyYW5zZmVycyBpcyBtb3N0bHkgc2hhcmVkOwotICoJb25seSBzY2hlZHVsaW5nIGlzIGRpZmZlcmVudCwgbm8gYXJiaXRyYXJ5IGxpbWl0YXRpb25zLgotICogMjAwMi0wNy0yNQlTYW5pdHkgY2hlY2sgUENJIHJlYWRzLCBtb3N0bHkgZm9yIGJldHRlciBjYXJkYnVzIHN1cHBvcnQsCi0gKgljbGVhbiB1cCBIQyBydW4gc3RhdGUgaGFuZHNoYWtpbmcuCi0gKiAyMDAyLTA1LTI0CVByZWxpbWluYXJ5IEZTL0xTIGludGVycnVwdHMsIHVzaW5nIHNjaGVkdWxpbmcgc2hvcnRjdXRzCi0gKiAyMDAyLTA1LTExCUNsZWFyIFRUIGVycm9ycyBmb3IgRlMvTFMgY3RybC9idWxrLiAgRmlsbCBpbiBzb21lIG90aGVyCi0gKgltaXNzaW5nIHBpZWNlczogIGVuYWJsaW5nIDY0Yml0IGRtYSwgaGFuZG9mZiBmcm9tIEJJT1MvU01NLgotICogMjAwMi0wNS0wNwlTb21lIGVycm9yIHBhdGggY2xlYW51cHMgdG8gcmVwb3J0IGJldHRlciBlcnJvcnM7IHdtYigpOwotICoJdXNlIG5vbi1DVlMgdmVyc2lvbiBpZDsgYmV0dGVyIGlzbyBiYW5kd2lkdGggY2xhaW0uCi0gKiAyMDAyLTA0LTE5CUNvbnRyb2wvYnVsay9pbnRlcnJ1cHQgc3VibWl0IG5vIGxvbmdlciB1c2VzIGdpdmViYWNrKCkgb24KLSAqCWVycm9ycyBpbiBzdWJtaXQgcGF0aC4gIEJ1Z2ZpeGVzIHRvIGludGVycnVwdCBzY2hlZHVsaW5nL3Byb2Nlc3NpbmcuCi0gKiAyMDAyLTAzLTA1CUluaXRpYWwgaGlnaC1zcGVlZCBJU08gc3VwcG9ydDsgcmVkdWNlIElURCBtZW1vcnk7IHNoaWZ0Ci0gKgltb3JlIGNoZWNraW5nIHRvIGdlbmVyaWMgaGNkIGZyYW1ld29yayAoZGIpLiAgTWFrZSBpdCB3b3JrIHdpdGgKLSAqCVBoaWxpcHMgRUhDSTsgcmVkdWNlIFBDSSB0cmFmZmljOyBzaG9ydGVuIElSUSBwYXRoIChSb3J5IEJvbHQpLgotICogMjAwMi0wMS0xNAlNaW5vciBjbGVhbnVwOyB2ZXJzaW9uIHN5bmNoLgotICogMjAwMi0wMS0wOAlGaXggcm9vdGh1YiBoYW5kb2ZmIG9mIEZTL0xTIHRvIGNvbXBhbmlvbiBjb250cm9sbGVycy4KLSAqIDIwMDItMDEtMDQJQ29udHJvbC9CdWxrIHF1ZXVpbmcgYmVoYXZlcy4KLSAqCi0gKiAyMDAxLTEyLTEyCUluaXRpYWwgcGF0Y2ggdmVyc2lvbiBmb3IgTGludXggMi41LjEga2VybmVsLgotICogMjAwMS1KdW5lCVdvcmtzIHdpdGggdXNiLXN0b3JhZ2UgYW5kIE5FQyBFSENJIG9uIDIuNAogICovCiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjEwIERlYyAyMDA0IgpAQCAtOTUsNyArNjYsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIJaGNkX25hbWUgW10gPSAiZWhjaV9oY2QiOwogCiAKLSN1bmRlZiBFSENJX1ZFUkJPU0VfREVCVUcKKyN1bmRlZiBWRVJCT1NFX0RFQlVHCiAjdW5kZWYgRUhDSV9VUkJfVFJBQ0UKIAogI2lmZGVmIERFQlVHCkBAIC0xNzQsNiArMTQ1LDE2IEBACiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKK3N0YXRpYyBpbnQgaGFuZHNoYWtlX29uX2Vycm9yX3NldF9oYWx0KHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgdm9pZCBfX2lvbWVtICpwdHIsCisJCQkJICAgICAgIHUzMiBtYXNrLCB1MzIgZG9uZSwgaW50IHVzZWMpCit7CisJaW50IGVycm9yID0gaGFuZHNoYWtlKGVoY2ksIHB0ciwgbWFzaywgZG9uZSwgdXNlYyk7CisJaWYgKGVycm9yKQorCQllaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCisJcmV0dXJuIGVycm9yOworfQorCiAvKiBmb3JjZSBIQyB0byBoYWx0IHN0YXRlIGZyb20gdW5rbm93biAoRUhDSSBzcGVjIHNlY3Rpb24gMi4zKSAqLwogc3RhdGljIGludCBlaGNpX2hhbHQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKIHsKQEAgLTI0NiwxMSArMjI3LDkgQEAKIAkvKiB3YWl0IGZvciBhbnkgc2NoZWR1bGUgZW5hYmxlcy9kaXNhYmxlcyB0byB0YWtlIGVmZmVjdCAqLwogCXRlbXAgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5jb21tYW5kKSA8PCAxMDsKIAl0ZW1wICY9IFNUU19BU1MgfCBTVFNfUFNTOwotCWlmIChoYW5kc2hha2UgKGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsIFNUU19BU1MgfCBTVFNfUFNTLAotCQkJCXRlbXAsIDE2ICogMTI1KSAhPSAwKSB7Ci0JCWVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJaWYgKGhhbmRzaGFrZV9vbl9lcnJvcl9zZXRfaGFsdChlaGNpLCAmZWhjaS0+cmVncy0+c3RhdHVzLAorCQkJCQlTVFNfQVNTIHwgU1RTX1BTUywgdGVtcCwgMTYgKiAxMjUpKQogCQlyZXR1cm47Ci0JfQogCiAJLyogdGhlbiBkaXNhYmxlIGFueXRoaW5nIHRoYXQncyBzdGlsbCBhY3RpdmUgKi8KIAl0ZW1wID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+Y29tbWFuZCk7CkBAIC0yNTgsMTEgKzIzNyw4IEBACiAJZWhjaV93cml0ZWwoZWhjaSwgdGVtcCwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwogCiAJLyogaGFyZHdhcmUgY2FuIHRha2UgMTYgbWljcm9mcmFtZXMgdG8gdHVybiBvZmYgLi4uICovCi0JaWYgKGhhbmRzaGFrZSAoZWhjaSwgJmVoY2ktPnJlZ3MtPnN0YXR1cywgU1RTX0FTUyB8IFNUU19QU1MsCi0JCQkJMCwgMTYgKiAxMjUpICE9IDApIHsKLQkJZWhjaV90b19oY2QoZWhjaSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKLQkJcmV0dXJuOwotCX0KKwloYW5kc2hha2Vfb25fZXJyb3Jfc2V0X2hhbHQoZWhjaSwgJmVoY2ktPnJlZ3MtPnN0YXR1cywKKwkJCQkgICAgU1RTX0FTUyB8IFNUU19QU1MsIDAsIDE2ICogMTI1KTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM1NSwxNyArMzMxLDEzIEBACiAJCQkJJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzW3BvcnRdKTsKIH0KIAotLyogZWhjaV9zaHV0ZG93biBraWNrIGluIGZvciBzaWxpY29uIG9uIGFueSBidXMgKG5vdCBqdXN0IHBjaSwgZXRjKS4KLSAqIFRoaXMgZm9yY2libHkgZGlzYWJsZXMgZG1hIGFuZCBJUlFzLCBoZWxwaW5nIGtleGVjIGFuZCBvdGhlciBjYXNlcwotICogd2hlcmUgdGhlIG5leHQgc3lzdGVtIHNvZnR3YXJlIG1heSBleHBlY3QgY2xlYW4gc3RhdGUuCisvKgorICogSGFsdCBIQywgdHVybiBvZmYgYWxsIHBvcnRzLCBhbmQgbGV0IHRoZSBCSU9TIHVzZSB0aGUgY29tcGFuaW9uIGNvbnRyb2xsZXJzLgorICogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIGVoY2ktPmxvY2sgaGVsZC4KICAqLwotc3RhdGljIHZvaWQKLWVoY2lfc2h1dGRvd24gKHN0cnVjdCB1c2JfaGNkICpoY2QpCitzdGF0aWMgdm9pZCBlaGNpX3NpbGVuY2VfY29udHJvbGxlcihzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kpCiB7Ci0Jc3RydWN0IGVoY2lfaGNkCSplaGNpOwotCi0JZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwotCSh2b2lkKSBlaGNpX2hhbHQgKGVoY2kpOworCWVoY2lfaGFsdChlaGNpKTsKIAllaGNpX3R1cm5fb2ZmX2FsbF9wb3J0cyhlaGNpKTsKIAogCS8qIG1ha2UgQklPUy9ldGMgdXNlIGNvbXBhbmlvbiBjb250cm9sbGVyIGR1cmluZyByZWJvb3QgKi8KQEAgLTM3NSw2ICszNDcsMjIgQEAKIAllaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpOwogfQogCisvKiBlaGNpX3NodXRkb3duIGtpY2sgaW4gZm9yIHNpbGljb24gb24gYW55IGJ1cyAobm90IGp1c3QgcGNpLCBldGMpLgorICogVGhpcyBmb3JjaWJseSBkaXNhYmxlcyBkbWEgYW5kIElSUXMsIGhlbHBpbmcga2V4ZWMgYW5kIG90aGVyIGNhc2VzCisgKiB3aGVyZSB0aGUgbmV4dCBzeXN0ZW0gc29mdHdhcmUgbWF5IGV4cGVjdCBjbGVhbiBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgZWhjaV9zaHV0ZG93bihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBlaGNpX2hjZAkqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CisKKwlkZWxfdGltZXJfc3luYygmZWhjaS0+d2F0Y2hkb2cpOworCWRlbF90aW1lcl9zeW5jKCZlaGNpLT5pYWFfd2F0Y2hkb2cpOworCisJc3Bpbl9sb2NrX2lycSgmZWhjaS0+bG9jayk7CisJZWhjaV9zaWxlbmNlX2NvbnRyb2xsZXIoZWhjaSk7CisJc3Bpbl91bmxvY2tfaXJxKCZlaGNpLT5sb2NrKTsKK30KKwogc3RhdGljIHZvaWQgZWhjaV9wb3J0X3Bvd2VyIChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIGludCBpc19vbikKIHsKIAl1bnNpZ25lZCBwb3J0OwpAQCAtNDI1LDE1ICs0MTMsMTUgQEAKIAkJdGltZXJfYWN0aW9uIChlaGNpLCBUSU1FUl9JT19XQVRDSERPRyk7CiB9CiAKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgZWhjaV9oY2QgbW9kdWxlIGlzIHJlbW92ZWQuCisgKi8KIHN0YXRpYyB2b2lkIGVoY2lfc3RvcCAoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpID0gaGNkX3RvX2VoY2kgKGhjZCk7CiAKIAllaGNpX2RiZyAoZWhjaSwgInN0b3BcbiIpOwogCi0JLyogVHVybiBvZmYgcG9ydCBwb3dlciBvbiBhbGwgcm9vdCBodWIgcG9ydHMuICovCi0JZWhjaV9wb3J0X3Bvd2VyIChlaGNpLCAwKTsKLQogCS8qIG5vIG1vcmUgaW50ZXJydXB0cyAuLi4gKi8KIAlkZWxfdGltZXJfc3luYyAoJmVoY2ktPndhdGNoZG9nKTsKIAlkZWxfdGltZXJfc3luYygmZWhjaS0+aWFhX3dhdGNoZG9nKTsKQEAgLTQ0MiwxMyArNDMwLDEwIEBACiAJaWYgKEhDX0lTX1JVTk5JTkcgKGhjZC0+c3RhdGUpKQogCQllaGNpX3F1aWVzY2UgKGVoY2kpOwogCisJZWhjaV9zaWxlbmNlX2NvbnRyb2xsZXIoZWhjaSk7CiAJZWhjaV9yZXNldCAoZWhjaSk7Ci0JZWhjaV93cml0ZWwoZWhjaSwgMCwgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKIAlzcGluX3VubG9ja19pcnEoJmVoY2ktPmxvY2spOwogCi0JLyogbGV0IGNvbXBhbmlvbiBjb250cm9sbGVycyB3b3JrIHdoZW4gd2UgYXJlbid0ICovCi0JZWhjaV93cml0ZWwoZWhjaSwgMCwgJmVoY2ktPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7Ci0KIAlyZW1vdmVfY29tcGFuaW9uX2ZpbGUoZWhjaSk7CiAJcmVtb3ZlX2RlYnVnX2ZpbGVzIChlaGNpKTsKIApAQCAtNjc2LDcgKzY2MSw3IEBACiAJY21kID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+Y29tbWFuZCk7CiAJYmggPSAwOwogCi0jaWZkZWYJRUhDSV9WRVJCT1NFX0RFQlVHCisjaWZkZWYJVkVSQk9TRV9ERUJVRwogCS8qIHVucmVxdWVzdGVkL2lnbm9yZWQ6IEZyYW1lIExpc3QgUm9sbG92ZXIgKi8KIAlkYmdfc3RhdHVzIChlaGNpLCAiaXJxIiwgc3RhdHVzKTsKICNlbmRpZgpAQCAtNzEwLDYgKzY5NSw4IEBACiAJLyogcmVtb3RlIHdha2V1cCBbNC4zLjFdICovCiAJaWYgKHN0YXR1cyAmIFNUU19QQ0QpIHsKIAkJdW5zaWduZWQJaSA9IEhDU19OX1BPUlRTIChlaGNpLT5oY3NfcGFyYW1zKTsKKworCQkvKiBraWNrIHJvb3QgaHViIGxhdGVyICovCiAJCXBjZF9zdGF0dXMgPSBzdGF0dXM7CiAKIAkJLyogcmVzdW1lIHJvb3QgaHViPyAqLwpAQCAtNzM4LDggKzcyNSw2IEBACiAKIAkvKiBQQ0kgZXJyb3JzIFs0LjE1LjIuNF0gKi8KIAlpZiAodW5saWtlbHkgKChzdGF0dXMgJiBTVFNfRkFUQUwpICE9IDApKSB7Ci0JCS8qIGJvZ3VzICJmYXRhbCIgSVJRcyBhcHBlYXIgb24gc29tZSBjaGlwcy4uLiB3aHk/ICAqLwotCQlzdGF0dXMgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMpOwogCQlkYmdfY21kIChlaGNpLCAiZmF0YWwiLCBlaGNpX3JlYWRsKGVoY2ksCiAJCQkJCQkgICAmZWhjaS0+cmVncy0+Y29tbWFuZCkpOwogCQlkYmdfc3RhdHVzIChlaGNpLCAiZmF0YWwiLCBzdGF0dXMpOwpAQCAtNzU4LDcgKzc0Myw3IEBACiAJaWYgKGJoKQogCQllaGNpX3dvcmsgKGVoY2kpOwogCXNwaW5fdW5sb2NrICgmZWhjaS0+bG9jayk7Ci0JaWYgKHBjZF9zdGF0dXMgJiBTVFNfUENEKQorCWlmIChwY2Rfc3RhdHVzKQogCQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGhjZCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNzg4LDggKzc3MywxNCBAQAogCUlOSVRfTElTVF9IRUFEICgmcXRkX2xpc3QpOwogCiAJc3dpdGNoICh1c2JfcGlwZXR5cGUgKHVyYi0+cGlwZSkpIHsKLQkvLyBjYXNlIFBJUEVfQ09OVFJPTDoKLQkvLyBjYXNlIFBJUEVfQlVMSzoKKwljYXNlIFBJUEVfQ09OVFJPTDoKKwkJLyogcWhfY29tcGxldGlvbnMoKSBjb2RlIGRvZXNuJ3QgaGFuZGxlIGFsbCB0aGUgZmF1bHQgY2FzZXMKKwkJICogaW4gbXVsdGktVEQgY29udHJvbCB0cmFuc2ZlcnMuICBFdmVuIDFLQiBpcyByYXJlIGFueXdheS4KKwkJICovCisJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPiAoMTYgKiAxMDI0KSkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCS8qIEZBTExUSFJPVUdIICovCisJLyogY2FzZSBQSVBFX0JVTEs6ICovCiAJZGVmYXVsdDoKIAkJaWYgKCFxaF91cmJfdHJhbnNhY3Rpb24gKGVoY2ksIHVyYiwgJnF0ZF9saXN0LCBtZW1fZmxhZ3MpKQogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKaW5kZXggNGUwNjVlNS4uZWZmZmVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwpAQCAtMjgsNyArMjgsOSBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWZkZWYJQ09ORklHX1VTQl9QRVJTSVNUCisjZGVmaW5lCVBPUlRfV0FLRV9CSVRTCShQT1JUX1dLT0NfRXxQT1JUX1dLRElTQ19FfFBPUlRfV0tDT05OX0UpCisKKyNpZmRlZglDT05GSUdfUE0KIAogc3RhdGljIGludCBlaGNpX2h1Yl9jb250cm9sKAogCXN0cnVjdCB1c2JfaGNkCSpoY2QsCkBAIC0xMDQsMTUgKzEwNiw2IEBACiAJZWhjaS0+b3duZWRfcG9ydHMgPSAwOwogfQogCi0jZWxzZQkvKiBDT05GSUdfVVNCX1BFUlNJU1QgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGVoY2lfaGFuZG92ZXJfY29tcGFuaW9uX3BvcnRzKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKLXsgfQotCi0jZW5kaWYKLQotI2lmZGVmCUNPTkZJR19QTQotCiBzdGF0aWMgaW50IGVoY2lfYnVzX3N1c3BlbmQgKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwpAQCAtMTU4LDEwICsxNTEsMTAgQEAKIAkJfQogCiAJCS8qIGVuYWJsZSByZW1vdGUgd2FrZXVwIG9uIGFsbCBwb3J0cyAqLwotCQlpZiAoZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKLQkJCXQyIHw9IFBPUlRfV0tPQ19FfFBPUlRfV0tESVNDX0V8UE9SVF9XS0NPTk5fRTsKKwkJaWYgKGhjZC0+c2VsZi5yb290X2h1Yi0+ZG9fcmVtb3RlX3dha2V1cCkKKwkJCXQyIHw9IFBPUlRfV0FLRV9CSVRTOwogCQllbHNlCi0JCQl0MiAmPSB+KFBPUlRfV0tPQ19FfFBPUlRfV0tESVNDX0V8UE9SVF9XS0NPTk5fRSk7CisJCQl0MiAmPSB+UE9SVF9XQUtFX0JJVFM7CiAKIAkJaWYgKHQxICE9IHQyKSB7CiAJCQllaGNpX3ZkYmcgKGVoY2ksICJwb3J0ICVkLCAlMDh4IC0+ICUwOHhcbiIsCkBAIC0xODMsNyArMTc2LDcgQEAKIAogCS8qIGFsbG93IHJlbW90ZSB3YWtldXAgKi8KIAltYXNrID0gSU5UUl9NQVNLOwotCWlmICghZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKKwlpZiAoIWhjZC0+c2VsZi5yb290X2h1Yi0+ZG9fcmVtb3RlX3dha2V1cCkKIAkJbWFzayAmPSB+U1RTX1BDRDsKIAllaGNpX3dyaXRlbChlaGNpLCBtYXNrLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOwogCWVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKQEAgLTI0MSw4ICsyMzQsNyBAQAogCWkgPSBIQ1NfTl9QT1JUUyAoZWhjaS0+aGNzX3BhcmFtcyk7CiAJd2hpbGUgKGktLSkgewogCQl0ZW1wID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKLQkJdGVtcCAmPSB+KFBPUlRfUldDX0JJVFMKLQkJCXwgUE9SVF9XS09DX0UgfCBQT1JUX1dLRElTQ19FIHwgUE9SVF9XS0NPTk5fRSk7CisJCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9XQUtFX0JJVFMpOwogCQlpZiAodGVzdF9iaXQoaSwgJmVoY2ktPmJ1c19zdXNwZW5kZWQpICYmCiAJCQkJKHRlbXAgJiBQT1JUX1NVU1BFTkQpKSB7CiAJCQllaGNpLT5yZXNldF9kb25lIFtpXSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzICgyMCk7CkBAIC0yODEsOSArMjczLDcgQEAKIAllaGNpX3dyaXRlbChlaGNpLCBJTlRSX01BU0ssICZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CiAKIAlzcGluX3VubG9ja19pcnEgKCZlaGNpLT5sb2NrKTsKLQotCWlmICghcG93ZXJfb2theSkKLQkJZWhjaV9oYW5kb3Zlcl9jb21wYW5pb25fcG9ydHMoZWhjaSk7CisJZWhjaV9oYW5kb3Zlcl9jb21wYW5pb25fcG9ydHMoZWhjaSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU0NSw4ICs1MzUsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lCVBPUlRfV0FLRV9CSVRTCShQT1JUX1dLT0NfRXxQT1JUX1dLRElTQ19FfFBPUlRfV0tDT05OX0UpCi0KIHN0YXRpYyBpbnQgZWhjaV9odWJfY29udHJvbCAoCiAJc3RydWN0IHVzYl9oY2QJKmhjZCwKIAl1MTYJCXR5cGVSZXEsCkBAIC03NzgsNyArNzY2LDcgQEAKIAkJaWYgKHRlbXAgJiBQT1JUX1BPV0VSKQogCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9QT1dFUjsKIAotI2lmbmRlZglFSENJX1ZFUkJPU0VfREVCVUcKKyNpZm5kZWYJVkVSQk9TRV9ERUJVRwogCWlmIChzdGF0dXMgJiB+MHhmZmZmKQkvKiBvbmx5IGlmIHdQb3J0Q2hhbmdlIGlzIGludGVyZXN0aW5nICovCiAjZW5kaWYKIAkJZGJnX3BvcnQgKGVoY2ksICJHZXRTdGF0dXMiLCB3SW5kZXggKyAxLCB0ZW1wKTsKQEAgLTgxMiw4ICs4MDAsNiBAQAogCQkJaWYgKCh0ZW1wICYgUE9SVF9QRSkgPT0gMAogCQkJCQl8fCAodGVtcCAmIFBPUlRfUkVTRVQpICE9IDApCiAJCQkJZ290byBlcnJvcjsKLQkJCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYpKQotCQkJCXRlbXAgfD0gUE9SVF9XQUtFX0JJVFM7CiAJCQllaGNpX3dyaXRlbChlaGNpLCB0ZW1wIHwgUE9SVF9TVVNQRU5ELCBzdGF0dXNfcmVnKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaXhwNHh4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaXhwNHh4LmMKaW5kZXggMzA0MWQ4Zi4uNjAxYzg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWl4cDR4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1peHA0eHguYwpAQCAtMTQwLDEzICsxNDAsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotTU9EVUxFX0FMSUFTKCJpeHA0eHgtZWhjaSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTppeHA0eHgtZWhjaSIpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpeHA0eHhfZWhjaV9kcml2ZXIgPSB7CiAJLnByb2JlID0gaXhwNHh4X2VoY2lfcHJvYmUsCiAJLnJlbW92ZSA9IGl4cDR4eF9laGNpX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJpeHA0eHgtZWhjaSIsCi0JCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYwppbmRleCA3MmNjZDU2Li41YmI3ZjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCkBAIC0xMzAsNiArMTMwLDcgQEAKIAljYXNlIFBDSV9WRU5ET1JfSURfVERJOgogCQlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVERJX0VIQ0kpIHsKIAkJCWVoY2ktPmlzX3RkaV9yaF90dCA9IDE7CisJCQloY2QtPmhhc190dCA9IDE7CiAJCQl0ZGlfcmVzZXQoZWhjaSk7CiAJCX0KIAkJYnJlYWs7CkBAIC0yMjEsNiArMjIyLDcgQEAKIAkJZWhjaV93YXJuKGVoY2ksICJzZWxlY3RpdmUgc3VzcGVuZC93YWtldXAgdW5hdmFpbGFibGVcbiIpOwogI2VuZGlmCiAKKwllaGNpX3BvcnRfcG93ZXIoZWhjaSwgMSk7CiAJcmV0dmFsID0gZWhjaV9wY2lfcmVpbml0KGVoY2ksIHBkZXYpOwogZG9uZToKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMjk5LDcgKzMwMSw3IEBACiAJaWYgKGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZykgPT0gRkxBR19DRikgewogCQlpbnQJbWFzayA9IElOVFJfTUFTSzsKIAotCQlpZiAoIWRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpCisJCWlmICghaGNkLT5zZWxmLnJvb3RfaHViLT5kb19yZW1vdGVfd2FrZXVwKQogCQkJbWFzayAmPSB+U1RTX1BDRDsKIAkJZWhjaV93cml0ZWwoZWhjaSwgbWFzaywgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKIAkJZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOwpAQCAtMzI5LDcgKzMzMSw2IEBACiAKIAkvKiBoZXJlIHdlICJrbm93IiByb290IHBvcnRzIHNob3VsZCBhbHdheXMgc3RheSBwb3dlcmVkICovCiAJZWhjaV9wb3J0X3Bvd2VyKGVoY2ksIDEpOwotCWVoY2lfaGFuZG92ZXJfY29tcGFuaW9uX3BvcnRzKGVoY2kpOwogCiAJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKIAlyZXR1cm4gMDsKQEAgLTM1Myw4ICszNTQsOCBAQAogCS5yZXNldCA9CQllaGNpX3BjaV9zZXR1cCwKIAkuc3RhcnQgPQkJZWhjaV9ydW4sCiAjaWZkZWYJQ09ORklHX1BNCi0JLnN1c3BlbmQgPQkJZWhjaV9wY2lfc3VzcGVuZCwKLQkucmVzdW1lID0JCWVoY2lfcGNpX3Jlc3VtZSwKKwkucGNpX3N1c3BlbmQgPQkJZWhjaV9wY2lfc3VzcGVuZCwKKwkucGNpX3Jlc3VtZSA9CQllaGNpX3BjaV9yZXN1bWUsCiAjZW5kaWYKIAkuc3RvcCA9CQkJZWhjaV9zdG9wLAogCS5zaHV0ZG93biA9CQllaGNpX3NodXRkb3duLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBwYy1zb2MuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtc29jLmMKaW5kZXggYTMyNDkwNy4uNmM3NjAzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBwYy1zb2MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHBjLXNvYy5jCkBAIC0xNzUsNiArMTc1LDcgQEAKIAlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogRklYTUUgd2Ugb25seSB3YW50IG9uZSBvbmUgcHJvYmUoKSBub3QgdHdvICovCiAJcmV0ID0gdXNiX2VoY2lfcHBjX3NvY19wcm9iZSgmZWhjaV9wcGNfc29jX2hjX2RyaXZlciwgJmhjZCwgcGRldik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4MywxNyArMTg0LDE3IEBACiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCisJLyogRklYTUUgd2Ugb25seSB3YW50IG9uZSBvbmUgcmVtb3ZlKCkgbm90IHR3byAqLwogCXVzYl9laGNpX3BwY19zb2NfcmVtb3ZlKGhjZCwgcGRldik7CiAJcmV0dXJuIDA7CiB9CiAKLU1PRFVMRV9BTElBUygicHBjLXNvYy1laGNpIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnBwYy1zb2MtZWhjaSIpOwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWhjaV9wcGNfc29jX2RyaXZlciA9IHsKIAkucHJvYmUgPSBlaGNpX2hjZF9wcGNfc29jX2Rydl9wcm9iZSwKIAkucmVtb3ZlID0gZWhjaV9oY2RfcHBjX3NvY19kcnZfcmVtb3ZlLAogCS5zaHV0ZG93biA9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAicHBjLXNvYy1laGNpIiwKLQkJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZQogCX0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHMzLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHMzLmMKaW5kZXggYmJkYTU4ZS4uNjk3ODIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBzMy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wczMuYwpAQCAtMTI1LDcgKzEyNSw2IEBACiAJCWdvdG8gZmFpbF9pcnE7CiAJfQogCi0JZGV2LT5jb3JlLnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKIAlkZXYtPmNvcmUuZG1hX21hc2sgPSAmZHVtbXlfbWFzazsgLyogRklYTUU6IGZvciBpbXByb3BlciB1c2IgY29kZSAqLwogCiAJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnBzM19laGNpX2hjX2RyaXZlciwgJmRldi0+Y29yZSwgZGV2LT5jb3JlLmJ1c19pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwppbmRleCAyZTQ5ZGU4Li41YWU2ODkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKQEAgLTI0Miw3ICsyNDIsOCBAQAogCWlmICh1bmxpa2VseSh1cmItPnVubGlua2VkKSkgewogCQlDT1VOVChlaGNpLT5zdGF0cy51bmxpbmspOwogCX0gZWxzZSB7Ci0JCWlmIChsaWtlbHkoc3RhdHVzID09IC1FSU5QUk9HUkVTUykpCisJCS8qIHJlcG9ydCBub24tZXJyb3IgYW5kIHNob3J0IHJlYWQgc3RhdHVzIGFzIHplcm8gKi8KKwkJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MgfHwgc3RhdHVzID09IC1FUkVNT1RFSU8pCiAJCQlzdGF0dXMgPSAwOwogCQlDT1VOVChlaGNpLT5zdGF0cy5jb21wbGV0ZSk7CiAJfQpAQCAtMjUwLDcgKzI1MSw3IEBACiAjaWZkZWYgRUhDSV9VUkJfVFJBQ0UKIAllaGNpX2RiZyAoZWhjaSwKIAkJIiVzICVzIHVyYiAlcCBlcCVkJXMgc3RhdHVzICVkIGxlbiAlZC8lZFxuIiwKLQkJX19GVU5DVElPTl9fLCB1cmItPmRldi0+ZGV2cGF0aCwgdXJiLAorCQlfX2Z1bmNfXywgdXJiLT5kZXYtPmRldnBhdGgsIHVyYiwKIAkJdXNiX3BpcGVlbmRwb2ludCAodXJiLT5waXBlKSwKIAkJdXNiX3BpcGVpbiAodXJiLT5waXBlKSA/ICJpbiIgOiAib3V0IiwKIAkJc3RhdHVzLApAQCAtMjgzLDcgKzI4NCw2IEBACiAJaW50CQkJbGFzdF9zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CiAJaW50CQkJc3RvcHBlZDsKIAl1bnNpZ25lZAkJY291bnQgPSAwOwotCWludAkJCWRvX3N0YXR1cyA9IDA7CiAJdTgJCQlzdGF0ZTsKIAl1MzIJCQloYWx0ID0gSEFMVF9CSVQoZWhjaSk7CiAKQEAgLTMwOSw3ICszMDksNiBAQAogCQlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZDsKIAkJc3RydWN0IHVyYgkqdXJiOwogCQl1MzIJCXRva2VuID0gMDsKLQkJaW50CQlxdGRfc3RhdHVzOwogCiAJCXF0ZCA9IGxpc3RfZW50cnkgKGVudHJ5LCBzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKIAkJdXJiID0gcXRkLT51cmI7CkBAIC0zMzYsMTEgKzMzNSwyMCBAQAogCQkvKiBhbHdheXMgY2xlYW4gdXAgcXRkcyB0aGUgaGMgZGUtYWN0aXZhdGVkICovCiAJCWlmICgodG9rZW4gJiBRVERfU1RTX0FDVElWRSkgPT0gMCkgewogCisJCQkvKiBvbiBTVEFMTCwgZXJyb3IsIGFuZCBzaG9ydCByZWFkcyB0aGlzIHVyYiBtdXN0CisJCQkgKiBjb21wbGV0ZSBhbmQgYWxsIGl0cyBxdGRzIG11c3QgYmUgcmVjeWNsZWQuCisJCQkgKi8KIAkJCWlmICgodG9rZW4gJiBRVERfU1RTX0hBTFQpICE9IDApIHsKIAkJCQlzdG9wcGVkID0gMTsKIAogCQkJLyogbWFnaWMgZHVtbXkgZm9yIHNvbWUgc2hvcnQgcmVhZHM7IHFoIHdvbid0IGFkdmFuY2UuCiAJCQkgKiB0aGF0IHNpbGljb24gcXVpcmsgY2FuIGtpY2sgaW4gd2l0aCB0aGlzIGR1bW15IHRvby4KKwkJCSAqCisJCQkgKiBvdGhlciBzaG9ydCByZWFkcyB3b24ndCBzdG9wIHRoZSBxdWV1ZSwgaW5jbHVkaW5nCisJCQkgKiBjb250cm9sIHRyYW5zZmVycyAoc3RhdHVzIHN0YWdlIGhhbmRsZXMgdGhhdCkgb3IKKwkJCSAqIG1vc3Qgb3RoZXIgc2luZ2xlLXF0ZCByZWFkcyAuLi4gdGhlIHF1ZXVlIHN0b3BzIGlmCisJCQkgKiBVUkJfU0hPUlRfTk9UX09LIHdhcyBzZXQgc28gdGhlIGRyaXZlciBzdWJtaXR0aW5nCisJCQkgKiB0aGUgdXJicyBjb3VsZCBjbGVhbiBpdCB1cC4KIAkJCSAqLwogCQkJfSBlbHNlIGlmIChJU19TSE9SVF9SRUFEICh0b2tlbikKIAkJCQkJJiYgIShxdGQtPmh3X2FsdF9uZXh0CkBAIC0zNTQsMjggKzM2MiwyMSBAQAogCQkJCSYmIEhDX0lTX1JVTk5JTkcgKGVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSkpKSB7CiAJCQlicmVhazsKIAorCQkvKiBzY2FuIHRoZSB3aG9sZSBxdWV1ZSBmb3IgdW5saW5rcyB3aGVuZXZlciBpdCBzdG9wcyAqLwogCQl9IGVsc2UgewogCQkJc3RvcHBlZCA9IDE7CiAKLQkJCWlmICh1bmxpa2VseSAoIUhDX0lTX1JVTk5JTkcgKGVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSkpKQorCQkJLyogY2FuY2VsIGV2ZXJ5dGhpbmcgaWYgd2UgaGFsdCwgc3VzcGVuZCwgZXRjICovCisJCQlpZiAoIUhDX0lTX1JVTk5JTkcoZWhjaV90b19oY2QoZWhjaSktPnN0YXRlKSkKIAkJCQlsYXN0X3N0YXR1cyA9IC1FU0hVVERPV047CiAKLQkJCS8qIGlnbm9yZSBhY3RpdmUgdXJicyB1bmxlc3Mgc29tZSBwcmV2aW91cyBxdGQKLQkJCSAqIGZvciB0aGUgdXJiIGZhdWx0ZWQgKGluY2x1ZGluZyBzaG9ydCByZWFkKSBvcgotCQkJICogaXRzIHVyYiB3YXMgY2FuY2VsZWQuICB3ZSBtYXkgcGF0Y2ggcWggb3IgcXRkcy4KKwkJCS8qIHRoaXMgcXRkIGlzIGFjdGl2ZTsgc2tpcCBpdCB1bmxlc3MgYSBwcmV2aW91cyBxdGQKKwkJCSAqIGZvciBpdHMgdXJiIGZhdWx0ZWQsIG9yIGl0cyB1cmIgd2FzIGNhbmNlbGVkLgogCQkJICovCi0JCQlpZiAobGlrZWx5KGxhc3Rfc3RhdHVzID09IC1FSU5QUk9HUkVTUyAmJgotCQkJCQkhdXJiLT51bmxpbmtlZCkpCisJCQllbHNlIGlmIChsYXN0X3N0YXR1cyA9PSAtRUlOUFJPR1JFU1MgJiYgIXVyYi0+dW5saW5rZWQpCiAJCQkJY29udGludWU7CiAKLQkJCS8qIGlzc3VlIHN0YXR1cyBhZnRlciBzaG9ydCBjb250cm9sIHJlYWRzICovCi0JCQlpZiAodW5saWtlbHkgKGRvX3N0YXR1cyAhPSAwKQotCQkJCQkmJiBRVERfUElEICh0b2tlbikgPT0gMCAvKiBPVVQgKi8pIHsKLQkJCQlkb19zdGF0dXMgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiB0b2tlbiBpbiBvdmVybGF5IG1heSBiZSBtb3N0IGN1cnJlbnQgKi8KKwkJCS8qIHFoIHVubGlua2VkOyB0b2tlbiBpbiBvdmVybGF5IG1heSBiZSBtb3N0IGN1cnJlbnQgKi8KIAkJCWlmIChzdGF0ZSA9PSBRSF9TVEFURV9JRExFCiAJCQkJCSYmIGNwdV90b19oYzMyKGVoY2ksIHF0ZC0+cXRkX2RtYSkKIAkJCQkJCT09IHFoLT5od19jdXJyZW50KQpAQCAtMzkyLDIxICszOTMsMzIgQEAKIAkJCX0KIAkJfQogCi0JCS8qIHJlbW92ZSBpdCBmcm9tIHRoZSBxdWV1ZSAqLwotCQlxdGRfc3RhdHVzID0gcXRkX2NvcHlfc3RhdHVzKGVoY2ksIHVyYiwgcXRkLT5sZW5ndGgsIHRva2VuKTsKLQkJaWYgKHVubGlrZWx5KHF0ZF9zdGF0dXMgPT0gLUVSRU1PVEVJTykpIHsKLQkJCWRvX3N0YXR1cyA9ICghdXJiLT51bmxpbmtlZCAmJgotCQkJCQl1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSk7Ci0JCQlxdGRfc3RhdHVzID0gMDsKKwkJLyogdW5sZXNzIHdlIGFscmVhZHkga25vdyB0aGUgdXJiJ3Mgc3RhdHVzLCBjb2xsZWN0IHF0ZCBzdGF0dXMKKwkJICogYW5kIHVwZGF0ZSBjb3VudCBvZiBieXRlcyB0cmFuc2ZlcnJlZC4gIGluIGNvbW1vbiBzaG9ydCByZWFkCisJCSAqIGNhc2VzIHdpdGggb25seSBvbmUgZGF0YSBxdGQgKGluY2x1ZGluZyBjb250cm9sIHRyYW5zZmVycyksCisJCSAqIHF1ZXVlIHByb2Nlc3Npbmcgd29uJ3QgaGFsdC4gIGJ1dCB3aXRoIHR3byBvciBtb3JlIHF0ZHMgKGZvcgorCQkgKiBleGFtcGxlLCB3aXRoIGEgMzIgS0IgdHJhbnNmZXIpLCB3aGVuIHRoZSBmaXJzdCBxdGQgZ2V0cyBhCisJCSAqIHNob3J0IHJlYWQgdGhlIHNlY29uZCBtdXN0IGJlIHJlbW92ZWQgYnkgaGFuZC4KKwkJICovCisJCWlmIChsYXN0X3N0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJCWxhc3Rfc3RhdHVzID0gcXRkX2NvcHlfc3RhdHVzKGVoY2ksIHVyYiwKKwkJCQkJcXRkLT5sZW5ndGgsIHRva2VuKTsKKwkJCWlmIChsYXN0X3N0YXR1cyA9PSAtRVJFTU9URUlPCisJCQkJCSYmIChxdGQtPmh3X2FsdF9uZXh0CisJCQkJCQkmIEVIQ0lfTElTVF9FTkQoZWhjaSkpKQorCQkJCWxhc3Rfc3RhdHVzID0gLUVJTlBST0dSRVNTOwogCQl9Ci0JCWlmIChsaWtlbHkobGFzdF9zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKLQkJCWxhc3Rfc3RhdHVzID0gcXRkX3N0YXR1czsKIAorCQkvKiBpZiB3ZSdyZSByZW1vdmluZyBzb21ldGhpbmcgbm90IGF0IHRoZSBxdWV1ZSBoZWFkLAorCQkgKiBwYXRjaCB0aGUgaGFyZHdhcmUgcXVldWUgcG9pbnRlci4KKwkJICovCiAJCWlmIChzdG9wcGVkICYmIHF0ZC0+cXRkX2xpc3QucHJldiAhPSAmcWgtPnF0ZF9saXN0KSB7CiAJCQlsYXN0ID0gbGlzdF9lbnRyeSAocXRkLT5xdGRfbGlzdC5wcmV2LAogCQkJCQlzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKIAkJCWxhc3QtPmh3X25leHQgPSBxdGQtPmh3X25leHQ7CiAJCX0KKworCQkvKiByZW1vdmUgcXRkOyBpdCdzIHJlY3ljbGVkIGFmdGVyIHBvc3NpYmxlIHVyYiBjb21wbGV0aW9uICovCiAJCWxpc3RfZGVsICgmcXRkLT5xdGRfbGlzdCk7CiAJCWxhc3QgPSBxdGQ7CiAJfQpAQCAtNDMxLDcgKzQ0MywxNSBAQAogCQkJcWhfcmVmcmVzaChlaGNpLCBxaCk7CiAJCQlicmVhazsKIAkJY2FzZSBRSF9TVEFURV9MSU5LRUQ6Ci0JCQkvKiBzaG91bGQgYmUgcmFyZSBmb3IgcGVyaW9kaWMgdHJhbnNmZXJzLAorCQkJLyogV2Ugd29uJ3QgcmVmcmVzaCBhIFFIIHRoYXQncyBsaW5rZWQgKGFmdGVyIHRoZSBIQworCQkJICogc3RvcHBlZCB0aGUgcXVldWUpLiAgVGhhdCBhdm9pZHMgYSByYWNlOgorCQkJICogIC0gSEMgcmVhZHMgZmlyc3QgcGFydCBvZiBRSDsKKwkJCSAqICAtIENQVSB1cGRhdGVzIHRoYXQgZmlyc3QgcGFydCBhbmQgdGhlIHRva2VuOworCQkJICogIC0gSEMgcmVhZHMgcmVzdCBvZiB0aGF0IFFILCBpbmNsdWRpbmcgdG9rZW4KKwkJCSAqIFJlc3VsdDogIEhDIGdldHMgYW4gaW5jb25zaXN0ZW50IGltYWdlLCBhbmQgdGhlbgorCQkJICogRE1BcyB0by9mcm9tIHRoZSB3cm9uZyBtZW1vcnkgKGNvcnJ1cHRpbmcgaXQpLgorCQkJICoKKwkJCSAqIFRoYXQgc2hvdWxkIGJlIHJhcmUgZm9yIGludGVycnVwdCB0cmFuc2ZlcnMsCiAJCQkgKiBleGNlcHQgbWF5YmUgaGlnaCBiYW5kd2lkdGggLi4uCiAJCQkgKi8KIAkJCWlmICgoY3B1X3RvX2hjMzIoZWhjaSwgUUhfU01BU0spCkBAIC01NDksNiArNTY5LDEyIEBACiAJCXRoaXNfcXRkX2xlbiA9IHF0ZF9maWxsKGVoY2ksIHF0ZCwgYnVmLCBsZW4sIHRva2VuLCBtYXhwYWNrZXQpOwogCQlsZW4gLT0gdGhpc19xdGRfbGVuOwogCQlidWYgKz0gdGhpc19xdGRfbGVuOworCisJCS8qCisJCSAqIHNob3J0IHJlYWRzIGFkdmFuY2UgdG8gYSAibWFnaWMiIGR1bW15IGluc3RlYWQgb2YgdGhlIG5leHQKKwkJICogcXRkIC4uLiB0aGF0IGZvcmNlcyB0aGUgcXVldWUgdG8gc3RvcCwgZm9yIG1hbnVhbCBjbGVhbnVwLgorCQkgKiAodGhpcyB3aWxsIHVzdWFsbHkgYmUgb3ZlcnJpZGRlbiBsYXRlci4pCisJCSAqLwogCQlpZiAoaXNfaW5wdXQpCiAJCQlxdGQtPmh3X2FsdF9uZXh0ID0gZWhjaS0+YXN5bmMtPmh3X2FsdF9uZXh0OwogCkBAIC01NjgsOCArNTk0LDEwIEBACiAJCWxpc3RfYWRkX3RhaWwgKCZxdGQtPnF0ZF9saXN0LCBoZWFkKTsKIAl9CiAKLQkvKiB1bmxlc3MgdGhlIGJ1bGsvaW50ZXJydXB0IGNhbGxlciB3YW50cyBhIGNoYW5jZSB0byBjbGVhbgotCSAqIHVwIGFmdGVyIHNob3J0IHJlYWRzLCBoYyBzaG91bGQgYWR2YW5jZSBxaCBwYXN0IHRoaXMgdXJiCisJLyoKKwkgKiB1bmxlc3MgdGhlIGNhbGxlciByZXF1aXJlcyBtYW51YWwgY2xlYW51cCBhZnRlciBzaG9ydCByZWFkcywKKwkgKiBoYXZlIHRoZSBhbHRfbmV4dCBtZWNoYW5pc20ga2VlcCB0aGUgcXVldWUgcnVubmluZyBhZnRlciB0aGUKKwkgKiBsYXN0IGRhdGEgcXRkICh0aGUgb25seSBvbmUsIGZvciBjb250cm9sIGFuZCBtb3N0IG90aGVyIGNhc2VzKS4KIAkgKi8KIAlpZiAobGlrZWx5ICgodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9TSE9SVF9OT1RfT0spID09IDAKIAkJCQl8fCB1c2JfcGlwZWNvbnRyb2wgKHVyYi0+cGlwZSkpKQpAQCAtNjU3LDYgKzY4NSwxNCBAQAogCXR5cGUgPSB1c2JfcGlwZXR5cGUgKHVyYi0+cGlwZSk7CiAJbWF4cCA9IHVzYl9tYXhwYWNrZXQgKHVyYi0+ZGV2LCB1cmItPnBpcGUsICFpc19pbnB1dCk7CiAKKwkvKiAxMDI0IGJ5dGUgbWF4cGFja2V0IGlzIGEgaGFyZHdhcmUgY2VpbGluZy4gIEhpZ2ggYmFuZHdpZHRoCisJICogYWN0cyBsaWtlIHVwIHRvIDNLQiwgYnV0IGlzIGJ1aWx0IGZyb20gc21hbGxlciBwYWNrZXRzLgorCSAqLworCWlmIChtYXhfcGFja2V0KG1heHApID4gMTAyNCkgeworCQllaGNpX2RiZyhlaGNpLCAiYm9ndXMgcWggbWF4cGFja2V0ICVkXG4iLCBtYXhfcGFja2V0KG1heHApKTsKKwkJZ290byBkb25lOworCX0KKwogCS8qIENvbXB1dGUgaW50ZXJydXB0IHNjaGVkdWxpbmcgcGFyYW1ldGVycyBqdXN0IG9uY2UsIGFuZCBzYXZlLgogCSAqIC0gYWxsb3dpbmcgZm9yIGhpZ2ggYmFuZHdpZHRoLCBob3cgbWFueSBuc2VjL3VmcmFtZSBhcmUgdXNlZD8KIAkgKiAtIHNwbGl0IHRyYW5zYWN0aW9ucyBuZWVkIGEgc2Vjb25kIENTUExJVCB1ZnJhbWU7IHNhbWUgcXVlc3Rpb24KQEAgLTc1Nyw3ICs3OTMsMTMgQEAKIAkJCWluZm8yIHw9IChFSENJX1RVTkVfTVVMVF9IUyA8PCAzMCk7CiAJCX0gZWxzZSBpZiAodHlwZSA9PSBQSVBFX0JVTEspIHsKIAkJCWluZm8xIHw9IChFSENJX1RVTkVfUkxfSFMgPDwgMjgpOwotCQkJaW5mbzEgfD0gNTEyIDw8IDE2OwkvKiB1c2IyIGZpeGVkIG1heHBhY2tldCAqLworCQkJLyogVGhlIFVTQiBzcGVjIHNheXMgdGhhdCBoaWdoIHNwZWVkIGJ1bGsgZW5kcG9pbnRzCisJCQkgKiBhbHdheXMgdXNlIDUxMiBieXRlIG1heHBhY2tldC4gIEJ1dCBzb21lIGRldmljZQorCQkJICogdmVuZG9ycyBkZWNpZGVkIHRvIGlnbm9yZSB0aGF0LCBhbmQgTVNGVCBpcyBoYXBweQorCQkJICogdG8gaGVscCB0aGVtIGRvIHNvLiAgU28gbm93IHBlb3BsZSBleHBlY3QgdG8gdXNlCisJCQkgKiBzdWNoIG5vbmNvbmZvcm1hbnQgZGV2aWNlcyB3aXRoIExpbnV4IHRvbzsgc2lnaC4KKwkJCSAqLworCQkJaW5mbzEgfD0gbWF4X3BhY2tldChtYXhwKSA8PCAxNjsKIAkJCWluZm8yIHw9IChFSENJX1RVTkVfTVVMVF9IUyA8PCAzMCk7CiAJCX0gZWxzZSB7CQkvKiBQSVBFX0lOVEVSUlVQVCAqLwogCQkJaW5mbzEgfD0gbWF4X3BhY2tldCAobWF4cCkgPDwgMTY7CkBAIC05MzIsNyArOTc0LDcgQEAKICNpZmRlZiBFSENJX1VSQl9UUkFDRQogCWVoY2lfZGJnIChlaGNpLAogCQkiJXMgJXMgdXJiICVwIGVwJWQlcyBsZW4gJWQsIHF0ZCAlcCBbcWggJXBdXG4iLAotCQlfX0ZVTkNUSU9OX18sIHVyYi0+ZGV2LT5kZXZwYXRoLCB1cmIsCisJCV9fZnVuY19fLCB1cmItPmRldi0+ZGV2cGF0aCwgdXJiLAogCQllcG51bSAmIDB4MGYsIChlcG51bSAmIFVTQl9ESVJfSU4pID8gImluIiA6ICJvdXQiLAogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCiAJCXF0ZCwgdXJiLT5lcC0+aGNwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKaW5kZXggOGE4ZTA4YS4uYmU1NzVlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKQEAgLTQ0MCwxMSArNDQwLDEwIEBACiAJLyogZGlkIGNsZWFyaW5nIFBTRSBkaWQgdGFrZSBlZmZlY3QgeWV0PwogCSAqIHRha2VzIGVmZmVjdCBvbmx5IGF0IGZyYW1lIGJvdW5kYXJpZXMuLi4KIAkgKi8KLQlzdGF0dXMgPSBoYW5kc2hha2UoZWhjaSwgJmVoY2ktPnJlZ3MtPnN0YXR1cywgU1RTX1BTUywgMCwgOSAqIDEyNSk7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJc3RhdHVzID0gaGFuZHNoYWtlX29uX2Vycm9yX3NldF9oYWx0KGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsCisJCQkJCSAgICAgU1RTX1BTUywgMCwgOSAqIDEyNSk7CisJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKLQl9CiAKIAljbWQgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5jb21tYW5kKSB8IENNRF9QU0U7CiAJZWhjaV93cml0ZWwoZWhjaSwgY21kLCAmZWhjaS0+cmVncy0+Y29tbWFuZCk7CkBAIC00NjUsMTEgKzQ2NCwxMCBAQAogCS8qIGRpZCBzZXR0aW5nIFBTRSBub3QgdGFrZSBlZmZlY3QgeWV0PwogCSAqIHRha2VzIGVmZmVjdCBvbmx5IGF0IGZyYW1lIGJvdW5kYXJpZXMuLi4KIAkgKi8KLQlzdGF0dXMgPSBoYW5kc2hha2UoZWhjaSwgJmVoY2ktPnJlZ3MtPnN0YXR1cywgU1RTX1BTUywgU1RTX1BTUywgOSAqIDEyNSk7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJc3RhdHVzID0gaGFuZHNoYWtlX29uX2Vycm9yX3NldF9oYWx0KGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsCisJCQkJCSAgICAgU1RTX1BTUywgU1RTX1BTUywgOSAqIDEyNSk7CisJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKLQl9CiAKIAljbWQgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5jb21tYW5kKSAmIH5DTURfUFNFOwogCWVoY2lfd3JpdGVsKGVoY2ksIGNtZCwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwpAQCAtMTE4MywyMSArMTE4MSwxOCBAQAogCQkJCQlzdHJ1Y3QgZWhjaV9pdGQsIGl0ZF9saXN0KTsKIAkJCWxpc3RfZGVsICgmaXRkLT5pdGRfbGlzdCk7CiAJCQlpdGRfZG1hID0gaXRkLT5pdGRfZG1hOwotCQl9IGVsc2UKLQkJCWl0ZCA9IE5VTEw7Ci0KLQkJaWYgKCFpdGQpIHsKKwkJfSBlbHNlIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CiAJCQlpdGQgPSBkbWFfcG9vbF9hbGxvYyAoZWhjaS0+aXRkX3Bvb2wsIG1lbV9mbGFncywKIAkJCQkJJml0ZF9kbWEpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoIWl0ZCkgeworCQkJCWlzb19zY2hlZF9mcmVlKHN0cmVhbSwgc2NoZWQpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVoY2ktPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KIAkJfQogCi0JCWlmICh1bmxpa2VseSAoTlVMTCA9PSBpdGQpKSB7Ci0JCQlpc29fc2NoZWRfZnJlZSAoc3RyZWFtLCBzY2hlZCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAkJbWVtc2V0IChpdGQsIDAsIHNpemVvZiAqaXRkKTsKIAkJaXRkLT5pdGRfZG1hID0gaXRkX2RtYTsKIAkJbGlzdF9hZGQgKCZpdGQtPml0ZF9saXN0LCAmc2NoZWQtPnRkX2xpc3QpOwpAQCAtMTY4Miw3ICsxNjc3LDcgQEAKICNpZmRlZiBFSENJX1VSQl9UUkFDRQogCWVoY2lfZGJnIChlaGNpLAogCQkiJXMgJXMgdXJiICVwIGVwJWQlcyBsZW4gJWQsICVkIHBrdHMgJWQgdWZyYW1lcyBbJXBdXG4iLAotCQlfX0ZVTkNUSU9OX18sIHVyYi0+ZGV2LT5kZXZwYXRoLCB1cmIsCisJCV9fZnVuY19fLCB1cmItPmRldi0+ZGV2cGF0aCwgdXJiLAogCQl1c2JfcGlwZWVuZHBvaW50ICh1cmItPnBpcGUpLAogCQl1c2JfcGlwZWluICh1cmItPnBpcGUpID8gImluIiA6ICJvdXQiLAogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCkBAIC0xODE2LDIxICsxODExLDE4IEBACiAJCQkJCSBzdHJ1Y3QgZWhjaV9zaXRkLCBzaXRkX2xpc3QpOwogCQkJbGlzdF9kZWwgKCZzaXRkLT5zaXRkX2xpc3QpOwogCQkJc2l0ZF9kbWEgPSBzaXRkLT5zaXRkX2RtYTsKLQkJfSBlbHNlCi0JCQlzaXRkID0gTlVMTDsKLQotCQlpZiAoIXNpdGQpIHsKKwkJfSBlbHNlIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CiAJCQlzaXRkID0gZG1hX3Bvb2xfYWxsb2MgKGVoY2ktPnNpdGRfcG9vbCwgbWVtX2ZsYWdzLAogCQkJCQkmc2l0ZF9kbWEpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoIXNpdGQpIHsKKwkJCQlpc29fc2NoZWRfZnJlZShzdHJlYW0sIGlzb19zY2hlZCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWhjaS0+bG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQogCQl9CiAKLQkJaWYgKCFzaXRkKSB7Ci0JCQlpc29fc2NoZWRfZnJlZSAoc3RyZWFtLCBpc29fc2NoZWQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmVoY2ktPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAJCW1lbXNldCAoc2l0ZCwgMCwgc2l6ZW9mICpzaXRkKTsKIAkJc2l0ZC0+c2l0ZF9kbWEgPSBzaXRkX2RtYTsKIAkJbGlzdF9hZGQgKCZzaXRkLT5zaXRkX2xpc3QsICZpc29fc2NoZWQtPnRkX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCmluZGV4IDIwM2EzMzUuLjIwYjlhMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKQEAgLTE0MDAsNyArMTQwMCw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKIAkJdmFsICY9ICh+SENDT05UUk9MX0hDRlMgJiB+SENDT05UUk9MX1JXRSk7CiAJCXZhbCB8PSBIQ0NPTlRST0xfVVNCX1NVU1BFTkQ7Ci0JCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYpKQorCQlpZiAoaGNkLT5zZWxmLnJvb3RfaHViLT5kb19yZW1vdGVfd2FrZXVwKQogCQkJdmFsIHw9IEhDQ09OVFJPTF9SV0U7CiAJCS8qIFdhaXQgZm9yIHVzYiB0cmFuc2ZlcnMgdG8gZmluaXNoICovCiAJCW1zbGVlcCgyKTsKQEAgLTE0NDIsMTEgKzE0NDIsNiBAQAogCQlicmVhazsKIAljYXNlIEhDQ09OVFJPTF9VU0JfT1BFUjoKIAkJc3Bpbl91bmxvY2tfaXJxKCZpc3AxMTZ4LT5sb2NrKTsKLQkJLyogV2l0aG91dCBzZXR0aW5nIHBvd2VyX3N0YXRlIGhlcmUgdGhlCi0JCSAgIFNVU1BFTkRFRCBzdGF0ZSB3b24ndCBiZSByZW1vdmVkIGZyb20KLQkJICAgc3lzZnMvdXNiTi9wb3dlci5zdGF0ZSBhcyBhIHJlc3BvbnNlIHRvIHJlbW90ZQotCQkgICB3YWtldXAuIE1heWJlIGluIHRoZSBmdXR1cmUuICovCi0JCWhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJLyogSENDT05UUk9MX1VTQl9SRVNFVDogdGhpcyBtYXkgaGFwcGVuLCB3aGVuIGR1cmluZwpAQCAtMTQ2MCw3ICsxNDU1LDYgQEAKIAkJaWYgKChpc3AxMTZ4LT5yaGRlc2NhICYgUkhfQV9ORFApID09IDIpCiAJCQlpc3AxMTZ4X2h1Yl9jb250cm9sKGhjZCwgU2V0UG9ydEZlYXR1cmUsCiAJCQkJCSAgICBVU0JfUE9SVF9GRUFUX1BPV0VSLCAyLCBOVUxMLCAwKTsKLQkJaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE0ODYsOCArMTQ4MCw2IEBACiAJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0NPTlRST0wsCiAJCQkgICAgKHZhbCAmIH5IQ0NPTlRST0xfSENGUykgfCBIQ0NPTlRST0xfVVNCX09QRVIpOwogCXNwaW5fdW5sb2NrX2lycSgmaXNwMTE2eC0+bG9jayk7Ci0JLyogc2VlIGFuYWxvZ291cyBjb21tZW50IGFib3ZlICovCi0JaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOwogCiAJcmV0dXJuIDA7CkBAIC0xNjYzLDcgKzE2NTUsNiBAQAogc3RhdGljIGludCBpc3AxMTZ4X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJVkRCRygiJXM6IHN0YXRlICV4XG4iLCBfX2Z1bmNfXywgc3RhdGUuZXZlbnQpOwotCWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NzIsOCArMTY2Myw3IEBACiAqLwogc3RhdGljIGludCBpc3AxMTZ4X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0JVkRCRygiJXM6ICBzdGF0ZSAleFxuIiwgX19mdW5jX18sIGRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpOwotCWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwlWREJHKCIlc1xuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYwppbmRleCBkNzJkYzA3Li5jOTZkYjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKQEAgLTI2MSw3ICsyNjEsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmIENPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKQEAgLTM0OCw2ICszNDcsNyBAQAogCWlmICghY2xvY2tlZCkKIAkJYXQ5MV9zdGFydF9jbG9jaygpOwogCisJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXUxeHh4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXUxeHh4LmMKaW5kZXggZjkwZmUwYy4uMWI5YWJkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdTF4eHguYwpAQCAtMjg4LDcgKzI4OCw2IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWRiZy5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWRiZy5jCmluZGV4IGEyMmMzMGEuLmUwNmJmYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZGJnLmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCQloY2QtPnByb2R1Y3RfZGVzYywKIAkJaGNkX25hbWUpOwogCi0JaWYgKGJ1cy0+Y29udHJvbGxlci0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKKwlpZiAoIXRlc3RfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKSkgewogCQlzaXplIC09IHNjbnByaW50ZiAobmV4dCwgc2l6ZSwKIAkJCSJTVVNQRU5ERUQgKG5vIHJlZ2lzdGVyIGFjY2VzcylcbiIpOwogCQlnb3RvIGRvbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZXA5M3h4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZXA5M3h4LmMKaW5kZXggMTU2ZTkzYS4uMDZhYWRmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWVwOTN4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1lcDkzeHguYwpAQCAtMTM1LDcgKzEzNSw2IEBACiAJLmdldF9mcmFtZV9udW1iZXIJPSBvaGNpX2dldF9mcmFtZSwKIAkuaHViX3N0YXR1c19kYXRhCT0gb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sCQk9IG9oY2lfaHViX2NvbnRyb2wsCi0JLmh1Yl9pcnFfZW5hYmxlCQk9IG9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYgQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kCQk9IG9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUJCT0gb2hjaV9idXNfcmVzdW1lLApAQCAtMTc3LDcgKzE3Niw2IEBACiAKIAllcDkzeHhfc3RvcF9oYygmcGRldi0+ZGV2KTsKIAloY2QtPnN0YXRlID0gSENfU1RBVEVfU1VTUEVOREVEOwotCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKIAogCXJldHVybiAwOwogfQpAQCAtMTkzLDkgKzE5MSw4IEBACiAJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXM7CiAKIAllcDkzeHhfc3RhcnRfaGMoJnBkZXYtPmRldik7Ci0JcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOwogCisJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCmluZGV4IDQ4ZTRiMTEuLjViZTNiYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKQEAgLTM2LDE4ICszNiw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIGhjZC0+aHViX2lycV9lbmFibGUoKSAqLwotc3RhdGljIHZvaWQgb2hjaV9yaHNjX2VuYWJsZSAoc3RydWN0IHVzYl9oY2QgKmhjZCkKLXsKLQlzdHJ1Y3Qgb2hjaV9oY2QJCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7Ci0KLQlzcGluX2xvY2tfaXJxKCZvaGNpLT5sb2NrKTsKLQlpZiAoIW9oY2ktPmF1dG9zdG9wKQotCQlkZWxfdGltZXIoJmhjZC0+cmhfdGltZXIpOwkvKiBQcmV2ZW50IG5leHQgcG9sbCAqLwotCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZvaGNpLT5sb2NrKTsKLX0KLQogI2RlZmluZSBPSENJX1NDSEVEX0VOQUJMRVMgXAogCShPSENJX0NUUkxfQ0xFfE9IQ0lfQ1RSTF9CTEV8T0hDSV9DVFJMX1BMRXxPSENJX0NUUkxfSUUpCiAKQEAgLTEwMywxMSArOTEsMTEgQEAKIAlmaW5pc2hfdW5saW5rcyAob2hjaSwgb2hjaV9mcmFtZV9ubyhvaGNpKSk7CiAKIAkvKiBtYXliZSByZXN1bWUgY2FuIHdha2Ugcm9vdCBodWIgKi8KLQlpZiAoZGV2aWNlX21heV93YWtldXAoJm9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViLT5kZXYpIHx8Ci0JCQlhdXRvc3RvcCkKKwlpZiAob2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPmRvX3JlbW90ZV93YWtldXAgfHwgYXV0b3N0b3ApIHsKIAkJb2hjaS0+aGNfY29udHJvbCB8PSBPSENJX0NUUkxfUldFOwotCWVsc2UgewotCQlvaGNpX3dyaXRlbCAob2hjaSwgT0hDSV9JTlRSX1JIU0MsICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CisJfSBlbHNlIHsKKwkJb2hjaV93cml0ZWwob2hjaSwgT0hDSV9JTlRSX1JIU0MgfCBPSENJX0lOVFJfUkQsCisJCQkJJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKIAkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX1JXRTsKIAl9CiAKQEAgLTMyNiwyMyArMzE0LDc2IEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBDYXJyeSBvdXQgdGhlIGZpbmFsIHN0ZXBzIG9mIHJlc3VtaW5nIHRoZSBjb250cm9sbGVyIGRldmljZSAqLworc3RhdGljIHZvaWQgb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb2hjaV9oY2QJCSpvaGNpID0gaGNkX3RvX29oY2koaGNkKTsKKwlpbnQJCQlwb3J0OworCWJvb2wJCQluZWVkX3JlaW5pdCA9IGZhbHNlOworCisJLyogU2VlIGlmIHRoZSBjb250cm9sbGVyIGlzIGFscmVhZHkgcnVubmluZyBvciBoYXMgYmVlbiByZXNldCAqLworCW9oY2ktPmhjX2NvbnRyb2wgPSBvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwlpZiAob2hjaS0+aGNfY29udHJvbCAmIChPSENJX0NUUkxfSVIgfCBPSENJX1NDSEVEX0VOQUJMRVMpKSB7CisJCW5lZWRfcmVpbml0ID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKG9oY2ktPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfSENGUykgeworCQljYXNlIE9IQ0lfVVNCX09QRVI6CisJCWNhc2UgT0hDSV9VU0JfUkVTRVQ6CisJCQluZWVkX3JlaW5pdCA9IHRydWU7CisJCX0KKwl9CisKKwkvKiBJZiBuZWVkZWQsIHJlaW5pdGlhbGl6ZSBhbmQgc3VzcGVuZCB0aGUgcm9vdCBodWIgKi8KKwlpZiAobmVlZF9yZWluaXQpIHsKKwkJc3Bpbl9sb2NrX2lycSgmb2hjaS0+bG9jayk7CisJCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SRVNVTUlORzsKKwkJb2hjaV9yaF9yZXN1bWUob2hjaSk7CisJCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9RVUlFU0NJTkc7CisJCW9oY2lfcmhfc3VzcGVuZChvaGNpLCAwKTsKKwkJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZvaGNpLT5sb2NrKTsKKwl9CisKKwkvKiBOb3JtYWxseSBqdXN0IHR1cm4gb24gcG9ydCBwb3dlciBhbmQgZW5hYmxlIGludGVycnVwdHMgKi8KKwllbHNlIHsKKwkJb2hjaV9kYmcob2hjaSwgInBvd2VydXAgcG9ydHNcbiIpOworCQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgb2hjaS0+bnVtX3BvcnRzOyBwb3J0KyspCisJCQlvaGNpX3dyaXRlbChvaGNpLCBSSF9QU19QUFMsCisJCQkJCSZvaGNpLT5yZWdzLT5yb290aHViLnBvcnRzdGF0dXNbcG9ydF0pOworCisJCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9NSUUsICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKTsKKwkJb2hjaV9yZWFkbChvaGNpLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSk7CisJCW1zbGVlcCgyMCk7CisJfQorfQorCiAvKiBDYXJyeSBvdXQgcG9sbGluZy0sIGF1dG9zdG9wLSwgYW5kIGF1dG9yZXN1bWUtcmVsYXRlZCBzdGF0ZSBjaGFuZ2VzICovCiBzdGF0aWMgaW50IG9oY2lfcm9vdF9odWJfc3RhdGVfY2hhbmdlcyhzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2ksIGludCBjaGFuZ2VkLAogCQlpbnQgYW55X2Nvbm5lY3RlZCkKIHsKIAlpbnQJcG9sbF9yaCA9IDE7CisJaW50CXJoc2M7CiAKKwlyaHNjID0gb2hjaV9yZWFkbChvaGNpLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSkgJiBPSENJX0lOVFJfUkhTQzsKIAlzd2l0Y2ggKG9oY2ktPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfSENGUykgewogCiAJY2FzZSBPSENJX1VTQl9PUEVSOgotCQkvKiBrZWVwIG9uIHBvbGxpbmcgdW50aWwgd2Uga25vdyBhIGRldmljZSBpcyBjb25uZWN0ZWQKLQkJICogYW5kIFJIU0MgaXMgZW5hYmxlZCAqLworCQkvKiBJZiBubyBzdGF0dXMgY2hhbmdlcyBhcmUgcGVuZGluZywgZW5hYmxlIHN0YXR1cy1jaGFuZ2UKKwkJICogaW50ZXJydXB0cy4KKwkJICovCisJCWlmICghcmhzYyAmJiAhY2hhbmdlZCkgeworCQkJcmhzYyA9IE9IQ0lfSU5UUl9SSFNDOworCQkJb2hjaV93cml0ZWwob2hjaSwgcmhzYywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCQl9CisKKwkJLyogS2VlcCBvbiBwb2xsaW5nIHVudGlsIHdlIGtub3cgYSBkZXZpY2UgaXMgY29ubmVjdGVkCisJCSAqIGFuZCBSSFNDIGlzIGVuYWJsZWQsIG9yIHVudGlsIHdlIGF1dG9zdG9wLgorCQkgKi8KIAkJaWYgKCFvaGNpLT5hdXRvc3RvcCkgewogCQkJaWYgKGFueV9jb25uZWN0ZWQgfHwKIAkJCQkJIWRldmljZV9tYXlfd2FrZXVwKCZvaGNpX3RvX2hjZChvaGNpKQogCQkJCQkJLT5zZWxmLnJvb3RfaHViLT5kZXYpKSB7Ci0JCQkJaWYgKG9oY2lfcmVhZGwob2hjaSwgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpICYKLQkJCQkJCU9IQ0lfSU5UUl9SSFNDKQorCQkJCWlmIChyaHNjKQogCQkJCQlwb2xsX3JoID0gMDsKIAkJCX0gZWxzZSB7CiAJCQkJb2hjaS0+YXV0b3N0b3AgPSAxOwpAQCAtMzU1LDEyICszOTYsMTMgQEAKIAkJCQlvaGNpLT5hdXRvc3RvcCA9IDA7CiAJCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKwogCQkJCQkJU1RBVEVDSEFOR0VfREVMQVk7Ci0JCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywKKwkJCX0gZWxzZSBpZiAocmhzYyAmJiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCiAJCQkJCQlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKQogCQkJCQkmJiAhb2hjaS0+ZWRfcm1fbGlzdAogCQkJCQkmJiAhKG9oY2ktPmhjX2NvbnRyb2wgJgogCQkJCQkJT0hDSV9TQ0hFRF9FTkFCTEVTKSkgewogCQkJCW9oY2lfcmhfc3VzcGVuZChvaGNpLCAxKTsKKwkJCQlwb2xsX3JoID0gMDsKIAkJCX0KIAkJfQogCQlicmVhazsKQEAgLTM3NCw2ICs0MTYsMTIgQEAKIAkJCWVsc2UKIAkJCQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihvaGNpX3RvX2hjZChvaGNpKSk7CiAJCX0gZWxzZSB7CisJCQlpZiAoIXJoc2MgJiYgKG9oY2ktPmF1dG9zdG9wIHx8CisJCQkJCW9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViLT4KKwkJCQkJCWRvX3JlbW90ZV93YWtldXApKQorCQkJCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLAorCQkJCQkJJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCiAJCQkvKiBldmVyeXRoaW5nIGlzIGlkbGUsIG5vIG5lZWQgZm9yIHBvbGxpbmcgKi8KIAkJCXBvbGxfcmggPSAwOwogCQl9CkBAIC0zOTUsMTIgKzQ0MywxNiBAQAogc3RhdGljIGludCBvaGNpX3Jvb3RfaHViX3N0YXRlX2NoYW5nZXMoc3RydWN0IG9oY2lfaGNkICpvaGNpLCBpbnQgY2hhbmdlZCwKIAkJaW50IGFueV9jb25uZWN0ZWQpCiB7Ci0JaW50CXBvbGxfcmggPSAxOwotCi0JLyoga2VlcCBvbiBwb2xsaW5nIHVudGlsIFJIU0MgaXMgZW5hYmxlZCAqLworCS8qIElmIFJIU0MgaXMgZW5hYmxlZCwgZG9uJ3QgcG9sbCAqLwogCWlmIChvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKSAmIE9IQ0lfSU5UUl9SSFNDKQotCQlwb2xsX3JoID0gMDsKLQlyZXR1cm4gcG9sbF9yaDsKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiBubyBzdGF0dXMgY2hhbmdlcyBhcmUgcGVuZGluZywgZW5hYmxlIHN0YXR1cy1jaGFuZ2UgaW50ZXJydXB0cyAqLworCWlmICghY2hhbmdlZCkgeworCQlvaGNpX3dyaXRlbChvaGNpLCBPSENJX0lOVFJfUkhTQywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CiB9CiAKICNlbmRpZgkvKiBDT05GSUdfUE0gKi8KQEAgLTU2NCwxNCArNjE2LDE4IEBACiAJdTMyCXRlbXA7CiAJdTE2CW5vdyA9IG9oY2lfcmVhZGwob2hjaSwgJm9oY2ktPnJlZ3MtPmZtbnVtYmVyKTsKIAl1MTYJcmVzZXRfZG9uZSA9IG5vdyArIFBPUlRfUkVTRVRfTVNFQzsKKwlpbnQJbGltaXRfMSA9IERJVl9ST1VORF9VUChQT1JUX1JFU0VUX01TRUMsIFBPUlRfUkVTRVRfSFdfTVNFQyk7CiAKIAkvKiBidWlsZCBhICJjb250aW51b3VzIGVub3VnaCIgcmVzZXQgc2lnbmFsLCB3aXRoIHVwIHRvCiAJICogM21zZWMgZ2FwIGJldHdlZW4gcHVsc2VzLiAgc2NoZWR1bGVyIEhaPT0xMDAgbXVzdCB3b3JrOwogCSAqIHRoaXMgbWlnaHQgbmVlZCB0byBiZSBkZWFkbGluZS1zY2hlZHVsZWQuCiAJICovCiAJZG8geworCQlpbnQgbGltaXRfMjsKKwogCQkvKiBzcGluIHVudGlsIGFueSBjdXJyZW50IHJlc2V0IGZpbmlzaGVzICovCi0JCWZvciAoOzspIHsKKwkJbGltaXRfMiA9IFBPUlRfUkVTRVRfSFdfTVNFQyAqIDI7CisJCXdoaWxlICgtLWxpbWl0XzIgPj0gMCkgewogCQkJdGVtcCA9IG9oY2lfcmVhZGwgKG9oY2ksIHBvcnRzdGF0KTsKIAkJCS8qIGhhbmRsZSBlLmcuIENhcmRCdXMgZWplY3QgKi8KIAkJCWlmICh0ZW1wID09IH4odTMyKTApCkBAIC01ODEsNiArNjM3LDE3IEBACiAJCQl1ZGVsYXkgKDUwMCk7CiAJCX0KIAorCQkvKiB0aW1lb3V0IChhIGhhcmR3YXJlIGVycm9yKSBoYXMgYmVlbiBvYnNlcnZlZCB3aGVuCisJCSAqIEVIQ0kgc2V0cyBDRiB3aGlsZSB0aGlzIGRyaXZlciBpcyByZXNldHRpbmcgYSBwb3J0OworCQkgKiBwcmVzdW1hYmx5IG90aGVyIGRpc2Nvbm5lY3QgcGF0aHMgbWlnaHQgZG8gaXQgdG9vLgorCQkgKi8KKwkJaWYgKGxpbWl0XzIgPCAwKSB7CisJCQlvaGNpX2RiZyhvaGNpLAorCQkJCSJwb3J0WyVkXSByZXNldCB0aW1lb3V0LCBzdGF0ICUwOHhcbiIsCisJCQkJcG9ydCwgdGVtcCk7CisJCQlicmVhazsKKwkJfQorCiAJCWlmICghKHRlbXAgJiBSSF9QU19DQ1MpKQogCQkJYnJlYWs7CiAJCWlmICh0ZW1wICYgUkhfUFNfUFJTQykKQEAgLTU5MCw4ICs2NTcsMTEgQEAKIAkJb2hjaV93cml0ZWwgKG9oY2ksIFJIX1BTX1BSUywgcG9ydHN0YXQpOwogCQltc2xlZXAoUE9SVF9SRVNFVF9IV19NU0VDKTsKIAkJbm93ID0gb2hjaV9yZWFkbChvaGNpLCAmb2hjaS0+cmVncy0+Zm1udW1iZXIpOwotCX0gd2hpbGUgKHRpY2tfYmVmb3JlKG5vdywgcmVzZXRfZG9uZSkpOwotCS8qIGNhbGxlciBzeW5jaHJvbml6ZXMgdXNpbmcgUFJTQyAqLworCX0gd2hpbGUgKHRpY2tfYmVmb3JlKG5vdywgcmVzZXRfZG9uZSkgJiYgLS1saW1pdF8xID49IDApOworCisJLyogY2FsbGVyIHN5bmNocm9uaXplcyB1c2luZyBQUlNDIC4uLiBhbmQgaGFuZGxlcyBQUlMKKwkgKiBzdGlsbCBiZWluZyBzZXQgd2hlbiB0aGlzIHJldHVybnMuCisJICovCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1saDdhNDA0LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbGg3YTQwNC5jCmluZGV4IDEzYzEyZWQuLjk2ZDE0ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1saDdhNDA0LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWxoN2E0MDQuYwpAQCAtMTkzLDcgKzE5Myw2IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKaW5kZXggN2JmY2ExZS4uNjg1OWZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCkBAIC00NjYsNyArNDY2LDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCi0JLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCkBAIC01MDUsMjEgKzUwNCwyMCBAQAogCiAJb21hcF9vaGNpX2Nsb2NrX3Bvd2VyKDApOwogCW9oY2lfdG9faGNkKG9oY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKLQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBvaGNpX29tYXBfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgdXNiX2hjZAkqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwogCiAJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQogCQltc2xlZXAoNSk7CiAJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXM7CiAKIAlvbWFwX29oY2lfY2xvY2tfcG93ZXIoMSk7Ci0JZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwotCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldikpOworCW9oY2lfZmluaXNoX2NvbnRyb2xsZXJfcmVzdW1lKGhjZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYwppbmRleCBkMDM2MGY2Li4zYmYxNzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCkBAIC0yMzgsNDIgKzIzOCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmCWRlZmluZWQoQ09ORklHX1VTQl9QRVJTSVNUKSAmJiAoZGVmaW5lZChDT05GSUdfVVNCX0VIQ0lfSENEKSB8fCBcCi0JCWRlZmluZWQoQ09ORklHX1VTQl9FSENJX0hDRF9NT0RVTEUpKQotCi0vKiBGb2xsb3dpbmcgYSBwb3dlciBsb3NzLCB3ZSBtdXN0IHByZXBhcmUgdG8gcmVnYWluIGNvbnRyb2wgb2YgdGhlIHBvcnRzCi0gKiB3ZSB1c2VkIHRvIG93bi4gIFRoaXMgbWVhbnMgdHVybmluZyBvbiB0aGUgcG9ydCBwb3dlciBiZWZvcmUgZWhjaS1oY2QKLSAqIHRyaWVzIHRvIHN3aXRjaCBvd25lcnNoaXAuCi0gKgotICogVGhpcyBpc24ndCBhIDEwMCUgcGVyZmVjdCBzb2x1dGlvbi4gIE9uIG1vc3Qgc3lzdGVtcyB0aGUgT0hDSSBjb250cm9sbGVycwotICogbGllIGF0IGxvd2VyIFBDSSBhZGRyZXNzZXMgdGhhbiB0aGUgRUhDSSBjb250cm9sbGVyLCBzbyB0aGV5IHdpbGwgYmUKLSAqIGRpc2NvdmVyZWQgKGFuZCBoZW5jZSByZXN1bWVkKSBmaXJzdC4gIEJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhpbmdzCi0gKiB3aWxsIGFsd2F5cyB3b3JrIHRoaXMgd2F5LiAgSWYgdGhlIEVIQ0kgY29udHJvbGxlciBpcyByZXN1bWVkIGZpcnN0IGFuZAotICogdGhlIE9IQ0kgcG9ydHMgYXJlIHVucG93ZXJlZCwgdGhlbiB0aGUgaGFuZG92ZXIgd2lsbCBmYWlsLgotICovCi1zdGF0aWMgdm9pZCBwcmVwYXJlX2Zvcl9oYW5kb3ZlcihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQotewotCXN0cnVjdCBvaGNpX2hjZAkqb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7Ci0JaW50CQlwb3J0OwotCi0JLyogSGVyZSB3ZSAia25vdyIgcm9vdCBwb3J0cyBzaG91bGQgYWx3YXlzIHN0YXkgcG93ZXJlZCAqLwotCW9oY2lfZGJnKG9oY2ksICJwb3dlcnVwIHBvcnRzXG4iKTsKLQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgb2hjaS0+bnVtX3BvcnRzOyBwb3J0KyspCi0JCW9oY2lfd3JpdGVsKG9oY2ksIFJIX1BTX1BQUywKLQkJCQkmb2hjaS0+cmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzW3BvcnRdKTsKLQotCS8qIEZsdXNoIHRob3NlIHdyaXRlcyAqLwotCW9oY2lfcmVhZGwob2hjaSwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCW1zbGVlcCgyMCk7Ci19Ci0KLSNlbHNlCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX2Zvcl9oYW5kb3ZlcihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoteyB9Ci0KLSNlbmRpZgkvKiBDT05GSUdfVVNCX1BFUlNJU1QgZXRjLiAqLwotCiAjaWZkZWYJQ09ORklHX1BNCiAKIHN0YXRpYyBpbnQgb2hjaV9wY2lfc3VzcGVuZCAoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCkBAIC0zMTMsMTAgKzI3Nyw3IEBACiBzdGF0aWMgaW50IG9oY2lfcGNpX3Jlc3VtZSAoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzZXRfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKTsKLQotCS8qIEZJWE1FOiB3ZSBzaG91bGQgdHJ5IHRvIGRldGVjdCBsb3NzIG9mIFZCVVMgcG93ZXIgaGVyZSAqLwotCXByZXBhcmVfZm9yX2hhbmRvdmVyKGhjZCk7Ci0KKwlvaGNpX2ZpbmlzaF9jb250cm9sbGVyX3Jlc3VtZShoY2QpOwogCXJldHVybiAwOwogfQogCkBAIC0zNDUsOSArMzA2LDggQEAKIAkuc2h1dGRvd24gPQkJb2hjaV9zaHV0ZG93biwKIAogI2lmZGVmCUNPTkZJR19QTQotCS8qIHRoZXNlIHN1c3BlbmQvcmVzdW1lIGVudHJpZXMgYXJlIGZvciB1cHN0cmVhbSBQQ0kgZ2x1ZSBPTkxZICovCi0JLnN1c3BlbmQgPQkJb2hjaV9wY2lfc3VzcGVuZCwKLQkucmVzdW1lID0JCW9oY2lfcGNpX3Jlc3VtZSwKKwkucGNpX3N1c3BlbmQgPQkJb2hjaV9wY2lfc3VzcGVuZCwKKwkucGNpX3Jlc3VtZSA9CQlvaGNpX3BjaV9yZXN1bWUsCiAjZW5kaWYKIAogCS8qCkBAIC0zNjcsNyArMzI3LDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCi0JLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYwppbmRleCAyOGI0NThmLi42NjRmMDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKQEAgLTI4MCw3ICsyODAsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPSBvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPSBvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9IG9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0gb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9IG9oY2lfYnVzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng4NTUwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54ODU1MC5jCmluZGV4IDYwNWQ1OWMuLjI4NDY3ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng4NTUwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDg1NTAuYwpAQCAtMjAxLDcgKzIwMSw2IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jCmluZGV4IGE2NzI1MjcuLjUwZTU1ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLW9mLmMKQEAgLTcyLDcgKzcyLDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCi0JLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYwppbmRleCA1MjNjMzAxLi5jZDMzOThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMKQEAgLTE3Miw3ICsxNzIsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmCUNPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wczMuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wczMuYwppbmRleCAwMWEwY2FlLi5iZmRlYjBkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBzMy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wczMuYwpAQCAtNjgsNyArNjgsNiBAQAogCS5nZXRfZnJhbWVfbnVtYmVyCT0gb2hjaV9nZXRfZnJhbWUsCiAJLmh1Yl9zdGF0dXNfZGF0YQk9IG9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbAkJPSBvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZQkJPSBvaGNpX3Joc2NfZW5hYmxlLAogCS5zdGFydF9wb3J0X3Jlc2V0CT0gb2hjaV9zdGFydF9wb3J0X3Jlc2V0LAogI2lmIGRlZmluZWQoQ09ORklHX1BNKQogCS5idXNfc3VzcGVuZCAJCT0gb2hjaV9idXNfc3VzcGVuZCwKQEAgLTEyNyw3ICsxMjYsNiBAQAogCQlnb3RvIGZhaWxfaXJxOwogCX0KIAotCWRldi0+Y29yZS5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJZGV2LT5jb3JlLmRtYV9tYXNrID0gJmR1bW15X21hc2s7IC8qIEZJWE1FOiBmb3IgaW1wcm9wZXIgdXNiIGNvZGUgKi8KIAogCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZwczNfb2hjaV9oY19kcml2ZXIsICZkZXYtPmNvcmUsIGRldi0+Y29yZS5idXNfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCmluZGV4IDhhZDliM2IuLjcwYjBkNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKQEAgLTI5OCw3ICsyOTgsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmICBDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCkBAIC0zMzksNyArMzM4LDYgQEAKIAogCXB4YTI3eF9zdG9wX2hjKCZwZGV2LT5kZXYpOwogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7Ci0JcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNTcsOSArMzU1LDcgQEAKIAlpZiAoKHN0YXR1cyA9IHB4YTI3eF9zdGFydF9oYygmcGRldi0+ZGV2KSkgPCAwKQogCQlyZXR1cm4gc3RhdHVzOwogCi0JcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOwotCisJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zM2MyNDEwLmMKaW5kZXggZWFkNDc3Mi4uYTczZDJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jCkBAIC00NjYsNyArNDY2LDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9zM2MyNDEwX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9zM2MyNDEwX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jCmluZGV4IDBmNDhmMmQuLjk5NDM4YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zYTExMTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMKQEAgLTIzMSw3ICsyMzEsNiBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmCUNPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zaC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNoLmMKaW5kZXggZTdlZTYwNy4uNjBmMDNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNoLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNoLmMKQEAgLTY4LDcgKzY4LDYgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCi0JLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc201MDEuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zbTUwMS5jCmluZGV4IDRlYTkyNzYuLjc3MjA0ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zbTUwMS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zbTUwMS5jCkBAIC03NSw3ICs3NSw2IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAotCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApAQCAtMTk5LDcgKzE5OCw4IEBACiAJdXNiX3B1dF9oY2QoaGNkKTsKIAlkbWFfcmVsZWFzZV9kZWNsYXJlZF9tZW1vcnkoJnBkZXYtPmRldik7CiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKLQlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgbWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSk7CisJaWYgKG1lbSkKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIG1lbS0+ZW5kIC0gbWVtLT5zdGFydCArIDEpOwogCiAJLyogbWFzayBpbnRlcnJ1cHRzIGFuZCBkaXNhYmxlIHBvd2VyICovCiAKQEAgLTIyNCwyNCArMjI0LDI2IEBACiAKIAlzbTUwMV91bml0X3Bvd2VyKGRldi0+cGFyZW50LCBTTTUwMV9HQVRFX1VTQl9IT1NULCAwKTsKIAlvaGNpX3RvX2hjZChvaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7Ci0JZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBvaGNpX3NtNTAxX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IG9oY2lfaGNkCSpvaGNpID0gaGNkX3RvX29oY2kocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOworCXN0cnVjdCB1c2JfaGNkCSpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwogCiAJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQogCQltc2xlZXAoNSk7CiAJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXM7CiAKIAlzbTUwMV91bml0X3Bvd2VyKGRldi0+cGFyZW50LCBTTTUwMV9HQVRFX1VTQl9IT1NULCAxKTsKLQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7CisJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKIAlyZXR1cm4gMDsKIH0KKyNlbHNlCisjZGVmaW5lIG9oY2lfc201MDFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIG9oY2lfc201MDFfcmVzdW1lIE5VTEwKICNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjUzLDEwICsyNTUsOCBAQAogCS5wcm9iZQkJPSBvaGNpX2hjZF9zbTUwMV9kcnZfcHJvYmUsCiAJLnJlbW92ZQkJPSBvaGNpX2hjZF9zbTUwMV9kcnZfcmVtb3ZlLAogCS5zaHV0ZG93bgk9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCi0jaWZkZWYJQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBvaGNpX3NtNTAxX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBvaGNpX3NtNTAxX3Jlc3VtZSwKLSNlbmRpZgogCS5kcml2ZXIJCT0gewogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAic201MDEtdXNiIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zc2IuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zc2IuYwppbmRleCA2ZTljMmQ2Li5jNDI2NWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc3NiLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNzYi5jCkBAIC02MCwzNiArNjAsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc3NiX29oY2lfaGNkX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCi17Ci0Jc3RydWN0IHNzYl9vaGNpX2RldmljZSAqb2hjaWRldiA9IGhjZF90b19zc2Jfb2hjaShoY2QpOwotCXN0cnVjdCBvaGNpX2hjZCAqb2hjaSA9ICZvaGNpZGV2LT5vaGNpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb2hjaS0+bG9jaywgZmxhZ3MpOwotCi0Jb2hjaV93cml0ZWwob2hjaSwgT0hDSV9JTlRSX01JRSwgJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKLQlvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7IC8qIGNvbW1pdCB3cml0ZSAqLwotCi0JLyogbWFrZSBzdXJlIHNuYXBzaG90IGJlaW5nIHJlc3VtZWQgcmUtZW51bWVyYXRlcyBldmVyeXRoaW5nICovCi0JaWYgKG1lc3NhZ2UuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykKLQkJb2hjaV91c2JfcmVzZXQob2hjaSk7Ci0KLQljbGVhcl9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwgJmhjZC0+ZmxhZ3MpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2hjaS0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNzYl9vaGNpX2hjZF9yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKLXsKLQlzZXRfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKTsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciBzc2Jfb2hjaV9oY19kcml2ZXIgPSB7CiAJLmRlc2NyaXB0aW9uCQk9ICJzc2ItdXNiLW9oY2kiLAogCS5wcm9kdWN0X2Rlc2MJCT0gIlNTQiBPSENJIENvbnRyb2xsZXIiLApAQCAtMTAzLDExICs3Myw2IEBACiAJLnN0b3AJCQk9IG9oY2lfc3RvcCwKIAkuc2h1dGRvd24JCT0gb2hjaV9zaHV0ZG93biwKIAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IHNzYl9vaGNpX2hjZF9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IHNzYl9vaGNpX2hjZF9yZXN1bWUsCi0jZW5kaWYKLQogCS51cmJfZW5xdWV1ZQkJPSBvaGNpX3VyYl9lbnF1ZXVlLAogCS51cmJfZGVxdWV1ZQkJPSBvaGNpX3VyYl9kZXF1ZXVlLAogCS5lbmRwb2ludF9kaXNhYmxlCT0gb2hjaV9lbmRwb2ludF9kaXNhYmxlLApAQCAtMTE2LDcgKzgxLDYgQEAKIAogCS5odWJfc3RhdHVzX2RhdGEJPSBvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wJCT0gb2hjaV9odWJfY29udHJvbCwKLQkuaHViX2lycV9lbmFibGUJCT0gb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQJCT0gb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZQkJPSBvaGNpX2J1c19yZXN1bWUsCkBAIC0yMjQsNiArMTg4LDcgQEAKIAogCXNzYl9kZXZpY2VfZW5hYmxlKGRldiwgb2hjaWRldi0+ZW5hYmxlX2ZsYWdzKTsKIAorCW9oY2lfZmluaXNoX2NvbnRyb2xsZXJfcmVzdW1lKGhjZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jIGIvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKaW5kZXggMGVlNjk0Zi4uYWU2ZTcwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFVIQ0lfVVNCTEVHU1VQLCAmbGVnc3VwKTsKIAlpZiAobGVnc3VwICYgfihVSENJX1VTQkxFR1NVUF9STyB8IFVIQ0lfVVNCTEVHU1VQX1JXQykpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGxlZ3N1cCA9IDB4JTA0eFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGxlZ3N1cCk7CisJCQkJX19mdW5jX18sIGxlZ3N1cCk7CiAJCWdvdG8gcmVzZXRfbmVlZGVkOwogCX0KIApAQCAtMTE0LDE0ICsxMTQsMTQgQEAKIAlpZiAoKGNtZCAmIFVIQ0lfVVNCQ01EX1JVTikgfHwgIShjbWQgJiBVSENJX1VTQkNNRF9DT05GSUdVUkUpIHx8CiAJCQkhKGNtZCAmIFVIQ0lfVVNCQ01EX0VHU00pKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBjbWQgPSAweCUwNHhcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBjbWQpOworCQkJCV9fZnVuY19fLCBjbWQpOwogCQlnb3RvIHJlc2V0X25lZWRlZDsKIAl9CiAKIAlpbnRyID0gaW53KGJhc2UgKyBVSENJX1VTQklOVFIpOwogCWlmIChpbnRyICYgKH5VSENJX1VTQklOVFJfUkVTVU1FKSkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogaW50ciA9IDB4JTA0eFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGludHIpOworCQkJCV9fZnVuY19fLCBpbnRyKTsKIAkJZ290byByZXNldF9uZWVkZWQ7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKaW5kZXggOWY4MGU1Mi4uZjRmYTkzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCkBAIC00NiwxNSArNDYsMTcgQEAKIE1PRFVMRV9BVVRIT1IoIllvc2hpaGlybyBTaGltb2RhIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnI4YTY2NTk3X2hjZCIpOwogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIyOSBNYXkgMjAwNyIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjEwIEFwciAyMDA4IgogCiBzdGF0aWMgY29uc3QgY2hhciBoY2RfbmFtZVtdID0gInI4YTY2NTk3X2hjZCI7CiAKIC8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCisjaWYgIWRlZmluZWQoQ09ORklHX1NVUEVSSF9PTl9DSElQX1I4QTY2NTk3KQogc3RhdGljIHVuc2lnbmVkIHNob3J0IGNsb2NrID0gWFRBTDEyOwogbW9kdWxlX3BhcmFtKGNsb2NrLCB1c2hvcnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjbG9jaywgImlucHV0IGNsb2NrOiA0OE1Iej0zMjc2OCwgMjRNSHo9MTYzODQsIDEyTUh6PTAgIgogCQkiKGRlZmF1bHQ9MCkiKTsKKyNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmlmID0gTERSVjsKIG1vZHVsZV9wYXJhbSh2aWYsIHVzaG9ydCwgMDY0NCk7CkBAIC0xMDYsMTEgKzEwOCwyMiBAQAogCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCB2YWwsIGRldmFkZF9yZWcpOwogfQogCi1zdGF0aWMgaW50IGVuYWJsZV9jb250cm9sbGVyKHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcpCitzdGF0aWMgaW50IHI4YTY2NTk3X2Nsb2NrX2VuYWJsZShzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3KQogewogCXUxNiB0bXA7CiAJaW50IGkgPSAwOwogCisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCisJZG8geworCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgU0NLRSwgU1lTQ0ZHMCk7CisJCXRtcCA9IHI4YTY2NTk3X3JlYWQocjhhNjY1OTcsIFNZU0NGRzApOworCQlpZiAoaSsrID4gMTAwMCkgeworCQkJZXJyKCJyZWdpc3RlciBhY2Nlc3MgZmFpbC4iKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwl9IHdoaWxlICgodG1wICYgU0NLRSkgIT0gU0NLRSk7CisJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIDB4MDQsIDB4MDIpOworI2Vsc2UKIAlkbyB7CiAJCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCBVU0JFLCBTWVNDRkcwKTsKIAkJdG1wID0gcjhhNjY1OTdfcmVhZChyOGE2NjU5NywgU1lTQ0ZHMCk7CkBAIC0xMzIsMTMgKzE0NSw2MyBAQAogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQogCX0gd2hpbGUgKCh0bXAgJiBTQ0tFKSAhPSBTQ0tFKTsKKyNlbmRpZgkvKiAjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpICovCiAKLQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBEQ0ZNIHwgRFJQRCwgU1lTQ0ZHMCk7Ci0JcjhhNjY1OTdfYnNldChyOGE2NjU5NywgRFJQRCwgU1lTQ0ZHMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHI4YTY2NTk3X2Nsb2NrX2Rpc2FibGUoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NykKK3sKKwlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBTQ0tFLCBTWVNDRkcwKTsKKwl1ZGVsYXkoMSk7CisjaWYgIWRlZmluZWQoQ09ORklHX1NVUEVSSF9PTl9DSElQX1I4QTY2NTk3KQorCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFBMTEMsIFNZU0NGRzApOworCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFhDS0UsIFNZU0NGRzApOworCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFVTQkUsIFNZU0NGRzApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHI4YTY2NTk3X2VuYWJsZV9wb3J0KHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsIGludCBwb3J0KQoreworCXUxNiB2YWw7CisKKwl2YWwgPSBwb3J0ID8gRFJQRCA6IERDRk0gfCBEUlBEOworCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIHZhbCwgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOworCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEhTRSwgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOworCisJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIEJVUlNUIHwgQ1BVX0FEUl9SRF9XUiwgZ2V0X2RtYWNmZ19yZWcocG9ydCkpOworCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIERUQ0hFLCBnZXRfaW50ZW5iX3JlZyhwb3J0KSk7CisJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgQVRUQ0hFLCBnZXRfaW50ZW5iX3JlZyhwb3J0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHI4YTY2NTk3X2Rpc2FibGVfcG9ydChzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBpbnQgcG9ydCkKK3sKKwl1MTYgdmFsLCB0bXA7CisKKwlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgMCwgZ2V0X2ludGVuYl9yZWcocG9ydCkpOworCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCAwLCBnZXRfaW50c3RzX3JlZyhwb3J0KSk7CisKKwlyOGE2NjU5N19wb3J0X3Bvd2VyKHI4YTY2NTk3LCBwb3J0LCAwKTsKKworCWRvIHsKKwkJdG1wID0gcjhhNjY1OTdfcmVhZChyOGE2NjU5NywgU09GQ0ZHKSAmIEVER0VTVFM7CisJCXVkZWxheSg2NDApOworCX0gd2hpbGUgKHRtcCA9PSBFREdFU1RTKTsKKworCXZhbCA9IHBvcnQgPyBEUlBEIDogRENGTSB8IERSUEQ7CisJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgdmFsLCBnZXRfc3lzY2ZnX3JlZyhwb3J0KSk7CisJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgSFNFLCBnZXRfc3lzY2ZnX3JlZyhwb3J0KSk7Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX2NvbnRyb2xsZXIoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NykKK3sKKwlpbnQgcmV0LCBwb3J0OworCisJcmV0ID0gcjhhNjY1OTdfY2xvY2tfZW5hYmxlKHI4YTY2NTk3KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIHZpZiAmIExEUlYsIFBJTkNGRyk7Ci0JcjhhNjY1OTdfYnNldChyOGE2NjU5NywgSFNFLCBTWVNDRkcwKTsKLQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBIU0UsIFNZU0NGRzEpOwogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIFVTQkUsIFNZU0NGRzApOwogCiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgQkVNUEUgfCBOUkRZRSB8IEJSRFlFLCBJTlRFTkIwKTsKQEAgLTE0Niw1MyArMjA5LDMwIEBACiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgQlJEWTAsIEJSRFlFTkIpOwogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEJFTVAwLCBCRU1QRU5CKTsKIAotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCBCVVJTVCB8IENQVV9BRFJfUkRfV1IsIERNQTBDRkcpOwotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCBCVVJTVCB8IENQVV9BRFJfUkRfV1IsIERNQTFDRkcpOwotCiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgZW5kaWFuICYgQklHRU5ELCBDRklGT1NFTCk7CiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgZW5kaWFuICYgQklHRU5ELCBEMEZJRk9TRUwpOwogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIGVuZGlhbiAmIEJJR0VORCwgRDFGSUZPU0VMKTsKLQogCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIFRSTkVOU0VMLCBTT0ZDRkcpOwogCiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgU0lHTkUgfCBTQUNLRSwgSU5URU5CMSk7Ci0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgRFRDSEUsIElOVEVOQjEpOwotCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEFUVENIRSwgSU5URU5CMSk7Ci0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgRFRDSEUsIElOVEVOQjIpOwotCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEFUVENIRSwgSU5URU5CMik7CisKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgUjhBNjY1OTdfTUFYX1JPT1RfSFVCOyBwb3J0KyspCisJCXI4YTY2NTk3X2VuYWJsZV9wb3J0KHI4YTY2NTk3LCBwb3J0KTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbnRyb2xsZXIoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NykKIHsKLQl1MTYgdG1wOworCWludCBwb3J0OwogCiAJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIDAsIElOVEVOQjApOwotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCAwLCBJTlRFTkIxKTsKLQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgMCwgSU5URU5CMik7CiAJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIDAsIElOVFNUUzApOwotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCAwLCBJTlRTVFMxKTsKLQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgMCwgSU5UU1RTMik7CiAKLQlyOGE2NjU5N19wb3J0X3Bvd2VyKHI4YTY2NTk3LCAwLCAwKTsKLQlyOGE2NjU5N19wb3J0X3Bvd2VyKHI4YTY2NTk3LCAxLCAwKTsKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgUjhBNjY1OTdfTUFYX1JPT1RfSFVCOyBwb3J0KyspCisJCXI4YTY2NTk3X2Rpc2FibGVfcG9ydChyOGE2NjU5NywgcG9ydCk7CiAKLQlkbyB7Ci0JCXRtcCA9IHI4YTY2NTk3X3JlYWQocjhhNjY1OTcsIFNPRkNGRykgJiBFREdFU1RTOwotCQl1ZGVsYXkoNjQwKTsKLQl9IHdoaWxlICh0bXAgPT0gRURHRVNUUyk7Ci0KLQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBEQ0ZNIHwgRFJQRCwgU1lTQ0ZHMCk7Ci0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgRFJQRCwgU1lTQ0ZHMSk7Ci0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgSFNFLCBTWVNDRkcwKTsKLQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBIU0UsIFNZU0NGRzEpOwotCi0JcjhhNjY1OTdfYmNscihyOGE2NjU5NywgU0NLRSwgU1lTQ0ZHMCk7Ci0JdWRlbGF5KDEpOwotCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFBMTEMsIFNZU0NGRzApOwotCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFhDS0UsIFNZU0NGRzApOwotCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFVTQkUsIFNZU0NGRzApOworCXI4YTY2NTk3X2Nsb2NrX2Rpc2FibGUocjhhNjY1OTcpOwogfQogCiBzdGF0aWMgaW50IGdldF9wYXJlbnRfcjhhNjY1OTdfYWRkcmVzcyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LApAQCAtNTc3LDEzICs2MTcsOSBAQAogCQkgICAgICAgUElQRUJVRik7CiAJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIG1ha2VfZGV2c2VsKGluZm8tPmFkZHJlc3MpIHwgaW5mby0+bWF4cGFja2V0LAogCQkgICAgICAgUElQRU1BWFApOwotCWlmIChpbmZvLT5pbnRlcnZhbCkKLQkJaW5mby0+aW50ZXJ2YWwtLTsKIAlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgaW5mby0+aW50ZXJ2YWwsIFBJUEVQRVJJKTsKIH0KIAotCi0KIC8qIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHQgZGlzYWJsZWQgKi8KIHN0YXRpYyB2b2lkIHBpcGVfc2V0dGluZyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBzdHJ1Y3QgcjhhNjY1OTdfdGQgKnRkKQogewpAQCAtNzE1LDYgKzc1MSw3IEBACiAJCQkJICAgICBzdHJ1Y3QgcjhhNjY1OTdfcGlwZSAqcGlwZSwKIAkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYikKIHsKKyNpZiAhZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCiAJaW50IGk7CiAJc3RydWN0IHI4YTY2NTk3X3BpcGVfaW5mbyAqaW5mbyA9ICZwaXBlLT5pbmZvOwogCkBAIC03NDIsNiArNzc5LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorI2VuZGlmCS8qICNpZiBkZWZpbmVkKENPTkZJR19TVVBFUkhfT05fQ0hJUF9SOEE2NjU5NykgKi8KIH0KIAogLyogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdCBkaXNhYmxlZCAqLwpAQCAtODI1LDYgKzg2MywyNSBAQAogCWRldi0+ZG1hX21hcCA9IDA7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF90aW1lcl9pbnRlcnZhbChzdHJ1Y3QgdXJiICp1cmIsIF9fdTggaW50ZXJ2YWwpCit7CisJX191OCBpOworCXVuc2lnbmVkIGxvbmcgdGltZSA9IDE7CisKKwlpZiAodXNiX3BpcGVpc29jKHVyYi0+cGlwZSkpCisJCXJldHVybiAwOworCisJaWYgKGdldF9yOGE2NjU5N191c2Jfc3BlZWQodXJiLT5kZXYtPnNwZWVkKSA9PSBIU01PREUpIHsKKwkJZm9yIChpID0gMDsgaSA8IChpbnRlcnZhbCAtIDEpOyBpKyspCisJCQl0aW1lICo9IDI7CisJCXRpbWUgPSB0aW1lICogMTI1IC8gMTAwMDsJLyogdVNPRiAtPiBtc2VjICovCisJfSBlbHNlIHsKKwkJdGltZSA9IGludGVydmFsOworCX0KKworCXJldHVybiB0aW1lOworfQorCiAvKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0IGRpc2FibGVkICovCiBzdGF0aWMgdm9pZCBpbml0X3BpcGVfaW5mbyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBzdHJ1Y3QgdXJiICp1cmIsCiAJCQkgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcCwKQEAgLTg0MCw3ICs4OTcsMTYgQEAKIAkJCQkgICAgICAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKTsKIAlpbmZvLmJ1Zm51bSA9IGdldF9idWZudW0oaW5mby5waXBlbnVtKTsKIAlpbmZvLmJ1Zl9ic2l6ZSA9IGdldF9idWZfYnNpemUoaW5mby5waXBlbnVtKTsKLQlpbmZvLmludGVydmFsID0gZXAtPmJJbnRlcnZhbDsKKwlpZiAoaW5mby50eXBlID09IFI4QTY2NTk3X0JVTEspIHsKKwkJaW5mby5pbnRlcnZhbCA9IDA7CisJCWluZm8udGltZXJfaW50ZXJ2YWwgPSAwOworCX0gZWxzZSB7CisJCWlmIChlcC0+YkludGVydmFsID4gSUlUVikKKwkJCWluZm8uaW50ZXJ2YWwgPSBJSVRWOworCQllbHNlCisJCQlpbmZvLmludGVydmFsID0gZXAtPmJJbnRlcnZhbCA/IGVwLT5iSW50ZXJ2YWwgLSAxIDogMDsKKwkJaW5mby50aW1lcl9pbnRlcnZhbCA9IGdldF90aW1lcl9pbnRlcnZhbCh1cmIsIGVwLT5iSW50ZXJ2YWwpOworCX0KIAlpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCiAJCWluZm8uZGlyX2luID0gMTsKIAllbHNlCkBAIC04NzYsMTAgKzk0MiwxOSBAQAogfQogCiAvKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0IGRpc2FibGVkICovCi1zdGF0aWMgdm9pZCByOGE2NjU5N191c2JfcHJlY29ubmVjdChzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBpbnQgcG9ydCkKK3N0YXRpYyB2b2lkIHI4YTY2NTk3X2NoZWNrX3N5c3N0cyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LCBpbnQgcG9ydCwKKwkJCQkJdTE2IHN5c3N0cykKIHsKLQlyOGE2NjU5Ny0+cm9vdF9odWJbcG9ydF0ucG9ydCB8PSAoMSA8PCBVU0JfUE9SVF9GRUFUX0NPTk5FQ1RJT04pCi0JCQkJCSB8ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OKTsKKwlpZiAoc3lzc3RzID09IFNFMCkgeworCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBBVFRDSEUsIGdldF9pbnRlbmJfcmVnKHBvcnQpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzeXNzdHMgPT0gRlNfSlNUUykKKwkJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgSFNFLCBnZXRfc3lzY2ZnX3JlZyhwb3J0KSk7CisJZWxzZSBpZiAoc3lzc3RzID09IExTX0pTVFMpCisJCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIEhTRSwgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOworCiAJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsIH5EVENILCBnZXRfaW50c3RzX3JlZyhwb3J0KSk7CiAJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgRFRDSEUsIGdldF9pbnRlbmJfcmVnKHBvcnQpKTsKIH0KQEAgLTk2MCw5ICsxMDM1LDkgQEAKIAkJCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgVFJDTFIsCiAJCQkJCQl0ZC0+cGlwZS0+cGlwZXRyZSk7CiAJCQkJcjhhNjY1OTdfd3JpdGUocjhhNjY1OTcsCi0JCQkJCQkodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoCi0JCQkJCQkrIHRkLT5tYXhwYWNrZXQgLSAxKQotCQkJCQkJLyB0ZC0+bWF4cGFja2V0LAorCQkJCQkJRElWX1JPVU5EX1VQCisJCQkJCQkgICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJCQkgICB0ZC0+bWF4cGFja2V0KSwKIAkJCQkJCXRkLT5waXBlLT5waXBldHJuKTsKIAkJCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBUUkVOQiwKIAkJCQkJCXRkLT5waXBlLT5waXBldHJlKTsKQEAgLTEwMjEsOCArMTA5Niw3IEBACiAJCXI4YTY2NTk3X21kZnkocjhhNjY1OTcsIElTRUwsIElTRUwgfCBDVVJQSVBFLCBDRklGT1NFTCk7CiAJCXI4YTY2NTk3X3JlZ193YWl0KHI4YTY2NTk3LCBDRklGT1NFTCwgQ1VSUElQRSwgMCk7CiAJCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCB+QkVNUDAsIEJFTVBTVFMpOwotCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgQkNMUiwgQ0ZJRk9DVFIpOwotCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgQlZBTCwgQ0ZJRk9DVFIpOworCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgQkNMUiB8IEJWQUwsIENGSUZPQ1RSKTsKIAkJZW5hYmxlX2lycV9lbXB0eShyOGE2NjU5NywgMCk7CiAJfSBlbHNlIHsKIAkJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgUjhBNjY1OTdfRElSLCBEQ1BDRkcpOwpAQCAtMTQ1NCwxMyArMTUyOCwyMSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgcjhhNjY1OTdfcm9vdF9odWJfc3RhcnRfcG9sbGluZyhzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3KQoreworCW1vZF90aW1lcigmcjhhNjY1OTctPnJoX3RpbWVyLAorCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUjhBNjY1OTdfUkhfUE9MTF9USU1FKSk7Cit9CisKIHN0YXRpYyB2b2lkIHN0YXJ0X3Jvb3RfaHViX3NhbXBsaW5nKHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsIGludCBwb3J0KQogewogCXN0cnVjdCByOGE2NjU5N19yb290X2h1YiAqcmggPSAmcjhhNjY1OTctPnJvb3RfaHViW3BvcnRdOwogCiAJcmgtPm9sZF9zeXNzdHMgPSByOGE2NjU5N19yZWFkKHI4YTY2NTk3LCBnZXRfc3lzc3RzX3JlZyhwb3J0KSkgJiBMTlNUOwogCXJoLT5zY291bnQgPSBSOEE2NjU5N19NQVhfU0FNUExJTkc7Ci0JbW9kX3RpbWVyKCZyOGE2NjU5Ny0+cmhfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7CisJcjhhNjY1OTctPnJvb3RfaHViW3BvcnRdLnBvcnQgfD0gKDEgPDwgVVNCX1BPUlRfRkVBVF9DT05ORUNUSU9OKQorCQkJCQkgfCAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7CisJcjhhNjY1OTdfcm9vdF9odWJfc3RhcnRfcG9sbGluZyhyOGE2NjU5Nyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCByOGE2NjU5N19pcnEoc3RydWN0IHVzYl9oY2QgKmhjZCkKQEAgLTE1NDcsNDEgKzE2MjksNTUgQEAKIAkJaWYgKCh0bXAgJiBVU0JSU1QpID09IFVTQlJTVCkgewogCQkJcjhhNjY1OTdfbWRmeShyOGE2NjU5NywgVUFDVCwgVVNCUlNUIHwgVUFDVCwKIAkJCQkgICAgICBkdnN0Y3RyX3JlZyk7Ci0JCQltb2RfdGltZXIoJnI4YTY2NTk3LT5yaF90aW1lciwKLQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7CisJCQlyOGE2NjU5N19yb290X2h1Yl9zdGFydF9wb2xsaW5nKHI4YTY2NTk3KTsKIAkJfSBlbHNlCiAJCQlyOGE2NjU5N191c2JfY29ubmVjdChyOGE2NjU5NywgcG9ydCk7CiAJfQogCisJaWYgKCEocmgtPnBvcnQgJiAoMSA8PCBVU0JfUE9SVF9GRUFUX0NPTk5FQ1RJT04pKSkgeworCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgfkFUVENILCBnZXRfaW50c3RzX3JlZyhwb3J0KSk7CisJCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEFUVENIRSwgZ2V0X2ludGVuYl9yZWcocG9ydCkpOworCX0KKwogCWlmIChyaC0+c2NvdW50ID4gMCkgewogCQl0bXAgPSByOGE2NjU5N19yZWFkKHI4YTY2NTk3LCBnZXRfc3lzc3RzX3JlZyhwb3J0KSkgJiBMTlNUOwogCQlpZiAodG1wID09IHJoLT5vbGRfc3lzc3RzKSB7CiAJCQlyaC0+c2NvdW50LS07Ci0JCQlpZiAocmgtPnNjb3VudCA9PSAwKSB7Ci0JCQkJaWYgKHRtcCA9PSBGU19KU1RTKSB7Ci0JCQkJCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEhTRSwKLQkJCQkJCSAgICAgIGdldF9zeXNjZmdfcmVnKHBvcnQpKTsKLQkJCQkJcjhhNjY1OTdfdXNiX3ByZWNvbm5lY3QocjhhNjY1OTcsIHBvcnQpOwotCQkJCX0gZWxzZSBpZiAodG1wID09IExTX0pTVFMpIHsKLQkJCQkJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgSFNFLAotCQkJCQkJICAgICAgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOwotCQkJCQlyOGE2NjU5N191c2JfcHJlY29ubmVjdChyOGE2NjU5NywgcG9ydCk7Ci0JCQkJfSBlbHNlIGlmICh0bXAgPT0gU0UwKQotCQkJCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBBVFRDSEUsCi0JCQkJCQkgICAgICBnZXRfaW50ZW5iX3JlZyhwb3J0KSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZF90aW1lcigmcjhhNjY1OTctPnJoX3RpbWVyLAotCQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7Ci0JCQl9CisJCQlpZiAocmgtPnNjb3VudCA9PSAwKQorCQkJCXI4YTY2NTk3X2NoZWNrX3N5c3N0cyhyOGE2NjU5NywgcG9ydCwgdG1wKTsKKwkJCWVsc2UKKwkJCQlyOGE2NjU5N19yb290X2h1Yl9zdGFydF9wb2xsaW5nKHI4YTY2NTk3KTsKIAkJfSBlbHNlIHsKIAkJCXJoLT5zY291bnQgPSBSOEE2NjU5N19NQVhfU0FNUExJTkc7CiAJCQlyaC0+b2xkX3N5c3N0cyA9IHRtcDsKLQkJCW1vZF90aW1lcigmcjhhNjY1OTctPnJoX3RpbWVyLAotCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTApKTsKKwkJCXI4YTY2NTk3X3Jvb3RfaHViX3N0YXJ0X3BvbGxpbmcocjhhNjY1OTcpOwogCQl9CiAJfQogfQogCitzdGF0aWMgdm9pZCByOGE2NjU5N19pbnRlcnZhbF90aW1lcih1bnNpZ25lZCBsb25nIF9yOGE2NjU5NykKK3sKKwlzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3ID0gKHN0cnVjdCByOGE2NjU5NyAqKV9yOGE2NjU5NzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBwaXBlbnVtOworCXN0cnVjdCByOGE2NjU5N190ZCAqdGQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcjhhNjY1OTctPmxvY2ssIGZsYWdzKTsKKworCWZvciAocGlwZW51bSA9IDA7IHBpcGVudW0gPCBSOEE2NjU5N19NQVhfTlVNX1BJUEU7IHBpcGVudW0rKykgeworCQlpZiAoIShyOGE2NjU5Ny0+aW50ZXJ2YWxfbWFwICYgKDEgPDwgcGlwZW51bSkpKQorCQkJY29udGludWU7CisJCWlmICh0aW1lcl9wZW5kaW5nKCZyOGE2NjU5Ny0+aW50ZXJ2YWxfdGltZXJbcGlwZW51bV0pKQorCQkJY29udGludWU7CisKKwkJdGQgPSByOGE2NjU5N19nZXRfdGQocjhhNjY1OTcsIHBpcGVudW0pOworCQlpZiAodGQpCisJCQlzdGFydF90cmFuc2ZlcihyOGE2NjU5NywgdGQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnI4YTY2NTk3LT5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIHI4YTY2NTk3X3RkX3RpbWVyKHVuc2lnbmVkIGxvbmcgX3I4YTY2NTk3KQogewogCXN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcgPSAoc3RydWN0IHI4YTY2NTk3ICopX3I4YTY2NTk3OwpAQCAtMTc2MywxMCArMTg1OSwxNyBAQAogCXVyYi0+aGNwcml2ID0gdGQ7CiAKIAlpZiAocmVxdWVzdCkgewotCQlyZXQgPSBzdGFydF90cmFuc2ZlcihyOGE2NjU5NywgdGQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJbGlzdF9kZWwoJnRkLT5xdWV1ZSk7Ci0JCQlrZnJlZSh0ZCk7CisJCWlmICh0ZC0+cGlwZS0+aW5mby50aW1lcl9pbnRlcnZhbCkgeworCQkJcjhhNjY1OTctPmludGVydmFsX21hcCB8PSAxIDw8IHRkLT5waXBlbnVtOworCQkJbW9kX3RpbWVyKCZyOGE2NjU5Ny0+aW50ZXJ2YWxfdGltZXJbdGQtPnBpcGVudW1dLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoCisJCQkJCXRkLT5waXBlLT5pbmZvLnRpbWVyX2ludGVydmFsKSk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBzdGFydF90cmFuc2ZlcihyOGE2NjU5NywgdGQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlsaXN0X2RlbCgmdGQtPnF1ZXVlKTsKKwkJCQlrZnJlZSh0ZCk7CisJCQl9CiAJCX0KIAl9IGVsc2UKIAkJc2V0X3RkX3RpbWVyKHI4YTY2NTk3LCB0ZCk7CkBAIC0yMTA3LDEzICsyMjEwLDExIEBACiAjaWYgZGVmaW5lZChDT05GSUdfUE0pCiBzdGF0aWMgaW50IHI4YTY2NTk3X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHI4YTY2NTk3X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJcmV0dXJuIDA7CiB9CiAjZWxzZQkvKiBpZiBkZWZpbmVkKENPTkZJR19QTSkgKi8KQEAgLTIxOTQsNiArMjI5NSw5IEBACiAJCWluaXRfdGltZXIoJnI4YTY2NTk3LT50ZF90aW1lcltpXSk7CiAJCXI4YTY2NTk3LT50ZF90aW1lcltpXS5mdW5jdGlvbiA9IHI4YTY2NTk3X3RkX3RpbWVyOwogCQlyOGE2NjU5Ny0+dGRfdGltZXJbaV0uZGF0YSA9ICh1bnNpZ25lZCBsb25nKXI4YTY2NTk3OworCQlzZXR1cF90aW1lcigmcjhhNjY1OTctPmludGVydmFsX3RpbWVyW2ldLAorCQkJCXI4YTY2NTk3X2ludGVydmFsX3RpbWVyLAorCQkJCSh1bnNpZ25lZCBsb25nKXI4YTY2NTk3KTsKIAl9CiAJSU5JVF9MSVNUX0hFQUQoJnI4YTY2NTk3LT5jaGlsZF9kZXZpY2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LmggYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LmgKaW5kZXggNTczODgyNS4uODRlZTAxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTcuaApAQCAtMTg3LDcgKzE4NywxMSBAQAogI2RlZmluZQlSRVcJCTB4NDAwMAkvKiBiMTQ6IEJ1ZmZlciByZXdpbmQgKi8KICNkZWZpbmUJRENMUk0JCTB4MjAwMAkvKiBiMTM6IERNQSBidWZmZXIgY2xlYXIgbW9kZSAqLwogI2RlZmluZQlEUkVRRQkJMHgxMDAwCS8qIGIxMjogRFJFUSBvdXRwdXQgZW5hYmxlICovCisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCisjZGVmaW5lCU1CVwkJMHgwODAwCisjZWxzZQogI2RlZmluZQlNQlcJCTB4MDQwMAkvKiBiMTA6IE1heGltdW0gYml0IHdpZHRoIGZvciBGSUZPIGFjY2VzcyAqLworI2VuZGlmCiAjZGVmaW5lCSAgTUJXXzgJCSAweDAwMDAJICAvKiAgOGJpdCAqLwogI2RlZmluZQkgIE1CV18xNgkgMHgwNDAwCSAgLyogMTZiaXQgKi8KICNkZWZpbmUJQklHRU5ECQkweDAxMDAJLyogYjg6IEJpZyBlbmRpYW4gbW9kZSAqLwpAQCAtMzk1LDggKzM5OSwxMyBAQAogI2RlZmluZSBSOEE2NjU5N19NQVhfTlVNX1BJUEUJCTEwCiAjZGVmaW5lIFI4QTY2NTk3X0JVRl9CU0laRQkJOAogI2RlZmluZSBSOEE2NjU5N19NQVhfREVWSUNFCQkxMAorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSSF9PTl9DSElQX1I4QTY2NTk3KQorI2RlZmluZSBSOEE2NjU5N19NQVhfUk9PVF9IVUIJCTEKKyNlbHNlCiAjZGVmaW5lIFI4QTY2NTk3X01BWF9ST09UX0hVQgkJMgotI2RlZmluZSBSOEE2NjU5N19NQVhfU0FNUExJTkcJCTEwCisjZW5kaWYKKyNkZWZpbmUgUjhBNjY1OTdfTUFYX1NBTVBMSU5HCQk1CisjZGVmaW5lIFI4QTY2NTk3X1JIX1BPTExfVElNRQkJMTAKICNkZWZpbmUgUjhBNjY1OTdfTUFYX0RNQV9DSEFOTkVMCTIKICNkZWZpbmUgUjhBNjY1OTdfUElQRV9OT19ETUEJCVI4QTY2NTk3X01BWF9ETUFfQ0hBTk5FTAogI2RlZmluZSBjaGVja19idWxrX29yX2lzb2MocGlwZW51bSkJKChwaXBlbnVtID49IDEgJiYgcGlwZW51bSA8PSA1KSkKQEAgLTQwNCw2ICs0MTMsNyBAQAogI2RlZmluZSBtYWtlX2RldnNlbChhZGRyKQkJKGFkZHIgPDwgMTIpCiAKIHN0cnVjdCByOGE2NjU5N19waXBlX2luZm8geworCXVuc2lnbmVkIGxvbmcgdGltZXJfaW50ZXJ2YWw7CiAJdTE2IHBpcGVudW07CiAJdTE2IGFkZHJlc3M7CS8qIFI4QTY2NTk3IEhDRCB1c2IgYWRkcmVzcyAqLwogCXUxNiBlcG51bTsKQEAgLTQ3OCw5ICs0ODgsMTEgQEAKIAogCXN0cnVjdCB0aW1lcl9saXN0IHJoX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IHRkX3RpbWVyW1I4QTY2NTk3X01BWF9OVU1fUElQRV07CisJc3RydWN0IHRpbWVyX2xpc3QgaW50ZXJ2YWxfdGltZXJbUjhBNjY1OTdfTUFYX05VTV9QSVBFXTsKIAogCXVuc2lnbmVkIHNob3J0IGFkZHJlc3NfbWFwOwogCXVuc2lnbmVkIHNob3J0IHRpbWVvdXRfbWFwOworCXVuc2lnbmVkIHNob3J0IGludGVydmFsX21hcDsKIAl1bnNpZ25lZCBjaGFyIHBpcGVfY250W1I4QTY2NTk3X01BWF9OVU1fUElQRV07CiAJdW5zaWduZWQgY2hhciBkbWFfbWFwOwogCkBAIC01MjYsOCArNTM4LDIxIEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHUxNiAqYnVmLAogCQkJCSAgICAgIGludCBsZW4pCiB7CisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCisJdW5zaWduZWQgbG9uZyBmaWZvYWRkciA9IHI4YTY2NTk3LT5yZWcgKyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKworCWNvdW50ID0gbGVuIC8gNDsKKwlpbnNsKGZpZm9hZGRyLCBidWYsIGNvdW50KTsKKworCWlmIChsZW4gJiAweDAwMDAwMDAzKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wID0gaW5sKGZpZm9hZGRyKTsKKwkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopYnVmICsgY291bnQgKiA0LCAmdG1wLCBsZW4gJiAweDAzKTsKKwl9CisjZWxzZQogCWxlbiA9IChsZW4gKyAxKSAvIDI7CiAJaW5zdyhyOGE2NjU5Ny0+cmVnICsgb2Zmc2V0LCBidWYsIGxlbik7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHI4YTY2NTk3X3dyaXRlKHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsIHUxNiB2YWwsCkBAIC01NDEsNiArNTY2LDI0IEBACiAJCQkJICAgICAgIGludCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBmaWZvYWRkciA9IHI4YTY2NTk3LT5yZWcgKyBvZmZzZXQ7CisjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpCisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpwYjsKKwlpbnQgaTsKKworCWNvdW50ID0gbGVuIC8gNDsKKwlvdXRzbChmaWZvYWRkciwgYnVmLCBjb3VudCk7CisKKwlpZiAobGVuICYgMHgwMDAwMDAwMykgeworCQlwYiA9ICh1bnNpZ25lZCBjaGFyICopYnVmICsgY291bnQgKiA0OworCQlmb3IgKGkgPSAwOyBpIDwgKGxlbiAmIDB4MDAwMDAwMDMpOyBpKyspIHsKKwkJCWlmIChyOGE2NjU5N19yZWFkKHI4YTY2NTk3LCBDRklGT1NFTCkgJiBCSUdFTkQpCisJCQkJb3V0YihwYltpXSwgZmlmb2FkZHIgKyBpKTsKKwkJCWVsc2UKKwkJCQlvdXRiKHBiW2ldLCBmaWZvYWRkciArIDMgLSBpKTsKKwkJfQorCX0KKyNlbHNlCiAJaW50IG9kZCA9IGxlbiAmIDB4MDAwMTsKIAogCWxlbiA9IGxlbiAvIDI7CkBAIC01NDksNiArNTkyLDcgQEAKIAkJYnVmID0gJmJ1ZltsZW5dOwogCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSpidWYsIGZpZm9hZGRyKTsKIAl9CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHI4YTY2NTk3X21kZnkoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NywKQEAgLTU4MSw2ICs2MjUsMTEgQEAKIAlyZXR1cm4gcG9ydCA9PSAwID8gRFZTVENUUjAgOiBEVlNUQ1RSMTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9kbWFjZmdfcmVnKGludCBwb3J0KQoreworCXJldHVybiBwb3J0ID09IDAgPyBETUEwQ0ZHIDogRE1BMUNGRzsKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9pbnRlbmJfcmVnKGludCBwb3J0KQogewogCXJldHVybiBwb3J0ID09IDAgPyBJTlRFTkIxIDogSU5URU5CMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCmluZGV4IDYyOWJjYTAuLjI3NDI3NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYwpAQCAtOTQsMTIgKzk0LDEwIEBACiAKIAkJc2w4MTEtPnBvcnQxID0gKDEgPDwgVVNCX1BPUlRfRkVBVF9QT1dFUik7CiAJCXNsODExLT5pcnFfZW5hYmxlID0gU0wxMUhfSU5UTUFTS19JTlNSTVY7Ci0JCWhjZC0+c2VsZi5jb250cm9sbGVyLT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJfSBlbHNlIHsKIAkJc2w4MTEtPnBvcnQxID0gMDsKIAkJc2w4MTEtPmlycV9lbmFibGUgPSAwOwogCQloY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKLQkJaGNkLT5zZWxmLmNvbnRyb2xsZXItPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCX0KIAlzbDgxMS0+Y3RybDEgPSAwOwogCXNsODExX3dyaXRlKHNsODExLCBTTDExSF9JUlFfRU5BQkxFLCAwKTsKQEAgLTEzMzcsNyArMTMzNSw3IEBACiBzbDgxMWhfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAkvLyBTT0ZzIG9mZgotCURCRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHKCIlc1xuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC0xMzQ1LDcgKzEzNDMsNyBAQAogc2w4MTFoX2J1c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAkvLyBTT0ZzIG9uCi0JREJHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NzIsOCArMTc3MCw2IEBACiAJCXBvcnRfcG93ZXIoc2w4MTEsIDApOwogCQlicmVhazsKIAl9Ci0JaWYgKHJldHZhbCA9PSAwKQotCQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE3ODYsMTUgKzE3ODIsMTMgQEAKIAkvKiB3aXRoIG5vICJjaGVjayB0byBzZWUgaWYgVkJVUyBpcyBzdGlsbCBwb3dlcmVkIiBib2FyZCBob29rLAogCSAqIGxldCdzIGFzc3VtZSBpdCdkIG9ubHkgYmUgcG93ZXJlZCB0byBlbmFibGUgcmVtb3RlIHdha2V1cC4KIAkgKi8KLQlpZiAoZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORAotCQkJfHwgIWRldmljZV9jYW5fd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpIHsKKwlpZiAoIXNsODExLT5wb3J0MSB8fCAhZGV2aWNlX2Nhbl93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkgewogCQlzbDgxMS0+cG9ydDEgPSAwOwogCQlwb3J0X3Bvd2VyKHNsODExLCAxKTsKIAkJdXNiX3Jvb3RfaHViX2xvc3RfcG93ZXIoaGNkLT5zZWxmLnJvb3RfaHViKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCXJldHVybiBzbDgxMWhfYnVzX3Jlc3VtZShoY2QpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMKaW5kZXggOGUxMTdhNy4uZjI5MzA3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91MTMyLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdTEzMi1oY2QuYwpAQCAtNjcsNyArNjcsNyBAQAogI2luY2x1ZGUgIm9oY2kuaCIKICNkZWZpbmUgT0hDSV9DT05UUk9MX0lOSVQgT0hDSV9DVFJMX0NCU1IKICNkZWZpbmUgT0hDSV9JTlRSX0lOSVQgKE9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfUkQgfCBcCi0gICAgICAgIE9IQ0lfSU5UUl9XREgpCisJT0hDSV9JTlRSX1dESCkKIE1PRFVMRV9BVVRIT1IoIlRvbnkgT2xlY2ggLSBFbGFuIERpZ2l0YWwgU3lzdGVtcyBMaW1pdGVkIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlUxMzIgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTc3LDE1ICs3NywxNSBAQAogc3RhdGljIGludCBkaXN0cnVzdF9maXJtd2FyZSA9IDE7CiBtb2R1bGVfcGFyYW0oZGlzdHJ1c3RfZmlybXdhcmUsIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkaXN0cnVzdF9maXJtd2FyZSwgInRydWUgdG8gZGlzdHJ1c3QgZmlybXdhcmUgcG93ZXIvb3ZlcmN1cnJlbiIKLSAgICAgICAgInQgc2V0dXAiKTsKKwkidCBzZXR1cCIpOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHUxMzJfaGNkX3dhaXQpOwogLyoKICogdTEzMl9tb2R1bGVfbG9jayBleGlzdHMgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gZ2xvYmFsIHZhcmlhYmxlcwogKgogKi8KIHN0YXRpYyBzdHJ1Y3QgbXV0ZXggdTEzMl9tb2R1bGVfbG9jazsKLXN0YXRpYyBpbnQgdTEzMl9leGl0aW5nID0gMDsKLXN0YXRpYyBpbnQgdTEzMl9pbnN0YW5jZXMgPSAwOworc3RhdGljIGludCB1MTMyX2V4aXRpbmc7CitzdGF0aWMgaW50IHUxMzJfaW5zdGFuY2VzOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdTEzMl9zdGF0aWNfbGlzdDsKIC8qCiAqIGVuZCBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBwcm90ZWN0ZWQgYnkgdTEzMl9tb2R1bGVfbG9jawpAQCAtOTcsMTE1ICs5NywxMTUgQEAKICNkZWZpbmUgTUFYX1UxMzJfRU5EUFMgMTAwCiAjZGVmaW5lIE1BWF9VMTMyX1JJTkdTIDQKIHN0YXRpYyBjb25zdCBjaGFyICpjY190b190ZXh0WzE2XSA9IHsKLSAgICAgICAgIk5vIEVycm9yICIsCi0gICAgICAgICJDUkMgRXJyb3IgIiwKLSAgICAgICAgIkJpdCBTdHVmZiAiLAotICAgICAgICAiRGF0YSBUb2dnICIsCi0gICAgICAgICJTdGFsbCAiLAotICAgICAgICAiRGV2Tm90UmVzcCAiLAotICAgICAgICAiUElEQ2hlY2sgIiwKLSAgICAgICAgIlVuRXhwUElEICIsCi0gICAgICAgICJEYXRhT3ZlciAiLAotICAgICAgICAiRGF0YVVuZGVyICIsCi0gICAgICAgICIoZm9yIGh3KSAiLAotICAgICAgICAiKGZvciBodykgIiwKLSAgICAgICAgIkJ1ZmZlck92ZXIgIiwKLSAgICAgICAgIkJ1ZmZVbmRlciAiLAotICAgICAgICAiKGZvciBIQ0QpICIsCi0gICAgICAgICIoZm9yIEhDRCkgIgorCSJObyBFcnJvciAiLAorCSJDUkMgRXJyb3IgIiwKKwkiQml0IFN0dWZmICIsCisJIkRhdGEgVG9nZyAiLAorCSJTdGFsbCAiLAorCSJEZXZOb3RSZXNwICIsCisJIlBJRENoZWNrICIsCisJIlVuRXhwUElEICIsCisJIkRhdGFPdmVyICIsCisJIkRhdGFVbmRlciAiLAorCSIoZm9yIGh3KSAiLAorCSIoZm9yIGh3KSAiLAorCSJCdWZmZXJPdmVyICIsCisJIkJ1ZmZVbmRlciAiLAorCSIoZm9yIEhDRCkgIiwKKwkiKGZvciBIQ0QpICIKIH07CiBzdHJ1Y3QgdTEzMl9wb3J0IHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzI7Ci0gICAgICAgIGludCByZXNldDsKLSAgICAgICAgaW50IGVuYWJsZTsKLSAgICAgICAgaW50IHBvd2VyOwotICAgICAgICBpbnQgU3RhdHVzOworCXN0cnVjdCB1MTMyICp1MTMyOworCWludCByZXNldDsKKwlpbnQgZW5hYmxlOworCWludCBwb3dlcjsKKwlpbnQgU3RhdHVzOwogfTsKIHN0cnVjdCB1MTMyX2FkZHIgewotICAgICAgICB1OCBhZGRyZXNzOworCXU4IGFkZHJlc3M7CiB9Owogc3RydWN0IHUxMzJfdWRldiB7Ci0gICAgICAgIHN0cnVjdCBrcmVmIGtyZWY7Ci0gICAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2aWNlOwotICAgICAgICB1OCBlbnVtZXJhdGlvbjsKLSAgICAgICAgdTggdWRldl9udW1iZXI7Ci0gICAgICAgIHU4IHVzYl9hZGRyOwotICAgICAgICB1OCBwb3J0bnVtYmVyOwotICAgICAgICB1OCBlbmRwX251bWJlcl9pblsxNl07Ci0gICAgICAgIHU4IGVuZHBfbnVtYmVyX291dFsxNl07CisJc3RydWN0IGtyZWYga3JlZjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldmljZTsKKwl1OCBlbnVtZXJhdGlvbjsKKwl1OCB1ZGV2X251bWJlcjsKKwl1OCB1c2JfYWRkcjsKKwl1OCBwb3J0bnVtYmVyOworCXU4IGVuZHBfbnVtYmVyX2luWzE2XTsKKwl1OCBlbmRwX251bWJlcl9vdXRbMTZdOwogfTsKICNkZWZpbmUgRU5EUF9RVUVVRV9TSElGVCAzCiAjZGVmaW5lIEVORFBfUVVFVUVfU0laRSAoMTw8RU5EUF9RVUVVRV9TSElGVCkKICNkZWZpbmUgRU5EUF9RVUVVRV9NQVNLIChFTkRQX1FVRVVFX1NJWkUtMSkKIHN0cnVjdCB1MTMyX3VyYnEgewotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHVyYl9tb3JlOwotICAgICAgICBzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IGxpc3RfaGVhZCB1cmJfbW9yZTsKKwlzdHJ1Y3QgdXJiICp1cmI7CiB9Owogc3RydWN0IHUxMzJfc3BpbiB7Ci0gICAgICAgIHNwaW5sb2NrX3Qgc2xvY2s7CisJc3BpbmxvY2tfdCBzbG9jazsKIH07CiBzdHJ1Y3QgdTEzMl9lbmRwIHsKLSAgICAgICAgc3RydWN0IGtyZWYga3JlZjsKLSAgICAgICAgdTggdWRldl9udW1iZXI7Ci0gICAgICAgIHU4IGVuZHBfbnVtYmVyOwotICAgICAgICB1OCB1c2JfYWRkcjsKLSAgICAgICAgdTggdXNiX2VuZHA7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGVuZHBfcmluZzsKLSAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZzsKLSAgICAgICAgdW5zaWduZWQgdG9nZ2xlX2JpdHM6MjsKLSAgICAgICAgdW5zaWduZWQgYWN0aXZlOjE7Ci0gICAgICAgIHVuc2lnbmVkIGRlbGF5ZWQ6MTsKLSAgICAgICAgdW5zaWduZWQgaW5wdXQ6MTsKLSAgICAgICAgdW5zaWduZWQgb3V0cHV0OjE7Ci0gICAgICAgIHVuc2lnbmVkIHBpcGV0eXBlOjI7Ci0gICAgICAgIHVuc2lnbmVkIGRlcXVldWVpbmc6MTsKLSAgICAgICAgdW5zaWduZWQgZWRzZXRfZmx1c2g6MTsKLSAgICAgICAgdW5zaWduZWQgc3BhcmVfYml0czoxNDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBqaWZmaWVzOwotICAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcDsKLSAgICAgICAgc3RydWN0IHUxMzJfc3BpbiBxdWV1ZV9sb2NrOwotICAgICAgICB1MTYgcXVldWVfc2l6ZTsKLSAgICAgICAgdTE2IHF1ZXVlX2xhc3Q7Ci0gICAgICAgIHUxNiBxdWV1ZV9uZXh0OwotICAgICAgICBzdHJ1Y3QgdXJiICp1cmJfbGlzdFtFTkRQX1FVRVVFX1NJWkVdOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHVyYl9tb3JlOwotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNjaGVkdWxlcjsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXU4IHVkZXZfbnVtYmVyOworCXU4IGVuZHBfbnVtYmVyOworCXU4IHVzYl9hZGRyOworCXU4IHVzYl9lbmRwOworCXN0cnVjdCB1MTMyICp1MTMyOworCXN0cnVjdCBsaXN0X2hlYWQgZW5kcF9yaW5nOworCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CisJdW5zaWduZWQgdG9nZ2xlX2JpdHM6MjsKKwl1bnNpZ25lZCBhY3RpdmU6MTsKKwl1bnNpZ25lZCBkZWxheWVkOjE7CisJdW5zaWduZWQgaW5wdXQ6MTsKKwl1bnNpZ25lZCBvdXRwdXQ6MTsKKwl1bnNpZ25lZCBwaXBldHlwZToyOworCXVuc2lnbmVkIGRlcXVldWVpbmc6MTsKKwl1bnNpZ25lZCBlZHNldF9mbHVzaDoxOworCXVuc2lnbmVkIHNwYXJlX2JpdHM6MTQ7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwOworCXN0cnVjdCB1MTMyX3NwaW4gcXVldWVfbG9jazsKKwl1MTYgcXVldWVfc2l6ZTsKKwl1MTYgcXVldWVfbGFzdDsKKwl1MTYgcXVldWVfbmV4dDsKKwlzdHJ1Y3QgdXJiICp1cmJfbGlzdFtFTkRQX1FVRVVFX1NJWkVdOworCXN0cnVjdCBsaXN0X2hlYWQgdXJiX21vcmU7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzY2hlZHVsZXI7CiB9Owogc3RydWN0IHUxMzJfcmluZyB7Ci0gICAgICAgIHVuc2lnbmVkIGluX3VzZToxOwotICAgICAgICB1bnNpZ25lZCBsZW5ndGg6NzsKLSAgICAgICAgdTggbnVtYmVyOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMjsKLSAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqY3Vycl9lbmRwOwotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNjaGVkdWxlcjsKKwl1bnNpZ25lZCBpbl91c2U6MTsKKwl1bnNpZ25lZCBsZW5ndGg6NzsKKwl1OCBudW1iZXI7CisJc3RydWN0IHUxMzIgKnUxMzI7CisJc3RydWN0IHUxMzJfZW5kcCAqY3Vycl9lbmRwOworCXN0cnVjdCBkZWxheWVkX3dvcmsgc2NoZWR1bGVyOwogfTsKIHN0cnVjdCB1MTMyIHsKLSAgICAgICAgc3RydWN0IGtyZWYga3JlZjsKLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCB1MTMyX2xpc3Q7Ci0gICAgICAgIHN0cnVjdCBtdXRleCBzd19sb2NrOwotICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlIHNjaGVkdWxlcl9sb2NrOwotICAgICAgICBzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICpib2FyZDsKLSAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OwotICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nIHJpbmdbTUFYX1UxMzJfUklOR1NdOwotICAgICAgICBpbnQgc2VxdWVuY2VfbnVtOwotICAgICAgICBpbnQgZ29pbmc7Ci0gICAgICAgIGludCBwb3dlcjsKLSAgICAgICAgaW50IHJlc2V0OwotICAgICAgICBpbnQgbnVtX3BvcnRzOwotICAgICAgICB1MzIgaGNfY29udHJvbDsKLSAgICAgICAgdTMyIGhjX2ZtaW50ZXJ2YWw7Ci0gICAgICAgIHUzMiBoY19yb290aHViX3N0YXR1czsKLSAgICAgICAgdTMyIGhjX3Jvb3RodWJfYTsKLSAgICAgICAgdTMyIGhjX3Jvb3RodWJfcG9ydHN0YXR1c1tNQVhfUk9PVF9QT1JUU107Ci0gICAgICAgIGludCBmbGFnczsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBuZXh0X3N0YXRlY2hhbmdlOwotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIG1vbml0b3I7Ci0gICAgICAgIGludCBudW1fZW5kcG9pbnRzOwotICAgICAgICBzdHJ1Y3QgdTEzMl9hZGRyIGFkZHJbTUFYX1UxMzJfQUREUlNdOwotICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2IHVkZXZbTUFYX1UxMzJfVURFVlNdOwotICAgICAgICBzdHJ1Y3QgdTEzMl9wb3J0IHBvcnRbTUFYX1UxMzJfUE9SVFNdOwotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwW01BWF9VMTMyX0VORFBTXTsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXN0cnVjdCBsaXN0X2hlYWQgdTEzMl9saXN0OworCXN0cnVjdCBtdXRleCBzd19sb2NrOworCXN0cnVjdCBtdXRleCBzY2hlZHVsZXJfbG9jazsKKwlzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICpib2FyZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXY7CisJc3RydWN0IHUxMzJfcmluZyByaW5nW01BWF9VMTMyX1JJTkdTXTsKKwlpbnQgc2VxdWVuY2VfbnVtOworCWludCBnb2luZzsKKwlpbnQgcG93ZXI7CisJaW50IHJlc2V0OworCWludCBudW1fcG9ydHM7CisJdTMyIGhjX2NvbnRyb2w7CisJdTMyIGhjX2ZtaW50ZXJ2YWw7CisJdTMyIGhjX3Jvb3RodWJfc3RhdHVzOworCXUzMiBoY19yb290aHViX2E7CisJdTMyIGhjX3Jvb3RodWJfcG9ydHN0YXR1c1tNQVhfUk9PVF9QT1JUU107CisJaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbmV4dF9zdGF0ZWNoYW5nZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIG1vbml0b3I7CisJaW50IG51bV9lbmRwb2ludHM7CisJc3RydWN0IHUxMzJfYWRkciBhZGRyW01BWF9VMTMyX0FERFJTXTsKKwlzdHJ1Y3QgdTEzMl91ZGV2IHVkZXZbTUFYX1UxMzJfVURFVlNdOworCXN0cnVjdCB1MTMyX3BvcnQgcG9ydFtNQVhfVTEzMl9QT1JUU107CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcFtNQVhfVTEzMl9FTkRQU107CiB9OwogCiAvKgpAQCAtMjEzLDM0ICsyMTMsMzQgQEAKICogRG9lcyBhbnlvbmUgaGF2ZSBhIGJldHRlciB3YXk/Pz8/PwogKi8KICNkZWZpbmUgZnRkaV9yZWFkX3BjaW1lbShwZGV2LCBtZW1iZXIsIGRhdGEpIHVzYl9mdGRpX2VsYW5fcmVhZF9wY2ltZW0ocGRldiwgXAotICAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgb2hjaV9yZWdzLCBtZW1iZXIpLCAwLCBkYXRhKTsKKwlvZmZzZXRvZihzdHJ1Y3Qgb2hjaV9yZWdzLCBtZW1iZXIpLCAwLCBkYXRhKTsKICNkZWZpbmUgZnRkaV93cml0ZV9wY2ltZW0ocGRldiwgbWVtYmVyLCBkYXRhKSB1c2JfZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShwZGV2LCBcCi0gICAgICAgIG9mZnNldG9mKHN0cnVjdCBvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOworCW9mZnNldG9mKHN0cnVjdCBvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOwogI2RlZmluZSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIG1lbWJlciwgZGF0YSkgXAotICAgICAgICB1c2JfZnRkaV9lbGFuX3JlYWRfcGNpbWVtKHUxMzItPnBsYXRmb3JtX2Rldiwgb2Zmc2V0b2Yoc3RydWN0IFwKLSAgICAgICAgb2hjaV9yZWdzLCBtZW1iZXIpLCAwLCBkYXRhKTsKKwl1c2JfZnRkaV9lbGFuX3JlYWRfcGNpbWVtKHUxMzItPnBsYXRmb3JtX2Rldiwgb2Zmc2V0b2Yoc3RydWN0IFwKKwlvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOwogI2RlZmluZSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBtZW1iZXIsIGRhdGEpIFwKLSAgICAgICAgdXNiX2Z0ZGlfZWxhbl93cml0ZV9wY2ltZW0odTEzMi0+cGxhdGZvcm1fZGV2LCBvZmZzZXRvZihzdHJ1Y3QgXAotICAgICAgICBvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOworCXVzYl9mdGRpX2VsYW5fd3JpdGVfcGNpbWVtKHUxMzItPnBsYXRmb3JtX2Rldiwgb2Zmc2V0b2Yoc3RydWN0IFwKKwlvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdTEzMiAqdWRldl90b191MTMyKHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYpCiB7Ci0gICAgICAgIHU4IHVkZXZfbnVtYmVyID0gdWRldi0+dWRldl9udW1iZXI7Ci0gICAgICAgIHJldHVybiBjb250YWluZXJfb2YodWRldiwgc3RydWN0IHUxMzIsIHVkZXZbdWRldl9udW1iZXJdKTsKKwl1OCB1ZGV2X251bWJlciA9IHVkZXYtPnVkZXZfbnVtYmVyOworCXJldHVybiBjb250YWluZXJfb2YodWRldiwgc3RydWN0IHUxMzIsIHVkZXZbdWRldl9udW1iZXJdKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdTEzMiAqaGNkX3RvX3UxMzIoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKLSAgICAgICAgcmV0dXJuIChzdHJ1Y3QgdTEzMiAqKShoY2QtPmhjZF9wcml2KTsKKwlyZXR1cm4gKHN0cnVjdCB1MTMyICopKGhjZC0+aGNkX3ByaXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfaGNkICp1MTMyX3RvX2hjZChzdHJ1Y3QgdTEzMiAqdTEzMikKIHsKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKXUxMzIsIHN0cnVjdCB1c2JfaGNkLCBoY2RfcHJpdik7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKXUxMzIsIHN0cnVjdCB1c2JfaGNkLCBoY2RfcHJpdik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX2Rpc2FibGUoc3RydWN0IHUxMzIgKnUxMzIpCiB7Ci0gICAgICAgIHUxMzJfdG9faGNkKHUxMzIpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJdTEzMl90b19oY2QodTEzMiktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKIH0KIAogCkBAIC0yNTAsMTQ3ICsyNTAsMTQ3IEBACiAjaW5jbHVkZSAiLi4vbWlzYy91c2JfdTEzMi5oIgogc3RhdGljIGNvbnN0IGNoYXIgaGNkX25hbWVbXSA9ICJ1MTMyX2hjZCI7CiAjZGVmaW5lIFBPUlRfQ19NQVNLICgoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gfCBVU0JfUE9SVF9TVEFUX0NfRU5BQkxFIHwgXAotICAgICAgICBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8IFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVCB8IFwKLSAgICAgICAgVVNCX1BPUlRfU1RBVF9DX1JFU0VUKSA8PCAxNikKKwlVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8IFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVCB8IFwKKwlVU0JfUE9SVF9TVEFUX0NfUkVTRVQpIDw8IDE2KQogc3RhdGljIHZvaWQgdTEzMl9oY2RfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGtyZWZfdG9fdTEzMihrcmVmKTsKLSAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHUxMzItPnBsYXRmb3JtX2RldjsKLSAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOwotICAgICAgICB1MTMyLT5nb2luZyArPSAxOwotICAgICAgICBtdXRleF9sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKLSAgICAgICAgbGlzdF9kZWxfaW5pdCgmdTEzMi0+dTEzMl9saXN0KTsKLSAgICAgICAgdTEzMl9pbnN0YW5jZXMgLT0gMTsKLSAgICAgICAgbXV0ZXhfdW5sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKLSAgICAgICAgZGV2X3dhcm4oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiRlJFRUlORyB0aGUgaGNkPSVwIGFuZCB0aHVzIHRoZSB1MTMiCi0gICAgICAgICAgICAgICAgIjI9JXAgZ29pbmc9JWQgcGRldj0lcFxuIiwgaGNkLCB1MTMyLCB1MTMyLT5nb2luZywgcGRldik7Ci0gICAgICAgIHVzYl9wdXRfaGNkKGhjZCk7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBrcmVmX3RvX3UxMzIoa3JlZik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHUxMzItPnBsYXRmb3JtX2RldjsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMik7CisJdTEzMi0+Z29pbmcgKz0gMTsKKwltdXRleF9sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZ1MTMyLT51MTMyX2xpc3QpOworCXUxMzJfaW5zdGFuY2VzIC09IDE7CisJbXV0ZXhfdW5sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKKwlkZXZfd2FybigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJGUkVFSU5HIHRoZSBoY2Q9JXAgYW5kIHRodXMgdGhlIHUxMyIKKwkJIjI9JXAgZ29pbmc9JWQgcGRldj0lcFxuIiwgaGNkLCB1MTMyLCB1MTMyLT5nb2luZywgcGRldik7CisJdXNiX3B1dF9oY2QoaGNkKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHUxMzJfdTEzMl9wdXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMikKIHsKLSAgICAgICAga3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7CisJa3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX3UxMzJfaW5pdF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyKQogewotICAgICAgICBrcmVmX2luaXQoJnUxMzItPmtyZWYpOworCWtyZWZfaW5pdCgmdTEzMi0+a3JlZik7CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfdWRldl9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSBrcmVmX3RvX3UxMzJfdWRldihrcmVmKTsKLSAgICAgICAgdWRldi0+dWRldl9udW1iZXIgPSAwOwotICAgICAgICB1ZGV2LT51c2JfZGV2aWNlID0gTlVMTDsKLSAgICAgICAgdWRldi0+dXNiX2FkZHIgPSAwOwotICAgICAgICB1ZGV2LT5lbnVtZXJhdGlvbiA9IDA7CisJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9IGtyZWZfdG9fdTEzMl91ZGV2KGtyZWYpOworCXVkZXYtPnVkZXZfbnVtYmVyID0gMDsKKwl1ZGV2LT51c2JfZGV2aWNlID0gTlVMTDsKKwl1ZGV2LT51c2JfYWRkciA9IDA7CisJdWRldi0+ZW51bWVyYXRpb24gPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl91ZGV2X3B1dF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2KQogewotICAgICAgICBrcmVmX3B1dCgmdWRldi0+a3JlZiwgdTEzMl91ZGV2X2RlbGV0ZSk7CisJa3JlZl9wdXQoJnVkZXYtPmtyZWYsIHUxMzJfdWRldl9kZWxldGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl91ZGV2X2dldF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2KQogewotICAgICAgICBrcmVmX2dldCgmdWRldi0+a3JlZik7CisJa3JlZl9nZXQoJnVkZXYtPmtyZWYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl91ZGV2X2luaXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMiwKLSAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldikKKwlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2KQogewotICAgICAgICBrcmVmX2luaXQoJnVkZXYtPmtyZWYpOworCWtyZWZfaW5pdCgmdWRldi0+a3JlZik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX3JpbmdfcHV0X2tyZWYoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcpCiB7Ci0gICAgICAgIGtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOworCWtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX3JpbmdfcmVxdWV1ZV93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nLAotICAgICAgICB1bnNpZ25lZCBpbnQgZGVsdGEpCisJdW5zaWduZWQgaW50IGRlbHRhKQogewotICAgICAgICBpZiAoZGVsdGEgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayh3b3JrcXVldWUsICZyaW5nLT5zY2hlZHVsZXIsIGRlbHRhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsod29ya3F1ZXVlLCAmcmluZy0+c2NoZWR1bGVyLCAwKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwotICAgICAgICByZXR1cm47CisJaWYgKGRlbHRhID4gMCkgeworCQlpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnJpbmctPnNjaGVkdWxlciwgZGVsdGEpKQorCQkJcmV0dXJuOworCX0gZWxzZSBpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnJpbmctPnNjaGVkdWxlciwgMCkpCisJCXJldHVybjsKKwlrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfcmluZ19xdWV1ZV93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nLAotICAgICAgICB1bnNpZ25lZCBpbnQgZGVsdGEpCisJdW5zaWduZWQgaW50IGRlbHRhKQogewotICAgICAgICBrcmVmX2dldCgmdTEzMi0+a3JlZik7Ci0gICAgICAgIHUxMzJfcmluZ19yZXF1ZXVlX3dvcmsodTEzMiwgcmluZywgZGVsdGEpOwotICAgICAgICByZXR1cm47CisJa3JlZl9nZXQoJnUxMzItPmtyZWYpOworCXUxMzJfcmluZ19yZXF1ZXVlX3dvcmsodTEzMiwgcmluZywgZGVsdGEpOworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgdTEzMl9yaW5nX2NhbmNlbF93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nKQogewotICAgICAgICBpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmcmluZy0+c2NoZWR1bGVyKSkgewotICAgICAgICAgICAgICAgIGtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwotICAgICAgICB9CisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJnJpbmctPnNjaGVkdWxlcikpCisJCWtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2VuZHBfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0ga3JlZl90b191MTMyX2VuZHAoa3JlZik7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKLSAgICAgICAgdTggdXNiX2FkZHIgPSBlbmRwLT51c2JfYWRkcjsKLSAgICAgICAgdTggdXNiX2VuZHAgPSBlbmRwLT51c2JfZW5kcDsKLSAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKLSAgICAgICAgdTggZW5kcF9udW1iZXIgPSBlbmRwLT5lbmRwX251bWJlcjsKLSAgICAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXAgPSBlbmRwLT5oZXA7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmVuZHAtPmVuZHBfcmluZzsKLSAgICAgICAgcmluZy0+bGVuZ3RoIC09IDE7Ci0gICAgICAgIGlmIChlbmRwID09IHJpbmctPmN1cnJfZW5kcCkgewotICAgICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5KGhlYWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWwoaGVhZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKm5leHRfZW5kcCA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCwgZW5kcF9yaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IG5leHRfZW5kcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfZGVsKGhlYWQpOwotICAgICAgICB9fSBlbHNlCi0gICAgICAgICAgICAgICAgbGlzdF9kZWwoaGVhZCk7Ci0gICAgICAgIGlmIChlbmRwLT5pbnB1dCkgewotICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IDA7Ci0gICAgICAgICAgICAgICAgdTEzMl91ZGV2X3B1dF9rcmVmKHUxMzIsIHVkZXYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmRwLT5vdXRwdXQpIHsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0gMDsKLSAgICAgICAgICAgICAgICB1MTMyX3VkZXZfcHV0X2tyZWYodTEzMiwgdWRldik7Ci0gICAgICAgIH0KLSAgICAgICAgdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gTlVMTDsKLSAgICAgICAgaGVwLT5oY3ByaXYgPSBOVUxMOwotICAgICAgICBrZnJlZShlbmRwKTsKLSAgICAgICAgdTEzMl91MTMyX3B1dF9rcmVmKHUxMzIpOworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBrcmVmX3RvX3UxMzJfZW5kcChrcmVmKTsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJdTggdXNiX2FkZHIgPSBlbmRwLT51c2JfYWRkcjsKKwl1OCB1c2JfZW5kcCA9IGVuZHAtPnVzYl9lbmRwOworCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOworCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKKwl1OCBlbmRwX251bWJlciA9IGVuZHAtPmVuZHBfbnVtYmVyOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwID0gZW5kcC0+aGVwOworCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZW5kcC0+ZW5kcF9yaW5nOworCXJpbmctPmxlbmd0aCAtPSAxOworCWlmIChlbmRwID09IHJpbmctPmN1cnJfZW5kcCkgeworCQlpZiAobGlzdF9lbXB0eShoZWFkKSkgeworCQkJcmluZy0+Y3Vycl9lbmRwID0gTlVMTDsKKwkJCWxpc3RfZGVsKGhlYWQpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHUxMzJfZW5kcCAqbmV4dF9lbmRwID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LAorCQkJCXN0cnVjdCB1MTMyX2VuZHAsIGVuZHBfcmluZyk7CisJCQlyaW5nLT5jdXJyX2VuZHAgPSBuZXh0X2VuZHA7CisJCQlsaXN0X2RlbChoZWFkKTsKKwkJfQorCX0gZWxzZQorCQlsaXN0X2RlbChoZWFkKTsKKwlpZiAoZW5kcC0+aW5wdXQpIHsKKwkJdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0gMDsKKwkJdTEzMl91ZGV2X3B1dF9rcmVmKHUxMzIsIHVkZXYpOworCX0KKwlpZiAoZW5kcC0+b3V0cHV0KSB7CisJCXVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSAwOworCQl1MTMyX3VkZXZfcHV0X2tyZWYodTEzMiwgdWRldik7CisJfQorCXUxMzItPmVuZHBbZW5kcF9udW1iZXIgLSAxXSA9IE5VTEw7CisJaGVwLT5oY3ByaXYgPSBOVUxMOworCWtmcmVlKGVuZHApOworCXUxMzJfdTEzMl9wdXRfa3JlZih1MTMyKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHUxMzJfZW5kcF9wdXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCkKIHsKLSAgICAgICAga3JlZl9wdXQoJmVuZHAtPmtyZWYsIHUxMzJfZW5kcF9kZWxldGUpOworCWtyZWZfcHV0KCZlbmRwLT5rcmVmLCB1MTMyX2VuZHBfZGVsZXRlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHUxMzJfZW5kcF9nZXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCkKIHsKLSAgICAgICAga3JlZl9nZXQoJmVuZHAtPmtyZWYpOworCWtyZWZfZ2V0KCZlbmRwLT5rcmVmKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHUxMzJfZW5kcF9pbml0X2tyZWYoc3RydWN0IHUxMzIgKnUxMzIsCi0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHApCisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCkKIHsKLSAgICAgICAga3JlZl9pbml0KCZlbmRwLT5rcmVmKTsKLSAgICAgICAga3JlZl9nZXQoJnUxMzItPmtyZWYpOworCWtyZWZfaW5pdCgmZW5kcC0+a3JlZik7CisJa3JlZl9nZXQoJnUxMzItPmtyZWYpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2VuZHBfcXVldWVfd29yayhzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwKLSAgICAgICAgdW5zaWduZWQgaW50IGRlbHRhKQorCXVuc2lnbmVkIGludCBkZWx0YSkKIHsKIAlpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJmVuZHAtPnNjaGVkdWxlciwgZGVsdGEpKQogCQlrcmVmX2dldCgmZW5kcC0+a3JlZik7CkBAIC0zOTgsMTMgKzM5OCwxMyBAQAogCiBzdGF0aWMgdm9pZCB1MTMyX2VuZHBfY2FuY2VsX3dvcmsoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHApCiB7Ci0gICAgICAgIGlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZlbmRwLT5zY2hlZHVsZXIpKQotICAgICAgICAgICAgICAgIGtyZWZfcHV0KCZlbmRwLT5rcmVmLCB1MTMyX2VuZHBfZGVsZXRlKTsKKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmZW5kcC0+c2NoZWR1bGVyKSkKKwkJa3JlZl9wdXQoJmVuZHAtPmtyZWYsIHUxMzJfZW5kcF9kZWxldGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl9tb25pdG9yX3B1dF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyKQogewotICAgICAgICBrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKKwlrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKIH0KIAogc3RhdGljIHZvaWQgdTEzMl9tb25pdG9yX3F1ZXVlX3dvcmsoc3RydWN0IHUxMzIgKnUxMzIsIHVuc2lnbmVkIGludCBkZWx0YSkKQEAgLTQyMSwyMDAgKzQyMSwyMDEgQEAKIAogc3RhdGljIHZvaWQgdTEzMl9tb25pdG9yX2NhbmNlbF93b3JrKHN0cnVjdCB1MTMyICp1MTMyKQogewotICAgICAgICBpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmdTEzMi0+bW9uaXRvcikpCi0gICAgICAgICAgICAgICAga3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7CisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJnUxMzItPm1vbml0b3IpKQorCQlrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKIH0KIAogc3RhdGljIGludCByZWFkX3Jvb3RodWJfaW5mbyhzdHJ1Y3QgdTEzMiAqdTEzMikKIHsKLSAgICAgICAgdTMyIHJldmlzaW9uOwotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJldmlzaW9uLCAmcmV2aXNpb24pOwotICAgICAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2Nlc3NpbmcgZGV2aWNlIGNvIgotICAgICAgICAgICAgICAgICAgICAgICAgIm50cm9sXG4iLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHJldmlzaW9uICYgMHhGRikgPT0gMHgxMCkgewotICAgICAgICB9IGVsc2UgaWYgKChyZXZpc2lvbiAmIDB4RkYpID09IDB4MTEpIHsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSByZXZpc2lvbiBpcyBub3QgdmFsaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICUwOFhcbiIsIHJldmlzaW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfQotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZ1MTMyLT5oY19jb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSBjbyIKLSAgICAgICAgICAgICAgICAgICAgICAgICJudHJvbFxuIiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5zdGF0dXMsCi0gICAgICAgICAgICAgICAgJnUxMzItPmhjX3Jvb3RodWJfc3RhdHVzKTsKLSAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSByZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJnIHJvb3RodWIuc3RhdHVzXG4iLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZ1MTMyLT5oY19yb290aHViX2EpOwotICAgICAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2Nlc3NpbmcgZGV2aWNlIHJlIgotICAgICAgICAgICAgICAgICAgICAgICAgImcgcm9vdGh1Yi5hXG4iLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBJID0gdTEzMi0+bnVtX3BvcnRzOwotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoSS0tID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1MTMyLT5oY19yb290aHViX3BvcnRzdGF0dXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImVycm9yICVkIGFjYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXNzaW5nIGRldmljZSByb290aHViLnBvcnRzdGF0dXNbJWRdXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCByZXR2YWwsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisJdTMyIHJldmlzaW9uOworCWludCByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByZXZpc2lvbiwgJnJldmlzaW9uKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSBjbyIKKwkJCSJudHJvbFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9IGVsc2UgaWYgKChyZXZpc2lvbiAmIDB4RkYpID09IDB4MTApIHsKKwl9IGVsc2UgaWYgKChyZXZpc2lvbiAmIDB4RkYpID09IDB4MTEpIHsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSByZXZpc2lvbiBpcyBub3QgdmFsaWQiCisJCQkiICUwOFhcbiIsIHJldmlzaW9uKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJnUxMzItPmhjX2NvbnRyb2wpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2Nlc3NpbmcgZGV2aWNlIGNvIgorCQkJIm50cm9sXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLAorCQkmdTEzMi0+aGNfcm9vdGh1Yl9zdGF0dXMpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2Nlc3NpbmcgZGV2aWNlIHJlIgorCQkJImcgcm9vdGh1Yi5zdGF0dXNcbiIsIHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5hLCAmdTEzMi0+aGNfcm9vdGh1Yl9hKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSByZSIKKwkJCSJnIHJvb3RodWIuYVxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJeworCQlpbnQgSSA9IHUxMzItPm51bV9wb3J0czsKKwkJaW50IGkgPSAwOworCQl3aGlsZSAoSS0tID4gMCkgeworCQkJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbaV0sCisJCQkJJnUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2MiCisJCQkJCSJlc3NpbmcgZGV2aWNlIHJvb3RodWIucG9ydHN0YXR1c1slZF1cbiIKKwkJCQkJLCByZXR2YWwsIGkpOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9IGVsc2UKKwkJCQlpICs9IDE7CisJCX0KKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfaGNkX21vbml0b3Jfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1MTMyLCBtb25pdG9yLndvcmspOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgdTEzMl9tb25pdG9yX3B1dF9rcmVmKHUxMzIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKLSAgICAgICAgICAgICAgICB1MTMyX21vbml0b3JfcHV0X2tyZWYodTEzMik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgbXV0ZXhfbG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcmVhZF9yb290aHViX2luZm8odTEzMik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9oY19kaWVkKGhjZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fZ29uZV9hd2F5KHUxMzItPnBsYXRmb3JtX2Rldik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX21vbml0b3JfcHV0X2tyZWYodTEzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfbW9uaXRvcl9yZXF1ZXVlX3dvcmsodTEzMiwgNTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisJc3RydWN0IHUxMzIgKnUxMzIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHUxMzIsIG1vbml0b3Iud29yayk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJdTEzMl9tb25pdG9yX3B1dF9rcmVmKHUxMzIpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJCXUxMzJfbW9uaXRvcl9wdXRfa3JlZih1MTMyKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWludCByZXR2YWw7CisJCW11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR2YWwgPSByZWFkX3Jvb3RodWJfaW5mbyh1MTMyKTsKKwkJaWYgKHJldHZhbCkgeworCQkJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOworCQkJdTEzMl9kaXNhYmxlKHUxMzIpOworCQkJdTEzMi0+Z29pbmcgPSAxOworCQkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zd19sb2NrKTsKKwkJCXVzYl9oY19kaWVkKGhjZCk7CisJCQlmdGRpX2VsYW5fZ29uZV9hd2F5KHUxMzItPnBsYXRmb3JtX2Rldik7CisJCQl1MTMyX21vbml0b3JfcHV0X2tyZWYodTEzMik7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQl1MTMyX21vbml0b3JfcmVxdWV1ZV93b3JrKHUxMzIsIDUwMCk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCQkJcmV0dXJuOworCQl9CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9naXZlYmFja191cmIoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsCi0gICAgICAgIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKKwlzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaXJxczsKLSAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOwotICAgICAgICB1cmItPmVycm9yX2NvdW50ID0gMDsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CisJdW5zaWduZWQgbG9uZyBpcnFzOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKKwl1cmItPmVycm9yX2NvdW50ID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CiAJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoaGNkLCB1cmIpOwotICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0ICs9IDE7Ci0gICAgICAgIGlmIChFTkRQX1FVRVVFX1NJWkUgPiAtLWVuZHAtPnF1ZXVlX3NpemUpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBlbmRwLT51cmJfbW9yZS5uZXh0OwotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCB1MTMyX3VyYnEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmJfbW9yZSk7Ci0gICAgICAgICAgICAgICAgbGlzdF9kZWwobmV4dCk7Ci0gICAgICAgICAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmJxLT51cmI7Ci0gICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLSAgICAgICAgICAgICAgICBrZnJlZSh1cmJxKTsKLSAgICAgICAgfSBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIHJpbmcgPSBlbmRwLT5yaW5nOwotICAgICAgICByaW5nLT5pbl91c2UgPSAwOwotICAgICAgICB1MTMyX3JpbmdfY2FuY2VsX3dvcmsodTEzMiwgcmluZyk7Ci0gICAgICAgIHUxMzJfcmluZ19xdWV1ZV93b3JrKHUxMzIsIHJpbmcsIDApOwotICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisJZW5kcC0+cXVldWVfbmV4dCArPSAxOworCWlmIChFTkRQX1FVRVVFX1NJWkUgPiAtLWVuZHAtPnF1ZXVlX3NpemUpIHsKKwkJZW5kcC0+YWN0aXZlID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IGVuZHAtPnVyYl9tb3JlLm5leHQ7CisJCXN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCB1MTMyX3VyYnEsCisJCQl1cmJfbW9yZSk7CisJCWxpc3RfZGVsKG5leHQpOworCQllbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0KKwkJCXVyYnEtPnVyYjsKKwkJZW5kcC0+YWN0aXZlID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCWtmcmVlKHVyYnEpOworCX0KKwltdXRleF9sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJcmluZyA9IGVuZHAtPnJpbmc7CisJcmluZy0+aW5fdXNlID0gMDsKKwl1MTMyX3JpbmdfY2FuY2VsX3dvcmsodTEzMiwgcmluZyk7CisJdTEzMl9yaW5nX3F1ZXVlX3dvcmsodTEzMiwgcmluZywgMCk7CisJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOwogCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGhjZCwgdXJiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47CisJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9mb3JnZXRfdXJiKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLAotICAgICAgICBzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCisJc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQogewotICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9hYmFuZG9uX3VyYihzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwKLSAgICAgICAgc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQorCXN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOwotICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMik7Ci0gICAgICAgIHVyYi0+ZXJyb3JfY291bnQgPSAwOwotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJdW5zaWduZWQgbG9uZyBpcnFzOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKKwl1cmItPmVycm9yX2NvdW50ID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CiAJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoaGNkLCB1cmIpOwotICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0ICs9IDE7Ci0gICAgICAgIGlmIChFTkRQX1FVRVVFX1NJWkUgPiAtLWVuZHAtPnF1ZXVlX3NpemUpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBlbmRwLT51cmJfbW9yZS5uZXh0OwotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCB1MTMyX3VyYnEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmJfbW9yZSk7Ci0gICAgICAgICAgICAgICAgbGlzdF9kZWwobmV4dCk7Ci0gICAgICAgICAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmJxLT51cmI7Ci0gICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLSAgICAgICAgICAgICAgICBrZnJlZSh1cmJxKTsKKwllbmRwLT5xdWV1ZV9uZXh0ICs9IDE7CisJaWYgKEVORFBfUVVFVUVfU0laRSA+IC0tZW5kcC0+cXVldWVfc2l6ZSkgeworCQllbmRwLT5hY3RpdmUgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gZW5kcC0+dXJiX21vcmUubmV4dDsKKwkJc3RydWN0IHUxMzJfdXJicSAqdXJicSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHUxMzJfdXJicSwKKwkJCXVyYl9tb3JlKTsKKwkJbGlzdF9kZWwobmV4dCk7CisJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPQorCQkJdXJicS0+dXJiOworCQllbmRwLT5hY3RpdmUgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKwkJa2ZyZWUodXJicSk7CiAJfSB1c2JfaGNkX2dpdmViYWNrX3VyYihoY2QsIHVyYiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOworCXJldHVybjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWRzZXRfaW5wdXQoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcsCi0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggdG9nZ2xlX2JpdHMsCi0gICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKLSAgICAgICAgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCi0gICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IHRvZ2dsZV9iaXRzLAorCXZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKwlpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKwkgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCiB7Ci0gICAgICAgIHJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAotICAgICAgICAgICAgICAgICB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworCXJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAorCQkgdXJiLCBhZGRyZXNzLCBlbmRwLT51c2JfZW5kcCwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWRzZXRfc2V0dXAoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcsCi0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggdG9nZ2xlX2JpdHMsCi0gICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKLSAgICAgICAgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCi0gICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IHRvZ2dsZV9iaXRzLAorCXZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKwlpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKwkgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCiB7Ci0gICAgICAgIHJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X3NldHVwKHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAotICAgICAgICAgICAgICAgICB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworCXJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X3NldHVwKHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAorCQkgdXJiLCBhZGRyZXNzLCBlbmRwLT51c2JfZW5kcCwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWRzZXRfc2luZ2xlKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nLAotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IHRvZ2dsZV9iaXRzLAotICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCi0gICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAotICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCB0b2dnbGVfYml0cywKKwl2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisJaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCisJIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQogewotICAgICAgICByZXR1cm4gdXNiX2Z0ZGlfZWxhbl9lZHNldF9zaW5nbGUodTEzMi0+cGxhdGZvcm1fZGV2LCByaW5nLT5udW1iZXIsCi0gICAgICAgICAgICAgICAgZW5kcCwgdXJiLCBhZGRyZXNzLCBlbmRwLT51c2JfZW5kcCwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKKwlyZXR1cm4gdXNiX2Z0ZGlfZWxhbl9lZHNldF9zaW5nbGUodTEzMi0+cGxhdGZvcm1fZGV2LCByaW5nLT5udW1iZXIsCisJCWVuZHAsIHVyYiwgYWRkcmVzcywgZW5kcC0+dXNiX2VuZHAsIHRvZ2dsZV9iaXRzLCBjYWxsYmFjayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGVkc2V0X291dHB1dChzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfcmluZyAqcmluZywKLSAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCB0b2dnbGVfYml0cywKLSAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAotICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKLSAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQorCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggdG9nZ2xlX2JpdHMsCisJdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorCWludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorCSBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKIHsKLSAgICAgICAgcmV0dXJuIHVzYl9mdGRpX2VsYW5fZWRzZXRfb3V0cHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLAotICAgICAgICAgICAgICAgIGVuZHAsIHVyYiwgYWRkcmVzcywgZW5kcC0+dXNiX2VuZHAsIHRvZ2dsZV9iaXRzLCBjYWxsYmFjayk7CisJcmV0dXJuIHVzYl9mdGRpX2VsYW5fZWRzZXRfb3V0cHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLAorCQllbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOwogfQogCiAKQEAgLTYyMyw2ODMgKzYyNCw2NzggQEAKICoKICovCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbnRlcnJ1cHRfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107Ci0gICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoOwotICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOwotICAgICAgICAgICAgICAgIGludCBMID0gbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKLSAgICAgICAgICAgICAgICBpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgJiB0b2dnbGVfYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9zaW5nbGUodTEzMiwgcmluZywgZW5kcCwgdXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGVuZHAtPnRvZ2dsZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ludGVycnVwdF9yZWN2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+aW5fdXNlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+amlmZmllcyA9IGppZmZpZXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfcmluZ19jYW5jZWxfd29yayh1MTMyLCByaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9yaW5nX3F1ZXVlX3dvcmsodTEzMiwgcmluZywgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjb25kaXRpb25fY29kZSA9PSBURF9EQVRBVU5ERVJSVU4pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfU0hPUlRfTk9UX09LKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgJiB0b2dnbGVfYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb25fY29kZSA9PSBURF9DQ19OT0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSAmIHRvZ2dsZV9iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfU1RBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJ1cmI9JXAgZ2l2aW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImcgYmFjayBJTlRFUlJVUFQgJXNcbiIsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisJCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworCQl1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoOworCQl1OCAqYiA9IGJ1ZjsKKwkJaW50IEwgPSBsZW47CisKKwkJd2hpbGUgKEwtLSA+IDApCisJCQkqdSsrID0gKmIrKzsKKworCQl1cmItPmFjdHVhbF9sZW5ndGggKz0gbGVuOworCQlpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpICYmCisJCQkodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgeworCQkJZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKKwkJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsIDAsCisJCQkJMSAmIHRvZ2dsZV9iaXRzKTsKKwkJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CisJCQkJaW50IHJldHZhbDsKKwkJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCQlyZXR2YWwgPSBlZHNldF9zaW5nbGUodTEzMiwgcmluZywgZW5kcCwgdXJiLAorCQkJCQlhZGRyZXNzLCBlbmRwLT50b2dnbGVfYml0cywKKwkJCQkJdTEzMl9oY2RfaW50ZXJydXB0X3JlY3YpOworCQkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKKwkJCQkJCXJldHZhbCk7CisJCQl9IGVsc2UgeworCQkJCXJpbmctPmluX3VzZSA9IDA7CisJCQkJZW5kcC0+YWN0aXZlID0gMDsKKwkJCQllbmRwLT5qaWZmaWVzID0gamlmZmllcyArCisJCQkJCW1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCk7CisJCQkJdTEzMl9yaW5nX2NhbmNlbF93b3JrKHUxMzIsIHJpbmcpOworCQkJCXUxMzJfcmluZ19xdWV1ZV93b3JrKHUxMzIsIHJpbmcsIDApOworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSAmJgorCQkJKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorCQkJCTEgJiB0b2dnbGVfYml0cyk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHsKKwkJCQllbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOworCQkJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsCisJCQkJCTAsIDEgJiB0b2dnbGVfYml0cyk7CisJCQl9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX1NUQUxMKSB7CisJCQkJZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7CisJCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwKKwkJCQkJMCwgMCk7CisJCQl9IGVsc2UgeworCQkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworCQkJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsCisJCQkJCTAsIDApOworCQkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIGdpdmluIgorCQkJCQkiZyBiYWNrIElOVEVSUlVQVCAlc1xuIiwgdXJiLAorCQkJCQljY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSk7CisJCQl9CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfYnVsa19vdXRwdXRfc2VudCh2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1cmItPmFjdHVhbF9sZW5ndGggKz0gbGVuOwotICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IHVyYi0+YWN0dWFsX2xlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9vdXRwdXQodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cywgdTEzMl9oY2RfYnVsa19vdXRwdXRfc2VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKwkJdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKKwkJZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKKwkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQkJaW50IHJldHZhbDsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJcmV0dmFsID0gZWRzZXRfb3V0cHV0KHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwgYWRkcmVzcywKKwkJCQllbmRwLT50b2dnbGVfYml0cywgdTEzMl9oY2RfYnVsa19vdXRwdXRfc2VudCk7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgewogCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIkNBTExCQUNLIGNhbGxlZCB1cmI9JXAgIgogCQkJCSJ1bmxpbmtlZD0lZFxuIiwgdXJiLCB1cmItPnVubGlua2VkKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKIAkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisJCXJldHVybjsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfaGNkX2J1bGtfaW5wdXRfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107Ci0gICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoOwotICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOwotICAgICAgICAgICAgICAgIGludCBMID0gbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKLSAgICAgICAgICAgICAgICBpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnRvZ2dsZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9idWxrX2lucHV0X3JlY3YpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOwotICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAmIHRvZ2dsZV9iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl93YXJuKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcChTSE9SVCBOT1QgT0siCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGdpdmluZyBiYWNrIEJVTEsgSU4gJXNcbiIsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fdGV4dFtjb25kaXRpb25fY29kZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfU1RBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOwotICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIGdpdmluZyBiYWNrIEIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTEsgSU4gY29kZT0lZCAlc1xuIiwgdXJiLCBjb25kaXRpb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fdGV4dFtjb25kaXRpb25fY29kZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKwkJdTggKnUgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJdTggKmIgPSBidWY7CisJCWludCBMID0gbGVuOworCisJCXdoaWxlIChMLS0gPiAwKQorCQkJKnUrKyA9ICpiKys7CisKKwkJdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKKwkJaWYgKChjb25kaXRpb25fY29kZSA9PSBURF9DQ19OT0VSUk9SKSAmJgorCQkJKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IHVyYi0+YWN0dWFsX2xlbmd0aCkpIHsKKwkJCWludCByZXR2YWw7CisJCQllbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOworCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwKKwkJCQkxICYgdG9nZ2xlX2JpdHMpOworCQkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCQlyZXR2YWwgPSB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwKKwkJCQlyaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKKwkJCQllbmRwLT51c2JfZW5kcCwgZW5kcC0+dG9nZ2xlX2JpdHMsCisJCQkJdTEzMl9oY2RfYnVsa19pbnB1dF9yZWN2KTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorCQkJCTEgJiB0b2dnbGVfYml0cyk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSAmJgorCQkJKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorCQkJCTEgJiB0b2dnbGVfYml0cyk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0RBVEFVTkRFUlJVTikgeworCQkJZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKKwkJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgZW5kcC0+dXNiX2VuZHAsIDAsCisJCQkJMSAmIHRvZ2dsZV9iaXRzKTsKKwkJCWRldl93YXJuKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcChTSE9SVCBOT1QgT0siCisJCQkJIikgZ2l2aW5nIGJhY2sgQlVMSyBJTiAlc1xuIiwgdXJiLAorCQkJCWNjX3RvX3RleHRbY29uZGl0aW9uX2NvZGVdKTsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfU1RBTEwpIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwgMCk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwgMCk7CisJCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBnaXZpbmcgYmFjayBCIgorCQkJCSJVTEsgSU4gY29kZT0lZCAlc1xuIiwgdXJiLCBjb25kaXRpb25fY29kZSwKKwkJCQljY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9jb25maWd1cmVfaW5wdXRfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOwotICAgICAgICAgICAgICAgIGludCBMID0gbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuOwotICAgICAgICAgICAgICAgIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfTk9FUlJPUikgfHwgKChjb25kaXRpb25fY29kZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgVERfREFUQVVOREVSUlVOKSAmJiAoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJgotICAgICAgICAgICAgICAgICAgICAgICAgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfZW1wdHkodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIDB4MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3NlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX1NUQUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgZGV2X3dhcm4oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZ2l2aW5nIGJhY2sgU0VUVVAgSSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5QVVQgU1RBTEwgdXJiICVwXG4iLCB1cmIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZ2l2aW5nIGJhY2sgU0VUVVAgSU4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQVVQgJXMgdXJiICVwXG4iLCBjY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKwkJdTggKnUgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwkJdTggKmIgPSBidWY7CisJCWludCBMID0gbGVuOworCisJCXdoaWxlIChMLS0gPiAwKQorCQkJKnUrKyA9ICpiKys7CisKKwkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuOworCQlpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHx8ICgoY29uZGl0aW9uX2NvZGUgPT0KKwkJCVREX0RBVEFVTkRFUlJVTikgJiYgKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYKKwkJCVVSQl9TSE9SVF9OT1RfT0spID09IDApKSkgeworCQkJaW50IHJldHZhbDsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9lbXB0eSh1MTMyLT5wbGF0Zm9ybV9kZXYsCisJCQkJcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsCisJCQkJZW5kcC0+dXNiX2VuZHAsIDB4MywKKwkJCQl1MTMyX2hjZF9jb25maWd1cmVfZW1wdHlfc2VudCk7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChjb25kaXRpb25fY29kZSA9PSBURF9DQ19TVEFMTCkgeworCQkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCQlkZXZfd2FybigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJnaXZpbmcgYmFjayBTRVRVUCBJIgorCQkJCSJOUFVUIFNUQUxMIHVyYiAlcFxuIiwgdXJiKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJnaXZpbmcgYmFjayBTRVRVUCBJTiIKKwkJCQkiUFVUICVzIHVyYiAlcFxuIiwgY2NfdG9fdGV4dFtjb25kaXRpb25fY29kZV0sCisJCQkJdXJiKTsKKwkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9jb25maWd1cmVfc2V0dXBfc2VudCh2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCi0gICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCWludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9pbnB1dCh1MTMyLT5wbGF0Zm9ybV9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPm51bWJlciwgZW5kcCwgdXJiLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51c2JfZW5kcCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfY29uZmlndXJlX2lucHV0X3JlY3YpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2NvbmZpZ3VyZV9lbXB0eV9yZWN2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworCQlpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7CisJCQlpbnQgcmV0dmFsOworCQkJc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAorCQkJCXJpbmctPm51bWJlciwgZW5kcCwgdXJiLCBhZGRyZXNzLAorCQkJCWVuZHAtPnVzYl9lbmRwLCAwLAorCQkJCXUxMzJfaGNkX2NvbmZpZ3VyZV9pbnB1dF9yZWN2KTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaW50IHJldHZhbDsKKwkJCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworCQkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCQlyZXR2YWwgPSB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwKKwkJCQlyaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKKwkJCQllbmRwLT51c2JfZW5kcCwgMCwKKwkJCQl1MTMyX2hjZF9jb25maWd1cmVfZW1wdHlfcmVjdik7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfZW51bWVyYXRpb25fZW1wdHlfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsCi0gICAgICAgIHU4ICpidWYsIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCi0gICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQorCXU4ICpidWYsIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisJaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOwotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7Ci0gICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107Ci0gICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICB1MTMyLT5hZGRyWzBdLmFkZHJlc3MgPSAwOwotICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9hZGRyID0gdWRldi0+dXNiX2FkZHI7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7CisJCXUxMzItPmFkZHJbMF0uYWRkcmVzcyA9IDA7CisJCWVuZHAtPnVzYl9hZGRyID0gdWRldi0+dXNiX2FkZHI7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfZW51bWVyYXRpb25fYWRkcmVzc19zZW50KHZvaWQgKmRhdGEsIHN0cnVjdCB1cmIgKnVyYiwKLSAgICAgICAgdTggKmJ1ZiwgaW50IGxlbiwgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwKLSAgICAgICAgaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCisJdTggKmJ1ZiwgaW50IGxlbiwgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwKKwlpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKIHsKLSAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKLSAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworCXN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKwltdXRleF9sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgeworCQllbmRwLT5kZXF1ZXVlaW5nID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewogCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkICIKIAkJCQkidXJiPSVwXG4iLCB1cmIpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisJCXJldHVybjsKIAl9IGVsc2UgaWYgKCF1cmItPnVubGlua2VkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIDAsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZW51bWVyYXRpb25fZW1wdHlfcmVjdik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJaW50IHJldHZhbDsKKwkJc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQlyZXR2YWwgPSB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwKKwkJCXJpbmctPm51bWJlciwgZW5kcCwgdXJiLCAwLCBlbmRwLT51c2JfZW5kcCwgMCwKKwkJCXUxMzJfaGNkX2VudW1lcmF0aW9uX2VtcHR5X3JlY3YpOworCQlpZiAocmV0dmFsICE9IDApCisJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbml0aWFsX2VtcHR5X3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgewotICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworCW11dGV4X2xvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisJCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgIgogCQkJCSJ1cmI9JXBcbiIsIHVyYik7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoIXVyYi0+dW5saW5rZWQpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbml0aWFsX2lucHV0X3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKLSAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworCXN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKwl1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKKwltdXRleF9sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgeworCQllbmRwLT5kZXF1ZXVlaW5nID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewogCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkICIKIAkJCQkidXJiPSVwXG4iLCB1cmIpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisJCXJldHVybjsKIAl9IGVsc2UgaWYgKCF1cmItPnVubGlua2VkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOwotICAgICAgICAgICAgICAgIGludCBMID0gbGVuOwotICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9lbXB0eSh1MTMyLT5wbGF0Zm9ybV9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywgZW5kcC0+dXNiX2VuZHAsIDB4MywKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2luaXRpYWxfZW1wdHlfc2VudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKKwkJaW50IHJldHZhbDsKKwkJc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7CisJCXU4ICp1ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCXU4ICpiID0gYnVmOworCQlpbnQgTCA9IGxlbjsKKworCQl3aGlsZSAoTC0tID4gMCkKKwkJCSp1KysgPSAqYisrOworCisJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IGxlbjsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfZW1wdHkodTEzMi0+cGxhdGZvcm1fZGV2LAorCQkJcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCAweDMsCisJCQl1MTMyX2hjZF9pbml0aWFsX2VtcHR5X3NlbnQpOworCQlpZiAocmV0dmFsICE9IDApCisJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQlyZXR1cm47CisJfSBlbHNlIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwICIKIAkJCQkidW5saW5rZWQ9JWRcbiIsIHVyYiwgdXJiLT51bmxpbmtlZCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbml0aWFsX3NldHVwX3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAotICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAotICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKKwlpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorCWludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwotICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKLSAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworCXN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKwl1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKKwltdXRleF9sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgeworCQllbmRwLT5kZXF1ZXVlaW5nID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewogCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkICIKIAkJCQkidXJiPSVwXG4iLCB1cmIpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisJCXJldHVybjsKIAl9IGVsc2UgaWYgKCF1cmItPnVubGlua2VkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfaW5pdGlhbF9pbnB1dF9yZWN2KTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgeworCQlpbnQgcmV0dmFsOworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAorCQkJcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCAwLAorCQkJdTEzMl9oY2RfaW5pdGlhbF9pbnB1dF9yZWN2KTsKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CiAJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCAiCiAJCQkJInVubGlua2VkPSVkXG4iLCB1cmIsIHVyYi0+dW5saW5rZWQpOwotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJcmV0dXJuOworCX0KIH0KIAogLyoKQEAgLTEzMDgsMzAyICsxMzA0LDI5NiBAQAogKi8KIHN0YXRpYyB2b2lkIHUxMzJfaGNkX3Jpbmdfd29ya19zY2hlZHVsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0KKwlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1MTMyX3JpbmcsIHNjaGVkdWxlci53b3JrKTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSByaW5nLT51MTMyOwotICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgIGlmIChyaW5nLT5pbl91c2UpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAocmluZy0+Y3Vycl9lbmRwKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqbGFzdF9lbmRwID0gcmluZy0+Y3Vycl9lbmRwOwotICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnNjYW47Ci0gICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZsYXN0X2VuZHAtPmVuZHBfcmluZzsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHdha2V1cCA9IDA7Ci0gICAgICAgICAgICAgICAgbGlzdF9mb3JfZWFjaChzY2FuLCBoZWFkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gbGlzdF9lbnRyeShzY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwLCBlbmRwX3JpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHAtPnF1ZXVlX25leHQgPT0gZW5kcC0+cXVldWVfbGFzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZW5kcC0+ZGVsYXllZCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZHAtPmppZmZpZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9jYW5jZWxfd29yayh1MTMyLCBsYXN0X2VuZHApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBsYXN0X2VuZHAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfcHV0X2tyZWYodTEzMiwgcmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVsdGEgPSBlbmRwLT5qaWZmaWVzIC0gamlmZmllczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gd2FrZXVwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2V1cCA9IGRlbHRhOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGFzdF9lbmRwLT5xdWV1ZV9uZXh0ID09IGxhc3RfZW5kcC0+cXVldWVfbGFzdCkgewotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxhc3RfZW5kcC0+ZGVsYXllZCA9PSAwKSB8fCB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2VuZHAtPmppZmZpZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfY2FuY2VsX3dvcmsodTEzMiwgbGFzdF9lbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGxhc3RfZW5kcCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9yaW5nX3B1dF9rcmVmKHUxMzIsIHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRlbHRhID0gbGFzdF9lbmRwLT5qaWZmaWVzIC0gamlmZmllczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IHdha2V1cCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FrZXVwID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh3YWtldXAgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfcmVxdWV1ZV93b3JrKHUxMzIsIHJpbmcsIHdha2V1cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9yaW5nX3B1dF9rcmVmKHUxMzIsIHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IHJpbmctPnUxMzI7CisJbXV0ZXhfbG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCWlmIChyaW5nLT5pbl91c2UpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAocmluZy0+Y3Vycl9lbmRwKSB7CisJCXN0cnVjdCB1MTMyX2VuZHAgKmxhc3RfZW5kcCA9IHJpbmctPmN1cnJfZW5kcDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqc2NhbjsKKwkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZsYXN0X2VuZHAtPmVuZHBfcmluZzsKKwkJdW5zaWduZWQgbG9uZyB3YWtldXAgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHNjYW4sIGhlYWQpIHsKKwkJCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBsaXN0X2VudHJ5KHNjYW4sCisJCQkJc3RydWN0IHUxMzJfZW5kcCwgZW5kcF9yaW5nKTsKKwkJCWlmIChlbmRwLT5xdWV1ZV9uZXh0ID09IGVuZHAtPnF1ZXVlX2xhc3QpIHsKKwkJCX0gZWxzZSBpZiAoKGVuZHAtPmRlbGF5ZWQgPT0gMCkKKwkJCQl8fCB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZHAtPmppZmZpZXMpKSB7CisJCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCQl1MTMyX2VuZHBfY2FuY2VsX3dvcmsodTEzMiwgbGFzdF9lbmRwKTsKKwkJCQl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBsYXN0X2VuZHAsIDApOworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIGxvbmcgZGVsdGEgPSBlbmRwLT5qaWZmaWVzIC0gamlmZmllczsKKwkJCQlpZiAoZGVsdGEgPiB3YWtldXApCisJCQkJCXdha2V1cCA9IGRlbHRhOworCQkJfQorCQl9CisJCWlmIChsYXN0X2VuZHAtPnF1ZXVlX25leHQgPT0gbGFzdF9lbmRwLT5xdWV1ZV9sYXN0KSB7CisJCX0gZWxzZSBpZiAoKGxhc3RfZW5kcC0+ZGVsYXllZCA9PSAwKSB8fCB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCisJCQlsYXN0X2VuZHAtPmppZmZpZXMpKSB7CisJCQl1MTMyX2VuZHBfY2FuY2VsX3dvcmsodTEzMiwgbGFzdF9lbmRwKTsKKwkJCXUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGxhc3RfZW5kcCwgMCk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgZGVsdGEgPSBsYXN0X2VuZHAtPmppZmZpZXMgLSBqaWZmaWVzOworCQkJaWYgKGRlbHRhID4gd2FrZXVwKQorCQkJCXdha2V1cCA9IGRlbHRhOworCQl9CisJCWlmICh3YWtldXAgPiAwKSB7CisJCQl1MTMyX3JpbmdfcmVxdWV1ZV93b3JrKHUxMzIsIHJpbmcsIHdha2V1cCk7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9yaW5nX3B1dF9rcmVmKHUxMzIsIHJpbmcpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPQorCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CisJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdTEzMl9lbmRwLCBzY2hlZHVsZXIud29yayk7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKLSAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICByaW5nID0gZW5kcC0+cmluZzsKLSAgICAgICAgaWYgKGVuZHAtPmVkc2V0X2ZsdXNoKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+ZWRzZXRfZmx1c2ggPSAwOwotICAgICAgICAgICAgICAgIGlmIChlbmRwLT5kZXF1ZXVlaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2Z0ZGlfZWxhbl9lZHNldF9mbHVzaCh1MTMyLT5wbGF0Zm9ybV9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPm51bWJlciwgZW5kcCk7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmFjdGl2ZSkgewotICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChyaW5nLT5pbl91c2UpIHsKLSAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+cXVldWVfbmV4dCA9PSBlbmRwLT5xdWV1ZV9sYXN0KSB7Ci0gICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPnBpcGV0eXBlID09IFBJUEVfSU5URVJSVVBUKSB7Ci0gICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgaWYgKHJpbmctPmluX3VzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHRdOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X3NpbmdsZSh1MTMyLCByaW5nLCBlbmRwLCB1cmIsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzLCB1MTMyX2hjZF9pbnRlcnJ1cHRfcmVjdik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5waXBldHlwZSA9PSBQSVBFX0NPTlRST0wpIHsKLSAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKLSAgICAgICAgICAgICAgICBpZiAocmluZy0+aW5fdXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWRkcmVzcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfbmV4dF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmluX3VzZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gZWRzZXRfc2V0dXAodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIsIHUxMzJfaGNkX2luaXRpYWxfc2V0dXBfc2VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+dXNiX2FkZHIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHRdOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X3NldHVwKHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwgMCwgMHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9lbnVtZXJhdGlvbl9hZGRyZXNzX3NlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfbmV4dF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmluX3VzZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gZWRzZXRfc2V0dXAodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIsIHUxMzJfaGNkX2NvbmZpZ3VyZV9zZXR1cF9zZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChlbmRwLT5pbnB1dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmluZy0+aW5fdXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbmV4dF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmFjdGl2ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmluX3VzZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X2lucHV0KHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBlbmRwLT50b2dnbGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9idWxrX2lucHV0X3JlY3YpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLyogb3V0cHV0IHBpcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJpbmctPmluX3VzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0WwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9vdXRwdXQodTEzMiwgcmluZywgZW5kcCwgdXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGVuZHAtPnRvZ2dsZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2J1bGtfb3V0cHV0X3NlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisJbXV0ZXhfbG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCXJpbmcgPSBlbmRwLT5yaW5nOworCWlmIChlbmRwLT5lZHNldF9mbHVzaCkgeworCQllbmRwLT5lZHNldF9mbHVzaCA9IDA7CisJCWlmIChlbmRwLT5kZXF1ZXVlaW5nKQorCQkJdXNiX2Z0ZGlfZWxhbl9lZHNldF9mbHVzaCh1MTMyLT5wbGF0Zm9ybV9kZXYsCisJCQkJcmluZy0+bnVtYmVyLCBlbmRwKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+YWN0aXZlKSB7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQl1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHJpbmctPmluX3VzZSkgeworCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlbmRwLT5xdWV1ZV9uZXh0ID09IGVuZHAtPnF1ZXVlX2xhc3QpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZW5kcC0+cGlwZXR5cGUgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJCWlmIChyaW5nLT5pbl91c2UpIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaW50IHJldHZhbDsKKwkJCXN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisJCQkJZW5kcC0+cXVldWVfbmV4dF07CisJCQllbmRwLT5hY3RpdmUgPSAxOworCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCXJpbmctPmluX3VzZSA9IDE7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXJldHZhbCA9IGVkc2V0X3NpbmdsZSh1MTMyLCByaW5nLCBlbmRwLCB1cmIsIGFkZHJlc3MsCisJCQkJZW5kcC0+dG9nZ2xlX2JpdHMsIHUxMzJfaGNkX2ludGVycnVwdF9yZWN2KTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChlbmRwLT5waXBldHlwZSA9PSBQSVBFX0NPTlRST0wpIHsKKwkJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisJCWlmIChyaW5nLT5pbl91c2UpIHsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKGFkZHJlc3MgPT0gMCkgeworCQkJaW50IHJldHZhbDsKKwkJCXN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisJCQkJZW5kcC0+cXVldWVfbmV4dF07CisJCQllbmRwLT5hY3RpdmUgPSAxOworCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCXJpbmctPmluX3VzZSA9IDE7CisJCQltdXRleF91bmxvY2soJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKwkJCXJldHZhbCA9IGVkc2V0X3NldHVwKHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwgYWRkcmVzcywKKwkJCQkweDIsIHUxMzJfaGNkX2luaXRpYWxfc2V0dXBfc2VudCk7CisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChlbmRwLT51c2JfYWRkciA9PSAwKSB7CisJCQlpbnQgcmV0dmFsOworCQkJc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKwkJCQllbmRwLT5xdWV1ZV9uZXh0XTsKKwkJCWVuZHAtPmFjdGl2ZSA9IDE7CisJCQlyaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworCQkJcmluZy0+aW5fdXNlID0gMTsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJcmV0dmFsID0gZWRzZXRfc2V0dXAodTEzMiwgcmluZywgZW5kcCwgdXJiLCAwLCAweDIsCisJCQkJdTEzMl9oY2RfZW51bWVyYXRpb25fYWRkcmVzc19zZW50KTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCQl1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaW50IHJldHZhbDsKKwkJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCQkJc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKwkJCQllbmRwLT5xdWV1ZV9uZXh0XTsKKwkJCWVuZHAtPmFjdGl2ZSA9IDE7CisJCQlyaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworCQkJcmluZy0+aW5fdXNlID0gMTsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJcmV0dmFsID0gZWRzZXRfc2V0dXAodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAorCQkJCTB4MiwgdTEzMl9oY2RfY29uZmlndXJlX3NldHVwX3NlbnQpOworCQkJaWYgKHJldHZhbCAhPSAwKQorCQkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZW5kcC0+aW5wdXQpIHsKKwkJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCQkJaWYgKHJpbmctPmluX3VzZSkgeworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWludCByZXR2YWw7CisJCQkJc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbCisJCQkJCUVORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdOworCQkJCWVuZHAtPmFjdGl2ZSA9IDE7CisJCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCQlyaW5nLT5pbl91c2UgPSAxOworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXJldHZhbCA9IGVkc2V0X2lucHV0KHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwKKwkJCQkJYWRkcmVzcywgZW5kcC0+dG9nZ2xlX2JpdHMsCisJCQkJCXUxMzJfaGNkX2J1bGtfaW5wdXRfcmVjdik7CisJCQkJaWYgKHJldHZhbCA9PSAwKSB7CisJCQkJfSBlbHNlCisJCQkJCXUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisJCQkJCQlyZXR2YWwpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsJLyogb3V0cHV0IHBpcGUgKi8KKwkJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworCQkJaWYgKHJpbmctPmluX3VzZSkgeworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWludCByZXR2YWw7CisJCQkJc3RydWN0IHVyYiAqdXJiID0gZW5kcC0+dXJiX2xpc3RbCisJCQkJCUVORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdOworCQkJCWVuZHAtPmFjdGl2ZSA9IDE7CisJCQkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwkJCQlyaW5nLT5pbl91c2UgPSAxOworCQkJCW11dGV4X3VubG9jaygmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCQkJCXJldHZhbCA9IGVkc2V0X291dHB1dCh1MTMyLCByaW5nLCBlbmRwLCB1cmIsCisJCQkJCWFkZHJlc3MsIGVuZHAtPnRvZ2dsZV9iaXRzLAorCQkJCQl1MTMyX2hjZF9idWxrX291dHB1dF9zZW50KTsKKwkJCQlpZiAocmV0dmFsID09IDApIHsKKwkJCQl9IGVsc2UKKwkJCQkJdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKKwkJCQkJCXJldHZhbCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQogfQogI2lmZGVmIENPTkZJR19QTQogCiBzdGF0aWMgdm9pZCBwb3J0X3Bvd2VyKHN0cnVjdCB1MTMyICp1MTMyLCBpbnQgcG4sIGludCBpc19vbikKIHsKLSAgICAgICAgdTEzMi0+cG9ydFtwbl0ucG93ZXIgPSBpc19vbjsKKwl1MTMyLT5wb3J0W3BuXS5wb3dlciA9IGlzX29uOwogfQogCiAjZW5kaWYKIAogc3RhdGljIHZvaWQgdTEzMl9wb3dlcihzdHJ1Y3QgdTEzMiAqdTEzMiwgaW50IGlzX29uKQogewotICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMikKLSAgICAgICAgICAgICAgICA7ICAgICAgICAvKiBodWIgaXMgaW5hY3RpdmUgdW5sZXNzIHRoZSBwb3J0IGlzIHBvd2VyZWQgKi8KLSAgICAgICAgaWYgKGlzX29uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHUxMzItPnBvd2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIHUxMzItPnBvd2VyID0gMTsKLSAgICAgICAgICAgICAgICBoY2QtPnNlbGYuY29udHJvbGxlci0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHUxMzItPnBvd2VyID0gMDsKLSAgICAgICAgICAgICAgICBoY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKLSAgICAgICAgICAgICAgICBoY2QtPnNlbGYuY29udHJvbGxlci0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMikKKwkJOwkvKiBodWIgaXMgaW5hY3RpdmUgdW5sZXNzIHRoZSBwb3J0IGlzIHBvd2VyZWQgKi8KKwlpZiAoaXNfb24pIHsKKwkJaWYgKHUxMzItPnBvd2VyKQorCQkJcmV0dXJuOworCQl1MTMyLT5wb3dlciA9IDE7CisJfSBlbHNlIHsKKwkJdTEzMi0+cG93ZXIgPSAwOworCQloY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl9wZXJpb2RpY19yZWluaXQoc3RydWN0IHUxMzIgKnUxMzIpCiB7Ci0gICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgIHUzMiBmaSA9IHUxMzItPmhjX2ZtaW50ZXJ2YWwgJiAweDAzZmZmOwotICAgICAgICB1MzIgZml0OwotICAgICAgICB1MzIgZm1pbnRlcnZhbDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBmbWludGVydmFsLCAmZm1pbnRlcnZhbCk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgZml0ID0gZm1pbnRlcnZhbCAmIEZJVDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZm1pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAoZml0IF4gRklUKSB8IHUxMzItPmhjX2ZtaW50ZXJ2YWwpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHBlcmlvZGljc3RhcnQsCi0gICAgICAgICAgICAgICAgKCg5ICpmaSkgLyAxMCkgJiAweDNmZmYpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHVybiAwOworCWludCByZXR2YWw7CisJdTMyIGZpID0gdTEzMi0+aGNfZm1pbnRlcnZhbCAmIDB4MDNmZmY7CisJdTMyIGZpdDsKKwl1MzIgZm1pbnRlcnZhbDsKKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtaW50ZXJ2YWwsICZmbWludGVydmFsKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWZpdCA9IGZtaW50ZXJ2YWwgJiBGSVQ7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZm1pbnRlcnZhbCwKKwkJKGZpdCBeIEZJVCkgfCB1MTMyLT5oY19mbWludGVydmFsKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHBlcmlvZGljc3RhcnQsCisJCSgoOSAqIGZpKSAvIDEwKSAmIDB4M2ZmZik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNoYXIgKmhjZnMyc3RyaW5nKGludCBzdGF0ZSkKIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIE9IQ0lfVVNCX1JFU0VUOgotICAgICAgICAgICAgICAgIHJldHVybiAicmVzZXQiOwotICAgICAgICBjYXNlIE9IQ0lfVVNCX1JFU1VNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gInJlc3VtZSI7Ci0gICAgICAgIGNhc2UgT0hDSV9VU0JfT1BFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9wZXJhdGlvbmFsIjsKLSAgICAgICAgY2FzZSBPSENJX1VTQl9TVVNQRU5EOgotICAgICAgICAgICAgICAgIHJldHVybiAic3VzcGVuZCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICI/IjsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBPSENJX1VTQl9SRVNFVDoKKwkJcmV0dXJuICJyZXNldCI7CisJY2FzZSBPSENJX1VTQl9SRVNVTUU6CisJCXJldHVybiAicmVzdW1lIjsKKwljYXNlIE9IQ0lfVVNCX09QRVI6CisJCXJldHVybiAib3BlcmF0aW9uYWwiOworCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoKKwkJcmV0dXJuICJzdXNwZW5kIjsKKwl9CisJcmV0dXJuICI/IjsKIH0KIAogc3RhdGljIGludCB1MTMyX2luaXQoc3RydWN0IHUxMzIgKnUxMzIpCiB7Ci0gICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgIHUzMiBjb250cm9sOwotICAgICAgICB1MTMyX2Rpc2FibGUodTEzMik7Ci0gICAgICAgIHUxMzItPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBpbnRyZGlzYWJsZSwgT0hDSV9JTlRSX01JRSk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgaWYgKHUxMzItPm51bV9wb3J0cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdTMyIHJoX2EgPSAtMTsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgJnJoX2EpOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgIHUxMzItPm51bV9wb3J0cyA9IHJoX2EgJiBSSF9BX05EUDsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByZWFkX3Jvb3RodWJfaW5mbyh1MTMyKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAodTEzMi0+bnVtX3BvcnRzID4gTUFYX1UxMzJfUE9SVFMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKwlpbnQgcmV0dmFsOworCXUzMiBjb250cm9sOworCXUxMzJfZGlzYWJsZSh1MTMyKTsKKwl1MTMyLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllczsKKwlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBpbnRyZGlzYWJsZSwgT0hDSV9JTlRSX01JRSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWlmICh1MTMyLT5udW1fcG9ydHMgPT0gMCkgeworCQl1MzIgcmhfYSA9IC0xOworCQlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgJnJoX2EpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJdTEzMi0+bnVtX3BvcnRzID0gcmhfYSAmIFJIX0FfTkRQOworCQlyZXR2YWwgPSByZWFkX3Jvb3RodWJfaW5mbyh1MTMyKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCWlmICh1MTMyLT5udW1fcG9ydHMgPiBNQVhfVTEzMl9QT1JUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xNjEzLDQ3NyArMTYwMywyNzggQEAKICovCiBzdGF0aWMgaW50IHUxMzJfcnVuKHN0cnVjdCB1MTMyICp1MTMyKQogewotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICB1MzIgY29udHJvbDsKLSAgICAgICAgdTMyIHN0YXR1czsKLSAgICAgICAgdTMyIGZtaW50ZXJ2YWw7Ci0gICAgICAgIHUzMiBwZXJpb2RpY3N0YXJ0OwotICAgICAgICB1MzIgY21kc3RhdHVzOwotICAgICAgICB1MzIgcm9vdGh1Yl9hOwotICAgICAgICBpbnQgbWFzayA9IE9IQ0lfSU5UUl9JTklUOwotICAgICAgICBpbnQgZmlyc3QgPSB1MTMyLT5oY19mbWludGVydmFsID09IDA7Ci0gICAgICAgIGludCBzbGVlcF90aW1lID0gMDsKLSAgICAgICAgaW50IHJlc2V0X3RpbWVvdXQgPSAzMDsgICAgICAgIC8qIC4uLiBhbGxvdyBleHRyYSB0aW1lICovCi0gICAgICAgIHUxMzJfZGlzYWJsZSh1MTMyKTsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgdTMyIHRlbXA7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBmbWludGVydmFsLCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgdTEzMi0+aGNfZm1pbnRlcnZhbCA9IHRlbXAgJiAweDNmZmY7Ci0gICAgICAgICAgICAgICAgaWYgKHUxMzItPmhjX2ZtaW50ZXJ2YWwgIT0gRkkpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdTEzMi0+aGNfZm1pbnRlcnZhbCB8PSBGU01QKHUxMzItPmhjX2ZtaW50ZXJ2YWwpIDw8IDE2OwotICAgICAgICB9Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJnUxMzItPmhjX2NvbnRyb2wpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIGRldl9pbmZvKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJlc2V0dGluZyBmcm9tIHN0YXRlICclcycsIGNvbnRyb2wgIgotICAgICAgICAgICAgICAgICI9ICUwOFhcbiIsIGhjZnMyc3RyaW5nKHUxMzItPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfSENGUyksCi0gICAgICAgICAgICAgICAgdTEzMi0+aGNfY29udHJvbCk7Ci0gICAgICAgIHN3aXRjaCAodTEzMi0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKSB7Ci0gICAgICAgIGNhc2UgT0hDSV9VU0JfT1BFUjoKLSAgICAgICAgICAgICAgICBzbGVlcF90aW1lID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSENJX1VTQl9TVVNQRU5EOgotICAgICAgICBjYXNlIE9IQ0lfVVNCX1JFU1VNRToKLSAgICAgICAgICAgICAgICB1MTMyLT5oY19jb250cm9sICY9IE9IQ0lfQ1RSTF9SV0M7Ci0gICAgICAgICAgICAgICAgdTEzMi0+aGNfY29udHJvbCB8PSBPSENJX1VTQl9SRVNVTUU7Ci0gICAgICAgICAgICAgICAgc2xlZXBfdGltZSA9IDEwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHUxMzItPmhjX2NvbnRyb2wgJj0gT0hDSV9DVFJMX1JXQzsKLSAgICAgICAgICAgICAgICB1MTMyLT5oY19jb250cm9sIHw9IE9IQ0lfVVNCX1JFU0VUOwotICAgICAgICAgICAgICAgIHNsZWVwX3RpbWUgPSA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICBtc2xlZXAoc2xlZXBfdGltZSk7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5hLCAmcm9vdGh1Yl9hKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICBpZiAoIShyb290aHViX2EgJiBSSF9BX05QUykpIHsKLSAgICAgICAgICAgICAgICBpbnQgdGVtcDsgICAgICAgIC8qIHBvd2VyIGRvd24gZWFjaCBwb3J0ICovCi0gICAgICAgICAgICAgICAgZm9yICh0ZW1wID0gMDsgdGVtcCA8IHUxMzItPm51bV9wb3J0czsgdGVtcCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290aHViLnBvcnRzdGF0dXNbdGVtcF0sIFJIX1BTX0xTREEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgIHJldHJ5OnJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY21kc3RhdHVzLCAmc3RhdHVzKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsIE9IQ0lfSENSKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgZXh0cmE6ewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY21kc3RhdHVzLCAmc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSAoc3RhdHVzICYgT0hDSV9IQ1IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1yZXNldF90aW1lb3V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJVU0IgSEMgcmVzZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aW1lZCBvdXQhXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXh0cmE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfSU5JVFJFU0VUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgY29udHJvbCwgdTEzMi0+aGNfY29udHJvbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZWRfY29udHJvbGhlYWQsIDB4MDAwMDAwMDApOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGVkX2J1bGtoZWFkLCAweDExMDAwMDAwKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBoY2NhLCAweDAwMDAwMDAwKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3BlcmlvZGljX3JlaW5pdCh1MTMyKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtaW50ZXJ2YWwsICZmbWludGVydmFsKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHBlcmlvZGljc3RhcnQsICZwZXJpb2RpY3N0YXJ0KTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICBpZiAoMCA9PSAoZm1pbnRlcnZhbCAmIDB4M2ZmZjAwMDApIHx8IDAgPT0gcGVyaW9kaWNzdGFydCkgewotICAgICAgICAgICAgICAgIGlmICghKHUxMzItPmZsYWdzICYgT0hDSV9RVUlSS19JTklUUkVTRVQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5mbGFncyB8PSBPSENJX1FVSVJLX0lOSVRSRVNFVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImluaXQgZXJyKCUwOHggJTA0eCkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIsIGZtaW50ZXJ2YWwsIHBlcmlvZGljc3RhcnQpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgY29udHJvbGxlciBvcGVyYXRpb25zICovCi0gICAgICAgIHUxMzItPmhjX2NvbnRyb2wgJj0gT0hDSV9DVFJMX1JXQzsKLSAgICAgICAgdTEzMi0+aGNfY29udHJvbCB8PSBPSENJX0NPTlRST0xfSU5JVCB8IE9IQ0lfQ1RSTF9CTEUgfCBPSENJX1VTQl9PUEVSOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsIE9IQ0lfQkxGKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNtZHN0YXR1cywgJmNtZHN0YXR1cyk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgdTEzMl90b19oY2QodTEzMiktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKLSAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5zdGF0dXMsIFJIX0hTX0RSV0UpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJzdGF0dXMsIG1hc2spOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJkaXNhYmxlLAotICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfT0MgfCBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9GTk8gfAotICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9SRCB8IE9IQ0lfSU5UUl9TRiB8IE9IQ0lfSU5UUl9XREggfAotICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9TTyk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsgICAgICAgIC8qIGhhbmRsZSByb290IGh1YiBpbml0IHF1aXJrcyAuLi4gKi8KLSAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyb290aHViX2EpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJvb3RodWJfYSAmPSB+KFJIX0FfUFNNIHwgUkhfQV9PQ1BNKTsKLSAgICAgICAgaWYgKHUxMzItPmZsYWdzICYgT0hDSV9RVUlSS19TVVBFUklPKSB7Ci0gICAgICAgICAgICAgICAgcm9vdGh1Yl9hIHw9IFJIX0FfTk9DUDsKLSAgICAgICAgICAgICAgICByb290aHViX2EgJj0gfihSSF9BX1BPVFBHVCB8IFJIX0FfTlBTKTsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLmEsIHJvb3RodWJfYSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHUxMzItPmZsYWdzICYgT0hDSV9RVUlSS19BTUQ3NTYpIHx8IGRpc3RydXN0X2Zpcm13YXJlKSB7Ci0gICAgICAgICAgICAgICAgcm9vdGh1Yl9hIHw9IFJIX0FfTlBTOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgcm9vdGh1Yl9hKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQotICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLnN0YXR1cywgUkhfSFNfTFBTQyk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5iLAotICAgICAgICAgICAgICAgIChyb290aHViX2EgJiBSSF9BX05QUykgPyAwIDogUkhfQl9QUENNKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKLSAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICBtZGVsYXkoKHJvb3RodWJfYSA+PiAyMykgJiAweDFmZSk7Ci0gICAgICAgIHUxMzJfdG9faGNkKHUxMzIpLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7Ci0gICAgICAgIHJldHVybiAwOworCWludCByZXR2YWw7CisJdTMyIGNvbnRyb2w7CisJdTMyIHN0YXR1czsKKwl1MzIgZm1pbnRlcnZhbDsKKwl1MzIgcGVyaW9kaWNzdGFydDsKKwl1MzIgY21kc3RhdHVzOworCXUzMiByb290aHViX2E7CisJaW50IG1hc2sgPSBPSENJX0lOVFJfSU5JVDsKKwlpbnQgZmlyc3QgPSB1MTMyLT5oY19mbWludGVydmFsID09IDA7CisJaW50IHNsZWVwX3RpbWUgPSAwOworCWludCByZXNldF90aW1lb3V0ID0gMzA7CS8qIC4uLiBhbGxvdyBleHRyYSB0aW1lICovCisJdTEzMl9kaXNhYmxlKHUxMzIpOworCWlmIChmaXJzdCkgeworCQl1MzIgdGVtcDsKKwkJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBmbWludGVydmFsLCAmdGVtcCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQl1MTMyLT5oY19mbWludGVydmFsID0gdGVtcCAmIDB4M2ZmZjsKKwkJdTEzMi0+aGNfZm1pbnRlcnZhbCB8PSBGU01QKHUxMzItPmhjX2ZtaW50ZXJ2YWwpIDw8IDE2OworCX0KKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZ1MTMyLT5oY19jb250cm9sKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWRldl9pbmZvKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJlc2V0dGluZyBmcm9tIHN0YXRlICclcycsIGNvbnRyb2wgIgorCQkiPSAlMDhYXG4iLCBoY2ZzMnN0cmluZyh1MTMyLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpLAorCQl1MTMyLT5oY19jb250cm9sKTsKKwlzd2l0Y2ggKHUxMzItPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfSENGUykgeworCWNhc2UgT0hDSV9VU0JfT1BFUjoKKwkJc2xlZXBfdGltZSA9IDA7CisJCWJyZWFrOworCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoKKwljYXNlIE9IQ0lfVVNCX1JFU1VNRToKKwkJdTEzMi0+aGNfY29udHJvbCAmPSBPSENJX0NUUkxfUldDOworCQl1MTMyLT5oY19jb250cm9sIHw9IE9IQ0lfVVNCX1JFU1VNRTsKKwkJc2xlZXBfdGltZSA9IDEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1MTMyLT5oY19jb250cm9sICY9IE9IQ0lfQ1RSTF9SV0M7CisJCXUxMzItPmhjX2NvbnRyb2wgfD0gT0hDSV9VU0JfUkVTRVQ7CisJCXNsZWVwX3RpbWUgPSA1MDsKKwkJYnJlYWs7CisJfQorCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGNvbnRyb2wsIHUxMzItPmhjX2NvbnRyb2wpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltc2xlZXAoc2xlZXBfdGltZSk7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyb290aHViX2EpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKCEocm9vdGh1Yl9hICYgUkhfQV9OUFMpKSB7CisJCWludCB0ZW1wOwkvKiBwb3dlciBkb3duIGVhY2ggcG9ydCAqLworCQlmb3IgKHRlbXAgPSAwOyB0ZW1wIDwgdTEzMi0+bnVtX3BvcnRzOyB0ZW1wKyspIHsKKwkJCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsCisJCQkJcm9vdGh1Yi5wb3J0c3RhdHVzW3RlbXBdLCBSSF9QU19MU0RBKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworcmV0cnk6CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsICZzdGF0dXMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgY21kc3RhdHVzLCBPSENJX0hDUik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKK2V4dHJhOgl7CisJCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY21kc3RhdHVzLCAmc3RhdHVzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWlmICgwICE9IChzdGF0dXMgJiBPSENJX0hDUikpIHsKKwkJCWlmICgtLXJlc2V0X3RpbWVvdXQgPT0gMCkgeworCQkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiVVNCIEhDIHJlc2V0IgorCQkJCQkiIHRpbWVkIG91dCFcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfSBlbHNlIHsKKwkJCQltc2xlZXAoNSk7CisJCQkJZ290byBleHRyYTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodTEzMi0+ZmxhZ3MgJiBPSENJX1FVSVJLX0lOSVRSRVNFVCkgeworCQlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJmNvbnRyb2wpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZWRfY29udHJvbGhlYWQsIDB4MDAwMDAwMDApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgZWRfYnVsa2hlYWQsIDB4MTEwMDAwMDApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgaGNjYSwgMHgwMDAwMDAwMCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1MTMyX3BlcmlvZGljX3JlaW5pdCh1MTMyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgZm1pbnRlcnZhbCwgJmZtaW50ZXJ2YWwpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBwZXJpb2RpY3N0YXJ0LCAmcGVyaW9kaWNzdGFydCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAoMCA9PSAoZm1pbnRlcnZhbCAmIDB4M2ZmZjAwMDApIHx8IDAgPT0gcGVyaW9kaWNzdGFydCkgeworCQlpZiAoISh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfSU5JVFJFU0VUKSkgeworCQkJdTEzMi0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19JTklUUkVTRVQ7CisJCQlnb3RvIHJldHJ5OworCQl9IGVsc2UKKwkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiaW5pdCBlcnIoJTA4eCAlMDR4KSIKKwkJCQkiXG4iLCBmbWludGVydmFsLCBwZXJpb2RpY3N0YXJ0KTsKKwl9CQkJLyogc3RhcnQgY29udHJvbGxlciBvcGVyYXRpb25zICovCisJdTEzMi0+aGNfY29udHJvbCAmPSBPSENJX0NUUkxfUldDOworCXUxMzItPmhjX2NvbnRyb2wgfD0gT0hDSV9DT05UUk9MX0lOSVQgfCBPSENJX0NUUkxfQkxFIHwgT0hDSV9VU0JfT1BFUjsKKwlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGNtZHN0YXR1cywgT0hDSV9CTEYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsICZjbWRzdGF0dXMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwl1MTMyX3RvX2hjZCh1MTMyKS0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLCBSSF9IU19EUldFKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJzdGF0dXMsIG1hc2spOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgaW50cmRpc2FibGUsCisJCU9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfT0MgfCBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9GTk8gfAorCQlPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfUkQgfCBPSENJX0lOVFJfU0YgfCBPSENJX0lOVFJfV0RIIHwKKwkJT0hDSV9JTlRSX1NPKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwkvKiBoYW5kbGUgcm9vdCBodWIgaW5pdCBxdWlya3MgLi4uICovCisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyb290aHViX2EpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcm9vdGh1Yl9hICY9IH4oUkhfQV9QU00gfCBSSF9BX09DUE0pOworCWlmICh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfU1VQRVJJTykgeworCQlyb290aHViX2EgfD0gUkhfQV9OT0NQOworCQlyb290aHViX2EgJj0gfihSSF9BX1BPVFBHVCB8IFJIX0FfTlBTKTsKKwkJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5hLCByb290aHViX2EpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9IGVsc2UgaWYgKCh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfQU1ENzU2KSB8fCBkaXN0cnVzdF9maXJtd2FyZSkgeworCQlyb290aHViX2EgfD0gUkhfQV9OUFM7CisJCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgcm9vdGh1Yl9hKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLCBSSF9IU19MUFNDKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuYiwKKwkJKHJvb3RodWJfYSAmIFJIX0FfTlBTKSA/IDAgOiBSSF9CX1BQQ00pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZGVsYXkoKHJvb3RodWJfYSA+PiAyMykgJiAweDFmZSk7CisJdTEzMl90b19oY2QodTEzMiktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdTEzMl9oY2Rfc3RvcChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInUxMzIgZGV2aWNlICVwKGhjZD0lcCkgaGFzIGIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZWVuIHJlbW92ZWQgJWRcbiIsIHUxMzIsIGhjZCwgdTEzMi0+Z29pbmcpOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBpcyBiZWluZyByZW1vdiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJlZFxuIiwgaGNkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKLSAgICAgICAgICAgICAgICB1MTMyX3Bvd2VyKHUxMzIsIDApOwotICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInUxMzIgZGV2aWNlICVwKGhjZD0lcCkgaGFzIGIiCisJCQkiZWVuIHJlbW92ZWQgJWRcbiIsIHUxMzIsIGhjZCwgdTEzMi0+Z29pbmcpOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBpcyBiZWluZyByZW1vdiIKKwkJCSJlZFxuIiwgaGNkKTsKKwl9IGVsc2UgeworCQltdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKKwkJbXNsZWVwKDEwMCk7CisJCXUxMzJfcG93ZXIodTEzMiwgMCk7CisJCW11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7CisJfQogfQogCiBzdGF0aWMgaW50IHUxMzJfaGNkX3N0YXJ0KHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UgaWYgKGhjZC0+c2VsZi5jb250cm9sbGVyKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX3BsYXRmb3JtX2RldmljZShoY2QtPnNlbGYuY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgdTE2IHZlbmRvciA9ICgoc3RydWN0IHUxMzJfcGxhdGZvcm1fZGF0YSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSktPnZlbmRvcjsKLSAgICAgICAgICAgICAgICB1MTYgZGV2aWNlID0gKChzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICopCi0gICAgICAgICAgICAgICAgICAgICAgICAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKS0+ZGV2aWNlOwotICAgICAgICAgICAgICAgIG11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOwotICAgICAgICAgICAgICAgIG1zbGVlcCgxMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCAmJiBkZXZpY2UgPT0gMHg3NDBjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5mbGFncyA9IE9IQ0lfUVVJUktfQU1ENzU2OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfT1BUSSAmJiBkZXZpY2UgPT0gMHhjODYxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIldBUk5JTkc6IE9QVGkgd29ya2FyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3VuZHMgdW5hdmFpbGFibGVcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ09NUEFRICYmIGRldmljZSA9PSAweGEwZjgpCi0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5mbGFncyB8PSBPSENJX1FVSVJLX1pGTUlDUk87Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9ydW4odTEzMik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKLSAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJwbGF0Zm9ybV9kZXZpY2UgbWlzc2luZ1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0gZWxzZSBpZiAoaGNkLT5zZWxmLmNvbnRyb2xsZXIpIHsKKwkJaW50IHJldHZhbDsKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9CisJCQl0b19wbGF0Zm9ybV9kZXZpY2UoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOworCQl1MTYgdmVuZG9yID0gKChzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICopCisJCQkocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKS0+dmVuZG9yOworCQl1MTYgZGV2aWNlID0gKChzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICopCisJCQkocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKS0+ZGV2aWNlOworCQltdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKKwkJbXNsZWVwKDEwKTsKKwkJaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCAmJiBkZXZpY2UgPT0gMHg3NDBjKSB7CisJCQl1MTMyLT5mbGFncyA9IE9IQ0lfUVVJUktfQU1ENzU2OworCQl9IGVsc2UgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX09QVEkgJiYgZGV2aWNlID09IDB4Yzg2MSkgeworCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJXQVJOSU5HOiBPUFRpIHdvcmthciIKKwkJCQkib3VuZHMgdW5hdmFpbGFibGVcbiIpOworCQl9IGVsc2UgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSAmJiBkZXZpY2UgPT0gMHhhMGY4KQorCQkJdTEzMi0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19aRk1JQ1JPOworCQlyZXR2YWwgPSB1MTMyX3J1bih1MTMyKTsKKwkJaWYgKHJldHZhbCkgeworCQkJdTEzMl9kaXNhYmxlKHUxMzIpOworCQkJdTEzMi0+Z29pbmcgPSAxOworCQl9CisJCW1zbGVlcCgxMDApOworCQltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAicGxhdGZvcm1fZGV2aWNlIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl9oY2RfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX2luaXQodTEzMik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0gZWxzZSB7CisJCWludCByZXR2YWw7CisJCW11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR2YWwgPSB1MTMyX2luaXQodTEzMik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXUxMzJfZGlzYWJsZSh1MTMyKTsKKwkJCXUxMzItPmdvaW5nID0gMTsKKwkJfQorCQltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KIH0KIAogc3RhdGljIGludCBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2ludChzdHJ1Y3QgdTEzMiAqdTEzMiwKIAlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2LCBzdHJ1Y3QgdXJiICp1cmIsCi0gICAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1OCB1c2JfYWRkciwgdTggdXNiX2VuZHAsIHU4IGFkZHJlc3MsCi0gICAgICAgIGdmcF90IG1lbV9mbGFncykKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdTggdXNiX2FkZHIsIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzLAorCWdmcF90IG1lbV9mbGFncykKIHsKLSAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZzsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOwotCWludCByYzsKLQl1OCBlbmRwX251bWJlcjsKLQlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfZW5kcCksIG1lbV9mbGFncyk7Ci0KLSAgICAgICAgaWYgKCFlbmRwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQotCXNwaW5fbG9ja19pbml0KCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0JcmMgPSB1c2JfaGNkX2xpbmtfdXJiX3RvX2VwKHUxMzJfdG9faGNkKHUxMzIpLCB1cmIpOwotCWlmIChyYykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLQkJa2ZyZWUoZW5kcCk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQllbmRwX251bWJlciA9ICsrdTEzMi0+bnVtX2VuZHBvaW50czsKLQl1cmItPmVwLT5oY3ByaXYgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV0gPSBlbmRwOwotICAgICAgICBJTklUX0RFTEFZRURfV09SSygmZW5kcC0+c2NoZWR1bGVyLCB1MTMyX2hjZF9lbmRwX3dvcmtfc2NoZWR1bGVyKTsKLSAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPnVyYl9tb3JlKTsKLSAgICAgICAgcmluZyA9IGVuZHAtPnJpbmcgPSAmdTEzMi0+cmluZ1swXTsKLSAgICAgICAgaWYgKHJpbmctPmN1cnJfZW5kcCkgewotICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJmVuZHAtPmVuZHBfcmluZywgJnJpbmctPmN1cnJfZW5kcC0+ZW5kcF9yaW5nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmZW5kcC0+ZW5kcF9yaW5nKTsKLSAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOwotICAgICAgICB9Ci0gICAgICAgIHJpbmctPmxlbmd0aCArPSAxOwotICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKLSAgICAgICAgZW5kcC0+ZWRzZXRfZmx1c2ggPSAwOwotICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOwotICAgICAgICBlbmRwLT5kZWxheWVkID0gMDsKLSAgICAgICAgZW5kcC0+ZW5kcF9udW1iZXIgPSBlbmRwX251bWJlcjsKLSAgICAgICAgZW5kcC0+dTEzMiA9IHUxMzI7Ci0JZW5kcC0+aGVwID0gdXJiLT5lcDsKLSAgICAgICAgZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKLSAgICAgICAgdTEzMl9lbmRwX2luaXRfa3JlZih1MTMyLCBlbmRwKTsKLSAgICAgICAgaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgewotICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOwotICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgdXNiX2VuZHAsIDAsIDApOwotICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID0gMTsKLSAgICAgICAgICAgICAgICBlbmRwLT5vdXRwdXQgPSAwOwotICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKLSAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIHVzYl9lbmRwLCAxLCAwKTsKLSAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA9IDA7Ci0gICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID0gMTsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7Ci0gICAgICAgICAgICAgICAgdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOwotICAgICAgICB9Ci0gICAgICAgIHVyYi0+aGNwcml2ID0gdTEzMjsKLSAgICAgICAgZW5kcC0+ZGVsYXllZCA9IDE7Ci0gICAgICAgIGVuZHAtPmppZmZpZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKTsKLSAgICAgICAgZW5kcC0+dWRldl9udW1iZXIgPSBhZGRyZXNzOwotICAgICAgICBlbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOwotICAgICAgICBlbmRwLT51c2JfZW5kcCA9IHVzYl9lbmRwOwotICAgICAgICBlbmRwLT5xdWV1ZV9zaXplID0gMTsKLSAgICAgICAgZW5kcC0+cXVldWVfbGFzdCA9IDA7Ci0gICAgICAgIGVuZHAtPnF1ZXVlX25leHQgPSAwOwotICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLSAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKSk7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHF1ZXVlX2ludF9vbl9vbGRfZW5kcG9pbnQoc3RydWN0IHUxMzIgKnUxMzIsCi0Jc3RydWN0IHUxMzJfdWRldiAqdWRldiwgc3RydWN0IHVyYiAqdXJiLAotICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCi0gICAgICAgIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzKQotewotICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7Ci0gICAgICAgIGVuZHAtPmRlbGF5ZWQgPSAxOwotICAgICAgICBlbmRwLT5qaWZmaWVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCk7Ci0gICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOwotICAgICAgICAgICAgICAgIGlmICh1cmJxID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwgJmVuZHAtPnVyYl9tb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYnEtPnVyYiA9IHVyYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9idWxrKHN0cnVjdCB1MTMyICp1MTMyLAotCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsIHN0cnVjdCB1cmIgKnVyYiwKLSAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHU4IHVzYl9hZGRyLCB1OCB1c2JfZW5kcCwgdTggYWRkcmVzcywKLSAgICAgICAgZ2ZwX3QgbWVtX2ZsYWdzKQotewotICAgICAgICBpbnQgcmluZ19udW1iZXI7Ci0gICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaXJxczsKLQlpbnQgcmM7Ci0JdTggZW5kcF9udW1iZXI7Ci0Jc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX2VuZHApLCBtZW1fZmxhZ3MpOwotCi0gICAgICAgIGlmICghZW5kcCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICB9Ci0KLQlzcGluX2xvY2tfaW5pdCgmZW5kcC0+cXVldWVfbG9jay5zbG9jayk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotCXJjID0gdXNiX2hjZF9saW5rX3VyYl90b19lcCh1MTMyX3RvX2hjZCh1MTMyKSwgdXJiKTsKLQlpZiAocmMpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0JCWtmcmVlKGVuZHApOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JZW5kcF9udW1iZXIgPSArK3UxMzItPm51bV9lbmRwb2ludHM7Ci0JdXJiLT5lcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gZW5kcDsKLSAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcik7Ci0gICAgICAgIElOSVRfTElTVF9IRUFEKCZlbmRwLT51cmJfbW9yZSk7Ci0gICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOwotICAgICAgICBlbmRwLT5lZHNldF9mbHVzaCA9IDA7Ci0gICAgICAgIGVuZHAtPmFjdGl2ZSA9IDA7Ci0gICAgICAgIGVuZHAtPmRlbGF5ZWQgPSAwOwotICAgICAgICBlbmRwLT5lbmRwX251bWJlciA9IGVuZHBfbnVtYmVyOwotICAgICAgICBlbmRwLT51MTMyID0gdTEzMjsKLQllbmRwLT5oZXAgPSB1cmItPmVwOwotICAgICAgICBlbmRwLT5waXBldHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOwotICAgICAgICB1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOwotICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0gICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7Ci0gICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCB1c2JfZW5kcCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgcmluZ19udW1iZXIgPSAzOwotICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID0gMTsKLSAgICAgICAgICAgICAgICBlbmRwLT5vdXRwdXQgPSAwOwotICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKLSAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIHVzYl9lbmRwLCAxLCAwKTsKLSAgICAgICAgICAgICAgICByaW5nX251bWJlciA9IDI7Ci0gICAgICAgICAgICAgICAgZW5kcC0+aW5wdXQgPSAwOwotICAgICAgICAgICAgICAgIGVuZHAtPm91dHB1dCA9IDE7Ci0gICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgfQotICAgICAgICByaW5nID0gZW5kcC0+cmluZyA9ICZ1MTMyLT5yaW5nW3JpbmdfbnVtYmVyIC0gMV07Ci0gICAgICAgIGlmIChyaW5nLT5jdXJyX2VuZHApIHsKLSAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZlbmRwLT5lbmRwX3JpbmcsICZyaW5nLT5jdXJyX2VuZHAtPmVuZHBfcmluZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPmVuZHBfcmluZyk7Ci0gICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKLSAgICAgICAgfQotICAgICAgICByaW5nLT5sZW5ndGggKz0gMTsKLSAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOwotICAgICAgICBlbmRwLT51ZGV2X251bWJlciA9IGFkZHJlc3M7Ci0gICAgICAgIGVuZHAtPnVzYl9hZGRyID0gdXNiX2FkZHI7Ci0gICAgICAgIGVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7Ci0gICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgPSAxOwotICAgICAgICBlbmRwLT5xdWV1ZV9sYXN0ID0gMDsKLSAgICAgICAgZW5kcC0+cXVldWVfbmV4dCA9IDA7Ci0gICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICB1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCAwKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcXVldWVfYnVsa19vbl9vbGRfZW5kcG9pbnQoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsCi0Jc3RydWN0IHVyYiAqdXJiLAotICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCi0gICAgICAgIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzKQotewotICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7Ci0gICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOwotICAgICAgICAgICAgICAgIGlmICh1cmJxID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwgJmVuZHAtPnVyYl9tb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYnEtPnVyYiA9IHVyYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9jb250cm9sKHN0cnVjdCB1MTMyICp1MTMyLAotCXN0cnVjdCB1cmIgKnVyYiwKLSAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHU4IHVzYl9hZGRyLCB1OCB1c2JfZW5kcCwKLSAgICAgICAgZ2ZwX3QgbWVtX2ZsYWdzKQotewotICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nOworCXN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CiAJdW5zaWduZWQgbG9uZyBpcnFzOwogCWludCByYzsKIAl1OCBlbmRwX251bWJlcjsKIAlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfZW5kcCksIG1lbV9mbGFncyk7CiAKLSAgICAgICAgaWYgKCFlbmRwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KKwlpZiAoIWVuZHApCisJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrX2luaXQoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2spOwogCXNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKQEAgLTIwOTYsMjA0ICsxODg3LDM5OCBAQAogCiAJZW5kcF9udW1iZXIgPSArK3UxMzItPm51bV9lbmRwb2ludHM7CiAJdXJiLT5lcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gZW5kcDsKLSAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcik7Ci0gICAgICAgIElOSVRfTElTVF9IRUFEKCZlbmRwLT51cmJfbW9yZSk7Ci0gICAgICAgIHJpbmcgPSBlbmRwLT5yaW5nID0gJnUxMzItPnJpbmdbMF07Ci0gICAgICAgIGlmIChyaW5nLT5jdXJyX2VuZHApIHsKLSAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZlbmRwLT5lbmRwX3JpbmcsICZyaW5nLT5jdXJyX2VuZHAtPmVuZHBfcmluZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPmVuZHBfcmluZyk7Ci0gICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKLSAgICAgICAgfQotICAgICAgICByaW5nLT5sZW5ndGggKz0gMTsKLSAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7Ci0gICAgICAgIGVuZHAtPmVkc2V0X2ZsdXNoID0gMDsKLSAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKLSAgICAgICAgZW5kcC0+ZGVsYXllZCA9IDA7Ci0gICAgICAgIGVuZHAtPmVuZHBfbnVtYmVyID0gZW5kcF9udW1iZXI7Ci0gICAgICAgIGVuZHAtPnUxMzIgPSB1MTMyOworCUlOSVRfREVMQVlFRF9XT1JLKCZlbmRwLT5zY2hlZHVsZXIsIHUxMzJfaGNkX2VuZHBfd29ya19zY2hlZHVsZXIpOworCUlOSVRfTElTVF9IRUFEKCZlbmRwLT51cmJfbW9yZSk7CisJcmluZyA9IGVuZHAtPnJpbmcgPSAmdTEzMi0+cmluZ1swXTsKKwlpZiAocmluZy0+Y3Vycl9lbmRwKSB7CisJCWxpc3RfYWRkX3RhaWwoJmVuZHAtPmVuZHBfcmluZywgJnJpbmctPmN1cnJfZW5kcC0+ZW5kcF9yaW5nKTsKKwl9IGVsc2UgeworCQlJTklUX0xJU1RfSEVBRCgmZW5kcC0+ZW5kcF9yaW5nKTsKKwkJcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKwl9CisJcmluZy0+bGVuZ3RoICs9IDE7CisJZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisJZW5kcC0+ZWRzZXRfZmx1c2ggPSAwOworCWVuZHAtPmFjdGl2ZSA9IDA7CisJZW5kcC0+ZGVsYXllZCA9IDA7CisJZW5kcC0+ZW5kcF9udW1iZXIgPSBlbmRwX251bWJlcjsKKwllbmRwLT51MTMyID0gdTEzMjsKIAllbmRwLT5oZXAgPSB1cmItPmVwOwotICAgICAgICB1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOwotICAgICAgICB1MTMyX2VuZHBfZ2V0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgIGlmICh1c2JfYWRkciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOwotICAgICAgICAgICAgICAgIGVuZHAtPnVkZXZfbnVtYmVyID0gYWRkcmVzczsKLSAgICAgICAgICAgICAgICBlbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOwotICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7Ci0gICAgICAgICAgICAgICAgZW5kcC0+aW5wdXQgPSAxOwotICAgICAgICAgICAgICAgIGVuZHAtPm91dHB1dCA9IDE7Ci0gICAgICAgICAgICAgICAgZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKLSAgICAgICAgICAgICAgICB1MTMyX3VkZXZfaW5pdF9rcmVmKHUxMzIsIHVkZXYpOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9pblt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7Ci0gICAgICAgICAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOwotICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgPSAxOwotICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX2xhc3QgPSAwOwotICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQgPSAwOwotICAgICAgICAgICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0gICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qKHVzYl9hZGRyID4gMCkgKi8KLSAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107Ci0gICAgICAgICAgICAgICAgZW5kcC0+dWRldl9udW1iZXIgPSBhZGRyZXNzOwotICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9hZGRyID0gdXNiX2FkZHI7Ci0gICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAgPSB1c2JfZW5kcDsKLSAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA9IDE7Ci0gICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID0gMTsKLSAgICAgICAgICAgICAgICBlbmRwLT5waXBldHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOwotICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgICAgICAgICB1ZGV2LT5lbnVtZXJhdGlvbiA9IDI7Ci0gICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7Ci0gICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOwotICAgICAgICAgICAgICAgIHVyYi0+aGNwcml2ID0gdTEzMjsKLSAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9zaXplID0gMTsKLSAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9sYXN0ID0gMDsKLSAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0ID0gMDsKLSAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisJZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKKwl1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOworCWlmICh1c2JfcGlwZWluKHVyYi0+cGlwZSkpIHsKKwkJZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7CisJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgdXNiX2VuZHAsIDAsIDApOworCQllbmRwLT5pbnB1dCA9IDE7CisJCWVuZHAtPm91dHB1dCA9IDA7CisJCXVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOworCQl1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7CisJfSBlbHNlIHsKKwkJZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7CisJCXVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgdXNiX2VuZHAsIDEsIDApOworCQllbmRwLT5pbnB1dCA9IDA7CisJCWVuZHAtPm91dHB1dCA9IDE7CisJCXVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworCX0KKwl1cmItPmhjcHJpdiA9IHUxMzI7CisJZW5kcC0+ZGVsYXllZCA9IDE7CisJZW5kcC0+amlmZmllcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHVyYi0+aW50ZXJ2YWwpOworCWVuZHAtPnVkZXZfbnVtYmVyID0gYWRkcmVzczsKKwllbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOworCWVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7CisJZW5kcC0+cXVldWVfc2l6ZSA9IDE7CisJZW5kcC0+cXVldWVfbGFzdCA9IDA7CisJZW5kcC0+cXVldWVfbmV4dCA9IDA7CisJZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9IHVyYjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKwl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCBtc2Vjc190b19qaWZmaWVzKHVyYi0+aW50ZXJ2YWwpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWV1ZV9pbnRfb25fb2xkX2VuZHBvaW50KHN0cnVjdCB1MTMyICp1MTMyLAorCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsIHN0cnVjdCB1cmIgKnVyYiwKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCisJdTggdXNiX2VuZHAsIHU4IGFkZHJlc3MpCit7CisJdXJiLT5oY3ByaXYgPSB1MTMyOworCWVuZHAtPmRlbGF5ZWQgPSAxOworCWVuZHAtPmppZmZpZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKTsKKwlpZiAoZW5kcC0+cXVldWVfc2l6ZSsrIDwgRU5EUF9RVUVVRV9TSVpFKSB7CisJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisJfSBlbHNlIHsKKwkJc3RydWN0IHUxMzJfdXJicSAqdXJicSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX3VyYnEpLAorCQkJR0ZQX0FUT01JQyk7CisJCWlmICh1cmJxID09IE5VTEwpIHsKKwkJCWVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9IGVsc2UgeworCQkJbGlzdF9hZGRfdGFpbCgmdXJicS0+dXJiX21vcmUsICZlbmRwLT51cmJfbW9yZSk7CisJCQl1cmJxLT51cmIgPSB1cmI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9idWxrKHN0cnVjdCB1MTMyICp1MTMyLAorCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsIHN0cnVjdCB1cmIgKnVyYiwKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdTggdXNiX2FkZHIsIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzLAorCWdmcF90IG1lbV9mbGFncykKK3sKKwlpbnQgcmluZ19udW1iZXI7CisJc3RydWN0IHUxMzJfcmluZyAqcmluZzsKKwl1bnNpZ25lZCBsb25nIGlycXM7CisJaW50IHJjOworCXU4IGVuZHBfbnVtYmVyOworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl9lbmRwKSwgbWVtX2ZsYWdzKTsKKworCWlmICghZW5kcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmZW5kcC0+cXVldWVfbG9jay5zbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCXJjID0gdXNiX2hjZF9saW5rX3VyYl90b19lcCh1MTMyX3RvX2hjZCh1MTMyKSwgdXJiKTsKKwlpZiAocmMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCWtmcmVlKGVuZHApOworCQlyZXR1cm4gcmM7CisJfQorCisJZW5kcF9udW1iZXIgPSArK3UxMzItPm51bV9lbmRwb2ludHM7CisJdXJiLT5lcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gZW5kcDsKKwlJTklUX0RFTEFZRURfV09SSygmZW5kcC0+c2NoZWR1bGVyLCB1MTMyX2hjZF9lbmRwX3dvcmtfc2NoZWR1bGVyKTsKKwlJTklUX0xJU1RfSEVBRCgmZW5kcC0+dXJiX21vcmUpOworCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCWVuZHAtPmVkc2V0X2ZsdXNoID0gMDsKKwllbmRwLT5hY3RpdmUgPSAwOworCWVuZHAtPmRlbGF5ZWQgPSAwOworCWVuZHAtPmVuZHBfbnVtYmVyID0gZW5kcF9udW1iZXI7CisJZW5kcC0+dTEzMiA9IHUxMzI7CisJZW5kcC0+aGVwID0gdXJiLT5lcDsKKwllbmRwLT5waXBldHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOworCXUxMzJfZW5kcF9pbml0X2tyZWYodTEzMiwgZW5kcCk7CisJaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgeworCQllbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKKwkJdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCB1c2JfZW5kcCwgMCwgMCk7CisJCXJpbmdfbnVtYmVyID0gMzsKKwkJZW5kcC0+aW5wdXQgPSAxOworCQllbmRwLT5vdXRwdXQgPSAwOworCQl1ZGV2LT5lbmRwX251bWJlcl9pblt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworCX0gZWxzZSB7CisJCWVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworCQl1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIHVzYl9lbmRwLCAxLCAwKTsKKwkJcmluZ19udW1iZXIgPSAyOworCQllbmRwLT5pbnB1dCA9IDA7CisJCWVuZHAtPm91dHB1dCA9IDE7CisJCXVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworCX0KKwlyaW5nID0gZW5kcC0+cmluZyA9ICZ1MTMyLT5yaW5nW3JpbmdfbnVtYmVyIC0gMV07CisJaWYgKHJpbmctPmN1cnJfZW5kcCkgeworCQlsaXN0X2FkZF90YWlsKCZlbmRwLT5lbmRwX3JpbmcsICZyaW5nLT5jdXJyX2VuZHAtPmVuZHBfcmluZyk7CisJfSBlbHNlIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmVuZHAtPmVuZHBfcmluZyk7CisJCXJpbmctPmN1cnJfZW5kcCA9IGVuZHA7CisJfQorCXJpbmctPmxlbmd0aCArPSAxOworCXVyYi0+aGNwcml2ID0gdTEzMjsKKwllbmRwLT51ZGV2X251bWJlciA9IGFkZHJlc3M7CisJZW5kcC0+dXNiX2FkZHIgPSB1c2JfYWRkcjsKKwllbmRwLT51c2JfZW5kcCA9IHVzYl9lbmRwOworCWVuZHAtPnF1ZXVlX3NpemUgPSAxOworCWVuZHAtPnF1ZXVlX2xhc3QgPSAwOworCWVuZHAtPnF1ZXVlX25leHQgPSAwOworCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXVldWVfYnVsa19vbl9vbGRfZW5kcG9pbnQoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYsCisJc3RydWN0IHVyYiAqdXJiLAorCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCB1OCB1c2JfYWRkciwKKwl1OCB1c2JfZW5kcCwgdTggYWRkcmVzcykKK3sKKwl1cmItPmhjcHJpdiA9IHUxMzI7CisJaWYgKGVuZHAtPnF1ZXVlX3NpemUrKyA8IEVORFBfUVVFVUVfU0laRSkgeworCQllbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOworCX0gZWxzZSB7CisJCXN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKKwkJCUdGUF9BVE9NSUMpOworCQlpZiAodXJicSA9PSBOVUxMKSB7CisJCQllbmRwLT5xdWV1ZV9zaXplIC09IDE7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkX3RhaWwoJnVyYnEtPnVyYl9tb3JlLCAmZW5kcC0+dXJiX21vcmUpOworCQkJdXJicS0+dXJiID0gdXJiOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9lbmRwb2ludF9hbmRfcXVldWVfY29udHJvbChzdHJ1Y3QgdTEzMiAqdTEzMiwKKwlzdHJ1Y3QgdXJiICp1cmIsCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHU4IHVzYl9hZGRyLCB1OCB1c2JfZW5kcCwKKwlnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IHUxMzJfcmluZyAqcmluZzsKKwl1bnNpZ25lZCBsb25nIGlycXM7CisJaW50IHJjOworCXU4IGVuZHBfbnVtYmVyOworCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl9lbmRwKSwgbWVtX2ZsYWdzKTsKKworCWlmICghZW5kcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmZW5kcC0+cXVldWVfbG9jay5zbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCXJjID0gdXNiX2hjZF9saW5rX3VyYl90b19lcCh1MTMyX3RvX2hjZCh1MTMyKSwgdXJiKTsKKwlpZiAocmMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCWtmcmVlKGVuZHApOworCQlyZXR1cm4gcmM7CisJfQorCisJZW5kcF9udW1iZXIgPSArK3UxMzItPm51bV9lbmRwb2ludHM7CisJdXJiLT5lcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gZW5kcDsKKwlJTklUX0RFTEFZRURfV09SSygmZW5kcC0+c2NoZWR1bGVyLCB1MTMyX2hjZF9lbmRwX3dvcmtfc2NoZWR1bGVyKTsKKwlJTklUX0xJU1RfSEVBRCgmZW5kcC0+dXJiX21vcmUpOworCXJpbmcgPSBlbmRwLT5yaW5nID0gJnUxMzItPnJpbmdbMF07CisJaWYgKHJpbmctPmN1cnJfZW5kcCkgeworCQlsaXN0X2FkZF90YWlsKCZlbmRwLT5lbmRwX3JpbmcsICZyaW5nLT5jdXJyX2VuZHAtPmVuZHBfcmluZyk7CisJfSBlbHNlIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmVuZHAtPmVuZHBfcmluZyk7CisJCXJpbmctPmN1cnJfZW5kcCA9IGVuZHA7CisJfQorCXJpbmctPmxlbmd0aCArPSAxOworCWVuZHAtPmRlcXVldWVpbmcgPSAwOworCWVuZHAtPmVkc2V0X2ZsdXNoID0gMDsKKwllbmRwLT5hY3RpdmUgPSAwOworCWVuZHAtPmRlbGF5ZWQgPSAwOworCWVuZHAtPmVuZHBfbnVtYmVyID0gZW5kcF9udW1iZXI7CisJZW5kcC0+dTEzMiA9IHUxMzI7CisJZW5kcC0+aGVwID0gdXJiLT5lcDsKKwl1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOworCXUxMzJfZW5kcF9nZXRfa3JlZih1MTMyLCBlbmRwKTsKKwlpZiAodXNiX2FkZHIgPT0gMCkgeworCQl1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKKwkJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCQllbmRwLT51ZGV2X251bWJlciA9IGFkZHJlc3M7CisJCWVuZHAtPnVzYl9hZGRyID0gdXNiX2FkZHI7CisJCWVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7CisJCWVuZHAtPmlucHV0ID0gMTsKKwkJZW5kcC0+b3V0cHV0ID0gMTsKKwkJZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKKwkJdTEzMl91ZGV2X2luaXRfa3JlZih1MTMyLCB1ZGV2KTsKKwkJdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworCQl1ZGV2LT5lbmRwX251bWJlcl9pblt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOworCQl1cmItPmhjcHJpdiA9IHUxMzI7CisJCWVuZHAtPnF1ZXVlX3NpemUgPSAxOworCQllbmRwLT5xdWV1ZV9sYXN0ID0gMDsKKwkJZW5kcC0+cXVldWVfbmV4dCA9IDA7CisJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCQl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCAwKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsJCS8qKHVzYl9hZGRyID4gMCkgKi8KKwkJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7CisJCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKKwkJZW5kcC0+dWRldl9udW1iZXIgPSBhZGRyZXNzOworCQllbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOworCQllbmRwLT51c2JfZW5kcCA9IHVzYl9lbmRwOworCQllbmRwLT5pbnB1dCA9IDE7CisJCWVuZHAtPm91dHB1dCA9IDE7CisJCWVuZHAtPnBpcGV0eXBlID0gdXNiX3BpcGV0eXBlKHVyYi0+cGlwZSk7CisJCXUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKKwkJdWRldi0+ZW51bWVyYXRpb24gPSAyOworCQl1ZGV2LT5lbmRwX251bWJlcl9pblt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKwkJdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOworCQl1cmItPmhjcHJpdiA9IHUxMzI7CisJCWVuZHAtPnF1ZXVlX3NpemUgPSAxOworCQllbmRwLT5xdWV1ZV9sYXN0ID0gMDsKKwkJZW5kcC0+cXVldWVfbmV4dCA9IDA7CisJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCQl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCAwKTsKKwkJcmV0dXJuIDA7CisJfQogfQogCiBzdGF0aWMgaW50IHF1ZXVlX2NvbnRyb2xfb25fb2xkX2VuZHBvaW50KHN0cnVjdCB1MTMyICp1MTMyLAogCXN0cnVjdCB1cmIgKnVyYiwKLSAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHU4IHVzYl9hZGRyLAotICAgICAgICB1OCB1c2JfZW5kcCkKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCisJdTggdXNiX2VuZHApCiB7Ci0gICAgICAgIGlmICh1c2JfYWRkciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHAtPnF1ZXVlX3NpemUrKyA8IEVORFBfUVVFVUVfU0laRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfQVRPTUlDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVyYnEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRwLT51cmJfbW9yZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJicS0+dXJiID0gdXJiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLyogdXNiX3BpcGVvdXQodXJiLT5waXBlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfYWRkciAqYWRkciA9ICZ1MTMyLT5hZGRyW3VzYl9kZXYtPmRldm51bV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgSSA9IE1BWF9VMTMyX1VERVZTOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tSSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2WysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ZGV2LT51c2JfZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRldi0+ZW51bWVyYXRpb24gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmFkZHJbMF0uYWRkcmVzcyA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dWRldl9udW1iZXIgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPnVkZXZfbnVtYmVyID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGV2LT51c2JfYWRkciA9IHVzYl9kZXYtPmRldm51bTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3VkZXZfaW5pdF9rcmVmKHUxMzIsIHVkZXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5lbmRwX251bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5lbmRwX251bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGV2LT51c2JfZGV2aWNlID0gdXNiX2RldjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHU4ICopICh1cmItPnNldHVwX3BhY2tldCkpWzJdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHItPmFkZHJlc3MgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJ1biBvdXQgb2YgZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZpY2Ugc3BhY2VcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+aGNwcml2ID0gdTEzMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdXJicSAqdXJicSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfdXJicSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0FUT01JQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmJxID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9zaXplIC09IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmdXJicS0+dXJiX21vcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcC0+dXJiX21vcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYnEtPnVyYiA9IHVyYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKih1c2JfYWRkciA+IDApICovCi0gICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOwotICAgICAgICAgICAgICAgIHVyYi0+aGNwcml2ID0gdTEzMjsKLSAgICAgICAgICAgICAgICBpZiAodWRldi0+ZW51bWVyYXRpb24gPT0gMikgewotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdWRldi0+ZW51bWVyYXRpb24gPSAyOwotICAgICAgICAgICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwgR0ZQX0FUT01JQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJicSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwgJmVuZHAtPnVyYl9tb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJicS0+dXJiID0gdXJiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorCWlmICh1c2JfYWRkciA9PSAwKSB7CisJCWlmICh1c2JfcGlwZWluKHVyYi0+cGlwZSkpIHsKKwkJCXVyYi0+aGNwcml2ID0gdTEzMjsKKwkJCWlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKKwkJCQllbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgorCQkJCQllbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0KKwkJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfdXJicSksCisJCQkJCUdGUF9BVE9NSUMpOworCQkJCWlmICh1cmJxID09IE5VTEwpIHsKKwkJCQkJZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwKKwkJCQkJCSZlbmRwLT51cmJfbW9yZSk7CisJCQkJCXVyYnEtPnVyYiA9IHVyYjsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsJLyogdXNiX3BpcGVvdXQodXJiLT5waXBlKSAqLworCQkJc3RydWN0IHUxMzJfYWRkciAqYWRkciA9ICZ1MTMyLT5hZGRyW3VzYl9kZXYtPmRldm51bV07CisJCQlpbnQgSSA9IE1BWF9VMTMyX1VERVZTOworCQkJaW50IGkgPSAwOworCQkJd2hpbGUgKC0tSSA+IDApIHsKKwkJCQlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbKytpXTsKKwkJCQlpZiAodWRldi0+dXNiX2RldmljZSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQl1ZGV2LT5lbnVtZXJhdGlvbiA9IDE7CisJCQkJCXUxMzItPmFkZHJbMF0uYWRkcmVzcyA9IGk7CisJCQkJCWVuZHAtPnVkZXZfbnVtYmVyID0gaTsKKwkJCQkJdWRldi0+dWRldl9udW1iZXIgPSBpOworCQkJCQl1ZGV2LT51c2JfYWRkciA9IHVzYl9kZXYtPmRldm51bTsKKwkJCQkJdTEzMl91ZGV2X2luaXRfa3JlZih1MTMyLCB1ZGV2KTsKKwkJCQkJdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0KKwkJCQkJCWVuZHAtPmVuZHBfbnVtYmVyOworCQkJCQl1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7CisJCQkJCXVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPQorCQkJCQkJZW5kcC0+ZW5kcF9udW1iZXI7CisJCQkJCXVkZXYtPnVzYl9kZXZpY2UgPSB1c2JfZGV2OworCQkJCQkoKHU4ICopICh1cmItPnNldHVwX3BhY2tldCkpWzJdID0KKwkJCQkJCWFkZHItPmFkZHJlc3MgPSBpOworCQkJCQl1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChJID09IDApIHsKKwkJCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJ1biBvdXQgb2YgZCIKKwkJCQkJImV2aWNlIHNwYWNlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXVyYi0+aGNwcml2ID0gdTEzMjsKKwkJCWlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKKwkJCQllbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgorCQkJCQllbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0KKwkJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfdXJicSksCisJCQkJCUdGUF9BVE9NSUMpOworCQkJCWlmICh1cmJxID09IE5VTEwpIHsKKwkJCQkJZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwKKwkJCQkJCSZlbmRwLT51cmJfbW9yZSk7CisJCQkJCXVyYnEtPnVyYiA9IHVyYjsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CQkvKih1c2JfYWRkciA+IDApICovCisJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOworCQlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107CisJCXVyYi0+aGNwcml2ID0gdTEzMjsKKwkJaWYgKHVkZXYtPmVudW1lcmF0aW9uICE9IDIpCisJCQl1ZGV2LT5lbnVtZXJhdGlvbiA9IDI7CisJCWlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKKwkJCWVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPQorCQkJCXVyYjsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPQorCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX3VyYnEpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1cmJxID09IE5VTEwpIHsKKwkJCQllbmRwLT5xdWV1ZV9zaXplIC09IDE7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9IGVsc2UgeworCQkJCWxpc3RfYWRkX3RhaWwoJnVyYnEtPnVyYl9tb3JlLCAmZW5kcC0+dXJiX21vcmUpOworCQkJCXVyYnEtPnVyYiA9IHVyYjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl91cmJfZW5xdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsCiAJCWdmcF90IG1lbV9mbGFncykKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAoaXJxc19kaXNhYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKF9fR0ZQX1dBSVQgJiBtZW1fZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBjb250ZXh0IGZvciBmdW5jdGlvbiB0aGF0IG1pZ2giCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0IHNsZWVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCWlmIChpcnFzX2Rpc2FibGVkKCkpIHsKKwkJaWYgKF9fR0ZQX1dBSVQgJiBtZW1fZmxhZ3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBjb250ZXh0IGZvciBmdW5jdGlvbiB0aGF0IG1pZ2giCisJCQkJInQgc2xlZXBcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKIAkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCAiCiAJCQkJInVyYj0lcFxuIiwgdXJiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1OCB1c2JfYWRkciA9IHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSk7Ci0gICAgICAgICAgICAgICAgdTggdXNiX2VuZHAgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSB1cmItPmRldjsKLSAgICAgICAgICAgICAgICBpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9JTlRFUlJVUFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlycXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycXMpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9IGVsc2UgeworCQl1OCB1c2JfYWRkciA9IHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSk7CisJCXU4IHVzYl9lbmRwID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOworCQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHVyYi0+ZGV2OworCQlpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJCXU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOworCQkJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCQkJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKKwkJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJCQlpZiAoZW5kcCkgeworCQkJCXVuc2lnbmVkIGxvbmcgaXJxczsKKwkJCQlpbnQgcmV0dmFsOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLAorCQkJCQlpcnFzKTsKIAkJCQlyZXR2YWwgPSB1c2JfaGNkX2xpbmtfdXJiX3RvX2VwKGhjZCwgdXJiKTsKIAkJCQlpZiAocmV0dmFsID09IDApIHsKIAkJCQkJcmV0dmFsID0gcXVldWVfaW50X29uX29sZF9lbmRwb2ludCgKQEAgLTIzMDMsMzkgKzIyODgsMzkgQEAKIAkJCQkJCQlhZGRyZXNzKTsKIAkJCQkJaWYgKHJldHZhbCkKIAkJCQkJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKAotCQkJCQkJCQloY2QsIHVyYik7CisJaGNkLCB1cmIpOwogCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+bnVtX2VuZHBvaW50cyA9PSBNQVhfVTEzMl9FTkRQUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKihlbmRwID09IE5VTEwpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2ludCh1MTMyLCB1ZGV2LAorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisJCQkJCWlycXMpOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9IGVsc2UgeworCQkJCQl1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLAorCQkJCQkJbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKSkKKwkJCQkJCTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfSBlbHNlIGlmICh1MTMyLT5udW1fZW5kcG9pbnRzID09IE1BWF9VMTMyX0VORFBTKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgewkvKihlbmRwID09IE5VTEwpICovCisJCQkJcmV0dXJuIGNyZWF0ZV9lbmRwb2ludF9hbmRfcXVldWVfaW50KHUxMzIsIHVkZXYsCiAJCQkJCQl1cmIsIHVzYl9kZXYsIHVzYl9hZGRyLAogCQkJCQkJdXNiX2VuZHAsIGFkZHJlc3MsIG1lbV9mbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInRoZSBoYXJkd2FyZSBkb2VzIG5vIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidCBzdXBwb3J0IFBJUEVfSVNPQ0hST05PVVNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0JVTEspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlycXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycXMpOworCQkJfQorCQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpIHsKKwkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidGhlIGhhcmR3YXJlIGRvZXMgbm8iCisJCQkJInQgc3VwcG9ydCBQSVBFX0lTT0NIUk9OT1VTXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfQlVMSykgeworCQkJdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7CisJCQlzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107CisJCQlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gdXJiLT5lcC0+aGNwcml2OworCQkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJCWlmIChlbmRwKSB7CisJCQkJdW5zaWduZWQgbG9uZyBpcnFzOworCQkJCWludCByZXR2YWw7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisJCQkJCWlycXMpOwogCQkJCXJldHZhbCA9IHVzYl9oY2RfbGlua191cmJfdG9fZXAoaGNkLCB1cmIpOwogCQkJCWlmIChyZXR2YWwgPT0gMCkgewogCQkJCQlyZXR2YWwgPSBxdWV1ZV9idWxrX29uX29sZF9lbmRwb2ludCgKQEAgLTIzNDUsNDYgKzIzMzAsNDYgQEAKIAkJCQkJCQlhZGRyZXNzKTsKIAkJCQkJaWYgKHJldHZhbCkKIAkJCQkJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKAotCQkJCQkJCQloY2QsIHVyYik7CisJaGNkLCB1cmIpOwogCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+bnVtX2VuZHBvaW50cyA9PSBNQVhfVTEzMl9FTkRQUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9idWxrKHUxMzIsCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKwkJCQkJaXJxcyk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0gZWxzZSB7CisJCQkJCXUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHUxMzItPm51bV9lbmRwb2ludHMgPT0gTUFYX1UxMzJfRU5EUFMpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2J1bGsodTEzMiwKIAkJCQkJdWRldiwgdXJiLCB1c2JfZGV2LCB1c2JfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZW5kcCwgYWRkcmVzcywgbWVtX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxNiB1cmJfc2l6ZSA9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1OCAqYiA9IHVyYi0+c2V0dXBfcGFja2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkYXRhWzMwICozICsgNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkID0gZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtID0gKHNpemVvZihkYXRhKSAtIDEpIC8gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHVyYl9zaXplLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkrKyA8IG0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdyA9IHNwcmludGYoZCwgIiAlMDJYIiwgKmIrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSB3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaXJxczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxcyk7CisJCQkJCXVzYl9lbmRwLCBhZGRyZXNzLCBtZW1fZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHVyYi0+ZXAtPmhjcHJpdjsKKwkJCXUxNiB1cmJfc2l6ZSA9IDg7CisJCQl1OCAqYiA9IHVyYi0+c2V0dXBfcGFja2V0OworCQkJaW50IGkgPSAwOworCQkJY2hhciBkYXRhWzMwICogMyArIDRdOworCQkJY2hhciAqZCA9IGRhdGE7CisJCQlpbnQgbSA9IChzaXplb2YoZGF0YSkgLSAxKSAvIDM7CisJCQlpbnQgbCA9IDA7CisJCQlkYXRhWzBdID0gMDsKKwkJCXdoaWxlICh1cmJfc2l6ZS0tID4gMCkgeworCQkJCWlmIChpID4gbSkgeworCQkJCX0gZWxzZSBpZiAoaSsrIDwgbSkgeworCQkJCQlpbnQgdyA9IHNwcmludGYoZCwgIiAlMDJYIiwgKmIrKyk7CisJCQkJCWQgKz0gdzsKKwkJCQkJbCArPSB3OworCQkJCX0gZWxzZQorCQkJCQlkICs9IHNwcmludGYoZCwgIiAuLiIpOworCQkJfQorCQkJaWYgKGVuZHApIHsKKwkJCQl1bnNpZ25lZCBsb25nIGlycXM7CisJCQkJaW50IHJldHZhbDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKwkJCQkJaXJxcyk7CiAJCQkJcmV0dmFsID0gdXNiX2hjZF9saW5rX3VyYl90b19lcChoY2QsIHVyYik7CiAJCQkJaWYgKHJldHZhbCA9PSAwKSB7CiAJCQkJCXJldHZhbCA9IHF1ZXVlX2NvbnRyb2xfb25fb2xkX2VuZHBvaW50KApAQCAtMjM5NSwyNjcgKzIzODAsMjY3IEBACiAJCQkJCQl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcCgKIAkJCQkJCQkJaGNkLCB1cmIpOwogCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+bnVtX2VuZHBvaW50cyA9PSBNQVhfVTEzMl9FTkRQUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9jb250cm9sKHUxMzIsCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKwkJCQkJaXJxcyk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0gZWxzZSB7CisJCQkJCXUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHUxMzItPm51bV9lbmRwb2ludHMgPT0gTUFYX1UxMzJfRU5EUFMpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2NvbnRyb2wodTEzMiwKIAkJCQkJdXJiLCB1c2JfZGV2LCB1c2JfYWRkciwgdXNiX2VuZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCQkJbWVtX2ZsYWdzKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCBkZXF1ZXVlX2Zyb21fb3ZlcmZsb3dfY2hhaW4oc3RydWN0IHUxMzIgKnUxMzIsCi0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYikKKwlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnNjYW47Ci0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZW5kcC0+dXJiX21vcmU7Ci0gICAgICAgIGxpc3RfZm9yX2VhY2goc2NhbiwgaGVhZCkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KHNjYW4sIHN0cnVjdCB1MTMyX3VyYnEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmJfbW9yZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVyYnEtPnVyYiA9PSB1cmIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfZGVsKHNjYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfc2l6ZSAtPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdXJiLT5lcnJvcl9jb3VudCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqc2NhbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmVuZHAtPnVyYl9tb3JlOworCWxpc3RfZm9yX2VhY2goc2NhbiwgaGVhZCkgeworCQlzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0gbGlzdF9lbnRyeShzY2FuLCBzdHJ1Y3QgdTEzMl91cmJxLAorCQkJdXJiX21vcmUpOworCQlpZiAodXJicS0+dXJiID09IHVyYikgeworCQkJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOworCQkJbGlzdF9kZWwoc2Nhbik7CisJCQllbmRwLT5xdWV1ZV9zaXplIC09IDE7CisJCQl1cmItPmVycm9yX2NvdW50ID0gMDsKIAkJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGhjZCwgdXJiLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJ1cmI9JXAgbm90IGZvdW5kIGluIGVuZHBbJWRdPSVwIHJpbmciCi0gICAgICAgICAgICAgICAgIlslZF0gJWMlYyB1c2JfZW5kcD0lZCB1c2JfYWRkcj0lZCBzaXplPSVkIG5leHQ9JTA0WCBsYXN0PSUwNFgiCi0gICAgICAgICAgICAgICAgIlxuIiwgdXJiLCBlbmRwLT5lbmRwX251bWJlciwgZW5kcCwgZW5kcC0+cmluZy0+bnVtYmVyLAotICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID8gJ0knIDogJyAnLCBlbmRwLT5vdXRwdXQgPyAnTycgOiAnICcsCi0gICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnVzYl9hZGRyLCBlbmRwLT5xdWV1ZV9zaXplLAotICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQsIGVuZHAtPnF1ZXVlX2xhc3QpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWNvbnRpbnVlOworCX0KKwlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBub3QgZm91bmQgaW4gZW5kcFslZF09JXAgcmluZyIKKwkJIlslZF0gJWMlYyB1c2JfZW5kcD0lZCB1c2JfYWRkcj0lZCBzaXplPSVkIG5leHQ9JTA0WCBsYXN0PSUwNFgiCisJCSJcbiIsIHVyYiwgZW5kcC0+ZW5kcF9udW1iZXIsIGVuZHAsIGVuZHAtPnJpbmctPm51bWJlciwKKwkJZW5kcC0+aW5wdXQgPyAnSScgOiAnICcsIGVuZHAtPm91dHB1dCA/ICdPJyA6ICcgJywKKwkJZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnVzYl9hZGRyLCBlbmRwLT5xdWV1ZV9zaXplLAorCQllbmRwLT5xdWV1ZV9uZXh0LCBlbmRwLT5xdWV1ZV9sYXN0KTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCB1MTMyX2VuZHBfdXJiX2RlcXVldWUoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsCiAJCXN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOworCXVuc2lnbmVkIGxvbmcgaXJxczsKIAlpbnQgcmM7CiAKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKIAlyYyA9IHVzYl9oY2RfY2hlY2tfdW5saW5rX3VyYih1MTMyX3RvX2hjZCh1MTMyKSwgdXJiLCBzdGF0dXMpOwogCWlmIChyYykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKIAkJcmV0dXJuIHJjOwogCX0KLSAgICAgICAgaWYgKGVuZHAtPnF1ZXVlX3NpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIG5vdCBmb3VuZCBpbiBlbmRwWyVkXSIKLSAgICAgICAgICAgICAgICAgICAgICAgICI9JXAgcmluZ1slZF0gJWMlYyB1c2JfZW5kcD0lZCB1c2JfYWRkcj0lZFxuIiwgdXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+ZW5kcF9udW1iZXIsIGVuZHAsIGVuZHAtPnJpbmctPm51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID8gJ0knIDogJyAnLCBlbmRwLT5vdXRwdXQgPyAnTycgOiAnICcsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51c2JfZW5kcCwgZW5kcC0+dXNiX2FkZHIpOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1cmIgPT0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbmV4dF0pIHsKLSAgICAgICAgICAgICAgICBpZiAoZW5kcC0+YWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmVkc2V0X2ZsdXNoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJaWYgKGVuZHAtPnF1ZXVlX3NpemUgPT0gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBub3QgZm91bmQgaW4gZW5kcFslZF0iCisJCQkiPSVwIHJpbmdbJWRdICVjJWMgdXNiX2VuZHA9JWQgdXNiX2FkZHI9JWRcbiIsIHVyYiwKKwkJCWVuZHAtPmVuZHBfbnVtYmVyLCBlbmRwLCBlbmRwLT5yaW5nLT5udW1iZXIsCisJCQllbmRwLT5pbnB1dCA/ICdJJyA6ICcgJywgZW5kcC0+b3V0cHV0ID8gJ08nIDogJyAnLAorCQkJZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnVzYl9hZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodXJiID09IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdKSB7CisJCWlmIChlbmRwLT5hY3RpdmUpIHsKKwkJCWVuZHAtPmRlcXVldWVpbmcgPSAxOworCQkJZW5kcC0+ZWRzZXRfZmx1c2ggPSAxOworCQkJdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CiAJCQl1MTMyX2hjZF9hYmFuZG9uX3VyYih1MTMyLCBlbmRwLCB1cmIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdTE2IHF1ZXVlX2xpc3QgPSAwOwotICAgICAgICAgICAgICAgIHUxNiBxdWV1ZV9zaXplID0gZW5kcC0+cXVldWVfc2l6ZTsKLSAgICAgICAgICAgICAgICB1MTYgcXVldWVfc2NhbiA9IGVuZHAtPnF1ZXVlX25leHQ7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHVyYiAqKnVyYl9zbG90ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKytxdWV1ZV9saXN0IDwgRU5EUF9RVUVVRV9TSVpFICYmIC0tcXVldWVfc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmIgPT0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytxdWV1ZV9zY2FuXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmJfc2xvdCA9ICZlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX3NjYW5dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCsrcXVldWVfbGlzdCA8IEVORFBfUVVFVUVfU0laRSAmJiAtLXF1ZXVlX3NpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdXJiX3Nsb3QgPSBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3F1ZXVlX3NjYW5dOwotICAgICAgICAgICAgICAgICAgICAgICAgdXJiX3Nsb3QgPSAmZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfc2Nhbl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh1cmJfc2xvdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQl1MTYgcXVldWVfbGlzdCA9IDA7CisJCXUxNiBxdWV1ZV9zaXplID0gZW5kcC0+cXVldWVfc2l6ZTsKKwkJdTE2IHF1ZXVlX3NjYW4gPSBlbmRwLT5xdWV1ZV9uZXh0OworCQlzdHJ1Y3QgdXJiICoqdXJiX3Nsb3QgPSBOVUxMOworCQl3aGlsZSAoKytxdWV1ZV9saXN0IDwgRU5EUF9RVUVVRV9TSVpFICYmIC0tcXVldWVfc2l6ZSA+IDApIHsKKwkJCWlmICh1cmIgPT0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKwkJCQkrK3F1ZXVlX3NjYW5dKSB7CisJCQkJdXJiX3Nsb3QgPSAmZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKwkJCQkJcXVldWVfc2Nhbl07CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoKytxdWV1ZV9saXN0IDwgRU5EUF9RVUVVRV9TSVpFICYmIC0tcXVldWVfc2l6ZSA+IDApIHsKKwkJCSp1cmJfc2xvdCA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisJCQkJKytxdWV1ZV9zY2FuXTsKKwkJCXVyYl9zbG90ID0gJmVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisJCQkJcXVldWVfc2Nhbl07CisJCX0KKwkJaWYgKHVyYl9zbG90KSB7CisJCQlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMik7CiAKIAkJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKGhjZCwgdXJiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5KCZlbmRwLT51cmJfbW9yZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBlbmRwLT51cmJfbW9yZS5uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0gbGlzdF9lbnRyeShuZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEsIHVyYl9tb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWwobmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1cmJfc2xvdCA9IHVyYnEtPnVyYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUodXJicSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHVyYi0+ZXJyb3JfY291bnQgPSAwOworCQkJZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworCQkJaWYgKGxpc3RfZW1wdHkoJmVuZHAtPnVyYl9tb3JlKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisJCQkJCWlycXMpOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gZW5kcC0+dXJiX21vcmUubmV4dDsKKwkJCQlzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0gbGlzdF9lbnRyeShuZXh0LAorCQkJCQlzdHJ1Y3QgdTEzMl91cmJxLCB1cmJfbW9yZSk7CisJCQkJbGlzdF9kZWwobmV4dCk7CisJCQkJKnVyYl9zbG90ID0gdXJicS0+dXJiOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisJCQkJCWlycXMpOworCQkJCWtmcmVlKHVyYnEpOworCQkJfSB1cmItPmVycm9yX2NvdW50ID0gMDsKIAkJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGhjZCwgdXJiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZlbmRwLT51cmJfbW9yZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIG5vdCBmb3VuZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRwWyVkXT0lcCByaW5nWyVkXSAlYyVjIHVzYl9lbmRwPSVkIHVzYl9hZGRyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPSVkIHNpemU9JWQgbmV4dD0lMDRYIGxhc3Q9JTA0WFxuIiwgdXJiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5lbmRwX251bWJlciwgZW5kcCwgZW5kcC0+cmluZy0+bnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA/ICdJJyA6ICcgJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID8gJ08nIDogJyAnLCBlbmRwLT51c2JfZW5kcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2FkZHIsIGVuZHAtPnF1ZXVlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQsIGVuZHAtPnF1ZXVlX2xhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAobGlzdF9lbXB0eSgmZW5kcC0+dXJiX21vcmUpKSB7CisJCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBub3QgZm91bmQgaW4gIgorCQkJCSJlbmRwWyVkXT0lcCByaW5nWyVkXSAlYyVjIHVzYl9lbmRwPSVkIHVzYl9hZGRyIgorCQkJCSI9JWQgc2l6ZT0lZCBuZXh0PSUwNFggbGFzdD0lMDRYXG4iLCB1cmIsCisJCQkJZW5kcC0+ZW5kcF9udW1iZXIsIGVuZHAsIGVuZHAtPnJpbmctPm51bWJlciwKKwkJCQllbmRwLT5pbnB1dCA/ICdJJyA6ICcgJywKKwkJCQllbmRwLT5vdXRwdXQgPyAnTycgOiAnICcsIGVuZHAtPnVzYl9lbmRwLAorCQkJCWVuZHAtPnVzYl9hZGRyLCBlbmRwLT5xdWV1ZV9zaXplLAorCQkJCWVuZHAtPnF1ZXVlX25leHQsIGVuZHAtPnF1ZXVlX2xhc3QpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKIAkJCWludCByZXR2YWw7CiAKIAkJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKHUxMzJfdG9faGNkKHUxMzIpLCB1cmIpOwogCQkJcmV0dmFsID0gZGVxdWV1ZV9mcm9tX292ZXJmbG93X2NoYWluKHUxMzIsIGVuZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisJCQkJdXJiKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCB1MTMyX3VyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAyKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdTggdXNiX2FkZHIgPSB1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpOwotICAgICAgICAgICAgICAgIHU4IHVzYl9lbmRwID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOwotICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW3VzYl9hZGRyXS5hZGRyZXNzOwotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKLSAgICAgICAgICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1OCBlbmRwX251bWJlciA9IHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTEzMl9lbmRwX3VyYl9kZXF1ZXVlKHUxMzIsIGVuZHAsIHVyYiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdTggZW5kcF9udW1iZXIgPSB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHUxMzItPmVuZHBbZW5kcF9udW1iZXIgLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1MTMyX2VuZHBfdXJiX2RlcXVldWUodTEzMiwgZW5kcCwgdXJiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAyKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgeworCQl1OCB1c2JfYWRkciA9IHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSk7CisJCXU4IHVzYl9lbmRwID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOworCQl1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKKwkJc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworCQlpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7CisJCQl1OCBlbmRwX251bWJlciA9IHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXTsKKwkJCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV07CisJCQlyZXR1cm4gdTEzMl9lbmRwX3VyYl9kZXF1ZXVlKHUxMzIsIGVuZHAsIHVyYiwgc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCXU4IGVuZHBfbnVtYmVyID0gdWRldi0+ZW5kcF9udW1iZXJfb3V0W3VzYl9lbmRwXTsKKwkJCXN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV07CisJCQlyZXR1cm4gdTEzMl9lbmRwX3VyYl9kZXF1ZXVlKHUxMzIsIGVuZHAsIHVyYiwgc3RhdHVzKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIHZvaWQgdTEzMl9lbmRwb2ludF9kaXNhYmxlKHN0cnVjdCB1c2JfaGNkICpoY2QsCi0gICAgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwKQorCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDIpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInUxMzIgZGV2aWNlICVwKGhjZD0lcCBoZXA9JXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiKSBoYXMgYmVlbiByZW1vdmVkICVkXG4iLCB1MTMyLCBoY2QsIGhlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmdvaW5nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gaGVwLT5oY3ByaXY7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZHApCi0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMikgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInUxMzIgZGV2aWNlICVwKGhjZD0lcCBoZXA9JXAiCisJCQkiKSBoYXMgYmVlbiByZW1vdmVkICVkXG4iLCB1MTMyLCBoY2QsIGhlcCwKKwkJCXUxMzItPmdvaW5nKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gaGVwLT5oY3ByaXY7CisJCWlmIChlbmRwKQorCQkJdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworCX0KIH0KIAogc3RhdGljIGludCB1MTMyX2dldF9mcmFtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZnJhbWUgPSAwOwotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiVE9ETzogdTEzMl9nZXRfZnJhbWVcbiIpOwotICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOwotICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKLSAgICAgICAgfQorCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlIHsKKwkJaW50IGZyYW1lID0gMDsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJUT0RPOiB1MTMyX2dldF9mcmFtZVxuIik7CisJCW1zbGVlcCgxMDApOworCQlyZXR1cm4gZnJhbWU7CisJfQogfQogCiBzdGF0aWMgaW50IHUxMzJfcm9vdGh1Yl9kZXNjcmlwdG9yKHN0cnVjdCB1MTMyICp1MTMyLAotICAgICAgICBzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICpkZXNjKQorCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2MpCiB7Ci0gICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgIHUxNiB0ZW1wOwotICAgICAgICB1MzIgcmhfYSA9IC0xOwotICAgICAgICB1MzIgcmhfYiA9IC0xOwotICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgJnJoX2EpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7Ci0gICAgICAgIGRlc2MtPmJQd3JPbjJQd3JHb29kID0gKHJoX2EgJiBSSF9BX1BPVFBHVCkgPj4gMjQ7Ci0gICAgICAgIGRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOwotICAgICAgICBkZXNjLT5iTmJyUG9ydHMgPSB1MTMyLT5udW1fcG9ydHM7Ci0gICAgICAgIHRlbXAgPSAxICsgKHUxMzItPm51bV9wb3J0cyAvIDgpOwotICAgICAgICBkZXNjLT5iRGVzY0xlbmd0aCA9IDcgKyAyICp0ZW1wOwotICAgICAgICB0ZW1wID0gMDsKLSAgICAgICAgaWYgKHJoX2EgJiBSSF9BX05QUykKLSAgICAgICAgICAgICAgICB0ZW1wIHw9IDB4MDAwMjsKLSAgICAgICAgaWYgKHJoX2EgJiBSSF9BX1BTTSkKLSAgICAgICAgICAgICAgICB0ZW1wIHw9IDB4MDAwMTsKLSAgICAgICAgaWYgKHJoX2EgJiBSSF9BX05PQ1ApIHsKLSAgICAgICAgICAgICAgICB0ZW1wIHw9IDB4MDAxMDsKLSAgICAgICAgfSBlbHNlIGlmIChyaF9hICYgUkhfQV9PQ1BNKQotICAgICAgICAgICAgICAgIHRlbXAgfD0gMHgwMDA4OwotICAgICAgICBkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gY3B1X3RvX2xlMTYodGVtcCk7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5iLCAmcmhfYik7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgbWVtc2V0KGRlc2MtPmJpdG1hcCwgMHhmZiwgc2l6ZW9mKGRlc2MtPmJpdG1hcCkpOwotICAgICAgICBkZXNjLT5iaXRtYXBbMF0gPSByaF9iICYgUkhfQl9EUjsKLSAgICAgICAgaWYgKHUxMzItPm51bV9wb3J0cyA+IDcpIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5iaXRtYXBbMV0gPSAocmhfYiAmIFJIX0JfRFIpID4+IDg7Ci0gICAgICAgICAgICAgICAgZGVzYy0+Yml0bWFwWzJdID0gMHhmZjsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZGVzYy0+Yml0bWFwWzFdID0gMHhmZjsKLSAgICAgICAgcmV0dXJuIDA7CisJaW50IHJldHZhbDsKKwl1MTYgdGVtcDsKKwl1MzIgcmhfYSA9IC0xOworCXUzMiByaF9iID0gLTE7CisJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyaF9hKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YlB3ck9uMlB3ckdvb2QgPSAocmhfYSAmIFJIX0FfUE9UUEdUKSA+PiAyNDsKKwlkZXNjLT5iSHViQ29udHJDdXJyZW50ID0gMDsKKwlkZXNjLT5iTmJyUG9ydHMgPSB1MTMyLT5udW1fcG9ydHM7CisJdGVtcCA9IDEgKyAodTEzMi0+bnVtX3BvcnRzIC8gOCk7CisJZGVzYy0+YkRlc2NMZW5ndGggPSA3ICsgMiAqIHRlbXA7CisJdGVtcCA9IDA7CisJaWYgKHJoX2EgJiBSSF9BX05QUykKKwkJdGVtcCB8PSAweDAwMDI7CisJaWYgKHJoX2EgJiBSSF9BX1BTTSkKKwkJdGVtcCB8PSAweDAwMDE7CisJaWYgKHJoX2EgJiBSSF9BX05PQ1ApCisJCXRlbXAgfD0gMHgwMDEwOworCWVsc2UgaWYgKHJoX2EgJiBSSF9BX09DUE0pCisJCXRlbXAgfD0gMHgwMDA4OworCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSBjcHVfdG9fbGUxNih0ZW1wKTsKKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYiwgJnJoX2IpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KGRlc2MtPmJpdG1hcCwgMHhmZiwgc2l6ZW9mKGRlc2MtPmJpdG1hcCkpOworCWRlc2MtPmJpdG1hcFswXSA9IHJoX2IgJiBSSF9CX0RSOworCWlmICh1MTMyLT5udW1fcG9ydHMgPiA3KSB7CisJCWRlc2MtPmJpdG1hcFsxXSA9IChyaF9iICYgUkhfQl9EUikgPj4gODsKKwkJZGVzYy0+Yml0bWFwWzJdID0gMHhmZjsKKwl9IGVsc2UKKwkJZGVzYy0+Yml0bWFwWzFdID0gMHhmZjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1MTMyX3Jvb3RodWJfc3RhdHVzKHN0cnVjdCB1MTMyICp1MTMyLCBfX2xlMzIgKmRlc2MpCiB7Ci0gICAgICAgIHUzMiByaF9zdGF0dXMgPSAtMTsKLSAgICAgICAgaW50IHJldF9zdGF0dXMgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLCAmcmhfc3RhdHVzKTsKLSAgICAgICAgKmRlc2MgPSBjcHVfdG9fbGUzMihyaF9zdGF0dXMpOwotICAgICAgICByZXR1cm4gcmV0X3N0YXR1czsKKwl1MzIgcmhfc3RhdHVzID0gLTE7CisJaW50IHJldF9zdGF0dXMgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLCAmcmhfc3RhdHVzKTsKKwkqZGVzYyA9IGNwdV90b19sZTMyKHJoX3N0YXR1cyk7CisJcmV0dXJuIHJldF9zdGF0dXM7CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl9yb290aHViX3BvcnRzdGF0dXMoc3RydWN0IHUxMzIgKnUxMzIsIF9fbGUzMiAqZGVzYywgdTE2IHdJbmRleCkKIHsKLSAgICAgICAgaWYgKHdJbmRleCA9PSAwIHx8IHdJbmRleCA+IHUxMzItPm51bV9wb3J0cykgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBwb3J0ID0gd0luZGV4IC0gMTsKLSAgICAgICAgICAgICAgICB1MzIgcmhfcG9ydHN0YXR1cyA9IC0xOwotICAgICAgICAgICAgICAgIGludCByZXRfcG9ydHN0YXR1cyA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RodWIucG9ydHN0YXR1c1twb3J0XSwgJnJoX3BvcnRzdGF0dXMpOwotICAgICAgICAgICAgICAgICpkZXNjID0gY3B1X3RvX2xlMzIocmhfcG9ydHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgaWYgKCoodTE2ICopIChkZXNjICsgMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIlBvcnQgJWQgU3RhdHVzIENoYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZSA9ICUwOFhcbiIsIHBvcnQsICpkZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF9wb3J0c3RhdHVzOwotICAgICAgICB9CisJaWYgKHdJbmRleCA9PSAwIHx8IHdJbmRleCA+IHUxMzItPm51bV9wb3J0cykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpbnQgcG9ydCA9IHdJbmRleCAtIDE7CisJCXUzMiByaF9wb3J0c3RhdHVzID0gLTE7CisJCWludCByZXRfcG9ydHN0YXR1cyA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwKKwkJCXJvb3RodWIucG9ydHN0YXR1c1twb3J0XSwgJnJoX3BvcnRzdGF0dXMpOworCQkqZGVzYyA9IGNwdV90b19sZTMyKHJoX3BvcnRzdGF0dXMpOworCQlpZiAoKih1MTYgKikgKGRlc2MgKyAyKSkgeworCQkJZGV2X2luZm8oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiUG9ydCAlZCBTdGF0dXMgQ2hhbiIKKwkJCQkiZ2UgPSAlMDhYXG4iLCBwb3J0LCAqZGVzYyk7CisJCX0KKwkJcmV0dXJuIHJldF9wb3J0c3RhdHVzOworCX0KIH0KIAogCkBAIC0yNjY2LDM4MSArMjY1MSwzNDAgQEAKICNkZWZpbmUgdGlja19iZWZvcmUodDEsIHQyKSAoKHMxNikoKChzMTYpKHQxKSktKChzMTYpKHQyKSkpIDwgMCkKIHN0YXRpYyBpbnQgdTEzMl9yb290aHViX3BvcnRyZXNldChzdHJ1Y3QgdTEzMiAqdTEzMiwgaW50IHBvcnRfaW5kZXgpCiB7Ci0gICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgIHUzMiBmbW51bWJlcjsKLSAgICAgICAgdTE2IG5vdzsKLSAgICAgICAgdTE2IHJlc2V0X2RvbmU7Ci0gICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgZm1udW1iZXIsICZmbW51bWJlcik7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgbm93ID0gZm1udW1iZXI7Ci0gICAgICAgIHJlc2V0X2RvbmUgPSBub3cgKyBQT1JUX1JFU0VUX01TRUM7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB1MzIgcG9ydHN0YXQ7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sICZwb3J0c3RhdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJIX1BTX1BSUyAmIHBvcnRzdGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRpY2tfYmVmb3JlKG5vdywgcmVzZXRfZG9uZSkpOwotICAgICAgICAgICAgICAgIGlmIChSSF9QU19QUlMgJiBwb3J0c3RhdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICAgICAgICAgIGlmIChSSF9QU19DQ1MgJiBwb3J0c3RhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJIX1BTX1BSU0MgJiBwb3J0c3RhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSF9QU19QUlNDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAvKiBzdGFydCB0aGUgbmV4dCByZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAgdGlsbCBpdCdzIHByb2JhYmx5IGRvbmUgKi8KLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUkhfUFNfUFJTKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgICAgICAgICBtc2xlZXAoUE9SVF9SRVNFVF9IV19NU0VDKTsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtbnVtYmVyLCAmZm1udW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgIG5vdyA9IGZtbnVtYmVyOwotICAgICAgICB9IHdoaWxlICh0aWNrX2JlZm9yZShub3csIHJlc2V0X2RvbmUpKTsKLSAgICAgICAgcmV0dXJuIDA7CisJaW50IHJldHZhbDsKKwl1MzIgZm1udW1iZXI7CisJdTE2IG5vdzsKKwl1MTYgcmVzZXRfZG9uZTsKKwlyZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtbnVtYmVyLCAmZm1udW1iZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbm93ID0gZm1udW1iZXI7CisJcmVzZXRfZG9uZSA9IG5vdyArIFBPUlRfUkVTRVRfTVNFQzsKKwlkbyB7CisJCXUzMiBwb3J0c3RhdDsKKwkJZG8geworCQkJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLAorCQkJCXJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwgJnBvcnRzdGF0KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCWlmIChSSF9QU19QUlMgJiBwb3J0c3RhdCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAodGlja19iZWZvcmUobm93LCByZXNldF9kb25lKSk7CisJCWlmIChSSF9QU19QUlMgJiBwb3J0c3RhdCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoUkhfUFNfQ0NTICYgcG9ydHN0YXQpIHsKKwkJCWlmIChSSF9QU19QUlNDICYgcG9ydHN0YXQpIHsKKwkJCQlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAorCQkJCQlyb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sCisJCQkJCVJIX1BTX1BSU0MpOworCQkJCWlmIChyZXR2YWwpCisJCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0gZWxzZQorCQkJYnJlYWs7CS8qIHN0YXJ0IHRoZSBuZXh0IHJlc2V0LAorCQkJCXNsZWVwIHRpbGwgaXQncyBwcm9iYWJseSBkb25lICovCisJCXJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwKKwkJCSBSSF9QU19QUlMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJbXNsZWVwKFBPUlRfUkVTRVRfSFdfTVNFQyk7CisJCXJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgZm1udW1iZXIsICZmbW51bWJlcik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlub3cgPSBmbW51bWJlcjsKKwl9IHdoaWxlICh0aWNrX2JlZm9yZShub3csIHJlc2V0X2RvbmUpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1MTMyX3Jvb3RodWJfc2V0cG9ydGZlYXR1cmUoc3RydWN0IHUxMzIgKnUxMzIsIHUxNiB3VmFsdWUsCi0gICAgICAgIHUxNiB3SW5kZXgpCisJdTE2IHdJbmRleCkKIHsKLSAgICAgICAgaWYgKHdJbmRleCA9PSAwIHx8IHdJbmRleCA+IHUxMzItPm51bV9wb3J0cykgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgaW50IHBvcnRfaW5kZXggPSB3SW5kZXggLSAxOwotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3BvcnQgKnBvcnQgPSAmdTEzMi0+cG9ydFtwb3J0X2luZGV4XTsKLSAgICAgICAgICAgICAgICBwb3J0LT5TdGF0dXMgJj0gfigxIDw8IHdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwgUkhfUFNfUFNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sIFJIX1BTX1BQUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yb290aHViX3BvcnRyZXNldCh1MTMyLCBwb3J0X2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwlpZiAod0luZGV4ID09IDAgfHwgd0luZGV4ID4gdTEzMi0+bnVtX3BvcnRzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWludCByZXR2YWw7CisJCWludCBwb3J0X2luZGV4ID0gd0luZGV4IC0gMTsKKwkJc3RydWN0IHUxMzJfcG9ydCAqcG9ydCA9ICZ1MTMyLT5wb3J0W3BvcnRfaW5kZXhdOworCQlwb3J0LT5TdGF0dXMgJj0gfigxIDw8IHdWYWx1ZSk7CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwKKwkJCQlyb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sIFJIX1BTX1BTUyk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkJcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwKKwkJCQlyb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sIFJIX1BTX1BQUyk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgorCQkJcmV0dmFsID0gdTEzMl9yb290aHViX3BvcnRyZXNldCh1MTMyLCBwb3J0X2luZGV4KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FUElQRTsKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCB1MTMyX3Jvb3RodWJfY2xlYXJwb3J0ZmVhdHVyZShzdHJ1Y3QgdTEzMiAqdTEzMiwgdTE2IHdWYWx1ZSwKLSAgICAgICAgdTE2IHdJbmRleCkKKwl1MTYgd0luZGV4KQogewotICAgICAgICBpZiAod0luZGV4ID09IDAgfHwgd0luZGV4ID4gdTEzMi0+bnVtX3BvcnRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvcnRfaW5kZXggPSB3SW5kZXggLSAxOwotICAgICAgICAgICAgICAgIHUzMiB0ZW1wOwotICAgICAgICAgICAgICAgIGludCByZXR2YWw7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcG9ydCAqcG9ydCA9ICZ1MTMyLT5wb3J0W3BvcnRfaW5kZXhdOwotICAgICAgICAgICAgICAgIHBvcnQtPlN0YXR1cyAmPSB+KDEgPDwgd1ZhbHVlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHdWYWx1ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9FTkFCTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUkhfUFNfQ0NTOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFJIX1BTX1BFU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19QT0NJOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MTMyLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE9IQ0lfVVNCX09QRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJUT0RPIHJlc3VtZV8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvb3RfaHViXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUkhfUFNfUFNTQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19MU0RBOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19DU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUkhfUFNfT0NJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFJIX1BTX1BSU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5wb3J0c3RhdHVzW3BvcnRfaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXApOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisJaWYgKHdJbmRleCA9PSAwIHx8IHdJbmRleCA+IHUxMzItPm51bV9wb3J0cykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpbnQgcG9ydF9pbmRleCA9IHdJbmRleCAtIDE7CisJCXUzMiB0ZW1wOworCQlpbnQgcmV0dmFsOworCQlzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydF9pbmRleF07CisJCXBvcnQtPlN0YXR1cyAmPSB+KDEgPDwgd1ZhbHVlKTsKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0VOQUJMRToKKwkJCXRlbXAgPSBSSF9QU19DQ1M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgorCQkJdGVtcCA9IFJIX1BTX1BFU0M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisJCQl0ZW1wID0gUkhfUFNfUE9DSTsKKwkJCWlmICgodTEzMi0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKQorCQkJCSE9IE9IQ0lfVVNCX09QRVIpIHsKKwkJCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIlRPRE8gcmVzdW1lXyIKKwkJCQkJInJvb3RfaHViXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EOgorCQkJdGVtcCA9IFJIX1BTX1BTU0M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkJdGVtcCA9IFJIX1BTX0xTREE7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjoKKwkJCXRlbXAgPSBSSF9QU19DU0M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOgorCQkJdGVtcCA9IFJIX1BTX09DSUM7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6CisJCQl0ZW1wID0gUkhfUFNfUFJTQzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FUElQRTsKKwkJfQorCQlyZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sCisJCQkgdGVtcCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlyZXR1cm4gMDsKKwl9CiB9CiAKIAogLyogdGhlIHZpcnR1YWwgcm9vdCBodWIgdGltZXIgSVJRIGNoZWNrcyBmb3IgaHViIHN0YXR1cyovCiBzdGF0aWMgaW50IHUxMzJfaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGNkPSVwIGhhcyBiZWVuIHJlbW92IgotICAgICAgICAgICAgICAgICAgICAgICAgImVkICVkXG4iLCBoY2QsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoY2Q9JXAgaXMgYmVpbmcgcmVtb3YiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZWRcbiIsIGhjZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGksIGNoYW5nZWQgPSAwLCBsZW5ndGggPSAxOwotICAgICAgICAgICAgICAgIGlmICh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfQU1ENzU2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUxMzItPmhjX3Jvb3RodWJfYSAmIFJIX0FfTkRQKSA+IE1BWF9ST09UX1BPUlRTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYm9ndXMgTkRQLCByIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcmVhZHMgYXMgTkRQPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmhjX3Jvb3RodWJfYSAmIFJIX0FfTkRQKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodTEzMi0+aGNfcm9vdGh1Yl9zdGF0dXMgJiAoUkhfSFNfTFBTQyB8IFJIX0hTX09DSUMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZbMF0gPSBjaGFuZ2VkID0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlswXSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHUxMzItPm51bV9wb3J0cyA+IDcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHUxMzItPm51bV9wb3J0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodTEzMi0+aGNfcm9vdGh1Yl9wb3J0c3RhdHVzW2ldICYgKFJIX1BTX0NTQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIX1BTX1BFU0MgfCBSSF9QU19QU1NDIHwgUkhfUFNfT0NJQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIX1BTX1BSU0MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMF0gfD0gMSA8PCAoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMV0gfD0gMSA8PCAoaSAtIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSAmIFJIX1BTX0NDUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSAmIFJIX1BTX1BTUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBkb25lOnJldHVybiBjaGFuZ2VkID8gbGVuZ3RoIDogMDsKLSAgICAgICAgfQorCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBoYXMgYmVlbiByZW1vdiIKKwkJCSJlZCAlZFxuIiwgaGNkLCB1MTMyLT5nb2luZyk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBpcyBiZWluZyByZW1vdiIKKwkJCSJlZFxuIiwgaGNkKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlIHsKKwkJaW50IGksIGNoYW5nZWQgPSAwLCBsZW5ndGggPSAxOworCQlpZiAodTEzMi0+ZmxhZ3MgJiBPSENJX1FVSVJLX0FNRDc1NikgeworCQkJaWYgKCh1MTMyLT5oY19yb290aHViX2EgJiBSSF9BX05EUCkgPiBNQVhfUk9PVF9QT1JUUykgeworCQkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYm9ndXMgTkRQLCByIgorCQkJCQkiZXJlYWRzIGFzIE5EUD0lZFxuIiwKKwkJCQkJdTEzMi0+aGNfcm9vdGh1Yl9hICYgUkhfQV9ORFApOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQlpZiAodTEzMi0+aGNfcm9vdGh1Yl9zdGF0dXMgJiAoUkhfSFNfTFBTQyB8IFJIX0hTX09DSUMpKQorCQkJYnVmWzBdID0gY2hhbmdlZCA9IDE7CisJCWVsc2UKKwkJCWJ1ZlswXSA9IDA7CisJCWlmICh1MTMyLT5udW1fcG9ydHMgPiA3KSB7CisJCQlidWZbMV0gPSAwOworCQkJbGVuZ3RoKys7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHUxMzItPm51bV9wb3J0czsgaSsrKSB7CisJCQlpZiAodTEzMi0+aGNfcm9vdGh1Yl9wb3J0c3RhdHVzW2ldICYgKFJIX1BTX0NTQyB8CisJCQkJUkhfUFNfUEVTQyB8IFJIX1BTX1BTU0MgfCBSSF9QU19PQ0lDIHwKKwkJCQlSSF9QU19QUlNDKSkgeworCQkJCWNoYW5nZWQgPSAxOworCQkJCWlmIChpIDwgNykKKwkJCQkJYnVmWzBdIHw9IDEgPDwgKGkgKyAxKTsKKwkJCQllbHNlCisJCQkJCWJ1ZlsxXSB8PSAxIDw8IChpIC0gNyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoISh1MTMyLT5oY19yb290aHViX3BvcnRzdGF0dXNbaV0gJiBSSF9QU19DQ1MpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKHUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSAmIFJIX1BTX1BTUykpCisJCQkJY29udGludWU7CisJCX0KK2RvbmU6CisJCXJldHVybiBjaGFuZ2VkID8gbGVuZ3RoIDogMDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdTEzMl9odWJfY29udHJvbChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCB1MTYgdHlwZVJlcSwgdTE2IHdWYWx1ZSwKLSAgICAgICAgdTE2IHdJbmRleCwgY2hhciAqYnVmLCB1MTYgd0xlbmd0aCkKKwl1MTYgd0luZGV4LCBjaGFyICpidWYsIHUxNiB3TGVuZ3RoKQogewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgcmV0dmFsID0gMDsKLSAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVSZXEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENsZWFySHViRmVhdHVyZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENfSFVCX09WRVJfQ1VSUkVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzdGFsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2V0SHViRmVhdHVyZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENfSFVCX09WRVJfQ1VSUkVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzdGFsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ2xlYXJQb3J0RmVhdHVyZTp7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcm9vdGh1Yl9jbGVhcnBvcnRmZWF0dXJlKHUxMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZhbHVlLCB3SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgR2V0SHViRGVzY3JpcHRvcjp7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcm9vdGh1Yl9kZXNjcmlwdG9yKHUxMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKilidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgR2V0SHViU3RhdHVzOnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yb290aHViX3N0YXR1cyh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2xlMzIgKikgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEdldFBvcnRTdGF0dXM6ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3Jvb3RodWJfcG9ydHN0YXR1cyh1MTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2xlMzIgKikgYnVmLCB3SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU2V0UG9ydEZlYXR1cmU6ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3Jvb3RodWJfc2V0cG9ydGZlYXR1cmUodTEzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VmFsdWUsIHdJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3RhbGw7Ci0gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6dTEzMl9kaXNhYmxlKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgc3RhbGw6cmV0dmFsID0gLUVQSVBFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQorCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlIHsKKwkJaW50IHJldHZhbCA9IDA7CisJCW11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOworCQlzd2l0Y2ggKHR5cGVSZXEpIHsKKwkJY2FzZSBDbGVhckh1YkZlYXR1cmU6CisJCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQkJY2FzZSBDX0hVQl9PVkVSX0NVUlJFTlQ6CisJCQljYXNlIENfSFVCX0xPQ0FMX1BPV0VSOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIHN0YWxsOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU2V0SHViRmVhdHVyZToKKwkJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIENfSFVCX09WRVJfQ1VSUkVOVDoKKwkJCWNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gc3RhbGw7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDbGVhclBvcnRGZWF0dXJlOnsKKwkJCQlyZXR2YWwgPSB1MTMyX3Jvb3RodWJfY2xlYXJwb3J0ZmVhdHVyZSh1MTMyLAorCQkJCQl3VmFsdWUsIHdJbmRleCk7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOnsKKwkJCQlyZXR2YWwgPSB1MTMyX3Jvb3RodWJfZGVzY3JpcHRvcih1MTMyLAorCQkJCQkoc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqKWJ1Zik7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBHZXRIdWJTdGF0dXM6eworCQkJCXJldHZhbCA9IHUxMzJfcm9vdGh1Yl9zdGF0dXModTEzMiwKKwkJCQkJKF9fbGUzMiAqKSBidWYpOworCQkJCWlmIChyZXR2YWwpCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgR2V0UG9ydFN0YXR1czp7CisJCQkJcmV0dmFsID0gdTEzMl9yb290aHViX3BvcnRzdGF0dXModTEzMiwKKwkJCQkJKF9fbGUzMiAqKSBidWYsIHdJbmRleCk7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBTZXRQb3J0RmVhdHVyZTp7CisJCQkJcmV0dmFsID0gdTEzMl9yb290aHViX3NldHBvcnRmZWF0dXJlKHUxMzIsCisJCQkJCXdWYWx1ZSwgd0luZGV4KTsKKwkJCQlpZiAocmV0dmFsKQorCQkJCQlnb3RvIGVycm9yOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJZ290byBzdGFsbDsKKwkJZXJyb3I6CisJCQl1MTMyX2Rpc2FibGUodTEzMik7CisJCQl1MTMyLT5nb2luZyA9IDE7CisJCQlicmVhazsKKwkJc3RhbGw6CisJCQlyZXR2YWwgPSAtRVBJUEU7CisJCQlicmVhazsKKwkJfQorCQltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KIH0KIAogc3RhdGljIGludCB1MTMyX3N0YXJ0X3BvcnRfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCwgdW5zaWduZWQgcG9ydF9udW0pCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdTEzMl9odWJfaXJxX2VuYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQotewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApCi0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCWlmICh1MTMyLT5nb2luZyA+IDEpIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorCQkJLCB1MTMyLT5nb2luZyk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB1MTMyX2hjZF9zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQotewotICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7Ci0gICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdTEzMl9oY2RfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCi17Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB1MTMyX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwlzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisJaWYgKHUxMzItPmdvaW5nID4gMSkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisJCQksIHUxMzItPmdvaW5nKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0gZWxzZQorCQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1MTMyX2J1c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAwOworCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlCisJCXJldHVybiAwOwogfQogCiAjZWxzZQotI2RlZmluZSB1MTMyX2hjZF9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgdTEzMl9oY2RfcmVzdW1lIE5VTEwKICNkZWZpbmUgdTEzMl9idXNfc3VzcGVuZCBOVUxMCiAjZGVmaW5lIHUxMzJfYnVzX3Jlc3VtZSBOVUxMCiAjZW5kaWYKIHN0YXRpYyBzdHJ1Y3QgaGNfZHJpdmVyIHUxMzJfaGNfZHJpdmVyID0gewotICAgICAgICAuZGVzY3JpcHRpb24gPSBoY2RfbmFtZSwKLSAgICAgICAgLmhjZF9wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IHUxMzIpLAotICAgICAgICAuaXJxID0gTlVMTCwKLSAgICAgICAgLmZsYWdzID0gSENEX1VTQjExIHwgSENEX01FTU9SWSwKLSAgICAgICAgLnJlc2V0ID0gdTEzMl9oY2RfcmVzZXQsCi0gICAgICAgIC5zdGFydCA9IHUxMzJfaGNkX3N0YXJ0LAotICAgICAgICAuc3VzcGVuZCA9IHUxMzJfaGNkX3N1c3BlbmQsCi0gICAgICAgIC5yZXN1bWUgPSB1MTMyX2hjZF9yZXN1bWUsCi0gICAgICAgIC5zdG9wID0gdTEzMl9oY2Rfc3RvcCwKLSAgICAgICAgLnVyYl9lbnF1ZXVlID0gdTEzMl91cmJfZW5xdWV1ZSwKLSAgICAgICAgLnVyYl9kZXF1ZXVlID0gdTEzMl91cmJfZGVxdWV1ZSwKLSAgICAgICAgLmVuZHBvaW50X2Rpc2FibGUgPSB1MTMyX2VuZHBvaW50X2Rpc2FibGUsCi0gICAgICAgIC5nZXRfZnJhbWVfbnVtYmVyID0gdTEzMl9nZXRfZnJhbWUsCi0gICAgICAgIC5odWJfc3RhdHVzX2RhdGEgPSB1MTMyX2h1Yl9zdGF0dXNfZGF0YSwKLSAgICAgICAgLmh1Yl9jb250cm9sID0gdTEzMl9odWJfY29udHJvbCwKLSAgICAgICAgLmJ1c19zdXNwZW5kID0gdTEzMl9idXNfc3VzcGVuZCwKLSAgICAgICAgLmJ1c19yZXN1bWUgPSB1MTMyX2J1c19yZXN1bWUsCi0gICAgICAgIC5zdGFydF9wb3J0X3Jlc2V0ID0gdTEzMl9zdGFydF9wb3J0X3Jlc2V0LAotICAgICAgICAuaHViX2lycV9lbmFibGUgPSB1MTMyX2h1Yl9pcnFfZW5hYmxlLAorCS5kZXNjcmlwdGlvbiA9IGhjZF9uYW1lLAorCS5oY2RfcHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1MTMyKSwKKwkuaXJxID0gTlVMTCwKKwkuZmxhZ3MgPSBIQ0RfVVNCMTEgfCBIQ0RfTUVNT1JZLAorCS5yZXNldCA9IHUxMzJfaGNkX3Jlc2V0LAorCS5zdGFydCA9IHUxMzJfaGNkX3N0YXJ0LAorCS5zdG9wID0gdTEzMl9oY2Rfc3RvcCwKKwkudXJiX2VucXVldWUgPSB1MTMyX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZSA9IHUxMzJfdXJiX2RlcXVldWUsCisJLmVuZHBvaW50X2Rpc2FibGUgPSB1MTMyX2VuZHBvaW50X2Rpc2FibGUsCisJLmdldF9mcmFtZV9udW1iZXIgPSB1MTMyX2dldF9mcmFtZSwKKwkuaHViX3N0YXR1c19kYXRhID0gdTEzMl9odWJfc3RhdHVzX2RhdGEsCisJLmh1Yl9jb250cm9sID0gdTEzMl9odWJfY29udHJvbCwKKwkuYnVzX3N1c3BlbmQgPSB1MTMyX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lID0gdTEzMl9idXNfcmVzdW1lLAorCS5zdGFydF9wb3J0X3Jlc2V0ID0gdTEzMl9zdGFydF9wb3J0X3Jlc2V0LAogfTsKIAogLyoKQEAgLTMwNTEsMTQ4ICsyOTk1LDE1MiBAQAogKi8KIHN0YXRpYyBpbnQgX19kZXZleGl0IHUxMzJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0gICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLSAgICAgICAgaWYgKGhjZCkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgICAgICAgICBpZiAodTEzMi0+Z29pbmcrKyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYWxyZWFkeSBiZWluZyByZW1vdmUiCisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWlmIChoY2QpIHsKKwkJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCQlpZiAodTEzMi0+Z29pbmcrKyA+IDEpIHsKKwkJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYWxyZWFkeSBiZWluZyByZW1vdmUiCiAJCQkJImRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByaW5ncyA9IE1BWF9VMTMyX1JJTkdTOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZHBzID0gTUFYX1UxMzJfRU5EUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInJlbW92aW5nIGRldmljZSB1MTMyIgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0gZWxzZSB7CisJCQlpbnQgcmluZ3MgPSBNQVhfVTEzMl9SSU5HUzsKKwkJCWludCBlbmRwcyA9IE1BWF9VMTMyX0VORFBTOworCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJyZW1vdmluZyBkZXZpY2UgdTEzMiIKIAkJCQkiLiVkXG4iLCB1MTMyLT5zZXF1ZW5jZV9udW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdXRleF9sb2NrKCZ1MTMyLT5zd19sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfbW9uaXRvcl9jYW5jZWxfd29yayh1MTMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyaW5ncy0tID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gJnUxMzItPnJpbmdbcmluZ3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfY2FuY2VsX3dvcmsodTEzMiwgcmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChlbmRwcy0tID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gdTEzMi0+ZW5kcFtlbmRwc107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9jYW5jZWxfd29yayh1MTMyLCBlbmRwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmdvaW5nICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyZW1vdmluZyBkZXZpY2UgdTEzMi4lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+c2VxdWVuY2VfbnVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2JfcmVtb3ZlX2hjZChoY2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl91MTMyX3B1dF9rcmVmKHUxMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJCW1zbGVlcCgxMDApOworCQkJbXV0ZXhfbG9jaygmdTEzMi0+c3dfbG9jayk7CisJCQl1MTMyX21vbml0b3JfY2FuY2VsX3dvcmsodTEzMik7CisJCQl3aGlsZSAocmluZ3MtLSA+IDApIHsKKwkJCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gJnUxMzItPnJpbmdbcmluZ3NdOworCQkJCXUxMzJfcmluZ19jYW5jZWxfd29yayh1MTMyLCByaW5nKTsKKwkJCX0gd2hpbGUgKGVuZHBzLS0gPiAwKSB7CisJCQkJc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHUxMzItPmVuZHBbZW5kcHNdOworCQkJCWlmIChlbmRwKQorCQkJCQl1MTMyX2VuZHBfY2FuY2VsX3dvcmsodTEzMiwgZW5kcCk7CisJCQl9CisJCQl1MTMyLT5nb2luZyArPSAxOworCQkJcHJpbnRrKEtFUk5fSU5GTyAicmVtb3ZpbmcgZGV2aWNlIHUxMzIuJWRcbiIsCisJCQkJdTEzMi0+c2VxdWVuY2VfbnVtKTsKKwkJCW11dGV4X3VubG9jaygmdTEzMi0+c3dfbG9jayk7CisJCQl1c2JfcmVtb3ZlX2hjZChoY2QpOworCQkJdTEzMl91MTMyX3B1dF9rcmVmKHUxMzIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHUxMzJfaW5pdGlhbGlzZShzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLSAgICAgICAgaW50IHJpbmdzID0gTUFYX1UxMzJfUklOR1M7Ci0gICAgICAgIGludCBwb3J0cyA9IE1BWF9VMTMyX1BPUlRTOwotICAgICAgICBpbnQgYWRkcnMgPSBNQVhfVTEzMl9BRERSUzsKLSAgICAgICAgaW50IHVkZXZzID0gTUFYX1UxMzJfVURFVlM7Ci0gICAgICAgIGludCBlbmRwcyA9IE1BWF9VMTMyX0VORFBTOwotICAgICAgICB1MTMyLT5ib2FyZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotICAgICAgICB1MTMyLT5wbGF0Zm9ybV9kZXYgPSBwZGV2OwotICAgICAgICB1MTMyLT5wb3dlciA9IDA7Ci0gICAgICAgIHUxMzItPnJlc2V0ID0gMDsKLSAgICAgICAgbXV0ZXhfaW5pdCgmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgIGluaXRfTVVURVgoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKLSAgICAgICAgd2hpbGUgKHJpbmdzLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZyA9ICZ1MTMyLT5yaW5nW3JpbmdzXTsKLSAgICAgICAgICAgICAgICByaW5nLT51MTMyID0gdTEzMjsKLSAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIgPSByaW5ncyArIDE7Ci0gICAgICAgICAgICAgICAgcmluZy0+bGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBOVUxMOwotICAgICAgICAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZyaW5nLT5zY2hlZHVsZXIsCisJaW50IHJpbmdzID0gTUFYX1UxMzJfUklOR1M7CisJaW50IHBvcnRzID0gTUFYX1UxMzJfUE9SVFM7CisJaW50IGFkZHJzID0gTUFYX1UxMzJfQUREUlM7CisJaW50IHVkZXZzID0gTUFYX1UxMzJfVURFVlM7CisJaW50IGVuZHBzID0gTUFYX1UxMzJfRU5EUFM7CisJdTEzMi0+Ym9hcmQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1MTMyLT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCXUxMzItPnBvd2VyID0gMDsKKwl1MTMyLT5yZXNldCA9IDA7CisJbXV0ZXhfaW5pdCgmdTEzMi0+c3dfbG9jayk7CisJbXV0ZXhfaW5pdCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworCXdoaWxlIChyaW5ncy0tID4gMCkgeworCQlzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gJnUxMzItPnJpbmdbcmluZ3NdOworCQlyaW5nLT51MTMyID0gdTEzMjsKKwkJcmluZy0+bnVtYmVyID0gcmluZ3MgKyAxOworCQlyaW5nLT5sZW5ndGggPSAwOworCQlyaW5nLT5jdXJyX2VuZHAgPSBOVUxMOworCQlJTklUX0RFTEFZRURfV09SSygmcmluZy0+c2NoZWR1bGVyLAogCQkJCSAgdTEzMl9oY2RfcmluZ193b3JrX3NjaGVkdWxlcik7Ci0gICAgICAgIH0gbXV0ZXhfbG9jaygmdTEzMi0+c3dfbG9jayk7Ci0gICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZ1MTMyLT5tb25pdG9yLCB1MTMyX2hjZF9tb25pdG9yX3dvcmspOwotICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydHNdOwotICAgICAgICAgICAgICAgIHBvcnQtPnUxMzIgPSB1MTMyOwotICAgICAgICAgICAgICAgIHBvcnQtPnJlc2V0ID0gMDsKLSAgICAgICAgICAgICAgICBwb3J0LT5lbmFibGUgPSAwOwotICAgICAgICAgICAgICAgIHBvcnQtPnBvd2VyID0gMDsKLSAgICAgICAgICAgICAgICBwb3J0LT5TdGF0dXMgPSAwOwotICAgICAgICB9IHdoaWxlIChhZGRycy0tID4gMCkgewotICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2FkZHIgKmFkZHIgPSAmdTEzMi0+YWRkclthZGRyc107Ci0gICAgICAgICAgICAgICAgYWRkci0+YWRkcmVzcyA9IDA7Ci0gICAgICAgIH0gd2hpbGUgKHVkZXZzLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W3VkZXZzXTsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IEFSUkFZX1NJWkUodWRldi0+ZW5kcF9udW1iZXJfaW4pOwotICAgICAgICAgICAgICAgIGludCBvID0gQVJSQVlfU0laRSh1ZGV2LT5lbmRwX251bWJlcl9vdXQpOwotICAgICAgICAgICAgICAgIHVkZXYtPnVzYl9kZXZpY2UgPSBOVUxMOwotICAgICAgICAgICAgICAgIHVkZXYtPnVkZXZfbnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICB1ZGV2LT51c2JfYWRkciA9IDA7Ci0gICAgICAgICAgICAgICAgdWRldi0+cG9ydG51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGktLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG8tLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX291dFtvXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChlbmRwcy0tID4gMCkgewotICAgICAgICAgICAgICAgIHUxMzItPmVuZHBbZW5kcHNdID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBtdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOwotICAgICAgICByZXR1cm47CisJfQorCW11dGV4X2xvY2soJnUxMzItPnN3X2xvY2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZ1MTMyLT5tb25pdG9yLCB1MTMyX2hjZF9tb25pdG9yX3dvcmspOworCXdoaWxlIChwb3J0cy0tID4gMCkgeworCQlzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydHNdOworCQlwb3J0LT51MTMyID0gdTEzMjsKKwkJcG9ydC0+cmVzZXQgPSAwOworCQlwb3J0LT5lbmFibGUgPSAwOworCQlwb3J0LT5wb3dlciA9IDA7CisJCXBvcnQtPlN0YXR1cyA9IDA7CisJfQorCXdoaWxlIChhZGRycy0tID4gMCkgeworCQlzdHJ1Y3QgdTEzMl9hZGRyICphZGRyID0gJnUxMzItPmFkZHJbYWRkcnNdOworCQlhZGRyLT5hZGRyZXNzID0gMDsKKwl9CisJd2hpbGUgKHVkZXZzLS0gPiAwKSB7CisJCXN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlt1ZGV2c107CisJCWludCBpID0gQVJSQVlfU0laRSh1ZGV2LT5lbmRwX251bWJlcl9pbik7CisJCWludCBvID0gQVJSQVlfU0laRSh1ZGV2LT5lbmRwX251bWJlcl9vdXQpOworCQl1ZGV2LT51c2JfZGV2aWNlID0gTlVMTDsKKwkJdWRldi0+dWRldl9udW1iZXIgPSAwOworCQl1ZGV2LT51c2JfYWRkciA9IDA7CisJCXVkZXYtPnBvcnRudW1iZXIgPSAwOworCQl3aGlsZSAoaS0tID4gMCkKKwkJCXVkZXYtPmVuZHBfbnVtYmVyX2luW2ldID0gMDsKKworCQl3aGlsZSAoby0tID4gMCkKKwkJCXVkZXYtPmVuZHBfbnVtYmVyX291dFtvXSA9IDA7CisKKwl9CisJd2hpbGUgKGVuZHBzLS0gPiAwKQorCQl1MTMyLT5lbmRwW2VuZHBzXSA9IE5VTEw7CisKKwltdXRleF91bmxvY2soJnUxMzItPnN3X2xvY2spOworCXJldHVybjsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgdTEzMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkOwotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICB1MzIgY29udHJvbDsKLSAgICAgICAgdTMyIHJoX2EgPSAtMTsKLSAgICAgICAgdTMyIG51bV9wb3J0czsKLSAgICAgICAgbXNsZWVwKDEwMCk7Ci0gICAgICAgIGlmICh1MTMyX2V4aXRpbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gZnRkaV93cml0ZV9wY2ltZW0ocGRldiwgaW50cmRpc2FibGUsIE9IQ0lfSU5UUl9NSUUpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IGZ0ZGlfcmVhZF9wY2ltZW0ocGRldiwgY29udHJvbCwgJmNvbnRyb2wpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIHJldHZhbCA9IGZ0ZGlfcmVhZF9wY2ltZW0ocGRldiwgcm9vdGh1Yi5hLCAmcmhfYSk7Ci0gICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgbnVtX3BvcnRzID0gcmhfYSAmIFJIX0FfTkRQOyAgICAgICAgLyogcmVmdXNlIHRvIGNvbmZ1c2UgdXNiY29yZSAqLwotICAgICAgICBpZiAocGRldi0+ZGV2LmRtYV9tYXNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnUxMzJfaGNfZHJpdmVyLCAmcGRldi0+ZGV2LCBwZGV2LT5kZXYuYnVzX2lkKTsKLSAgICAgICAgaWYgKCFoY2QpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBjcmVhdGUgdGhlIHVzYiBoY2Qgc3RydWN0IGZvciBVMTMyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9nb25lX2F3YXkocGRldik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICAgICAgICAgIGhjZC0+cnNyY19zdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbXV0ZXhfbG9jaygmdTEzMl9tb2R1bGVfbG9jayk7Ci0gICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmdTEzMi0+dTEzMl9saXN0LCAmdTEzMl9zdGF0aWNfbGlzdCk7Ci0gICAgICAgICAgICAgICAgdTEzMi0+c2VxdWVuY2VfbnVtID0gKyt1MTMyX2luc3RhbmNlczsKLSAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJnUxMzJfbW9kdWxlX2xvY2spOwotICAgICAgICAgICAgICAgIHUxMzJfdTEzMl9pbml0X2tyZWYodTEzMik7Ci0gICAgICAgICAgICAgICAgdTEzMl9pbml0aWFsaXNlKHUxMzIsIHBkZXYpOwotICAgICAgICAgICAgICAgIGhjZC0+cHJvZHVjdF9kZXNjID0gIkVMQU4gVTEzMiBIb3N0IENvbnRyb2xsZXIiOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9hZGRfaGNkKGhjZCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImluaXQgZXJyb3IgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3UxMzJfcHV0X2tyZWYodTEzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MTMyX21vbml0b3JfcXVldWVfd29yayh1MTMyLCAxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlpbnQgcmV0dmFsOworCXUzMiBjb250cm9sOworCXUzMiByaF9hID0gLTE7CisJdTMyIG51bV9wb3J0czsKKworCW1zbGVlcCgxMDApOworCWlmICh1MTMyX2V4aXRpbmcgPiAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHZhbCA9IGZ0ZGlfd3JpdGVfcGNpbWVtKHBkZXYsIGludHJkaXNhYmxlLCBPSENJX0lOVFJfTUlFKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IGZ0ZGlfcmVhZF9wY2ltZW0ocGRldiwgY29udHJvbCwgJmNvbnRyb2wpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gZnRkaV9yZWFkX3BjaW1lbShwZGV2LCByb290aHViLmEsICZyaF9hKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW51bV9wb3J0cyA9IHJoX2EgJiBSSF9BX05EUDsJLyogcmVmdXNlIHRvIGNvbmZ1c2UgdXNiY29yZSAqLworCWlmIChwZGV2LT5kZXYuZG1hX21hc2spCisJCXJldHVybiAtRUlOVkFMOworCisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnUxMzJfaGNfZHJpdmVyLCAmcGRldi0+ZGV2LCBwZGV2LT5kZXYuYnVzX2lkKTsKKwlpZiAoIWhjZCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBjcmVhdGUgdGhlIHVzYiBoY2Qgc3RydWN0IGZvciBVMTMyXG4iCisJCQkpOworCQlmdGRpX2VsYW5fZ29uZV9hd2F5KHBkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQlpbnQgcmV0dmFsID0gMDsKKwkJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCQloY2QtPnJzcmNfc3RhcnQgPSAwOworCQltdXRleF9sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmdTEzMi0+dTEzMl9saXN0LCAmdTEzMl9zdGF0aWNfbGlzdCk7CisJCXUxMzItPnNlcXVlbmNlX251bSA9ICsrdTEzMl9pbnN0YW5jZXM7CisJCW11dGV4X3VubG9jaygmdTEzMl9tb2R1bGVfbG9jayk7CisJCXUxMzJfdTEzMl9pbml0X2tyZWYodTEzMik7CisJCXUxMzJfaW5pdGlhbGlzZSh1MTMyLCBwZGV2KTsKKwkJaGNkLT5wcm9kdWN0X2Rlc2MgPSAiRUxBTiBVMTMyIEhvc3QgQ29udHJvbGxlciI7CisJCXJldHZhbCA9IHVzYl9hZGRfaGNkKGhjZCwgMCwgMCk7CisJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJpbml0IGVycm9yICVkXG4iLAorCQkJCXJldHZhbCk7CisJCQl1MTMyX3UxMzJfcHV0X2tyZWYodTEzMik7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9IGVsc2UgeworCQkJdTEzMl9tb25pdG9yX3F1ZXVlX3dvcmsodTEzMiwgMTAwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQogfQogCiAKQEAgLTMyMDMsNjEgKzMxNTEsNTggQEAKICovCiBzdGF0aWMgaW50IHUxMzJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0gICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOwotICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047Ci0gICAgICAgIH0gZWxzZSB7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKwlpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKwkJCSwgdTEzMi0+Z29pbmcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworCQlkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfSBlbHNlIHsKIAkJaW50IHJldHZhbCA9IDAsIHBvcnRzOwogCiAJCXN3aXRjaCAoc3RhdGUuZXZlbnQpIHsKIAkJY2FzZSBQTV9FVkVOVF9GUkVFWkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX2J1c19zdXNwZW5kKGhjZCk7CisJCQlyZXR2YWwgPSB1MTMyX2J1c19zdXNwZW5kKGhjZCk7CiAJCQlicmVhazsKIAkJY2FzZSBQTV9FVkVOVF9TVVNQRU5EOgogCQljYXNlIFBNX0VWRU5UX0hJQkVSTkFURToKIAkJCXBvcnRzID0gTUFYX1UxMzJfUE9SVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9wb3dlcih1MTMyLCBwb3J0cywgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisJCQl3aGlsZSAocG9ydHMtLSA+IDApIHsKKwkJCQlwb3J0X3Bvd2VyKHUxMzIsIHBvcnRzLCAwKTsKKwkJCX0KIAkJCWJyZWFrOwogCQl9Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQorCQlyZXR1cm4gcmV0dmFsOworCX0KIH0KIAogc3RhdGljIGludCB1MTMyX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKLSAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOwotICAgICAgICAgICAgICAgIGlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnRzID0gTUFYX1UxMzJfUE9SVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9wb3dlcih1MTMyLCBwb3J0cywgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9idXNfcmVzdW1lKGhjZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworCWlmICh1MTMyLT5nb2luZyA+IDEpIHsKKwkJZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorCQkJLCB1MTMyLT5nb2luZyk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisJCWRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9IGVsc2UgeworCQlpbnQgcmV0dmFsID0gMDsKKwkJaWYgKCF1MTMyLT5wb3J0WzBdLnBvd2VyKSB7CisJCQlpbnQgcG9ydHMgPSBNQVhfVTEzMl9QT1JUUzsKKwkJCXdoaWxlIChwb3J0cy0tID4gMCkgeworCQkJCXBvcnRfcG93ZXIodTEzMiwgcG9ydHMsIDEpOworCQkJfQorCQkJcmV0dmFsID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IHUxMzJfYnVzX3Jlc3VtZShoY2QpOworCQl9CisJCXJldHVybiByZXR2YWw7CisJfQogfQogCiAjZWxzZQpAQCAtMzI3MCw0NyArMzIxNSw0OCBAQAogKiB0aGUgcGxhdGZvcm1fZHJpdmVyIHN0cnVjdCBpcyBzdGF0aWMgYmVjYXVzZSBpdCBpcyBwZXIgdHlwZSBvZiBtb2R1bGUKICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1MTMyX3BsYXRmb3JtX2RyaXZlciA9IHsKLSAgICAgICAgLnByb2JlID0gdTEzMl9wcm9iZSwKLSAgICAgICAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHUxMzJfcmVtb3ZlKSwKLSAgICAgICAgLnN1c3BlbmQgPSB1MTMyX3N1c3BlbmQsCi0gICAgICAgIC5yZXN1bWUgPSB1MTMyX3Jlc3VtZSwKLSAgICAgICAgLmRyaXZlciA9IHsKLSAgICAgICAgICAgICAgICAgICAubmFtZSA9IChjaGFyICopaGNkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgfSwKKwkucHJvYmUgPSB1MTMyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh1MTMyX3JlbW92ZSksCisJLnN1c3BlbmQgPSB1MTMyX3N1c3BlbmQsCisJLnJlc3VtZSA9IHUxMzJfcmVzdW1lLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gKGNoYXIgKiloY2RfbmFtZSwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIH0sCiB9Owogc3RhdGljIGludCBfX2luaXQgdTEzMl9oY2RfaW5pdCh2b2lkKQogewotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICBJTklUX0xJU1RfSEVBRCgmdTEzMl9zdGF0aWNfbGlzdCk7Ci0gICAgICAgIHUxMzJfaW5zdGFuY2VzID0gMDsKLSAgICAgICAgdTEzMl9leGl0aW5nID0gMDsKLSAgICAgICAgbXV0ZXhfaW5pdCgmdTEzMl9tb2R1bGVfbG9jayk7Ci0gICAgICAgIGlmICh1c2JfZGlzYWJsZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZHJpdmVyICVzIGJ1aWx0IGF0ICVzIG9uICVzXG4iLCBoY2RfbmFtZSwgX19USU1FX18sCi0gICAgICAgICAgICAgICAgX19EQVRFX18pOwotICAgICAgICB3b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidTEzMiIpOwotICAgICAgICByZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnUxMzJfcGxhdGZvcm1fZHJpdmVyKTsKLSAgICAgICAgcmV0dXJuIHJldHZhbDsKKwlpbnQgcmV0dmFsOworCUlOSVRfTElTVF9IRUFEKCZ1MTMyX3N0YXRpY19saXN0KTsKKwl1MTMyX2luc3RhbmNlcyA9IDA7CisJdTEzMl9leGl0aW5nID0gMDsKKwltdXRleF9pbml0KCZ1MTMyX21vZHVsZV9sb2NrKTsKKwlpZiAodXNiX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOworCXByaW50ayhLRVJOX0lORk8gImRyaXZlciAlcyBidWlsdCBhdCAlcyBvbiAlc1xuIiwgaGNkX25hbWUsIF9fVElNRV9fLAorCQlfX0RBVEVfXyk7CisJd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInUxMzIiKTsKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnUxMzJfcGxhdGZvcm1fZHJpdmVyKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAKIG1vZHVsZV9pbml0KHUxMzJfaGNkX2luaXQpOwogc3RhdGljIHZvaWQgX19leGl0IHUxMzJfaGNkX2V4aXQodm9pZCkKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzI7Ci0gICAgICAgIHN0cnVjdCB1MTMyICp0ZW1wOwotICAgICAgICBtdXRleF9sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKLSAgICAgICAgdTEzMl9leGl0aW5nICs9IDE7Ci0gICAgICAgIG11dGV4X3VubG9jaygmdTEzMl9tb2R1bGVfbG9jayk7Ci0gICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1MTMyLCB0ZW1wLCAmdTEzMl9zdGF0aWNfbGlzdCwgdTEzMl9saXN0KSB7Ci0gICAgICAgICAgICAgICAgcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodTEzMi0+cGxhdGZvcm1fZGV2KTsKLSAgICAgICAgfSBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdTEzMl9wbGF0Zm9ybV9kcml2ZXIpOwotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJ1MTMyLWhjZCBkcml2ZXIgZGVyZWdpc3RlcmVkXG4iKTsKLSAgICAgICAgd2FpdF9ldmVudCh1MTMyX2hjZF93YWl0LCB1MTMyX2luc3RhbmNlcyA9PSAwKTsKLSAgICAgICAgZmx1c2hfd29ya3F1ZXVlKHdvcmtxdWV1ZSk7Ci0gICAgICAgIGRlc3Ryb3lfd29ya3F1ZXVlKHdvcmtxdWV1ZSk7CisJc3RydWN0IHUxMzIgKnUxMzI7CisJc3RydWN0IHUxMzIgKnRlbXA7CisJbXV0ZXhfbG9jaygmdTEzMl9tb2R1bGVfbG9jayk7CisJdTEzMl9leGl0aW5nICs9IDE7CisJbXV0ZXhfdW5sb2NrKCZ1MTMyX21vZHVsZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodTEzMiwgdGVtcCwgJnUxMzJfc3RhdGljX2xpc3QsIHUxMzJfbGlzdCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih1MTMyLT5wbGF0Zm9ybV9kZXYpOworCX0KKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdTEzMl9wbGF0Zm9ybV9kcml2ZXIpOworCXByaW50ayhLRVJOX0lORk8gInUxMzItaGNkIGRyaXZlciBkZXJlZ2lzdGVyZWRcbiIpOworCXdhaXRfZXZlbnQodTEzMl9oY2Rfd2FpdCwgdTEzMl9pbnN0YW5jZXMgPT0gMCk7CisJZmx1c2hfd29ya3F1ZXVlKHdvcmtxdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUod29ya3F1ZXVlKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKaW5kZXggZWM5ODc4OS4uZDNlMGQ4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwpAQCAtMjYyLDIwICsyNjIsMTIgQEAKIHsKIAlpbnQgYXV0b19zdG9wOwogCWludCBpbnRfZW5hYmxlLCBlZ3NtX2VuYWJsZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXYgPSB1aGNpX3RvX2hjZCh1aGNpKS0+c2VsZi5yb290X2h1YjsKIAogCWF1dG9fc3RvcCA9IChuZXdfc3RhdGUgPT0gVUhDSV9SSF9BVVRPX1NUT1BQRUQpOwotCWRldl9kYmcoJnVoY2lfdG9faGNkKHVoY2kpLT5zZWxmLnJvb3RfaHViLT5kZXYsCi0JCQkiJXMlc1xuIiwgX19GVU5DVElPTl9fLAorCWRldl9kYmcoJnJoZGV2LT5kZXYsICIlcyVzXG4iLCBfX2Z1bmNfXywKIAkJCShhdXRvX3N0b3AgPyAiIChhdXRvLXN0b3ApIiA6ICIiKSk7CiAKLQkvKiBJZiB3ZSBnZXQgYSBzdXNwZW5kIHJlcXVlc3Qgd2hlbiB3ZSdyZSBhbHJlYWR5IGF1dG8tc3RvcHBlZAotCSAqIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgotCSAqLwotCWlmICh1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX0FVVE9fU1RPUFBFRCkgewotCQl1aGNpLT5yaF9zdGF0ZSA9IG5ld19zdGF0ZTsKLQkJcmV0dXJuOwotCX0KLQogCS8qIEVuYWJsZSByZXN1bWUtZGV0ZWN0IGludGVycnVwdHMgaWYgdGhleSB3b3JrLgogCSAqIFRoZW4gZW50ZXIgR2xvYmFsIFN1c3BlbmQgbW9kZSBpZiBfaXRfIHdvcmtzLCBzdGlsbCBjb25maWd1cmVkLgogCSAqLwpAQCAtMjg1LDggKzI3NywxMCBAQAogCWlmIChyZW1vdGVfd2FrZXVwX2lzX2Jyb2tlbih1aGNpKSkKIAkJZWdzbV9lbmFibGUgPSAwOwogCWlmIChyZXN1bWVfZGV0ZWN0X2ludGVycnVwdHNfYXJlX2Jyb2tlbih1aGNpKSB8fCAhZWdzbV9lbmFibGUgfHwKLQkJCSFkZXZpY2VfbWF5X3dha2V1cCgKLQkJCQkmdWhjaV90b19oY2QodWhjaSktPnNlbGYucm9vdF9odWItPmRldikpCisjaWZkZWYgQ09ORklHX1BNCisJCQkoIWF1dG9fc3RvcCAmJiAhcmhkZXYtPmRvX3JlbW90ZV93YWtldXApIHx8CisjZW5kaWYKKwkJCShhdXRvX3N0b3AgJiYgIWRldmljZV9tYXlfd2FrZXVwKCZyaGRldi0+ZGV2KSkpCiAJCXVoY2ktPndvcmtpbmdfUkQgPSBpbnRfZW5hYmxlID0gMDsKIAogCW91dHcoaW50X2VuYWJsZSwgdWhjaS0+aW9fYWRkciArIFVTQklOVFIpOwpAQCAtMzA4LDggKzMwMiw3IEBACiAJCQlyZXR1cm47CiAJfQogCWlmICghKGludyh1aGNpLT5pb19hZGRyICsgVVNCU1RTKSAmIFVTQlNUU19IQ0gpKQotCQlkZXZfd2FybigmdWhjaV90b19oY2QodWhjaSktPnNlbGYucm9vdF9odWItPmRldiwKLQkJCSJDb250cm9sbGVyIG5vdCBzdG9wcGVkIHlldCFcbiIpOworCQlkZXZfd2Fybih1aGNpX2Rldih1aGNpKSwgIkNvbnRyb2xsZXIgbm90IHN0b3BwZWQgeWV0IVxuIik7CiAKIAl1aGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcih1aGNpKTsKIApAQCAtMzQyLDcgKzMzNSw3IEBACiBfX2FjcXVpcmVzKHVoY2ktPmxvY2spCiB7CiAJZGV2X2RiZygmdWhjaV90b19oY2QodWhjaSktPnNlbGYucm9vdF9odWItPmRldiwKLQkJCSIlcyVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkiJXMlc1xuIiwgX19mdW5jX18sCiAJCQl1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX0FVVE9fU1RPUFBFRCA/CiAJCQkJIiAoYXV0by1zdGFydCkiIDogIiIpOwogCkBAIC03MzcsMTIgKzczMCwxMiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCB1aGNpX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitzdGF0aWMgaW50IHVoY2lfcGNpX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7CiAJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKIAlpbnQgcmMgPSAwOwogCi0JZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcodWhjaV9kZXYodWhjaSksICIlc1xuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycSgmdWhjaS0+bG9jayk7CiAJaWYgKCF0ZXN0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncykgfHwgdWhjaS0+ZGVhZCkKQEAgLTc3NCwxMSArNzY3LDExIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHVoY2lfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCitzdGF0aWMgaW50IHVoY2lfcGNpX3Jlc3VtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CiAKLQlkZXZfZGJnKHVoY2lfZGV2KHVoY2kpLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBTaW5jZSB3ZSBhcmVuJ3QgaW4gRDMgYW55IG1vcmUsIGl0J3Mgc2FmZSB0byBzZXQgdGhpcyBmbGFnCiAJICogZXZlbiBpZiB0aGUgY29udHJvbGxlciB3YXMgZGVhZC4KQEAgLTg3Miw4ICs4NjUsOCBAQAogCS5yZXNldCA9CQl1aGNpX2luaXQsCiAJLnN0YXJ0ID0JCXVoY2lfc3RhcnQsCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgPQkJdWhjaV9zdXNwZW5kLAotCS5yZXN1bWUgPQkJdWhjaV9yZXN1bWUsCisJLnBjaV9zdXNwZW5kID0JCXVoY2lfcGNpX3N1c3BlbmQsCisJLnBjaV9yZXN1bWUgPQkJdWhjaV9wY2lfcmVzdW1lLAogCS5idXNfc3VzcGVuZCA9CQl1aGNpX3JoX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJdWhjaV9yaF9yZXN1bWUsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jCmluZGV4IDYwMzc5YjEuLmRiNjQ1OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYwpAQCAtMTE3MSw3ICsxMTcxLDcgQEAKIAkJCQkvKiBTb21lIGRlYnVnZ2luZyBjb2RlICovCiAJCQkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwKIAkJCQkJCSIlczogZmFpbGVkIHdpdGggc3RhdHVzICV4XG4iLAotCQkJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAKIAkJCQlpZiAoZGVidWcgPiAxICYmIGVycmJ1ZikgewogCQkJCQkvKiBQcmludCB0aGUgY2hhaW4gZm9yIGRlYnVnZ2luZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW1hZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2ltYWdlL0tjb25maWcKaW5kZXggNzU5NWRmYi4uMzMzNTBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW1hZ2UvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9pbWFnZS9LY29uZmlnCkBAIC01LDggKzUsOCBAQAogCWRlcGVuZHMgb24gVVNCCiAKIGNvbmZpZyBVU0JfTURDODAwCi0JdHJpc3RhdGUgIlVTQiBNdXN0ZWsgTURDODAwIERpZ2l0YWwgQ2FtZXJhIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlVTQiBNdXN0ZWsgTURDODAwIERpZ2l0YWwgQ2FtZXJhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdGhpcyB0eXBlIG9mIHN0aWxsIGNhbWVyYSB0bwogCSAgeW91ciBjb21wdXRlcidzIFVTQiBwb3J0LiBUaGlzIGRyaXZlciBjYW4gYmUgdXNlZCB3aXRoIGdwaG90byAwLjQuMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYyBiL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMKaW5kZXggYmMyMDdlMy4uODg1ODY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYworKysgYi9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAlwcmludGsoIEtFUk5fREVCVUcgTVRTX05BTUUgeCApCiAKICNkZWZpbmUgTVRTX0RFQlVHX0dPVF9IRVJFKCkgXAotCU1UU19ERUJVRygiZ290IHRvICVzOiVkICglcylcbiIsIF9fRklMRV9fLCAoaW50KV9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fICkKKwlNVFNfREVCVUcoImdvdCB0byAlczolZCAoJXMpXG4iLCBfX0ZJTEVfXywgKGludClfX0xJTkVfXywgX19mdW5jX18gKQogI2RlZmluZSBNVFNfREVCVUdfSU5UKCkgXAogCWRvIHsgTVRTX0RFQlVHX0dPVF9IRVJFKCk7IFwKIAkgICAgIE1UU19ERUJVRygidHJhbnNmZXIgPSAweCV4IGNvbnRleHQgPSAweCV4XG4iLChpbnQpdHJhbnNmZXIsKGludCljb250ZXh0ICk7IFwKQEAgLTc5NCw3ICs3OTQsNiBAQAogCiAJbmV3X2Rlc2MtPnVzYl9kZXYgPSBkZXY7CiAJbmV3X2Rlc2MtPnVzYl9pbnRmID0gaW50ZjsKLQlpbml0X01VVEVYKCZuZXdfZGVzYy0+bG9jayk7CiAKIAkvKiBlbmRwb2ludHMgKi8KIAluZXdfZGVzYy0+ZXBfb3V0ID0gZXBfb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuaCBiL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmgKaW5kZXggZDVkNjJhOS4uY2NjZTMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuaAorKysgYi9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5oCkBAIC0zOSw3ICszOSw2IEBACiAJdTggZXBfaW1hZ2U7CiAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdDsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CiAKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJc3RydWN0IG10c190cmFuc2Zlcl9jb250ZXh0IGNvbnRleHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKaW5kZXggOWM3ZWI2MS4uYTUzZGIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwpAQCAtMzMsOCArMzMsOCBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVtaTI2LgogCiBjb25maWcgVVNCX0FEVVRVWAotCXRyaXN0YXRlICJBRFUgZGV2aWNlcyBmcm9tIE9udHJhayBDb250cm9sIFN5c3RlbXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIkFEVSBkZXZpY2VzIGZyb20gT250cmFrIENvbnRyb2wgU3lzdGVtcyIKKwlkZXBlbmRzIG9uIFVTQgogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHVzZSBhbiBBRFUgZGV2aWNlIGZyb20gT250cmFrIENvbnRyb2wKIAkgIFN5c3RlbXMuCkBAIC00Myw4ICs0Myw4IEBACiAJICB3aWxsIGJlIGNhbGxlZCBhZHV0dXguCiAKIGNvbmZpZyBVU0JfQVVFUlNXQUxECi0JdHJpc3RhdGUgIlVTQiBBdWVyc3dhbGQgSVNETiBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJVU0IgQXVlcnN3YWxkIElTRE4gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhbiBBdWVyc3dhbGQgVVNCIElTRE4gRGV2aWNlCiAJICB0byB5b3VyIGNvbXB1dGVyJ3MgVVNCIHBvcnQuCkBAIC01Myw4ICs1Myw4IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXVlcnN3YWxkLgogCiBjb25maWcgVVNCX1JJTzUwMAotCXRyaXN0YXRlICJVU0IgRGlhbW9uZCBSaW81MDAgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQiAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIERpYW1vbmQgUmlvNTAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYSBVU0IgUmlvNTAwIG1wMyBwbGF5ZXIgdG8geW91cgogCSAgY29tcHV0ZXIncyBVU0IgcG9ydC4gUGxlYXNlIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi91c2IvcmlvLnR4dD4KQEAgLTY0LDggKzY0LDggQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByaW81MDAuCiAKIGNvbmZpZyBVU0JfTEVHT1RPV0VSCi0JdHJpc3RhdGUgIlVTQiBMZWdvIEluZnJhcmVkIFRvd2VyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlVTQiBMZWdvIEluZnJhcmVkIFRvd2VyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYSBVU0IgTGVnbyBJbmZyYXJlZCBUb3dlciB0byB5b3VyCiAJICBjb21wdXRlcidzIFVTQiBwb3J0LgpAQCAtMjU5LDggKzI1OSw4IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaW93YXJyaW9yLgogCiBjb25maWcgVVNCX1RFU1QKLQl0cmlzdGF0ZSAiVVNCIHRlc3RpbmcgZHJpdmVyIChERVZFTE9QTUVOVCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgVVNCX0RFVklDRUZTICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJVU0IgdGVzdGluZyBkcml2ZXIiCisJZGVwZW5kcyBvbiBVU0IgJiYgVVNCX0RFVklDRUZTCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRlc3RpbmcgaG9zdCBjb250cm9sbGVyIHNvZnR3YXJlLiAgSXQgaXMgdXNlZAogCSAgd2l0aCBzcGVjaWFsaXplZCBkZXZpY2UgZmlybXdhcmUgZm9yIHJlZ3Jlc3Npb24gYW5kIHN0cmVzcyB0ZXN0aW5nLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKaW5kZXggNWEyYzQ0ZS4uOTY1ZjZlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCkBAIC0xNDcsMTAgKzE0NywxMCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoMiwiICVzIDogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCIgJXMgOiBlbnRlciIsIF9fZnVuY19fKTsKIAogCWlmIChkZXYtPnVkZXYgPT0gTlVMTCkgewotCQlkYmcoMSwiICVzIDogdWRldiBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKDEsIiAlcyA6IHVkZXYgaXMgbnVsbCIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTcyLDEyICsxNzIsMTIgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5idWZsb2NrLCBmbGFncyk7CiAKIGV4aXQ6Ci0JZGJnKDIsIiAlcyA6IGxlYXZlIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFkdV9kZWxldGUoc3RydWN0IGFkdV9kZXZpY2UgKmRldikKIHsKLQlkYmcoMiwgIiVzIGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwgIiVzIGVudGVyIiwgX19mdW5jX18pOwogCiAJLyogZnJlZSBkYXRhIHN0cnVjdHVyZXMgKi8KIAl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKQEAgLTE4OCw3ICsxODgsNyBAQAogCWtmcmVlKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIpOwogCWtmcmVlKGRldik7CiAKLQlkYmcoMiwgIiVzIDogbGVhdmUiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCAiJXMgOiBsZWF2ZSIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgYWR1X2ludGVycnVwdF9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCkBAIC0xOTYsOCArMTk2LDggQEAKIAlzdHJ1Y3QgYWR1X2RldmljZSAqZGV2ID0gdXJiLT5jb250ZXh0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyg0LCIgJXMgOiBlbnRlciwgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCWFkdV9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCWRiZyg0LCIgJXMgOiBlbnRlciwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJYWR1X2RlYnVnX2RhdGEoNSwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwKIAkJICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCXNwaW5fbG9jaygmZGV2LT5idWZsb2NrKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCQlpZiAoKHN0YXR1cyAhPSAtRU5PRU5UKSAmJiAoc3RhdHVzICE9IC1FQ09OTlJFU0VUKSAmJgogCQkJKHN0YXR1cyAhPSAtRVNIVVRET1dOKSkgewogCQkJZGJnKDEsIiAlcyA6IG5vbnplcm8gc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQl9CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yMjAsMTAgKzIyMCwxMCBAQAogCQkJCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAogCQkJZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGggKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCQkJZGJnKDIsIiAlcyByZWFkaW5nICAlZCAiLCBfX0ZVTkNUSU9OX18sCisJCQlkYmcoMiwiICVzIHJlYWRpbmcgICVkICIsIF9fZnVuY19fLAogCQkJICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCX0gZWxzZSB7Ci0JCQlkYmcoMSwiICVzIDogcmVhZF9idWZmZXIgb3ZlcmZsb3ciLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKDEsIiAlcyA6IHJlYWRfYnVmZmVyIG92ZXJmbG93IiwgX19mdW5jX18pOwogCQl9CiAJfQogCkBAIC0yMzIsOSArMjMyLDkgQEAKIAlzcGluX3VubG9jaygmZGV2LT5idWZsb2NrKTsKIAkvKiBhbHdheXMgd2FrZSB1cCBzbyB3ZSByZWNvdmVyIGZyb20gZXJyb3JzICovCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7Ci0JYWR1X2RlYnVnX2RhdGEoNSwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsCisJYWR1X2RlYnVnX2RhdGEoNSwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwKIAkJICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQlkYmcoNCwiICVzIDogbGVhdmUsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlkYmcoNCwiICVzIDogbGVhdmUsIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgdm9pZCBhZHVfaW50ZXJydXB0X291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCkBAIC0yNDIsMTQgKzI0MiwxNCBAQAogCXN0cnVjdCBhZHVfZGV2aWNlICpkZXYgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKDQsIiAlcyA6IGVudGVyLCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JYWR1X2RlYnVnX2RhdGEoNSxfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCWRiZyg0LCIgJXMgOiBlbnRlciwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJYWR1X2RlYnVnX2RhdGEoNSxfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJaWYgKChzdGF0dXMgIT0gLUVOT0VOVCkgJiYKIAkJICAgIChzdGF0dXMgIT0gLUVDT05OUkVTRVQpKSB7CiAJCQlkYmcoMSwgIiAlcyA6bm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCX0KIAkJZ290byBleGl0OwogCX0KQEAgLTI2MCw5ICsyNjAsOSBAQAogCXNwaW5fdW5sb2NrKCZkZXYtPmJ1ZmxvY2spOwogZXhpdDoKIAotCWFkdV9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCWFkdV9kZWJ1Z19kYXRhKDUsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsCiAJCSAgICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JZGJnKDQsIiAlcyA6IGxlYXZlLCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJZGJnKDQsIiAlcyA6IGxlYXZlLCBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIH0KIAogc3RhdGljIGludCBhZHVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTI3MiwxOSArMjcyLDE5IEBACiAJaW50IHN1Ym1pbm9yOwogCWludCByZXR2YWw7CiAKLQlkYmcoMiwiJXMgOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiVzIDogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CiAKIAlpZiAoKHJldHZhbCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWR1dHV4X211dGV4KSkpIHsKLQkJZGJnKDIsICIlcyA6IG11dGV4IGxvY2sgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKDIsICIlcyA6IG11dGV4IGxvY2sgZmFpbGVkIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXRfbm9fbG9jazsKIAl9CiAKIAlpbnRlcmZhY2UgPSB1c2JfZmluZF9pbnRlcmZhY2UoJmFkdV9kcml2ZXIsIHN1Ym1pbm9yKTsKIAlpZiAoIWludGVyZmFjZSkgewogCQllcnIoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN1Ym1pbm9yKTsKKwkJICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdF9ub19kZXZpY2U7CiAJfQpAQCAtMzAyLDcgKzMwMiw3IEBACiAJfQogCiAJKytkZXYtPm9wZW5fY291bnQ7Ci0JZGJnKDIsIiVzIDogb3BlbiBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgZGV2LT5vcGVuX2NvdW50KTsKKwlkYmcoMiwiJXMgOiBvcGVuIGNvdW50ICVkIiwgX19mdW5jX18sIGRldi0+b3Blbl9jb3VudCk7CiAKIAkvKiBzYXZlIGRldmljZSBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OwpAQCAtMzMyLDIzICszMzIsMjMgQEAKIGV4aXRfbm9fZGV2aWNlOgogCW11dGV4X3VubG9jaygmYWR1dHV4X211dGV4KTsKIGV4aXRfbm9fbG9jazoKLQlkYmcoMiwiJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkICIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwiJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkICIsIF9fZnVuY19fLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIGFkdV9yZWxlYXNlX2ludGVybmFsKHN0cnVjdCBhZHVfZGV2aWNlICpkZXYpCiB7Ci0JZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAkvKiBkZWNyZW1lbnQgb3VyIHVzYWdlIGNvdW50IGZvciB0aGUgZGV2aWNlICovCiAJLS1kZXYtPm9wZW5fY291bnQ7Ci0JZGJnKDIsIiAlcyA6IG9wZW4gY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIGRldi0+b3Blbl9jb3VudCk7CisJZGJnKDIsIiAlcyA6IG9wZW4gY291bnQgJWQiLCBfX2Z1bmNfXywgZGV2LT5vcGVuX2NvdW50KTsKIAlpZiAoZGV2LT5vcGVuX2NvdW50IDw9IDApIHsKIAkJYWR1X2Fib3J0X3RyYW5zZmVycyhkZXYpOwogCQlkZXYtPm9wZW5fY291bnQgPSAwOwogCX0KIAotCWRiZygyLCIgJXMgOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiAlcyA6IGxlYXZlIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgaW50IGFkdV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMzU2LDE3ICszNTYsMTcgQEAKIAlzdHJ1Y3QgYWR1X2RldmljZSAqZGV2OwogCWludCByZXR2YWwgPSAwOwogCi0JZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gCQlkYmcoMSwiICVzIDogZmlsZSBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAJCWRiZygxLCIgJXMgOiBmaWxlIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKGRldiA9PSBOVUxMKSB7Ci0gCQlkYmcoMSwiICVzIDogb2JqZWN0IGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworIAkJZGJnKDEsIiAlcyA6IG9iamVjdCBpcyBOVUxMIiwgX19mdW5jX18pOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzc0LDcgKzM3NCw3IEBACiAJbXV0ZXhfbG9jaygmYWR1dHV4X211dGV4KTsgLyogbm90IGludGVycnVwdGlibGUgKi8KIAogCWlmIChkZXYtPm9wZW5fY291bnQgPD0gMCkgewotCQlkYmcoMSwiICVzIDogZGV2aWNlIG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoMSwiICVzIDogZGV2aWNlIG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0zODgsNyArMzg4LDcgQEAKIAogZXhpdDoKIAltdXRleF91bmxvY2soJmFkdXR1eF9tdXRleCk7Ci0JZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC00MDUsMTAgKzQwNSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKLQlkYmcoMiwiICVzIDogZW50ZXIsIGNvdW50ID0gJVpkLCBmaWxlPSVwIiwgX19GVU5DVElPTl9fLCBjb3VudCwgZmlsZSk7CisJZGJnKDIsIiAlcyA6IGVudGVyLCBjb3VudCA9ICVaZCwgZmlsZT0lcCIsIF9fZnVuY19fLCBjb3VudCwgZmlsZSk7CiAKIAlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JZGJnKDIsIiAlcyA6IGRldj0lcCIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKwlkYmcoMiwiICVzIDogZGV2PSVwIiwgX19mdW5jX18sIGRldik7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPm10eCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC00MjIsMTYgKzQyMiwxNiBAQAogCiAJLyogdmVyaWZ5IHRoYXQgc29tZSBkYXRhIHdhcyByZXF1ZXN0ZWQgKi8KIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoMSwiICVzIDogcmVhZCByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoMSwiICVzIDogcmVhZCByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAl0aW1lb3V0ID0gQ09NTUFORF9USU1FT1VUOwotCWRiZygyLCIgJXMgOiBhYm91dCB0byBzdGFydCBsb29waW5nIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogYWJvdXQgdG8gc3RhcnQgbG9vcGluZyIsIF9fZnVuY19fKTsKIAl3aGlsZSAoYnl0ZXNfdG9fcmVhZCkgewogCQlpbnQgZGF0YV9pbl9zZWNvbmRhcnkgPSBkZXYtPnNlY29uZGFyeV90YWlsIC0gZGV2LT5zZWNvbmRhcnlfaGVhZDsKIAkJZGJnKDIsIiAlcyA6IHdoaWxlLCBkYXRhX2luX3NlY29uZGFyeT0lZCwgc3RhdHVzPSVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgZGF0YV9pbl9zZWNvbmRhcnksCisJCSAgICBfX2Z1bmNfXywgZGF0YV9pbl9zZWNvbmRhcnksCiAJCSAgICBkZXYtPmludGVycnVwdF9pbl91cmItPnN0YXR1cyk7CiAKIAkJaWYgKGRhdGFfaW5fc2Vjb25kYXJ5KSB7CkBAIC00NTYsNyArNDU2LDcgQEAKIAkJCQkvKiB3ZSBzZWN1cmUgYWNjZXNzIHRvIHRoZSBwcmltYXJ5ICovCiAJCQkJY2hhciAqdG1wOwogCQkJCWRiZygyLCIgJXMgOiBzd2FwLCByZWFkX2J1ZmZlcl9sZW5ndGggPSAlZCIsCi0JCQkJICAgIF9fRlVOQ1RJT05fXywgZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGgpOworCQkJCSAgICBfX2Z1bmNfXywgZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGgpOwogCQkJCXRtcCA9IGRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5OwogCQkJCWRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5ID0gZGV2LT5yZWFkX2J1ZmZlcl9wcmltYXJ5OwogCQkJCWRldi0+cmVhZF9idWZmZXJfcHJpbWFyeSA9IHRtcDsKQEAgLTQ3MSwxMCArNDcxLDEwIEBACiAJCQkJaWYgKCFkZXYtPnJlYWRfdXJiX2ZpbmlzaGVkKSB7CiAJCQkJCS8qIHNvbWVib2R5IGlzIGRvaW5nIElPICovCiAJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+YnVmbG9jaywgZmxhZ3MpOwotCQkJCQlkYmcoMiwiICVzIDogc3VibWl0dGVkIGFscmVhZHkiLCBfX0ZVTkNUSU9OX18pOworCQkJCQlkYmcoMiwiICVzIDogc3VibWl0dGVkIGFscmVhZHkiLCBfX2Z1bmNfXyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJLyogd2UgbXVzdCBpbml0aWF0ZSBpbnB1dCAqLwotCQkJCQlkYmcoMiwiICVzIDogaW5pdGlhdGUgaW5wdXQiLCBfX0ZVTkNUSU9OX18pOworCQkJCQlkYmcoMiwiICVzIDogaW5pdGlhdGUgaW5wdXQiLCBfX2Z1bmNfXyk7CiAJCQkJCWRldi0+cmVhZF91cmJfZmluaXNoZWQgPSAwOwogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmJ1ZmxvY2ssIGZsYWdzKTsKIApAQCAtNDkyLDcgKzQ5Miw3IEBACiAJCQkJCQlpZiAocmV0dmFsID09IC1FTk9NRU0pIHsKIAkJCQkJCQlyZXR2YWwgPSBieXRlc19yZWFkID8gYnl0ZXNfcmVhZCA6IC1FTk9NRU07CiAJCQkJCQl9Ci0JCQkJCQlkYmcoMiwiICVzIDogc3VibWl0IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCQlkYmcoMiwiICVzIDogc3VibWl0IGZhaWxlZCIsIF9fZnVuY19fKTsKIAkJCQkJCWdvdG8gZXhpdDsKIAkJCQkJfQogCQkJCX0KQEAgLTUxMSwxMyArNTExLDEzIEBACiAJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+cmVhZF93YWl0LCAmd2FpdCk7CiAKIAkJCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQkJCWRiZygyLCIgJXMgOiB0aW1lb3V0IiwgX19GVU5DVElPTl9fKTsKKwkJCQkJZGJnKDIsIiAlcyA6IHRpbWVvdXQiLCBfX2Z1bmNfXyk7CiAJCQkJCXJldHZhbCA9IGJ5dGVzX3JlYWQgPyBieXRlc19yZWFkIDogLUVUSU1FRE9VVDsKIAkJCQkJZ290byBleGl0OwogCQkJCX0KIAogCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCQlkYmcoMiwiICVzIDogc2lnbmFsIHBlbmRpbmciLCBfX0ZVTkNUSU9OX18pOworCQkJCQlkYmcoMiwiICVzIDogc2lnbmFsIHBlbmRpbmciLCBfX2Z1bmNfXyk7CiAJCQkJCXJldHZhbCA9IGJ5dGVzX3JlYWQgPyBieXRlc19yZWFkIDogLUVJTlRSOwogCQkJCQlnb3RvIGV4aXQ7CiAJCQkJfQpAQCAtNTUwLDcgKzU1MCw3IEBACiAJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KIAltdXRleF91bmxvY2soJmRldi0+bXR4KTsKIAotCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNTY1LDcgKzU2NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsOwogCi0JZGJnKDIsIiAlcyA6IGVudGVyLCBjb3VudCA9ICVaZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCWRiZygyLCIgJXMgOiBlbnRlciwgY291bnQgPSAlWmQiLCBfX2Z1bmNfXywgY291bnQpOwogCiAJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCkBAIC01ODIsNyArNTgyLDcgQEAKIAogCS8qIHZlcmlmeSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBkYXRhIHRvIHdyaXRlICovCiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGJnKDEsIiAlcyA6IHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygxLCIgJXMgOiB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTU5NSwxMyArNTk1LDEzIEBACiAKIAkJCW11dGV4X3VubG9jaygmZGV2LT5tdHgpOwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJZGJnKDEsIiAlcyA6IGludGVycnVwdGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoMSwiICVzIDogaW50ZXJydXB0ZWQiLCBfX2Z1bmNfXyk7CiAJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCQlyZXR2YWwgPSAtRUlOVFI7CiAJCQkJZ290byBleGl0X29ucXVldWU7CiAJCQl9CiAJCQlpZiAoc2NoZWR1bGVfdGltZW91dChDT01NQU5EX1RJTUVPVVQpID09IDApIHsKLQkJCQlkYmcoMSwgIiVzIC0gY29tbWFuZCB0aW1lZCBvdXQuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoMSwgIiVzIC0gY29tbWFuZCB0aW1lZCBvdXQuIiwgX19mdW5jX18pOwogCQkJCXJldHZhbCA9IC1FVElNRURPVVQ7CiAJCQkJZ290byBleGl0X29ucXVldWU7CiAJCQl9CkBAIC02MTIsMTggKzYxMiwxOCBAQAogCQkJCWdvdG8gZXhpdF9ub2xvY2s7CiAJCQl9CiAKLQkJCWRiZyg0LCIgJXMgOiBpbiBwcm9ncmVzcywgY291bnQgPSAlWmQiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwkJCWRiZyg0LCIgJXMgOiBpbiBwcm9ncmVzcywgY291bnQgPSAlWmQiLCBfX2Z1bmNfXywgY291bnQpOwogCQl9IGVsc2UgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5idWZsb2NrLCBmbGFncyk7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+d3JpdGVfd2FpdCwgJndhaXRhKTsKLQkJCWRiZyg0LCIgJXMgOiBzZW5kaW5nLCBjb3VudCA9ICVaZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCQkJZGJnKDQsIiAlcyA6IHNlbmRpbmcsIGNvdW50ID0gJVpkIiwgX19mdW5jX18sIGNvdW50KTsKIAogCQkJLyogd3JpdGUgdGhlIGRhdGEgaW50byBpbnRlcnJ1cHRfb3V0X2J1ZmZlciBmcm9tIHVzZXJzcGFjZSAqLwogCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKIAkJCWJ5dGVzX3RvX3dyaXRlID0gY291bnQgPiBidWZmZXJfc2l6ZSA/IGJ1ZmZlcl9zaXplIDogY291bnQ7CiAJCQlkYmcoNCwiICVzIDogYnVmZmVyX3NpemUgPSAlWmQsIGNvdW50ID0gJVpkLCBieXRlc190b193cml0ZSA9ICVaZCIsCi0JCQkgICAgX19GVU5DVElPTl9fLCBidWZmZXJfc2l6ZSwgY291bnQsIGJ5dGVzX3RvX3dyaXRlKTsKKwkJCSAgICBfX2Z1bmNfXywgYnVmZmVyX3NpemUsIGNvdW50LCBieXRlc190b193cml0ZSk7CiAKIAkJCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyLCBidWZmZXIsIGJ5dGVzX3RvX3dyaXRlKSAhPSAwKSB7CiAJCQkJcmV0dmFsID0gLUVGQVVMVDsKQEAgLTY2MSw3ICs2NjEsNyBAQAogZXhpdDoKIAltdXRleF91bmxvY2soJmRldi0+bXR4KTsKIGV4aXRfbm9sb2NrOgotCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIAogZXhpdF9vbnF1ZXVlOgpAQCAtNzA2LDcgKzcwNiw3IEBACiAJaW50IG91dF9lbmRfc2l6ZTsKIAlpbnQgaTsKIAotCWRiZygyLCIgJXMgOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiAlcyA6IGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKHVkZXYgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgInVkZXYgaXMgTlVMTC5cbiIpOwpAQCAtODA3LDcgKzgwNyw3IEBACiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGQgbm90IHJldHJpZXZlIHNlcmlhbCBudW1iZXJcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KLQlkYmcoMiwiICVzIDogc2VyaWFsX251bWJlcj0lcyIsIF9fRlVOQ1RJT05fXywgZGV2LT5zZXJpYWxfbnVtYmVyKTsKKwlkYmcoMiwiICVzIDogc2VyaWFsX251bWJlcj0lcyIsIF9fZnVuY19fLCBkZXYtPnNlcmlhbF9udW1iZXIpOwogCiAJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOwpAQCAtODI4LDcgKzgyOCw3IEBACiAJCSB1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCwgZGV2LT5zZXJpYWxfbnVtYmVyLAogCQkgKGRldi0+bWlub3IgLSBBRFVfTUlOT1JfQkFTRSkpOwogZXhpdDoKLQlkYmcoMiwiICVzIDogbGVhdmUsIHJldHVybiB2YWx1ZSAlcCAoZGV2KSIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKwlkYmcoMiwiICVzIDogbGVhdmUsIHJldHVybiB2YWx1ZSAlcCAoZGV2KSIsIF9fZnVuY19fLCBkZXYpOwogCiAJcmV0dXJuIHJldHZhbDsKIApAQCAtODQ3LDcgKzg0Nyw3IEBACiAJc3RydWN0IGFkdV9kZXZpY2UgKmRldjsKIAlpbnQgbWlub3I7CiAKLQlkYmcoMiwiICVzIDogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCIgJXMgOiBlbnRlciIsIF9fZnVuY19fKTsKIAogCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIApAQCAtODYxLDcgKzg2MSw3IEBACiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCiAJLyogaWYgdGhlIGRldmljZSBpcyBub3Qgb3BlbmVkLCB0aGVuIHdlIGNsZWFuIHVwIHJpZ2h0IG5vdyAqLwotCWRiZygyLCIgJXMgOiBvcGVuIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBkZXYtPm9wZW5fY291bnQpOworCWRiZygyLCIgJXMgOiBvcGVuIGNvdW50ICVkIiwgX19mdW5jX18sIGRldi0+b3Blbl9jb3VudCk7CiAJaWYgKCFkZXYtPm9wZW5fY291bnQpCiAJCWFkdV9kZWxldGUoZGV2KTsKIApAQCAtODcwLDcgKzg3MCw3IEBACiAJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiQURVIGRldmljZSBhZHV0dXglZCBub3cgZGlzY29ubmVjdGVkXG4iLAogCQkgKG1pbm9yIC0gQURVX01JTk9SX0JBU0UpKTsKIAotCWRiZygyLCIgJXMgOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiAlcyA6IGxlYXZlIiwgX19mdW5jX18pOwogfQogCiAvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCkBAIC04ODUsNyArODg1LDcgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCiAJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZhZHVfZHJpdmVyKTsKQEAgLTg5OSwxNyArODk5LDE3IEBACiAJaW5mbygiYWR1dHV4IGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIuIFVzZSBhdCB5b3VyIG93biByaXNrIik7CiAKIGV4aXQ6Ci0JZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhZHVfZXhpdCh2b2lkKQogewotCWRiZygyLCIgJXMgOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsIiAlcyA6IGVudGVyIiwgX19mdW5jX18pOwogCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLwogCXVzYl9kZXJlZ2lzdGVyKCZhZHVfZHJpdmVyKTsKLQlkYmcoMiwiICVzIDogbGVhdmUiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCIgJXMgOiBsZWF2ZSIsIF9fZnVuY19fKTsKIH0KIAogbW9kdWxlX2luaXQoYWR1X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKaW5kZXggYTVlNGMzNS4uYTA3NmMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCkBAIC0xMDMsMTEgKzEwMywxMSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogVGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZ2Rvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHBkYXRhLT51cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCi0JCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQlfX2Z1bmNfXywgcmV0dmFsKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMgYi9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jCmluZGV4IGRmN2UxZWMuLjA5MzkzODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIERlYnVnIHN1cHBvcnQgCQkJCQkJICAgICAqLwpAQCAtMjMyLDcgKzIzMyw3IEBACiAvKiBVU0IgZGV2aWNlIGNvbnRleHQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSAJbXV0ZXg7ICAgICAgICAgCSAgICAvKiBwcm90ZWN0aW9uIGluIHVzZXIgY29udGV4dCAqLworCXN0cnVjdCBtdXRleCAJbXV0ZXg7ICAgICAgICAgCSAgICAvKiBwcm90ZWN0aW9uIGluIHVzZXIgY29udGV4dCAqLwogCWNoYXIgCQkJbmFtZVsyMF07CSAgICAvKiBuYW1lIG9mIHRoZSAvZGV2L3VzYiBlbnRyeSAqLwogCXVuc2lnbmVkIGludAkJZHRpbmRleDsJICAgIC8qIGluZGV4IGluIHRoZSBkZXZpY2UgdGFibGUgKi8KIAlzdHJ1Y3QgdXNiX2RldmljZSAqCXVzYmRldjsgICAgICAJICAgIC8qIFVTQiBkZXZpY2UgaGFuZGxlICovCkBAIC0yNTMsMTIgKzI1NCwxMiBAQAogLyogY2hhcmFjdGVyIGRldmljZSBjb250ZXh0ICovCiB0eXBlZGVmIHN0cnVjdAogewotCXN0cnVjdCBzZW1hcGhvcmUgbXV0ZXg7ICAgICAgICAgLyogcHJvdGVjdGlvbiBpbiB1c2VyIGNvbnRleHQgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CQkvKiBwcm90ZWN0aW9uIGluIHVzZXIgY29udGV4dCAqLwogCXBhdWVyc3dhbGRfdCBhdWVyZGV2OyAgICAgICAgICAgLyogY29udGV4dCBwb2ludGVyIG9mIGFzc2lnbmVkIGRldmljZSAqLwogICAgICAgICBhdWVyYnVmY3RsX3QgYnVmY3RsOyAgICAgICAgICAgIC8qIGNvbnRyb2xzIHRoZSBidWZmZXIgY2hhaW4gKi8KICAgICAgICAgYXVlcnNjb25fdCBzY29udGV4dDsgICAgICAgICAgICAvKiBzZXJ2aWNlIGNvbnRleHQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkd2FpdDsgICAgIC8qIGZvciBzeW5jaHJvbm91cyByZWFkaW5nICovCi0Jc3RydWN0IHNlbWFwaG9yZSByZWFkbXV0ZXg7ICAgICAvKiBwcm90ZWN0aW9uIGFnYWluc3QgbXVsdGlwbGUgcmVhZHMgKi8KKwlzdHJ1Y3QgbXV0ZXggcmVhZG11dGV4OwkJLyogcHJvdGVjdGlvbiBhZ2FpbnN0IG11bHRpcGxlIHJlYWRzICovCiAJcGF1ZXJidWZfdCByZWFkYnVmOwkJLyogYnVmZmVyIGhlbGQgZm9yIHBhcnRpYWwgcmVhZGluZyAqLwogCXVuc2lnbmVkIGludCByZWFkb2Zmc2V0OwkvKiBjdXJyZW50IG9mZnNldCBpbiByZWFkYnVmICovCiAJdW5zaWduZWQgaW50IHJlbW92ZWQ7CQkvKiBpcyAhPSAwIGlmIGRldmljZSBpcyByZW1vdmVkICovCkBAIC0yODMsNyArMjg0LDcgQEAKICAgICAgICAgaW50IHJlc3VsdDsKIAogICAgICAgICAvKiBnZXQgcG9pbnRlciB0byBlbGVtZW50IGFuZCB0byBjaGFpbiAqLwotICAgICAgICBwYXVlcmNoYWluZWxlbWVudF90IGFjZXAgPSAocGF1ZXJjaGFpbmVsZW1lbnRfdCkgdXJiLT5jb250ZXh0OworCXBhdWVyY2hhaW5lbGVtZW50X3QgYWNlcCA9IHVyYi0+Y29udGV4dDsKICAgICAgICAgcGF1ZXJjaGFpbl90ICAgICAgICAgYWNwID0gYWNlcC0+Y2hhaW47CiAKICAgICAgICAgLyogcmVzdG9yZSBvcmlnaW5hbCBlbnRyaWVzIGluIHVyYiAqLwpAQCAtNTkzLDcgKzU5NCw3IEBACiAvKiBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIHN5bmNocm9ub3VzIGNoYWluZWQgVVJCcyAqLwogc3RhdGljIHZvaWQgYXVlcmNoYWluX2Jsb2NraW5nX2NvbXBsZXRpb24gKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlwYXVlcmNoYWluX2Noc190IHBjaHMgPSAocGF1ZXJjaGFpbl9jaHNfdCl1cmItPmNvbnRleHQ7CisJcGF1ZXJjaGFpbl9jaHNfdCBwY2hzID0gdXJiLT5jb250ZXh0OwogCXBjaHMtPmRvbmUgPSAxOwogCXdtYigpOwogCXdha2VfdXAgKCZwY2hzLT53cWgpOwpAQCAtODQ2LDcgKzg0Nyw3IEBACiAvKiBDb21wbGV0aW9uIG9mIGFzeW5jaHJvbm91cyB3cml0ZSBibG9jayAqLwogc3RhdGljIHZvaWQgYXVlcmNoYXJfY3RybHdyaXRlX2NvbXBsZXRlIChzdHJ1Y3QgdXJiICogdXJiKQogewotCXBhdWVyYnVmX3QgYnAgPSAocGF1ZXJidWZfdCkgdXJiLT5jb250ZXh0OworCXBhdWVyYnVmX3QgYnAgPSAgdXJiLT5jb250ZXh0OwogCXBhdWVyc3dhbGRfdCBjcCA9ICgocGF1ZXJzd2FsZF90KSgoY2hhciAqKShicC0+bGlzdCktKHVuc2lnbmVkIGxvbmcpKCYoKHBhdWVyc3dhbGRfdCkwKS0+YnVmY3RsKSkpOwogCWRiZyAoImF1ZXJjaGFyX2N0cmx3cml0ZV9jb21wbGV0ZSBjYWxsZWQiKTsKIApAQCAtODU5LDcgKzg2MCw3IEBACiAvKiBDb21wbGV0aW9uIGhhbmRsZXIgZm9yIGR1bW15IHJldHJ5IHBhY2tldCAqLwogc3RhdGljIHZvaWQgYXVlcnN3YWxkX2N0cmxyZWFkX3dyZXRjb21wbGV0ZSAoc3RydWN0IHVyYiAqIHVyYikKIHsKLSAgICAgICAgcGF1ZXJidWZfdCBicCA9IChwYXVlcmJ1Zl90KSB1cmItPmNvbnRleHQ7CisJcGF1ZXJidWZfdCBicCA9IHVyYi0+Y29udGV4dDsKICAgICAgICAgcGF1ZXJzd2FsZF90IGNwOwogCWludCByZXQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwpAQCAtOTAzLDcgKzkwNCw3IEBACiAgICAgICAgIHVuc2lnbmVkIGludCAgc2VydmljZWlkOwogICAgICAgICBwYXVlcnN3YWxkX3QgIGNwOwogICAgICAgICBwYXVlcnNjb25fdCAgIHNjcDsKLSAgICAgICAgcGF1ZXJidWZfdCAgICBicCAgPSAocGF1ZXJidWZfdCkgdXJiLT5jb250ZXh0OworCXBhdWVyYnVmX3QgYnAgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCByZXQ7CiAKQEAgLTk4MCw5ICs5ODEsOSBAQAogICAgICAgICBpbnQgcmV0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKICAgICAgICAgcGF1ZXJidWZfdCAgIGJwID0gTlVMTDsKLSAgICAgICAgcGF1ZXJzd2FsZF90IGNwID0gKHBhdWVyc3dhbGRfdCkgdXJiLT5jb250ZXh0OworCXBhdWVyc3dhbGRfdCBjcCA9IHVyYi0+Y29udGV4dDsKIAotICAgICAgICBkYmcgKCIlcyBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkYmcgKCIlcyBjYWxsZWQiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTk5MiwxMCArOTkzLDEwIEBACiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTEwODAsNyArMTA4MSw3IEBACiAJcmV0ID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJICAgICBfX2Z1bmNfXywgcmV0KTsKIH0KIAogLyogaW50IG1lbW9yeSBkZWFsbG9jYXRpb24KQEAgLTEzNzYsNyArMTM3Nyw3IEBACiAJaWYgKGNwID09IE5VTEwpIHsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZjcC0+bXV0ZXgpKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY3AtPm11dGV4KSkgewogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIApAQCAtMTM4OSw4ICsxMzkwLDggQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIGRldmljZSBkZXNjcmlwdG9yICovCi0JaW5pdF9NVVRFWCggJmNjcC0+bXV0ZXgpOwotCWluaXRfTVVURVgoICZjY3AtPnJlYWRtdXRleCk7CisJbXV0ZXhfaW5pdCgmY2NwLT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmY2NwLT5yZWFkbXV0ZXgpOwogICAgICAgICBhdWVyYnVmX2luaXQgKCZjY3AtPmJ1ZmN0bCk7CiAgICAgICAgIGNjcC0+c2NvbnRleHQuaWQgPSBBVUhfVU5BU1NJR05FRDsKICAgICAgICAgY2NwLT5zY29udGV4dC5kaXNwYXRjaCA9IGF1ZXJjaGFyX2N0cmxyZWFkX2Rpc3BhdGNoOwpAQCAtMTQwNSw3ICsxNDA2LDcgQEAKIAljcC0+b3Blbl9jb3VudCsrOwogCWNjcC0+YXVlcmRldiA9IGNwOwogCWRiZygib3BlbiAlcyBhcyAvZGV2LyVzIiwgY3AtPmRldl9kZXNjLCBjcC0+bmFtZSk7Ci0JdXAgKCZjcC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmY3AtPm11dGV4KTsKIAogCS8qIGZpbGUgSU8gc3R1ZmYgKi8KIAlmaWxlLT5mX3BvcyA9IDA7CkBAIC0xNDEzLDcgKzE0MTQsNyBAQAogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIAogCS8qIEVycm9yIGV4aXQgKi8KLW9mYWlsOgl1cCAoJmNwLT5tdXRleCk7CitvZmFpbDoJbXV0ZXhfdW5sb2NrKCZjcC0+bXV0ZXgpOwogCWF1ZXJjaGFyX2RlbGV0ZSAoY2NwKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTQzMiwyMyArMTQzMywyMyBAQAogICAgICAgICBkYmcgKCJpb2N0bCIpOwogCiAJLyogZ2V0IHRoZSBtdXRleGVzICovCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmNjcC0+bXV0ZXgpKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2NwLT5tdXRleCkpIHsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAJY3AgPSBjY3AtPmF1ZXJkZXY7CiAJaWYgKCFjcCkgewotCQl1cCAoJmNjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwogCX0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmY3AtPm11dGV4KSkgewotCQl1cCgmY2NwLT5tdXRleCk7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY3AtPm11dGV4KSkgeworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAogCS8qIENoZWNrIGZvciByZW1vdmFsICovCiAJaWYgKCFjcC0+dXNiZGV2KSB7Ci0JCXVwKCZjcC0+bXV0ZXgpOwotCQl1cCgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE1NTAsOCArMTU1MSw4IEBACiAJCWJyZWFrOwogICAgICAgICB9CiAJLyogcmVsZWFzZSB0aGUgbXV0ZXhlcyAqLwotCXVwKCZjcC0+bXV0ZXgpOwotCXVwKCZjY3AtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTc0LDE4ICsxNTc1LDE4IEBACiAJCXJldHVybiAwOwogCiAJLyogZ2V0IHRoZSBtdXRleCAqLwotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZjY3AtPm11dGV4KSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjY3AtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCS8qIENhbiB3ZSBleHBlY3QgdG8gcmVhZCBzb21ldGhpbmc/ICovCiAJaWYgKGNjcC0+c2NvbnRleHQuaWQgPT0gQVVIX1VOQVNTSUdORUQpIHsKLQkJdXAgKCZjY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBvbmx5IG9uZSByZWFkZXIgcGVyIGRldmljZSBhbGxvd2VkICovCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmNjcC0+cmVhZG11dGV4KSkgewotCQl1cCAoJmNjcC0+bXV0ZXgpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNjcC0+cmVhZG11dGV4KSkgeworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIApAQCAtMTYwMiw4ICsxNjAzLDggQEAKIAkJaWYgKGNvdW50KSB7CiAJCQlpZiAoY29weV90b191c2VyIChidWYsIGJwLT5idWZwK2NjcC0+cmVhZG9mZnNldCwgY291bnQpKSB7CiAJCQkJZGJnICgiYXVlcnN3YWxkX3JlYWQ6IGNvcHlfdG9fdXNlciBmYWlsZWQiKTsKLQkJCQl1cCAoJmNjcC0+cmVhZG11dGV4KTsKLQkJCQl1cCAoJmNjcC0+bXV0ZXgpOworCQkJCW11dGV4X3VubG9jaygmY2NwLT5yZWFkbXV0ZXgpOworCQkJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAJCX0KQEAgLTE2MTcsOCArMTYxOCw4IEBACiAJCX0KIAkJLyogcmV0dXJuIHdpdGggbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKi8KIAkJaWYgKGNvdW50KSB7Ci0JCQl1cCAoJmNjcC0+cmVhZG11dGV4KTsKLQkJCXVwICgmY2NwLT5tdXRleCk7CisJCQltdXRleF91bmxvY2soJmNjcC0+cmVhZG11dGV4KTsKKwkJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJCQlyZXR1cm4gY291bnQ7CiAJCX0KIAl9CkBAIC0xNjU0LDI5ICsxNjU1LDI5IEBACiAgICAgICAgICAgICAgICAgZGJnICgiTm8gcmVhZCBidWZmZXIgYXZhaWxhYmxlLCByZXR1cm5pbmcgLUVBR0FJTiIpOwogCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUgKCZjY3AtPnJlYWR3YWl0LCAmd2FpdCk7Ci0JCXVwICgmY2NwLT5yZWFkbXV0ZXgpOwotCQl1cCAoJmNjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+cmVhZG11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKIAkJcmV0dXJuIC1FQUdBSU47ICAvKiBub25ibG9ja2luZywgbm8gZGF0YSBhdmFpbGFibGUgKi8KICAgICAgICAgfQogCiAJLyogeWVzLCB3ZSBzaG91bGQgd2FpdCEgKi8KLQl1cCAoJmNjcC0+bXV0ZXgpOyAvKiBhbGxvdyBvdGhlciBvcGVyYXRpb25zIHdoaWxlIHdlIHdhaXQgKi8KKwltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOyAvKiBhbGxvdyBvdGhlciBvcGVyYXRpb25zIHdoaWxlIHdlIHdhaXQgKi8KIAlzY2hlZHVsZSgpOwogCXJlbW92ZV93YWl0X3F1ZXVlICgmY2NwLT5yZWFkd2FpdCwgJndhaXQpOwogCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKIAkJLyogd2FrZWQgdXAgYnkgYSBzaWduYWwgKi8KLQkJdXAgKCZjY3AtPnJlYWRtdXRleCk7CisJCW11dGV4X3VubG9jaygmY2NwLT5yZWFkbXV0ZXgpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAogCS8qIEFueXRoaW5nIGxlZnQgdG8gcmVhZD8gKi8KIAlpZiAoKGNjcC0+c2NvbnRleHQuaWQgPT0gQVVIX1VOQVNTSUdORUQpIHx8IGNjcC0+cmVtb3ZlZCkgewotCQl1cCAoJmNjcC0+cmVhZG11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPnJlYWRtdXRleCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZjY3AtPm11dGV4KSkgewotCQl1cCAoJmNjcC0+cmVhZG11dGV4KTsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjY3AtPm11dGV4KSkgeworCQltdXRleF91bmxvY2soJmNjcC0+cmVhZG11dGV4KTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAKQEAgLTE3MDcsMjcgKzE3MDgsMjcgQEAKIAogd3JpdGVfYWdhaW46CiAJLyogZ2V0IHRoZSBtdXRleCAqLwotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZjY3AtPm11dGV4KSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjY3AtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCS8qIENhbiB3ZSBleHBlY3QgdG8gd3JpdGUgc29tZXRoaW5nPyAqLwogCWlmIChjY3AtPnNjb250ZXh0LmlkID09IEFVSF9VTkFTU0lHTkVEKSB7Ci0JCXVwICgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CiAJfQogCiAJY3AgPSBjY3AtPmF1ZXJkZXY7CiAJaWYgKCFjcCkgewotCQl1cCAoJmNjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmY3AtPm11dGV4KSkgewotCQl1cCAoJmNjcC0+bXV0ZXgpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNwLT5tdXRleCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAJaWYgKCFjcC0+dXNiZGV2KSB7Ci0JCXVwICgmY3AtPm11dGV4KTsKLQkJdXAgKCZjY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJLyogUHJlcGFyZSBmb3Igc2xlZXAgKi8KQEAgLTE3NTAsOCArMTc1MSw4IEBACiAKIAkvKiBhcmUgdGhlcmUgYW55IGJ1ZmZlcnMgbGVmdD8gKi8KIAlpZiAoIWJwKSB7Ci0JCXVwICgmY3AtPm11dGV4KTsKLQkJdXAgKCZjY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNjcC0+bXV0ZXgpOwogCiAJCS8qIE5PTkJMT0NLOiBkb24ndCB3YWl0ICovCiAJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewpAQCAtMTc4Myw4ICsxNzg0LDggQEAKIAkJYXVlcmJ1Zl9yZWxlYXNlYnVmIChicCk7CiAJCS8qIFdha2UgdXAgYWxsIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBhIGJ1ZmZlciAqLwogCQl3YWtlX3VwICgmY3AtPmJ1ZmZlcndhaXQpOwotCQl1cCAoJmNwLT5tdXRleCk7Ci0JCXVwICgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY3AtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZjY3AtPm11dGV4KTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0xODAzLDE4ICsxODA0LDE4IEBACiAJCSAgICBhdWVyY2hhcl9jdHJsd3JpdGVfY29tcGxldGUsIGJwKTsKIAkvKiB1cCB3ZSBnbyAqLwogCXJldCA9IGF1ZXJjaGFpbl9zdWJtaXRfdXJiICgmY3AtPmNvbnRyb2xjaGFpbiwgYnAtPnVyYnApOwotCXVwICgmY3AtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CiAJaWYgKHJldCkgewogCQlkYmcgKCJhdWVyY2hhcl93cml0ZTogbm9uemVybyByZXN1bHQgb2YgYXVlcmNoYWluX3N1Ym1pdF91cmIgJWQiLCByZXQpOwogCQlhdWVyYnVmX3JlbGVhc2VidWYgKGJwKTsKIAkJLyogV2FrZSB1cCBhbGwgcHJvY2Vzc2VzIHdhaXRpbmcgZm9yIGEgYnVmZmVyICovCiAJCXdha2VfdXAgKCZjcC0+YnVmZmVyd2FpdCk7Ci0JCXVwICgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAllbHNlIHsKIAkJZGJnICgiYXVlcmNoYXJfd3JpdGU6IFdyaXRlIE9LIik7Ci0JCXVwICgmY2NwLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJCXJldHVybiBsZW47CiAJfQogfQpAQCAtMTgyNywyNCArMTgyOCwyNCBAQAogCXBhdWVyc3dhbGRfdCBjcDsKIAlkYmcoInJlbGVhc2UiKTsKIAotCWRvd24oJmNjcC0+bXV0ZXgpOworCW11dGV4X2xvY2soJmNjcC0+bXV0ZXgpOwogCWNwID0gY2NwLT5hdWVyZGV2OwogCWlmIChjcCkgewotCQlkb3duKCZjcC0+bXV0ZXgpOworCQltdXRleF9sb2NrKCZjcC0+bXV0ZXgpOwogCQkvKiByZW1vdmUgYW4gb3BlbiBzZXJ2aWNlICovCiAJCWF1ZXJzd2FsZF9yZW1vdmVzZXJ2aWNlIChjcCwgJmNjcC0+c2NvbnRleHQpOwogCQkvKiBkZXRhY2ggZnJvbSBkZXZpY2UgKi8KIAkJaWYgKCgtLWNwLT5vcGVuX2NvdW50IDw9IDApICYmIChjcC0+dXNiZGV2ID09IE5VTEwpKSB7CiAJCQkvKiB1c2IgZGV2aWNlIHdhaXRzIGZvciByZW1vdmFsICovCi0JCQl1cCAoJmNwLT5tdXRleCk7CisJCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CiAJCQlhdWVyc3dhbGRfZGVsZXRlIChjcCk7CiAJCX0gZWxzZSB7Ci0JCQl1cCAoJmNwLT5tdXRleCk7CisJCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CiAJCX0KIAkJY3AgPSBOVUxMOwogCQljY3AtPmF1ZXJkZXYgPSBOVUxMOwogCX0KLQl1cCAoJmNjcC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmY2NwLT5tdXRleCk7CiAJYXVlcmNoYXJfZGVsZXRlIChjY3ApOwogCiAJcmV0dXJuIDA7CkBAIC0xOTE3LDcgKzE5MTgsNyBAQAogCX0KIAogCS8qIEluaXRpYWxpemUgZGV2aWNlIGRlc2NyaXB0b3IgKi8KLQlpbml0X01VVEVYICgmY3AtPm11dGV4KTsKKwltdXRleF9pbml0KCZjcC0+bXV0ZXgpOwogCWNwLT51c2JkZXYgPSB1c2JkZXY7CiAJYXVlcmNoYWluX2luaXQgKCZjcC0+Y29udHJvbGNoYWluKTsKICAgICAgICAgYXVlcmJ1Zl9pbml0ICgmY3AtPmJ1ZmN0bCk7CkBAIC0yMDQyLDcgKzIwNDMsNyBAQAogCS8qIGdpdmUgYmFjayBvdXIgVVNCIG1pbm9yIG51bWJlciAqLwogCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRmLCAmYXVlcnN3YWxkX2NsYXNzKTsKIAotCWRvd24gKCZjcC0+bXV0ZXgpOworCW11dGV4X2xvY2soJmNwLT5tdXRleCk7CiAJaW5mbyAoImRldmljZSAvZGV2LyVzIG5vdyBkaXNjb25uZWN0aW5nIiwgY3AtPm5hbWUpOwogCiAJLyogU3RvcCB0aGUgaW50ZXJydXB0IGVuZHBvaW50ICovCkBAIC0yMDU3LDE2ICsyMDU4LDE4IEBACiAKIAlpZiAoY3AtPm9wZW5fY291bnQgPT0gMCkgewogCQkvKiBub2JvZHkgaXMgdXNpbmcgdGhpcyBkZXZpY2UuIFNvIHdlIGNhbiBjbGVhbiB1cCBub3cgKi8KLQkJdXAgKCZjcC0+bXV0ZXgpOy8qIHVwKCkgaXMgcG9zc2libGUgaGVyZSBiZWNhdXNlIG5vIG90aGVyIHRhc2sKLQkJCQkgICBjYW4gb3BlbiB0aGUgZGV2aWNlIChzZWUgYWJvdmUpLiBJIGRvbid0IHdhbnQKLQkJCQkgICB0byBrZnJlZSgpIGEgbG9ja2VkIG11dGV4LiAqLworCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CisJCS8qIG11dGV4X3VubG9jaygpIGlzIHBvc3NpYmxlIGhlcmUgYmVjYXVzZSBubyBvdGhlciB0YXNrCisJCSAgIGNhbiBvcGVuIHRoZSBkZXZpY2UgKHNlZSBhYm92ZSkuIEkgZG9uJ3Qgd2FudAorCQkgICB0byBrZnJlZSgpIGEgbG9ja2VkIG11dGV4LiAqLworCiAJCWF1ZXJzd2FsZF9kZWxldGUgKGNwKTsKIAl9IGVsc2UgewogCQkvKiBkZXZpY2UgaXMgdXNlZC4gUmVtb3ZlIHRoZSBwb2ludGVyIHRvIHRoZQogCQkgICB1c2IgZGV2aWNlIChpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZSkuIFRoZSBsYXN0CiAJCSAgIHJlbGVhc2UoKSB3aWxsIGRvIHRoZSBjbGVhbiB1cCAqLwogCQljcC0+dXNiZGV2ID0gTlVMTDsKLQkJdXAgKCZjcC0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CiAJCS8qIFRlcm1pbmF0ZSB3YWl0aW5nIHdyaXRlcnMgKi8KIAkJd2FrZV91cCAoJmNwLT5idWZmZXJ3YWl0KTsKIAkJLyogSW5mb3JtIGFsbCB3YWl0aW5nIHJlYWRlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYwppbmRleCA0YTA5Yjg3Li40YjlkYzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9lbWkyNi5jCkBAIC03MCw4ICs3MCw4IEBACiBzdGF0aWMgaW50IGVtaTI2X3NldF9yZXNldCAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciByZXNldF9iaXQpCiB7CiAJaW50IHJlc3BvbnNlOwotCWluZm8oIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7Ci0JLyogcHJpbnRrKEtFUk5fREVCVUcgIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7ICovCisJaW5mbygiJXMgLSAlZCIsIF9fZnVuY19fLCByZXNldF9iaXQpOworCS8qIHByaW50ayhLRVJOX0RFQlVHICIlcyAtICVkIiwgX19mdW5jX18sIHJlc2V0X2JpdCk7ICovCiAJcmVzcG9uc2UgPSBlbWkyNl93cml0ZW1lbW9yeSAoZGV2LCBDUFVDU19SRUcsICZyZXNldF9iaXQsIDEsIDB4YTApOwogCWlmIChyZXNwb25zZSA8IDApIHsKIAkJZXJyKCJlbWkyNjogc2V0X3Jlc2V0ICglZCkgZmFpbGVkIiwgcmVzZXRfYml0KTsKQEAgLTkxLDcgKzkxLDcgQEAKIAogCWJ1ZiA9IGttYWxsb2MoRldfTE9BRF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikgewotCQllcnIoICIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIC1FTk9NRU0pOworCQllcnIoICIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgLUVOT01FTSk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gd3JhcGVycjsKIAl9CkBAIC05OSw3ICs5OSw3IEBACiAJLyogQXNzZXJ0IHJlc2V0IChzdG9wIHRoZSBDUFUgaW4gdGhlIEVNSSkgKi8KIAllcnIgPSBlbWkyNl9zZXRfcmVzZXQoZGV2LDEpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVyciggIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCAiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCWdvdG8gd3JhcGVycjsKIAl9CiAKQEAgLTEwNyw3ICsxMDcsNyBAQAogCWZvciAoaT0wOyBnX0xvYWRlcltpXS50eXBlID09IDA7IGkrKykgewogCQllcnIgPSBlbWkyNl93cml0ZW1lbW9yeShkZXYsIGdfTG9hZGVyW2ldLmFkZHJlc3MsIGdfTG9hZGVyW2ldLmRhdGEsIGdfTG9hZGVyW2ldLmxlbmd0aCwgQU5DSE9SX0xPQURfSU5URVJOQUwpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJZ290byB3cmFwZXJyOwogCQl9CiAJfQpAQCAtMTE1LDcgKzExNSw3IEBACiAJLyogRGUtYXNzZXJ0IHJlc2V0IChsZXQgdGhlIENQVSBydW4pICovCiAJZXJyID0gZW1pMjZfc2V0X3Jlc2V0KGRldiwwKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIAltc2xlZXAoMjUwKTsJLyogbGV0IGRldmljZSBzZXR0bGUgKi8KQEAgLTEzNSw3ICsxMzUsNyBAQAogCQl9CiAJCWVyciA9IGVtaTI2X3dyaXRlbWVtb3J5KGRldiwgYWRkciwgYnVmLCBpLCBBTkNIT1JfTE9BRF9GUEdBKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCWdvdG8gd3JhcGVycjsKIAkJfQogCX0gd2hpbGUgKGkgPiAwKTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogCS8qIEFzc2VydCByZXNldCAoc3RvcCB0aGUgQ1BVIGluIHRoZSBFTUkpICovCiAJZXJyID0gZW1pMjZfc2V0X3Jlc2V0KGRldiwxKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIApAQCAtMTUxLDcgKzE1MSw3IEBACiAJZm9yIChpPTA7IGdfTG9hZGVyW2ldLnR5cGUgPT0gMDsgaSsrKSB7CiAJCWVyciA9IGVtaTI2X3dyaXRlbWVtb3J5KGRldiwgZ19Mb2FkZXJbaV0uYWRkcmVzcywgZ19Mb2FkZXJbaV0uZGF0YSwgZ19Mb2FkZXJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9JTlRFUk5BTCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCQlnb3RvIHdyYXBlcnI7CiAJCX0KIAl9CkBAIC0xNjAsNyArMTYwLDcgQEAKIAkvKiBEZS1hc3NlcnQgcmVzZXQgKGxldCB0aGUgQ1BVIHJ1bikgKi8KIAllcnIgPSBlbWkyNl9zZXRfcmVzZXQoZGV2LDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQlnb3RvIHdyYXBlcnI7CiAJfQogCkBAIC0xNjksNyArMTY5LDcgQEAKIAkJaWYgKCFJTlRFUk5BTF9SQU0oZ19GaXJtd2FyZVtpXS5hZGRyZXNzKSkgewogCQkJZXJyID0gZW1pMjZfd3JpdGVtZW1vcnkoZGV2LCBnX0Zpcm13YXJlW2ldLmFkZHJlc3MsIGdfRmlybXdhcmVbaV0uZGF0YSwgZ19GaXJtd2FyZVtpXS5sZW5ndGgsIEFOQ0hPUl9MT0FEX0VYVEVSTkFMKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCQlnb3RvIHdyYXBlcnI7CiAJCQl9CiAJCX0KQEAgLTE3OCw3ICsxNzgsNyBAQAogCS8qIEFzc2VydCByZXNldCAoc3RvcCB0aGUgQ1BVIGluIHRoZSBFTUkpICovCiAJZXJyID0gZW1pMjZfc2V0X3Jlc2V0KGRldiwxKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIApAQCAtMTg2LDcgKzE4Niw3IEBACiAJCWlmIChJTlRFUk5BTF9SQU0oZ19GaXJtd2FyZVtpXS5hZGRyZXNzKSkgewogCQkJZXJyID0gZW1pMjZfd3JpdGVtZW1vcnkoZGV2LCBnX0Zpcm13YXJlW2ldLmFkZHJlc3MsIGdfRmlybXdhcmVbaV0uZGF0YSwgZ19GaXJtd2FyZVtpXS5sZW5ndGgsIEFOQ0hPUl9MT0FEX0lOVEVSTkFMKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCQlnb3RvIHdyYXBlcnI7CiAJCQl9CiAJCX0KQEAgLTE5NSw3ICsxOTUsNyBAQAogCS8qIERlLWFzc2VydCByZXNldCAobGV0IHRoZSBDUFUgcnVuKSAqLwogCWVyciA9IGVtaTI2X3NldF9yZXNldChkZXYsMCk7CiAJaWYgKGVyciA8IDApIHsKLQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCWdvdG8gd3JhcGVycjsKIAl9CiAJbXNsZWVwKDI1MCk7CS8qIGxldCBkZXZpY2Ugc2V0dGxlICovCkBAIC0yMjEsNyArMjIxLDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAotCWluZm8oIiVzIHN0YXJ0IiwgX19GVU5DVElPTl9fKTsgCisJaW5mbygiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKIAllbWkyNl9sb2FkX2Zpcm13YXJlKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZW1pNjIuYyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pNjIuYwppbmRleCBkMTM2MjQxLi4xYTJiNzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2VtaTYyLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9lbWk2Mi5jCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgaW50IGVtaTYyX3NldF9yZXNldCAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciByZXNldF9iaXQpCiB7CiAJaW50IHJlc3BvbnNlOwotCWluZm8oIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7CisJaW5mbygiJXMgLSAlZCIsIF9fZnVuY19fLCByZXNldF9iaXQpOwogCQogCXJlc3BvbnNlID0gZW1pNjJfd3JpdGVtZW1vcnkgKGRldiwgQ1BVQ1NfUkVHLCAmcmVzZXRfYml0LCAxLCAweGEwKTsKIAlpZiAocmVzcG9uc2UgPCAwKSB7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAlkZXZfZGJnKCZkZXYtPmRldiwgImxvYWRfZmlybXdhcmVcbiIpOwogCWJ1ZiA9IGttYWxsb2MoRldfTE9BRF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikgewotCQllcnIoICIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIC1FTk9NRU0pOworCQllcnIoICIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgLUVOT01FTSk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gd3JhcGVycjsKIAl9CkBAIC0xMDgsNyArMTA4LDcgQEAKIAkvKiBBc3NlcnQgcmVzZXQgKHN0b3AgdGhlIENQVSBpbiB0aGUgRU1JKSAqLwogCWVyciA9IGVtaTYyX3NldF9yZXNldChkZXYsMSk7CiAJaWYgKGVyciA8IDApIHsKLQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCWdvdG8gd3JhcGVycjsKIAl9CiAKQEAgLTExNiw3ICsxMTYsNyBAQAogCWZvciAoaT0wOyBnX2VtaTYyX2xvYWRlcltpXS50eXBlID09IDA7IGkrKykgewogCQllcnIgPSBlbWk2Ml93cml0ZW1lbW9yeShkZXYsIGdfZW1pNjJfbG9hZGVyW2ldLmFkZHJlc3MsIGdfZW1pNjJfbG9hZGVyW2ldLmRhdGEsIGdfZW1pNjJfbG9hZGVyW2ldLmxlbmd0aCwgQU5DSE9SX0xPQURfSU5URVJOQUwpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJZ290byB3cmFwZXJyOwogCQl9CiAJfQpAQCAtMTI0LDcgKzEyNCw3IEBACiAJLyogRGUtYXNzZXJ0IHJlc2V0IChsZXQgdGhlIENQVSBydW4pICovCiAJZXJyID0gZW1pNjJfc2V0X3Jlc2V0KGRldiwwKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIAltc2xlZXAoMjUwKTsJLyogbGV0IGRldmljZSBzZXR0bGUgKi8KQEAgLTE0NCw3ICsxNDQsNyBAQAogCQl9CiAJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgYWRkciwgYnVmLCBpLCBBTkNIT1JfTE9BRF9GUEdBKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCWdvdG8gd3JhcGVycjsKIAkJfQogCX0gd2hpbGUgKGkgPiAwKTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCS8qIEFzc2VydCByZXNldCAoc3RvcCB0aGUgQ1BVIGluIHRoZSBFTUkpICovCiAJZXJyID0gZW1pNjJfc2V0X3Jlc2V0KGRldiwxKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIApAQCAtMTYwLDcgKzE2MCw3IEBACiAJZm9yIChpPTA7IGdfZW1pNjJfbG9hZGVyW2ldLnR5cGUgPT0gMDsgaSsrKSB7CiAJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19lbWk2Ml9sb2FkZXJbaV0uYWRkcmVzcywgZ19lbWk2Ml9sb2FkZXJbaV0uZGF0YSwgZ19lbWk2Ml9sb2FkZXJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9JTlRFUk5BTCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCQlnb3RvIHdyYXBlcnI7CiAJCX0KIAl9CkBAIC0xNjgsNyArMTY4LDcgQEAKIAkvKiBEZS1hc3NlcnQgcmVzZXQgKGxldCB0aGUgQ1BVIHJ1bikgKi8KIAllcnIgPSBlbWk2Ml9zZXRfcmVzZXQoZGV2LDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQlnb3RvIHdyYXBlcnI7CiAJfQogCW1zbGVlcCgyNTApOwkvKiBsZXQgZGV2aWNlIHNldHRsZSAqLwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJCWlmICghSU5URVJOQUxfUkFNKGdfSGV4U3BkaWZGdzYyW2ldLmFkZHJlc3MpKSB7CiAJCQllcnIgPSBlbWk2Ml93cml0ZW1lbW9yeShkZXYsIGdfSGV4U3BkaWZGdzYyW2ldLmFkZHJlc3MsIGdfSGV4U3BkaWZGdzYyW2ldLmRhdGEsIGdfSGV4U3BkaWZGdzYyW2ldLmxlbmd0aCwgQU5DSE9SX0xPQURfRVhURVJOQUwpOwogCQkJaWYgKGVyciA8IDApIHsKLQkJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJCWdvdG8gd3JhcGVycjsKIAkJCX0KIAkJfQpAQCAtMTkxLDcgKzE5MSw3IEBACiAJCWlmICghSU5URVJOQUxfUkFNKGdfSGV4TWlkaUZ3NjJbaV0uYWRkcmVzcykpIHsKIAkJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19IZXhNaWRpRnc2MltpXS5hZGRyZXNzLCBnX0hleE1pZGlGdzYyW2ldLmRhdGEsIGdfSGV4TWlkaUZ3NjJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9FWFRFUk5BTCk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCQkJCWdvdG8gd3JhcGVycjsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQpAQCAtMjAxLDcgKzIwMSw3IEBACiAJLyogQXNzZXJ0IHJlc2V0IChzdG9wIHRoZSBDUFUgaW4gdGhlIEVNSSkgKi8KIAllcnIgPSBlbWk2Ml9zZXRfcmVzZXQoZGV2LDEpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQlnb3RvIHdyYXBlcnI7CiAJfQogCkBAIC0yMTEsNyArMjExLDcgQEAKIAkJaWYgKElOVEVSTkFMX1JBTShnX0hleFNwZGlmRnc2MltpXS5hZGRyZXNzKSkgewogCQkJZXJyID0gZW1pNjJfd3JpdGVtZW1vcnkoZGV2LCBnX0hleFNwZGlmRnc2MltpXS5hZGRyZXNzLCBnX0hleFNwZGlmRnc2MltpXS5kYXRhLCBnX0hleFNwZGlmRnc2MltpXS5sZW5ndGgsIEFOQ0hPUl9MT0FEX0lOVEVSTkFMKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCQlnb3RvIHdyYXBlcnI7CiAJCQl9CiAJCX0KQEAgLTIyMSw3ICsyMjEsNyBAQAogCQlpZiAoSU5URVJOQUxfUkFNKGdfSGV4TWlkaUZ3NjJbaV0uYWRkcmVzcykpIHsKIAkJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19IZXhNaWRpRnc2MltpXS5hZGRyZXNzLCBnX0hleE1pZGlGdzYyW2ldLmRhdGEsIGdfSGV4TWlkaUZ3NjJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9JTlRFUk5BTCk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCQkJCWdvdG8gd3JhcGVycjsKIAkJCX0KIAkJfQpAQCAtMjMxLDcgKzIzMSw3IEBACiAJLyogRGUtYXNzZXJ0IHJlc2V0IChsZXQgdGhlIENQVSBydW4pICovCiAJZXJyID0gZW1pNjJfc2V0X3Jlc2V0KGRldiwwKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKIAkJZ290byB3cmFwZXJyOwogCX0KIAltc2xlZXAoMjUwKTsJLyogbGV0IGRldmljZSBzZXR0bGUgKi8KQEAgLTI2MCw3ICsyNjAsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCWRldl9kYmcoJmludGYtPmRldiwgImVtaTYyX3Byb2JlXG4iKTsKIAotCWluZm8oIiVzIHN0YXJ0IiwgX19GVU5DVElPTl9fKTsgCisJaW5mbygiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKIAllbWk2Ml9sb2FkX2Zpcm13YXJlKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCmluZGV4IDE0OGI3ZmUuLmVjODhiM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYwpAQCAtNzQ2LDcgKzc0Niw3IEBACiAKIHN0YXRpYyB2b2lkIGZ0ZGlfZWxhbl93cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLSAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gKHN0cnVjdCB1c2JfZnRkaSAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJaWYgKHN0YXR1cyAmJiAhKHN0YXR1cyA9PSAtRU5PRU5UIHx8IHN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYyBiL2RyaXZlcnMvdXNiL21pc2MvaW93YXJyaW9yLmMKaW5kZXggODAxMDcwNS4uMWNiNTRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jCkBAIC0xNTQsNyArMTU0LDcgQEAKICAqLwogc3RhdGljIHZvaWQgaW93YXJyaW9yX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgaW93YXJyaW9yICpkZXYgPSAoc3RydWN0IGlvd2FycmlvciAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgaW93YXJyaW9yICpkZXYgPSB1cmItPmNvbnRleHQ7CiAJaW50IGludHJfaWR4OwogCWludCByZWFkX2lkeDsKIAlpbnQgYXV4X2lkeDsKQEAgLTIxOCw3ICsyMTgsNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJX19mdW5jX18sIHJldHZhbCk7CiAKIH0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAJc3RydWN0IGlvd2FycmlvciAqZGV2OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRldiA9IChzdHJ1Y3QgaW93YXJyaW9yICopdXJiLT5jb250ZXh0OworCWRldiA9IHVyYi0+Y29udGV4dDsKIAkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLwogCWlmIChzdGF0dXMgJiYKIAkgICAgIShzdGF0dXMgPT0gLUVOT0VOVCB8fApAQCAtNDUzLDcgKzQ1Myw3IEBACiAJZGVmYXVsdDoKIAkJLyogd2hhdCBkbyB3ZSBoYXZlIGhlcmUgPyBBbiB1bnN1cHBvcnRlZCBQcm9kdWN0LUlEID8gKi8KIAkJZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIC0gbm90IHN1cHBvcnRlZCBmb3IgcHJvZHVjdD0weCV4XG4iLAotCQkJX19GVU5DVElPTl9fLCBkZXYtPnByb2R1Y3RfaWQpOworCQkJX19mdW5jX18sIGRldi0+cHJvZHVjdF9pZCk7CiAJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCWdvdG8gZXhpdDsKIAkJYnJlYWs7CkBAIC02MDQsNyArNjA0LDcgQEAKIAogCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmaW93YXJyaW9yX2RyaXZlciwgc3VibWlub3IpOwogCWlmICghaW50ZXJmYWNlKSB7Ci0JCWVycigiJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkIiwgX19GVU5DVElPTl9fLAorCQllcnIoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZCIsIF9fZnVuY19fLAogCQkgICAgc3VibWlub3IpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKaW5kZXggYzczMGQyMC4uMTE1ODBlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJCQlnb3RvIGV4aXQ7CiAJCX0gZWxzZSB7CiAJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAotCQkJCSBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJc3Bpbl9sb2NrKCZkZXYtPnJic2wpOwogCQkJZ290byByZXN1Ym1pdDsgLyogbWF5YmUgd2UgY2FuIHJlY292ZXIgKi8KIAkJfQpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCQltZW1jcHkoYWN0dWFsX2J1ZmZlcisxLCBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCQlkZXYtPnJpbmdfaGVhZCA9IG5leHRfcmluZ19oZWFkOwogCQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHJlY2VpdmVkICVkIGJ5dGVzXG4iLAotCQkJCSBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQkJIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl9IGVsc2UgewogCQkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAogCQkJCSAiUmluZyBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJCXN0YXR1cyA9PSAtRVNIVVRET1dOKSkKIAkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LAogCQkJICIlcyAtIG5vbnplcm8gd3JpdGUgaW50ZXJydXB0IHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQkgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJIF9fZnVuY19fLCBzdGF0dXMpOwogCiAJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKQEAgLTMwOSw3ICszMDksNyBAQAogCiAJaWYgKCFpbnRlcmZhY2UpIHsKIAkJZXJyKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCi0JCSAgICAgX19GVU5DVElPTl9fLCBzdWJtaW5vcik7CisJCSAgICAgX19mdW5jX18sIHN1Ym1pbm9yKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC01NTYsNyArNTU2LDcgQEAKIAlieXRlc190b193cml0ZSA9IG1pbihjb3VudCwgd3JpdGVfYnVmZmVyX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUpOwogCWlmIChieXRlc190b193cml0ZSA8IGNvdW50KQogCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsICJXcml0ZSBidWZmZXIgb3ZlcmZsb3csICV6ZCBieXRlcyBkcm9wcGVkXG4iLGNvdW50LWJ5dGVzX3RvX3dyaXRlKTsKLQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlemQsIGJ5dGVzX3RvX3dyaXRlID0gJXpkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKIAkJcmV0dmFsID0gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCmluZGV4IDY2NjQwNDMuLjkzNzAzMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYwpAQCAtMzEsNyArMzEsNyBAQAogICogICAtIGltcG9ydGVkIGludG8gbGVqb3MgcHJvamVjdAogICogICAtIGNoYW5nZWQgd2FrZV91cCB0byB3YWtlX3VwX2ludGVycnVwdGlibGUKICAqICAgLSBjaGFuZ2VkIHRvIHVzZSBsZWdvMCByYXRoZXIgdGhhbiB0b3dlcjAKLSAqICAgLSBjaGFuZ2VkIGRiZygpIHRvIHVzZSBfX2Z1bmNfXyByYXRoZXIgdGhhbiBkZXByZWNhdGVkIF9fRlVOQ1RJT05fXworICogICAtIGNoYW5nZWQgZGJnKCkgdG8gdXNlIF9fZnVuY19fIHJhdGhlciB0aGFuIGRlcHJlY2F0ZWQgX19mdW5jX18KICAqIDIwMDMtMDEtMTIgLSAwLjUzIGRhdmlkIChkYXZpZEBjc3NlLnV3YS5lZHUuYXUpCiAgKiAgIC0gY2hhbmdlZCByZWFkIGFuZCB3cml0ZSB0byB3cml0ZSBldmVyeXRoaW5nIG9yCiAgKiAgICAgdGltZW91dCAoZnJvbSBhIHBhdGNoIGJ5IENocmlzIFJpZXNlbiBhbmQgQnJldHQgVGhhZWxlciBkcml2ZXIpCkBAIC00OSw3ICs0OSw3IEBACiAgKiAgIC0gYWRkZWQgcG9sbAogICogICAtIGZvcmJpZCBzZWVraW5nCiAgKiAgIC0gYWRkZWQgbm9uYmxvY2tpbmcgSS9PCi0gKiAgIC0gY2hhbmdlZCBiYWNrIF9fZnVuY19fIHRvIF9fRlVOQ1RJT05fXworICogICAtIGNoYW5nZWQgYmFjayBfX2Z1bmNfXyB0byBfX2Z1bmNfXwogICogICAtIHJlYWQgYW5kIGxvZyB0b3dlciBmaXJtd2FyZSB2ZXJzaW9uCiAgKiAgIC0gcmVzZXQgdG93ZXIgb24gcHJvYmUsIGF2b2lkcyBmYWlsdXJlIG9mIGZpcnN0IHdyaXRlCiAgKiAyMDA0LTAzLTA5IC0gMC43IEp1ZXJnZW4gU3R1YmVyIDxzdGFyYmx1ZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CkBAIC0zMDksNyArMzA5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIHRvd2VyX2RlbGV0ZSAoc3RydWN0IGxlZ29fdXNiX3Rvd2VyICpkZXYpCiB7Ci0JZGJnKDIsICIlczogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCAiJXM6IGVudGVyIiwgX19mdW5jX18pOwogCiAJdG93ZXJfYWJvcnRfdHJhbnNmZXJzIChkZXYpOwogCkBAIC0zMjEsNyArMzIxLDcgQEAKIAlrZnJlZSAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcik7CiAJa2ZyZWUgKGRldik7CiAKLQlkYmcoMiwgIiVzOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIApAQCAtMzM3LDcgKzMzNyw3IEBACiAJc3RydWN0IHRvd2VyX3Jlc2V0X3JlcGx5IHJlc2V0X3JlcGx5OwogCWludCByZXN1bHQ7CiAKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIAlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAogCWlmICghaW50ZXJmYWNlKSB7CiAJCWVyciAoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZCIsCi0JCSAgICAgX19GVU5DVElPTl9fLCBzdWJtaW5vcik7CisJCSAgICAgX19mdW5jX18sIHN1Ym1pbm9yKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTQyNCw3ICs0MjQsNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAogZXhpdDoKLQlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkICIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkICIsIF9fZnVuY19fLCByZXR2YWwpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTQzNywxMiArNDM3LDEyIEBACiAJc3RydWN0IGxlZ29fdXNiX3Rvd2VyICpkZXY7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlkZXYgPSAoc3RydWN0IGxlZ29fdXNiX3Rvd2VyICopZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRiZygxLCAiJXM6IG9iamVjdCBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKDEsICIlczogb2JqZWN0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdF9ub2xvY2s7CiAJfQpAQCAtNDU0LDcgKzQ1NCw3IEBACiAJfQogCiAJaWYgKGRldi0+b3Blbl9jb3VudCAhPSAxKSB7Ci0JCWRiZygxLCAiJXM6IGRldmljZSBub3Qgb3BlbmVkIGV4YWN0bHkgb25jZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygxLCAiJXM6IGRldmljZSBub3Qgb3BlbmVkIGV4YWN0bHkgb25jZSIsIF9fZnVuY19fKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byB1bmxvY2tfZXhpdDsKIAl9CkBAIC00ODAsNyArNDgwLDcgQEAKIGV4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZvcGVuX2Rpc2NfbXV0ZXgpOwogZXhpdF9ub2xvY2s6Ci0JZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNDkxLDEwICs0OTEsMTAgQEAKICAqLwogc3RhdGljIHZvaWQgdG93ZXJfYWJvcnRfdHJhbnNmZXJzIChzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKmRldikKIHsKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGJnKDEsICIlczogZGV2IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoMSwgIiVzOiBkZXYgaXMgbnVsbCIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNTA5LDcgKzUwOSw3IEBACiAJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKIAogZXhpdDoKLQlkYmcoMiwgIiVzOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIApAQCAtNTQyLDcgKzU0Miw3IEBACiAJc3RydWN0IGxlZ29fdXNiX3Rvd2VyICpkZXY7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCi0JZGJnKDIsICIlczogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCAiJXM6IGVudGVyIiwgX19mdW5jX18pOwogCiAJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCkBAIC01NTcsNyArNTU3LDcgQEAKIAkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKIAl9CiAKLQlkYmcoMiwgIiVzOiBsZWF2ZSwgbWFzayA9ICVkIiwgX19GVU5DVElPTl9fLCBtYXNrKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgbWFzayA9ICVkIiwgX19mdW5jX18sIG1hc2spOwogCiAJcmV0dXJuIG1hc2s7CiB9CkBAIC01ODMsNyArNTgzLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAwOwogCi0JZGJnKDIsICIlczogZW50ZXIsIGNvdW50ID0gJVpkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKDIsICIlczogZW50ZXIsIGNvdW50ID0gJVpkIiwgX19mdW5jX18sIGNvdW50KTsKIAogCWRldiA9IChzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKilmaWxlLT5wcml2YXRlX2RhdGE7CiAKQEAgLTYwMiw3ICs2MDIsNyBAQAogCiAJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gcmVhZCAqLwogCWlmIChjb3VudCA9PSAwKSB7Ci0JCWRiZygxLCAiJXM6IHJlYWQgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKDEsICIlczogcmVhZCByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdW5sb2NrX2V4aXQ7CiAJfQogCkBAIC02NTgsNyArNjU4LDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIGV4aXQ6Ci0JZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNjcyLDcgKzY3Miw3IEBACiAJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOwogCWludCByZXR2YWwgPSAwOwogCi0JZGJnKDIsICIlczogZW50ZXIsIGNvdW50ID0gJVpkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKDIsICIlczogZW50ZXIsIGNvdW50ID0gJVpkIiwgX19mdW5jX18sIGNvdW50KTsKIAogCWRldiA9IChzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKilmaWxlLT5wcml2YXRlX2RhdGE7CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogCiAJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gd3JpdGUgKi8KIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoMSwgIiVzOiB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoMSwgIiVzOiB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdW5sb2NrX2V4aXQ7CiAJfQogCkBAIC03MDksNyArNzA5LDcgQEAKIAogCS8qIHdyaXRlIHRoZSBkYXRhIGludG8gaW50ZXJydXB0X291dF9idWZmZXIgZnJvbSB1c2Vyc3BhY2UgKi8KIAlieXRlc190b193cml0ZSA9IG1pbl90KGludCwgY291bnQsIHdyaXRlX2J1ZmZlcl9zaXplKTsKLQlkYmcoNCwgIiVzOiBjb3VudCA9ICVaZCwgYnl0ZXNfdG9fd3JpdGUgPSAlWmQiLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisJZGJnKDQsICIlczogY291bnQgPSAlWmQsIGJ5dGVzX3RvX3dyaXRlID0gJVpkIiwgX19mdW5jX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIgKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsIGJ1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpKSB7CiAJCXJldHZhbCA9IC1FRkFVTFQ7CkBAIC03NDIsNyArNzQyLDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIGV4aXQ6Ci0JZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNzUzLDEzICs3NTMsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgdG93ZXJfaW50ZXJydXB0X2luX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IGxlZ29fdXNiX3Rvd2VyICpkZXYgPSAoc3RydWN0IGxlZ29fdXNiX3Rvd2VyICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBsZWdvX3VzYl90b3dlciAqZGV2ID0gdXJiLT5jb250ZXh0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmV0dmFsOwogCi0JZGJnKDQsICIlczogZW50ZXIsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlkYmcoNCwgIiVzOiBlbnRlciwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKLQlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJbGVnb191c2JfdG93ZXJfZGVidWdfZGF0YSg1LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWlmIChzdGF0dXMgPT0gLUVOT0VOVCB8fApAQCAtNzY3LDcgKzc2Nyw3IEBACiAJCSAgICBzdGF0dXMgPT0gLUVTSFVURE9XTikgewogCQkJZ290byBleGl0OwogCQl9IGVsc2UgewotCQkJZGJnKDEsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGJnKDEsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCQlnb3RvIHJlc3VibWl0OyAvKiBtYXliZSB3ZSBjYW4gcmVjb3ZlciAqLwogCQl9CiAJfQpAQCAtNzgwLDkgKzc4MCw5IEBACiAJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCWRldi0+cmVhZF9idWZmZXJfbGVuZ3RoICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAkJCWRldi0+cmVhZF9sYXN0X2Fycml2YWwgPSBqaWZmaWVzOwotCQkJZGJnKDMsICIlczogcmVjZWl2ZWQgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlkYmcoMywgIiVzOiByZWNlaXZlZCAlZCBieXRlcyIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlYWRfYnVmZmVyIG92ZXJmbG93LCAlZCBieXRlcyBkcm9wcGVkIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlYWRfYnVmZmVyIG92ZXJmbG93LCAlZCBieXRlcyBkcm9wcGVkIiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCX0KIAkJc3Bpbl91bmxvY2sgKCZkZXYtPnJlYWRfYnVmZmVyX2xvY2spOwogCX0KQEAgLTc5Miw3ICs3OTIsNyBAQAogCWlmIChkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nICYmIGRldi0+dWRldikgewogCQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJldHZhbCkgewotCQkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCByZXR2YWwpOwogCQl9CiAJfQogCkBAIC04MDAsOCArODAwLDggQEAKIAlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZkZXYtPnJlYWRfd2FpdCk7CiAKLQlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JZGJnKDQsICIlczogbGVhdmUsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlkYmcoNCwgIiVzOiBsZWF2ZSwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiB9CiAKIApAQCAtODEwLDI1ICs4MTAsMjUgQEAKICAqLwogc3RhdGljIHZvaWQgdG93ZXJfaW50ZXJydXB0X291dF9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBsZWdvX3VzYl90b3dlciAqZGV2ID0gKHN0cnVjdCBsZWdvX3VzYl90b3dlciAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKmRldiA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoNCwgIiVzOiBlbnRlciwgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCWxlZ29fdXNiX3Rvd2VyX2RlYnVnX2RhdGEoNSwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlkYmcoNCwgIiVzOiBlbnRlciwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJbGVnb191c2JfdG93ZXJfZGVidWdfZGF0YSg1LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLwogCWlmIChzdGF0dXMgJiYgIShzdGF0dXMgPT0gLUVOT0VOVCB8fAogCQkJc3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CiAJCQlzdGF0dXMgPT0gLUVTSFVURE9XTikpIHsKIAkJZGJnKDEsICIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCX0KIAogCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d3JpdGVfd2FpdCk7CiAKLQlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JZGJnKDQsICIlczogbGVhdmUsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlsZWdvX3VzYl90b3dlcl9kZWJ1Z19kYXRhKDUsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlkYmcoNCwgIiVzOiBsZWF2ZSwgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiB9CiAKIApAQCAtODQ5LDcgKzg0OSw3IEBACiAJaW50IHJldHZhbCA9IC1FTk9NRU07CiAJaW50IHJlc3VsdDsKIAotCWRiZygyLCAiJXM6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoMiwgIiVzOiBlbnRlciIsIF9fZnVuY19fKTsKIAogCWlmICh1ZGV2ID09IE5VTEwpIHsKIAkJaW5mbyAoInVkZXYgaXMgTlVMTC4iKTsKQEAgLTk3OCw3ICs5NzgsNyBAQAogCiAKIGV4aXQ6Ci0JZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAweCUuOGx4IChkZXYpIiwgX19GVU5DVElPTl9fLCAobG9uZykgZGV2KTsKKwlkYmcoMiwgIiVzOiBsZWF2ZSwgcmV0dXJuIHZhbHVlIDB4JS44bHggKGRldikiLCBfX2Z1bmNfXywgKGxvbmcpIGRldik7CiAKIAlyZXR1cm4gcmV0dmFsOwogCkBAIC05OTgsNyArOTk4LDcgQEAKIAlzdHJ1Y3QgbGVnb191c2JfdG93ZXIgKmRldjsKIAlpbnQgbWlub3I7CiAKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRlcmZhY2UpOwogCW11dGV4X2xvY2soJm9wZW5fZGlzY19tdXRleCk7CkBAIC0xMDIzLDcgKzEwMjMsNyBAQAogCiAJaW5mbygiTEVHTyBVU0IgVG93ZXIgIyVkIG5vdyBkaXNjb25uZWN0ZWQiLCAobWlub3IgLSBMRUdPX1VTQl9UT1dFUl9NSU5PUl9CQVNFKSk7CiAKLQlkYmcoMiwgIiVzOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIApAQCAtMTAzNiw3ICsxMDM2LDcgQEAKIAlpbnQgcmVzdWx0OwogCWludCByZXR2YWwgPSAwOwogCi0JZGJnKDIsICIlczogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygyLCAiJXM6IGVudGVyIiwgX19mdW5jX18pOwogCiAJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLwogCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmdG93ZXJfZHJpdmVyKTsKQEAgLTEwNDksNyArMTA0OSw3IEBACiAJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOwogCiBleGl0OgotCWRiZygyLCAiJXM6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJZGJnKDIsICIlczogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fZnVuY19fLCByZXR2YWwpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTEwNjAsMTIgKzEwNjAsMTIgQEAKICAqLwogc3RhdGljIHZvaWQgX19leGl0IGxlZ29fdXNiX3Rvd2VyX2V4aXQodm9pZCkKIHsKLQlkYmcoMiwgIiVzOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KIAl1c2JfZGVyZWdpc3RlciAoJnRvd2VyX2RyaXZlcik7CiAKLQlkYmcoMiwgIiVzOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKDIsICIlczogbGVhdmUiLCBfX2Z1bmNfXyk7CiB9CiAKIG1vZHVsZV9pbml0IChsZWdvX3VzYl90b3dlcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldGtpdC5jIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKaW5kZXggYWE5YmNjZS4uMjQyMzBjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAJYnVmZmVyID0ga3phbGxvYyg0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZraXQtPnVkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigma2l0LT51ZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWJ1ZmZlclswXSA9ICh1OClraXQtPm91dHB1dHM7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwogCWZvcm1fYnVmZmVyID0ga21hbGxvYygzMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCghYnVmZmVyKSB8fCAoIWZvcm1fYnVmZmVyKSkgewotCQlkZXZfZXJyKCZraXQtPnVkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigma2l0LT51ZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjE2LDcgKzIxNiw3IEBACiAJCiAJYnVmZmVyID0ga3phbGxvYyg4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZraXQtPnVkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigma2l0LT51ZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0bW90b3Jjb250cm9sLmMgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRtb3RvcmNvbnRyb2wuYwppbmRleCAyYWQwOWIxLi5mMDExM2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRtb3RvcmNvbnRyb2wuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRtb3RvcmNvbnRyb2wuYwpAQCAtNjEsNyArNjEsNyBAQAogCiAJYnVmZmVyID0ga3phbGxvYyg4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZtYy0+aW50Zi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZtYy0+aW50Zi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0c2Vydm8uYyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldHNlcnZvLmMKaW5kZXggMGQ5ZGUyZi4uN2Q1OTBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0c2Vydm8uYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRzZXJ2by5jCkBAIC04OSw3ICs4OSw3IEBACiAJYnVmZmVyID0ga21hbGxvYyg2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlkZXZfZXJyKCZzZXJ2by0+dWRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLAotCQkJX19GVU5DVElPTl9fKTsKKwkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNjIsNyArMTYyLDcgQEAKIAlidWZmZXIgPSBrbWFsbG9jKDIsIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7CiAJCWRldl9lcnIoJnNlcnZvLT51ZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsCi0JCQlfX0ZVTkNUSU9OX18pOworCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI1OSw3ICsyNTksNyBAQAogCiAJZGV2ID0ga3phbGxvYyhzaXplb2YgKHN0cnVjdCBwaGlkZ2V0X3NlcnZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jCmluZGV4IDIwNzc3ZDAuLjdmNzAyMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYwpAQCAtNzgsNyArNzgsNyBAQAogCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmbGNkX2RyaXZlciwgc3VibWlub3IpOwogCWlmICghaW50ZXJmYWNlKSB7CiAJCWVyciAoIlVTQkxDRDogJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHN1Ym1pbm9yKTsKKwkJICAgICBfX2Z1bmNfXywgc3VibWlub3IpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE4NSw3ICsxODUsNyBAQAogCXN0cnVjdCB1c2JfbGNkICpkZXY7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGV2ID0gKHN0cnVjdCB1c2JfbGNkICopdXJiLT5jb250ZXh0OworCWRldiA9IHVyYi0+Y29udGV4dDsKIAogCS8qIHN5bmMvYXN5bmMgdW5saW5rIGZhdWx0cyBhcmVuJ3QgZXJyb3JzICovCiAJaWYgKHN0YXR1cyAmJgpAQCAtMTkzLDcgKzE5Myw3IEBACiAJICAgICAgc3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CiAgICAgICAgICAgICAgIHN0YXR1cyA9PSAtRVNIVVRET1dOKSkgewogCQlkYmcoIlVTQkxDRDogJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAkvKiBmcmVlIHVwIG91ciBhbGxvY2F0ZWQgYnVmZmVyICovCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkvKiBzZW5kIHRoZSBkYXRhIG91dCB0aGUgYnVsayBwb3J0ICovCiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWVycigiVVNCTENEOiAlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCWVycigiVVNCTENEOiAlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAkJZ290byBlcnJvcl91bmFuY2hvcjsKIAl9CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCmluZGV4IGI2YjViMmEuLmE1MTk4MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCkBAIC0yMDEsNyArMjAxLDcgQEAKIAogc3RhdGljIHZvaWQgc2ltcGxlX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JY29tcGxldGUgKChzdHJ1Y3QgY29tcGxldGlvbiAqKSB1cmItPmNvbnRleHQpOworCWNvbXBsZXRlKHVyYi0+Y29udGV4dCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXJiICpzaW1wbGVfYWxsb2NfdXJiICgKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJdXJiLT5zdGF0dXMgPSBzdGF0dXM7Ci0JCWNvbXBsZXRlICgoc3RydWN0IGNvbXBsZXRpb24gKikgdXJiLT5jb250ZXh0KTsKKwkJY29tcGxldGUodXJiLT5jb250ZXh0KTsKIAl9CiB9CiAKQEAgLTExMzYsNyArMTEzNiw3IEBACiAJCWRiZyAoImVwICUwMnggYm9ndXMgc3RhdHVzOiAlMDR4ICE9IDAiLCBlcCwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHZhbCA9IHNpbXBsZV9pbyAodXJiLCAxLCAwLCAwLCBfX0ZVTkNUSU9OX18pOworCXJldHZhbCA9IHNpbXBsZV9pbyAodXJiLCAxLCAwLCAwLCBfX2Z1bmNfXyk7CiAJaWYgKHJldHZhbCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gMDsKQEAgLTExNTgsNyArMTE1OCw3IEBACiAJCWRiZyAoImVwICUwMnggYm9ndXMgc3RhdHVzOiAlMDR4ICE9IDEiLCBlcCwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHZhbCA9IHNpbXBsZV9pbyAodXJiLCAxLCAwLCAtRVBJUEUsIF9fRlVOQ1RJT05fXyk7CisJcmV0dmFsID0gc2ltcGxlX2lvICh1cmIsIDEsIDAsIC1FUElQRSwgX19mdW5jX18pOwogCWlmIChyZXR2YWwgIT0gLUVQSVBFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR2YWwgPSBzaW1wbGVfaW8gKHVyYiwgMSwgMCwgLUVQSVBFLCAidmVyaWZ5X3N0aWxsX2hhbHRlZCIpOwpAQCAtMTQwNCw3ICsxNDA0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJbWF4cCA9IDB4N2ZmICYgbGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpOwogCW1heHAgKj0gMSArICgweDMgJiAobGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpID4+IDExKSk7Ci0JcGFja2V0cyA9IChieXRlcyArIG1heHAgLSAxKSAvIG1heHA7CisJcGFja2V0cyA9IERJVl9ST1VORF9VUChieXRlcywgbWF4cCk7CiAKIAl1cmIgPSB1c2JfYWxsb2NfdXJiIChwYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyYikKQEAgLTE1NjQsNyArMTU2NCw4IEBACiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5sb2NrKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWlmIChpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04pIHsKKwkvKiBGSVhNRTogV2hhdCBpZiBhIHN5c3RlbSBzbGVlcCBzdGFydHMgd2hpbGUgYSB0ZXN0IGlzIHJ1bm5pbmc/ICovCisJaWYgKCFpbnRmLT5pc19hY3RpdmUpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCQlyZXR1cm4gLUVIT1NUVU5SRUFDSDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9tb24vTWFrZWZpbGUKaW5kZXggOTBjNTk1My4uMGY3NmVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMKLSMgTWFrZWZpbGUgZm9yIFVTQiBDb3JlIGZpbGVzIGFuZCBmaWxlc3lzdGVtCisjIE1ha2VmaWxlIGZvciBVU0IgbW9uaXRvcgogIwogCiB1c2Jtb24tb2Jqcwk6PSBtb25fbWFpbi5vIG1vbl9zdGF0Lm8gbW9uX3RleHQubyBtb25fYmluLm8gbW9uX2RtYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYwppbmRleCAxNzc0YmE1Li40OTE0NTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKQEAgLTEwMjYsOCArMTAyNiw2IEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKLSNpZiAwCi0KIC8qCiAgKiBvcGVuIGFuZCBjbG9zZToganVzdCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHRpbWVzIHRoZSBkZXZpY2UgaXMKICAqIG1hcHBlZCwgdG8gdXNlIHRoZSBwcm9wZXIgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24uCkBAIC0xMDYzLDEzICsxMDYxLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtb25fYmluX3ZtX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbW9uX2Jpbl92bV9vcHMgPSB7CiAJLm9wZW4gPSAgICAgbW9uX2Jpbl92bWFfb3BlbiwKIAkuY2xvc2UgPSAgICBtb25fYmluX3ZtYV9jbG9zZSwKIAkuZmF1bHQgPSAgICBtb25fYmluX3ZtYV9mYXVsdCwKIH07CiAKLWludCBtb25fYmluX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBtb25fYmluX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCS8qIGRvbid0IGRvIGFueXRoaW5nIGhlcmU6ICJmYXVsdCIgd2lsbCBzZXQgdXAgcGFnZSB0YWJsZSBlbnRyaWVzICovCiAJdm1hLT52bV9vcHMgPSAmbW9uX2Jpbl92bV9vcHM7CkBAIC0xMDc5LDggKzEwNzcsNiBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgIC8qICAwICAqLwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb25fZm9wc19iaW5hcnkgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLm9wZW4gPQkJbW9uX2Jpbl9vcGVuLApAQCAtMTA5MCw2ICsxMDg2LDcgQEAKIAkucG9sbCA9CQltb25fYmluX3BvbGwsCiAJLmlvY3RsID0JbW9uX2Jpbl9pb2N0bCwKIAkucmVsZWFzZSA9CW1vbl9iaW5fcmVsZWFzZSwKKwkubW1hcCA9CQltb25fYmluX21tYXAsCiB9OwogCiBzdGF0aWMgaW50IG1vbl9iaW5fd2FpdF9ldmVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IG1vbl9yZWFkZXJfYmluICpycCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9tb25fbWFpbi5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9tYWluLmMKaW5kZXggYjM3MWZmZC4uNDQyZDgwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl9tYWluLmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl9tYWluLmMKQEAgLTEyOSw4ICsxMjksNyBAQAogCiAvKgogICovCi1zdGF0aWMgdm9pZCBtb25fYnVzX2NvbXBsZXRlKHN0cnVjdCBtb25fYnVzICptYnVzLCBzdHJ1Y3QgdXJiICp1cmIsCi0JCWludCBzdGF0dXMpCitzdGF0aWMgdm9pZCBtb25fYnVzX2NvbXBsZXRlKHN0cnVjdCBtb25fYnVzICptYnVzLCBzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX3N0YXQuYyBiL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCmluZGV4IGY2ZDE0OTEuLmM3YTU5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCkBAIC01OSw2ICs1OSw5IEBACiAKIHN0YXRpYyBpbnQgbW9uX3N0YXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKKwlzdHJ1Y3Qgc25hcCAqc3AgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShzcCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKaW5kZXggYzFlNjVkZi4uMmNmZmVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKQEAgLTIwLDggKzIwLDggQEAKIGlmIFVTQl9TRVJJQUwKIAogY29uZmlnIFVTQl9TRVJJQUxfQ09OU09MRQotCWJvb2wgIlVTQiBTZXJpYWwgQ29uc29sZSBkZXZpY2Ugc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUw9eSAmJiBFWFBFUklNRU5UQUwKKwlib29sICJVU0IgU2VyaWFsIENvbnNvbGUgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfU0VSSUFMPXkKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byB1c2UgYSBVU0IgdG8gc2VyaWFsCiAJICBjb252ZXJ0ZXIgcG9ydCBhcyB0aGUgc3lzdGVtIGNvbnNvbGUgKHRoZSBzeXN0ZW0gY29uc29sZSBpcyB0aGUKQEAgLTQ0LDEzICs0NCwxMSBAQAogCiBjb25maWcgVVNCX0VaVVNCCiAJYm9vbCAiRnVuY3Rpb25zIGZvciBsb2FkaW5nIGZpcm13YXJlIG9uIEVaVVNCIGNoaXBzIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgICAgU2F5IFkgaGVyZSBpZiB5b3UgbmVlZCBFWlVTQiBkZXZpY2Ugc3VwcG9ydC4KIAogY29uZmlnIFVTQl9TRVJJQUxfR0VORVJJQwogCWJvb2wgIlVTQiBHZW5lcmljIFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGdlbmVyaWMgVVNCIHNlcmlhbCBkcml2ZXIuICBQbGVhc2UKIAkgIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCkBAIC01OSw4ICs1Nyw3IEBACiAJICBwcm9wZXJseS4KIAogY29uZmlnIFVTQl9TRVJJQUxfQUlSQ0FCTEUKLQl0cmlzdGF0ZSAiVVNCIEFJUmNhYmxlIEJsdWV0b290aCBEb25nbGUgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIEFJUmNhYmxlIEJsdWV0b290aCBEb25nbGUgRHJpdmVyIgogCWhlbHAKIAkgICAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgVVNCIEFJUmNhYmxlIEJsdWV0b290aCBEb25nbGUuCiAKQEAgLTY5LDcgKzY2LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfQUlSUFJJTUUKIAl0cmlzdGF0ZSAiVVNCIEFpclByaW1lIENETUEgV2lyZWxlc3MgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgQWlyUHJpbWUgQ0RNQSBXaXJlbGVzcyBQQyBjYXJkLgogCkBAIC03Nyw4ICs3Myw3IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWlycHJpbWUuCiAKIGNvbmZpZyBVU0JfU0VSSUFMX0FSSzMxMTYKLQl0cmlzdGF0ZSAiVVNCIEFSSyBNaWNybyAzMTE2IFVTQiBTZXJpYWwgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIEFSSyBNaWNybyAzMTE2IFVTQiBTZXJpYWwgRHJpdmVyIgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgQVJLIE1pY3JvIDMxMTYgVVNCIHRvIFNlcmlhbAogCSAgZGV2aWNlLgpAQCAtODgsNyArODMsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9CRUxLSU4KIAl0cmlzdGF0ZSAiVVNCIEJlbGtpbiBhbmQgUGVyYWNvbSBTaW5nbGUgUG9ydCBTZXJpYWwgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgQmVsa2luIFVTQiBTZXJpYWwgc2luZ2xlIHBvcnQKIAkgIGFkYXB0b3IgKEY1VTEwMyBpcyBvbmUgb2YgdGhlIG1vZGVsIG51bWJlcnMpIG9yIHRoZSBQZXJhY29tIHNpbmdsZQpAQCAtOTksNyArOTMsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9DSDM0MQogCXRyaXN0YXRlICJVU0IgV2luY2hpcGhlYWQgQ0gzNDEgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIFdpbmNoaXBoZWFkIENIMzQxIHNpbmdsZSBwb3J0CiAJICBVU0IgdG8gc2VyaWFsIGFkYXB0ZXIuCkBAIC0xMDksNyArMTAyLDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfV0hJVEVIRUFUCiAJdHJpc3RhdGUgIlVTQiBDb25uZWN0VGVjaCBXaGl0ZUhFQVQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAlzZWxlY3QgVVNCX0VaVVNCCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBDb25uZWN0VGVjaCBXaGl0ZUhFQVQgNCBwb3J0CkBAIC0xMjAsNyArMTEyLDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUCiAJdHJpc3RhdGUgIlVTQiBEaWdpIEludGVybmF0aW9uYWwgQWNjZWxlUG9ydCBVU0IgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBEaWdpIEFjY2VsZVBvcnQgVVNCIDIgb3IgNCBkZXZpY2VzLAogCSAgMiBwb3J0IChwbHVzIHBhcmFsbGVsIHBvcnQpIGFuZCA0IHBvcnQgVVNCIHNlcmlhbCBjb252ZXJ0ZXJzLiAgVGhlCkBAIC0xMzUsNyArMTI2LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfQ1AyMTAxCiAJdHJpc3RhdGUgIlVTQiBDUDIxMDEgVUFSVCBCcmlkZ2UgQ29udHJvbGxlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBDUDIxMDEvQ1AyMTAyIGJhc2VkIFVTQiB0byBSUzIzMgogCSAgY29udmVydGVyLgpAQCAtMTQ1LDcgKzEzNSw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX0NZUFJFU1NfTTgKIAl0cmlzdGF0ZSAiVVNCIEN5cHJlc3MgTTggVVNCIFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGV2aWNlIHRoYXQgY29udGFpbnMgdGhlIEN5cHJlc3MKIAkgIFVTQiB0byBTZXJpYWwgbWljcm9jb250cm9sbGVyLCBzdWNoIGFzIHRoZSBEZUxvcm1lIEVhcnRobWF0ZSBHUFMuCkBAIC0xNjAsNyArMTQ5LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfRU1QRUcKIAl0cmlzdGF0ZSAiVVNCIEVtcGVnIGVtcGVnLWNhciBNYXJrIEkvSUkgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0byB5b3VyIEVtcGVnIGVtcGVnLWNhciBNYXJrIEkvSUkKIAkgIG1wMyBwbGF5ZXIgdmlhIFVTQi4gIFRoZSBkcml2ZXIgdXNlcyBhIHNpbmdsZSB0dHlVU0J7MCwxLDIsLi4ufQpAQCAtMTcxLDggKzE1OSw3IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZW1wZWcuCiAKIGNvbmZpZyBVU0JfU0VSSUFMX0ZURElfU0lPCi0JdHJpc3RhdGUgIlVTQiBGVERJIFNpbmdsZSBQb3J0IFNlcmlhbCBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJVU0IgRlRESSBTaW5nbGUgUG9ydCBTZXJpYWwgRHJpdmVyIgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgRlRESSBTSU8gc2luZ2xlIHBvcnQgVVNCIHRvIHNlcmlhbAogCSAgY29udmVydGVyIGRldmljZS4gVGhlIGltcGxlbWVudGF0aW9uIEkgaGF2ZSBpcyBjYWxsZWQgdGhlIFVTQy0xMDAwLgpAQCAtMTg2LDcgKzE3Myw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX0ZVTlNPRlQKIAl0cmlzdGF0ZSAiVVNCIEZ1bmRhbWVudGFsIFNvZnR3YXJlIERvbmdsZSBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIEZ1bmRhbWVudGFsIFNvZnR3YXJlIGRvbmdsZS4KIApAQCAtMTk1LDcgKzE4MSw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX1ZJU09SCiAJdHJpc3RhdGUgIlVTQiBIYW5kc3ByaW5nIFZpc29yIC8gUGFsbSBtNTB4IC8gU29ueSBDbGllIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8geW91ciBIYW5kU3ByaW5nIFZpc29yLCBQYWxtCiAJICBtNTAwIG9yIG01MDUgdGhyb3VnaCBpdHMgVVNCIGRvY2tpbmcgc3RhdGlvbi4gU2VlCkBAIC0yMDcsNyArMTkyLDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfSVBBUQogCXRyaXN0YXRlICJVU0IgUG9ja2V0UEMgUERBIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8geW91ciBDb21wYXEgaVBBUSwgSFAgSm9ybmFkYQogCSAgb3IgYW55IG90aGVyIFBEQSBydW5uaW5nIFdpbmRvd3MgQ0UgMy4wIG9yIFBvY2tldFBDIDIwMDIKQEAgLTIxOCw4ICsyMDIsNyBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlwYXEuCiAKIGNvbmZpZyBVU0JfU0VSSUFMX0lSCi0JdHJpc3RhdGUgIlVTQiBJUiBEb25nbGUgU2VyaWFsIERyaXZlciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlVTQiBJUiBEb25nbGUgU2VyaWFsIERyaXZlciIKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBzaW1wbGUgc2VyaWFsIHN1cHBvcnQgZm9yIFVTQiBJckRBCiAJICBkZXZpY2VzLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgZnVsbCBJckRBCkBAIC0yMzAsNyArMjEzLDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfRURHRVBPUlQKIAl0cmlzdGF0ZSAiVVNCIEluc2lkZSBPdXQgRWRnZXBvcnQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBkZXZpY2VzIGZyb20KIAkgIEluc2lkZSBPdXQgTmV0d29ya3MgKERpZ2kpOgpAQCAtMjU2LDcgKzIzOCw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX0VER0VQT1JUX1RJCiAJdHJpc3RhdGUgIlVTQiBJbnNpZGUgT3V0IEVkZ2Vwb3J0IFNlcmlhbCBEcml2ZXIgKFRJIGRldmljZXMpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGFueSBvZiB0aGUgZGV2aWNlcyBmcm9tIEluc2lkZSBPdXQKIAkgIE5ldHdvcmtzIChEaWdpKSB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBpb19lZGdlcG9ydCBkcml2ZXIuCkBAIC0yNjcsNyArMjQ4LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfR0FSTUlOCiAgICAgICAgdHJpc3RhdGUgIlVTQiBHYXJtaW4gR1BTIGRyaXZlciIKLSAgICAgICBkZXBlbmRzIG9uIFVTQl9TRVJJQUwKICAgICAgICBoZWxwCiAgICAgICAgICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8geW91ciBHYXJtaW4gR1BTLgogICAgICAgICAgU2hvdWxkIHdvcmsgd2l0aCBtb3N0IEdhcm1pbiBHUFMgZGV2aWNlcyB3aGljaCBoYXZlIGEgbmF0aXZlIFVTQiBwb3J0LgpAQCAtMjc5LDggKzI1OSw3IEBACiAgICAgICAgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ2FybWluX2dwcy4KIAogY29uZmlnIFVTQl9TRVJJQUxfSVBXCi0gICAgICAgIHRyaXN0YXRlICJVU0IgSVBXaXJlbGVzcyAoM0cgVU1UUyBUREQpIERyaXZlciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCisgICAgICAgIHRyaXN0YXRlICJVU0IgSVBXaXJlbGVzcyAoM0cgVU1UUyBUREQpIERyaXZlciIKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIElQV2lyZWxlc3MgVVNCIG1vZGVtIHN1Y2ggYXMKIAkgIHRoZSBvbmVzIHN1cHBsaWVkIGJ5IEF4aXR5M0cvU2VudGVjaCBTb3V0aCBBZnJpY2EuCkBAIC0yODksOCArMjY4LDcgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHcuCiAKIGNvbmZpZyBVU0JfU0VSSUFMX0lVVQotCXRyaXN0YXRlICJVU0IgSW5maW5pdHkgVVNCIFVubGltaXRlZCBQaG9lbml4IERyaXZlciAoRXhwZXJpbWVudGFsKSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlVTQiBJbmZpbml0eSBVU0IgVW5saW1pdGVkIFBob2VuaXggRHJpdmVyIgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgSVVVIGluIHBob2VuaXggbW9kZSBhbmQgZ2V0CiAJICBhbiBleHRyYSB0dHlVU0J4IGRldmljZS4gTW9yZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgb24KQEAgLTMwMSw3ICsyNzksNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9LRVlTUEFOX1BEQQogCXRyaXN0YXRlICJVU0IgS2V5c3BhbiBQREEgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAlzZWxlY3QgVVNCX0VaVVNCCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBLZXlzcGFuIFBEQSBzaW5nbGUgcG9ydCBVU0IgdG8KQEAgLTMxMyw3ICsyOTAsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9LRVlTUEFOCiAJdHJpc3RhdGUgIlVTQiBLZXlzcGFuIFVTQS14eHggU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAlzZWxlY3QgVVNCX0VaVVNCCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgS2V5c3BhbiBVU0IgdG8gc2VyaWFsIGNvbnZlcnRlcgpAQCAtNDA1LDggKzM4MSw3IEBACiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgZmlybXdhcmUgZm9yIHRoZSBVU0EtNDlXTEMgY29udmVydGVyLgogCiBjb25maWcgVVNCX1NFUklBTF9LTFNJCi0JdHJpc3RhdGUgIlVTQiBLTDVLVVNCMTA1IChQYWxtY29ubmVjdCkgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIEtMNUtVU0IxMDUgKFBhbG1jb25uZWN0KSBEcml2ZXIiCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBLTDVLVVNCMTA1IC0gYmFzZWQgc2luZ2xlIHBvcnQKIAkgIHNlcmlhbCBhZGFwdGVyLiBUaGUgbW9zdCB3aWRlbHkga25vd24gLS0gYW5kIGN1cnJlbnRseSB0aGUgb25seQpAQCAtNDIyLDcgKzM5Nyw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX0tPQklMX1NDVAogICAgICAgICB0cmlzdGF0ZSAiVVNCIEtPQklMIGNoaXBjYXJkIHJlYWRlciIKLSAgICAgICAgZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAgICAgICAgIC0tLWhlbHAtLS0KICAgICAgICAgICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBLT0JJTCBVU0IgY2hpcGNhcmQKICAgICAgICAgICByZWFkZXJzOgpAQCAtNDQwLDcgKzQxNCw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX01DVF9VMjMyCiAJdHJpc3RhdGUgIlVTQiBNQ1QgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIFVTQiBTZXJpYWwgc2luZ2xlIHBvcnQgYWRhcHRlciBmcm9tCiAJICBNYWdpYyBDb250cm9sIFRlY2hub2xvZ3kgQ29ycC4gKFUyMzIgaXMgb25lIG9mIHRoZSBtb2RlbCBudW1iZXJzKS4KQEAgLTQ1Myw3ICs0MjYsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9NT1M3NzIwCiAJdHJpc3RhdGUgIlVTQiBNb3NjaGlwIDc3MjAgU2VyaWFsIERyaXZlciIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBVU0IgU2VyaWFsIHNpbmdsZSBhbmQgZG91YmxlCiAJICBwb3J0IGFkYXB0ZXJzIGZyb20gTW9zY2hpcCBTZW1pY29uZHVjdG9yIFRlY2guCkBAIC00NjMsNyArNDM1LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfTU9TNzg0MAogCXRyaXN0YXRlICJVU0IgTW9zY2hpcCA3ODQwLzc4MjAgVVNCIFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBNQ1M3ODQwIFF1YWQtU2VyaWFsIG9yIE1DUzc4MjAKIAkgIER1YWwtU2VyaWFsIHBvcnQgZGV2aWNlIGZyb20gTW9zQ2hpcCBTZW1pY29uZHVjdG9yLgpAQCAtNDc4LDE0ICs0NDksMTIgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfTkFWTUFOCiAJdHJpc3RhdGUgIlVTQiBOYXZtYW4gR1BTIGRldmljZSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBuYXZtYW4uCiAKIGNvbmZpZyBVU0JfU0VSSUFMX1BMMjMwMwogCXRyaXN0YXRlICJVU0IgUHJvbGlmaWMgMjMwMyBTaW5nbGUgUG9ydCBTZXJpYWwgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBQTDIzMDMgVVNCIFNlcmlhbCBzaW5nbGUgcG9ydAogCSAgYWRhcHRlciBmcm9tIFByb2xpZmljLgpAQCAtNDk0LDggKzQ2Myw3IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGwyMzAzLgogCiBjb25maWcgVVNCX1NFUklBTF9PVEk2ODU4Ci0JdHJpc3RhdGUgIlVTQiBPdXJzIFRlY2hub2xvZ3kgSW5jLiBPVGktNjg1OCBVU0IgVG8gUlMyMzIgQnJpZGdlIENvbnRyb2xsZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCisJdHJpc3RhdGUgIlVTQiBPdXJzIFRlY2hub2xvZ3kgSW5jLiBPVGktNjg1OCBVU0IgVG8gUlMyMzIgQnJpZGdlIENvbnRyb2xsZXIiCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIE9UaS02ODU4IHNpbmdsZSBwb3J0IFVTQiB0byBzZXJpYWwKICAgICAgICAgICBjb252ZXJ0ZXIgZGV2aWNlLgpAQCAtNTAzLDkgKzQ3MSwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3RpNjg1OC4KIAorY29uZmlnIFVTQl9TRVJJQUxfU1BDUDhYNQorCXRyaXN0YXRlICJVU0IgU1BDUDh4NSBVU0IgVG8gU2VyaWFsIERyaXZlciIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgc3BjcDh4NSBjb252ZXJ0ZXIgY2hpcC4gIFRoaXMgaXMKKwkgIGNvbW1vbmx5IGZvdW5kIGluIHNvbWUgWi1XYXZlIFVTQiBkZXZpY2VzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzcGNwOHg1LgorCiBjb25maWcgVVNCX1NFUklBTF9IUDRYCiAgICAgICAgIHRyaXN0YXRlICJVU0IgSFA0eCBDYWxjdWxhdG9ycyBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIFVTQl9TRVJJQUwKICAgICAgICAgaGVscAogICAgICAgICAgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGFuIEhld2xldHQtUGFja2FyZCA0eCBDYWxjdWxhdG9yLgogCkBAIC01MTMsOCArNDg5LDcgQEAKICAgICAgICAgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaHA0eC4KIAogY29uZmlnIFVTQl9TRVJJQUxfU0FGRQotCXRyaXN0YXRlICJVU0IgU2FmZSBTZXJpYWwgKEVuY2Fwc3VsYXRlZCkgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIFNhZmUgU2VyaWFsIChFbmNhcHN1bGF0ZWQpIERyaXZlciIKIAogY29uZmlnIFVTQl9TRVJJQUxfU0FGRV9QQURERUQKIAlib29sICJVU0IgU2VjdXJlIEVuY2Fwc3VsYXRlZCBEcml2ZXIgLSBQYWRkZWQiCkBAIC01MjIsNyArNDk3LDYgQEAKIAogY29uZmlnIFVTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MKIAl0cmlzdGF0ZSAiVVNCIFNpZXJyYSBXaXJlbGVzcyBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJaGVscAogCSAgU2F5IE0gaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBTaWVycmEgV2lyZWxlc3MgZGV2aWNlIChpZgogCSAgdXNpbmcgYW4gUEMgNTIyMCBvciBBQzU4MCBwbGVhc2UgdXNlIHRoZSBBaXJwcmltZSBkcml2ZXIKQEAgLTUzMyw3ICs1MDcsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9USQogCXRyaXN0YXRlICJVU0IgVEkgMzQxMC81MDUyIFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIFRJIFVTQiAzNDEwIG9yIDUwNTIKIAkgIHNlcmlhbCBkZXZpY2VzLgpAQCAtNTQyLDggKzUxNSw3IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGlfdXNiXzM0MTBfNTA1Mi4KIAogY29uZmlnIFVTQl9TRVJJQUxfQ1lCRVJKQUNLCi0JdHJpc3RhdGUgIlVTQiBSRUlORVIgU0NUIGN5YmVySmFjayBwaW5wYWQvZS1jb20gY2hpcGNhcmQgcmVhZGVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiVVNCIFJFSU5FUiBTQ1QgY3liZXJKYWNrIHBpbnBhZC9lLWNvbSBjaGlwY2FyZCByZWFkZXIiCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBjeWJlckphY2sgcGlucGFkL2UtY29tIFVTQiBjaGlwY2FyZAogCSAgcmVhZGVyLiBUaGlzIGlzIGFuIGludGVyZmFjZSB0byBJU08gNzgxNiBjb21wYXRpYmxlIGNvbnRhY3QtYmFzZWQKQEAgLTU1Niw3ICs1MjgsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9YSVJDT00KIAl0cmlzdGF0ZSAiVVNCIFhpcmNvbSAvIEVudHJlZ3JhIFNpbmdsZSBQb3J0IFNlcmlhbCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJc2VsZWN0IFVTQl9FWlVTQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgWGlyY29tIG9yIEVudHJlZ3JhIHNpbmdsZSBwb3J0IFVTQiB0bwpAQCAtNTY4LDcgKzUzOSw2IEBACiAKIGNvbmZpZyBVU0JfU0VSSUFMX09QVElPTgogCXRyaXN0YXRlICJVU0IgZHJpdmVyIGZvciBHU00gYW5kIENETUEgbW9kZW1zIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBHU00gb3IgQ0RNQSBtb2RlbSB0aGF0J3MgY29ubmVjdGVkIHRvIFVTQi4KIApAQCAtNTg2LDggKzU1Niw3IEBACiAJICBpdCBtaWdodCBiZSBhY2Nlc3NpYmxlIHZpYSB0aGUgRlRESV9TSU8gZHJpdmVyLgogCiBjb25maWcgVVNCX1NFUklBTF9PTU5JTkVUCi0JdHJpc3RhdGUgIlVTQiBaeVhFTCBvbW5pLm5ldCBMQ0QgUGx1cyBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfU0VSSUFMICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJVU0IgWnlYRUwgb21uaS5uZXQgTENEIFBsdXMgRHJpdmVyIgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgWnlYRUwgb21uaS5uZXQgTENEIElTRE4gVEEuCiAKQEAgLTU5Niw3ICs1NjUsNiBAQAogCiBjb25maWcgVVNCX1NFUklBTF9ERUJVRwogCXRyaXN0YXRlICJVU0IgRGVidWdnaW5nIERldmljZSIKLQlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgVVNCIGRlYnVnZ2luZyBkZXZpY2UgdXNlZCB0byByZWNlaXZlCiAJICBkZWJ1Z2dpbmcgZGF0YSBmcm9tIGFub3RoZXIgbWFjaGluZS4gIFRoZSBtb3N0IGNvbW1vbiBvZiB0aGVzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCmluZGV4IDBkYjEwOWEuLjc1Njg1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKQEAgLTMwLDggKzMwLDggQEAKIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0hQNFgpCQkJKz0gaHA0eC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9JUEFRKQkJCSs9IGlwYXEubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfSVBXKQkJCSs9IGlwdy5vCi1vYmotJChDT05GSUdfVVNCX1NFUklBTF9JVVUpCQkJKz0gaXV1X3Bob2VuaXgubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfSVIpCQkJKz0gaXItdXNiLm8KK29iai0kKENPTkZJR19VU0JfU0VSSUFMX0lVVSkJCQkrPSBpdXVfcGhvZW5peC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOKQkJKz0ga2V5c3Bhbi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSkJCSs9IGtleXNwYW5fcGRhLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0tMU0kpCQkJKz0ga2w1a3VzYjEwNS5vCkBAIC00Niw2ICs0Niw3IEBACiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9QTDIzMDMpCQkJKz0gcGwyMzAzLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX1NBRkUpCQkJKz0gc2FmZV9zZXJpYWwubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MpCQkrPSBzaWVycmEubworb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfU1BDUDhYNSkJCSs9IHNwY3A4eDUubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfVEkpCQkJKz0gdGlfdXNiXzM0MTBfNTA1Mi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9WSVNPUikJCQkrPSB2aXNvci5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9XSElURUhFQVQpCQkrPSB3aGl0ZWhlYXQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwppbmRleCAxY2QyOWNkLi5hMjM4ODE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgY2hhciogYnVmOwogCXUxNiAqZGJ1ZjsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJcmV0dXJuOwogCkBAIC0yMjAsNyArMjIwLDcgQEAKIAogCWJ1ZiA9IGt6YWxsb2MoY291bnQgKyBIQ0lfSEVBREVSX0xFTkdUSCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWYpIHsKLQkJZXJyKCIlcy0ga3phbGxvYyglZCkgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXywKKwkJZXJyKCIlcy0ga3phbGxvYyglZCkgZmFpbGVkLiIsIF9fZnVuY19fLAogCQkgICAgY291bnQgKyBIQ0lfSEVBREVSX0xFTkdUSCk7CiAJCXJldHVybjsKIAl9CkBAIC0yMzYsNyArMjM2LDcgQEAKIAogCWtmcmVlKGJ1Zik7CiAJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOwotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLAorCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sCiAJCQkgICAgICBjb3VudCArIEhDSV9IRUFERVJfTEVOR1RILAogCQkJICAgICAgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGNvdW50ICsgSENJX0hFQURFUl9MRU5HVEg7CkBAIC0yNDYsNyArMjQ2LDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCX0KIApAQCAtMjc1LDcgKzI3NSw3IEBACiAKIAlpZiAoIXR0eSkgewogCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yeF93b3JrKTsKLQkJZXJyKCIlcyAtIE5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gTm8gdHR5IGF2YWlsYWJsZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDsKIAl9CiAKQEAgLTI4Niw3ICsyODYsNyBAQAogCiAJdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcodHR5LCAmZGF0YSwgY291bnQpOwogCWlmICghZGF0YSl7Ci0JCWVycigiJXMtIGt6YWxsb2MoJWQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwkJZXJyKCIlcy0ga3phbGxvYyglZCkgZmFpbGVkLiIsIF9fZnVuY19fLCBjb3VudCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMzMiw3ICszMzIsNyBAQAogCiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhaXJjYWJsZV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KXsKLQkJZXJyKCIlcy0ga21hbGxvYyglWmQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sCisJCWVycigiJXMtIGttYWxsb2MoJVpkKSBmYWlsZWQuIiwgX19mdW5jX18sCiAJCQlzaXplb2Yoc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzY2LDcgKzM2Niw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlzdHJ1Y3QgYWlyY2FibGVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAocHJpdikgewogCQlzZXJpYWxfYnVmX2ZyZWUocHJpdi0+dHhfYnVmKTsKQEAgLTM4OCwxMiArMzg4LDEyIEBACiAJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHRlbXA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY291bnQpOworCWRiZygiJXMgLSBwb3J0ICVkLCAlZCBieXRlcyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwgc291cmNlKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgc291cmNlKTsKIAogCWlmICghY291bnQpewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIGNvdW50OwogCX0KIApAQCAtNDE0LDcgKzQxNCw3IEBACiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIC0gdXJiIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18gLCBzdGF0dXMpOworCWRiZygiJXMgLSB1cmIgc3RhdHVzOiAlZCIsIF9fZnVuY19fICwgc3RhdHVzKTsKIAogCS8qIFRoaXMgaGFzIGJlZW4gdGFrZW4gZnJvbSBjeXByZXNzX204LmMgY3lwcmVzc193cml0ZV9pbnRfY2FsbGJhY2sgKi8KIAlzd2l0Y2ggKHN0YXR1cykgewpAQCAtNDI2LDIxICs0MjYsMjEgQEAKIAkJY2FzZSAtRVNIVVRET1dOOgogCQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAkJCXJldHVybjsKIAkJZGVmYXVsdDoKIAkJCS8qIGVycm9yIGluIHRoZSB1cmIsIHNvIHdlIGhhdmUgdG8gcmVzdWJtaXQgaXQgKi8KLQkJCWRiZygiJXMgLSBPdmVyZmxvdyBpbiB3cml0ZSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gT3ZlcmZsb3cgaW4gd3JpdGUiLCBfX2Z1bmNfXyk7CiAJCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAJCQlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChyZXN1bHQpCiAJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKIAkJCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCQkJZWxzZQogCQkJCXJldHVybjsKIAl9CkBAIC00NjAsMTcgKzQ2MCwxNyBAQAogCXVuc2lnbmVkIGNoYXIgKnRlbXA7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChzdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYiBzdGF0dXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYiBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKLQkJCWRiZygiJXMgLSBwb3J0IGlzIGNsb3NlZCwgZXhpdGluZy4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBvcnQgaXMgY2xvc2VkLCBleGl0aW5nLiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCQlpZiAoc3RhdHVzID09IC1FUFJPVE8pIHsKIAkJCWRiZygiJXMgLSBjYXVnaHQgLUVQUk9UTywgcmVzdWJtaXR0aW5nIHRoZSB1cmIiLAotCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgX19mdW5jX18pOwogCQkJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQkgIHVzYl9yY3ZidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwKIAkJCQkJICAJCSAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLApAQCAtNDgyLDE0ICs0ODIsMTQgQEAKIAkJCWlmIChyZXN1bHQpCiAJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKIAkJCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJZGJnKCIlcyAtIHVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB1bmFibGUgdG8gaGFuZGxlIHRoZSBlcnJvciwgZXhpdGluZy4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCx1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAl0dHkgPSBwb3J0LT50dHk7CkBAIC01MzgsNyArNTM4LDcgQEAKIAkJaWYgKHJlc3VsdCkKIAkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCX0KIAogCXJldHVybjsKQEAgLTU1MCw3ICs1NTAsNyBAQAogCXN0cnVjdCBhaXJjYWJsZV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CkBAIC01NjQsNyArNTY0LDcgQEAKIAlpbnQgYWN0dWFsbHlfdGhyb3R0bGVkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKIAlhY3R1YWxseV90aHJvdHRsZWQgPSBwcml2LT5yeF9mbGFncyAmIEFDVFVBTExZX1RIUk9UVExFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJwcmltZS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKaW5kZXggZjE1NmRiYS4uNzI1YjZiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBhaXJwcmltZV9wcml2YXRlICpwcml2OwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChwb3J0LT5udW1iZXIgIT0gMCkKIAkJcmV0dXJuIDA7CkBAIC04MywxNCArODMsMTQgQEAKIAlpbnQgcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpCiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAlyZXR1cm47CiB9CiAKQEAgLTExMiwxNCArMTEyLDE0IEBACiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogZnJlZSB1cCB0aGUgdHJhbnNmZXIgYnVmZmVyLCBhcyB1c2JfZnJlZV91cmIoKSBkb2VzIG5vdCBkbyB0aGlzICovCiAJa2ZyZWUgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCWlmIChzdGF0dXMpCiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCS0tcHJpdi0+b3V0c3RhbmRpbmdfdXJiczsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAlpbnQgaTsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBpbml0aWFsaXplIG91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlIGlmIGl0IGlzbid0IGFscmVhZHkgY3JlYXRlZCAqLwogCWlmICghcHJpdikgewpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewogCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCV9fZnVuY19fKTsKIAkJCXJlc3VsdCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm91dDsKIAkJfQpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCWlmICghdXJiKSB7CiAJCQlrZnJlZShidWZmZXIpOwogCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBubyBtb3JlIHVyYnM/XG4iLAotCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJX19mdW5jX18pOwogCQkJcmVzdWx0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3V0OwogCQl9CkBAIC0xODAsNyArMTgwLDcgQEAKIAkJCWtmcmVlKGJ1ZmZlcik7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIgJWQgZm9yIHBvcnQgJWQsIGVycm9yICVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgaSwgcG9ydC0+bnVtYmVyLCByZXN1bHQpOworCQkJCV9fZnVuY19fLCBpLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJCQlnb3RvIGVycm91dDsKIAkJfQogCQkvKiByZW1lbWJlciB0aGlzIHVyYiBzbyB3ZSBjYW4ga2lsbCBpdCB3aGVuIHRoZSBwb3J0IGlzIGNsb3NlZCAqLwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJc3RydWN0IGFpcnByaW1lX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IGk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcHJpdi0+cnRzX3N0YXRlID0gMDsKIAlwcml2LT5kdHJfc3RhdGUgPSAwOwpAQCAtMjQyLDEyICsyNDIsMTIgQEAKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgc3RhdHVzOwotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT5vdXRzdGFuZGluZ191cmJzID4gTlVNX1dSSVRFX1VSQlMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0yNjQsNyArMjY0LDcgQEAKIAl9CiAJbWVtY3B5IChidWZmZXIsIGJ1ZiwgY291bnQpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBidWZmZXIpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCBidWZmZXIpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZXJpYWwtPmRldiwKIAkJCSAgdXNiX3NuZGJ1bGtwaXBlKHNlcmlhbC0+ZGV2LApAQCAtMjc3LDcgKzI3Nyw3IEBACiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgd2l0aCBzdGF0dXMgPSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQljb3VudCA9IHN0YXR1czsKIAkJa2ZyZWUgKGJ1ZmZlcik7CiAJfSBlbHNlIHsKQEAgLTMwNiw5ICszMDYsNiBAQAogCX0sCiAJLnVzYl9kcml2ZXIgPQkJJmFpcnByaW1lX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkub3BlbiA9CQkJYWlycHJpbWVfb3BlbiwKIAkuY2xvc2UgPQkJYWlycHJpbWVfY2xvc2UsCiAJLndyaXRlID0JCWFpcnByaW1lX3dyaXRlLApAQCAtMzMxLDcgKzMyOCw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhaXJwcmltZV9leGl0KHZvaWQpCiB7Ci0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXVzYl9kZXJlZ2lzdGVyKCZhaXJwcmltZV9kcml2ZXIpOwogCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmYWlycHJpbWVfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jCmluZGV4IGZlMmJmZDYuLjU5OWFiMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAKIAljb25maWcgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKCFwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkKSB7CkBAIC0xOTIsNiArMTkyLDcgQEAKIAlidWYgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CiAJCWRiZygiZXJyb3Iga21hbGxvYyIpOworCQkqcG9ydC0+dHR5LT50ZXJtaW9zID0gKm9sZF90ZXJtaW9zOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMjMsNyArMzI0LDcgQEAKIAljaGFyICpidWY7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJYnVmID0ga21hbGxvYygxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikgewpAQCAtMzk1LDcgKzM5Niw3IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKLQkJZGJnKCIlcyBjbWQgMHglMDR4IG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisJCWRiZygiJXMgY21kIDB4JTA0eCBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18sIGNtZCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNDQ3LDkgKzQ0OCw2IEBACiAJfSwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCiAJLnVzYl9kcml2ZXIgPQkJJmFyazMxMTZfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luID0JMSwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5hdHRhY2ggPQkJYXJrMzExNl9hdHRhY2gsCiAJLnNldF90ZXJtaW9zID0JCWFyazMxMTZfc2V0X3Rlcm1pb3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYmVsa2luX3NhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYmVsa2luX3NhLmMKaW5kZXggZGYwYTJiMy4uMGEzMjJmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2JlbGtpbl9zYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9iZWxraW5fc2EuYwpAQCAtMTI4LDkgKzEyOCw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJCZWxraW4gLyBQZXJhY29tIC8gR29IdWJzIFVTQiBTZXJpYWwgQWRhcHRlciIsCiAJLnVzYl9kcml2ZXIgPQkJJmJlbGtpbl9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlX2NvbWJpbmVkLAotCS5udW1faW50ZXJydXB0X2luID0JMSwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5vcGVuID0JCQliZWxraW5fc2Ffb3BlbiwKIAkuY2xvc2UgPQkJYmVsa2luX3NhX2Nsb3NlLApAQCAtMTk4LDcgKzE5NSw3IEBACiAJc3RydWN0IGJlbGtpbl9zYV9wcml2YXRlICpwcml2OwogCWludCBpOwogCQotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIHN0b3AgcmVhZHMgYW5kIHdyaXRlcyBvbiBhbGwgcG9ydHMgKi8KIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKQEAgLTIxMyw3ICsyMTAsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JZGJnKCIlcyBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLypTdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZSovCiAJLyogVE9ETzogTG9vayBhdCBwb3NzaWJpbGl0eSBvZiBzdWJtaXR0aW5nIG11bHRpcGxlIFVSQnMgdG8gZGV2aWNlIHRvCkBAIC0yNDAsNyArMjM3LDcgQEAKIAogc3RhdGljIHZvaWQgYmVsa2luX3NhX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkYmcoIiVzIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBzaHV0ZG93biBvdXIgYnVsayByZWFkcyBhbmQgd3JpdGVzICovCiAJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CkBAIC0yNTEsNyArMjQ4LDcgQEAKIAogc3RhdGljIHZvaWQgYmVsa2luX3NhX3JlYWRfaW50X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGJlbGtpbl9zYV9wcml2YXRlICpwcml2OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgcmV0dmFsOwpAQCAtMjY3LDE1ICsyNjQsMTUgQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAkvKiBIYW5kbGUga25vd24gaW50ZXJydXB0IGRhdGEgKi8KIAkvKiBpZ25vcmUgZGF0YVswXSBhbmQgZGF0YVsxXSAqLwpAQCAtMzM0LDcgKzMzMSw3IEBACiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJICAgICBfX2Z1bmNfXywgcmV0dmFsKTsKIH0KIAogc3RhdGljIHZvaWQgYmVsa2luX3NhX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQpAQCAtNDgxLDcgKzQ3OCw3IEBACiAJdW5zaWduZWQgbG9uZyBjb250cm9sX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJY29udHJvbF9zdGF0ZSA9IHByaXYtPmNvbnRyb2xfc3RhdGU7CkBAIC01MDIsNyArNDk5LDcgQEAKIAlpbnQgcnRzID0gMDsKIAlpbnQgZHRyID0gMDsKIAkKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAljb250cm9sX3N0YXRlID0gcHJpdi0+Y29udHJvbF9zdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jaDM0MS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKaW5kZXggNDI1ODJkNC4uZDk0N2Q5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKQEAgLTMxOCw5ICszMTgsNiBAQAogCX0sCiAJLmlkX3RhYmxlICAgICAgICAgPSBpZF90YWJsZSwKIAkudXNiX2RyaXZlciAgICAgICA9ICZjaDM0MV9kcml2ZXIsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiAgICAgID0gMSwKLQkubnVtX2J1bGtfb3V0ICAgICA9IDEsCiAJLm51bV9wb3J0cyAgICAgICAgPSAxLAogCS5vcGVuICAgICAgICAgICAgID0gY2gzNDFfb3BlbiwKIAkuc2V0X3Rlcm1pb3MgICAgICA9IGNoMzQxX3NldF90ZXJtaW9zLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jb25zb2xlLmMKaW5kZXggNjZjZTMwYy4uMjAxMTg0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY29uc29sZS5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IE5VTEw7CiAJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zID0gTlVMTCwgZHVtbXk7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAob3B0aW9ucykgewogCQliYXVkID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgTlVMTCwgMTApOwpAQCAtMjI1LDEwICsyMjUsMTAgQEAKIAlpZiAoY291bnQgPT0gMCkKIAkJcmV0dXJuOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsICVkIGJ5dGUocykiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY291bnQpOworCWRiZygiJXMgLSBwb3J0ICVkLCAlZCBieXRlKHMpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY291bnQpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZyAoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnICgiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI0OCw3ICsyNDgsNyBAQAogCQkJcmV0dmFsID0gc2VyaWFsLT50eXBlLT53cml0ZShwb3J0LCBidWYsIGkpOwogCQllbHNlCiAJCQlyZXR2YWwgPSB1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGUocG9ydCwgYnVmLCBpKTsKLQkJZGJnKCIlcyAtIHJldHVybiB2YWx1ZSA6ICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQlkYmcoIiVzIC0gcmV0dXJuIHZhbHVlIDogJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAkJaWYgKGxmKSB7CiAJCQkvKiBhcHBlbmQgQ1IgYWZ0ZXIgTEYgKi8KIAkJCXVuc2lnbmVkIGNoYXIgY3IgPSAxMzsKQEAgLTI1Niw3ICsyNTYsNyBAQAogCQkJCXJldHZhbCA9IHNlcmlhbC0+dHlwZS0+d3JpdGUocG9ydCwgJmNyLCAxKTsKIAkJCWVsc2UKIAkJCQlyZXR2YWwgPSB1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGUocG9ydCwgJmNyLCAxKTsKLQkJCWRiZygiJXMgLSByZXR1cm4gdmFsdWUgOiAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCWRiZygiJXMgLSByZXR1cm4gdmFsdWUgOiAlZCIsIF9fZnVuY19fLCByZXR2YWwpOwogCQl9CiAJCWJ1ZiArPSBpOwogCQljb3VudCAtPSBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCmluZGV4IDMyNGJiNjEuLmRjMGVhMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKQEAgLTUzLDkgKzUzLDExIEBACiBzdGF0aWMgaW50IGRlYnVnOwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MDQ4OSwgMHhFMDAwKSB9LCAvKiBQaXJlbGxpIEJyb2FkYmFuZCBTLnAuQSwgRFAtTDEwIFNJUC9HU00gTW9iaWxlICovCiAJeyBVU0JfREVWSUNFKDB4MDhlNiwgMHg1NTAxKSB9LCAvKiBHZW1hbHRvIFByb3gtUFUvQ1UgY29udGFjdGxlc3Mgc21hcnRjYXJkIHJlYWRlciAqLwogCXsgVVNCX0RFVklDRSgweDBGQ0YsIDB4MTAwMykgfSwgLyogRHluYXN0cmVhbSBBTlQgZGV2ZWxvcG1lbnQgYm9hcmQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwRkNGLCAweDEwMDQpIH0sIC8qIER5bmFzdHJlYW0gQU5UMlVTQiAqLworCXsgVVNCX0RFVklDRSgweDBGQ0YsIDB4MTAwNikgfSwgLyogRHluYXN0cmVhbSBBTlQgZGV2ZWxvcG1lbnQgYm9hcmQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEE2LCAweEFBMjYpIH0sIC8qIEtub2NrLW9mZiBEQ1UtMTEgY2FibGUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEFCLCAweDEwQzUpIH0sIC8qIFNpZW1lbnMgTUM2MCBDYWJsZSAqLwogCXsgVVNCX0RFVklDRSgweDEwQjUsIDB4QUM3MCkgfSwgLyogTm9raWEgQ0EtNDIgVVNCICovCkBAIC03MSw2ICs3Myw3IEBACiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MTRBKSB9LCAvKiBXZXN0IE1vdW50YWluIFJhZGlvIFJJR2JsYXN0ZXIgUCZQICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MTRCKSB9LCAvKiBXZXN0IE1vdW50YWluIFJhZGlvIFJJR3RhbGsgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxNUUpIH0sIC8qIEhlbGljb21tIElQLUxpbmsgMTIyMC1EVk0gKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxQUMpIH0sIC8qIE1TRCBEYXNoIEhhd2sgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxQzgpIH0sIC8qIExpcG93c2t5IEluZHVzdHJpZSBFbGVrdHJvbmlrIEdtYkgsIEJhYnktSlRBRyAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODFFMikgfSwgLyogTGlwb3dza3kgSW5kdXN0cmllIEVsZWt0cm9uaWsgR21iSCwgQmFieS1MSU4gKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxRTcpIH0sIC8qIEFlcm9jb21tIFJhZGlvICovCkBAIC0xMDYsOSArMTA5LDYgQEAKIAl9LAogCS51c2JfZHJpdmVyCQk9ICZjcDIxMDFfZHJpdmVyLAogCS5pZF90YWJsZQkJPSBpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbgk9IDAsCi0JLm51bV9idWxrX2luCQk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dAkJPSBOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMJCT0gMSwKIAkub3BlbgkJCT0gY3AyMTAxX29wZW4sCiAJLmNsb3NlCQkJPSBjcDIxMDFfY2xvc2UsCkBAIC0xOTMsNyArMTkzLDcgQEAKIAogCWJ1ZiA9IGtjYWxsb2MobGVuZ3RoLCBzaXplb2YoX19sZTMyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTIxNCw3ICsyMTQsNyBAQAogCWlmIChyZXN1bHQgIT0gc2l6ZSkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIFVuYWJsZSB0byBzZW5kIGNvbmZpZyByZXF1ZXN0LCAiCiAJCQkJInJlcXVlc3Q9MHgleCBzaXplPSVkIHJlc3VsdD0lZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlcXVlc3QsIHNpemUsIHJlc3VsdCk7CisJCQkJX19mdW5jX18sIHJlcXVlc3QsIHNpemUsIHJlc3VsdCk7CiAJCXJldHVybiAtRVBST1RPOwogCX0KIApAQCAtMjQwLDcgKzI0MCw3IEBACiAJYnVmID0ga21hbGxvYyhsZW5ndGggKiBzaXplb2YoX19sZTMyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNjUsNyArMjY1LDcgQEAKIAlpZiAoKHNpemUgPiAyICYmIHJlc3VsdCAhPSBzaXplKSB8fCByZXN1bHQgPCAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gVW5hYmxlIHRvIHNlbmQgcmVxdWVzdCwgIgogCQkJCSJyZXF1ZXN0PTB4JXggc2l6ZT0lZCByZXN1bHQ9JWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCByZXF1ZXN0LCBzaXplLCByZXN1bHQpOworCQkJCV9fZnVuY19fLCByZXF1ZXN0LCBzaXplLCByZXN1bHQpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKQEAgLTI5MywxMSArMjkzLDExIEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChjcDIxMDFfc2V0X2NvbmZpZ19zaW5nbGUocG9ydCwgQ1AyMTAxX1VBUlQsIFVBUlRfRU5BQkxFKSkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIFVuYWJsZSB0byBlbmFibGUgVUFSVFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCkBAIC0zMTIsNyArMzEyLDcgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsICIKLQkJCQkiZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkiZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtMzI5LDcgKzMyOSw3IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc2VyaWFsLT5kZXYpIHsKIAkJLyogc2h1dGRvd24gYW55IGJ1bGsgcmVhZHMgdGhhdCBtaWdodCBiZSBnb2luZyBvbiAqLwpAQCAtMzQyLDEwICszNDIsMTAgQEAKIAogc3RhdGljIHZvaWQgY3AyMTAxX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIHNodXRkb3duIG91ciB1cmJzICovCi0JZGJnKCIlcyAtIHNodXR0aW5nIGRvd24gdXJicyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIHNodXR0aW5nIGRvd24gdXJicyIsIF9fZnVuY19fKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+d3JpdGVfdXJiKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwogCkBAIC0zNjcsMTAgKzM2NywxMCBAQAogCWludCBiYXVkOwogCWludCBiaXRzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghcG9ydC0+dHR5IHx8ICFwb3J0LT50dHktPnRlcm1pb3MpIHsKLQkJZGJnKCIlcyAtIG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNzksNyArMzc5LDcgQEAKIAlpZiAoYmF1ZCkKIAkJYmF1ZCA9IEJBVURfUkFURV9HRU5fRlJFUSAvIGJhdWQ7CiAKLQlkYmcoIiVzIC0gYmF1ZCByYXRlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWQpOworCWRiZygiJXMgLSBiYXVkIHJhdGUgPSAlZCIsIF9fZnVuY19fLCBiYXVkKTsKIAogCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHBvcnQtPnR0eSwgYmF1ZCwgYmF1ZCk7CiAJY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CkBAIC0zODgsMjQgKzM4OCwyNCBAQAogCWNmbGFnICY9IH5DU0laRTsKIAlzd2l0Y2goYml0cyAmIEJJVFNfREFUQV9NQVNLKSB7CiAJCWNhc2UgQklUU19EQVRBXzU6Ci0JCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gNSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gNSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnIHw9IENTNTsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfREFUQV82OgotCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyB8PSBDUzY7CiAJCQlicmVhazsKIAkJY2FzZSBCSVRTX0RBVEFfNzoKLQkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA3IiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA3IiwgX19mdW5jX18pOwogCQkJY2ZsYWcgfD0gQ1M3OwogCQkJYnJlYWs7CiAJCWNhc2UgQklUU19EQVRBXzg6Ci0JCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gOCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gOCIsIF9fZnVuY19fKTsKIAkJCWNmbGFnIHw9IENTODsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfREFUQV85OgogCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDkgKG5vdCBzdXBwb3J0ZWQsICIKLQkJCQkJInVzaW5nIDggZGF0YSBiaXRzKSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJ1c2luZyA4IGRhdGEgYml0cykiLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyB8PSBDUzg7CiAJCQliaXRzICY9IH5CSVRTX0RBVEFfTUFTSzsKIAkJCWJpdHMgfD0gQklUU19EQVRBXzg7CkBAIC00MTMsNyArNDEzLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGJnKCIlcyAtIFVua25vd24gbnVtYmVyIG9mIGRhdGEgYml0cywgIgotCQkJCQkidXNpbmcgOCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJ1c2luZyA4IiwgX19mdW5jX18pOwogCQkJY2ZsYWcgfD0gQ1M4OwogCQkJYml0cyAmPSB+QklUU19EQVRBX01BU0s7CiAJCQliaXRzIHw9IEJJVFNfREFUQV84OwpAQCAtNDIzLDM1ICs0MjMsMzUgQEAKIAogCXN3aXRjaChiaXRzICYgQklUU19QQVJJVFlfTUFTSykgewogCQljYXNlIEJJVFNfUEFSSVRZX05PTkU6Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gTk9ORSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gTk9ORSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnICY9IH5QQVJFTkI7CiAJCQlicmVhazsKIAkJY2FzZSBCSVRTX1BBUklUWV9PREQ6Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gT0REIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwYXJpdHkgPSBPREQiLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyB8PSAoUEFSRU5CfFBBUk9ERCk7CiAJCQlicmVhazsKIAkJY2FzZSBCSVRTX1BBUklUWV9FVkVOOgotCQkJZGJnKCIlcyAtIHBhcml0eSA9IEVWRU4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IEVWRU4iLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyAmPSB+UEFST0REOwogCQkJY2ZsYWcgfD0gUEFSRU5COwogCQkJYnJlYWs7CiAJCWNhc2UgQklUU19QQVJJVFlfTUFSSzoKIAkJCWRiZygiJXMgLSBwYXJpdHkgPSBNQVJLIChub3Qgc3VwcG9ydGVkLCAiCi0JCQkJCSJkaXNhYmxpbmcgcGFyaXR5KSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJkaXNhYmxpbmcgcGFyaXR5KSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnICY9IH5QQVJFTkI7CiAJCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfUEFSSVRZX1NQQUNFOgogCQkJZGJnKCIlcyAtIHBhcml0eSA9IFNQQUNFIChub3Qgc3VwcG9ydGVkLCAiCi0JCQkJCSJkaXNhYmxpbmcgcGFyaXR5KSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJkaXNhYmxpbmcgcGFyaXR5KSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnICY9IH5QQVJFTkI7CiAJCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGJnKCIlcyAtIFVua25vd24gcGFyaXR5IG1vZGUsICIKLQkJCQkJImRpc2FibGluZyBwYXJpdHkiLCBfX0ZVTkNUSU9OX18pOworCQkJCQkiZGlzYWJsaW5nIHBhcml0eSIsIF9fZnVuY19fKTsKIAkJCWNmbGFnICY9IH5QQVJFTkI7CiAJCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKQEAgLTQ2MSwyMSArNDYxLDIxIEBACiAJY2ZsYWcgJj0gfkNTVE9QQjsKIAlzd2l0Y2goYml0cyAmIEJJVFNfU1RPUF9NQVNLKSB7CiAJCWNhc2UgQklUU19TVE9QXzE6Ci0JCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfU1RPUF8xXzU6CiAJCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMS41IChub3Qgc3VwcG9ydGVkLCAiCi0JCQkJCSJ1c2luZyAxIHN0b3AgYml0KSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCSJ1c2luZyAxIHN0b3AgYml0KSIsIF9fZnVuY19fKTsKIAkJCWJpdHMgJj0gfkJJVFNfU1RPUF9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKIAkJCWJyZWFrOwogCQljYXNlIEJJVFNfU1RPUF8yOgotCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX2Z1bmNfXyk7CiAJCQljZmxhZyB8PSBDU1RPUEI7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRiZygiJXMgLSBVbmtub3duIG51bWJlciBvZiBzdG9wIGJpdHMsICIKLQkJCQkJInVzaW5nIDEgc3RvcCBiaXQiLCBfX0ZVTkNUSU9OX18pOworCQkJCQkidXNpbmcgMSBzdG9wIGJpdCIsIF9fZnVuY19fKTsKIAkJCWJpdHMgJj0gfkJJVFNfU1RPUF9NQVNLOwogCQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKIAkJCWJyZWFrOwpAQCAtNDgzLDEwICs0ODMsMTAgQEAKIAogCWNwMjEwMV9nZXRfY29uZmlnKHBvcnQsIENQMjEwMV9NT0RFTUNUTCwgbW9kZW1fY3RsLCAxNik7CiAJaWYgKG1vZGVtX2N0bFswXSAmIDB4MDAwOCkgewotCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gQ1JUU0NUUyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBmbG93IGNvbnRyb2wgPSBDUlRTQ1RTIiwgX19mdW5jX18pOwogCQljZmxhZyB8PSBDUlRTQ1RTOwogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSBmbG93IGNvbnRyb2wgPSBOT05FIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGZsb3cgY29udHJvbCA9IE5PTkUiLCBfX2Z1bmNfXyk7CiAJCWNmbGFnICY9IH5DUlRTQ1RTOwogCX0KIApAQCAtNTAwLDEwICs1MDAsMTAgQEAKIAlpbnQgYmF1ZD0wLCBiaXRzOwogCXVuc2lnbmVkIGludCBtb2RlbV9jdGxbNF07CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT50dHkgfHwgIXBvcnQtPnR0eS0+dGVybWlvcykgewotCQlkYmcoIiVzIC0gbm8gdHR5IHN0cnVjdHVyZXMiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gbm8gdHR5IHN0cnVjdHVyZXMiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DTVNQQVI7CkBAIC01NDIsNyArNTQyLDcgQEAKIAkJfQogCiAJCWlmIChiYXVkKSB7Ci0JCQlkYmcoIiVzIC0gU2V0dGluZyBiYXVkIHJhdGUgdG8gJWQgYmF1ZCIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZygiJXMgLSBTZXR0aW5nIGJhdWQgcmF0ZSB0byAlZCBiYXVkIiwgX19mdW5jX18sCiAJCQkJCWJhdWQpOwogCQkJaWYgKGNwMjEwMV9zZXRfY29uZmlnX3NpbmdsZShwb3J0LCBDUDIxMDFfQkFVRFJBVEUsCiAJCQkJCQkoQkFVRF9SQVRFX0dFTl9GUkVRIC8gYmF1ZCkpKSB7CkBAIC01NjIsMjMgKzU2MiwyMyBAQAogCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKIAkJCWNhc2UgQ1M1OgogCQkJCWJpdHMgfD0gQklUU19EQVRBXzU7Ci0JCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDUiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA1IiwgX19mdW5jX18pOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDUzY6CiAJCQkJYml0cyB8PSBCSVRTX0RBVEFfNjsKLQkJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gNiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX2Z1bmNfXyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENTNzoKIAkJCQliaXRzIHw9IEJJVFNfREFUQV83OwotCQkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA3IiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gNyIsIF9fZnVuY19fKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQ1M4OgogCQkJCWJpdHMgfD0gQklUU19EQVRBXzg7Ci0JCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDgiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA4IiwgX19mdW5jX18pOwogCQkJCWJyZWFrOwogCQkJLypjYXNlIENTOToKIAkJCSAJYml0cyB8PSBCSVRTX0RBVEFfOTsKLQkJCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gOSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9IDkiLCBfX2Z1bmNfXyk7CiAJCQkJYnJlYWs7Ki8KIAkJCWRlZmF1bHQ6CiAJCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiY3AyMTAxIGRyaXZlciBkb2VzIG5vdCAiCkBAIC01OTgsMTAgKzU5OCwxMCBAQAogCQlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJCWlmIChjZmxhZyAmIFBBUk9ERCkgewogCQkJCWJpdHMgfD0gQklUU19QQVJJVFlfT0REOwotCQkJCWRiZygiJXMgLSBwYXJpdHkgPSBPREQiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBwYXJpdHkgPSBPREQiLCBfX2Z1bmNfXyk7CiAJCQl9IGVsc2UgewogCQkJCWJpdHMgfD0gQklUU19QQVJJVFlfRVZFTjsKLQkJCQlkYmcoIiVzIC0gcGFyaXR5ID0gRVZFTiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZGJnKCIlcyAtIHBhcml0eSA9IEVWRU4iLCBfX2Z1bmNfXyk7CiAJCQl9CiAJCX0KIAkJaWYgKGNwMjEwMV9zZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CSVRTLCAmYml0cywgMikpCkBAIC02MTQsMTAgKzYxNCwxMCBAQAogCQliaXRzICY9IH5CSVRTX1NUT1BfTUFTSzsKIAkJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCQliaXRzIHw9IEJJVFNfU1RPUF8yOwotCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX2Z1bmNfXyk7CiAJCX0gZWxzZSB7CiAJCQliaXRzIHw9IEJJVFNfU1RPUF8xOwotCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJCX0KIAkJaWYgKGNwMjEwMV9zZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CSVRTLCAmYml0cywgMikpCiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJOdW1iZXIgb2Ygc3RvcCBiaXRzIHJlcXVlc3RlZCAiCkBAIC02MjcsMjMgKzYyNywyMyBAQAogCWlmICgoY2ZsYWcgJiBDUlRTQ1RTKSAhPSAob2xkX2NmbGFnICYgQ1JUU0NUUykpIHsKIAkJY3AyMTAxX2dldF9jb25maWcocG9ydCwgQ1AyMTAxX01PREVNQ1RMLCBtb2RlbV9jdGwsIDE2KTsKIAkJZGJnKCIlcyAtIHJlYWQgbW9kZW0gY29udHJvbHMgPSAweCUuNHggMHglLjR4IDB4JS40eCAweCUuNHgiLAotCQkJCV9fRlVOQ1RJT05fXywgbW9kZW1fY3RsWzBdLCBtb2RlbV9jdGxbMV0sCisJCQkJX19mdW5jX18sIG1vZGVtX2N0bFswXSwgbW9kZW1fY3RsWzFdLAogCQkJCW1vZGVtX2N0bFsyXSwgbW9kZW1fY3RsWzNdKTsKIAogCQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CiAJCQltb2RlbV9jdGxbMF0gJj0gfjB4N0I7CiAJCQltb2RlbV9jdGxbMF0gfD0gMHgwOTsKIAkJCW1vZGVtX2N0bFsxXSA9IDB4ODA7Ci0JCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gQ1JUU0NUUyIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gQ1JUU0NUUyIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCW1vZGVtX2N0bFswXSAmPSB+MHg3QjsKIAkJCW1vZGVtX2N0bFswXSB8PSAweDAxOwogCQkJbW9kZW1fY3RsWzFdIHw9IDB4NDA7Ci0JCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gTk9ORSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZmxvdyBjb250cm9sID0gTk9ORSIsIF9fZnVuY19fKTsKIAkJfQogCiAJCWRiZygiJXMgLSB3cml0ZSBtb2RlbSBjb250cm9scyA9IDB4JS40eCAweCUuNHggMHglLjR4IDB4JS40eCIsCi0JCQkJX19GVU5DVElPTl9fLCBtb2RlbV9jdGxbMF0sIG1vZGVtX2N0bFsxXSwKKwkJCQlfX2Z1bmNfXywgbW9kZW1fY3RsWzBdLCBtb2RlbV9jdGxbMV0sCiAJCQkJbW9kZW1fY3RsWzJdLCBtb2RlbV9jdGxbM10pOwogCQljcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfTU9ERU1DVEwsIG1vZGVtX2N0bCwgMTYpOwogCX0KQEAgLTY1NSw3ICs2NTUsNyBAQAogewogCWludCBjb250cm9sID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc2V0ICYgVElPQ01fUlRTKSB7CiAJCWNvbnRyb2wgfD0gQ09OVFJPTF9SVFM7CkBAIC02NzQsNyArNjc0LDcgQEAKIAkJY29udHJvbCB8PSBDT05UUk9MX1dSSVRFX0RUUjsKIAl9CiAKLQlkYmcoIiVzIC0gY29udHJvbCA9IDB4JS40eCIsIF9fRlVOQ1RJT05fXywgY29udHJvbCk7CisJZGJnKCIlcyAtIGNvbnRyb2wgPSAweCUuNHgiLCBfX2Z1bmNfXywgY29udHJvbCk7CiAKIAlyZXR1cm4gY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0NPTlRST0wsICZjb250cm9sLCAyKTsKIApAQCAtNjg0LDcgKzY4NCw3IEBACiB7CiAJaW50IGNvbnRyb2wsIHJlc3VsdDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAljcDIxMDFfZ2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQ09OVFJPTCwgJmNvbnRyb2wsIDEpOwogCkBAIC02OTUsNyArNjk1LDcgQEAKIAkJfCgoY29udHJvbCAmIENPTlRST0xfUklORyk/IFRJT0NNX1JJICA6IDApCiAJCXwoKGNvbnRyb2wgJiBDT05UUk9MX0RDRCkgPyBUSU9DTV9DRCAgOiAwKTsKIAotCWRiZygiJXMgLSBjb250cm9sID0gMHglLjJ4IiwgX19GVU5DVElPTl9fLCBjb250cm9sKTsKKwlkYmcoIiVzIC0gY29udHJvbCA9IDB4JS4yeCIsIF9fZnVuY19fLCBjb250cm9sKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC03MDQsMTIgKzcwNCwxMiBAQAogewogCWludCBzdGF0ZTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJaWYgKGJyZWFrX3N0YXRlID09IDApCiAJCXN0YXRlID0gQlJFQUtfT0ZGOwogCWVsc2UKIAkJc3RhdGUgPSBCUkVBS19PTjsKLQlkYmcoIiVzIC0gdHVybmluZyBicmVhayAlcyIsIF9fRlVOQ1RJT05fXywKKwlkYmcoIiVzIC0gdHVybmluZyBicmVhayAlcyIsIF9fZnVuY19fLAogCQkJc3RhdGU9PUJSRUFLX09GRiA/ICJvZmYiIDogIm9uIik7CiAJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JSRUFLLCAmc3RhdGUsIDIpOwogfQpAQCAtNzI1LDcgKzcyNSw3IEBACiB7CiAJaW50IGk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogU3RvcCByZWFkcyBhbmQgd3JpdGVzIG9uIGFsbCBwb3J0cyAqLwogCWZvciAoaT0wOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCmluZGV4IDhkOWIwNDUuLmMxNjRlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKQEAgLTkwLDkgKzkwLDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIlJlaW5lciBTQ1QgQ3liZXJqYWNrIFVTQiBjYXJkIHJlYWRlciIsCiAJLnVzYl9kcml2ZXIgPSAJCSZjeWJlcmphY2tfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTEsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCWN5YmVyamFja19zdGFydHVwLAogCS5zaHV0ZG93biA9CQljeWJlcmphY2tfc2h1dGRvd24sCkBAIC0xMTksNyArMTE2LDcgQEAKIAlzdHJ1Y3QgY3liZXJqYWNrX3ByaXZhdGUgKnByaXY7CiAJaW50IGk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KIAlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN5YmVyamFja19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CkBAIC0xNDIsNyArMTM5LDcgQEAKIAkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXN1bHQpCiAJCQllcnIoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGludCkgZmFpbGVkIik7Ci0JCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihpbnQgdXJiKSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihpbnQgdXJiKSIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4oIDAgKTsKQEAgLTE1Miw5ICsxNDksOSBAQAogewogCWludCBpOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKLQlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQl1c2Jfa2lsbF91cmIoc2VyaWFsLT5wb3J0W2ldLT5pbnRlcnJ1cHRfaW5fdXJiKTsKIAkJLyogTXkgc3BlY2lhbCBpdGVtcywgdGhlIHN0YW5kYXJkIHJvdXRpbmVzIGZyZWUgbXkgdXJicyAqLwogCQlrZnJlZSh1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKSk7CkBAIC0xNjgsOSArMTY1LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXN1bHQgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCWRiZygiJXMgLSB1c2JfY2xlYXJfaGFsdCIsIF9fRlVOQ1RJT05fXyApOworCWRiZygiJXMgLSB1c2JfY2xlYXJfaGFsdCIsIF9fZnVuY19fICk7CiAJdXNiX2NsZWFyX2hhbHQocG9ydC0+c2VyaWFsLT5kZXYsIHBvcnQtPndyaXRlX3VyYi0+cGlwZSk7CiAKIAkvKiBmb3JjZSBsb3dfbGF0ZW5jeSBvbiBzbyB0aGF0IG91ciB0dHlfcHVzaCBhY3R1YWxseSBmb3JjZXMKQEAgLTE5MSw3ICsxODgsNyBAQAogCiBzdGF0aWMgdm9pZCBjeWJlcmphY2tfY2xvc2UgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAocG9ydC0+c2VyaWFsLT5kZXYpIHsKIAkJLyogc2h1dGRvd24gYW55IGJ1bGsgcmVhZHMgdGhhdCBtaWdodCBiZSBnb2luZyBvbiAqLwpAQCAtMjA4LDE3ICsyMDUsMTcgQEAKIAlpbnQgcmVzdWx0OwogCWludCB3cmV4cGVjdGVkOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChjb3VudCA9PSAwKSB7Ci0JCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gKDApOworCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJnBvcnQtPmxvY2spOwogCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkgewogCQlzcGluX3VubG9ja19iaCgmcG9ydC0+bG9jayk7Ci0JCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOwpAQCAtMjI2LDI0ICsyMjMsMjQgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQlpZiggKGNvdW50K3ByaXYtPndyZmlsbGVkKT5zaXplb2YocHJpdi0+d3JidWYpICkgeworCWlmKCAoY291bnQrcHJpdi0+d3JmaWxsZWQpID4gc2l6ZW9mKHByaXYtPndyYnVmKSApIHsKIAkJLyogVG8gbXVjaCBkYXRhIGZvciBidWZmZXIuIFJlc2V0IGJ1ZmZlci4gKi8KLQkJcHJpdi0+d3JmaWxsZWQ9MDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlwcml2LT53cmZpbGxlZCA9IDA7CiAJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKLQkJcmV0dXJuICgwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBDb3B5IGRhdGEgKi8KIAltZW1jcHkgKHByaXYtPndyYnVmK3ByaXYtPndyZmlsbGVkLCBidWYsIGNvdW50KTsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwKIAkJcHJpdi0+d3JidWYrcHJpdi0+d3JmaWxsZWQpOwogCXByaXYtPndyZmlsbGVkICs9IGNvdW50OwogCiAJaWYoIHByaXYtPndyZmlsbGVkID49IDMgKSB7CiAJCXdyZXhwZWN0ZWQgPSAoKGludClwcml2LT53cmJ1ZlsyXTw8OCkrcHJpdi0+d3JidWZbMV0rMzsKLQkJZGJnKCIlcyAtIGV4cGVjdGVkIGRhdGE6ICVkIiwgX19GVU5DVElPTl9fLCB3cmV4cGVjdGVkKTsKKwkJZGJnKCIlcyAtIGV4cGVjdGVkIGRhdGE6ICVkIiwgX19mdW5jX18sIHdyZXhwZWN0ZWQpOwogCX0gZWxzZSB7CiAJCXdyZXhwZWN0ZWQgPSBzaXplb2YocHJpdi0+d3JidWYpOwogCX0KQEAgLTI1Miw3ICsyNDksNyBAQAogCQkvKiBXZSBoYXZlIGVub3VnaCBkYXRhIHRvIGJlZ2luIHRyYW5zbWlzc2lvbiAqLwogCQlpbnQgbGVuZ3RoOwogCi0JCWRiZygiJXMgLSB0cmFuc21pdHRpbmcgZGF0YSAoZnJhbWUgMSkiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdHJhbnNtaXR0aW5nIGRhdGEgKGZyYW1lIDEpIiwgX19mdW5jX18pOwogCQlsZW5ndGggPSAod3JleHBlY3RlZCA+IHBvcnQtPmJ1bGtfb3V0X3NpemUpID8gcG9ydC0+YnVsa19vdXRfc2l6ZSA6IHdyZXhwZWN0ZWQ7CiAKIAkJbWVtY3B5IChwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciwgcHJpdi0+d3JidWYsIGxlbmd0aCApOwpAQCAtMjcwLDIzICsyNjcsMjMgQEAKIAkJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCQkvKiBUaHJvdyBhd2F5IGRhdGEuIE5vIGJldHRlciBpZGVhIHdoYXQgdG8gZG8gd2l0aCBpdC4gKi8KLQkJCXByaXYtPndyZmlsbGVkPTA7Ci0JCQlwcml2LT53cnNlbnQ9MDsKKwkJCXByaXYtPndyZmlsbGVkID0gMDsKKwkJCXByaXYtPndyc2VudCA9IDA7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCWRiZygiJXMgLSBwcml2LT53cnNlbnQ9JWQiLCBfX0ZVTkNUSU9OX18scHJpdi0+d3JzZW50KTsKLQkJZGJnKCIlcyAtIHByaXYtPndyZmlsbGVkPSVkIiwgX19GVU5DVElPTl9fLHByaXYtPndyZmlsbGVkKTsKKwkJZGJnKCIlcyAtIHByaXYtPndyc2VudD0lZCIsIF9fZnVuY19fLHByaXYtPndyc2VudCk7CisJCWRiZygiJXMgLSBwcml2LT53cmZpbGxlZD0lZCIsIF9fZnVuY19fLHByaXYtPndyZmlsbGVkKTsKIAogCQlpZiggcHJpdi0+d3JzZW50Pj1wcml2LT53cmZpbGxlZCApIHsKLQkJCWRiZygiJXMgLSBidWZmZXIgY2xlYW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gYnVmZmVyIGNsZWFuZWQiLCBfX2Z1bmNfXyk7CiAJCQltZW1zZXQoIHByaXYtPndyYnVmLCAwLCBzaXplb2YocHJpdi0+d3JidWYpICk7Ci0JCQlwcml2LT53cmZpbGxlZD0wOwotCQkJcHJpdi0+d3JzZW50PTA7CisJCQlwcml2LT53cmZpbGxlZCA9IDA7CisJCQlwcml2LT53cnNlbnQgPSAwOwogCQl9CiAJfQogCkBAIC0yOTcsMjcgKzI5NCwyOCBAQAogCiBzdGF0aWMgaW50IGN5YmVyamFja193cml0ZV9yb29tKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ICkKIHsKKwkvKiBGSVhNRTogLi4uLiAqLwogCXJldHVybiBDWUJFUkpBQ0tfTE9DQUxfQlVGX1NJWkU7CiB9CiAKIHN0YXRpYyB2b2lkIGN5YmVyamFja19yZWFkX2ludF9jYWxsYmFjayggc3RydWN0IHVyYiAqdXJiICkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgY3liZXJqYWNrX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIHRoZSB1cmIgbWlnaHQgaGF2ZSBiZWVuIGtpbGxlZC4gKi8KIAlpZiAoc3RhdHVzKQogCQlyZXR1cm47CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJLyogUmVhY3Qgb25seSB0byBpbnRlcnJ1cHRzIHNpZ25hbGluZyBhIGJ1bGtfaW4gdHJhbnNmZXIgKi8KLQlpZiggKHVyYi0+YWN0dWFsX2xlbmd0aD09NCkgJiYgKGRhdGFbMF09PTB4MDEpICkgeworCWlmKCAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDQpICYmIChkYXRhWzBdID09IDB4MDEpICkgewogCQlzaG9ydCBvbGRfcmR0b2RvOwogCiAJCS8qIFRoaXMgaXMgYSBhbm5vdW5jZW1lbnQgb2YgY29taW5nIGJ1bGtfaW5zLiAqLwpAQCAtMzM2LDcgKzMzNCw3IEBACiAJCS8qICIrPSIgaXMgcHJvYmFibHkgbW9yZSBmYXVsdCB0b2xsZXJhbnQgdGhhbiAiPSIgKi8KIAkJcHJpdi0+cmR0b2RvICs9IHNpemU7CiAKLQkJZGJnKCIlcyAtIHJkdG9kbzogJWQiLCBfX0ZVTkNUSU9OX18sIHByaXYtPnJkdG9kbyk7CisJCWRiZygiJXMgLSByZHRvZG86ICVkIiwgX19mdW5jX18sIHByaXYtPnJkdG9kbyk7CiAKIAkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogCkBAIC0zNDQsOCArMzQyLDggQEAKIAkJCXBvcnQtPnJlYWRfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmKCByZXN1bHQgKQotCQkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQkJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIHVyYikiLCBfX0ZVTkNUSU9OX18pOworCQkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOworCQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgdXJiKSIsIF9fZnVuY19fKTsKIAkJfQogCX0KIApAQCAtMzU0LDEyICszNTIsMTIgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0KQogCQllcnIoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGludCkgZmFpbGVkIik7Ci0JZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKGludCB1cmIpIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoaW50IHVyYikiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIGN5YmVyamFja19yZWFkX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgY3liZXJqYWNrX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0zNjcsMTggKzM2NSwxOCBAQAogCWludCByZXN1bHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gaWdub3Jpbmcgc2luY2UgZGV2aWNlIG5vdCBvcGVuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gaWdub3Jpbmcgc2luY2UgZGV2aWNlIG5vdCBvcGVuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtMzk3LDMwICszOTUsMzAgQEAKIAogCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKIAotCWRiZygiJXMgLSByZHRvZG86ICVkIiwgX19GVU5DVElPTl9fLCB0b2RvKTsKKwlkYmcoIiVzIC0gcmR0b2RvOiAlZCIsIF9fZnVuY19fLCB0b2RvKTsKIAogCS8qIENvbnRpbnVlIHRvIHJlYWQgaWYgd2UgaGF2ZSBzdGlsbCB1cmJzIHRvIGRvLiAqLwogCWlmKCB0b2RvIC8qIHx8ICh1cmItPmFjdHVhbF9sZW5ndGg9PXBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSovICkgewogCQlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkKLQkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgdXJiKSIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKKwkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgdXJiKSIsIF9fZnVuY19fKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGN5YmVyamFja193cml0ZV9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGN5YmVyamFja19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQzMCw3ICs0MjgsNyBAQAogCWlmKCBwcml2LT53cmZpbGxlZCApIHsKIAkJaW50IGxlbmd0aCwgYmxrc2l6ZSwgcmVzdWx0OwogCi0JCWRiZygiJXMgLSB0cmFuc21pdHRpbmcgZGF0YSAoZnJhbWUgbikiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdHJhbnNtaXR0aW5nIGRhdGEgKGZyYW1lIG4pIiwgX19mdW5jX18pOwogCiAJCWxlbmd0aCA9ICgocHJpdi0+d3JmaWxsZWQgLSBwcml2LT53cnNlbnQpID4gcG9ydC0+YnVsa19vdXRfc2l6ZSkgPwogCQkJcG9ydC0+YnVsa19vdXRfc2l6ZSA6IChwcml2LT53cmZpbGxlZCAtIHByaXYtPndyc2VudCk7CkBAIC00NTEsMjMgKzQ0OSwyMyBAQAogCQkvKiBzZW5kIHRoZSBkYXRhIG91dCB0aGUgYnVsayBwb3J0ICovCiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCS8qIFRocm93IGF3YXkgZGF0YS4gTm8gYmV0dGVyIGlkZWEgd2hhdCB0byBkbyB3aXRoIGl0LiAqLwotCQkJcHJpdi0+d3JmaWxsZWQ9MDsKLQkJCXByaXYtPndyc2VudD0wOworCQkJcHJpdi0+d3JmaWxsZWQgPSAwOworCQkJcHJpdi0+d3JzZW50ID0gMDsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCi0JCWRiZygiJXMgLSBwcml2LT53cnNlbnQ9JWQiLCBfX0ZVTkNUSU9OX18scHJpdi0+d3JzZW50KTsKLQkJZGJnKCIlcyAtIHByaXYtPndyZmlsbGVkPSVkIiwgX19GVU5DVElPTl9fLHByaXYtPndyZmlsbGVkKTsKKwkJZGJnKCIlcyAtIHByaXYtPndyc2VudD0lZCIsIF9fZnVuY19fLHByaXYtPndyc2VudCk7CisJCWRiZygiJXMgLSBwcml2LT53cmZpbGxlZD0lZCIsIF9fZnVuY19fLHByaXYtPndyZmlsbGVkKTsKIAogCQlibGtzaXplID0gKChpbnQpcHJpdi0+d3JidWZbMl08PDgpK3ByaXYtPndyYnVmWzFdKzM7CiAKIAkJaWYoIChwcml2LT53cnNlbnQ+PXByaXYtPndyZmlsbGVkKSB8fCAocHJpdi0+d3JzZW50Pj1ibGtzaXplKSApIHsKLQkJCWRiZygiJXMgLSBidWZmZXIgY2xlYW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gYnVmZmVyIGNsZWFuZWQiLCBfX2Z1bmNfXyk7CiAJCQltZW1zZXQoIHByaXYtPndyYnVmLCAwLCBzaXplb2YocHJpdi0+d3JidWYpICk7Ci0JCQlwcml2LT53cmZpbGxlZD0wOwotCQkJcHJpdi0+d3JzZW50PTA7CisJCQlwcml2LT53cmZpbGxlZCA9IDA7CisJCQlwcml2LT53cnNlbnQgPSAwOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwppbmRleCA3NzlkMDc4Li4zMjEyMTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKQEAgLTEyMiw2ICsxMjIsMTEgQEAKIAkubm9fZHluYW1pY19pZCA9IAkxLAogfTsKIAorZW51bSBwYWNrZXRfZm9ybWF0IHsKKwlwYWNrZXRfZm9ybWF0XzEsICAvKiBiMDpzdGF0dXMsIGIxOnBheWxvYWQgY291bnQgKi8KKwlwYWNrZXRfZm9ybWF0XzIgICAvKiBiMFs3OjNdOnN0YXR1cywgYjBbMjowXTpwYXlsb2FkIGNvdW50ICovCit9OworCiBzdHJ1Y3QgY3lwcmVzc19wcml2YXRlIHsKIAlzcGlubG9ja190IGxvY2s7CQkgICAvKiBwcml2YXRlIGxvY2sgKi8KIAlpbnQgY2hpcHR5cGU7CQkJICAgLyogaWRlbnRpZmllciBvZiBkZXZpY2UsIGZvciBxdWlya3MvZXRjICovCkBAIC0xMzksOCArMTQ0LDkgQEAKIAlfX3U4IGN1cnJlbnRfc3RhdHVzOwkgICAJICAgLyogcmVjZWl2ZWQgZnJvbSBsYXN0IHJlYWQgLSBpbmZvIG9uIGRzcixjdHMsY2QscmksZXRjICovCiAJX191OCBjdXJyZW50X2NvbmZpZzsJICAgCSAgIC8qIHN0b3JlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGJ5dGUgKi8KIAlfX3U4IHJ4X2ZsYWdzOwkJCSAgIC8qIHRocm90dGxpbmcgLSB1c2VkIGZyb20gd2hpdGVoZWF0L2Z0ZGlfc2lvICovCisJZW51bSBwYWNrZXRfZm9ybWF0IHBrdF9mbXQ7CSAgIC8qIGZvcm1hdCB0byB1c2UgZm9yIHBhY2tldCBzZW5kIC8gcmVjZWl2ZSAqLworCWludCBnZXRfY2ZnX3Vuc2FmZTsJCSAgIC8qIElmIHRydWUsIHRoZSBDWVBSRVNTX0dFVF9DT05GSUcgaXMgdW5zYWZlICovCiAJaW50IGJhdWRfcmF0ZTsJCQkgICAvKiBzdG9yZXMgY3VycmVudCBiYXVkIHJhdGUgaW4gaW50ZWdlciBmb3JtICovCi0JaW50IGNicl9tYXNrOwkJCSAgIC8qIHN0b3JlcyBjdXJyZW50IGJhdWQgcmF0ZSBpbiBtYXNrZWQgZm9ybSAqLwogCWludCBpc3Rocm90dGxlZDsJCSAgIC8qIGlmIHRocm90dGxlZCwgZGlzY2FyZCByZWFkcyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OyAgLyogdXNlZCBmb3IgVElPQ01JV0FJVCAqLwogCWNoYXIgcHJldl9zdGF0dXMsIGRpZmZfc3RhdHVzOwkgICAvKiB1c2VkIGZvciBUSU9DTUlXQUlUICovCkBAIC0xNzYsOSArMTgyLDYgQEAKIHN0YXRpYyB2b2lkIGN5cHJlc3Nfc2V0X2RlYWQJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyB2b2lkIGN5cHJlc3NfcmVhZF9pbnRfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZCBjeXByZXNzX3dyaXRlX2ludF9jYWxsYmFjawkoc3RydWN0IHVyYiAqdXJiKTsKLS8qIGJhdWQgaGVscGVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludAkgbWFza190b19yYXRlCQkodW5zaWduZWQgbWFzayk7Ci1zdGF0aWMgdW5zaWduZWQgIHJhdGVfdG9fbWFzawkJKGludCByYXRlKTsKIC8qIHdyaXRlIGJ1ZmZlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyBzdHJ1Y3QgY3lwcmVzc19idWYgKmN5cHJlc3NfYnVmX2FsbG9jKHVuc2lnbmVkIGludCBzaXplKTsKIHN0YXRpYyB2b2lkIAkJICBjeXByZXNzX2J1Zl9mcmVlKHN0cnVjdCBjeXByZXNzX2J1ZiAqY2IpOwpAQCAtMTk3LDEwICsyMDAsNiBAQAogCS5kZXNjcmlwdGlvbiA9CQkJIkRlTG9ybWUgRWFydGhtYXRlIFVTQiIsCiAJLnVzYl9kcml2ZXIgPSAJCQkmY3lwcmVzc19kcml2ZXIsCiAJLmlkX3RhYmxlID0JCQlpZF90YWJsZV9lYXJ0aG1hdGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPSAJCTEsCi0JLm51bV9pbnRlcnJ1cHRfb3V0ID0JCTEsCi0JLm51bV9idWxrX2luID0JCQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkJMSwKIAkuYXR0YWNoID0JCQljeXByZXNzX2VhcnRobWF0ZV9zdGFydHVwLAogCS5zaHV0ZG93biA9CQkJY3lwcmVzc19zaHV0ZG93biwKQEAgLTIyNywxMCArMjI2LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJCSJISUQtPkNPTSBSUzIzMiBBZGFwdGVyIiwKIAkudXNiX2RyaXZlciA9IAkJCSZjeXByZXNzX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJCWlkX3RhYmxlX2N5cGhpZGNvbXJzMjMyLAotCS5udW1faW50ZXJydXB0X2luID0JCTEsCi0JLm51bV9pbnRlcnJ1cHRfb3V0ID0JCTEsCi0JLm51bV9idWxrX2luID0JCQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkJMSwKIAkuYXR0YWNoID0JCQljeXByZXNzX2hpZGNvbV9zdGFydHVwLAogCS5zaHV0ZG93biA9CQkJY3lwcmVzc19zaHV0ZG93biwKQEAgLTI1NywxMCArMjUyLDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJCSJOb2tpYSBDQS00MiBWMiBBZGFwdGVyIiwKIAkudXNiX2RyaXZlciA9IAkJCSZjeXByZXNzX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJCWlkX3RhYmxlX25va2lhY2E0MnYyLAotCS5udW1faW50ZXJydXB0X2luID0JCTEsCi0JLm51bV9pbnRlcnJ1cHRfb3V0ID0JCTEsCi0JLm51bV9idWxrX2luID0JCQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkJMSwKIAkuYXR0YWNoID0JCQljeXByZXNzX2NhNDJ2Ml9zdGFydHVwLAogCS5zaHV0ZG93biA9CQkJY3lwcmVzc19zaHV0ZG93biwKQEAgLTI4NCwxNiArMjc1LDYyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAorc3RhdGljIGludCBhbmFseXplX2JhdWRfcmF0ZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzcGVlZF90IG5ld19yYXRlKQoreworCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXY7CisJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCS8qCisJICogVGhlIGdlbmVyYWwgcHVycG9zZSBmaXJtd2FyZSBmb3IgdGhlIEN5cHJlc3MgTTggYWxsb3dzIGZvcgorCSAqIGEgbWF4aW11bSBzcGVlZCBvZiA1NzYwMGJwcyAoSSBoYXZlIG5vIGlkZWEgd2hldGhlciBEZUxvcm1lCisJICogY2hvc2UgdG8gdXNlIHRoZSBnZW5lcmFsIHB1cnBvc2UgZmlybXdhcmUgb3Igbm90KSwgaWYgeW91CisJICogbmVlZCB0byBtb2RpZnkgdGhpcyBzcGVlZCBzZXR0aW5nIGZvciB5b3VyIG93biBwcm9qZWN0CisJICogcGxlYXNlIGFkZCB5b3VyIG93biBjaGlwdHlwZSBhbmQgbW9kaWZ5IHRoZSBjb2RlIGxpa2V3aXNlLgorCSAqIFRoZSBDeXByZXNzIEhJRC0+Q09NIGRldmljZSB3aWxsIHdvcmsgc3VjY2Vzc2Z1bGx5IHVwIHRvCisJICogMTE1MjAwYnBzIChidXQgdGhlIGFjdHVhbCB0aHJvdWdocHV0IGlzIGFyb3VuZCAza0JwcykuCisJICovCisJaWYgKHBvcnQtPnNlcmlhbC0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfTE9XKSB7CisJCS8qCisJCSAqIE1pa2UgSXNlbHkgPGlzZWx5QHBvYm94LmNvbT4gMi1GZWItMjAwODogVGhlCisJCSAqIEN5cHJlc3MgYXBwIG5vdGUgdGhhdCBkZXNjcmliZXMgdGhpcyBtZWNoYW5pc20KKwkJICogc3RhdGVzIHRoZSB0aGUgbG93LXNwZWVkIHBhcnQgY2FuJ3QgaGFuZGxlIG1vcmUKKwkJICogdGhhbiA4MDAgYnl0ZXMvc2VjLCBpbiB3aGljaCBjYXNlIDQ4MDAgYmF1ZCBpcyB0aGUKKwkJICogc2FmZXN0IHNwZWVkIGZvciBhIHBhcnQgbGlrZSB0aGF0LgorCQkgKi8KKwkJaWYgKG5ld19yYXRlID4gNDgwMCkgeworCQkJZGJnKCIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgZGV2aWNlIGluY2FwYWJsZSAiCisJCQkgICAgInNwZWVkICVkIiwgX19mdW5jX18sIG5ld19yYXRlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlzd2l0Y2ggKHByaXYtPmNoaXB0eXBlKSB7CisJY2FzZSBDVF9FQVJUSE1BVEU6CisJCWlmIChuZXdfcmF0ZSA8PSA2MDApIHsKKwkJCS8qIDMwMCBhbmQgNjAwIGJhdWQgcmF0ZXMgYXJlIHN1cHBvcnRlZCB1bmRlcgorCQkJICogdGhlIGdlbmVyaWMgZmlybXdhcmUsIGJ1dCBhcmUgbm90IHVzZWQgd2l0aAorCQkJICogTk1FQSBhbmQgU2lSRiBwcm90b2NvbHMgKi8KKwkJCWRiZygiJXMgLSBmYWlsZWQgc2V0dGluZyBiYXVkIHJhdGUsIHVuc3VwcG9ydGVkIHNwZWVkICIKKwkJCSAgICAib2YgJWQgb24gRWFydGhtYXRlIEdQUyIsIF9fZnVuY19fLCBuZXdfcmF0ZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBuZXdfcmF0ZTsKK30KKworCiAvKiBUaGlzIGZ1bmN0aW9uIGNhbiBlaXRoZXIgc2V0IG9yIHJldHJpZXZlIHRoZSBjdXJyZW50IHNlcmlhbCBsaW5lIHNldHRpbmdzICovCi1zdGF0aWMgaW50IGN5cHJlc3Nfc2VyaWFsX2NvbnRyb2wgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHVuc2lnbmVkIGJhdWRfbWFzaywgaW50IGRhdGFfYml0cywgaW50IHN0b3BfYml0cywKK3N0YXRpYyBpbnQgY3lwcmVzc19zZXJpYWxfY29udHJvbCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3BlZWRfdCBiYXVkX3JhdGUsIGludCBkYXRhX2JpdHMsIGludCBzdG9wX2JpdHMsCiAJCQkJICAgaW50IHBhcml0eV9lbmFibGUsIGludCBwYXJpdHlfdHlwZSwgaW50IHJlc2V0LCBpbnQgY3lwcmVzc19yZXF1ZXN0X3R5cGUpCiB7CiAJaW50IG5ld19iYXVkcmF0ZSA9IDAsIHJldHZhbCA9IDAsIHRyaWVzID0gMDsKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2OwotCV9fdTggZmVhdHVyZV9idWZmZXJbOF07CisJX191OCBmZWF0dXJlX2J1ZmZlcls1XTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAkKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC0zMDIsNTggKzMzOSwyMyBAQAogCiAJc3dpdGNoKGN5cHJlc3NfcmVxdWVzdF90eXBlKSB7CiAJCWNhc2UgQ1lQUkVTU19TRVRfQ09ORklHOgotCi0JCQkvKgotCQkJICogVGhlIGdlbmVyYWwgcHVycG9zZSBmaXJtd2FyZSBmb3IgdGhlIEN5cHJlc3MgTTggYWxsb3dzIGZvciBhIG1heGltdW0gc3BlZWQKLSAJCQkgKiBvZiA1NzYwMGJwcyAoSSBoYXZlIG5vIGlkZWEgd2hldGhlciBEZUxvcm1lIGNob3NlIHRvIHVzZSB0aGUgZ2VuZXJhbCBwdXJwb3NlCi0JCQkgKiBmaXJtd2FyZSBvciBub3QpLCBpZiB5b3UgbmVlZCB0byBtb2RpZnkgdGhpcyBzcGVlZCBzZXR0aW5nIGZvciB5b3VyIG93bgotCQkJICogcHJvamVjdCBwbGVhc2UgYWRkIHlvdXIgb3duIGNoaXB0eXBlIGFuZCBtb2RpZnkgdGhlIGNvZGUgbGlrZXdpc2UuICBUaGUKLQkJCSAqIEN5cHJlc3MgSElELT5DT00gZGV2aWNlIHdpbGwgd29yayBzdWNjZXNzZnVsbHkgdXAgdG8gMTE1MjAwYnBzIChidXQgdGhlCi0JCQkgKiBhY3R1YWwgdGhyb3VnaHB1dCBpcyBhcm91bmQgM2tCcHMpLgotCQkJICovCi0JCQlpZiAoYmF1ZF9tYXNrICE9IHByaXYtPmNicl9tYXNrKSB7Ci0JCQkJZGJnKCIlcyAtIGJhdWQgcmF0ZSBpcyBjaGFuZ2luZyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJaWYgKCBwcml2LT5jaGlwdHlwZSA9PSBDVF9FQVJUSE1BVEUgKSB7Ci0JCQkJCS8qIDMwMCBhbmQgNjAwIGJhdWQgcmF0ZXMgYXJlIHN1cHBvcnRlZCB1bmRlciB0aGUgZ2VuZXJpYyBmaXJtd2FyZSwKLQkJCQkJICogYnV0IGFyZSBub3QgdXNlZCB3aXRoIE5NRUEgYW5kIFNpUkYgcHJvdG9jb2xzICovCi0JCQkJCQotCQkJCQlpZiAoIChiYXVkX21hc2sgPT0gQjMwMCkgfHwgKGJhdWRfbWFzayA9PSBCNjAwKSApIHsKLQkJCQkJCWVycigiJXMgLSBmYWlsZWQgc2V0dGluZyBiYXVkIHJhdGUsIHVuc3VwcG9ydGVkIHNwZWVkIiwKLQkJCQkJCSAgICBfX0ZVTkNUSU9OX18pOwotCQkJCQkJbmV3X2JhdWRyYXRlID0gcHJpdi0+YmF1ZF9yYXRlOwotCQkJCQl9IGVsc2UgaWYgKCAobmV3X2JhdWRyYXRlID0gbWFza190b19yYXRlKGJhdWRfbWFzaykpID09IC0xKSB7Ci0JCQkJCQllcnIoIiVzIC0gZmFpbGVkIHNldHRpbmcgYmF1ZCByYXRlLCB1bnN1cHBvcnRlZCBzcGVlZCIsCi0JCQkJCQkgICAgX19GVU5DVElPTl9fKTsKLQkJCQkJCW5ld19iYXVkcmF0ZSA9IHByaXYtPmJhdWRfcmF0ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfQ1lQSElEQ09NKSB7Ci0JCQkJCWlmICggKG5ld19iYXVkcmF0ZSA9IG1hc2tfdG9fcmF0ZShiYXVkX21hc2spKSA9PSAtMSkgewotCQkJCQkJZXJyKCIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgdW5zdXBwb3J0ZWQgc3BlZWQiLAotCQkJCQkJICAgIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCQluZXdfYmF1ZHJhdGUgPSBwcml2LT5iYXVkX3JhdGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHByaXYtPmNoaXB0eXBlID09IENUX0NBNDJWMikgewotCQkJCQlpZiAoIChuZXdfYmF1ZHJhdGUgPSBtYXNrX3RvX3JhdGUoYmF1ZF9tYXNrKSkgPT0gLTEpIHsKLQkJCQkJCWVycigiJXMgLSBmYWlsZWQgc2V0dGluZyBiYXVkIHJhdGUsIHVuc3VwcG9ydGVkIHNwZWVkIiwKLQkJCQkJCSAgICBfX0ZVTkNUSU9OX18pOwotCQkJCQkJbmV3X2JhdWRyYXRlID0gcHJpdi0+YmF1ZF9yYXRlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChwcml2LT5jaGlwdHlwZSA9PSBDVF9HRU5FUklDKSB7Ci0JCQkJCWlmICggKG5ld19iYXVkcmF0ZSA9IG1hc2tfdG9fcmF0ZShiYXVkX21hc2spKSA9PSAtMSkgewotCQkJCQkJZXJyKCIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgdW5zdXBwb3J0ZWQgc3BlZWQiLAotCQkJCQkJICAgIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCQluZXdfYmF1ZHJhdGUgPSBwcml2LT5iYXVkX3JhdGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbmZvKCIlcyAtIHBsZWFzZSBkZWZpbmUgeW91ciBjaGlwdHlwZSIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCW5ld19iYXVkcmF0ZSA9IHByaXYtPmJhdWRfcmF0ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAgLyogYmF1ZCByYXRlIG5vdCBjaGFuZ2luZywga2VlcCB0aGUgb2xkICovCisJCQluZXdfYmF1ZHJhdGUgPSBwcml2LT5iYXVkX3JhdGU7CisJCQkvKiAwIG1lYW5zICdIYW5nIHVwJyBzbyBkb2Vzbid0IGNoYW5nZSB0aGUgdHJ1ZSBiaXQgcmF0ZSAqLworCQkJaWYgKGJhdWRfcmF0ZSA9PSAwKQogCQkJCW5ld19iYXVkcmF0ZSA9IHByaXYtPmJhdWRfcmF0ZTsKKwkJCS8qIENoYW5nZSBvZiBzcGVlZCA/ICovCisJCQllbHNlIGlmIChiYXVkX3JhdGUgIT0gcHJpdi0+YmF1ZF9yYXRlKSB7CisJCQkJZGJnKCIlcyAtIGJhdWQgcmF0ZSBpcyBjaGFuZ2luZyIsIF9fZnVuY19fKTsKKwkJCQlyZXR2YWwgPSBhbmFseXplX2JhdWRfcmF0ZShwb3J0LCBiYXVkX3JhdGUpOworCQkJCWlmIChyZXR2YWwgPj0gIDApIHsKKwkJCQkJbmV3X2JhdWRyYXRlID0gcmV0dmFsOworCQkJCQlkYmcoIiVzIC0gTmV3IGJhdWQgcmF0ZSBzZXQgdG8gJWQiLAorCQkJCQkgICAgX19mdW5jX18sIG5ld19iYXVkcmF0ZSk7CisJCQkJfQogCQkJfQotCQkJZGJnKCIlcyAtIGJhdWQgcmF0ZSBpcyBiZWluZyBzZW50IGFzICVkIiwgX19GVU5DVElPTl9fLCBuZXdfYmF1ZHJhdGUpOworCQkJZGJnKCIlcyAtIGJhdWQgcmF0ZSBpcyBiZWluZyBzZW50IGFzICVkIiwgX19mdW5jX18sIG5ld19iYXVkcmF0ZSk7CiAJCQkKLQkJCW1lbXNldChmZWF0dXJlX2J1ZmZlciwgMCwgOCk7CisJCQltZW1zZXQoZmVhdHVyZV9idWZmZXIsIDAsIHNpemVvZihmZWF0dXJlX2J1ZmZlcikpOwogCQkJLyogZmlsbCB0aGUgZmVhdHVyZV9idWZmZXIgd2l0aCBuZXcgY29uZmlndXJhdGlvbiAqLwogCQkJKigodV9pbnQzMl90ICopZmVhdHVyZV9idWZmZXIpID0gbmV3X2JhdWRyYXRlOwogCkBAIC0zNjUsNDggKzM2Nyw2NSBAQAogCQkJLyogMSBiaXQgZ2FwICovCiAJCQlmZWF0dXJlX2J1ZmZlcls0XSB8PSAocmVzZXQgPDwgNyk7ICAgLyogYXNzaWduIHJlc2V0IGF0IGVuZCBvZiBieXRlLCAxIGJpdCBzcGFjZSAqLwogCQkJCQotCQkJZGJnKCIlcyAtIGRldmljZSBpcyBiZWluZyBzZW50IHRoaXMgZmVhdHVyZSByZXBvcnQ6IiwgX19GVU5DVElPTl9fKTsKLQkJCWRiZygiJXMgLSAlMDJYIC0gJTAyWCAtICUwMlggLSAlMDJYIC0gJTAyWCIsIF9fRlVOQ1RJT05fXywgZmVhdHVyZV9idWZmZXJbMF0sIGZlYXR1cmVfYnVmZmVyWzFdLAorCQkJZGJnKCIlcyAtIGRldmljZSBpcyBiZWluZyBzZW50IHRoaXMgZmVhdHVyZSByZXBvcnQ6IiwgX19mdW5jX18pOworCQkJZGJnKCIlcyAtICUwMlggLSAlMDJYIC0gJTAyWCAtICUwMlggLSAlMDJYIiwgX19mdW5jX18sIGZlYXR1cmVfYnVmZmVyWzBdLCBmZWF0dXJlX2J1ZmZlclsxXSwKIAkJICAgICAgICAgICAgZmVhdHVyZV9idWZmZXJbMl0sIGZlYXR1cmVfYnVmZmVyWzNdLCBmZWF0dXJlX2J1ZmZlcls0XSk7CiAJCQkKIAkJCWRvIHsKLQkJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyAocG9ydC0+c2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCi0JCQkJCSAgCSAgSElEX1JFUV9TRVRfUkVQT1JULCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfVFlQRV9DTEFTUywKLQkJCQkJCSAgCSAgMHgwMzAwLCAwLCBmZWF0dXJlX2J1ZmZlciwgOCwgNTAwKTsKKwkJCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCisJCQkJCQl1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAorCQkJCQkJSElEX1JFUV9TRVRfUkVQT1JULAorCQkJCQkJVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX1RZUEVfQ0xBU1MsCisJCQkJCQkweDAzMDAsIDAsIGZlYXR1cmVfYnVmZmVyLAorCQkJCQkJc2l6ZW9mKGZlYXR1cmVfYnVmZmVyKSwgNTAwKTsKIAogCQkJCWlmICh0cmllcysrID49IDMpCiAJCQkJCWJyZWFrOwogCi0JCQl9IHdoaWxlIChyZXR2YWwgIT0gOCAmJiByZXR2YWwgIT0gLUVOT0RFVik7CisJCQl9IHdoaWxlIChyZXR2YWwgIT0gc2l6ZW9mKGZlYXR1cmVfYnVmZmVyKSAmJgorCQkJCSByZXR2YWwgIT0gLUVOT0RFVik7CiAKLQkJCWlmIChyZXR2YWwgIT0gOCkgewotCQkJCWVycigiJXMgLSBmYWlsZWQgc2VuZGluZyBzZXJpYWwgbGluZSBzZXR0aW5ncyAtICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJaWYgKHJldHZhbCAhPSBzaXplb2YoZmVhdHVyZV9idWZmZXIpKSB7CisJCQkJZXJyKCIlcyAtIGZhaWxlZCBzZW5kaW5nIHNlcmlhbCBsaW5lIHNldHRpbmdzIC0gJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAkJCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOwogCQkJfSBlbHNlIHsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJCXByaXYtPmJhdWRfcmF0ZSA9IG5ld19iYXVkcmF0ZTsKLQkJCQlwcml2LT5jYnJfbWFzayA9IGJhdWRfbWFzazsKIAkJCQlwcml2LT5jdXJyZW50X2NvbmZpZyA9IGZlYXR1cmVfYnVmZmVyWzRdOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCQkvKiBJZiB3ZSBhc2tlZCBmb3IgYSBzcGVlZCBjaGFuZ2UgZW5jb2RlIGl0ICovCisJCQkJaWYgKGJhdWRfcmF0ZSkKKwkJCQkJdHR5X2VuY29kZV9iYXVkX3JhdGUocG9ydC0+dHR5LAorCQkJCQkJCW5ld19iYXVkcmF0ZSwgbmV3X2JhdWRyYXRlKTsKIAkJCX0KIAkJYnJlYWs7CiAJCWNhc2UgQ1lQUkVTU19HRVRfQ09ORklHOgotCQkJZGJnKCIlcyAtIHJldHJlaXZpbmcgc2VyaWFsIGxpbmUgc2V0dGluZ3MiLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKHByaXYtPmdldF9jZmdfdW5zYWZlKSB7CisJCQkJLyogTm90IGltcGxlbWVudGVkIGZvciB0aGlzIGRldmljZSwKKwkJCQkgICBhbmQgaWYgd2UgdHJ5IHRvIGRvIGl0IHdlJ3JlIGxpa2VseQorCQkJCSAgIHRvIGNyYXNoIHRoZSBoYXJkd2FyZS4gKi8KKwkJCQlyZXR1cm4gLUVOT1RUWTsKKwkJCX0KKwkJCWRiZygiJXMgLSByZXRyZWl2aW5nIHNlcmlhbCBsaW5lIHNldHRpbmdzIiwgX19mdW5jX18pOwogCQkJLyogc2V0IGluaXRpYWwgdmFsdWVzIGluIGZlYXR1cmUgYnVmZmVyICovCi0JCQltZW1zZXQoZmVhdHVyZV9idWZmZXIsIDAsIDgpOworCQkJbWVtc2V0KGZlYXR1cmVfYnVmZmVyLCAwLCBzaXplb2YoZmVhdHVyZV9idWZmZXIpKTsKIAogCQkJZG8gewotCQkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnIChwb3J0LT5zZXJpYWwtPmRldiwgdXNiX3JjdmN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKLQkJCQkJCSAgSElEX1JFUV9HRVRfUkVQT1JULCBVU0JfRElSX0lOIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTLAotCQkJCQkJCSAgMHgwMzAwLCAwLCBmZWF0dXJlX2J1ZmZlciwgOCwgNTAwKTsKLQkJCQkKKwkJCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCisJCQkJCQl1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAorCQkJCQkJSElEX1JFUV9HRVRfUkVQT1JULAorCQkJCQkJVVNCX0RJUl9JTiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfVFlQRV9DTEFTUywKKwkJCQkJCTB4MDMwMCwgMCwgZmVhdHVyZV9idWZmZXIsCisJCQkJCQlzaXplb2YoZmVhdHVyZV9idWZmZXIpLCA1MDApOworCiAJCQkJaWYgKHRyaWVzKysgPj0gMykKIAkJCQkJYnJlYWs7CiAKLQkJCX0gd2hpbGUgKHJldHZhbCAhPSA1ICYmIHJldHZhbCAhPSAtRU5PREVWKTsKKwkJCX0gd2hpbGUgKHJldHZhbCAhPSBzaXplb2YoZmVhdHVyZV9idWZmZXIpICYmCisJCQkJIHJldHZhbCAhPSAtRU5PREVWKTsKIAotCQkJaWYgKHJldHZhbCAhPSA1KSB7Ci0JCQkJZXJyKCIlcyAtIGZhaWxlZCB0byByZXRyaWV2ZSBzZXJpYWwgbGluZSBzZXR0aW5ncyAtICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJaWYgKHJldHZhbCAhPSBzaXplb2YoZmVhdHVyZV9idWZmZXIpKSB7CisJCQkJZXJyKCIlcyAtIGZhaWxlZCB0byByZXRyaWV2ZSBzZXJpYWwgbGluZSBzZXR0aW5ncyAtICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJCQkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfSBlbHNlIHsKQEAgLTQxNSw5ICs0MzQsNiBAQAogCQkJCS8qIHN0b3JlIHRoZSBjb25maWcgaW4gb25lIGJ5dGUsIGFuZCBsYXRlciB1c2UgYml0IG1hc2tzIHRvIGNoZWNrIHZhbHVlcyAqLwogCQkJCXByaXYtPmN1cnJlbnRfY29uZmlnID0gZmVhdHVyZV9idWZmZXJbNF07CiAJCQkJcHJpdi0+YmF1ZF9yYXRlID0gKigodV9pbnQzMl90ICopZmVhdHVyZV9idWZmZXIpOwotCQkJCQotCQkJCWlmICggKHByaXYtPmNicl9tYXNrID0gcmF0ZV90b19tYXNrKHByaXYtPmJhdWRfcmF0ZSkpID09IDB4NDApCi0JCQkJCWRiZygiJXMgLSBmYWlsZWQgc2V0dGluZyB0aGUgYmF1ZCBtYXNrIChub3QgZGVmaW5lZCkiLCBfX0ZVTkNUSU9OX18pOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCX0KIAl9CkBAIC00NDcsNTEgKzQ2Myw2IEBACiB9CiAKIAotLyogZ2l2ZW4gYSBiYXVkIG1hc2ssIGl0IHdpbGwgcmV0dXJuIGludGVnZXIgYmF1ZCBvbiBzdWNjZXNzICovCi1zdGF0aWMgaW50IG1hc2tfdG9fcmF0ZSAodW5zaWduZWQgbWFzaykKLXsKLQlpbnQgcmF0ZTsKLQotCXN3aXRjaCAobWFzaykgewotCQljYXNlIEIwOiByYXRlID0gMDsgYnJlYWs7Ci0JCWNhc2UgQjMwMDogcmF0ZSA9IDMwMDsgYnJlYWs7Ci0JCWNhc2UgQjYwMDogcmF0ZSA9IDYwMDsgYnJlYWs7Ci0JCWNhc2UgQjEyMDA6IHJhdGUgPSAxMjAwOyBicmVhazsKLQkJY2FzZSBCMjQwMDogcmF0ZSA9IDI0MDA7IGJyZWFrOwotCQljYXNlIEI0ODAwOiByYXRlID0gNDgwMDsgYnJlYWs7Ci0JCWNhc2UgQjk2MDA6IHJhdGUgPSA5NjAwOyBicmVhazsKLQkJY2FzZSBCMTkyMDA6IHJhdGUgPSAxOTIwMDsgYnJlYWs7Ci0JCWNhc2UgQjM4NDAwOiByYXRlID0gMzg0MDA7IGJyZWFrOwotCQljYXNlIEI1NzYwMDogcmF0ZSA9IDU3NjAwOyBicmVhazsKLQkJY2FzZSBCMTE1MjAwOiByYXRlID0gMTE1MjAwOyBicmVhazsKLQkJZGVmYXVsdDogcmF0ZSA9IC0xOwotCX0KLQotCXJldHVybiByYXRlOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCByYXRlX3RvX21hc2sgKGludCByYXRlKQotewotCXVuc2lnbmVkIG1hc2s7Ci0KLQlzd2l0Y2ggKHJhdGUpIHsKLQkJY2FzZSAwOiBtYXNrID0gQjA7IGJyZWFrOwotCQljYXNlIDMwMDogbWFzayA9IEIzMDA7IGJyZWFrOwotCQljYXNlIDYwMDogbWFzayA9IEI2MDA7IGJyZWFrOwotCQljYXNlIDEyMDA6IG1hc2sgPSBCMTIwMDsgYnJlYWs7Ci0JCWNhc2UgMjQwMDogbWFzayA9IEIyNDAwOyBicmVhazsKLQkJY2FzZSA0ODAwOiBtYXNrID0gQjQ4MDA7IGJyZWFrOwotCQljYXNlIDk2MDA6IG1hc2sgPSBCOTYwMDsgYnJlYWs7Ci0JCWNhc2UgMTkyMDA6IG1hc2sgPSBCMTkyMDA7IGJyZWFrOwotCQljYXNlIDM4NDAwOiBtYXNrID0gQjM4NDAwOyBicmVhazsKLQkJY2FzZSA1NzYwMDogbWFzayA9IEI1NzYwMDsgYnJlYWs7Ci0JCWNhc2UgMTE1MjAwOiBtYXNrID0gQjExNTIwMDsgYnJlYWs7Ci0JCWRlZmF1bHQ6IG1hc2sgPSAweDQwOwotCX0KLQotCXJldHVybiBtYXNrOwotfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDeXByZXNzIHNlcmlhbCBkcml2ZXIgZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MDIsNyArNDczLDcgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2OwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY3lwcmVzc19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQpAQCAtNTIzLDE3ICs0OTQsMjcgQEAKIAlwcml2LT5saW5lX2NvbnRyb2wgPSAwOwogCXByaXYtPnRlcm1pb3NfaW5pdGlhbGl6ZWQgPSAwOwogCXByaXYtPnJ4X2ZsYWdzID0gMDsKLQlwcml2LT5jYnJfbWFzayA9IEIzMDA7CisJLyogRGVmYXVsdCBwYWNrZXQgZm9ybWF0IHNldHRpbmcgaXMgZGV0ZXJtaW5lZCBieSBwYWNrZXQgc2l6ZS4KKwkgICBBbnl0aGluZyB3aXRoIGEgc2l6ZSBsYXJnZXIgdGhlbiA5IG11c3QgaGF2ZSBhIHNlcGFyYXRlCisJICAgY291bnQgZmllbGQgc2luY2UgdGhlIDMgYml0IGNvdW50IGZpZWxkIGlzIG90aGVyd2lzZSB0b28KKwkgICBzbWFsbC4gIE90aGVyd2lzZSB3ZSBjYW4gdXNlIHRoZSBzbGlnaHRseSBtb3JlIGNvbXBhY3QKKwkgICBmb3JtYXQuICBUaGlzIGlzIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY3lwcmVzc19tOCBzZXJpYWwKKwkgICBjb252ZXJ0ZXIgYXBwIG5vdGUuICovCisJaWYgKHBvcnQtPmludGVycnVwdF9vdXRfc2l6ZSA+IDkpIHsKKwkJcHJpdi0+cGt0X2ZtdCA9IHBhY2tldF9mb3JtYXRfMTsKKwl9IGVsc2UgeworCQlwcml2LT5wa3RfZm10ID0gcGFja2V0X2Zvcm1hdF8yOworCX0KIAlpZiAoaW50ZXJ2YWwgPiAwKSB7CiAJCXByaXYtPndyaXRlX3VyYl9pbnRlcnZhbCA9IGludGVydmFsOwogCQlwcml2LT5yZWFkX3VyYl9pbnRlcnZhbCA9IGludGVydmFsOwogCQlkYmcoIiVzIC0gcG9ydCAlZCByZWFkICYgd3JpdGUgaW50ZXJ2YWxzIGZvcmNlZCB0byAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18scG9ydC0+bnVtYmVyLGludGVydmFsKTsKKwkJICAgIF9fZnVuY19fLHBvcnQtPm51bWJlcixpbnRlcnZhbCk7CiAJfSBlbHNlIHsKIAkJcHJpdi0+d3JpdGVfdXJiX2ludGVydmFsID0gcG9ydC0+aW50ZXJydXB0X291dF91cmItPmludGVydmFsOwogCQlwcml2LT5yZWFkX3VyYl9pbnRlcnZhbCA9IHBvcnQtPmludGVycnVwdF9pbl91cmItPmludGVydmFsOwogCQlkYmcoIiVzIC0gcG9ydCAlZCBpbnRlcnZhbHM6IHJlYWQ9JWQgd3JpdGU9JWQiLAotCQkgICAgX19GVU5DVElPTl9fLHBvcnQtPm51bWJlciwKKwkJICAgIF9fZnVuY19fLHBvcnQtPm51bWJlciwKIAkJICAgIHByaXYtPnJlYWRfdXJiX2ludGVydmFsLHByaXYtPndyaXRlX3VyYl9pbnRlcnZhbCk7CiAJfQogCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwcml2KTsKQEAgLTU0NSwxNyArNTI2LDMwIEBACiBzdGF0aWMgaW50IGN5cHJlc3NfZWFydGhtYXRlX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChnZW5lcmljX3N0YXJ0dXAoc2VyaWFsKSkgewotCQlkYmcoIiVzIC0gRmFpbGVkIHNldHRpbmcgdXAgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywKLQkJCQlzZXJpYWwtPnBvcnRbMF0tPm51bWJlcik7CisJCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19mdW5jX18sCisJCQkJcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOworCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJcHJpdi0+Y2hpcHR5cGUgPSBDVF9FQVJUSE1BVEU7CisJLyogQWxsIEVhcnRobWF0ZSBkZXZpY2VzIHVzZSB0aGUgc2VwYXJhdGVkLWNvdW50IHBhY2tldAorCSAgIGZvcm1hdCEgIElkaW90aWMuICovCisJcHJpdi0+cGt0X2ZtdCA9IHBhY2tldF9mb3JtYXRfMTsKKwlpZiAoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICE9IFBST0RVQ1RfSURfRUFSVEhNQVRFVVNCKSB7CisJCS8qIFRoZSBvbGQgb3JpZ2luYWwgVVNCIEVhcnRobWF0ZSBzZWVtZWQgYWJsZSB0bworCQkgICBoYW5kbGUgR0VUX0NPTkZJRyByZXF1ZXN0czsgZXZlcnl0aGluZyB0aGV5J3ZlCisJCSAgIHByb2R1Y2VkIHNpbmNlIHRoYXQgdGltZSBjcmFzaGVzIGlmIHRoaXMgY29tbWFuZCBpcworCQkgICBhdHRlbXB0ZWQgOi0oICovCisJCWRiZygiJXMgLSBNYXJraW5nIHRoaXMgZGV2aWNlIGFzIHVuc2FmZSBmb3IgR0VUX0NPTkZJRyAiCisJCSAgICAiY29tbWFuZHMiLCBfX2Z1bmNfXyk7CisJCXByaXYtPmdldF9jZmdfdW5zYWZlID0gITA7CisJfQogCiAJcmV0dXJuIDA7CiB9IC8qIGN5cHJlc3NfZWFydGhtYXRlX3N0YXJ0dXAgKi8KQEAgLTU2NSwxMCArNTU5LDEwIEBACiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdjsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZ2VuZXJpY19zdGFydHVwKHNlcmlhbCkpIHsKLQkJZGJnKCIlcyAtIEZhaWxlZCBzZXR0aW5nIHVwIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19mdW5jX18sCiAJCQkJc2VyaWFsLT5wb3J0WzBdLT5udW1iZXIpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC01ODQsMTAgKzU3OCwxMCBAQAogewogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXY7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJaWYgKGdlbmVyaWNfc3RhcnR1cChzZXJpYWwpKSB7Ci0JCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gRmFpbGVkIHNldHRpbmcgdXAgcG9ydCAlZCIsIF9fZnVuY19fLAogCQkJCXNlcmlhbC0+cG9ydFswXS0+bnVtYmVyKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtNjAzLDcgKzU5Nyw3IEBACiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdjsKIAotCWRiZyAoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgc2VyaWFsLT5wb3J0WzBdLT5udW1iZXIpOworCWRiZyAoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBzZXJpYWwtPnBvcnRbMF0tPm51bWJlcik7CiAKIAkvKiBhbGwgb3BlbiBwb3J0cyBhcmUgY2xvc2VkIGF0IHRoaXMgcG9pbnQgKi8KIApAQCAtNjI0LDcgKzYxOCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXByaXYtPmNvbW1faXNfb2spCiAJCXJldHVybiAtRUlPOwpAQCAtNjUyLDE2ICs2NDYsMTYgQEAKIAlyZXN1bHQgPSBjeXByZXNzX3dyaXRlKHBvcnQsIE5VTEwsIDApOwogCiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzZXR0aW5nIHRoZSBjb250cm9sIGxpbmVzIC0gZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc2V0dGluZyB0aGUgY29udHJvbCBsaW5lcyAtIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9IGVsc2UKLQkJZGJnKCIlcyAtIHN1Y2Nlc3Mgc2V0dGluZyB0aGUgY29udHJvbCBsaW5lcyIsIF9fRlVOQ1RJT05fXyk7CQorCQlkYmcoIiVzIC0gc3VjY2VzcyBzZXR0aW5nIHRoZSBjb250cm9sIGxpbmVzIiwgX19mdW5jX18pOwogCiAJY3lwcmVzc19zZXRfdGVybWlvcyhwb3J0LCAmcHJpdi0+dG1wX3Rlcm1pb3MpOwogCiAJLyogc2V0dXAgdGhlIHBvcnQgYW5kIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlICovCiAJaWYoIXBvcnQtPmludGVycnVwdF9pbl91cmIpewotCQllcnIoIiVzIC0gaW50ZXJydXB0X2luX3VyYiBpcyBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gaW50ZXJydXB0X2luX3VyYiBpcyBlbXB0eSEiLCBfX2Z1bmNfXyk7CiAJCXJldHVybigtMSk7CiAJfQogCkBAIC02NzIsNyArNjY2LDcgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKIAogCWlmIChyZXN1bHQpewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7CiAJfQogCkBAIC02ODgsNyArNjgyLDcgQEAKIAlsb25nIHRpbWVvdXQ7CiAJd2FpdF9xdWV1ZV90IHdhaXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogd2FpdCBmb3IgZGF0YSB0byBkcmFpbiBmcm9tIGJ1ZmZlciAqLwogCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwpAQCAtNzI2LDcgKzcyMCw3IEBACiAJCXRpbWVvdXQgPSAyKkhaOwogCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKIAotCWRiZygiJXMgLSBzdG9wcGluZyB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc3RvcHBpbmcgdXJicyIsIF9fZnVuY19fKTsKIAl1c2Jfa2lsbF91cmIgKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwogCXVzYl9raWxsX3VyYiAocG9ydC0+aW50ZXJydXB0X291dF91cmIpOwogCkBAIC03NTUsNyArNzQ5LDcgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCi0JZGJnKCIlcyAtIHBvcnQgJWQsICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZXMiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CiAKIAkvKiBsaW5lIGNvbnRyb2wgY29tbWFuZHMsIHdoaWNoIG5lZWQgdG8gYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHksCiAJICAgYXJlIG5vdCBwdXQgaW50byB0aGUgYnVmZmVyIGZvciBvYnZpb3VzIHJlYXNvbnMuCkBAIC03ODgsMTIgKzc4MiwxMiBAQAogCWlmICghcHJpdi0+Y29tbV9pc19vaykKIAkJcmV0dXJuOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7Ci0JZGJnKCIlcyAtIGludGVycnVwdCBvdXQgc2l6ZSBpcyAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+aW50ZXJydXB0X291dF9zaXplKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBpbnRlcnJ1cHQgb3V0IHNpemUgaXMgJWQiLCBfX2Z1bmNfXywgcG9ydC0+aW50ZXJydXB0X291dF9zaXplKTsKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT53cml0ZV91cmJfaW5fdXNlKSB7Ci0JCWRiZygiJXMgLSBjYW4ndCB3cml0ZSwgdXJiIGluIHVzZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBjYW4ndCB3cml0ZSwgdXJiIGluIHVzZSIsIF9fZnVuY19fKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtODAzLDIxICs3OTcsMTggQEAKIAltZW1zZXQocG9ydC0+aW50ZXJydXB0X291dF91cmItPnRyYW5zZmVyX2J1ZmZlciwgMCwgcG9ydC0+aW50ZXJydXB0X291dF9zaXplKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0Jc3dpdGNoIChwb3J0LT5pbnRlcnJ1cHRfb3V0X3NpemUpIHsKLQkJY2FzZSAzMjoKLQkJCS8qIHRoaXMgaXMgZm9yIHRoZSBDWTdDNjQwMTMuLi4gKi8KLQkJCW9mZnNldCA9IDI7Ci0JCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlclswXSA9IHByaXYtPmxpbmVfY29udHJvbDsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCQkvKiB0aGlzIGlzIGZvciB0aGUgQ1k3QzYzNzQzLi4uICovCi0JCQlvZmZzZXQgPSAxOwotCQkJcG9ydC0+aW50ZXJydXB0X291dF9idWZmZXJbMF0gPSBwcml2LT5saW5lX2NvbnRyb2w7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRiZygiJXMgLSB3cm9uZyBwYWNrZXQgc2l6ZSIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47CisJc3dpdGNoIChwcml2LT5wa3RfZm10KSB7CisJZGVmYXVsdDoKKwljYXNlIHBhY2tldF9mb3JtYXRfMToKKwkJLyogdGhpcyBpcyBmb3IgdGhlIENZN0M2NDAxMy4uLiAqLworCQlvZmZzZXQgPSAyOworCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlclswXSA9IHByaXYtPmxpbmVfY29udHJvbDsKKwkJYnJlYWs7CisJY2FzZSBwYWNrZXRfZm9ybWF0XzI6CisJCS8qIHRoaXMgaXMgZm9yIHRoZSBDWTdDNjM3NDMuLi4gKi8KKwkJb2Zmc2V0ID0gMTsKKwkJcG9ydC0+aW50ZXJydXB0X291dF9idWZmZXJbMF0gPSBwcml2LT5saW5lX2NvbnRyb2w7CisJCWJyZWFrOwogCX0KIAogCWlmIChwcml2LT5saW5lX2NvbnRyb2wgJiBDT05UUk9MX1JFU0VUKQpAQCAtODI1LDcgKzgxNiw3IEBACiAKIAlpZiAocHJpdi0+Y21kX2N0cmwpIHsKIAkJcHJpdi0+Y21kX2NvdW50Kys7Ci0JCWRiZygiJXMgLSBsaW5lIGNvbnRyb2wgY29tbWFuZCBiZWluZyBpc3N1ZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gbGluZSBjb250cm9sIGNvbW1hbmQgYmVpbmcgaXNzdWVkIiwgX19mdW5jX18pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCWdvdG8gc2VuZDsKIAl9IGVsc2UKQEAgLTgzOCwxNSArODI5LDE2IEBACiAJCXJldHVybjsKIAl9CiAKLQlzd2l0Y2ggKHBvcnQtPmludGVycnVwdF9vdXRfc2l6ZSkgewotCQljYXNlIDMyOgotCQkJcG9ydC0+aW50ZXJydXB0X291dF9idWZmZXJbMV0gPSBjb3VudDsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlclswXSB8PSBjb3VudDsKKwlzd2l0Y2ggKHByaXYtPnBrdF9mbXQpIHsKKwlkZWZhdWx0OgorCWNhc2UgcGFja2V0X2Zvcm1hdF8xOgorCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlclsxXSA9IGNvdW50OworCQlicmVhazsKKwljYXNlIHBhY2tldF9mb3JtYXRfMjoKKwkJcG9ydC0+aW50ZXJydXB0X291dF9idWZmZXJbMF0gfD0gY291bnQ7CiAJfQogCi0JZGJnKCIlcyAtIGNvdW50IGlzICVkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKCIlcyAtIGNvdW50IGlzICVkIiwgX19mdW5jX18sIGNvdW50KTsKIAogc2VuZDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtODU2LDkgKzg0OCwxMCBAQAogCWlmIChwcml2LT5jbWRfY3RybCkKIAkJYWN0dWFsX3NpemUgPSAxOwogCWVsc2UKLQkJYWN0dWFsX3NpemUgPSBjb3VudCArIChwb3J0LT5pbnRlcnJ1cHRfb3V0X3NpemUgPT0gMzIgPyAyIDogMSk7Ci0JCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHBvcnQtPmludGVycnVwdF9vdXRfc2l6ZSwKKwkJYWN0dWFsX3NpemUgPSBjb3VudCArCisJCQkgICAgICAocHJpdi0+cGt0X2ZtdCA9PSBwYWNrZXRfZm9ybWF0XzEgPyAyIDogMSk7CisKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBwb3J0LT5pbnRlcnJ1cHRfb3V0X3NpemUsCiAJCQkgICAgICBwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCXVzYl9maWxsX2ludF91cmIocG9ydC0+aW50ZXJydXB0X291dF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtODY3LDcgKzg2MCw3IEBACiAJCWN5cHJlc3Nfd3JpdGVfaW50X2NhbGxiYWNrLCBwb3J0LCBwcml2LT53cml0ZV91cmJfaW50ZXJ2YWwpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiIChwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywKIAkJCXJlc3VsdCk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOwpAQCAtODkxLDEzICs4ODQsMTMgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXJvb20gPSBjeXByZXNzX2J1Zl9zcGFjZV9hdmFpbChwcml2LT5idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIH0KIApAQCAtOTA5LDcgKzkwMiw3IEBACiAJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAljb250cm9sID0gcHJpdi0+bGluZV9jb250cm9sOwpAQCAtOTIzLDcgKzkxNiw3IEBACiAJCXwgKChzdGF0dXMgJiBVQVJUX1JJKSAgICAgICAgID8gVElPQ01fUkkgIDogMCkKIAkJfCAoKHN0YXR1cyAmIFVBUlRfQ0QpICAgICAgICAgPyBUSU9DTV9DRCAgOiAwKTsKIAotCWRiZygiJXMgLSByZXN1bHQgPSAleCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwlkYmcoIiVzIC0gcmVzdWx0ID0gJXgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC05MzUsNyArOTI4LDcgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKHNldCAmIFRJT0NNX1JUUykKQEAgLTk0Niw5ICs5MzksOSBAQAogCQlwcml2LT5saW5lX2NvbnRyb2wgJj0gfkNPTlRST0xfUlRTOwogCWlmIChjbGVhciAmIFRJT0NNX0RUUikKIAkJcHJpdi0+bGluZV9jb250cm9sICY9IH5DT05UUk9MX0RUUjsKKwlwcml2LT5jbWRfY3RybCA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JcHJpdi0+Y21kX2N0cmwgPSAxOwogCXJldHVybiBjeXByZXNzX3dyaXRlKHBvcnQsIE5VTEwsIDApOwogfQogCkBAIC05NTcsMjMgKzk1MCw5IEBACiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgMHglLjR4IiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNtZCk7CisJZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCAweCUuNHgiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUSU9DR1NFUklBTDoKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwb3J0LT50dHktPnRlcm1pb3MsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKSkgewotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJcmV0dXJuICgwKTsKLQkJCWJyZWFrOwotCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBvcnQtPnR0eS0+dGVybWlvcywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSkpIHsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCS8qIGhlcmUgd2UgbmVlZCB0byBjYWxsIGN5cHJlc3Nfc2V0X3Rlcm1pb3MgdG8gaW52b2tlIHRoZSBuZXcgc2V0dGluZ3MgKi8KLQkJCWN5cHJlc3Nfc2V0X3Rlcm1pb3MocG9ydCwgJnByaXYtPnRtcF90ZXJtaW9zKTsKLQkJCXJldHVybiAoMCk7Ci0JCQlicmVhazsKIAkJLyogVGhpcyBjb2RlIGNvbWVzIGZyb20gZHJpdmVycy9jaGFyL3NlcmlhbC5jIGFuZCBmdGRpX3Npby5jICovCiAJCWNhc2UgVElPQ01JV0FJVDoKIAkJCXdoaWxlIChwcml2ICE9IE5VTEwpIHsKQEAgLTEwMDksNyArOTg4LDcgQEAKIAkJCWJyZWFrOwogCX0KIAotCWRiZygiJXMgLSBhcmcgbm90IHN1cHBvcnRlZCAtIGl0IHdhcyAweCUwNHggLSBjaGVjayBpbmNsdWRlL2FzbS9pb2N0bHMuaCIsIF9fRlVOQ1RJT05fXywgY21kKTsKKwlkYmcoIiVzIC0gYXJnIG5vdCBzdXBwb3J0ZWQgLSBpdCB3YXMgMHglMDR4IC0gY2hlY2sgaW5jbHVkZS9hc20vaW9jdGxzLmgiLCBfX2Z1bmNfXywgY21kKTsKIAogCXJldHVybiAtRU5PSU9DVExDTUQ7CiB9IC8qIGN5cHJlc3NfaW9jdGwgKi8KQEAgLTEwMjEsMTggKzEwMDAsMTQgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IGRhdGFfYml0cywgc3RvcF9iaXRzLCBwYXJpdHlfdHlwZSwgcGFyaXR5X2VuYWJsZTsKLQl1bnNpZ25lZCBjZmxhZywgaWZsYWcsIGJhdWRfbWFzazsKKwl1bnNpZ25lZCBjZmxhZywgaWZsYWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlfX3U4IG9sZGxpbmVzOwogCWludCBsaW5lY2hhbmdlID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAl0dHkgPSBwb3J0LT50dHk7Ci0JaWYgKCghdHR5KSB8fCAoIXR0eS0+dGVybWlvcykpIHsKLQkJZGJnKCIlcyAtIG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwotCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKCFwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkKSB7CkBAIC0xMDQwLDQwICsxMDE1LDM3IEBACiAJCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCNDgwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfAogCQkJCUNMT0NBTDsKKwkJCXR0eS0+dGVybWlvcy0+Y19pc3BlZWQgPSA0ODAwOworCQkJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IDQ4MDA7CiAJCX0gZWxzZSBpZiAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfQ1lQSElEQ09NKSB7CiAJCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfAogCQkJCUNMT0NBTDsKKwkJCXR0eS0+dGVybWlvcy0+Y19pc3BlZWQgPSA5NjAwOworCQkJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IDk2MDA7CiAJCX0gZWxzZSBpZiAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfQ0E0MlYyKSB7CiAJCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfAogCQkJCUNMT0NBTDsKKwkJCXR0eS0+dGVybWlvcy0+Y19pc3BlZWQgPSA5NjAwOworCQkJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IDk2MDA7CiAJCX0KIAkJcHJpdi0+dGVybWlvc19pbml0aWFsaXplZCA9IDE7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAorCS8qIFVuc3VwcG9ydGVkIGZlYXR1cmVzIG5lZWQgY2xlYXJpbmcgKi8KKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfihDTVNQQVJ8Q1JUU0NUUyk7CisKIAljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAlpZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19pZmxhZzsKIAogCS8qIGNoZWNrIGlmIHRoZXJlIGFyZSBuZXcgc2V0dGluZ3MgKi8KIAlpZiAob2xkX3Rlcm1pb3MpIHsKLQkJaWYgKChjZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19jZmxhZykgfHwKLQkJCShSRUxFVkFOVF9JRkxBRyhpZmxhZykgIT0KLQkJCSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7Ci0JCQlkYmcoIiVzIC0gYXR0ZW1wdGluZyB0byBzZXQgbmV3IHRlcm1pb3Mgc2V0dGluZ3MiLAotCQkJCQlfX0ZVTkNUSU9OX18pOwotCQkJLyogc2hvdWxkIG1ha2UgYSBjb3B5IG9mIHRoaXMgaW4gY2FzZSBzb21ldGhpbmcgZ29lcwotCQkJICogd3JvbmcgaW4gdGhlIGZ1bmN0aW9uLCB3ZSBjYW4gcmVzdG9yZSBpdCAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXByaXYtPnRtcF90ZXJtaW9zID0gKih0dHktPnRlcm1pb3MpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJZGJnKCIlcyAtIG5vdGhpbmcgdG8gZG8sIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlCi0JCXJldHVybjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJcHJpdi0+dG1wX3Rlcm1pb3MgPSAqKHR0eS0+dGVybWlvcyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl9CiAKIAkvKiBzZXQgbnVtYmVyIG9mIGRhdGEgYml0cywgcGFyaXR5LCBzdG9wIGJpdHMgKi8KIAkvKiB3aGVuIHBhcml0eSBpcyBkaXNhYmxlZCB0aGUgcGFyaXR5IHR5cGUgYml0IGlzIGlnbm9yZWQgKi8KQEAgLTExMDQsNyArMTA3Niw3IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCWVycigiJXMgLSBDU0laRSB3YXMgc2V0LCBidXQgbm90IENTNS1DUzgiLAotCQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQkJCV9fZnVuY19fKTsKIAkJCQlkYXRhX2JpdHMgPSAzOwogCQl9CiAJfSBlbHNlCkBAIC0xMTE0LDU0ICsxMDg2LDE3IEBACiAJb2xkbGluZXMgPSBwcml2LT5saW5lX2NvbnRyb2w7CiAJaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCkgewogCQkvKiBkcm9wIGR0ciBhbmQgcnRzICovCi0JCWRiZygiJXMgLSBkcm9wcGluZyB0aGUgbGluZXMsIGJhdWQgcmF0ZSAwYnBzIiwgX19GVU5DVElPTl9fKTsKLQkJYmF1ZF9tYXNrID0gQjA7CisJCWRiZygiJXMgLSBkcm9wcGluZyB0aGUgbGluZXMsIGJhdWQgcmF0ZSAwYnBzIiwgX19mdW5jX18pOwogCQlwcml2LT5saW5lX2NvbnRyb2wgJj0gfihDT05UUk9MX0RUUiB8IENPTlRST0xfUlRTKTsKLQl9IGVsc2UgewotCQliYXVkX21hc2sgPSAoY2ZsYWcgJiBDQkFVRCk7Ci0JCXN3aXRjaChiYXVkX21hc2spIHsKLQkJCWNhc2UgQjMwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDMwMGJwcyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEI2MDA6Ci0JCQkJZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCA2MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMTIwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDEyMDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMjQwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDI0MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCNDgwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDQ4MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCOTYwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDk2MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMTkyMDA6Ci0JCQkJZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCAxOTIwMGJwcyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEIzODQwMDoKLQkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDM4NDAwYnBzIiwgX19GVU5DVElPTl9fKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQjU3NjAwOgotCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgNTc2MDBicHMiLCBfX0ZVTkNUSU9OX18pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMTE1MjAwOgotCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMTE1MjAwYnBzIiwgX19GVU5DVElPTl9fKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZGJnKCIlcyAtIHVua25vd24gbWFza2VkIGJhdWQgcmF0ZSIsIF9fRlVOQ1RJT05fXyk7Ci0JCX0KKwl9IGVsc2UKIAkJcHJpdi0+bGluZV9jb250cm9sID0gKENPTlRST0xfRFRSIHwgQ09OVFJPTF9SVFMpOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAlkYmcoIiVzIC0gc2VuZGluZyAlZCBzdG9wX2JpdHMsICVkIHBhcml0eV9lbmFibGUsICVkIHBhcml0eV90eXBlLCAiCi0JCQkiJWQgZGF0YV9iaXRzICgrNSkiLCBfX0ZVTkNUSU9OX18sIHN0b3BfYml0cywKKwkJCSIlZCBkYXRhX2JpdHMgKCs1KSIsIF9fZnVuY19fLCBzdG9wX2JpdHMsCiAJCQlwYXJpdHlfZW5hYmxlLCBwYXJpdHlfdHlwZSwgZGF0YV9iaXRzKTsKIAotCWN5cHJlc3Nfc2VyaWFsX2NvbnRyb2wocG9ydCwgYmF1ZF9tYXNrLCBkYXRhX2JpdHMsIHN0b3BfYml0cywKKwljeXByZXNzX3NlcmlhbF9jb250cm9sKHBvcnQsIHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSksIGRhdGFfYml0cywgc3RvcF9iaXRzLAogCQkJcGFyaXR5X2VuYWJsZSwgcGFyaXR5X3R5cGUsIDAsIENZUFJFU1NfU0VUX0NPTkZJRyk7CiAKIAkvKiB3ZSBwZXJmb3JtIGEgQ1lQUkVTU19HRVRfQ09ORklHIHNvIHRoYXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYXJlCkBAIC0xMjE5LDEzICsxMTU0LDEzIEBACiAJaW50IGNoYXJzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWNoYXJzID0gY3lwcmVzc19idWZfZGF0YV9hdmFpbChwcml2LT5idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiBjaGFyczsKIH0KIApAQCAtMTIzNSw3ICsxMTcwLDcgQEAKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyA9IFRIUk9UVExFRDsKQEAgLTEyNDksNyArMTE4NCw3IEBACiAJaW50IGFjdHVhbGx5X3Rocm90dGxlZCwgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlhY3R1YWxseV90aHJvdHRsZWQgPSBwcml2LT5yeF9mbGFncyAmIEFDVFVBTExZX1RIUk9UVExFRDsKQEAgLTEyNjUsNyArMTIwMCw3IEBACiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCAiCi0JCQkJCSJlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCQkiZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJfQogCX0KQEAgLTEyNzQsNyArMTIwOSw3IEBACiAKIHN0YXRpYyB2b2lkIGN5cHJlc3NfcmVhZF9pbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0xMjg2LDcgKzEyMjEsNyBAQAogCWludCBpID0gMDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6IC8qIHN1Y2Nlc3MgKi8KQEAgLTEzMDIsMTQgKzEyMzcsMTQgQEAKIAlkZWZhdWx0OgogCQkvKiBzb21ldGhpbmcgdWdseSBpcyBnb2luZyBvbi4uLiAqLwogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCIlcyAtIHVuZXhwZWN0ZWQgbm9uemVybyByZWFkIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJcmV0dXJuOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPnJ4X2ZsYWdzICYgVEhST1RUTEVEKSB7Ci0JCWRiZygiJXMgLSBub3cgdGhyb3R0bGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBub3cgdGhyb3R0bGluZyIsIF9fZnVuY19fKTsKIAkJcHJpdi0+cnhfZmxhZ3MgfD0gQUNUVUFMTFlfVEhST1RUTEVEOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKQEAgLTEzMTgsNDggKzEyNTMsNDggQEAKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgdHR5IHBvaW50ZXIgLSBleGl0aW5nIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlzd2l0Y2godXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCWNhc2UgMzI6Ci0JCQkvKiBUaGlzIGlzIGZvciB0aGUgQ1k3QzY0MDEzLi4uICovCi0JCQlwcml2LT5jdXJyZW50X3N0YXR1cyA9IGRhdGFbMF0gJiAweEY4OwotCQkJYnl0ZXMgPSBkYXRhWzFdICsgMjsKLQkJCWkgPSAyOwotCQkJaWYgKGJ5dGVzID4gMikKLQkJCQloYXZlZGF0YSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSA4OgotCQkJLyogVGhpcyBpcyBmb3IgdGhlIENZN0M2Mzc0My4uLiAqLwotCQkJcHJpdi0+Y3VycmVudF9zdGF0dXMgPSBkYXRhWzBdICYgMHhGODsKLQkJCWJ5dGVzID0gKGRhdGFbMF0gJiAweDA3KSArIDE7Ci0JCQlpID0gMTsKLQkJCWlmIChieXRlcyA+IDEpCi0JCQkJaGF2ZWRhdGEgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkYmcoIiVzIC0gd3JvbmcgcGFja2V0IHNpemUgLSByZWNlaXZlZCAlZCBieXRlcyIsCi0JCQkJCV9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCWdvdG8gY29udGludWVfcmVhZDsKKwlyZXN1bHQgPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJc3dpdGNoIChwcml2LT5wa3RfZm10KSB7CisJZGVmYXVsdDoKKwljYXNlIHBhY2tldF9mb3JtYXRfMToKKwkJLyogVGhpcyBpcyBmb3IgdGhlIENZN0M2NDAxMy4uLiAqLworCQlwcml2LT5jdXJyZW50X3N0YXR1cyA9IGRhdGFbMF0gJiAweEY4OworCQlieXRlcyA9IGRhdGFbMV0gKyAyOworCQlpID0gMjsKKwkJaWYgKGJ5dGVzID4gMikKKwkJCWhhdmVkYXRhID0gMTsKKwkJYnJlYWs7CisJY2FzZSBwYWNrZXRfZm9ybWF0XzI6CisJCS8qIFRoaXMgaXMgZm9yIHRoZSBDWTdDNjM3NDMuLi4gKi8KKwkJcHJpdi0+Y3VycmVudF9zdGF0dXMgPSBkYXRhWzBdICYgMHhGODsKKwkJYnl0ZXMgPSAoZGF0YVswXSAmIDB4MDcpICsgMTsKKwkJaSA9IDE7CisJCWlmIChieXRlcyA+IDEpCisJCQloYXZlZGF0YSA9IDE7CisJCWJyZWFrOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJaWYgKHJlc3VsdCA8IGJ5dGVzKSB7CisJCWRiZygiJXMgLSB3cm9uZyBwYWNrZXQgc2l6ZSAtIHJlY2VpdmVkICVkIGJ5dGVzIGJ1dCBwYWNrZXQgIgorCQkgICAgInNhaWQgJWQgYnl0ZXMiLCBfX2Z1bmNfXywgcmVzdWx0LCBieXRlcyk7CisJCWdvdG8gY29udGludWVfcmVhZDsKKwl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEgKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhIChkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sCiAJCQl1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkvKiBjaGVjayB0byBzZWUgaWYgc3RhdHVzIGhhcyBjaGFuZ2VkICovCi0JaWYgKHByaXYgIT0gTlVMTCkgewotCQlpZiAocHJpdi0+Y3VycmVudF9zdGF0dXMgIT0gcHJpdi0+cHJldl9zdGF0dXMpIHsKLQkJCXByaXYtPmRpZmZfc3RhdHVzIHw9IHByaXYtPmN1cnJlbnRfc3RhdHVzIF4KLQkJCQlwcml2LT5wcmV2X3N0YXR1czsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwotCQkJcHJpdi0+cHJldl9zdGF0dXMgPSBwcml2LT5jdXJyZW50X3N0YXR1czsKLQkJfQorCWlmIChwcml2LT5jdXJyZW50X3N0YXR1cyAhPSBwcml2LT5wcmV2X3N0YXR1cykgeworCQlwcml2LT5kaWZmX3N0YXR1cyB8PSBwcml2LT5jdXJyZW50X3N0YXR1cyBeCisJCQlwcml2LT5wcmV2X3N0YXR1czsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CisJCXByaXYtPnByZXZfc3RhdHVzID0gcHJpdi0+Y3VycmVudF9zdGF0dXM7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIApAQCAtMTM2Nyw3ICsxMzAyLDcgQEAKIAkgKiB0aG91Z2ggKi8KIAlpZiAodHR5ICYmICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgogCQkJIShwcml2LT5jdXJyZW50X3N0YXR1cyAmIFVBUlRfQ0QpKSB7Ci0JCWRiZygiJXMgLSBjYWxsaW5nIGhhbmd1cCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBjYWxsaW5nIGhhbmd1cCIsIF9fZnVuY19fKTsKIAkJdHR5X2hhbmd1cCh0dHkpOwogCQlnb3RvIGNvbnRpbnVlX3JlYWQ7CiAJfQpAQCAtMTM4MCw3ICsxMzE1LDcgQEAKIAlpZiAocHJpdi0+Y3VycmVudF9zdGF0dXMgJiBDWVBfRVJST1IpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQl0dHlfZmxhZyA9IFRUWV9QQVJJVFk7Ci0JCWRiZygiJXMgLSBQYXJpdHkgRXJyb3IgZGV0ZWN0ZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gUGFyaXR5IEVycm9yIGRldGVjdGVkIiwgX19mdW5jX18pOwogCX0gZWxzZQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTE0MTQsNyArMTM0OSw3IEBACiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7CiAJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nICIKLQkJCQkJInJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCQkicmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywKIAkJCQkJcmVzdWx0KTsKIAkJCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7CiAJCX0KQEAgLTE0MjYsMTIgKzEzNjEsMTIgQEAKIAogc3RhdGljIHZvaWQgY3lwcmVzc193cml0ZV9pbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHJlc3VsdDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSAwOgpAQCAtMTQ0Miw3ICsxMzc3LDcgQEAKIAkJY2FzZSAtRVNIVVRET1dOOgogCQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQkJcmV0dXJuOwogCQljYXNlIC1FUElQRTogLyogbm8gYnJlYWsgbmVlZGVkOyBjbGVhciBoYWx0IGFuZCByZXN1Ym1pdCAqLwpAQCAtMTQ1MSwxOSArMTM4NiwxOSBAQAogCQkJdXNiX2NsZWFyX2hhbHQocG9ydC0+c2VyaWFsLT5kZXYsIDB4MDIpOwogCQkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwogCQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAJCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoIXJlc3VsdCkKIAkJCQlyZXR1cm47CiAJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCQkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwiJXMgLSB1bmV4cGVjdGVkIG5vbnplcm8gd3JpdGUgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOwogCQkJYnJlYWs7CiAJfQpAQCAtMTY2OCw3ICsxNjAzLDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAJCiAJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmY3lwcmVzc19lYXJ0aG1hdGVfZGV2aWNlKTsKIAlpZiAocmV0dmFsKQpAQCAtMTY5OSw3ICsxNjM0LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGN5cHJlc3NfZXhpdCAodm9pZCkKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJdXNiX2RlcmVnaXN0ZXIgKCZjeXByZXNzX2RyaXZlcik7CiAJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmY3lwcmVzc19lYXJ0aG1hdGVfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwppbmRleCA1ZjljNmU0Li5kMTdkMTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCkBAIC01MDgsOSArNTA4LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJCSJEaWdpIDIgcG9ydCBVU0IgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIgPSAJCQkmZGlnaV9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCQlpZF90YWJsZV8yLAotCS5udW1faW50ZXJydXB0X2luID0JCTAsCi0JLm51bV9idWxrX2luID0JCQk0LAotCS5udW1fYnVsa19vdXQgPQkJCTQsCiAJLm51bV9wb3J0cyA9CQkJMywKIAkub3BlbiA9CQkJCWRpZ2lfb3BlbiwKIAkuY2xvc2UgPQkJCWRpZ2lfY2xvc2UsCkBAIC01MzgsOSArNTM1LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJCSJEaWdpIDQgcG9ydCBVU0IgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIgPSAJCQkmZGlnaV9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCQlpZF90YWJsZV80LAotCS5udW1faW50ZXJydXB0X2luID0JCTAsCi0JLm51bV9idWxrX2luID0JCQk1LAotCS5udW1fYnVsa19vdXQgPQkJCTUsCiAJLm51bV9wb3J0cyA9CQkJNCwKIAkub3BlbiA9CQkJCWRpZ2lfb3BlbiwKIAkuY2xvc2UgPQkJCWRpZ2lfY2xvc2UsCkBAIC02NjUsNyArNjU5LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCWlmIChyZXQpCi0JCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkIiwgX19GVU5DVElPTl9fLCByZXQpOworCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQsIHJldD0lZCIsIF9fZnVuY19fLCByZXQpOwogCXJldHVybiByZXQ7CiAKIH0KQEAgLTc0Niw3ICs3NDAsNyBAQAogCiAJaWYgKHJldCkKIAkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQsIHBvcnQ9JWQiLAotCQkJX19GVU5DVElPTl9fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKKwkJCV9fZnVuY19fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04MTAsNyArODA0LDcgQEAKIAlzcGluX3VubG9jaygmcG9ydF9wcml2LT5kcF9wb3J0X2xvY2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAlpZiAocmV0KQotCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQsIHJldD0lZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05MDMsNyArODk3LDcgQEAKIAogCWlmIChyZXQpCiAJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0LCBwcml2LT5kcF9wb3J0X251bSk7CisJCQlfX2Z1bmNfXywgcmV0LCBwcml2LT5kcF9wb3J0X251bSk7CiB9CiAKIApAQCAtMTExMyw3ICsxMTA3LDcgQEAKIAl1bnNpZ25lZCBpbnQgdmFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzOiBUT1A6IHBvcnQ9JWQiLCBfX0ZVTkNUSU9OX18sIHByaXYtPmRwX3BvcnRfbnVtKTsKKwlkYmcoIiVzOiBUT1A6IHBvcnQ9JWQiLCBfX2Z1bmNfXywgcHJpdi0+ZHBfcG9ydF9udW0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCXZhbCA9IHByaXYtPmRwX21vZGVtX3NpZ25hbHM7CkBAIC0xMTI5LDcgKzExMjMsNyBAQAogCXVuc2lnbmVkIGludCB2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXM6IFRPUDogcG9ydD0lZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+ZHBfcG9ydF9udW0pOworCWRiZygiJXM6IFRPUDogcG9ydD0lZCIsIF9fZnVuY19fLCBwcml2LT5kcF9wb3J0X251bSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJdmFsID0gKHByaXYtPmRwX21vZGVtX3NpZ25hbHMgJiB+Y2xlYXIpIHwgc2V0OwpAQCAtMTIyNCw3ICsxMjE4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAlpZiAocmV0IDwgMCkKIAkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQsIHBvcnQ9JWQiLAotCQkJX19GVU5DVElPTl9fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKKwkJCV9fZnVuY19fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKIAlkYmcoImRpZ2lfd3JpdGU6IHJldHVybmluZyAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIApAQCAtMTIzMyw3ICsxMjI3LDcgQEAKIHN0YXRpYyB2b2lkIGRpZ2lfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOwogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXY7CiAJc3RydWN0IGRpZ2lfc2VyaWFsICpzZXJpYWxfcHJpdjsKQEAgLTEyNDUsMTMgKzEyMzksMTMgQEAKIAkvKiBwb3J0IGFuZCBzZXJpYWwgc2FuaXR5IGNoZWNrICovCiAJaWYgKHBvcnQgPT0gTlVMTCB8fCAocHJpdj11c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCkpID09IE5VTEwpIHsKIAkJZXJyKCIlczogcG9ydCBvciBwb3J0LT5wcml2YXRlIGlzIE5VTEwsIHN0YXR1cz0lZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJaWYgKHNlcmlhbCA9PSBOVUxMIHx8IChzZXJpYWxfcHJpdj11c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCkpID09IE5VTEwpIHsKIAkJZXJyKCIlczogc2VyaWFsIG9yIHNlcmlhbC0+cHJpdmF0ZSBpcyBOVUxMLCBzdGF0dXM9JWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyOTIsNyArMTI4Niw3IEBACiAJc3Bpbl91bmxvY2soJnByaXYtPmRwX3BvcnRfbG9jayk7CiAJaWYgKHJldCkKIAkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQsIHBvcnQ9JWQiLAotCQkJX19GVU5DVElPTl9fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKKwkJCV9fZnVuY19fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKIH0KIAogc3RhdGljIGludCBkaWdpX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKQEAgLTE1MjEsNyArMTUxNSw3IEBACiAJCXBvcnQtPndyaXRlX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpKSAhPSAwKSB7CiAJCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQsIHJldD0lZCwgcG9ydD0lZCIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcmV0LCBpKTsKKwkJCQkJX19mdW5jX18sIHJldCwgaSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE2MTEsNyArMTYwNSw3IEBACiAKIHN0YXRpYyB2b2lkIGRpZ2lfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2OwogCXN0cnVjdCBkaWdpX3NlcmlhbCAqc2VyaWFsX3ByaXY7CiAJaW50IHJldDsKQEAgLTE2MjIsMjAgKzE2MTYsMjAgQEAKIAkvKiBwb3J0IHNhbml0eSBjaGVjaywgZG8gbm90IHJlc3VibWl0IGlmIHBvcnQgaXMgbm90IHZhbGlkICovCiAJaWYgKHBvcnQgPT0gTlVMTCB8fCAocHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSkgPT0gTlVMTCkgewogCQllcnIoIiVzOiBwb3J0IG9yIHBvcnQtPnByaXZhdGUgaXMgTlVMTCwgc3RhdHVzPSVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCWlmIChwb3J0LT5zZXJpYWwgPT0gTlVMTCB8fAogCQkoc2VyaWFsX3ByaXY9dXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpKSA9PSBOVUxMKSB7CiAJCWVycigiJXM6IHNlcmlhbCBpcyBiYWQgb3Igc2VyaWFsLT5wcml2YXRlIGlzIE5VTEwsIHN0YXR1cz0lZCIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGRvIG5vdCByZXN1Ym1pdCB1cmIgaWYgaXQgaGFzIGFueSBzdGF0dXMgZXJyb3IgKi8KIAlpZiAoc3RhdHVzKSB7CiAJCWVycigiJXM6IG5vbnplcm8gcmVhZCBidWxrIHN0YXR1czogc3RhdHVzPSVkLCBwb3J0PSVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzLCBwcml2LT5kcF9wb3J0X251bSk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzLCBwcml2LT5kcF9wb3J0X251bSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE2NTIsNyArMTY0Niw3IEBACiAJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKIAkJZXJyKCIlczogZmFpbGVkIHJlc3VibWl0dGluZyB1cmIsIHJldD0lZCwgcG9ydD0lZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHJldCwgcHJpdi0+ZHBfcG9ydF9udW0pOworCQkgICAgX19mdW5jX18sIHJldCwgcHJpdi0+ZHBfcG9ydF9udW0pOwogCX0KIAogfQpAQCAtMTY3MCw3ICsxNjY0LDcgQEAKIHN0YXRpYyBpbnQgZGlnaV9yZWFkX2luYl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dHR5OwogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IG9wY29kZSA9ICgodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyKVswXTsKQEAgLTE2OTAsNyArMTY4NCw3IEBACiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSBsZW4gKyAyKSB7CiAgICAgIAkJZXJyKCIlczogSU5DT01QTEVURSBPUiBNVUxUSVBMRSBQQUNLRVQsIHVyYi0+c3RhdHVzPSVkLCAiCiAJCSAgICAicG9ydD0lZCwgb3Bjb2RlPSVkLCBsZW49JWQsIGFjdHVhbF9sZW5ndGg9JWQsICIKLQkJICAgICJzdGF0dXM9JWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cywgcHJpdi0+ZHBfcG9ydF9udW0sCisJCSAgICAic3RhdHVzPSVkIiwgX19mdW5jX18sIHN0YXR1cywgcHJpdi0+ZHBfcG9ydF9udW0sCiAJCSAgICBvcGNvZGUsIGxlbiwgdXJiLT5hY3R1YWxfbGVuZ3RoLCBwb3J0X3N0YXR1cyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xNzM5LDkgKzE3MzMsOSBAQAogCXNwaW5fdW5sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOwogCiAJaWYgKG9wY29kZSA9PSBESUdJX0NNRF9SRUNFSVZFX0RJU0FCTEUpCi0JCWRiZygiJXM6IGdvdCBSRUNFSVZFX0RJU0FCTEUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzOiBnb3QgUkVDRUlWRV9ESVNBQkxFIiwgX19mdW5jX18pOwogCWVsc2UgaWYgKG9wY29kZSAhPSBESUdJX0NNRF9SRUNFSVZFX0RBVEEpCi0JCWRiZygiJXM6IHVua25vd24gb3Bjb2RlOiAlZCIsIF9fRlVOQ1RJT05fXywgb3Bjb2RlKTsKKwkJZGJnKCIlczogdW5rbm93biBvcGNvZGU6ICVkIiwgX19mdW5jX18sIG9wY29kZSk7CiAKIAlyZXR1cm4odGhyb3R0bGVkID8gMSA6IDApOwogCkBAIC0xNzYwLDcgKzE3NTQsNyBAQAogc3RhdGljIGludCBkaWdpX3JlYWRfb29iX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IGRpZ2lfcG9ydCAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgb3Bjb2RlLCBsaW5lLCBzdGF0dXMsIHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKaW5kZXggYTVjOGUxZS4uYzVlYzMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKQEAgLTExOCw5ICsxMTgsNiBAQAogCX0sCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAogCS51c2JfZHJpdmVyID0gCQkmZW1wZWdfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5vcGVuID0JCQllbXBlZ19vcGVuLAogCS5jbG9zZSA9CQllbXBlZ19jbG9zZSwKQEAgLTE1Myw3ICsxNTAsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogRm9yY2UgZGVmYXVsdCB0ZXJtaW8gc2V0dGluZ3MgKi8KIAllbXBlZ19zZXRfdGVybWlvcyAocG9ydCwgTlVMTCkgOwpAQCAtMTc1LDcgKzE3Miw3IEBACiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCiAJaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE4Myw3ICsxODAsNyBAQAogCiBzdGF0aWMgdm9pZCBlbXBlZ19jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxwKQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBzaHV0ZG93biBvdXIgYnVsayByZWFkICovCiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKQEAgLTIwMyw3ICsyMDAsNyBAQAogCWludCBieXRlc19zZW50ID0gMDsKIAlpbnQgdHJhbnNmZXJfc2l6ZTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAl3aGlsZSAoY291bnQgPiAwKSB7CiAKQEAgLTIyMiwxNCArMjE5LDE0IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ3cml0ZV91cmJfcG9vbF9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCQlkYmcoIiVzIC0gbm8gbW9yZSBmcmVlIHVyYnMiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19mdW5jX18pOwogCQkJZ290byBleGl0OwogCQl9CiAKIAkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyAoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLCBHRlBfQVRPTUlDKTsKIAkJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgbm8gbW9yZSBrZXJuZWwgbWVtb3J5Li4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLlxuIiwgX19mdW5jX18pOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAkJfQpAQCAtMjM4LDcgKzIzNSw3IEBACiAKIAkJbWVtY3B5ICh1cmItPnRyYW5zZmVyX2J1ZmZlciwgY3VycmVudF9wb3NpdGlvbiwgdHJhbnNmZXJfc2l6ZSk7CiAKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHRyYW5zZmVyX3NpemUsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdHJhbnNmZXJfc2l6ZSwgdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJCS8qIGJ1aWxkIHVwIG91ciB1cmIgKi8KIAkJdXNiX2ZpbGxfYnVsa191cmIgKApAQCAtMjU0LDcgKzI1MSw3IEBACiAJCS8qIHNlbmQgaXQgZG93biB0aGUgcGlwZSAqLwogCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoc3RhdHVzKSB7Ci0JCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCWJ5dGVzX3NlbnQgPSBzdGF0dXM7CiAJCQlicmVhazsKIAkJfQpAQCAtMjc4LDcgKzI3NSw3IEBACiAJaW50IGk7CiAJaW50IHJvb20gPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmd3JpdGVfdXJiX3Bvb2xfbG9jaywgZmxhZ3MpOwogCkBAIC0yOTEsNyArMjg4LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ3cml0ZV91cmJfcG9vbF9sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgcm9vbSk7CiAKIAlyZXR1cm4gKHJvb20pOwogCkBAIC0zMDQsNyArMzAxLDcgQEAKIAlpbnQgaTsKIAlpbnQgY2hhcnMgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmd3JpdGVfdXJiX3Bvb2xfbG9jaywgZmxhZ3MpOwogCkBAIC0zMTcsNyArMzE0LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ3cml0ZV91cmJfcG9vbF9sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIGNoYXJzKTsKIAogCXJldHVybiAoY2hhcnMpOwogCkBAIC0zMjksMTEgKzMyNiwxMSBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNDMsMjEgKzM0MCwyMSBAQAogCiBzdGF0aWMgdm9pZCBlbXBlZ19yZWFkX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIApAQCAtMzgyLDcgKzM3OSw3IEBACiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJcmV0dXJuOwogCkBAIC0zOTEsNyArMzg4LDcgQEAKIAogc3RhdGljIHZvaWQgZW1wZWdfdGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwogfQogCkBAIC00MDAsMTQgKzM5NywxNCBAQAogewogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcG9ydC0+cmVhZF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJcmV0dXJuOwogfQpAQCAtNDE3LDE0ICs0MTQsMTQgQEAKIHsKIAlpbnQgcjsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoc2VyaWFsLT5kZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlICE9IDEpIHsKIAkJZXJyKCJhY3RpdmUgY29uZmlnICMlZCAhPSAxID8/IiwKIAkJCXNlcmlhbC0+ZGV2LT5hY3Rjb25maWctPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlkYmcoIiVzIC0gcmVzZXQgY29uZmlnIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gcmVzZXQgY29uZmlnIiwgX19mdW5jX18pOwogCXIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbiAoc2VyaWFsLT5kZXYpOwogCiAJLyogY29udGludWUgb24gd2l0aCBpbml0aWFsaXphdGlvbiAqLwpAQCAtNDM1LDEzICs0MzIsMTMgQEAKIAogc3RhdGljIHZvaWQgZW1wZWdfc2h1dGRvd24gKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogfQogCiAKIHN0YXRpYyBpbnQgZW1wZWdfaW9jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCAweCUuNHgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kIDB4JS40eCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQpAQCAtNDUwLDcgKzQ0Nyw3IEBACiBzdGF0aWMgdm9pZCBlbXBlZ19zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MgPSBwb3J0LT50dHktPnRlcm1pb3M7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qCiAgICAgICAgICAqIFRoZSBlbXBlZy1jYXIgcGxheWVyIHdhbnRzIHRoZXNlIHBhcnRpY3VsYXIgdHR5IHNldHRpbmdzLgpAQCAtNTE3LDcgKzUxNCw3IEBACiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyAoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikgewogCQkJZXJyKCIlcyAtIG91dCBvZiBtZW1vcnkgZm9yIHVyYiBidWZmZXJzLiIsIAotCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgX19mdW5jX18pOwogCQkJY29udGludWU7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZXp1c2IuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCmluZGV4IDNmNjk4YmEuLmNjNGZiZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCkBAIC0yNywxMyArMjcsMTMgQEAKIAogCS8qIGRiZygiZXp1c2Jfd3JpdGVtZW1vcnkgJXgsICVkIiwgYWRkcmVzcywgbGVuZ3RoKTsgKi8KIAlpZiAoIXNlcmlhbC0+ZGV2KSB7Ci0JCWVycigiJXMgLSBubyBwaHlzaWNhbCBkZXZpY2UgcHJlc2VudCwgZmFpbGluZy4iLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gbm8gcGh5c2ljYWwgZGV2aWNlIHByZXNlbnQsIGZhaWxpbmcuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAl0cmFuc2Zlcl9idWZmZXIgPSBrbWVtZHVwKGRhdGEsIGxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cmFuc2Zlcl9idWZmZXIpIHsKLQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOworCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgbGVuZ3RoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoc2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCksIGJSZXF1ZXN0LCAweDQwLCBhZGRyZXNzLCAwLCB0cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCwgMzAwMCk7CkBAIC00NSwxMCArNDUsMTAgQEAKIHsKIAlpbnQgcmVzcG9uc2U7CiAKLQkvKiBkYmcoIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7ICovCisJLyogZGJnKCIlcyAtICVkIiwgX19mdW5jX18sIHJlc2V0X2JpdCk7ICovCiAJcmVzcG9uc2UgPSBlenVzYl93cml0ZW1lbW9yeSAoc2VyaWFsLCBDUFVDU19SRUcsICZyZXNldF9iaXQsIDEsIDB4YTApOwogCWlmIChyZXNwb25zZSA8IDApCi0JCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcy0gJWQgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc2V0X2JpdCk7CisJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcy0gJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgcmVzZXRfYml0KTsKIAlyZXR1cm4gcmVzcG9uc2U7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggM2FiYjNjOC4uMjNmNTFhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTQzOSw5ICs0MzksNiBAQAogCS5kZXNjcmlwdGlvbiA9CQkiRlRESSBVU0IgU2VyaWFsIERldmljZSIsCiAJLnVzYl9kcml2ZXIgPSAJCSZmdGRpX2RyaXZlciAsCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlX2NvbWJpbmVkLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5wcm9iZSA9CQlmdGRpX3Npb19wcm9iZSwKIAkucG9ydF9wcm9iZSA9CQlmdGRpX3Npb19wb3J0X3Byb2JlLApAQCAtNTI4LDE0ICs1MjUsMTMgQEAKIAlpbnQgcnY7CiAKIAlpZiAoKChzZXQgfCBjbGVhcikgJiAoVElPQ01fRFRSIHwgVElPQ01fUlRTKSkgPT0gMCkgewotCQlkYmcoIiVzIC0gRFRSfFJUUyBub3QgYmVpbmcgc2V0fGNsZWFyZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gRFRSfFJUUyBub3QgYmVpbmcgc2V0fGNsZWFyZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwkvKiBubyBjaGFuZ2UgKi8KIAl9CiAKIAlidWYgPSBrbWFsbG9jKDEsIEdGUF9OT0lPKTsKLQlpZiAoIWJ1ZikgeworCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAljbGVhciAmPSB+c2V0OwkvKiAnc2V0JyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgJ2NsZWFyJyAqLwogCXVyYl92YWx1ZSA9IDA7CkBAIC01NTcsMTcgKzU1MywxOCBAQAogCWtmcmVlKGJ1Zik7CiAJaWYgKHJ2IDwgMCkgewogCQllcnIoIiVzIEVycm9yIGZyb20gTU9ERU1fQ1RSTCB1cmI6IERUUiAlcywgUlRTICVzIiwKLQkJCQlfX0ZVTkNUSU9OX18sCisJCQkJX19mdW5jX18sCiAJCQkJKHNldCAmIFRJT0NNX0RUUikgPyAiSElHSCIgOgogCQkJCShjbGVhciAmIFRJT0NNX0RUUikgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiLAogCQkJCShzZXQgJiBUSU9DTV9SVFMpID8gIkhJR0giIDoKIAkJCQkoY2xlYXIgJiBUSU9DTV9SVFMpID8gIkxPVyIgOiAidW5jaGFuZ2VkIik7CiAJfSBlbHNlIHsKLQkJZGJnKCIlcyAtIERUUiAlcywgUlRTICVzIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gRFRSICVzLCBSVFMgJXMiLCBfX2Z1bmNfXywKIAkJCQkoc2V0ICYgVElPQ01fRFRSKSA/ICJISUdIIiA6CiAJCQkJKGNsZWFyICYgVElPQ01fRFRSKSA/ICJMT1ciIDogInVuY2hhbmdlZCIsCiAJCQkJKHNldCAmIFRJT0NNX1JUUykgPyAiSElHSCIgOgogCQkJCShjbGVhciAmIFRJT0NNX1JUUykgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiKTsKKwkJLyogRklYTUU6IGxvY2tpbmcgb24gbGFzdF9kdHJfcnRzICovCiAJCXByaXYtPmxhc3RfZHRyX3J0cyA9IChwcml2LT5sYXN0X2R0cl9ydHMgJiB+Y2xlYXIpIHwgc2V0OwogCX0KIAlyZXR1cm4gcnY7CkBAIC02NDIsNyArNjM5LDcgQEAKIAkvKiAxLiBHZXQgdGhlIGJhdWQgcmF0ZSBmcm9tIHRoZSB0dHkgc2V0dGluZ3MsIHRoaXMgb2JzZXJ2ZXMgYWx0X3NwZWVkIGhhY2sgKi8KIAogCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0LT50dHkpOwotCWRiZygiJXMgLSB0dHlfZ2V0X2JhdWRfcmF0ZSByZXBvcnRzIHNwZWVkICVkIiwgX19GVU5DVElPTl9fLCBiYXVkKTsKKwlkYmcoIiVzIC0gdHR5X2dldF9iYXVkX3JhdGUgcmVwb3J0cyBzcGVlZCAlZCIsIF9fZnVuY19fLCBiYXVkKTsKIAogCS8qIDIuIE9ic2VydmUgYXN5bmMtY29tcGF0aWJsZSBjdXN0b21fZGl2aXNvciBoYWNrLCB1cGRhdGUgYmF1ZHJhdGUgaWYgbmVlZGVkICovCiAKQEAgLTY1MCw3ICs2NDcsNyBAQAogCSAgICAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSAmJgogCSAgICAgKHByaXYtPmN1c3RvbV9kaXZpc29yKSkgewogCQliYXVkID0gcHJpdi0+YmF1ZF9iYXNlIC8gcHJpdi0+Y3VzdG9tX2Rpdmlzb3I7Ci0JCWRiZygiJXMgLSBjdXN0b20gZGl2aXNvciAlZCBzZXRzIGJhdWQgcmF0ZSB0byAlZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+Y3VzdG9tX2Rpdmlzb3IsIGJhdWQpOworCQlkYmcoIiVzIC0gY3VzdG9tIGRpdmlzb3IgJWQgc2V0cyBiYXVkIHJhdGUgdG8gJWQiLCBfX2Z1bmNfXywgcHJpdi0+Y3VzdG9tX2Rpdmlzb3IsIGJhdWQpOwogCX0KIAogCS8qIDMuIENvbnZlcnQgYmF1ZHJhdGUgdG8gZGV2aWNlLXNwZWNpZmljIGRpdmlzb3IgKi8KQEAgLTY3MSw3ICs2NjgsNyBAQAogCQljYXNlIDExNTIwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjExNTIwMDsgYnJlYWs7CiAJCX0gLyogYmF1ZCAqLwogCQlpZiAoZGl2X3ZhbHVlID09IDApIHsKLQkJCWRiZygiJXMgLSBCYXVkcmF0ZSAoJWQpIHJlcXVlc3RlZCBpcyBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fLCAgYmF1ZCk7CisJCQlkYmcoIiVzIC0gQmF1ZHJhdGUgKCVkKSByZXF1ZXN0ZWQgaXMgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fLCAgYmF1ZCk7CiAJCQlkaXZfdmFsdWUgPSBmdGRpX3Npb19iOTYwMDsKIAkJCWJhdWQgPSA5NjAwOwogCQkJZGl2X29rYXkgPSAwOwpAQCAtNjgxLDcgKzY3OCw3IEBACiAJCWlmIChiYXVkIDw9IDMwMDAwMDApIHsKIAkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYW1fYmF1ZF90b19kaXZpc29yKGJhdWQpOwogCQl9IGVsc2UgewotCSAgICAgICAgICAgICAgICBkYmcoIiVzIC0gQmF1ZCByYXRlIHRvbyBoaWdoISIsIF9fRlVOQ1RJT05fXyk7CisJICAgICAgICAgICAgICAgIGRiZygiJXMgLSBCYXVkIHJhdGUgdG9vIGhpZ2ghIiwgX19mdW5jX18pOwogCQkJYmF1ZCA9IDk2MDA7CiAJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmFtX2JhdWRfdG9fZGl2aXNvcig5NjAwKTsKIAkJCWRpdl9va2F5ID0gMDsKQEAgLTY5Myw3ICs2OTAsNyBAQAogCQlpZiAoYmF1ZCA8PSAzMDAwMDAwKSB7CiAJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmJtX2JhdWRfdG9fZGl2aXNvcihiYXVkKTsKIAkJfSBlbHNlIHsKLQkgICAgICAgICAgICAgICAgZGJnKCIlcyAtIEJhdWQgcmF0ZSB0b28gaGlnaCEiLCBfX0ZVTkNUSU9OX18pOworCSAgICAgICAgICAgICAgICBkYmcoIiVzIC0gQmF1ZCByYXRlIHRvbyBoaWdoISIsIF9fZnVuY19fKTsKIAkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yKDk2MDApOwogCQkJZGl2X29rYXkgPSAwOwogCQkJYmF1ZCA9IDk2MDA7CkBAIC03MDMsNyArNzAwLDcgQEAKIAogCWlmIChkaXZfb2theSkgewogCQlkYmcoIiVzIC0gQmF1ZCByYXRlIHNldCB0byAlZCAoZGl2aXNvciAweCVsWCkgb24gY2hpcCAlcyIsCi0JCQlfX0ZVTkNUSU9OX18sIGJhdWQsICh1bnNpZ25lZCBsb25nKWRpdl92YWx1ZSwKKwkJCV9fZnVuY19fLCBiYXVkLCAodW5zaWduZWQgbG9uZylkaXZfdmFsdWUsCiAJCQlmdGRpX2NoaXBfbmFtZVtwcml2LT5jaGlwX3R5cGVdKTsKIAl9CiAKQEAgLTgwNCw3ICs4MDEsNyBAQAogCiAJdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKIAlpbnRlcmZhY2VzID0gdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOwotCWRiZygiJXM6IGJjZERldmljZSA9IDB4JXgsIGJOdW1JbnRlcmZhY2VzID0gJXUiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlczogYmNkRGV2aWNlID0gMHgleCwgYk51bUludGVyZmFjZXMgPSAldSIsIF9fZnVuY19fLAogCQkJdmVyc2lvbiwgaW50ZXJmYWNlcyk7CiAJaWYgKGludGVyZmFjZXMgPiAxKSB7CiAJCWludCBpbnRlcjsKQEAgLTgyMiw3ICs4MTksNyBAQAogCQkgKiB0byAweDIwMCB3aGVuIGlTZXJpYWxOdW1iZXIgaXMgMC4gICovCiAJCWlmICh2ZXJzaW9uIDwgMHg1MDApIHsKIAkJCWRiZygiJXM6IHNvbWV0aGluZyBmaXNoeSAtIGJjZERldmljZSB0b28gbG93IGZvciBtdWx0aS1pbnRlcmZhY2UgZGV2aWNlIiwKLQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQkJX19mdW5jX18pOwogCQl9CiAJfSBlbHNlIGlmICh2ZXJzaW9uIDwgMHgyMDApIHsKIAkJLyogT2xkIGRldmljZS4gIEFzc3VtZSBpdHMgdGhlIG9yaWdpbmFsIFNJTy4gKi8KQEAgLTg2MCw3ICs4NTcsNyBAQAogCWludCBydiA9IDA7CiAKIAotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsX19mdW5jX18pOwogCiAJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKIAkJCSAgICAgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLApAQCAtODg3LDcgKzg4NCw3IEBACiAJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKIAlpbnQgcnYgPSAwOwogCi0JZGJnKCIlczogc2V0dGluZyBsYXRlbmN5IHRpbWVyID0gJWkiLCBfX0ZVTkNUSU9OX18sIHYpOworCWRiZygiJXM6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciA9ICVpIiwgX19mdW5jX18sIHYpOwogCiAJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKIAkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLApAQCAtOTE2LDcgKzkxMyw3IEBACiAJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKIAlpbnQgcnYgPSAwOwogCi0JZGJnKCIlczogc2V0dGluZyBldmVudCBjaGFyID0gJWkiLCBfX0ZVTkNUSU9OX18sIHYpOworCWRiZygiJXM6IHNldHRpbmcgZXZlbnQgY2hhciA9ICVpIiwgX19mdW5jX18sIHYpOwogCiAJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKIAkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLApAQCAtOTQxLDcgKzkzOCw3IEBACiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsX19mdW5jX18pOwogCiAJLyogWFhYIEkndmUgbm8gaWRlYSBpZiB0aGUgb3JpZ2luYWwgU0lPIHN1cHBvcnRzIHRoZSBldmVudF9jaGFyCiAJICogc3lzZnMgcGFyYW1ldGVyLCBzbyBJJ20gcGxheWluZyBpdCBzYWZlLiAgKi8KQEAgLTk2Myw3ICs5NjAsNyBAQAogewogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLF9fZnVuY19fKTsKIAogCS8qIFhYWCBzZWUgY3JlYXRlX3N5c2ZzX2F0dHJzICovCiAJaWYgKHByaXYtPmNoaXBfdHlwZSAhPSBTSU8pIHsKQEAgLTEwMDUsMTEgKzEwMDIsMTEgQEAKIAlzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgKnF1aXJrID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOwogCiAKLQlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLF9fZnVuY19fKTsKIAogCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KXsKLQkJZXJyKCIlcy0ga21hbGxvYyglWmQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSk7CisJCWVycigiJXMtIGttYWxsb2MoJVpkKSBmYWlsZWQuIiwgX19mdW5jX18sIHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTA1OCw3ICsxMDU1LDcgQEAKIC8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KIHN0YXRpYyB2b2lkIGZ0ZGlfVVNCX1VJUlRfc2V0dXAgKHN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYpCiB7Ci0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIixfX2Z1bmNfXyk7CiAKIAlwcml2LT5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKIAlwcml2LT5jdXN0b21fZGl2aXNvciA9IDc3OwpAQCAtMTA2OSw3ICsxMDY2LDcgQEAKICAqIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAxMDAwMDApIGFuZCBSVFMtQ1RTIGVuYWJsZWQuICAqLwogc3RhdGljIHZvaWQgZnRkaV9IRV9USVJBMV9zZXR1cCAoc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdikKIHsKLQlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLF9fZnVuY19fKTsKIAogCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwogCXByaXYtPmN1c3RvbV9kaXZpc29yID0gMjQwOwpAQCAtMTA4Nyw3ICsxMDg0LDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNlcmlhbC0+ZGV2OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBzZXJpYWwtPmludGVyZmFjZTsKIAotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsX19mdW5jX18pOwogCiAJaWYgKGludGVyZmFjZSA9PSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVswXSkgewogCQlpbmZvKCJJZ25vcmluZyBzZXJpYWwgcG9ydCByZXNlcnZlZCBmb3IgSlRBRyIpOwpAQCAtMTEyMywxNCArMTEyMCwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBmdGRpX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyBpbnQgZnRkaV9zaW9fcG9ydF9yZW1vdmUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXJlbW92ZV9zeXNmc19hdHRycyhwb3J0KTsKIApAQCAtMTE1NSw3ICsxMTUyLDcgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAljaGFyIGJ1ZlsxXTsgLyogTmVlZGVkIGZvciB0aGUgdXNiX2NvbnRyb2xfbXNnIEkgdGhpbmsgKi8KIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwogCXByaXYtPnR4X2J5dGVzID0gMDsKQEAgLTEyMDAsNyArMTE5Nyw3IEBACiAJCSAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTIyMiw3ICsxMjE5LDcgQEAKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWNoYXIgYnVmWzFdOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCW11dGV4X2xvY2soJnBvcnQtPnNlcmlhbC0+ZGlzY19tdXRleCk7CiAJaWYgKGNfY2ZsYWcgJiBIVVBDTCAmJiAhcG9ydC0+c2VyaWFsLT5kaXNjb25uZWN0ZWQpewpAQCAtMTI2OSw3ICsxMjY2LDcgQEAKIAlpbnQgdHJhbnNmZXJfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyBwb3J0ICVkLCAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CisJZGJnKCIlcyBwb3J0ICVkLCAlZCBieXRlcyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKIAogCWlmIChjb3VudCA9PSAwKSB7CiAJCWRiZygid3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIik7CkBAIC0xMjc4LDcgKzEyNzUsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPnR4X291dHN0YW5kaW5nX3VyYnMgPiBVUkJfVVBQRVJfTElNSVQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwotCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlwcml2LT50eF9vdXRzdGFuZGluZ191cmJzKys7CkBAIC0xMjk4LDE0ICsxMjk1LDE0IEBACiAKIAlidWZmZXIgPSBrbWFsbG9jICh0cmFuc2Zlcl9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWJ1ZmZlcikgewotCQllcnIoIiVzIHJhbiBvdXQgb2Yga2VybmVsIG1lbW9yeSBmb3IgdXJiIC4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgcmFuIG91dCBvZiBrZXJuZWwgbWVtb3J5IGZvciB1cmIgLi4uIiwgX19mdW5jX18pOwogCQljb3VudCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3Jfbm9fYnVmZmVyOwogCX0KIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1cmIpIHsKLQkJZXJyKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwkJZXJyKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19mdW5jX18pOwogCQljb3VudCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3Jfbm9fdXJiOwogCX0KQEAgLTEzMzcsNyArMTMzNCw3IEBACiAJCW1lbWNweSAoYnVmZmVyLCBidWYsIGNvdW50KTsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdHJhbnNmZXJfc2l6ZSwgYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB0cmFuc2Zlcl9zaXplLCBidWZmZXIpOwogCiAJLyogZmlsbCB0aGUgYnVmZmVyIGFuZCBzZW5kIGl0ICovCiAJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKQEAgLTEzNDcsNyArMTM0NCw3IEBACiAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCWNvdW50ID0gc3RhdHVzOwogCQlnb3RvIGVycm9yOwogCX0gZWxzZSB7CkBAIC0xMzYxLDcgKzEzNTgsNyBAQAogCSAqIHJlYWxseSBmcmVlIGl0IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdCAqLwogCXVzYl9mcmVlX3VyYih1cmIpOwogCi0JZGJnKCIlcyB3cml0ZSByZXR1cm5pbmc6ICVkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKCIlcyB3cml0ZSByZXR1cm5pbmc6ICVkIiwgX19mdW5jX18sIGNvdW50KTsKIAlyZXR1cm4gY291bnQ7CiBlcnJvcjoKIAl1c2JfZnJlZV91cmIodXJiKTsKQEAgLTEzODAsNyArMTM3Nyw3IEBACiBzdGF0aWMgdm9pZCBmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CiAJaW50IGRhdGFfb2Zmc2V0OyAgICAgICAvKiB3aWxsIGJlIDEgZm9yIHRoZSBTSU8gYW5kIDAgb3RoZXJ3aXNlICovCiAJdW5zaWduZWQgbG9uZyBjb3VudGJhY2s7CkBAIC0xMzg5LDcgKzEzODYsNyBAQAogCS8qIGZyZWUgdXAgdGhlIHRyYW5zZmVyIGJ1ZmZlciwgYXMgdXNiX2ZyZWVfdXJiKCkgZG9lcyBub3QgZG8gdGhpcyAqLwogCWtmcmVlICh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIm5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgc3RhdHVzKTsKQEAgLTEzOTgsNyArMTM5NSw3IEBACiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmICghcHJpdikgewotCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyIC0gZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAkvKiBhY2NvdW50IGZvciB0cmFuc2ZlcnJlZCBkYXRhICovCkBAIC0xNDA2LDcgKzE0MDMsNyBAQAogCWRhdGFfb2Zmc2V0ID0gcHJpdi0+d3JpdGVfb2Zmc2V0OwogCWlmIChkYXRhX29mZnNldCA+IDApIHsKIAkJLyogU3VidHJhY3QgdGhlIGNvbnRyb2wgYnl0ZXMgKi8KLQkJY291bnRiYWNrIC09IChkYXRhX29mZnNldCAqICgoY291bnRiYWNrICsgKFBLVFNaIC0gMSkpIC8gUEtUU1opKTsKKwkJY291bnRiYWNrIC09IChkYXRhX29mZnNldCAqIERJVl9ST1VORF9VUChjb3VudGJhY2ssIFBLVFNaKSk7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAJLS1wcml2LT50eF9vdXRzdGFuZGluZ191cmJzOwpAQCAtMTQyMyw3ICsxNDIwLDcgQEAKIAlpbnQgcm9vbTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPnR4X291dHN0YW5kaW5nX3VyYnMgPCBVUkJfVVBQRVJfTElNSVQpIHsKQEAgLTE0NDcsMTMgKzE0NDQsMTMgQEAKIAlpbnQgYnVmZmVyZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwogCWJ1ZmZlcmVkID0gKGludClwcml2LT50eF9vdXRzdGFuZGluZ19ieXRlczsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAJaWYgKGJ1ZmZlcmVkIDwgMCkgewotCQllcnIoIiVzIG91dHN0YW5kaW5nIHR4IGJ5dGVzIGlzIG5lZ2F0aXZlISIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgb3V0c3RhbmRpbmcgdHggYnl0ZXMgaXMgbmVnYXRpdmUhIiwgX19mdW5jX18pOwogCQlidWZmZXJlZCA9IDA7CiAJfQogCXJldHVybiBidWZmZXJlZDsKQEAgLTE0NjMsNyArMTQ2MCw3IEBACiAKIHN0YXRpYyB2b2lkIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7IC8qIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrICovCi0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwogCXVuc2lnbmVkIGxvbmcgY291bnRyZWFkOwpAQCAtMTQ3MSwzMCArMTQ2OCwzMCBAQAogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAogCWlmICh1cmItPm51bWJlcl9vZl9wYWNrZXRzID4gMCkgewotCQllcnIoIiVzIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWQgYWN0dWFsX2xlbmd0aCAlZCBudW1iZXIgb2YgcGFja2V0cyAlZCIsX19GVU5DVElPTl9fLAorCQllcnIoIiVzIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWQgYWN0dWFsX2xlbmd0aCAlZCBudW1iZXIgb2YgcGFja2V0cyAlZCIsX19mdW5jX18sCiAJCSAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT5udW1iZXJfb2ZfcGFja2V0cyApOwotCQllcnIoIiVzIHRyYW5zZmVyX2ZsYWdzICV4ICIsIF9fRlVOQ1RJT05fXyx1cmItPnRyYW5zZmVyX2ZsYWdzICk7CisJCWVycigiJXMgdHJhbnNmZXJfZmxhZ3MgJXggIiwgX19mdW5jX18sdXJiLT50cmFuc2Zlcl9mbGFncyApOwogCX0KIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAocG9ydC0+b3Blbl9jb3VudCA8PSAwKQogCQlyZXR1cm47CiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKCF0dHkpIHsKLQkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgdHR5IHBvaW50ZXIgLSBleGl0aW5nIixfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmICghcHJpdikgewotCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyIC0gZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh1cmIgIT0gcG9ydC0+cmVhZF91cmIpIHsKLQkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19GVU5DVElPTl9fKTsKKwkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19mdW5jX18pOwogCX0KIAogCWlmIChzdGF0dXMpIHsKQEAgLTE1MDYsNyArMTUwMyw3IEBACiAKIAkvKiBjb3VudCBkYXRhIGJ5dGVzLCBidXQgbm90IHN0YXR1cyBieXRlcyAqLwogCWNvdW50cmVhZCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKLQljb3VudHJlYWQgLT0gMiAqICgoY291bnRyZWFkICsgKFBLVFNaIC0gMSkpIC8gUEtUU1opOworCWNvdW50cmVhZCAtPSAyICogRElWX1JPVU5EX1VQKGNvdW50cmVhZCwgUEtUU1opOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CiAJcHJpdi0+cnhfYnl0ZXMgKz0gY291bnRyZWFkOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKQEAgLTE1MzIsMzkgKzE1MjksMzkgQEAKIAlpbnQgcGFja2V0X29mZnNldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChwb3J0LT5vcGVuX2NvdW50IDw9IDApCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaWYgKCFwcml2KSB7Ci0JCWRiZygiJXMgLSBiYWQgcG9ydCBwcml2YXRlIGRhdGEgcG9pbnRlciAtIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJdXJiID0gcG9ydC0+cmVhZF91cmI7CiAJaWYgKCF1cmIpIHsKLQkJZGJnKCIlcyAtIGJhZCByZWFkX3VyYiBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgcmVhZF91cmIgcG9pbnRlciAtIGV4aXRpbmciLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKIAlpZiAocHJpdi0+cnhfcHJvY2Vzc2VkKSB7Ci0JCWRiZygiJXMgLSBhbHJlYWR5IHByb2Nlc3NlZDogJWQgYnl0ZXMsICVkIHJlbWFpbiIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIGFscmVhZHkgcHJvY2Vzc2VkOiAlZCBieXRlcywgJWQgcmVtYWluIiwgX19mdW5jX18sCiAJCQkJcHJpdi0+cnhfcHJvY2Vzc2VkLAogCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCAtIHByaXYtPnJ4X3Byb2Nlc3NlZCk7CiAJfSBlbHNlIHsKIAkJLyogVGhlIGZpcnN0IHR3byBieXRlcyBvZiBldmVyeSByZWFkIHBhY2tldCBhcmUgc3RhdHVzICovCiAJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAyKSB7Ci0JCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwkJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlkYmcoIlN0YXR1cyBvbmx5OiAlMDNvbyAlMDNvbyIsZGF0YVswXSxkYXRhWzFdKTsKIAkJfQpAQCAtMTU5NCwxNyArMTU5MSwxNyBAQAogCiAJCWxlbmd0aCA9IG1pbihQS1RTWiwgdXJiLT5hY3R1YWxfbGVuZ3RoLXBhY2tldF9vZmZzZXQpLTI7CiAJCWlmIChsZW5ndGggPCAwKSB7Ci0JCQllcnIoIiVzIC0gYmFkIHBhY2tldCBsZW5ndGg6ICVkIiwgX19GVU5DVElPTl9fLCBsZW5ndGgrMik7CisJCQllcnIoIiVzIC0gYmFkIHBhY2tldCBsZW5ndGg6ICVkIiwgX19mdW5jX18sIGxlbmd0aCsyKTsKIAkJCWxlbmd0aCA9IDA7CiAJCX0KIAogCQlpZiAocHJpdi0+cnhfZmxhZ3MgJiBUSFJPVFRMRUQpIHsKLQkJCWRiZygiJXMgLSB0aHJvdHRsZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHRocm90dGxlZCIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmICh0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGxlbmd0aCkgPCBsZW5ndGgpIHsKIAkJCS8qIGJyZWFrIG91dCAmIHdhaXQgZm9yIHRocm90dGxpbmcvdW50aHJvdHRsaW5nIHRvIGhhcHBlbiAqLwotCQkJZGJnKCIlcyAtIHJlY2VpdmUgcm9vbSBsb3ciLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHJlY2VpdmUgcm9vbSBsb3ciLCBfX2Z1bmNfXyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNjcyLDcgKzE2NjksNyBAQAogCQkvKiBub3QgY29tcGxldGVseSBwcm9jZXNzZWQgLSByZWNvcmQgcHJvZ3Jlc3MgKi8KIAkJcHJpdi0+cnhfcHJvY2Vzc2VkID0gcGFja2V0X29mZnNldDsKIAkJZGJnKCIlcyAtIGluY29tcGxldGUsICVkIGJ5dGVzIHByb2Nlc3NlZCwgJWQgcmVtYWluIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHBhY2tldF9vZmZzZXQsCisJCQkJX19mdW5jX18sIHBhY2tldF9vZmZzZXQsCiAJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoIC0gcGFja2V0X29mZnNldCk7CiAJCS8qIGNoZWNrIGlmIHdlIHdlcmUgdGhyb3R0bGVkIHdoaWxlIHByb2Nlc3NpbmcgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKQEAgLTE2ODAsNyArMTY3Nyw3IEBACiAJCQlwcml2LT5yeF9mbGFncyB8PSBBQ1RVQUxMWV9USFJPVFRMRUQ7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CiAJCQlkYmcoIiVzIC0gZGVmZXJyaW5nIHJlbWFpbmRlciB1bnRpbCB1bnRocm90dGxlZCIsCi0JCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJCV9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CkBAIC0xNjg5LDcgKzE2ODYsNyBAQAogCQkJLyogZGVsYXkgcHJvY2Vzc2luZyBvZiByZW1haW5kZXIgKi8KIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+cnhfd29yaywgMSk7CiAJCX0gZWxzZSB7Ci0JCQlkYmcoIiVzIC0gcG9ydCBpcyBjbG9zZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBvcnQgaXMgY2xvc2VkIiwgX19mdW5jX18pOwogCQl9CiAJCXJldHVybjsKIAl9CkBAIC0xNzA3LDcgKzE3MDQsNyBAQAogCiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkKLQkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0KIAogCXJldHVybjsKQEAgLTE3MzYsMTAgKzE3MzMsMTAgQEAKIAkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNUX1RZUEUsCiAJCQkgICAgdXJiX3ZhbHVlICwgcHJpdi0+aW50ZXJmYWNlLAogCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewotCQllcnIoIiVzIEZBSUxFRCB0byBlbmFibGUvZGlzYWJsZSBicmVhayBzdGF0ZSAoc3RhdGUgd2FzICVkKSIsIF9fRlVOQ1RJT05fXyxicmVha19zdGF0ZSk7CisJCWVycigiJXMgRkFJTEVEIHRvIGVuYWJsZS9kaXNhYmxlIGJyZWFrIHN0YXRlIChzdGF0ZSB3YXMgJWQpIiwgX19mdW5jX18sYnJlYWtfc3RhdGUpOwogCX0KIAotCWRiZygiJXMgYnJlYWsgc3RhdGUgaXMgJWQgLSB1cmIgaXMgJWQiLCBfX0ZVTkNUSU9OX18sYnJlYWtfc3RhdGUsIHVyYl92YWx1ZSk7CisJZGJnKCIlcyBicmVhayBzdGF0ZSBpcyAlZCAtIHVyYiBpcyAlZCIsIF9fZnVuY19fLGJyZWFrX3N0YXRlLCB1cmJfdmFsdWUpOwogCiB9CiAKQEAgLTE3NjMsMTggKzE3NjAsMTggQEAKIAl1bnNpZ25lZCBjaGFyIHZzdG9wOwogCXVuc2lnbmVkIGNoYXIgdnN0YXJ0OwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIEZvcmNlIGJhdWQgcmF0ZSBpZiB0aGlzIGRldmljZSByZXF1aXJlcyBpdCwgdW5sZXNzIGl0IGlzIHNldCB0byBCMC4gKi8KIAlpZiAocHJpdi0+Zm9yY2VfYmF1ZCAmJiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgIT0gQjApKSB7Ci0JCWRiZygiJXM6IGZvcmNpbmcgYmF1ZCByYXRlIGZvciB0aGlzIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXM6IGZvcmNpbmcgYmF1ZCByYXRlIGZvciB0aGlzIGRldmljZSIsIF9fZnVuY19fKTsKIAkJdHR5X2VuY29kZV9iYXVkX3JhdGUocG9ydC0+dHR5LCBwcml2LT5mb3JjZV9iYXVkLAogCQkJCQlwcml2LT5mb3JjZV9iYXVkKTsKIAl9CiAKIAkvKiBGb3JjZSBSVFMtQ1RTIGlmIHRoaXMgZGV2aWNlIHJlcXVpcmVzIGl0LiAqLwogCWlmIChwcml2LT5mb3JjZV9ydHNjdHMpIHsKLQkJZGJnKCIlczogZm9yY2luZyBydHNjdHMgZm9yIHRoaXMgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczogZm9yY2luZyBydHNjdHMgZm9yIHRoaXMgZGV2aWNlIiwgX19mdW5jX18pOwogCQl0ZXJtaW9zLT5jX2NmbGFnIHw9IENSVFNDVFM7CiAJfQogCkBAIC0xODE4LDcgKzE4MTUsNyBAQAogCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1RfVFlQRSwKIAkJCSAgICB1cmJfdmFsdWUgLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkgICAgYnVmLCAwLCBXRFJfU0hPUlRfVElNRU9VVCkgPCAwKSB7Ci0JCWVycigiJXMgRkFJTEVEIHRvIHNldCBkYXRhYml0cy9zdG9wYml0cy9wYXJpdHkiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIEZBSUxFRCB0byBzZXQgZGF0YWJpdHMvc3RvcGJpdHMvcGFyaXR5IiwgX19mdW5jX18pOwogCX0KIAogCS8qIE5vdyBkbyB0aGUgYmF1ZHJhdGUgKi8KQEAgLTE4MjksMTQgKzE4MjYsMTQgQEAKIAkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCiAJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwKIAkJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7Ci0JCQllcnIoIiVzIGVycm9yIGZyb20gZGlzYWJsZSBmbG93Y29udHJvbCB1cmIiLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyKCIlcyBlcnJvciBmcm9tIGRpc2FibGUgZmxvd2NvbnRyb2wgdXJiIiwgX19mdW5jX18pOwogCQl9CiAJCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KIAkJY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKIAl9IGVsc2UgewogCQkvKiBzZXQgdGhlIGJhdWRyYXRlIGRldGVybWluZWQgYmVmb3JlICovCiAJCWlmIChjaGFuZ2Vfc3BlZWQocG9ydCkpIHsKLQkJCWVycigiJXMgdXJiIGZhaWxlZCB0byBzZXQgYmF1ZHJhdGUiLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyKCIlcyB1cmIgZmFpbGVkIHRvIHNldCBiYXVkcmF0ZSIsIF9fZnVuY19fKTsKIAkJfQogCQkvKiBFbnN1cmUgUlRTIGFuZCBEVFIgYXJlIHJhaXNlZCB3aGVuIGJhdWRyYXRlIGNoYW5nZWQgZnJvbSAwICovCiAJCWlmICghb2xkX3Rlcm1pb3MgfHwgKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpID09IEIwKSB7CkBAIC0xODQ3LDcgKzE4NDQsNyBAQAogCS8qIFNldCBmbG93IGNvbnRyb2wgKi8KIAkvKiBOb3RlIGRldmljZSBhbHNvIHN1cHBvcnRzIERUUi9DRCAodWdoKSBhbmQgWG9uL1hvZmYgaW4gaGFyZHdhcmUgKi8KIAlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCWRiZygiJXMgU2V0dGluZyB0byBDUlRTQ1RTIGZsb3cgY29udHJvbCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgU2V0dGluZyB0byBDUlRTQ1RTIGZsb3cgY29udHJvbCIsIF9fZnVuY19fKTsKIAkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsCiAJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCkBAIC0xODY1LDcgKzE4NjIsNyBAQAogCQkgKiBpZiBJWE9GRiBpcyBub3Qgc2V0LCB0aGUgcHJlLXhvbi94b2ZmIGNvZGUgaXMgZXhlY3V0ZWQuCiAJCSovCiAJCWlmIChpZmxhZyAmIElYT0ZGKSB7Ci0JCQlkYmcoIiVzICByZXF1ZXN0IHRvIGVuYWJsZSB4b254b2ZmIGlmbGFnPSUwNHgiLF9fRlVOQ1RJT05fXyxpZmxhZyk7CisJCQlkYmcoIiVzICByZXF1ZXN0IHRvIGVuYWJsZSB4b254b2ZmIGlmbGFnPSUwNHgiLF9fZnVuY19fLGlmbGFnKTsKIAkJCS8vIFRyeSB0byBlbmFibGUgdGhlIFhPTi9YT0ZGIG9uIHRoZSBmdGRpX3NpbwogCQkJLy8gU2V0IHRoZSB2c3RhcnQgYW5kIHZzdG9wIC0tIGNvdWxkIGhhdmUgYmVlbiBkb25lIHVwIGFib3ZlIHdoZXJlCiAJCQkvLyBhIGxvdCBvZiBvdGhlciBkZXJlZmVyZW5jaW5nIGlzIGRvbmUgYnV0IHRoYXQgd291bGQgYmUgdmVyeQpAQCAtMTg4Niw3ICsxODgzLDcgQEAKIAkJfSBlbHNlIHsKIAkJCS8qIGVsc2UgY2xhdXNlIHRvIG9ubHkgcnVuIGlmIGNmYWcgISBDUlRTQ1RTIGFuZCBpZmxhZyAhIFhPRkYgKi8KIAkJCS8qIENIRUNLTUUgQXNzdW1pbmcgWE9OL1hPRkYgaGFuZGxlZCBieSB0dHkgc3RhY2sgLSBub3QgYnkgZGV2aWNlICovCi0JCQlkYmcoIiVzIFR1cm5pbmcgb2ZmIGhhcmR3YXJlIGZsb3cgY29udHJvbCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIFR1cm5pbmcgb2ZmIGhhcmR3YXJlIGZsb3cgY29udHJvbCIsIF9fZnVuY19fKTsKIAkJCWlmICh1c2JfY29udHJvbF9tc2coZGV2LAogCQkJCQkgICAgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCiAJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCkBAIC0xOTA4LDcgKzE5MDUsNyBAQAogCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwogCWludCByZXQ7CiAKLQlkYmcoIiVzIFRJT0NNR0VUIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIFRJT0NNR0VUIiwgX19mdW5jX18pOwogCXN3aXRjaCAocHJpdi0+Y2hpcF90eXBlKSB7CiAJY2FzZSBTSU86CiAJCS8qIFJlcXVlc3QgdGhlIHN0YXR1cyBmcm9tIHRoZSBkZXZpY2UgKi8KQEAgLTE5MTgsNyArMTkxNSw3IEBACiAJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVF9UWVBFLAogCQkJCQkgICAwLCAwLAogCQkJCQkgICBidWYsIDEsIFdEUl9USU1FT1VUKSkgPCAwICkgewotCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19GVU5DVElPTl9fLAorCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19mdW5jX18sCiAJCQkgICAgcmV0KTsKIAkJCXJldHVybihyZXQpOwogCQl9CkBAIC0xOTM1LDcgKzE5MzIsNyBAQAogCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1RfVFlQRSwKIAkJCQkJICAgMCwgcHJpdi0+aW50ZXJmYWNlLAogCQkJCQkgICBidWYsIDIsIFdEUl9USU1FT1VUKSkgPCAwICkgewotCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19GVU5DVElPTl9fLAorCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19mdW5jX18sCiAJCQkgICAgcmV0KTsKIAkJCXJldHVybihyZXQpOwogCQl9CkBAIC0xOTU0LDcgKzE5NTEsNyBAQAogCiBzdGF0aWMgaW50IGZ0ZGlfdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCiB7Ci0JZGJnKCIlcyBUSU9DTVNFVCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyBUSU9DTVNFVCIsIF9fZnVuY19fKTsKIAlyZXR1cm4gdXBkYXRlX21jdHJsKHBvcnQsIHNldCwgY2xlYXIpOwogfQogCkBAIC0xOTYzLDcgKzE5NjAsNyBAQAogewogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIGNtZCAweCUwNHgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisJZGJnKCIlcyBjbWQgMHglMDR4IiwgX19mdW5jX18sIGNtZCk7CiAKIAkvKiBCYXNlZCBvbiBjb2RlIGZyb20gYWNtLmMgYW5kIG90aGVycyAqLwogCXN3aXRjaCAoY21kKSB7CkBAIC0yMDIyLDcgKzIwMTksNyBAQAogCS8qIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIC0gdHVybnMgb3V0IHRoZSBoaWdoZXIgbGF5ZXJzIHdpbGwgZG8KIAkgKiAgc29tZSBpb2N0bHMgaXRzZWxmIChzZWUgY29tbWVudCBhYm92ZSkKIAkgKi8KLQlkYmcoIiVzIGFyZyBub3Qgc3VwcG9ydGVkIC0gaXQgd2FzIDB4JTA0eCAtIGNoZWNrIC91c3IvaW5jbHVkZS9hc20vaW9jdGxzLmgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisJZGJnKCIlcyBhcmcgbm90IHN1cHBvcnRlZCAtIGl0IHdhcyAweCUwNHggLSBjaGVjayAvdXNyL2luY2x1ZGUvYXNtL2lvY3Rscy5oIiwgX19mdW5jX18sIGNtZCk7CiAKIAlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKIH0gLyogZnRkaV9pb2N0bCAqLwpAQCAtMjAzMyw3ICsyMDMwLDcgQEAKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CkBAIC0yMDQ3LDcgKzIwNDQsNyBAQAogCWludCBhY3R1YWxseV90aHJvdHRsZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwogCWFjdHVhbGx5X3Rocm90dGxlZCA9IHByaXYtPnJ4X2ZsYWdzICYgQUNUVUFMTFlfVEhST1RUTEVEOwpAQCAtMjA2Miw3ICsyMDU5LDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAlpZiAodmVuZG9yID4gMCAmJiBwcm9kdWN0ID4gMCkgewogCQkvKiBBZGQgdXNlciBzcGVjaWZpZWQgVklEL1BJRCB0byByZXNlcnZlZCBlbGVtZW50IG9mIHRhYmxlLiAqLwogCQlpbnQgaTsKQEAgLTIwOTEsNyArMjA4OCw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZnRkaV9leGl0ICh2b2lkKQogewogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXVzYl9kZXJlZ2lzdGVyICgmZnRkaV9kcml2ZXIpOwogCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfc2lvX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnVuc29mdC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z1bnNvZnQuYwppbmRleCBiNTE5NGRjLi5lOGJhMmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnVuc29mdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdW5zb2Z0LmMKQEAgLTM5LDkgKzM5LDYgQEAKIAl9LAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKIAkudXNiX2RyaXZlciA9IAkJJmZ1bnNvZnRfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luID0JTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ID0JCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkxLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKaW5kZXggZDc0ZTQzZC4uOGNlNWE1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCkBAIC0yODAsNyArMjgwLDcgQEAKIAlpZiAodHR5ICYmIGFjdHVhbF9sZW5ndGgpIHsKIAogCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIAotCQkJCQlfX0ZVTkNUSU9OX18sIGFjdHVhbF9sZW5ndGgsIGRhdGEpOworCQkJCQlfX2Z1bmNfXywgYWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBhY3R1YWxfbGVuZ3RoKTsKIAkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIGFjdHVhbF9sZW5ndGgpOwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZ2FybWluX3BhY2tldCAqcmVzdWx0ID0gTlVMTDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCXdoaWxlICghbGlzdF9lbXB0eSgmZ2FybWluX2RhdGFfcC0+cGt0bGlzdCkpIHsKQEAgLTM3OSw3ICszNzksNyBAQAogCV9fdTggKnB0ciA9IHBrdDsKIAl1bnNpZ25lZCAgbCA9IDA7CiAKLQlkYmcoIiVzIC0gcGt0LWlkOiAweCVYLiIsIF9fRlVOQ1RJT05fXywgMHhGRiAmIHBrdF9pZCk7CisJZGJnKCIlcyAtIHBrdC1pZDogMHglWC4iLCBfX2Z1bmNfXywgMHhGRiAmIHBrdF9pZCk7CiAKIAkqcHRyKysgPSBETEU7CiAJKnB0cisrID0gQUNLOwpAQCAtNDI5LDExICs0MjksMTEgQEAKIAlpbnQgc2l6ZSA9IHJlY3BrdFsxXTsKIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmdhcm1pbl9kYXRhX3AtPnBvcnQtPmRldiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGNvdW50LUdTUF9JTklUSUFMX09GRlNFVCwgcmVjcGt0KTsKKwkJCSAgICAgICBfX2Z1bmNfXywgY291bnQtR1NQX0lOSVRJQUxfT0ZGU0VULCByZWNwa3QpOwogCiAJaWYgKHNpemUgIT0gKGNvdW50LUdTUF9JTklUSUFMX09GRlNFVC0zKSkgewogCQlkYmcoIiVzIC0gaW52YWxpZCBzaXplLCBleHBlY3RlZCAlZCBieXRlcywgZ290ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgc2l6ZSwgKGNvdW50LUdTUF9JTklUSUFMX09GRlNFVC0zKSk7CisJCQlfX2Z1bmNfXywgc2l6ZSwgKGNvdW50LUdTUF9JTklUSUFMX09GRlNFVC0zKSk7CiAJCXJldHVybiAtRUlOVlBLVDsKIAl9CiAKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCS8vIHNhbml0eSBjaGVjaywgcmVtb3ZlIGFmdGVyIHRlc3QgLi4uCiAJaWYgKChfX3U4KikmKHVzYmRhdGFbM10pICE9IHJlY3BrdCkgewogCQlkYmcoIiVzIC0gcHRyIG1pc21hdGNoICVwIC0gJXAiLAotCQkJX19GVU5DVElPTl9fLCAmKHVzYmRhdGFbNF0pLCByZWNwa3QpOworCQkJX19mdW5jX18sICYodXNiZGF0YVs0XSksIHJlY3BrdCk7CiAJCXJldHVybiAtRUlOVlBLVDsKIAl9CiAKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCiAJaWYgKCgweGZmICYgKGNrc3VtICsgKnJlY3BrdCkpICE9IDApIHsKIAkJZGJnKCIlcyAtIGludmFsaWQgY2hlY2tzdW0sIGV4cGVjdGVkICUwMngsIGdvdCAlMDJ4IiwKLQkJCV9fRlVOQ1RJT05fXywgMHhmZiAmIC1ja3N1bSwgMHhmZiAmICpyZWNwa3QpOworCQkJX19mdW5jX18sIDB4ZmYgJiAtY2tzdW0sIDB4ZmYgJiAqcmVjcGt0KTsKIAkJcmV0dXJuIC1FSU5WUEtUOwogCX0KIApAQCAtNTE5LDcgKzUxOSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCiAJZGJnKCIlcyAtIGRsZT0lZCBza2lwPSVkIHNpemU9JWQgY291bnQ9JWQiLAotCQlfX0ZVTkNUSU9OX18sIGRsZVNlZW4sIHNraXAsIHNpemUsIGNvdW50KTsKKwkJX19mdW5jX18sIGRsZVNlZW4sIHNraXAsIHNpemUsIGNvdW50KTsKIAogCWlmIChzaXplID09IDApIHsKIAkJc2l6ZSA9IEdTUF9JTklUSUFMX09GRlNFVDsKQEAgLTU3OCw3ICs1NzgsNyBAQAogCQl9CiAKIAkJaWYgKHNpemUgPj0gR1BTX0lOX0JVRlNJWikgewotCQkJZGJnKCIlcyAtIHBhY2tldCB0b28gbGFyZ2UuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwYWNrZXQgdG9vIGxhcmdlLiIsIF9fZnVuY19fKTsKIAkJCXNraXAgPSAxOwogCQkJc2l6ZSA9IEdTUF9JTklUSUFMX09GRlNFVDsKIAkJCWRsZVNlZW4gPSAwOwpAQCAtNjM0LDcgKzYzNCw3IEBACiAJaW50IGk9MDsKIAlpbnQgazsKIAotCWRiZygiJXMgLSBzdGF0ZSAlZCAtICVkIGJ5dGVzLiIsIF9fRlVOQ1RJT05fXywKKwlkYmcoIiVzIC0gc3RhdGUgJWQgLSAlZCBieXRlcy4iLCBfX2Z1bmNfXywKIAkgICAgICAgICBnYXJtaW5fZGF0YV9wLT5zdGF0ZSwgY291bnQpOwogCiAJayA9IGdhcm1pbl9kYXRhX3AtPm91dHNpemU7CkBAIC02NTgsMTMgKzY1OCwxMyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkYmcoIiVzIC0gJWQgYnl0ZXMgaW4gYnVmZmVyLCAlZCBieXRlcyBpbiBwa3QuIiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgLSAlZCBieXRlcyBpbiBidWZmZXIsICVkIGJ5dGVzIGluIHBrdC4iLCBfX2Z1bmNfXywKIAkgICAgICAgICBrLCBpKTsKIAogCS8qIGdhcm1pbl9kYXRhX3AtPm91dGJ1ZmZlciBub3cgY29udGFpbnMgYSBjb21wbGV0ZSBwYWNrZXQgKi8KIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmdhcm1pbl9kYXRhX3AtPnBvcnQtPmRldiwKLQkJICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaywgZ2FybWluX2RhdGFfcC0+b3V0YnVmZmVyKTsKKwkJICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBrLCBnYXJtaW5fZGF0YV9wLT5vdXRidWZmZXIpOwogCiAJZ2FybWluX2RhdGFfcC0+b3V0c2l6ZSA9IDA7CiAKQEAgLTc0OSw3ICs3NDksNyBAQAogCXN0cnVjdCBnYXJtaW5fcGFja2V0ICpwa3QgPSBOVUxMOwogCiAJd2hpbGUgKChwa3QgPSBwa3RfcG9wKGdhcm1pbl9kYXRhX3ApKSAhPSBOVUxMKSB7Ci0JCWRiZygiJXMgLSBuZXh0IHBrdDogJWQiLCBfX0ZVTkNUSU9OX18sIHBrdC0+c2VxKTsKKwkJZGJnKCIlcyAtIG5leHQgcGt0OiAlZCIsIF9fZnVuY19fLCBwa3QtPnNlcSk7CiAJCWlmIChnc3Bfc2VuZChnYXJtaW5fZGF0YV9wLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSkgPiAwKSB7CiAJCQlrZnJlZShwa3QpOwogCQkJcmV0dXJuOwpAQCAtNzk0LDcgKzc5NCw3IEBACiAJCWlmIChsZW4gPj0gR1BTX0lOX0JVRlNJWikgewogCQkJLyogc2VlbSB0byBiZSBhbiBpbnZhbGlkIHBhY2tldCwgaWdub3JlIHJlc3Qgb2YgaW5wdXQgKi8KIAkJCWRiZygiJXMgLSBwYWNrZXQgc2l6ZSB0b28gbGFyZ2U6ICVkIiwKLQkJCSAgICAgICAgX19GVU5DVElPTl9fLCBsZW4pOworCQkJICAgICAgICBfX2Z1bmNfXywgbGVuKTsKIAkJCWdhcm1pbl9kYXRhX3AtPmluc2l6ZSA9IDA7CiAJCQljb3VudCA9IDA7CiAJCQlyZXN1bHQgPSAtRUlOVlBLVDsKQEAgLTg3MywxMSArODczLDExIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCiAJdXNiX2tpbGxfdXJiIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKLQlkYmcoIiVzIC0gdXNiX3Jlc2V0X2RldmljZSIsIF9fRlVOQ1RJT05fXyApOworCWRiZygiJXMgLSB1c2JfcmVzZXRfZGV2aWNlIiwgX19mdW5jX18gKTsKIAlzdGF0dXMgPSB1c2JfcmVzZXRfZGV2aWNlKHBvcnQtPnNlcmlhbC0+ZGV2KTsKIAlpZiAoc3RhdHVzKQogCQlkYmcoIiVzIC0gdXNiX3Jlc2V0X2RldmljZSBmYWlsZWQ6ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTkyNiwxOCArOTI2LDE4IEBACiAJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCXVzYl9raWxsX3VyYiAocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CiAKLQkJZGJnKCIlcyAtIGFkZGluZyBpbnRlcnJ1cHQgaW5wdXQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gYWRkaW5nIGludGVycnVwdCBpbnB1dCIsIF9fZnVuY19fKTsKIAkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOwogCQlpZiAoc3RhdHVzKQogCQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwKIAkJCSAgICAgICAgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiwiCiAJCQkJIiBlcnJvciAlZFxuIiwKLQkJCSAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJICAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAlpZiAoc3RhdHVzID09IDApIHsKLQkJZGJnKCIlcyAtIHN0YXJ0aW5nIHNlc3Npb24gLi4uIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0YXJ0aW5nIHNlc3Npb24gLi4uIiwgX19mdW5jX18pOwogCQlnYXJtaW5fZGF0YV9wLT5zdGF0ZSA9IFNUQVRFX0FDVElWRTsKIAkJc3RhdHVzID0gZ2FybWluX3dyaXRlX2J1bGsocG9ydCwgR0FSTUlOX1NUQVJUX1NFU1NJT05fUkVRLAogCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0FSTUlOX1NUQVJUX1NFU1NJT05fUkVRKSwKQEAgLTk3Niw3ICs5NzYsNyBAQAogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyoKIAkgKiBGb3JjZSBsb3dfbGF0ZW5jeSBvbiBzbyB0aGF0IG91ciB0dHlfcHVzaCBhY3R1YWxseSBmb3JjZXMgdGhlIGRhdGEKQEAgLTEwMTMsNyArMTAxMyw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQgLSBtb2RlPSVkIHN0YXRlPSVkIGZsYWdzPTB4JVgiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlcyAtIHBvcnQgJWQgLSBtb2RlPSVkIHN0YXRlPSVkIGZsYWdzPTB4JVgiLCBfX2Z1bmNfXywKIAkJcG9ydC0+bnVtYmVyLCBnYXJtaW5fZGF0YV9wLT5tb2RlLAogCQlnYXJtaW5fZGF0YV9wLT5zdGF0ZSwgZ2FybWluX2RhdGFfcC0+ZmxhZ3MpOwogCkBAIC0xMDQ2LDEzICsxMDQ2LDEzIEBACiBzdGF0aWMgdm9pZCBnYXJtaW5fd3JpdGVfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJaWYgKHBvcnQpIHsKIAkJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCQlpZiAoR0FSTUlOX0xBWUVSSURfQVBQTCA9PSBnZXRMYXllcklkKHVyYi0+dHJhbnNmZXJfYnVmZmVyKQogCQkgICAgJiYgKGdhcm1pbl9kYXRhX3AtPm1vZGUgPT0gTU9ERV9HQVJNSU5fU0VSSUFMKSkgIHsKQEAgLTEwNjEsNyArMTA2MSw3IEBACiAKIAkJaWYgKHN0YXR1cykgewogCQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IENMRUFSX0hBTFRfUkVRVUlSRUQ7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CkBAIC0xMDg4LDcgKzEwODgsNyBAQAogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsCisJZGJnKCIlcyAtIHBvcnQgJWQsIHN0YXRlICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwKIAkJZ2FybWluX2RhdGFfcC0+c3RhdGUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKQEAgLTExMTAsNyArMTExMCw3IEBACiAKIAltZW1jcHkgKGJ1ZmZlciwgYnVmLCBjb3VudCk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ1ZmZlcik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgY291bnQsIGJ1ZmZlcik7CiAKIAl1c2JfZmlsbF9idWxrX3VyYiAodXJiLCBzZXJpYWwtPmRldiwKIAkJCSAJdXNiX3NuZGJ1bGtwaXBlIChzZXJpYWwtPmRldiwKQEAgLTExMzQsNyArMTEzNCw3IEBACiAJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJICAgICAgICAiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSAiCiAJCSAgICAgICAgImZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJY291bnQgPSBzdGF0dXM7CiAJfQogCkBAIC0xMTU0LDcgKzExNTQsNyBAQAogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJX19sZTMyICpwcml2cGt0ID0gKF9fbGUzMiAqKWdhcm1pbl9kYXRhX3AtPnByaXZwa3Q7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ1Zik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgY291bnQsIGJ1Zik7CiAKIAkvKiBjaGVjayBmb3Igb3VyIHByaXZhdGUgcGFja2V0cyAqLwogCWlmIChjb3VudCA+PSBHQVJNSU5fUEtUSERSX0xFTkdUSCkgewpAQCAtMTE3Miw3ICsxMTcyLDcgQEAKIAkJICAgICYmIEdBUk1JTl9MQVlFUklEX1BSSVZBVEUgPT0gZ2V0TGF5ZXJJZChnYXJtaW5fZGF0YV9wLT5wcml2cGt0KSkgewogCiAJCQlkYmcoIiVzIC0gcHJvY2Vzc2luZyBwcml2YXRlIHJlcXVlc3QgJWQiLAotCQkJCV9fRlVOQ1RJT05fXywgcGt0aWQpOworCQkJCV9fZnVuY19fLCBwa3RpZCk7CiAKIAkJCS8vIGRyb3AgYWxsIHVuZmluaXNoZWQgdHJhbnNmZXJzCiAJCQlnYXJtaW5fY2xlYXIoZ2FybWluX2RhdGFfcCk7CkBAIC0xMTg0LDcgKzExODQsNyBAQAogCQkJCQlyZXR1cm4gLUVJTlZQS1Q7CiAJCQkJZGVidWcgPSBfX2xlMzJfdG9fY3B1KHByaXZwa3RbM10pOwogCQkJCWRiZygiJXMgLSBkZWJ1ZyBsZXZlbCBzZXQgdG8gMHglWCIsCi0JCQkJCV9fRlVOQ1RJT05fXywgZGVidWcpOworCQkJCQlfX2Z1bmNfXywgZGVidWcpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIFBSSVZfUEtUSURfU0VUX01PREU6CkBAIC0xMTkyLDcgKzExOTIsNyBAQAogCQkJCQlyZXR1cm4gLUVJTlZQS1Q7CiAJCQkJZ2FybWluX2RhdGFfcC0+bW9kZSA9IF9fbGUzMl90b19jcHUocHJpdnBrdFszXSk7CiAJCQkJZGJnKCIlcyAtIG1vZGUgc2V0IHRvICVkIiwKLQkJCQkJX19GVU5DVElPTl9fLCBnYXJtaW5fZGF0YV9wLT5tb2RlKTsKKwkJCQkJX19mdW5jX18sIGdhcm1pbl9kYXRhX3AtPm1vZGUpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIFBSSVZfUEtUSURfSU5GT19SRVE6CkBAIC0xMjA4LDcgKzEyMDgsNyBAQAogCQkJCQlyZXR1cm4gLUVJTlZQS1Q7CiAJCQkJaW5pdGlhbF9tb2RlID0gX19sZTMyX3RvX2NwdShwcml2cGt0WzNdKTsKIAkJCQlkYmcoIiVzIC0gaW5pdGlhbF9tb2RlIHNldCB0byAlZCIsCi0JCQkJCV9fRlVOQ1RJT05fXywKKwkJCQkJX19mdW5jX18sCiAJCQkJCWdhcm1pbl9kYXRhX3AtPm1vZGUpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTI1NSw3ICsxMjU1LDcgQEAKIHsKIAlpZiAoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19EUk9QX0RBVEEpIHsKIAkJLyogYWJvcnQtdHJhbnNmZXIgY21kIGlzIGFjdGljZSAqLwotCQlkYmcoIiVzIC0gcGt0IGRyb3BwZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcGt0IGRyb3BwZWQiLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIGlmIChnYXJtaW5fZGF0YV9wLT5zdGF0ZSAhPSBTVEFURV9ESVNDT05ORUNURUQgJiYKIAkgICAgICAgICAgIGdhcm1pbl9kYXRhX3AtPnN0YXRlICE9IFNUQVRFX1JFU0VUICkgewogCkBAIC0xMjg2LDI4ICsxMjg2LDI4IEBACiBzdGF0aWMgdm9pZCBnYXJtaW5fcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gIHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IHJldHZhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXNlcmlhbCkgewotCQlkYmcoIiVzIC0gYmFkIHNlcmlhbCBwb2ludGVyLCBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCBzZXJpYWwgcG9pbnRlciwgZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKIAl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIAotCQkJCV9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwkJCQlfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCWdhcm1pbl9yZWFkX3Byb2Nlc3MoZ2FybWluX2RhdGFfcCwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIApAQCAtMTMyMCw3ICsxMzIwLDcgQEAKIAkJaWYgKHJldHZhbCkKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJX19mdW5jX18sIHJldHZhbCk7CiAJfSBlbHNlIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CiAJCS8qIENvbnRpbnVlIHRyeWluZyB0byByZWFkIHVudGlsIG5vdGhpbmcgbW9yZSBpcyByZWNlaXZlZCAgKi8KIAkJaWYgKDAgPT0gKGdhcm1pbl9kYXRhX3AtPmZsYWdzICYgRkxBR1NfVEhST1RUTEVEKSkgewpAQCAtMTMyOCwxMCArMTMyOCwxMCBAQAogCQkJaWYgKHJldHZhbCkKIAkJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJCSIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsICIKLQkJCQkJImVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJCSJlcnJvciAlZFxuIiwgX19mdW5jX18sIHJldHZhbCk7CiAJCX0KIAl9IGVsc2UgewotCQlkYmcoIiVzIC0gZW5kIG9mIGJ1bGsgZGF0YSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBlbmQgb2YgYnVsayBkYXRhIiwgX19mdW5jX18pOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQlnYXJtaW5fZGF0YV9wLT5mbGFncyAmPSB+RkxBR1NfQlVMS19JTl9BQ1RJVkU7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKQEAgLTEzNDQsNyArMTM0NCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsOwotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0xMzU5LDIyICsxMzU5LDIyIEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywKIAkJCQl1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gc2l6ZW9mKEdBUk1JTl9CVUxLX0lOX0FWQUlMX1JFUExZKSAmJgogCSAgICAwID09IG1lbWNtcChkYXRhLCBHQVJNSU5fQlVMS19JTl9BVkFJTF9SRVBMWSwKIAkJICAgICAgICBzaXplb2YoR0FSTUlOX0JVTEtfSU5fQVZBSUxfUkVQTFkpKSkgewogCi0JCWRiZygiJXMgLSBidWxrIGRhdGEgYXZhaWxhYmxlLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBidWxrIGRhdGEgYXZhaWxhYmxlLiIsIF9fZnVuY19fKTsKIAogCQlpZiAoMCA9PSAoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19CVUxLX0lOX0FDVElWRSkpIHsKIApAQCAtMTM4OSw3ICsxMzg5LDcgQEAKIAkJCWlmIChyZXR2YWwpIHsKIAkJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJX19mdW5jX18sIHJldHZhbCk7CiAJCQl9IGVsc2UgewogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCQkJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgfD0gRkxBR1NfQlVMS19JTl9BQ1RJVkU7CkBAIC0xNDE3LDE0ICsxNDE3LDE0IEBACiAJCQk9IF9fbGUzMl90b19jcHVwKChfX2xlMzIqKShkYXRhK0dBUk1JTl9QS1RIRFJfTEVOR1RIKSk7CiAKIAkJZGJnKCIlcyAtIHN0YXJ0LW9mLXNlc3Npb24gcmVwbHkgc2VlbiAtIHNlcmlhbCAldS4iLAotCQkJX19GVU5DVElPTl9fLCBnYXJtaW5fZGF0YV9wLT5zZXJpYWxfbnVtKTsKKwkJCV9fZnVuY19fLCBnYXJtaW5fZGF0YV9wLT5zZXJpYWxfbnVtKTsKIAl9CiAKIAlpZiAoZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cykgewogCQkvKiB0aGlzIHJlcGx5IGJlbG9uZ3MgdG8gYSByZXF1ZXN0IGdlbmVyYXRlZCBieSB0aGUgZHJpdmVyLAogCQkgICBpZ25vcmUgaXQuICovCiAJCWRiZygiJXMgLSBwa3QgaWdub3JlZCAoJWQpIiwKLQkJCV9fRlVOQ1RJT05fXywgZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cyk7CisJCQlfX2Z1bmNfXywgZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cyk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCWdhcm1pbl9kYXRhX3AtPmlnbm9yZVBrdHMtLTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwpAQCAtMTQzNyw3ICsxNDM3LDcgQEAKIAlpZiAocmV0dmFsKQogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAogCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJX19mdW5jX18sIHJldHZhbCk7CiB9CiAKIApAQCAtMTQ3Myw3ICsxNDczLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCS8qIHNldCBmbGFnLCBkYXRhIHJlY2VpdmVkIHdpbGwgYmUgcHV0IGludG8gYSBxdWV1ZQogCSAgIGZvciBsYXRlciBwcm9jZXNzaW5nICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKQEAgLTE0ODgsNyArMTQ4OCw3IEBACiAJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCWdhcm1pbl9kYXRhX3AtPmZsYWdzICY9IH5GTEFHU19USFJPVFRMRUQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwpAQCAtMTUwMyw3ICsxNTAzLDcgQEAKIAkJaWYgKHN0YXR1cykKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJfQogfQogCkBAIC0xNTMyLDExICsxNTMyLDExIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wID0gTlVMTDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlnYXJtaW5fZGF0YV9wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdhcm1pbl9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGdhcm1pbl9kYXRhX3AgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaW5pdF90aW1lcigmZ2FybWluX2RhdGFfcC0+dGltZXIpOwpAQCAtMTU2MSw3ICsxNTYxLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJdXNiX2tpbGxfdXJiIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKIAlkZWxfdGltZXJfc3luYygmZ2FybWluX2RhdGFfcC0+dGltZXIpOwpAQCAtMTU3OSw5ICsxNTc5LDYgQEAKIAkuZGVzY3JpcHRpb24gICAgICAgICA9ICJHYXJtaW4gR1BTIHVzYi90dHkiLAogCS51c2JfZHJpdmVyICAgICAgICAgID0gJmdhcm1pbl9kcml2ZXIsCiAJLmlkX3RhYmxlICAgICAgICAgICAgPSBpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiAgICA9IDEsCi0JLm51bV9idWxrX2luICAgICAgICAgPSAxLAotCS5udW1fYnVsa19vdXQgICAgICAgID0gMSwKIAkubnVtX3BvcnRzICAgICAgICAgICA9IDEsCiAJLm9wZW4gICAgICAgICAgICAgICAgPSBnYXJtaW5fb3BlbiwKIAkuY2xvc2UgICAgICAgICAgICAgICA9IGdhcm1pbl9jbG9zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCmluZGV4IDdjZmNlOWQuLjUzN2YxMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwpAQCAtNjIsOSArNjIsNiBAQAogCX0sCiAJLmlkX3RhYmxlID0JCWdlbmVyaWNfZGV2aWNlX2lkcywKIAkudXNiX2RyaXZlciA9IAkJJmdlbmVyaWNfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luID0JTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ID0JCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5zaHV0ZG93biA9CQl1c2Jfc2VyaWFsX2dlbmVyaWNfc2h1dGRvd24sCiAJLnRocm90dGxlID0JCXVzYl9zZXJpYWxfZ2VuZXJpY190aHJvdHRsZSwKQEAgLTEyMSw3ICsxMTgsNyBAQAogCWludCByZXN1bHQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogZm9yY2UgbG93X2xhdGVuY3kgb24gc28gdGhhdCBvdXIgdHR5X3B1c2ggYWN0dWFsbHkgZm9yY2VzIHRoZSBkYXRhIHRocm91Z2gsIAogCSAgIG90aGVyd2lzZSBpdCBpcyBzY2hlZHVsZWQsIGFuZCB3aXRoIGhpZ2ggZGF0YSByYXRlcyAobGlrZSB3aXRoIE9IQ0kpIGRhdGEKQEAgLTE0OCw3ICsxNDUsNyBAQAogCQkJCSAgIHBvcnQpOwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXN1bHQpCi0JCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTU5LDcgKzE1Niw3IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc2VyaWFsLT5kZXYpIHsKIAkJLyogc2h1dGRvd24gYW55IGJ1bGsgcmVhZHMgdGhhdCBtaWdodCBiZSBnb2luZyBvbiAqLwpAQCAtMTk3LDcgKzE5NCw3IEBACiAKIHZvaWQgdXNiX3NlcmlhbF9nZW5lcmljX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAlnZW5lcmljX2NsZWFudXAgKHBvcnQpOwogfQogCkBAIC0yMDcsMTAgKzIwNCwxMCBAQAogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuICgwKTsKIAl9CiAKQEAgLTIyMCw3ICsyMTcsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCQlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKQEAgLTIzMCw3ICsyMjcsNyBAQAogCiAJCW1lbWNweSAocG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgY291bnQpOwogCQlkYXRhID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwgZGF0YSk7CisJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCBkYXRhKTsKIAogCQkvKiBzZXQgdXAgb3VyIHVyYiAqLwogCQl1c2JfZmlsbF9idWxrX3VyYiAocG9ydC0+d3JpdGVfdXJiLCBzZXJpYWwtPmRldiwKQEAgLTI0NSw3ICsyNDIsNyBAQAogCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDE7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCS8qIGRvbid0IGhhdmUgdG8gZ3JhYiB0aGUgbG9jayBoZXJlLCBhcyB3ZSB3aWxsIHJldHJ5IGlmICE9IDAgKi8KIAkJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAkJfSBlbHNlCkBAIC0yNjMsMTUgKzI2MCwxNiBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJaW50IHJvb20gPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAorCS8qIEZJWE1FOiBMb2NraW5nICovCiAJaWYgKHNlcmlhbC0+bnVtX2J1bGtfb3V0KSB7CiAJCWlmICghKHBvcnQtPndyaXRlX3VyYl9idXN5KSkKIAkJCXJvb20gPSBwb3J0LT5idWxrX291dF9zaXplOwogCX0KIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKLQlyZXR1cm4gKHJvb20pOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIHJvb20pOworCXJldHVybiByb29tOwogfQogCiBpbnQgdXNiX3NlcmlhbF9nZW5lcmljX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKQEAgLTI3OSwxNCArMjc3LDE1IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlpbnQgY2hhcnMgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAorCS8qIEZJWE1FOiBMb2NraW5nICovCiAJaWYgKHNlcmlhbC0+bnVtX2J1bGtfb3V0KSB7CiAJCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJCWNoYXJzID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwogCX0KIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiAoY2hhcnMpOwogfQogCkBAIC0zMDgsNyArMzA3LDcgQEAKIAkJCSAgICAgdXNiX3NlcmlhbF9nZW5lcmljX3JlYWRfYnVsa19jYWxsYmFjayksIHBvcnQpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgbWVtX2ZsYWdzKTsKIAlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogfQogCiAvKiBQdXNoIGRhdGEgdG8gdHR5IGxheWVyIGFuZCByZXN1Ym1pdCB0aGUgYnVsayByZWFkIFVSQiAqLwpAQCAtMzMyLDIwICszMzEsMjAgQEAKIAogdm9pZCB1c2Jfc2VyaWFsX2dlbmVyaWNfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJLyogVGhyb3R0bGUgdGhlIGRldmljZSBpZiByZXF1ZXN0ZWQgYnkgdHR5ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKQEAgLTM2MCwxOCArMzU5LDE3IEBACiAKIHZvaWQgdXNiX3NlcmlhbF9nZW5lcmljX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQotCiAJdXNiX3NlcmlhbF9wb3J0X3NvZnRpbnQocG9ydCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGVfYnVsa19jYWxsYmFjayk7CkBAIC0zODAsNyArMzc4LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIFNldCB0aGUgdGhyb3R0bGUgcmVxdWVzdCBmbGFnLiBJdCB3aWxsIGJlIHBpY2tlZCB1cAogCSAqIGJ5IHVzYl9zZXJpYWxfZ2VuZXJpY19yZWFkX2J1bGtfY2FsbGJhY2soKS4gKi8KQEAgLTM5NCw3ICszOTIsNyBAQAogCWludCB3YXNfdGhyb3R0bGVkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogQ2xlYXIgdGhlIHRocm90dGxlIGZsYWdzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKQEAgLTQxMiw3ICs0MTAsNyBAQAogewogCWludCBpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIHN0b3AgcmVhZHMgYW5kIHdyaXRlcyBvbiBhbGwgcG9ydHMgKi8KIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9ocDR4LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaHA0eC5jCmluZGV4IDZjNmViYWUuLjc1Yjg4YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9ocDR4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2hwNHguYwpAQCAtNTAsOSArNTAsNiBAQAogCX0sCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAogCS51c2JfZHJpdmVyID0gCQkmaHA0OWdwX2RyaXZlciwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMgPQkJMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKaW5kZXggMzQyOGNjYy4uY2UyZTQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKQEAgLTM3MSw3ICszNzEsNyBAQAogCXN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgU3RyaW5nRGVzYzsKIAlzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICpwU3RyaW5nRGVzYzsKIAotCWRiZygiJXMgLSBVU0IgU3RyaW5nIElEID0gJWQiLCBfX0ZVTkNUSU9OX18sIElkICk7CisJZGJnKCIlcyAtIFVTQiBTdHJpbmcgSUQgPSAlZCIsIF9fZnVuY19fLCBJZCApOwogCiAJaWYgKCF1c2JfZ2V0X2Rlc2NyaXB0b3IoZGV2LCBVU0JfRFRfU1RSSU5HLCBJZCwgJlN0cmluZ0Rlc2MsIHNpemVvZihTdHJpbmdEZXNjKSkpIHsKIAkJcmV0dXJuIDA7CkBAIC0zOTEsNyArMzkxLDcgQEAKIAl1bmljb2RlX3RvX2FzY2lpKHN0cmluZywgYnVmbGVuLCBwU3RyaW5nRGVzYy0+d0RhdGEsIHBTdHJpbmdEZXNjLT5iTGVuZ3RoLzIpOwogCiAJa2ZyZWUocFN0cmluZ0Rlc2MpOwotCWRiZygiJXMgLSBVU0IgU3RyaW5nICVzIiwgX19GVU5DVElPTl9fLCBzdHJpbmcpOworCWRiZygiJXMgLSBVU0IgU3RyaW5nICVzIiwgX19mdW5jX18sIHN0cmluZyk7CiAJcmV0dXJuIHN0cmxlbihzdHJpbmcpOwogfQogCkBAIC00MDcsNyArNDA3LDcgQEAKIAlzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yIFN0cmluZ0Rlc2M7CiAJc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqcFN0cmluZ0Rlc2M7CiAKLQlkYmcoIiVzIC0gVVNCIFN0cmluZyBJRCA9ICVkIiwgX19GVU5DVElPTl9fLCBJZCApOworCWRiZygiJXMgLSBVU0IgU3RyaW5nIElEID0gJWQiLCBfX2Z1bmNfXywgSWQgKTsKIAogCWlmICghdXNiX2dldF9kZXNjcmlwdG9yKGRldiwgVVNCX0RUX1NUUklORywgSWQsICZTdHJpbmdEZXNjLCBzaXplb2YoU3RyaW5nRGVzYykpKSB7CiAJCXJldHVybiAwOwpAQCAtNTM3LDcgKzUzNyw3IEBACiAJCQkJIHNpemVvZihzdHJ1Y3QgZWRnZV9jb21wYXRpYmlsaXR5X2Rlc2NyaXB0b3IpLAogCQkJCSAzMDApOwogCi0JZGJnKCIlcyByZXN1bHQgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwlkYmcoIiVzIHJlc3VsdCA9ICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlpZiAocmVzdWx0ID4gMCkgewogCQllcC0+aXNfZXBpYyA9IDE7CkBAIC01ODksNyArNTg5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGVkZ2VfaW50ZXJydXB0X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbAkqZWRnZV9zZXJpYWwgPSAoc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsCSplZGdlX3NlcmlhbCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0OwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwpAQCAtNjAxLDcgKzYwMSw3IEBACiAJaW50IHJlc3VsdDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CkBAIC02MTIsMzUgKzYxMiwzNSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJLy8gcHJvY2VzcyB0aGlzIGludGVycnVwdC1yZWFkIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHBvcnRzIG9wZW4KIAlpZiAobGVuZ3RoKSB7Ci0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX0ZVTkNUSU9OX18sIGxlbmd0aCwgZGF0YSk7CisJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX2Z1bmNfXywgbGVuZ3RoLCBkYXRhKTsKIAogCQlpZiAobGVuZ3RoID4gMSkgewogCQkJYnl0ZXNfYXZhaWwgPSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCk7CiAJCQlpZiAoYnl0ZXNfYXZhaWwpIHsKIAkJCQlzcGluX2xvY2soJmVkZ2Vfc2VyaWFsLT5lc19sb2NrKTsKIAkJCQllZGdlX3NlcmlhbC0+cnhCeXRlc0F2YWlsICs9IGJ5dGVzX2F2YWlsOwotCQkJCWRiZygiJXMgLSBieXRlc19hdmFpbD0lZCwgcnhCeXRlc0F2YWlsPSVkLCByZWFkX2luX3Byb2dyZXNzPSVkIiwgX19GVU5DVElPTl9fLCBieXRlc19hdmFpbCwgZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNBdmFpbCwgZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MpOworCQkJCWRiZygiJXMgLSBieXRlc19hdmFpbD0lZCwgcnhCeXRlc0F2YWlsPSVkLCByZWFkX2luX3Byb2dyZXNzPSVkIiwgX19mdW5jX18sIGJ5dGVzX2F2YWlsLCBlZGdlX3NlcmlhbC0+cnhCeXRlc0F2YWlsLCBlZGdlX3NlcmlhbC0+cmVhZF9pbl9wcm9ncmVzcyk7CiAKIAkJCQlpZiAoZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNBdmFpbCA+IDAgJiYKIAkJCQkgICAgIWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzKSB7Ci0JCQkJCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fZnVuY19fKTsKIAkJCQkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSB0cnVlOwogCiAJCQkJCS8qIHdlIGhhdmUgcGVuZGluZyBieXRlcyBvbiB0aGUgYnVsayBpbiBwaXBlLCBzZW5kIGEgcmVxdWVzdCAqLwogCQkJCQllZGdlX3NlcmlhbC0+cmVhZF91cmItPmRldiA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldjsKIAkJCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoZWRnZV9zZXJpYWwtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJCQkJaWYgKHJlc3VsdCkgewotCQkJCQkJZGV2X2VycigmZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkIHdpdGggcmVzdWx0ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJCWRldl9lcnIoJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCB3aXRoIHJlc3VsdCA9ICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCQkJCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gZmFsc2U7CiAJCQkJCX0KIAkJCQl9CkBAIC02NTksNyArNjU5LDcgQEAKIAkJCQkJc3Bpbl9sb2NrKCZlZGdlX3BvcnQtPmVwX2xvY2spOwogCQkJCQllZGdlX3BvcnQtPnR4Q3JlZGl0cyArPSB0eENyZWRpdHM7CiAJCQkJCXNwaW5fdW5sb2NrKCZlZGdlX3BvcnQtPmVwX2xvY2spOwotCQkJCQlkYmcoIiVzIC0gdHhjcmVkaXRzIGZvciBwb3J0JWQgPSAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydE51bWJlciwgZWRnZV9wb3J0LT50eENyZWRpdHMpOworCQkJCQlkYmcoIiVzIC0gdHhjcmVkaXRzIGZvciBwb3J0JWQgPSAlZCIsIF9fZnVuY19fLCBwb3J0TnVtYmVyLCBlZGdlX3BvcnQtPnR4Q3JlZGl0cyk7CiAKIAkJCQkJLyogdGVsbCB0aGUgdHR5IGRyaXZlciB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLwogCQkJCQlpZiAoZWRnZV9wb3J0LT5wb3J0LT50dHkpCkBAIC02NzcsNyArNjc3LDcgQEAKIGV4aXQ6CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGNvbnRyb2wgdXJiXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgY29udHJvbCB1cmJcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0KIH0KIApAQCAtNjg5LDQ5ICs2ODksNDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGVkZ2VfYnVsa19pbl9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwJKmVkZ2Vfc2VyaWFsID0gKHN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbAkqZWRnZV9zZXJpYWwgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhcgkJKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQJCQlyZXR2YWw7CiAJX191MTYJCQlyYXdfZGF0YV9sZW5ndGg7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gZmFsc2U7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApIHsKLQkJZGJnKCIlcyAtIHJlYWQgYnVsayBjYWxsYmFjayB3aXRoIG5vIGRhdGEiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcmVhZCBidWxrIGNhbGxiYWNrIHdpdGggbm8gZGF0YSIsIF9fZnVuY19fKTsKIAkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAkJcmV0dXJuOwogCX0KIAogCXJhd19kYXRhX2xlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX0ZVTkNUSU9OX18sIHJhd19kYXRhX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsIF9fZnVuY19fLCByYXdfZGF0YV9sZW5ndGgsIGRhdGEpOwogCiAJc3Bpbl9sb2NrKCZlZGdlX3NlcmlhbC0+ZXNfbG9jayk7CiAKIAkvKiBkZWNyZW1lbnQgb3VyIHJ4Qnl0ZXMgYXZhaWxhYmxlIGJ5IHRoZSBudW1iZXIgdGhhdCB3ZSBqdXN0IGdvdCAqLwogCWVkZ2Vfc2VyaWFsLT5yeEJ5dGVzQXZhaWwgLT0gcmF3X2RhdGFfbGVuZ3RoOwogCi0JZGJnKCIlcyAtIFJlY2VpdmVkID0gJWQsIHJ4Qnl0ZXNBdmFpbCAlZCIsIF9fRlVOQ1RJT05fXywgcmF3X2RhdGFfbGVuZ3RoLCBlZGdlX3NlcmlhbC0+cnhCeXRlc0F2YWlsKTsKKwlkYmcoIiVzIC0gUmVjZWl2ZWQgPSAlZCwgcnhCeXRlc0F2YWlsICVkIiwgX19mdW5jX18sIHJhd19kYXRhX2xlbmd0aCwgZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNBdmFpbCk7CiAKIAlwcm9jZXNzX3JjdmRfZGF0YSAoZWRnZV9zZXJpYWwsIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbnkgbW9yZSBkYXRhIGZvciB1cyB0byByZWFkICovCiAJaWYgKGVkZ2Vfc2VyaWFsLT5yeEJ5dGVzQXZhaWwgPiAwKSB7Ci0JCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fZnVuY19fKTsKIAkJZWRnZV9zZXJpYWwtPnJlYWRfdXJiLT5kZXYgPSBlZGdlX3NlcmlhbC0+c2VyaWFsLT5kZXY7CiAJCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGVkZ2Vfc2VyaWFsLT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIocmVhZCBidWxrKSBmYWlsZWQsICIKLQkJCQkicmV0dmFsID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCQkicmV0dmFsID0gJWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOwogCQkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCX0gZWxzZSB7CkBAIC03NDksMTUgKzc0OSwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgZWRnZV9idWxrX291dF9kYXRhX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IChzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCX0KIAogCXR0eSA9IGVkZ2VfcG9ydC0+cG9ydC0+dHR5OwpAQCAtNzgyLDE0ICs3ODIsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGVkZ2VfYnVsa19vdXRfY21kX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IChzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWF0b21pY19kZWMoJkNtZFVyYnMpOwotCWRiZygiJXMgLSBGUkVFIFVSQiAlcCAob3V0c3RhbmRpbmcgJWQpIiwgX19GVU5DVElPTl9fLCB1cmIsIGF0b21pY19yZWFkKCZDbWRVcmJzKSk7CisJZGJnKCIlcyAtIEZSRUUgVVJCICVwIChvdXRzdGFuZGluZyAlZCkiLCBfX2Z1bmNfXywgdXJiLCBhdG9taWNfcmVhZCgmQ21kVXJicykpOwogCiAKIAkvKiBjbGVhbiB1cCB0aGUgdHJhbnNmZXIgYnVmZmVyICovCkBAIC03OTksNyArNzk5LDcgQEAKIAl1c2JfZnJlZV91cmIgKHVyYik7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTgzMyw3ICs4MzMsNyBAQAogCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKmVkZ2Vfc2VyaWFsOwogCWludCByZXNwb25zZTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtODgzLDcgKzg4Myw3IEBACiAJCSAqIHRoaXMgaW50ZXJydXB0IHdpbGwgY29udGludWUgYXMgbG9uZyBhcyB0aGUgZWRnZXBvcnQgaXMgY29ubmVjdGVkICovCiAJCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIgKGVkZ2Vfc2VyaWFsLT5pbnRlcnJ1cHRfcmVhZF91cmIsIEdGUF9LRVJORUwpOwogCQlpZiAocmVzcG9uc2UpIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwgX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgY29udHJvbCB1cmJcbiIsIF9fZnVuY19fLCByZXNwb25zZSk7CiAJCX0KIAl9CiAJCkBAIC05MDcsNyArOTA3LDcgQEAKIAlyZXNwb25zZSA9IHNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX09QRU5fUE9SVCwgMCk7CiAKIAlpZiAocmVzcG9uc2UgPCAwKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZXJyb3Igc2VuZGluZyBvcGVuIHBvcnQgY29tbWFuZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBlcnJvciBzZW5kaW5nIG9wZW4gcG9ydCBjb21tYW5kXG4iLCBfX2Z1bmNfXyk7CiAJCWVkZ2VfcG9ydC0+b3BlblBlbmRpbmcgPSBmYWxzZTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtOTE3LDcgKzkxNyw3IEBACiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewogCQkvKiBvcGVuIHRpbWVkIG91dCAqLwotCQlkYmcoIiVzIC0gb3BlbiB0aW1lZG91dCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBvcGVuIHRpbWVkb3V0IiwgX19mdW5jX18pOwogCQllZGdlX3BvcnQtPm9wZW5QZW5kaW5nID0gZmFsc2U7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTkzMCw3ICs5MzAsNyBAQAogCWVkZ2VfcG9ydC0+dHhmaWZvLmZpZm8JPSBrbWFsbG9jIChlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cywgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWVkZ2VfcG9ydC0+dHhmaWZvLmZpZm8pIHsKLQkJZGJnKCIlcyAtIG5vIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyBtZW1vcnkiLCBfX2Z1bmNfXyk7CiAJCWVkZ2VfY2xvc2UgKHBvcnQsIGZpbHApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC05NDAsMTQgKzk0MCwxNCBAQAogCWVkZ2VfcG9ydC0+d3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAogCWlmICghZWRnZV9wb3J0LT53cml0ZV91cmIpIHsKLQkJZGJnKCIlcyAtIG5vIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyBtZW1vcnkiLCBfX2Z1bmNfXyk7CiAJCWVkZ2VfY2xvc2UgKHBvcnQsIGZpbHApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkYmcoIiVzKCVkKSAtIEluaXRpYWxpemUgVFggZmlmbyB0byAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyk7CisJZGJnKCIlcyglZCkgLSBJbml0aWFsaXplIFRYIGZpZm8gdG8gJWQgYnl0ZXMiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyk7CiAKLQlkYmcoIiVzIGV4aXRlZCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyBleGl0ZWQiLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk3NiwxMSArOTc2LDExIEBACiAKIAkJLy8gRGlkIHdlIGdldCBvdXIgQ2hhc2UgcmVzcG9uc2UKIAkJaWYgKCFlZGdlX3BvcnQtPmNoYXNlUmVzcG9uc2VQZW5kaW5nKSB7Ci0JCQlkYmcoIiVzIC0gR290IENoYXNlIFJlc3BvbnNlIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBHb3QgQ2hhc2UgUmVzcG9uc2UiLCBfX2Z1bmNfXyk7CiAKIAkJCS8vIGRpZCB3ZSBnZXQgYWxsIG9mIG91ciBjcmVkaXQgYmFjaz8KIAkJCWlmIChlZGdlX3BvcnQtPnR4Q3JlZGl0cyA9PSBlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyApIHsKLQkJCQlkYmcoIiVzIC0gR290IGFsbCBjcmVkaXRzIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gR290IGFsbCBjcmVkaXRzIiwgX19mdW5jX18pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQpAQCAtOTk1LDEyICs5OTUsMTIgQEAKIAkJCWxvb3AtLTsKIAkJCWlmIChsb29wID09IDApIHsKIAkJCQllZGdlX3BvcnQtPmNoYXNlUmVzcG9uc2VQZW5kaW5nID0gZmFsc2U7Ci0JCQkJZGJnKCIlcyAtIENoYXNlIFRJTUVPVVQiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBDaGFzZSBUSU1FT1VUIiwgX19mdW5jX18pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8vIFJlc2V0IHRpbWVvdXQgdmFsdWUgYmFjayB0byAxMCBzZWNvbmRzCi0JCQlkYmcoIiVzIC0gTGFzdCAlZCwgQ3VycmVudCAlZCIsIF9fRlVOQ1RJT05fXywgbGFzdENyZWRpdHMsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzKTsKKwkJCWRiZygiJXMgLSBMYXN0ICVkLCBDdXJyZW50ICVkIiwgX19mdW5jX18sIGxhc3RDcmVkaXRzLCBlZGdlX3BvcnQtPnR4Q3JlZGl0cyk7CiAJCQlsb29wID0gMTA7CiAJCX0KIAl9CkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogCiAJCS8vIElzIHRoZSBFZGdlcG9ydCBCdWZmZXIgZW1wdHk/CiAJCWlmIChsYXN0Q291bnQgPT0gMCkgewotCQkJZGJnKCIlcyAtIFRYIEJ1ZmZlciBFbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gVFggQnVmZmVyIEVtcHR5IiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTEwNDAsMTMgKzEwNDAsMTMgQEAKIAkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKIAkJZmluaXNoX3dhaXQoJmVkZ2VfcG9ydC0+d2FpdF9jaGFzZSwgJndhaXQpOwogCi0JCWRiZygiJXMgd2FpdCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgd2FpdCIsIF9fZnVuY19fKTsKIAogCQlpZiAobGFzdENvdW50ID09IGZpZm8tPmNvdW50KSB7CiAJCQkvLyBObyBhY3Rpdml0eS4uIGNvdW50IGRvd24uCiAJCQlsb29wLS07CiAJCQlpZiAobG9vcCA9PSAwKSB7Ci0JCQkJZGJnKCIlcyAtIFRJTUVPVVQiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBUSU1FT1VUIiwgX19mdW5jX18pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydDsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCSAKIAllZGdlX3NlcmlhbCA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKIAllZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0xMDg1LDcgKzEwODUsNyBAQAogCQkvKiBmbHVzaCBhbmQgY2hhc2UgKi8KIAkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IHRydWU7CiAKLQkJZGJnKCIlcyAtIFNlbmRpbmcgSU9TUF9DTURfQ0hBU0VfUE9SVCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NIQVNFX1BPUlQiLCBfX2Z1bmNfXyk7CiAJCXN0YXR1cyA9IHNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX0NIQVNFX1BPUlQsIDApOwogCQlpZiAoc3RhdHVzID09IDApIHsKIAkJCS8vIGJsb2NrIHVudGlsIGNoYXNlIGZpbmlzaGVkCkBAIC0xMDk5LDcgKzEwOTksNyBAQAogCSAgICAoKGVkZ2Vfc2VyaWFsLT5pc19lcGljKSAmJgogCSAgICAgKGVkZ2Vfc2VyaWFsLT5lcGljX2Rlc2NyaXB0b3IuU3VwcG9ydHMuSU9TUENsb3NlKSkpIHsKIAkgICAgICAgLyogY2xvc2UgdGhlIHBvcnQgKi8KLQkJZGJnKCIlcyAtIFNlbmRpbmcgSU9TUF9DTURfQ0xPU0VfUE9SVCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NMT1NFX1BPUlQiLCBfX2Z1bmNfXyk7CiAJCXNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX0NMT1NFX1BPUlQsIDApOwogCX0KIApAQCAtMTExOSw3ICsxMTE5LDcgQEAKIAlrZnJlZShlZGdlX3BvcnQtPnR4Zmlmby5maWZvKTsKIAllZGdlX3BvcnQtPnR4Zmlmby5maWZvID0gTlVMTDsKIAotCWRiZygiJXMgZXhpdGVkIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIGV4aXRlZCIsIF9fZnVuY19fKTsKIH0gICAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTM5LDcgKzExMzksNyBAQAogCWludCBzZWNvbmRoYWxmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTExNTIsMTIgKzExNTIsMTIgQEAKIAkvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHB1dCBpbiBmaWZvCiAJY29weVNpemUgPSBtaW4gKCh1bnNpZ25lZCBpbnQpY291bnQsIChlZGdlX3BvcnQtPnR4Q3JlZGl0cyAtIGZpZm8tPmNvdW50KSk7CiAKLQlkYmcoIiVzKCVkKSBvZiAlZCBieXRlKHMpIEZpZm8gcm9vbSAgJWQgLS0gd2lsbCBjb3B5ICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLCAKKwlkYmcoIiVzKCVkKSBvZiAlZCBieXRlKHMpIEZpZm8gcm9vbSAgJWQgLS0gd2lsbCBjb3B5ICVkIGJ5dGVzIiwgX19mdW5jX18sCiAJICAgIHBvcnQtPm51bWJlciwgY291bnQsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzIC0gZmlmby0+Y291bnQsIGNvcHlTaXplKTsKIAogCS8qIGNhdGNoIHdyaXRlcyBvZiAwIGJ5dGVzIHdoaWNoIHRoZSB0dHkgZHJpdmVyIGxpa2VzIHRvIGdpdmUgdXMsIGFuZCB3aGVuIHR4Q3JlZGl0cyBpcyBlbXB0eSAqLwogCWlmIChjb3B5U2l6ZSA9PSAwKSB7Ci0JCWRiZygiJXMgLSBjb3B5U2l6ZSA9IFplcm8iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gY29weVNpemUgPSBaZXJvIiwgX19mdW5jX18pOwogCQlnb3RvIGZpbmlzaF93cml0ZTsKIAl9CiAKQEAgLTExNjksMTEgKzExNjksMTEgQEAKIAogCWJ5dGVzbGVmdCA9IGZpZm8tPnNpemUgLSBmaWZvLT5oZWFkOwogCWZpcnN0aGFsZiA9IG1pbiAoYnl0ZXNsZWZ0LCBjb3B5U2l6ZSk7Ci0JZGJnKCIlcyAtIGNvcHkgJWQgYnl0ZXMgb2YgJWQgaW50byBmaWZvICIsIF9fRlVOQ1RJT05fXywgZmlyc3RoYWxmLCBieXRlc2xlZnQpOworCWRiZygiJXMgLSBjb3B5ICVkIGJ5dGVzIG9mICVkIGludG8gZmlmbyAiLCBfX2Z1bmNfXywgZmlyc3RoYWxmLCBieXRlc2xlZnQpOwogCiAJLyogbm93IGNvcHkgb3VyIGRhdGEgKi8KIAltZW1jcHkoJmZpZm8tPmZpZm9bZmlmby0+aGVhZF0sIGRhdGEsIGZpcnN0aGFsZik7Ci0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGZpcnN0aGFsZiwgJmZpZm8tPmZpZm9bZmlmby0+aGVhZF0pOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGZpcnN0aGFsZiwgJmZpZm8tPmZpZm9bZmlmby0+aGVhZF0pOwogCiAJLy8gdXBkYXRlIHRoZSBpbmRleCBhbmQgc2l6ZQogCWZpZm8tPmhlYWQgICs9IGZpcnN0aGFsZjsKQEAgLTExODcsOSArMTE4Nyw5IEBACiAJc2Vjb25kaGFsZiA9IGNvcHlTaXplLWZpcnN0aGFsZjsKIAogCWlmIChzZWNvbmRoYWxmKSB7Ci0JCWRiZygiJXMgLSBjb3B5IHJlc3Qgb2YgZGF0YSAlZCIsIF9fRlVOQ1RJT05fXywgc2Vjb25kaGFsZik7CisJCWRiZygiJXMgLSBjb3B5IHJlc3Qgb2YgZGF0YSAlZCIsIF9fZnVuY19fLCBzZWNvbmRoYWxmKTsKIAkJbWVtY3B5KCZmaWZvLT5maWZvW2ZpZm8tPmhlYWRdLCAmZGF0YVtmaXJzdGhhbGZdLCBzZWNvbmRoYWxmKTsKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHNlY29uZGhhbGYsICZmaWZvLT5maWZvW2ZpZm8tPmhlYWRdKTsKKwkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgc2Vjb25kaGFsZiwgJmZpZm8tPmZpZm9bZmlmby0+aGVhZF0pOwogCQkvLyB1cGRhdGUgdGhlIGluZGV4IGFuZCBzaXplCiAJCWZpZm8tPmNvdW50ICs9IHNlY29uZGhhbGY7CiAJCWZpZm8tPmhlYWQgICs9IHNlY29uZGhhbGY7CkBAIC0xMjAxLDcgKzEyMDEsNyBAQAogCiAJc2VuZF9tb3JlX3BvcnRfZGF0YSgoc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbCAqKXVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKSwgZWRnZV9wb3J0KTsKIAotCWRiZygiJXMgd3JvdGUgJWQgYnl0ZShzKSBUeENyZWRpdHMgJWQsIEZpZm8gJWQiLCBfX0ZVTkNUSU9OX18sIGNvcHlTaXplLCBlZGdlX3BvcnQtPnR4Q3JlZGl0cywgZmlmby0+Y291bnQpOworCWRiZygiJXMgd3JvdGUgJWQgYnl0ZShzKSBUeENyZWRpdHMgJWQsIEZpZm8gJWQiLCBfX2Z1bmNfXywgY29weVNpemUsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzLCBmaWZvLT5jb3VudCk7CiAKIAlyZXR1cm4gY29weVNpemU7ICAgCiB9CkBAIC0xMjMyLDE0ICsxMjMyLDE0IEBACiAJaW50CQlzZWNvbmRoYWxmOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLQlkYmcoIiVzKCVkKSIsIF9fRlVOQ1RJT05fXywgZWRnZV9wb3J0LT5wb3J0LT5udW1iZXIpOworCWRiZygiJXMoJWQpIiwgX19mdW5jX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAogCWlmIChlZGdlX3BvcnQtPndyaXRlX2luX3Byb2dyZXNzIHx8CiAJICAgICFlZGdlX3BvcnQtPm9wZW4gICAgICAgICAgICAgfHwKIAkgICAgKGZpZm8tPmNvdW50ID09IDApKSB7Ci0JCWRiZygiJXMoJWQpIEVYSVQgLSBmaWZvICVkLCBQZW5kaW5nV3JpdGUgPSAlZCIsIF9fRlVOQ1RJT05fXywgZWRnZV9wb3J0LT5wb3J0LT5udW1iZXIsIGZpZm8tPmNvdW50LCBlZGdlX3BvcnQtPndyaXRlX2luX3Byb2dyZXNzKTsKKwkJZGJnKCIlcyglZCkgRVhJVCAtIGZpZm8gJWQsIFBlbmRpbmdXcml0ZSA9ICVkIiwgX19mdW5jX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBmaWZvLT5jb3VudCwgZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyk7CiAJCWdvdG8gZXhpdF9zZW5kOwogCX0KIApAQCAtMTI1MSw3ICsxMjUxLDcgQEAKIAkvLwlpdCdzIGJldHRlciB0byB3YWl0IGZvciBtb3JlIGNyZWRpdHMgc28gd2UgY2FuIGRvIGEgbGFyZ2VyCiAJLy8Jd3JpdGUuCiAJaWYgKGVkZ2VfcG9ydC0+dHhDcmVkaXRzIDwgRURHRV9GV19HRVRfVFhfQ1JFRElUU19TRU5EX1RIUkVTSE9MRChlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyxFREdFX0ZXX0JVTEtfTUFYX1BBQ0tFVF9TSVpFKSkgewotCQlkYmcoIiVzKCVkKSBOb3QgZW5vdWdoIGNyZWRpdCAtIGZpZm8gJWQgVHhDcmVkaXQgJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBmaWZvLT5jb3VudCwgZWRnZV9wb3J0LT50eENyZWRpdHMgKTsKKwkJZGJnKCIlcyglZCkgTm90IGVub3VnaCBjcmVkaXQgLSBmaWZvICVkIFR4Q3JlZGl0ICVkIiwgX19mdW5jX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBmaWZvLT5jb3VudCwgZWRnZV9wb3J0LT50eENyZWRpdHMgKTsKIAkJZ290byBleGl0X3NlbmQ7CiAJfQogCkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCWNvdW50ID0gZmlmby0+Y291bnQ7CiAJYnVmZmVyID0ga21hbGxvYyAoY291bnQrMiwgR0ZQX0FUT01JQyk7CiAJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCAiJXMgLSBubyBtb3JlIGtlcm5lbCBtZW1vcnkuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCAiJXMgLSBubyBtb3JlIGtlcm5lbCBtZW1vcnkuLi5cbiIsIF9fZnVuY19fKTsKIAkJZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCQlnb3RvIGV4aXRfc2VuZDsKIAl9CkBAIC0xMjk0LDcgKzEyOTQsNyBAQAogCX0KIAogCWlmIChjb3VudCkKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmZWRnZV9wb3J0LT5wb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsICZidWZmZXJbMl0pOworCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZlZGdlX3BvcnQtPnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCAmYnVmZmVyWzJdKTsKIAogCS8qIGZpbGwgdXAgdGhlIHVyYiB3aXRoIGFsbCBvZiBvdXIgZGF0YSBhbmQgc3VibWl0IGl0ICovCiAJdXNiX2ZpbGxfYnVsa191cmIgKHVyYiwgZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LCAKQEAgLTEzMDksMTQgKzEzMDksMTQgQEAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcgKi8KLQkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQsIGRhdGEgbG9zdFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCwgZGF0YSBsb3N0XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCiAJCS8qIHJldmVydCB0aGUgY3JlZGl0cyBhcyBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLiAqLwogCQllZGdlX3BvcnQtPnR4Q3JlZGl0cyArPSBjb3VudDsKIAkJZWRnZV9wb3J0LT5pY291bnQudHggLT0gY291bnQ7CiAJfQotCWRiZygiJXMgd3JvdGUgJWQgYnl0ZShzKSBUeENyZWRpdCAlZCwgRmlmbyAlZCIsIF9fRlVOQ1RJT05fXywgY291bnQsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzLCBmaWZvLT5jb3VudCk7CisJZGJnKCIlcyB3cm90ZSAlZCBieXRlKHMpIFR4Q3JlZGl0ICVkLCBGaWZvICVkIiwgX19mdW5jX18sIGNvdW50LCBlZGdlX3BvcnQtPnR4Q3JlZGl0cywgZmlmby0+Y291bnQpOwogCiBleGl0X3NlbmQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CkBAIC0xMzM3LDE3ICsxMzM3LDE3IEBACiAJaW50IHJvb207CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCWlmIChlZGdlX3BvcnQtPmNsb3NlUGVuZGluZykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFlZGdlX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTM1Niw3ICsxMzU2LDcgQEAKIAlyb29tID0gZWRnZV9wb3J0LT50eENyZWRpdHMgLSBlZGdlX3BvcnQtPnR4Zmlmby5jb3VudDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIH0KIApAQCAtMTM3Niw3ICsxMzc2LDcgQEAKIAlpbnQgbnVtX2NoYXJzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEzODQsNyArMTM4NCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKCFlZGdlX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTM5Miw3ICsxMzkyLDcgQEAKIAludW1fY2hhcnMgPSBlZGdlX3BvcnQtPm1heFR4Q3JlZGl0cyAtIGVkZ2VfcG9ydC0+dHhDcmVkaXRzICsgZWRnZV9wb3J0LT50eGZpZm8uY291bnQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CiAJaWYgKG51bV9jaGFycykgewotCQlkYmcoIiVzKHBvcnQgJWQpIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBudW1fY2hhcnMpOworCQlkYmcoIiVzKHBvcnQgJWQpIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIG51bV9jaGFycyk7CiAJfQogCiAJcmV0dXJuIG51bV9jaGFyczsKQEAgLTE0MTAsMTkgKzE0MTAsMTkgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBzdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE0NTksMTkgKzE0NTksMTkgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBzdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE1MDksMTggKzE1MDksMTggQEAKIAl1bnNpZ25lZCBpbnQgY2ZsYWc7CiAKIAljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQlkYmcoIiVzIC0gY2xmYWcgJTA4eCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLCAKKwlkYmcoIiVzIC0gY2xmYWcgJTA4eCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZywgdHR5LT50ZXJtaW9zLT5jX2lmbGFnKTsKLQlkYmcoIiVzIC0gb2xkIGNsZmFnICUwOHggb2xkIGlmbGFnICUwOHgiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlcyAtIG9sZCBjbGZhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIG9sZF90ZXJtaW9zLT5jX2NmbGFnLCBvbGRfdGVybWlvcy0+Y19pZmxhZyk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTU0OSw3ICsxNTQ5LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CiAJaWYgKGVkZ2VfcG9ydC0+bWF4VHhDcmVkaXRzID09IGVkZ2VfcG9ydC0+dHhDcmVkaXRzICYmCiAJICAgIGVkZ2VfcG9ydC0+dHhmaWZvLmNvdW50ID09IDApIHsKLQkJZGJnKCIlcyAtLSBFbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLS0gRW1wdHkiLCBfX2Z1bmNfXyk7CiAJCXJlc3VsdCA9IFRJT0NTRVJfVEVNVDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CkBAIC0xNTY5LDcgKzE1NjksNyBAQAogCiAJcmVzdWx0ID0gdHR5LT5yZWFkX2NudDsKIAotCWRiZygiJXMoJWQpID0gJWQiLCBfX0ZVTkNUSU9OX18sICBlZGdlX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwlkYmcoIiVzKCVkKSA9ICVkIiwgX19mdW5jX18sICBlZGdlX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKIAlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCS8vcmV0dXJuIDA7CkBAIC0xNTgxLDcgKzE1ODEsNyBAQAogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgaW50IG1jcjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAltY3IgPSBlZGdlX3BvcnQtPnNoYWRvd01DUjsKIAlpZiAoc2V0ICYgVElPQ01fUlRTKQpAQCAtMTYxMiw3ICsxNjEyLDcgQEAKIAl1bnNpZ25lZCBpbnQgbXNyOwogCXVuc2lnbmVkIGludCBtY3I7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJbXNyID0gZWRnZV9wb3J0LT5zaGFkb3dNU1I7CiAJbWNyID0gZWRnZV9wb3J0LT5zaGFkb3dNQ1I7CkBAIC0xNjI0LDcgKzE2MjQsNyBAQAogCQkgIHwgKChtc3IgJiBFREdFUE9SVF9NU1JfRFNSKQk/IFRJT0NNX0RTUjogMCk7ICAvKiAweDEwMCAqLwogCiAKLQlkYmcoIiVzIC0tICV4IiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCWRiZygiJXMgLS0gJXgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xNjcwLDMwICsxNjcwLDMwIEBACiAJc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldjsKIAlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBpY291bnQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgPSAweCV4IiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJCS8vIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlCiAJCWNhc2UgVElPQ0lOUToKLQkJCWRiZygiJXMgKCVkKSBUSU9DSU5RIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgKCVkKSBUSU9DSU5RIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOwogCQkJcmV0dXJuIGdldF9udW1iZXJfYnl0ZXNfYXZhaWwoZWRnZV9wb3J0LCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DU0VSR0VUTFNSOgotCQkJZGJnKCIlcyAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCQlyZXR1cm4gZ2V0X2xzcl9pbmZvKGVkZ2VfcG9ydCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKTsKIAkJCXJldHVybiAwOwogCiAJCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCQlkYmcoIiVzICglZCkgVElPQ0dTRVJJQUwiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAoJWQpIFRJT0NHU0VSSUFMIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOwogCQkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhlZGdlX3BvcnQsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKikgYXJnKTsKIAogCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJZGJnKCIlcyAoJWQpIFRJT0NTU0VSSUFMIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVElPQ01JV0FJVDoKLQkJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOwogCQkJY3ByZXYgPSBlZGdlX3BvcnQtPmljb3VudDsKIAkJCXdoaWxlICgxKSB7CiAJCQkJcHJlcGFyZV90b193YWl0KCZlZGdlX3BvcnQtPmRlbHRhX21zcl93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKQEAgLTE3MzIsNyArMTczMiw3IEBACiAJCQlpY291bnQuYnJrID0gY25vdy5icms7CiAJCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOwogCi0JCQlkYmcoIiVzICglZCkgVElPQ0dJQ09VTlQgUlg9JWQsIFRYPSVkIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyLCBpY291bnQucngsIGljb3VudC50eCApOworCQkJZGJnKCIlcyAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyLCBpY291bnQucngsIGljb3VudC50eCApOwogCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpY291bnQsIHNpemVvZihpY291bnQpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAwOwpAQCAtMTc1OCw3ICsxNzU4LDcgQEAKIAkJLyogZmx1c2ggYW5kIGNoYXNlICovCiAJCWVkZ2VfcG9ydC0+Y2hhc2VSZXNwb25zZVBlbmRpbmcgPSB0cnVlOwogCi0JCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NIQVNFX1BPUlQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gU2VuZGluZyBJT1NQX0NNRF9DSEFTRV9QT1JUIiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSBzZW5kX2lvc3BfZXh0X2NtZCAoZWRnZV9wb3J0LCBJT1NQX0NNRF9DSEFTRV9QT1JULCAwKTsKIAkJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCQkvLyBibG9jayB1bnRpbCBjaGFzZSBmaW5pc2hlZApAQCAtMTc3MiwxNCArMTc3MiwxNCBAQAogCSAgICAoKGVkZ2Vfc2VyaWFsLT5pc19lcGljKSAmJgogCSAgICAgKGVkZ2Vfc2VyaWFsLT5lcGljX2Rlc2NyaXB0b3IuU3VwcG9ydHMuSU9TUFNldENsckJyZWFrKSkpIHsKIAkJaWYgKGJyZWFrX3N0YXRlID09IC0xKSB7Ci0JCQlkYmcoIiVzIC0gU2VuZGluZyBJT1NQX0NNRF9TRVRfQlJFQUsiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIFNlbmRpbmcgSU9TUF9DTURfU0VUX0JSRUFLIiwgX19mdW5jX18pOwogCQkJc3RhdHVzID0gc2VuZF9pb3NwX2V4dF9jbWQgKGVkZ2VfcG9ydCwgSU9TUF9DTURfU0VUX0JSRUFLLCAwKTsKIAkJfSBlbHNlIHsKLQkJCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NMRUFSX0JSRUFLIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBTZW5kaW5nIElPU1BfQ01EX0NMRUFSX0JSRUFLIiwgX19mdW5jX18pOwogCQkJc3RhdHVzID0gc2VuZF9pb3NwX2V4dF9jbWQgKGVkZ2VfcG9ydCwgSU9TUF9DTURfQ0xFQVJfQlJFQUssIDApOwogCQl9CiAJCWlmIChzdGF0dXMpIHsKLQkJCWRiZygiJXMgLSBlcnJvciBzZW5kaW5nIGJyZWFrIHNldC9jbGVhciBjb21tYW5kLiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gZXJyb3Igc2VuZGluZyBicmVhayBzZXQvY2xlYXIgY29tbWFuZC4iLCBfX2Z1bmNfXyk7CiAJCX0KIAl9CiAKQEAgLTE3OTksMTQgKzE3OTksMTQgQEAKIAlfX3UxNiBsYXN0QnVmZmVyTGVuZ3RoOwogCV9fdTE2IHJ4TGVuOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWxhc3RCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGggKyAxOwogCiAJd2hpbGUgKGJ1ZmZlckxlbmd0aCA+IDApIHsKIAkJLyogZmFpbHNhZmUgaW5jYXNlIHdlIGdldCBhIG1lc3NhZ2UgdGhhdCB3ZSBkb24ndCB1bmRlcnN0YW5kICovCiAJCWlmIChsYXN0QnVmZmVyTGVuZ3RoID09IGJ1ZmZlckxlbmd0aCkgewotCQkJZGJnKCIlcyAtIHN0dWNrIGluIGxvb3AsIGV4aXRpbmcgaXQuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBzdHVjayBpbiBsb29wLCBleGl0aW5nIGl0LiIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCQl9CiAJCWxhc3RCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CkBAIC0xODI4LDcgKzE4MjgsNyBAQAogCQkJCSsrYnVmZmVyOwogCQkJCS0tYnVmZmVyTGVuZ3RoOwogCi0JCQkJZGJnKCIlcyAtIEhkcjE9JTAyWCBIZHIyPSUwMlgiLCBfX0ZVTkNUSU9OX18sIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjEsIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjIpOworCQkJCWRiZygiJXMgLSBIZHIxPSUwMlggSGRyMj0lMDJYIiwgX19mdW5jX18sIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjEsIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjIpOwogCiAJCQkJLy8gUHJvY2VzcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIGhlYWRlciBpcwogCQkJCS8vIGRhdGEgb3Igc3RhdHVzCkBAIC0xODU4LDcgKzE4NTgsNyBAQAogCQkJCQllZGdlX3NlcmlhbC0+cnhQb3J0ID0gSU9TUF9HRVRfSERSX1BPUlQoZWRnZV9zZXJpYWwtPnJ4SGVhZGVyMSk7CiAJCQkJCWVkZ2Vfc2VyaWFsLT5yeEJ5dGVzUmVtYWluaW5nID0gSU9TUF9HRVRfSERSX0RBVEFfTEVOKGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjEsIGVkZ2Vfc2VyaWFsLT5yeEhlYWRlcjIpOwogCi0JCQkJCWRiZygiJXMgLSBEYXRhIGZvciBQb3J0ICV1IExlbiAldSIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNSZW1haW5pbmcpOworCQkJCQlkYmcoIiVzIC0gRGF0YSBmb3IgUG9ydCAldSBMZW4gJXUiLCBfX2Z1bmNfXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNSZW1haW5pbmcpOwogCiAJCQkJCS8vQVNTRVJUKCBEZXZFeHQtPlJ4UG9ydCA8IERldkV4dC0+TnVtUG9ydHMgKTsKIAkJCQkJLy9BU1NFUlQoIERldkV4dC0+UnhCeXRlc1JlbWFpbmluZyA8IElPU1BfTUFYX0RBVEFfTEVOR1RIICk7CkBAIC0xODkxLDcgKzE4OTEsNyBAQAogCQkJCQlpZiAoZWRnZV9wb3J0LT5vcGVuKSB7CiAJCQkJCQl0dHkgPSBlZGdlX3BvcnQtPnBvcnQtPnR0eTsKIAkJCQkJCWlmICh0dHkpIHsKLQkJCQkJCQlkYmcoIiVzIC0gU2VuZGluZyAlZCBieXRlcyB0byBUVFkgZm9yIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHJ4TGVuLCBlZGdlX3NlcmlhbC0+cnhQb3J0KTsKKwkJCQkJCQlkYmcoIiVzIC0gU2VuZGluZyAlZCBieXRlcyB0byBUVFkgZm9yIHBvcnQgJWQiLCBfX2Z1bmNfXywgcnhMZW4sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQpOwogCQkJCQkJCWVkZ2VfdHR5X3JlY3YoJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCB0dHksIGJ1ZmZlciwgcnhMZW4pOwogCQkJCQkJfQogCQkJCQkJZWRnZV9wb3J0LT5pY291bnQucnggKz0gcnhMZW47CkBAIC0xOTMwLDE3ICsxOTMwLDE3IEBACiAJcG9ydCA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPnBvcnRbZWRnZV9zZXJpYWwtPnJ4UG9ydF07CiAJZWRnZV9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmIChlZGdlX3BvcnQgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZlZGdlX3NlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gZWRnZV9wb3J0ID09IE5VTEwgZm9yIHBvcnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCk7CisJCWRldl9lcnIoJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBlZGdlX3BvcnQgPT0gTlVMTCBmb3IgcG9ydCAlZFxuIiwgX19mdW5jX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQpOwogCQlyZXR1cm47CiAJfQogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQpOwogCiAJaWYgKGNvZGUgPT0gSU9TUF9FWFRfU1RBVFVTKSB7CiAJCXN3aXRjaCAoYnl0ZTIpIHsKIAkJCWNhc2UgSU9TUF9FWFRfU1RBVFVTX0NIQVNFX1JTUDoKIAkJCQkvLyB3ZSB3YW50IHRvIGRvIEVYVCBzdGF0dXMgcmVnYXJkbGVzcyBvZiBwb3J0IG9wZW4vY2xvc2VkIAotCQkJCWRiZygiJXMgLSBQb3J0ICV1IEVYVCBDSEFTRV9SU1AgRGF0YSA9ICUwMngiLCBfX0ZVTkNUSU9OX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQsIGJ5dGUzICk7CisJCQkJZGJnKCIlcyAtIFBvcnQgJXUgRVhUIENIQVNFX1JTUCBEYXRhID0gJTAyeCIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMyApOwogCQkJCS8vIEN1cnJlbnRseSwgdGhlIG9ubHkgRVhUX1NUQVRVUyBpcyBDaGFzZSwgc28gcHJvY2VzcyBoZXJlIGluc3RlYWQgb2Ygb25lIG1vcmUgY2FsbAogCQkJCS8vIHRvIG9uZSBtb3JlIHN1YnJvdXRpbmUuIElmL3doZW4gbW9yZSBFWFRfU1RBVFVTLCB0aGVyZSdsbCBiZSBtb3JlIHdvcmsgdG8gZG8uCiAJCQkJLy8gQWxzbywgd2UgY3VycmVudGx5IGNsZWFyIGZsYWcgYW5kIGNsb3NlIHRoZSBwb3J0IHJlZ2FyZGxlc3Mgb2YgY29udGVudCBvZiBhYm92ZSdzIEJ5dGUzLgpAQCAtMTk1MSw3ICsxOTUxLDcgQEAKIAkJCQlyZXR1cm47CiAKIAkJCWNhc2UgSU9TUF9FWFRfU1RBVFVTX1JYX0NIRUNLX1JTUDoKLQkJCQlkYmcoIiVzID09PT09PT09PT0gUG9ydCAldSBDSEVDS19SU1AgU2VxdWVuY2UgPSAlMDJ4ID09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTMgKTsKKwkJCQlkYmcoIiVzID09PT09PT09PT0gUG9ydCAldSBDSEVDS19SU1AgU2VxdWVuY2UgPSAlMDJ4ID09PT09PT09PT09PT1cbiIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMyApOwogCQkJCS8vUG9ydC0+UnhDaGVja1JzcCA9IHRydWU7CiAJCQkJcmV0dXJuOwogCQl9CkBAIC0xOTYwLDcgKzE5NjAsNyBAQAogCWlmIChjb2RlID09IElPU1BfU1RBVFVTX09QRU5fUlNQKSB7CiAJCWVkZ2VfcG9ydC0+dHhDcmVkaXRzID0gR0VUX1RYX0JVRkZFUl9TSVpFKGJ5dGUzKTsKIAkJZWRnZV9wb3J0LT5tYXhUeENyZWRpdHMgPSBlZGdlX3BvcnQtPnR4Q3JlZGl0czsKLQkJZGJnKCIlcyAtIFBvcnQgJXUgT3BlbiBSZXNwb25zZSBJbml0YWwgTVNSID0gJTAyeCBUeEJ1ZmZlclNpemUgPSAlZCIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIsIGVkZ2VfcG9ydC0+dHhDcmVkaXRzKTsKKwkJZGJnKCIlcyAtIFBvcnQgJXUgT3BlbiBSZXNwb25zZSBJbml0YWwgTVNSID0gJTAyeCBUeEJ1ZmZlclNpemUgPSAlZCIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMiwgZWRnZV9wb3J0LT50eENyZWRpdHMpOwogCQloYW5kbGVfbmV3X21zciAoZWRnZV9wb3J0LCBieXRlMik7CiAKIAkJLyogc2VuZCB0aGUgY3VycmVudCBsaW5lIHNldHRpbmdzIHRvIHRoZSBwb3J0IHNvIHdlIGFyZSBpbiBzeW5jIHdpdGggYW55IGZ1cnRoZXIgdGVybWlvcyBjYWxscyAqLwpAQCAtMTk4NCwyMyArMTk4NCwyMyBAQAogCXN3aXRjaCAoY29kZSkgewogCQkvLyBOb3QgY3VycmVudGx5IHNlbnQgYnkgRWRnZXBvcnQKIAkJY2FzZSBJT1NQX1NUQVRVU19MU1I6Ci0JCQlkYmcoIiVzIC0gUG9ydCAldSBMU1IgU3RhdHVzID0gJTAyeCIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIpOworCQkJZGJnKCIlcyAtIFBvcnQgJXUgTFNSIFN0YXR1cyA9ICUwMngiLCBfX2Z1bmNfXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIpOwogCQkJaGFuZGxlX25ld19sc3IoZWRnZV9wb3J0LCBmYWxzZSwgYnl0ZTIsIDApOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJT1NQX1NUQVRVU19MU1JfREFUQToKLQkJCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4LCBEYXRhID0gJTAyeCIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIsIGJ5dGUzKTsKKwkJCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4LCBEYXRhID0gJTAyeCIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMiwgYnl0ZTMpOwogCQkJLy8gYnl0ZTIgaXMgTFNSIFJlZ2lzdGVyCiAJCQkvLyBieXRlMyBpcyBicm9rZW4gZGF0YSBieXRlCiAJCQloYW5kbGVfbmV3X2xzcihlZGdlX3BvcnQsIHRydWUsIGJ5dGUyLCBieXRlMyk7CiAJCQlicmVhazsKIAkJCS8vCiAJCQkvLwljYXNlIElPU1BfRVhUXzRfU1RBVFVTOgotCQkJLy8JCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4IERhdGEgPSAlMDJ4IiwgX19GVU5DVElPTl9fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMiwgYnl0ZTMpOworCQkJLy8JCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4IERhdGEgPSAlMDJ4IiwgX19mdW5jX18sIGVkZ2Vfc2VyaWFsLT5yeFBvcnQsIGJ5dGUyLCBieXRlMyk7CiAJCQkvLwkJYnJlYWs7CiAJCQkvLwogCQljYXNlIElPU1BfU1RBVFVTX01TUjoKLQkJCWRiZygiJXMgLSBQb3J0ICV1IE1TUiBTdGF0dXMgPSAlMDJ4IiwgX19GVU5DVElPTl9fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMik7CisJCQlkYmcoIiVzIC0gUG9ydCAldSBNU1IgU3RhdHVzID0gJTAyeCIsIF9fZnVuY19fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMik7CiAKIAkJCS8vIFByb2Nlc3MgdGhpcyBuZXcgbW9kZW0gc3RhdHVzIGFuZCBnZW5lcmF0ZSBhcHByb3ByaWF0ZQogCQkJLy8gZXZlbnRzLCBldGMsIGJhc2VkIG9uIHRoZSBuZXcgc3RhdHVzLiBUaGlzIHJvdXRpbmUKQEAgLTIwMDksNyArMjAwOSw3IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJZGJnKCIlcyAtIFVucmVjb2duaXplZCBJT1NQIHN0YXR1cyBjb2RlICV1XG4iLCBfX0ZVTkNUSU9OX18sIGNvZGUpOworCQkJZGJnKCIlcyAtIFVucmVjb2duaXplZCBJT1NQIHN0YXR1cyBjb2RlICV1XG4iLCBfX2Z1bmNfXywgY29kZSk7CiAJCQlicmVhazsKIAl9CiAKQEAgLTIwMjksNyArMjAyOSw3IEBACiAJCWNudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuZ3RoKTsKIAkJaWYgKGNudCA8IGxlbmd0aCkgewogCQkJZGV2X2VycihkZXYsICIlcyAtIGRyb3BwaW5nIGRhdGEsICVkIGJ5dGVzIGxvc3RcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgbGVuZ3RoIC0gY250KTsKKwkJCQkJX19mdW5jX18sIGxlbmd0aCAtIGNudCk7CiAJCQlpZihjbnQgPT0gMCkKIAkJCQlicmVhazsKIAkJfQpAQCAtMjA1MCw3ICsyMDUwLDcgQEAKIHsKIAlzdHJ1Y3QgIGFzeW5jX2ljb3VudCAqaWNvdW50OwogCi0JZGJnKCIlcyAlMDJ4IiwgX19GVU5DVElPTl9fLCBuZXdNc3IpOworCWRiZygiJXMgJTAyeCIsIF9fZnVuY19fLCBuZXdNc3IpOwogCiAJaWYgKG5ld01zciAmIChFREdFUE9SVF9NU1JfREVMVEFfQ1RTIHwgRURHRVBPUlRfTVNSX0RFTFRBX0RTUiB8IEVER0VQT1JUX01TUl9ERUxUQV9SSSB8IEVER0VQT1JUX01TUl9ERUxUQV9DRCkpIHsKIAkJaWNvdW50ID0gJmVkZ2VfcG9ydC0+aWNvdW50OwpAQCAtMjA4Nyw3ICsyMDg3LDcgQEAKIAlfX3U4ICAgIG5ld0xzciA9IChfX3U4KShsc3IgJiAoX191OCkoTFNSX09WRVJfRVJSIHwgTFNSX1BBUl9FUlIgfCBMU1JfRlJNX0VSUiB8IExTUl9CUkVBSykpOwogCXN0cnVjdCAgYXN5bmNfaWNvdW50ICppY291bnQ7CiAKLQlkYmcoIiVzIC0gJTAyeCIsIF9fRlVOQ1RJT05fXywgbmV3THNyKTsKKwlkYmcoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBuZXdMc3IpOwogCiAJZWRnZV9wb3J0LT5zaGFkb3dMU1IgPSBsc3I7CiAKQEAgLTIxMzYsMTEgKzIxMzYsMTEgQEAKIAlfX3UxNiBjdXJyZW50X2xlbmd0aDsKIAl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXI7CiAKLQlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fRlVOQ1RJT05fXywgZXh0QWRkciwgYWRkciwgbGVuZ3RoKTsKKwlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fZnVuY19fLCBleHRBZGRyLCBhZGRyLCBsZW5ndGgpOwogCiAJdHJhbnNmZXJfYnVmZmVyID0gIGttYWxsb2MgKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYW5zZmVyX2J1ZmZlcikgewotCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sIDY0KTsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sIDY0KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yMTUyLDcgKzIxNTIsNyBAQAogCQl9IGVsc2UgewogCQkJY3VycmVudF9sZW5ndGggPSBsZW5ndGg7CiAJCX0KLS8vCQlkYmcoIiVzIC0gd3JpdGluZyAleCwgJXgsICVkIiwgX19GVU5DVElPTl9fLCBleHRBZGRyLCBhZGRyLCBjdXJyZW50X2xlbmd0aCk7CisvLwkJZGJnKCIlcyAtIHdyaXRpbmcgJXgsICV4LCAlZCIsIF9fZnVuY19fLCBleHRBZGRyLCBhZGRyLCBjdXJyZW50X2xlbmd0aCk7CiAJCW1lbWNweSAodHJhbnNmZXJfYnVmZmVyLCBkYXRhLCBjdXJyZW50X2xlbmd0aCk7CiAJCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoc2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCksIFVTQl9SRVFVRVNUX0lPTl9XUklURV9SQU0sIAogCQkJCQkgIDB4NDAsIGFkZHIsIGV4dEFkZHIsIHRyYW5zZmVyX2J1ZmZlciwgY3VycmVudF9sZW5ndGgsIDMwMCk7CkBAIC0yMTgxLDExICsyMTgxLDExIEBACiAJX191MTYgY3VycmVudF9sZW5ndGg7CiAJdW5zaWduZWQgY2hhciAqdHJhbnNmZXJfYnVmZmVyOwogCi0vLwlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fRlVOQ1RJT05fXywgZXh0QWRkciwgYWRkciwgbGVuZ3RoKTsKKy8vCWRiZygiJXMgLSAleCwgJXgsICVkIiwgX19mdW5jX18sIGV4dEFkZHIsIGFkZHIsIGxlbmd0aCk7CiAKIAl0cmFuc2Zlcl9idWZmZXIgPSAga21hbGxvYyAoNjQsIEdGUF9LRVJORUwpOwogCWlmICghdHJhbnNmZXJfYnVmZmVyKSB7Ci0JCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIGttYWxsb2MoJWQpIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXywgNjQpOworCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgNjQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTIxOTcsNyArMjE5Nyw3IEBACiAJCX0gZWxzZSB7CiAJCQljdXJyZW50X2xlbmd0aCA9IGxlbmd0aDsKIAkJfQotLy8JCWRiZygiJXMgLSB3cml0aW5nICV4LCAleCwgJWQiLCBfX0ZVTkNUSU9OX18sIGV4dEFkZHIsIGFkZHIsIGN1cnJlbnRfbGVuZ3RoKTsKKy8vCQlkYmcoIiVzIC0gd3JpdGluZyAleCwgJXgsICVkIiwgX19mdW5jX18sIGV4dEFkZHIsIGFkZHIsIGN1cnJlbnRfbGVuZ3RoKTsKIAkJbWVtY3B5ICh0cmFuc2Zlcl9idWZmZXIsIGRhdGEsIGN1cnJlbnRfbGVuZ3RoKTsKIAkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwgVVNCX1JFUVVFU1RfSU9OX1dSSVRFX1JPTSwgCiAJCQkJCSAgMHg0MCwgYWRkciwgZXh0QWRkciwgdHJhbnNmZXJfYnVmZmVyLCBjdXJyZW50X2xlbmd0aCwgMzAwKTsKQEAgLTIyMjYsMTEgKzIyMjYsMTEgQEAKIAlfX3UxNiBjdXJyZW50X2xlbmd0aDsKIAl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXI7CiAKLQlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fRlVOQ1RJT05fXywgZXh0QWRkciwgYWRkciwgbGVuZ3RoKTsKKwlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fZnVuY19fLCBleHRBZGRyLCBhZGRyLCBsZW5ndGgpOwogCiAJdHJhbnNmZXJfYnVmZmVyID0gIGttYWxsb2MgKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYW5zZmVyX2J1ZmZlcikgewotCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBrbWFsbG9jKCVkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sIDY0KTsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sIDY0KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yMjQyLDcgKzIyNDIsNyBAQAogCQl9IGVsc2UgewogCQkJY3VycmVudF9sZW5ndGggPSBsZW5ndGg7CiAJCX0KLS8vCQlkYmcoIiVzIC0gJXgsICV4LCAlZCIsIF9fRlVOQ1RJT05fXywgZXh0QWRkciwgYWRkciwgY3VycmVudF9sZW5ndGgpOworLy8JCWRiZygiJXMgLSAleCwgJXgsICVkIiwgX19mdW5jX18sIGV4dEFkZHIsIGFkZHIsIGN1cnJlbnRfbGVuZ3RoKTsKIAkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChzZXJpYWwtPmRldiwgdXNiX3JjdmN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwgVVNCX1JFUVVFU1RfSU9OX1JFQURfUk9NLCAKIAkJCQkJICAweEMwLCBhZGRyLCBleHRBZGRyLCB0cmFuc2Zlcl9idWZmZXIsIGN1cnJlbnRfbGVuZ3RoLCAzMDApOwogCQlpZiAocmVzdWx0IDwgMCkKQEAgLTIyNjksMTEgKzIyNjksMTEgQEAKIAlpbnQgICAgICAgICAgICAgbGVuZ3RoID0gMDsKIAlpbnQgICAgICAgICAgICAgc3RhdHVzID0gMDsKIAotCWRiZygiJXMgLSAlZCwgJWQiLCBfX0ZVTkNUSU9OX18sIGNvbW1hbmQsIHBhcmFtKTsKKwlkYmcoIiVzIC0gJWQsICVkIiwgX19mdW5jX18sIGNvbW1hbmQsIHBhcmFtKTsKIAogCWJ1ZmZlciA9ICBrbWFsbG9jICgxMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIGttYWxsb2MoJWQpIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXywgMTApOworCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sIDEwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yMzA0LDcgKzIzMDQsNyBAQAogCXN0cnVjdCB1cmIgKnVyYjsKIAlpbnQgdGltZW91dDsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGxlbmd0aCwgYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZlZGdlX3BvcnQtPnBvcnQtPmRldiwgX19mdW5jX18sIGxlbmd0aCwgYnVmZmVyKTsKIAogCS8qIEFsbG9jYXRlIG91ciBuZXh0IHVyYiAqLwogCXVyYiA9IHVzYl9hbGxvY191cmIgKDAsIEdGUF9BVE9NSUMpOwpAQCAtMjMxMiw3ICsyMzEyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlhdG9taWNfaW5jKCZDbWRVcmJzKTsKLQlkYmcoIiVzIC0gQUxMT0NBVEUgVVJCICVwIChvdXRzdGFuZGluZyAlZCkiLCBfX0ZVTkNUSU9OX18sIHVyYiwgYXRvbWljX3JlYWQoJkNtZFVyYnMpKTsKKwlkYmcoIiVzIC0gQUxMT0NBVEUgVVJCICVwIChvdXRzdGFuZGluZyAlZCkiLCBfX2Z1bmNfXywgdXJiLCBhdG9taWNfcmVhZCgmQ21kVXJicykpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIgKHVyYiwgZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LCAKIAkJICAgICAgIHVzYl9zbmRidWxrcGlwZShlZGdlX3NlcmlhbC0+c2VyaWFsLT5kZXYsIGVkZ2Vfc2VyaWFsLT5idWxrX291dF9lbmRwb2ludCksCkBAIC0yMzIzLDcgKzIzMjMsNyBAQAogCiAJaWYgKHN0YXR1cykgewogCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAqLwotCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgY29tbWFuZCkgZmFpbGVkLCBzdGF0dXMgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgY29tbWFuZCkgZmFpbGVkLCBzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXVzYl9raWxsX3VyYih1cmIpOwogCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJYXRvbWljX2RlYygmQ21kVXJicyk7CkBAIC0yMzM3LDcgKzIzMzcsNyBAQAogCiAJaWYgKGVkZ2VfcG9ydC0+Y29tbWFuZFBlbmRpbmcpIHsKIAkJLyogY29tbWFuZCB0aW1lZCBvdXQgKi8KLQkJZGJnKCIlcyAtIGNvbW1hbmQgdGltZWQgb3V0IiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGNvbW1hbmQgdGltZWQgb3V0IiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSAtRUlOVkFMOwogCX0KICNlbmRpZgpAQCAtMjM2NywxOCArMjM2NywxOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkYmcoIiVzIC0gcG9ydCA9ICVkLCBiYXVkID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBiYXVkUmF0ZSk7CisJZGJnKCIlcyAtIHBvcnQgPSAlZCwgYmF1ZCA9ICVkIiwgX19mdW5jX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBiYXVkUmF0ZSk7CiAKIAlzdGF0dXMgPSBjYWxjX2JhdWRfcmF0ZV9kaXZpc29yIChiYXVkUmF0ZSwgJmRpdmlzb3IpOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIGJhZCBiYXVkIHJhdGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCAiJXMgLSBiYWQgYmF1ZCByYXRlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJLy8gQWxsb2MgbWVtb3J5IGZvciB0aGUgc3RyaW5nIG9mIGNvbW1hbmRzLgogCWNtZEJ1ZmZlciA9ICBrbWFsbG9jICgweDEwMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjbWRCdWZmZXIpIHsKLQkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIGttYWxsb2MoJWQpIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXywgMHgxMDApOworCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0ga21hbGxvYyglZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sIDB4MTAwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWN1cnJDbWQgPSBjbWRCdWZmZXI7CkBAIC0yNDE0LDcgKzI0MTQsNyBAQAogCV9fdTE2IGN1c3RvbTsKIAogCi0JZGJnKCIlcyAtICVkIiwgX19GVU5DVElPTl9fLCBiYXVkcmF0ZSk7CisJZGJnKCIlcyAtICVkIiwgX19mdW5jX18sIGJhdWRyYXRlKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRpdmlzb3JfdGFibGUpOyBpKyspIHsKIAkJaWYgKCBkaXZpc29yX3RhYmxlW2ldLkJhdWRSYXRlID09IGJhdWRyYXRlICkgewpAQCAtMjQzMiw3ICsyNDMyLDcgQEAKIAogCQkqZGl2aXNvciA9IGN1c3RvbTsKIAotCQlkYmcoIiVzIC0gQmF1ZCAlZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGJhdWRyYXRlLCBjdXN0b20pOworCQlkYmcoIiVzIC0gQmF1ZCAlZCA9ICVkXG4iLCBfX2Z1bmNfXywgYmF1ZHJhdGUsIGN1c3RvbSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjQ1Miw3ICsyNDUyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGNtZExlbiA9IDA7CiAJaW50IHN0YXR1czsKIAotCWRiZygiJXMgLSB3cml0ZSB0byAlcyByZWdpc3RlciAweCUwMngiLCAocmVnTnVtID09IE1DUikgPyAiTUNSIiA6ICJMQ1IiLCBfX0ZVTkNUSU9OX18sIHJlZ1ZhbHVlKTsKKwlkYmcoIiVzIC0gd3JpdGUgdG8gJXMgcmVnaXN0ZXIgMHglMDJ4IiwgKHJlZ051bSA9PSBNQ1IpID8gIk1DUiIgOiAiTENSIiwgX19mdW5jX18sIHJlZ1ZhbHVlKTsKIAogCWlmIChlZGdlX3NlcmlhbC0+aXNfZXBpYyAmJgogCSAgICAhZWRnZV9zZXJpYWwtPmVwaWNfZGVzY3JpcHRvci5TdXBwb3J0cy5JT1NQV3JpdGVNQ1IgJiYKQEAgLTI1MTMsMjkgKzI1MTMsMjkgQEAKIAlfX3U4IHR4RmxvdzsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBlZGdlX3BvcnQtPnBvcnQtPm51bWJlcik7CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbiAmJgogCSAgICAhZWRnZV9wb3J0LT5vcGVuUGVuZGluZykgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXR0eSA9IGVkZ2VfcG9ydC0+cG9ydC0+dHR5OwogCWlmICgoIXR0eSkgfHwKIAkgICAgKCF0dHktPnRlcm1pb3MpKSB7Ci0JCWRiZygiJXMgLSBubyB0dHkgc3RydWN0dXJlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyB0dHkgc3RydWN0dXJlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCiAJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7Ci0JCWNhc2UgQ1M1OiAgIGxEYXRhID0gTENSX0JJVFNfNTsgbWFzayA9IDB4MWY7ICAgIGRiZygiJXMgLSBkYXRhIGJpdHMgPSA1IiwgX19GVU5DVElPTl9fKTsgICBicmVhazsKLQkJY2FzZSBDUzY6ICAgbERhdGEgPSBMQ1JfQklUU182OyBtYXNrID0gMHgzZjsgICAgZGJnKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX0ZVTkNUSU9OX18pOyAgIGJyZWFrOwotCQljYXNlIENTNzogICBsRGF0YSA9IExDUl9CSVRTXzc7IG1hc2sgPSAweDdmOyAgICBkYmcoIiVzIC0gZGF0YSBiaXRzID0gNyIsIF9fRlVOQ1RJT05fXyk7ICAgYnJlYWs7CisJCWNhc2UgQ1M1OiAgIGxEYXRhID0gTENSX0JJVFNfNTsgbWFzayA9IDB4MWY7ICAgIGRiZygiJXMgLSBkYXRhIGJpdHMgPSA1IiwgX19mdW5jX18pOyAgIGJyZWFrOworCQljYXNlIENTNjogICBsRGF0YSA9IExDUl9CSVRTXzY7IG1hc2sgPSAweDNmOyAgICBkYmcoIiVzIC0gZGF0YSBiaXRzID0gNiIsIF9fZnVuY19fKTsgICBicmVhazsKKwkJY2FzZSBDUzc6ICAgbERhdGEgPSBMQ1JfQklUU183OyBtYXNrID0gMHg3ZjsgICAgZGJnKCIlcyAtIGRhdGEgYml0cyA9IDciLCBfX2Z1bmNfXyk7ICAgYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCWNhc2UgQ1M4OiAgIGxEYXRhID0gTENSX0JJVFNfODsgICAgICAgICAgICAgICAgIGRiZygiJXMgLSBkYXRhIGJpdHMgPSA4IiwgX19GVU5DVElPTl9fKTsgICBicmVhazsKKwkJY2FzZSBDUzg6ICAgbERhdGEgPSBMQ1JfQklUU184OyAgICAgICAgICAgICAgICAgZGJnKCIlcyAtIGRhdGEgYml0cyA9IDgiLCBfX2Z1bmNfXyk7ICAgYnJlYWs7CiAJfQogCiAJbFBhcml0eSA9IExDUl9QQVJfTk9ORTsKQEAgLTI1NDMsMjggKzI1NDMsMjggQEAKIAkJaWYgKGNmbGFnICYgQ01TUEFSKSB7CiAJCQlpZiAoY2ZsYWcgJiBQQVJPREQpIHsKIAkJCQlsUGFyaXR5ID0gTENSX1BBUl9NQVJLOwotCQkJCWRiZygiJXMgLSBwYXJpdHkgPSBtYXJrIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gcGFyaXR5ID0gbWFyayIsIF9fZnVuY19fKTsKIAkJCX0gZWxzZSB7CiAJCQkJbFBhcml0eSA9IExDUl9QQVJfU1BBQ0U7Ci0JCQkJZGJnKCIlcyAtIHBhcml0eSA9IHNwYWNlIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gcGFyaXR5ID0gc3BhY2UiLCBfX2Z1bmNfXyk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoY2ZsYWcgJiBQQVJPREQpIHsKIAkJCWxQYXJpdHkgPSBMQ1JfUEFSX09ERDsKLQkJCWRiZygiJXMgLSBwYXJpdHkgPSBvZGQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCWxQYXJpdHkgPSBMQ1JfUEFSX0VWRU47Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fZnVuY19fKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBhcml0eSA9IG5vbmUiLCBfX2Z1bmNfXyk7CiAJfQogCiAJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCWxTdG9wID0gTENSX1NUT1BfMjsKLQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewogCQlsU3RvcCA9IExDUl9TVE9QXzE7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJfQogCiAJLyogZmlndXJlIG91dCB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzICovCkBAIC0yNTcyLDkgKzI1NzIsOSBAQAogCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKIAkJcnhGbG93IHw9IElPU1BfUlhfRkxPV19SVFM7CiAJCXR4RmxvdyB8PSBJT1NQX1RYX0ZMT1dfQ1RTOwotCQlkYmcoIiVzIC0gUlRTL0NUUyBpcyBlbmFibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIFJUUy9DVFMgaXMgZW5hYmxlZCIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewotCQlkYmcoIiVzIC0gUlRTL0NUUyBpcyBkaXNhYmxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBSVFMvQ1RTIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOwogCX0KIAogCS8qIGlmIHdlIGFyZSBpbXBsZW1lbnRpbmcgWE9OL1hPRkYsIHNldCB0aGUgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVyIGluIHRoZSBkZXZpY2UgKi8KQEAgLTI1OTIsMTcgKzI1OTIsMTcgQEAKIAkJLyogaWYgd2UgYXJlIGltcGxlbWVudGluZyBJTkJPVU5EIFhPTi9YT0ZGICovCiAJCWlmIChJX0lYT0ZGKHR0eSkpIHsKIAkJCXJ4RmxvdyB8PSBJT1NQX1JYX0ZMT1dfWE9OX1hPRkY7Ci0JCQlkYmcoIiVzIC0gSU5CT1VORCBYT04vWE9GRiBpcyBlbmFibGVkLCBYT04gPSAlMngsIFhPRkYgPSAlMngiLCBfX0ZVTkNUSU9OX18sIHN0YXJ0X2NoYXIsIHN0b3BfY2hhcik7CisJCQlkYmcoIiVzIC0gSU5CT1VORCBYT04vWE9GRiBpcyBlbmFibGVkLCBYT04gPSAlMngsIFhPRkYgPSAlMngiLCBfX2Z1bmNfXywgc3RhcnRfY2hhciwgc3RvcF9jaGFyKTsKIAkJfSBlbHNlIHsKLQkJCWRiZygiJXMgLSBJTkJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBJTkJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOwogCQl9CiAKIAkJLyogaWYgd2UgYXJlIGltcGxlbWVudGluZyBPVVRCT1VORCBYT04vWE9GRiAqLwogCQlpZiAoSV9JWE9OKHR0eSkpIHsKIAkJCXR4RmxvdyB8PSBJT1NQX1RYX0ZMT1dfWE9OX1hPRkY7Ci0JCQlkYmcoIiVzIC0gT1VUQk9VTkQgWE9OL1hPRkYgaXMgZW5hYmxlZCwgWE9OID0gJTJ4LCBYT0ZGID0gJTJ4IiwgX19GVU5DVElPTl9fLCBzdGFydF9jaGFyLCBzdG9wX2NoYXIpOworCQkJZGJnKCIlcyAtIE9VVEJPVU5EIFhPTi9YT0ZGIGlzIGVuYWJsZWQsIFhPTiA9ICUyeCwgWE9GRiA9ICUyeCIsIF9fZnVuY19fLCBzdGFydF9jaGFyLCBzdG9wX2NoYXIpOwogCQl9IGVsc2UgewotCQkJZGJnKCIlcyAtIE9VVEJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBPVVRCT1VORCBYT04vWE9GRiBpcyBkaXNhYmxlZCIsIF9fZnVuY19fKTsKIAkJfQogCX0KIApAQCAtMjY0NSw3ICsyNjQ1LDcgQEAKIAkJYmF1ZCA9IDk2MDA7CiAJfQogCi0JZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBiYXVkKTsKKwlkYmcoIiVzIC0gYmF1ZCByYXRlID0gJWQiLCBfX2Z1bmNfXywgYmF1ZCk7CiAJc3RhdHVzID0gc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlIChlZGdlX3BvcnQsIGJhdWQpOwogCWlmIChzdGF0dXMgPT0gLTEpIHsKIAkJLyogU3BlZWQgY2hhbmdlIHdhcyBub3QgcG9zc2libGUgLSBwdXQgYmFjayB0aGUgb2xkIHNwZWVkICovCkBAIC0yODQzLDcgKzI4NDMsNyBAQAogCS8qIGNyZWF0ZSBvdXIgcHJpdmF0ZSBzZXJpYWwgc3RydWN0dXJlICovCiAJZWRnZV9zZXJpYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVkZ2Vfc2VyaWFsID09IE5VTEwpIHsKLQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJmVkZ2Vfc2VyaWFsLT5lc19sb2NrKTsKQEAgLTI4ODUsMTkgKzI4ODUsMTkgQEAKIAkJCSBzZXJpYWwtPm51bV9wb3J0cyk7CiAJfQogCi0JZGJnKCIlcyAtIHRpbWUgMSAlbGQiLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCWRiZygiJXMgLSB0aW1lIDEgJWxkIiwgX19mdW5jX18sIGppZmZpZXMpOwogCiAJLyogSWYgbm90IGFuIEVQaUMgZGV2aWNlICovCiAJaWYgKCFlZGdlX3NlcmlhbC0+aXNfZXBpYykgewogCQkvKiBub3cgbG9hZCB0aGUgYXBwbGljYXRpb24gZmlybXdhcmUgaW50byB0aGlzIGRldmljZSAqLwogCQlsb2FkX2FwcGxpY2F0aW9uX2Zpcm13YXJlIChlZGdlX3NlcmlhbCk7CiAKLQkJZGJnKCIlcyAtIHRpbWUgMiAlbGQiLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCQlkYmcoIiVzIC0gdGltZSAyICVsZCIsIF9fZnVuY19fLCBqaWZmaWVzKTsKIAogCQkvKiBDaGVjayBjdXJyZW50IEVkZ2Vwb3J0IEVFUFJPTSBhbmQgdXBkYXRlIGlmIG5lY2Vzc2FyeSAqLwogCQl1cGRhdGVfZWRnZXBvcnRfRTJQUk9NIChlZGdlX3NlcmlhbCk7CiAKLQkJZGJnKCIlcyAtIHRpbWUgMyAlbGQiLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCQlkYmcoIiVzIC0gdGltZSAzICVsZCIsIF9fZnVuY19fLCBqaWZmaWVzKTsKIAogCQkvKiBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdXNlICMxICovCiAvLwkJZGJnKCJzZXRfY29uZmlndXJhdGlvbiAxIik7CkBAIC0yOTExLDcgKzI5MTEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCWVkZ2VfcG9ydCA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgZWRnZXBvcnRfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAoZWRnZV9wb3J0ID09IE5VTEwpIHsKLQkJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBPdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgKytqKSB7CiAJCQkJa2ZyZWUgKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbal0pKTsKIAkJCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2pdLCAgTlVMTCk7CkBAIC0zMDE3LDcgKzMwMTcsNyBAQAogCQkgKiBjb250aW51ZSBhcyBsb25nIGFzIHRoZSBlZGdlcG9ydCBpcyBjb25uZWN0ZWQgKi8KIAkJcmVzcG9uc2UgPSB1c2Jfc3VibWl0X3VyYihlZGdlX3NlcmlhbC0+aW50ZXJydXB0X3JlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHJlc3BvbnNlKQotCQkJZXJyKCIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgY29udHJvbCB1cmIiLCBfX0ZVTkNUSU9OX18sIHJlc3BvbnNlKTsKKwkJCWVycigiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGNvbnRyb2wgdXJiIiwgX19mdW5jX18sIHJlc3BvbnNlKTsKIAl9CiAJcmV0dXJuIHJlc3BvbnNlOwogfQpAQCAtMzAzMiw3ICszMDMyLDcgQEAKIAlzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsICplZGdlX3NlcmlhbCA9IHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKIAlpbnQgaTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAkvKiBzdG9wIHJlYWRzIGFuZCB3cml0ZXMgb24gYWxsIHBvcnRzICovCiAJZm9yIChpPTA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGFibGVzLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGFibGVzLmgKaW5kZXggNmQzMDA4Ny4uMmVjODU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX3RhYmxlcy5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190YWJsZXMuaApAQCAtMTExLDkgKzExMSw2IEBACiAJLmRlc2NyaXB0aW9uCQk9ICJFZGdlcG9ydCAyIHBvcnQgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIJCT0gJmlvX2RyaXZlciwKIAkuaWRfdGFibGUJCT0gZWRnZXBvcnRfMnBvcnRfaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSAxLAotCS5udW1fYnVsa19pbgkJPSAxLAotCS5udW1fYnVsa19vdXQJCT0gMSwKIAkubnVtX3BvcnRzCQk9IDIsCiAJLm9wZW4JCQk9IGVkZ2Vfb3BlbiwKIAkuY2xvc2UJCQk9IGVkZ2VfY2xvc2UsCkBAIC0xNDIsOSArMTM5LDYgQEAKIAkuZGVzY3JpcHRpb24JCT0gIkVkZ2Vwb3J0IDQgcG9ydCBhZGFwdGVyIiwKIAkudXNiX2RyaXZlcgkJPSAmaW9fZHJpdmVyLAogCS5pZF90YWJsZQkJPSBlZGdlcG9ydF80cG9ydF9pZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbgk9IDEsCi0JLm51bV9idWxrX2luCQk9IDEsCi0JLm51bV9idWxrX291dAkJPSAxLAogCS5udW1fcG9ydHMJCT0gNCwKIAkub3BlbgkJCT0gZWRnZV9vcGVuLAogCS5jbG9zZQkJCT0gZWRnZV9jbG9zZSwKQEAgLTE3Myw5ICsxNjcsNiBAQAogCS5kZXNjcmlwdGlvbgkJPSAiRWRnZXBvcnQgOCBwb3J0IGFkYXB0ZXIiLAogCS51c2JfZHJpdmVyCQk9ICZpb19kcml2ZXIsCiAJLmlkX3RhYmxlCQk9IGVkZ2Vwb3J0Xzhwb3J0X2lkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luCT0gMSwKLQkubnVtX2J1bGtfaW4JCT0gMSwKLQkubnVtX2J1bGtfb3V0CQk9IDEsCiAJLm51bV9wb3J0cwkJPSA4LAogCS5vcGVuCQkJPSBlZGdlX29wZW4sCiAJLmNsb3NlCQkJPSBlZGdlX2Nsb3NlLApAQCAtMjAzLDkgKzE5NCw2IEBACiAJfSwKIAkuZGVzY3JpcHRpb24JCT0gIkVQaUMgZGV2aWNlIiwKIAkuaWRfdGFibGUJCT0gRXBpY19wb3J0X2lkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luCT0gMSwKLQkubnVtX2J1bGtfaW4JCT0gMSwKLQkubnVtX2J1bGtfb3V0CQk9IDEsCiAJLm51bV9wb3J0cwkJPSAxLAogCS5vcGVuCQkJPSBlZGdlX29wZW4sCiAJLmNsb3NlCQkJPSBlZGdlX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX3RpLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYwppbmRleCBlNWVhNWVmLi4wNWU0ZmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAJaWYgKHN0YXR1cyAhPSBzaXplKSB7CiAJCWRiZyAoIiVzIC0gd2FudGVkIHRvIHdyaXRlICVkLCBidXQgb25seSB3cm90ZSAlZCIsCi0JCSAgICAgX19GVU5DVElPTl9fLCBzaXplLCBzdGF0dXMpOworCQkgICAgIF9fZnVuY19fLCBzaXplLCBzdGF0dXMpOwogCQlyZXR1cm4gLUVDT01NOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMyMCw3ICszMjAsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCWlmIChzdGF0dXMgIT0gc2l6ZSkgewogCQlkYmcgKCIlcyAtIHdhbnRlZCB0byB3cml0ZSAlZCwgYnV0IG9ubHkgd3JvdGUgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc2l6ZSwgc3RhdHVzKTsKKwkJICAgICBfX2Z1bmNfXywgc2l6ZSwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FQ09NTTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zNDQsNyArMzQ0LDcgQEAKIHsKIAlpbnQgcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnICgiJXMgLSBwb3J0ICVkLCBtYXNrICV4IiwgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgbWFzayk7CisJZGJnICgiJXMgLSBwb3J0ICVkLCBtYXNrICV4IiwgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBtYXNrKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQlVTVBDX1BVUkdFX1BPUlQsCkBAIC0zNjksNyArMzY5LDcgQEAKIAlfX3U4IHJlYWRfbGVuZ3RoOwogCV9fYmUxNiBiZV9zdGFydF9hZGRyZXNzOwogCQotCWRiZyAoIiVzIC0gQCAleCBmb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXJ0X2FkZHJlc3MsIGxlbmd0aCk7CisJZGJnICgiJXMgLSBAICV4IGZvciAlZCIsIF9fZnVuY19fLCBzdGFydF9hZGRyZXNzLCBsZW5ndGgpOwogCiAJLyogUmVhZCBpbiBibG9ja3Mgb2YgNjQgYnl0ZXMKIAkgKiAoVEkgZmlybXdhcmUgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiA2NCBieXRlIHJlYWRzKQpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCQlyZWFkX2xlbmd0aCA9IChfX3U4KWxlbmd0aDsKIAogCQlpZiAocmVhZF9sZW5ndGggPiAxKSB7Ci0JCQlkYmcgKCIlcyAtIEAgJXggZm9yICVkIiwgX19GVU5DVElPTl9fLCAKKwkJCWRiZyAoIiVzIC0gQCAleCBmb3IgJWQiLCBfX2Z1bmNfXywKIAkJCSAgICAgc3RhcnRfYWRkcmVzcywgcmVhZF9sZW5ndGgpOwogCQl9CiAJCWJlX3N0YXJ0X2FkZHJlc3MgPSBjcHVfdG9fYmUxNiAoc3RhcnRfYWRkcmVzcyk7CkBAIC0zOTMsMTIgKzM5MywxMiBAQAogCQkJCQkJICByZWFkX2xlbmd0aCk7CS8vIFRyYW5zZmVyQnVmZmVyTGVuZ3RoCiAKIAkJaWYgKHN0YXR1cykgewotCQkJZGJnICgiJXMgLSBFUlJPUiAleCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCWRiZyAoIiVzIC0gRVJST1IgJXgiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KIAogCQlpZiAocmVhZF9sZW5ndGggPiAxKSB7Ci0JCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZkZXYtPmRldiwgX19GVU5DVElPTl9fLAorCQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmZGV2LT5kZXYsIF9fZnVuY19fLAogCQkJCQkgICAgICByZWFkX2xlbmd0aCwgYnVmZmVyKTsKIAkJfQogCkBAIC00MzQsMTMgKzQzNCwxMyBAQAogCQkJCQkmYnVmZmVyW2ldLAkJCS8vIFRyYW5zZmVyQnVmZmVyCiAJCQkJCTB4MDEpOwkJCQkvLyBUcmFuc2ZlckJ1ZmZlckxlbmd0aAogCQlpZiAoc3RhdHVzKSB7Ci0JCQlkYmcgKCIlcyAtIEVSUk9SICV4IiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGJnICgiJXMgLSBFUlJPUiAleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCX0KIAotCWRiZyAoIiVzIC0gc3RhcnRfYWRkcmVzcyA9ICV4LCBsZW5ndGggPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhcnRfYWRkcmVzcywgbGVuZ3RoKTsKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZzZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsIF9fRlVOQ1RJT05fXywgbGVuZ3RoLCBidWZmZXIpOworCWRiZyAoIiVzIC0gc3RhcnRfYWRkcmVzcyA9ICV4LCBsZW5ndGggPSAlZCIsIF9fZnVuY19fLCBzdGFydF9hZGRyZXNzLCBsZW5ndGgpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgX19mdW5jX18sIGxlbmd0aCwgYnVmZmVyKTsKIAogCXNlcmlhbC0+VGlSZWFkSTJDID0gMTsKIApAQCAtNDcyLDggKzQ3Miw4IEBACiAJCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotICAJZGJnICgiJXMgLSBzdGFydF9zZGRyID0gJXgsIGxlbmd0aCA9ICVkIiwgX19GVU5DVElPTl9fLCBzdGFydF9hZGRyZXNzLCBsZW5ndGgpOwotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgX19GVU5DVElPTl9fLCBsZW5ndGgsIGJ1ZmZlcik7CisgIAlkYmcgKCIlcyAtIHN0YXJ0X3NkZHIgPSAleCwgbGVuZ3RoID0gJWQiLCBfX2Z1bmNfXywgc3RhcnRfYWRkcmVzcywgbGVuZ3RoKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZzZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsIF9fZnVuY19fLCBsZW5ndGgsIGJ1ZmZlcik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNDk0LDggKzQ5NCw4IEBACiAJaWYgKHdyaXRlX2xlbmd0aCA+IGxlbmd0aCkKIAkJd3JpdGVfbGVuZ3RoID0gbGVuZ3RoOwogCi0JZGJnICgiJXMgLSBCeXRlc0luRmlyc3RQYWdlIEFkZHIgPSAleCwgbGVuZ3RoID0gJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXJ0X2FkZHJlc3MsIHdyaXRlX2xlbmd0aCk7Ci0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX0ZVTkNUSU9OX18sIHdyaXRlX2xlbmd0aCwgYnVmZmVyKTsKKwlkYmcgKCIlcyAtIEJ5dGVzSW5GaXJzdFBhZ2UgQWRkciA9ICV4LCBsZW5ndGggPSAlZCIsIF9fZnVuY19fLCBzdGFydF9hZGRyZXNzLCB3cml0ZV9sZW5ndGgpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgX19mdW5jX18sIHdyaXRlX2xlbmd0aCwgYnVmZmVyKTsKIAogCS8qIFdyaXRlIGZpcnN0IHBhZ2UgKi8KIAliZV9zdGFydF9hZGRyZXNzID0gY3B1X3RvX2JlMTYgKHN0YXJ0X2FkZHJlc3MpOwpAQCAtNTA2LDcgKzUwNiw3IEBACiAJCQkJCWJ1ZmZlciwJCQkvLyBUcmFuc2ZlckJ1ZmZlcgogCQkJCQl3cml0ZV9sZW5ndGgpOwogCWlmIChzdGF0dXMpIHsKLQkJZGJnICgiJXMgLSBFUlJPUiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnICgiJXMgLSBFUlJPUiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIApAQCAtNTIxLDggKzUyMSw4IEBACiAJCWVsc2UKIAkJCXdyaXRlX2xlbmd0aCA9IGxlbmd0aDsKIAotCQlkYmcgKCIlcyAtIFBhZ2UgV3JpdGUgQWRkciA9ICV4LCBsZW5ndGggPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhcnRfYWRkcmVzcywgd3JpdGVfbGVuZ3RoKTsKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX0ZVTkNUSU9OX18sIHdyaXRlX2xlbmd0aCwgYnVmZmVyKTsKKwkJZGJnICgiJXMgLSBQYWdlIFdyaXRlIEFkZHIgPSAleCwgbGVuZ3RoID0gJWQiLCBfX2Z1bmNfXywgc3RhcnRfYWRkcmVzcywgd3JpdGVfbGVuZ3RoKTsKKwkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX2Z1bmNfXywgd3JpdGVfbGVuZ3RoLCBidWZmZXIpOwogCiAJCS8qIFdyaXRlIG5leHQgcGFnZSAqLwogCQliZV9zdGFydF9hZGRyZXNzID0gY3B1X3RvX2JlMTYgKHN0YXJ0X2FkZHJlc3MpOwpAQCAtNTMzLDcgKzUzMyw3IEBACiAJCQkJCQlidWZmZXIsCSAgCQkvLyBUcmFuc2ZlckJ1ZmZlcgogCQkJCQkJd3JpdGVfbGVuZ3RoKTsJCS8vIFRyYW5zZmVyQnVmZmVyTGVuZ3RoCiAJCWlmIChzdGF0dXMpIHsKLQkJCWRldl9lcnIgKCZzZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIEVSUk9SICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlkZXZfZXJyICgmc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBFUlJPUiAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJCQpAQCAtNTU5LDcgKzU1OSw3IEBACiAKIAlvZWRiID0ga21hbGxvYyAoc2l6ZW9mICgqIG9lZGIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW9lZGIpIHsKLQkJZGV2X2VyciAoJnBvcnQtPnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoJnBvcnQtPnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTU3OSw3ICs1NzksNyBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXhpdF9pc190eF9hY3RpdmU7CiAKLQlkYmcgKCIlcyAtIFhCeXRlQ291bnQgICAgMHglWCIsIF9fRlVOQ1RJT05fXywgb2VkYi0+WEJ5dGVDb3VudCk7CisJZGJnICgiJXMgLSBYQnl0ZUNvdW50ICAgIDB4JVgiLCBfX2Z1bmNfXywgb2VkYi0+WEJ5dGVDb3VudCk7CiAKIAkvKiBhbmQgdGhlIExTUiAqLwogCXN0YXR1cyA9IFRJUmVhZFJhbSAocG9ydC0+cG9ydC0+c2VyaWFsLT5kZXYsIApAQCAtNTg5LDcgKzU4OSw3IEBACiAKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGV4aXRfaXNfdHhfYWN0aXZlOwotCWRiZyAoIiVzIC0gTFNSID0gMHglWCIsIF9fRlVOQ1RJT05fXywgKmxzcik7CisJZGJnICgiJXMgLSBMU1IgPSAweCVYIiwgX19mdW5jX18sICpsc3IpOwogCQogCS8qIElmIGVpdGhlciBidWZmZXIgaGFzIGRhdGEgb3Igd2UgYXJlIHRyYW5zbWl0dGluZyB0aGVuIHJldHVybiBUUlVFICovCiAJaWYgKChvZWRiLT5YQnl0ZUNvdW50ICYgMHg4MCApICE9IDAgKQpAQCAtNjAwLDcgKzYwMCw3IEBACiAKIAkvKiBXZSByZXR1cm4gTm90IEFjdGl2ZSBpZiB3ZSBnZXQgYW55IGtpbmQgb2YgZXJyb3IgKi8KIGV4aXRfaXNfdHhfYWN0aXZlOgotCWRiZyAoIiVzIC0gcmV0dXJuICVkIiwgX19GVU5DVElPTl9fLCBieXRlc19sZWZ0ICk7CisJZGJnICgiJXMgLSByZXR1cm4gJWQiLCBfX2Z1bmNfXywgYnl0ZXNfbGVmdCApOwogCiAJa2ZyZWUobHNyKTsKIAlrZnJlZShvZWRiKTsKQEAgLTY1NCw3ICs2NTQsNyBAQAogCS8qIChUSUlzVHhBY3RpdmUgZG9lc24ndCBzZWVtIHRvIHdhaXQgZm9yIHRoZSBsYXN0IGJ5dGUpICovCiAJaWYgKChiYXVkX3JhdGU9cG9ydC0+YmF1ZF9yYXRlKSA9PSAwKQogCQliYXVkX3JhdGUgPSA1MDsKLQltc2xlZXAobWF4KDEsKDEwMDAwK2JhdWRfcmF0ZS0xKS9iYXVkX3JhdGUpKTsKKwltc2xlZXAobWF4KDEsIERJVl9ST1VORF9VUCgxMDAwMCwgYmF1ZF9yYXRlKSkpOwogfQogCiBzdGF0aWMgaW50IFRJQ2hvb3NlQ29uZmlndXJhdGlvbiAoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKQEAgLTY2NCwxMSArNjY0LDExIEBACiAJLy8gd2Ugd2FudC4gSG93ZXZlciwgd2UganVzdCBzdXBwb3J0IG9uZSBjb25maWcgYXQgdGhpcyBwb2ludCwKIAkvLyBjb25maWd1cmF0aW9uICMgMSwgd2hpY2ggaXMgQ29uZmlnIERlc2NyaXB0b3IgMC4KIAotCWRiZyAoIiVzIC0gTnVtYmVyIG9mIEludGVyZmFjZXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgZGV2LT5jb25maWctPmRlc2MuYk51bUludGVyZmFjZXMpOwotCWRiZyAoIiVzIC0gTUFYIFBvd2VyICAgICAgICAgICAgPSAlZCIsIF9fRlVOQ1RJT05fXywgZGV2LT5jb25maWctPmRlc2MuYk1heFBvd2VyKjIpOworCWRiZyAoIiVzIC0gTnVtYmVyIG9mIEludGVyZmFjZXMgPSAlZCIsIF9fZnVuY19fLCBkZXYtPmNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlcyk7CisJZGJnICgiJXMgLSBNQVggUG93ZXIgICAgICAgICAgICA9ICVkIiwgX19mdW5jX18sIGRldi0+Y29uZmlnLT5kZXNjLmJNYXhQb3dlcioyKTsKIAogCWlmIChkZXYtPmNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlcyAhPSAxKSB7Ci0JCWRldl9lcnIgKCZkZXYtPmRldiwgIiVzIC0gYk51bUludGVyZmFjZXMgaXMgbm90IDEsIEVSUk9SIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoJmRldi0+ZGV2LCAiJXMgLSBiTnVtSW50ZXJmYWNlcyBpcyBub3QgMSwgRVJST1IhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNzUxLDcgKzc1MSw3IEBACiAJCWNzID0gKF9fdTgpKGNzICsgYnVmZmVyW2ldKTsKIAl9CiAJaWYgKGNzICE9IHJvbV9kZXNjLT5DaGVja1N1bSkgewotCQlkYmcgKCIlcyAtIE1pc21hdGNoICV4IC0gJXgiLCBfX0ZVTkNUSU9OX18sIHJvbV9kZXNjLT5DaGVja1N1bSwgY3MpOworCQlkYmcgKCIlcyAtIE1pc21hdGNoICV4IC0gJXgiLCBfX2Z1bmNfXywgcm9tX2Rlc2MtPkNoZWNrU3VtLCBjcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTc2OSwxMiArNzY5LDEyIEBACiAKIAlyb21fZGVzYyA9IGttYWxsb2MgKHNpemVvZiAoKnJvbV9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyb21fZGVzYykgewotCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJYnVmZmVyID0ga21hbGxvYyAoVElfTUFYX0kyQ19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5IHdoZW4gYWxsb2NhdGluZyBidWZmZXJcbiIsIF9fZnVuY19fKTsKIAkJa2ZyZWUgKHJvbV9kZXNjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNzg1LDcgKzc4NSw3IEBACiAJCWdvdG8gRXhpdFRpVmFsaWRhdGVJMmNJbWFnZTsgCiAKIAlpZiAoKmJ1ZmZlciAhPSBVTVA1MTUyICYmICpidWZmZXIgIT0gVU1QMzQxMCkgewotCQlkZXZfZXJyIChkZXYsICIlcyAtIGludmFsaWQgYnVmZmVyIHNpZ25hdHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoZGV2LCAiJXMgLSBpbnZhbGlkIGJ1ZmZlciBzaWduYXR1cmVcbiIsIF9fZnVuY19fKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAkJZ290byBFeGl0VGlWYWxpZGF0ZUkyY0ltYWdlOwogCX0KQEAgLTgwMSwxMSArODAxLDExIEBACiAKIAkJaWYgKChzdGFydF9hZGRyZXNzICsgc2l6ZW9mKHN0cnVjdCB0aV9pMmNfZGVzYykgKyByb21fZGVzYy0+U2l6ZSkgPiBUSV9NQVhfSTJDX1NJWkUpIHsKIAkJCXN0YXR1cyA9IC1FTk9ERVY7Ci0JCQlkYmcgKCIlcyAtIHN0cnVjdHVyZSB0b28gYmlnLCBlcnJvcmluZyBvdXQuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZyAoIiVzIC0gc3RydWN0dXJlIHRvbyBiaWcsIGVycm9yaW5nIG91dC4iLCBfX2Z1bmNfXyk7CiAJCQlicmVhazsKIAkJfQogCi0JCWRiZyAoIiVzIFR5cGUgPSAweCV4IiwgX19GVU5DVElPTl9fLCByb21fZGVzYy0+VHlwZSk7CisJCWRiZyAoIiVzIFR5cGUgPSAweCV4IiwgX19mdW5jX18sIHJvbV9kZXNjLT5UeXBlKTsKIAogCQkvLyBTa2lwIHR5cGUgMiByZWNvcmQKIAkJdHR5cGUgPSByb21fZGVzYy0+VHlwZSAmIDB4MGY7CkBAIC04NDUsMTMgKzg0NSwxMyBAQAogCiAJcm9tX2Rlc2MgPSBrbWFsbG9jIChzaXplb2YgKCpyb21fZGVzYyksIEdGUF9LRVJORUwpOwogCWlmICghcm9tX2Rlc2MpIHsKLQkJZGV2X2VyciAoJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoJnNlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc3RhcnRfYWRkcmVzcyA9IFRJR2V0RGVzY3JpcHRvckFkZHJlc3MgKHNlcmlhbCwgSTJDX0RFU0NfVFlQRV9JT04sIHJvbV9kZXNjKTsKIAogCWlmICghc3RhcnRfYWRkcmVzcykgewotCQlkYmcgKCIlcyAtIEVkZ2UgRGVzY3JpcHRvciBub3QgZm91bmQgaW4gSTJDIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnICgiJXMgLSBFZGdlIERlc2NyaXB0b3Igbm90IGZvdW5kIGluIEkyQyIsIF9fZnVuY19fKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTg2NywxMiArODY3LDEyIEBACiAJc3RhdHVzID0gVmFsaWRDaGVja3N1bShyb21fZGVzYywgYnVmZmVyKTsKIAkKIAlkZXNjID0gKHN0cnVjdCBlZGdlX3RpX21hbnVmX2Rlc2NyaXB0b3IgKilidWZmZXI7Ci0JZGJnICggIiVzIC0gSW9uQ29uZmlnICAgICAgMHgleCIsIF9fRlVOQ1RJT05fXywgZGVzYy0+SW9uQ29uZmlnIAkpOwotCWRiZyAoICIlcyAtIFZlcnNpb24gICAgICAgICAgJWQiLCBfX0ZVTkNUSU9OX18sIGRlc2MtPlZlcnNpb24JICAJKTsKLQlkYmcgKCAiJXMgLSBDcHUvQm9hcmQgICAgICAweCV4IiwgX19GVU5DVElPTl9fLCBkZXNjLT5DcHVSZXZfQm9hcmRSZXYJKTsKLQlkYmcgKCAiJXMgLSBOdW1Qb3J0cyAgICAgICAgICVkIiwgX19GVU5DVElPTl9fLCBkZXNjLT5OdW1Qb3J0cyAgCSk7CQotCWRiZyAoICIlcyAtIE51bVZpcnR1YWxQb3J0cyAgJWQiLCBfX0ZVTkNUSU9OX18sIGRlc2MtPk51bVZpcnR1YWxQb3J0cwkpOwkKLQlkYmcgKCAiJXMgLSBUb3RhbFBvcnRzICAgICAgICVkIiwgX19GVU5DVElPTl9fLCBkZXNjLT5Ub3RhbFBvcnRzICAJKTsJCisJZGJnICggIiVzIC0gSW9uQ29uZmlnICAgICAgMHgleCIsIF9fZnVuY19fLCBkZXNjLT5Jb25Db25maWcgCSk7CisJZGJnICggIiVzIC0gVmVyc2lvbiAgICAgICAgICAlZCIsIF9fZnVuY19fLCBkZXNjLT5WZXJzaW9uCSAgCSk7CisJZGJnICggIiVzIC0gQ3B1L0JvYXJkICAgICAgMHgleCIsIF9fZnVuY19fLCBkZXNjLT5DcHVSZXZfQm9hcmRSZXYJKTsKKwlkYmcgKCAiJXMgLSBOdW1Qb3J0cyAgICAgICAgICVkIiwgX19mdW5jX18sIGRlc2MtPk51bVBvcnRzICAJKTsKKwlkYmcgKCAiJXMgLSBOdW1WaXJ0dWFsUG9ydHMgICVkIiwgX19mdW5jX18sIGRlc2MtPk51bVZpcnR1YWxQb3J0cwkpOworCWRiZyAoICIlcyAtIFRvdGFsUG9ydHMgICAgICAgJWQiLCBfX2Z1bmNfXywgZGVzYy0+VG90YWxQb3J0cyAgCSk7CiAKIGV4aXQ6CiAJa2ZyZWUgKHJvbV9kZXNjKTsKQEAgLTkwMiw3ICs5MDIsNyBAQAogCiAJYnVmZmVyID0ga21hbGxvYyAoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAkKQEAgLTk1NSwxMSArOTU1LDExIEBACiAJCQkJCSZkYXRhLAkJCQkvLyBUcmFuc2ZlckJ1ZmZlcgogCQkJCQkweDAxKTsJCQkJLy8gVHJhbnNmZXJCdWZmZXJMZW5ndGgKIAlpZiAoc3RhdHVzKQotCQlkYmcgKCIlcyAtIHJlYWQgMiBzdGF0dXMgZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnICgiJXMgLSByZWFkIDIgc3RhdHVzIGVycm9yID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAllbHNlCi0JCWRiZyAoIiVzIC0gcmVhZCAyIGRhdGEgPSAweCV4IiwgX19GVU5DVElPTl9fLCBkYXRhKTsKKwkJZGJnICgiJXMgLSByZWFkIDIgZGF0YSA9IDB4JXgiLCBfX2Z1bmNfXywgZGF0YSk7CiAJaWYgKCghc3RhdHVzKSAmJiAoZGF0YSA9PSBVTVA1MTUyIHx8IGRhdGEgPT0gVU1QMzQxMCkpIHsKLQkJZGJnICgiJXMgLSBST01fVFlQRV9JSSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIC0gUk9NX1RZUEVfSUkiLCBfX2Z1bmNfXyk7CiAJCXNlcmlhbC0+VElfSTJDX1R5cGUgPSBEVEtfQUREUl9TUEFDRV9JMkNfVFlQRV9JSTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTcyLDE2ICs5NzIsMTYgQEAKIAkJCQkJJmRhdGEsCQkJCS8vIFRyYW5zZmVyQnVmZmVyCiAJCQkJCTB4MDEpOwkJCQkvLyBUcmFuc2ZlckJ1ZmZlckxlbmd0aAogCWlmIChzdGF0dXMpCi0JCWRiZyAoIiVzIC0gcmVhZCAzIHN0YXR1cyBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcgKCIlcyAtIHJlYWQgMyBzdGF0dXMgZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCWVsc2UKLQkJZGJnICgiJXMgLSByZWFkIDIgZGF0YSA9IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGRhdGEpOworCQlkYmcgKCIlcyAtIHJlYWQgMiBkYXRhID0gMHgleCIsIF9fZnVuY19fLCBkYXRhKTsKIAlpZiAoKCFzdGF0dXMpICYmIChkYXRhID09IFVNUDUxNTIgfHwgZGF0YSA9PSBVTVAzNDEwKSkgewotCQlkYmcgKCIlcyAtIFJPTV9UWVBFX0lJSSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIC0gUk9NX1RZUEVfSUlJIiwgX19mdW5jX18pOwogCQlzZXJpYWwtPlRJX0kyQ19UeXBlID0gRFRLX0FERFJfU1BBQ0VfSTJDX1RZUEVfSUlJOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkYmcgKCIlcyAtIFVua25vd24iLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIC0gVW5rbm93biIsIF9fZnVuY19fKTsKIAlzZXJpYWwtPlRJX0kyQ19UeXBlID0gRFRLX0FERFJfU1BBQ0VfSTJDX1RZUEVfSUk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CkBAIC0xMDYzLDcgKzEwNjMsNyBAQAogCiAJaW50ZXJmYWNlID0gJnNlcmlhbC0+c2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjOwogCWlmICghaW50ZXJmYWNlKSB7Ci0JCWRldl9lcnIgKGRldiwgIiVzIC0gbm8gaW50ZXJmYWNlIHNldCwgZXJyb3IhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyIChkZXYsICIlcyAtIG5vIGludGVyZmFjZSBzZXQsIGVycm9yIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEwODYsMTIgKzEwODYsMTEgQEAKIAlpZiAoc2VyaWFsLT5wcm9kdWN0X2luZm8uVGlNb2RlID09IFRJX01PREVfRE9XTkxPQUQpIHsKIAkJc3RydWN0IHRpX2kyY19kZXNjICpyb21fZGVzYzsKIAotCQlkYmcgKCIlcyAtIDw8PDw8PDw8PDw8PDw8PFJVTk5JTkcgSU4gRE9XTkxPQUQgTU9ERT4+Pj4+Pj4+Pj4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gUlVOTklORyBJTiBET1dOTE9BRCBNT0RFIiwgX19mdW5jX18pOwogCiAJCXN0YXR1cyA9IFRpVmFsaWRhdGVJMmNJbWFnZSAoc2VyaWFsKTsKIAkJaWYgKHN0YXR1cykgewotCQkJZGJnICgiJXMgLSA8PDw8PDw8PDw8PDw8PDxET1dOTE9BRCBNT0RFIC0tIEJBRCBJMkMgPj4+Pj4+Pj4+PiIsCi0JCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gRE9XTkxPQUQgTU9ERSAtLSBCQUQgSTJDIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCQkKQEAgLTExMDAsNyArMTA5OSw3IEBACiAJCSAqLwogCQl0aV9tYW51Zl9kZXNjID0ga21hbGxvYyAoc2l6ZW9mICgqdGlfbWFudWZfZGVzYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRpX21hbnVmX2Rlc2MpIHsKLQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzdGF0dXMgPSBUSVJlYWRNYW51ZkRlc2NyaXB0b3IgKHNlcmlhbCwgKF9fdTggKil0aV9tYW51Zl9kZXNjKTsKQEAgLTExMTEsNyArMTExMCw3IEBACiAKIAkJLy8gQ2hlY2sgdmVyc2lvbiBudW1iZXIgb2YgSU9OIGRlc2NyaXB0b3IKIAkJaWYgKCFpZ25vcmVfY3B1X3JldiAmJiBUSV9HRVRfQ1BVX1JFVklTSU9OKHRpX21hbnVmX2Rlc2MtPkNwdVJldl9Cb2FyZFJldikgPCAyKSB7Ci0JCQlkYmcgKCAiJXMgLSBXcm9uZyBDUFUgUmV2ICVkIChNdXN0IGJlIDIpIiwgX19GVU5DVElPTl9fLCAKKwkJCWRiZyAoICIlcyAtIFdyb25nIENQVSBSZXYgJWQgKE11c3QgYmUgMikiLCBfX2Z1bmNfXywKIAkJCSAgICAgVElfR0VUX0NQVV9SRVZJU0lPTih0aV9tYW51Zl9kZXNjLT5DcHVSZXZfQm9hcmRSZXYpKTsKIAkJCWtmcmVlICh0aV9tYW51Zl9kZXNjKTsKIAkJICAgCXJldHVybiAtRUlOVkFMOwpAQCAtMTExOSw3ICsxMTE4LDcgQEAKIAogCQlyb21fZGVzYyA9IGttYWxsb2MgKHNpemVvZiAoKnJvbV9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcm9tX2Rlc2MpIHsKLQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CiAJCQlrZnJlZSAodGlfbWFudWZfZGVzYyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTEyOSwxMSArMTEyOCwxMSBAQAogCQkJc3RydWN0IHRpX2kyY19maXJtd2FyZV9yZWMgKmZpcm13YXJlX3ZlcnNpb247CiAJCQlfX3U4IHJlY29yZDsKIAotCQkJZGJnICgiJXMgLSBGb3VuZCBUeXBlIEZJUk1XQVJFIChUeXBlIDIpIHJlY29yZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcgKCIlcyAtIEZvdW5kIFR5cGUgRklSTVdBUkUgKFR5cGUgMikgcmVjb3JkIiwgX19mdW5jX18pOwogCiAJCQlmaXJtd2FyZV92ZXJzaW9uID0ga21hbGxvYyAoc2l6ZW9mICgqZmlybXdhcmVfdmVyc2lvbiksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFmaXJtd2FyZV92ZXJzaW9uKSB7Ci0JCQkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CiAJCQkJa2ZyZWUgKHJvbV9kZXNjKTsKIAkJCQlrZnJlZSAodGlfbWFudWZfZGVzYyk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMTU5LDcgKzExNTgsNyBAQAogCQkJCQkgICAoT3BlcmF0aW9uYWxDb2RlSW1hZ2VWZXJzaW9uLk1pbm9yVmVyc2lvbik7CiAKIAkJCWRiZyAoIiVzIC0gPj4+RmlybXdhcmUgVmVyc2lvbnMgRGV2aWNlICVkLiVkICBEcml2ZXIgJWQuJWQiLAotCQkJICAgICBfX0ZVTkNUSU9OX18sCisJCQkgICAgIF9fZnVuY19fLAogCQkJICAgICBmaXJtd2FyZV92ZXJzaW9uLT5WZXJfTWFqb3IsCiAJCQkgICAgIGZpcm13YXJlX3ZlcnNpb24tPlZlcl9NaW5vciwKIAkJCSAgICAgT3BlcmF0aW9uYWxDb2RlSW1hZ2VWZXJzaW9uLk1ham9yVmVyc2lvbiwKQEAgLTExNjgsNyArMTE2Nyw3IEBACiAJCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGFuIG9sZCB2ZXJzaW9uIGluIHRoZSBJMkMgYW5kIHVwZGF0ZSBpZiBuZWNlc3NhcnkKIAkJCWlmIChkb3dubG9hZF9jdXJfdmVyICE9IGRvd25sb2FkX25ld192ZXIpIHsKIAkJCQlkYmcgKCIlcyAtIFVwZGF0ZSBJMkMgRG93bmxvYWQgZnJvbSAlZC4lZCB0byAlZC4lZCIsCi0JCQkJICAgICBfX0ZVTkNUSU9OX18sCisJCQkJICAgICBfX2Z1bmNfXywKIAkJCQkgICAgIGZpcm13YXJlX3ZlcnNpb24tPlZlcl9NYWpvciwKIAkJCQkgICAgIGZpcm13YXJlX3ZlcnNpb24tPlZlcl9NaW5vciwKIAkJCQkgICAgIE9wZXJhdGlvbmFsQ29kZUltYWdlVmVyc2lvbi5NYWpvclZlcnNpb24sCkBAIC0xMjEwLDE0ICsxMjA5LDE0IEBACiAJCQkJfQogCiAJCQkJaWYgKHJlY29yZCAhPSBJMkNfREVTQ19UWVBFX0ZJUk1XQVJFX0JMQU5LKSB7Ci0JCQkJCWRldl9lcnIgKGRldiwgIiVzIC0gZXJyb3IgcmVzZXR0aW5nIGRldmljZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJZGV2X2VyciAoZGV2LCAiJXMgLSBlcnJvciByZXNldHRpbmcgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CiAJCQkJCWtmcmVlIChmaXJtd2FyZV92ZXJzaW9uKTsKIAkJCQkJa2ZyZWUgKHJvbV9kZXNjKTsKIAkJCQkJa2ZyZWUgKHRpX21hbnVmX2Rlc2MpOwogCQkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCQl9CiAKLQkJCQlkYmcgKCIlcyAtIEhBUkRXQVJFIFJFU0VUIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcgKCIlcyAtIEhBUkRXQVJFIFJFU0VUIiwgX19mdW5jX18pOwogCiAJCQkJLy8gUmVzZXQgVU1QIC0tIEJhY2sgdG8gQk9PVCBNT0RFCiAJCQkJc3RhdHVzID0gVElTZW5kVmVuZG9yUmVxdWVzdFN5bmMgKHNlcmlhbC0+c2VyaWFsLT5kZXYsCkBAIC0xMjI3LDcgKzEyMjYsNyBAQAogCQkJCQkJCQlOVUxMLAkJCS8vIFRyYW5zZmVyQnVmZmVyCiAJCQkJCQkJCTApOwkJCS8vIFRyYW5zZmVyQnVmZmVyTGVuZ3RoCiAKLQkJCQlkYmcgKCAiJXMgLSBIQVJEV0FSRSBSRVNFVCByZXR1cm4gJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJZGJnICggIiVzIC0gSEFSRFdBUkUgUkVTRVQgcmV0dXJuICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKIAkJCQkvKiByZXR1cm4gYW4gZXJyb3Igb24gcHVycG9zZS4gKi8KIAkJCQlrZnJlZSAoZmlybXdhcmVfdmVyc2lvbik7CkBAIC0xMjQ1LDcgKzEyNDQsNyBAQAogCiAJCQloZWFkZXIgID0ga21hbGxvYyAoSEVBREVSX1NJWkUsIEdGUF9LRVJORUwpOwogCQkJaWYgKCFoZWFkZXIpIHsKLQkJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAocm9tX2Rlc2MpOwogCQkJCWtmcmVlICh0aV9tYW51Zl9kZXNjKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEyNTMsMTQgKzEyNTIsMTQgQEAKIAkJCQkKIAkJCXZoZWFkZXIgPSBrbWFsbG9jIChIRUFERVJfU0laRSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXZoZWFkZXIpIHsKLQkJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAoaGVhZGVyKTsKIAkJCQlrZnJlZSAocm9tX2Rlc2MpOwogCQkJCWtmcmVlICh0aV9tYW51Zl9kZXNjKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCQotCQkJZGJnICgiJXMgLSBGb3VuZCBUeXBlIEJMQU5LIEZJUk1XQVJFIChUeXBlIEYyKSByZWNvcmQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnICgiJXMgLSBGb3VuZCBUeXBlIEJMQU5LIEZJUk1XQVJFIChUeXBlIEYyKSByZWNvcmQiLCBfX2Z1bmNfXyk7CiAKIAkJCS8vIEluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgSTJDIGZpcm13YXJlIHdlIG11c3QgY2hhbmdlIHRoZSB0eXBlIDIgcmVjb3JkIHRvIHR5cGUgMHhGMi4KIAkJCS8vIFRoaXMgd2lsbCBmb3JjZSB0aGUgVU1QIHRvIGNvbWUgdXAgaW4gQm9vdCBNb2RlLiAgVGhlbiB3aGlsZSBpbiBib290IG1vZGUsIHRoZSBkcml2ZXIgCkBAIC0xMjk4LDcgKzEyOTcsNyBAQAogCQkJCQkJdmhlYWRlcik7CiAKIAkJCWlmIChzdGF0dXMpIHsKLQkJCQlkYmcgKCIlcyAtIGNhbid0IHJlYWQgaGVhZGVyIGJhY2siLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZyAoIiVzIC0gY2FuJ3QgcmVhZCBoZWFkZXIgYmFjayIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAodmhlYWRlcik7CiAJCQkJa2ZyZWUgKGhlYWRlcik7CiAJCQkJa2ZyZWUgKHJvbV9kZXNjKTsKQEAgLTEzMDYsNyArMTMwNSw3IEBACiAJCQkJcmV0dXJuIHN0YXR1czsKIAkJCX0KIAkJCWlmIChtZW1jbXAodmhlYWRlciwgaGVhZGVyLCBIRUFERVJfU0laRSkpIHsKLQkJCQlkYmcgKCIlcyAtIHdyaXRlIGRvd25sb2FkIHJlY29yZCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZyAoIiVzIC0gd3JpdGUgZG93bmxvYWQgcmVjb3JkIGZhaWxlZCIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAodmhlYWRlcik7CiAJCQkJa2ZyZWUgKGhlYWRlcik7CiAJCQkJa2ZyZWUgKHJvbV9kZXNjKTsKQEAgLTEzMTcsNyArMTMxNiw3IEBACiAJCQlrZnJlZSAodmhlYWRlcik7CiAJCQlrZnJlZSAoaGVhZGVyKTsKIAotCQkJZGJnICgiJXMgLSBTdGFydCBmaXJtd2FyZSB1cGRhdGUiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnICgiJXMgLSBTdGFydCBmaXJtd2FyZSB1cGRhdGUiLCBfX2Z1bmNfXyk7CiAKIAkJCS8vIFRlbGwgZmlybXdhcmUgdG8gY29weSBkb3dubG9hZCBpbWFnZSBpbnRvIEkyQyAKIAkJCXN0YXR1cyA9IFRJU2VuZFZlbmRvclJlcXVlc3RTeW5jIChzZXJpYWwtPnNlcmlhbC0+ZGV2LApAQCAtMTMyNyw5ICsxMzI2LDkgQEAKIAkJCQkJCU5VTEwsCQkJLy8gVHJhbnNmZXJCdWZmZXIKIAkJCQkJCTApOwkJCS8vIFRyYW5zZmVyQnVmZmVyTGVuZ3RoCiAKLQkJICAJZGJnICgiJXMgLSBVcGRhdGUgY29tcGxldGUgMHgleCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAJZGJnICgiJXMgLSBVcGRhdGUgY29tcGxldGUgMHgleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJaWYgKHN0YXR1cykgewotCQkJCWRldl9lcnIgKGRldiwgIiVzIC0gVU1QQ19DT1BZX0ROTERfVE9fSTJDIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkZXZfZXJyIChkZXYsICIlcyAtIFVNUENfQ09QWV9ETkxEX1RPX0kyQyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJCQlrZnJlZSAocm9tX2Rlc2MpOwogCQkJCWtmcmVlICh0aV9tYW51Zl9kZXNjKTsKIAkJCQlyZXR1cm4gc3RhdHVzOwpAQCAtMTM0NSw4ICsxMzQ0LDcgQEAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogQm9vdCBNb2RlICovCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWRiZyAoIiVzIC0gPDw8PDw8PDw8PDw8PDw8UlVOTklORyBJTiBCT09UIE1PREU+Pj4+Pj4+Pj4+Pj4+Pj4iLAotCSAgICAgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gUlVOTklORyBJTiBCT09UIE1PREUiLCBfX2Z1bmNfXyk7CiAKIAkvLyBDb25maWd1cmUgdGhlIFRJIGRldmljZSBzbyB3ZSBjYW4gdXNlIHRoZSBCVUxLIHBpcGVzIGZvciBkb3dubG9hZAogCXN0YXR1cyA9IFRJQ29uZmlndXJlQm9vdERldmljZSAoc2VyaWFsLT5zZXJpYWwtPmRldik7CkBAIC0xMzU0LDcgKzEzNTIsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCiAJaWYgKGxlMTZfdG9fY3B1KHNlcmlhbC0+c2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICE9IFVTQl9WRU5ET1JfSURfSU9OKSB7Ci0JCWRiZyAoIiVzIC0gVklEID0gMHgleCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnICgiJXMgLSBWSUQgPSAweCV4IiwgX19mdW5jX18sCiAJCSAgICAgbGUxNl90b19jcHUoc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikpOwogCQlzZXJpYWwtPlRJX0kyQ19UeXBlID0gRFRLX0FERFJfU1BBQ0VfSTJDX1RZUEVfSUk7CiAJCWdvdG8gU3RheUluQm9vdE1vZGU7CkBAIC0xMzY4LDcgKzEzNjYsNyBAQAogCiAJLy8gUmVnaXN0cnkgdmFyaWFibGUgc2V0PwogCWlmIChUSVN0YXlJbkJvb3RNb2RlKSB7Ci0JCWRiZyAoIiVzIC0gVElTdGF5SW5Cb290TW9kZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIC0gVElTdGF5SW5Cb290TW9kZSIsIF9fZnVuY19fKTsKIAkJZ290byBTdGF5SW5Cb290TW9kZTsKIAl9CiAKQEAgLTEzODUsNyArMTM4Myw3IEBACiAJCSAqLwogCQl0aV9tYW51Zl9kZXNjID0ga21hbGxvYyAoc2l6ZW9mICgqdGlfbWFudWZfZGVzYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRpX21hbnVmX2Rlc2MpIHsKLQkJCWRldl9lcnIgKGRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyIChkZXYsICIlcyAtIG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzdGF0dXMgPSBUSVJlYWRNYW51ZkRlc2NyaXB0b3IgKHNlcmlhbCwgKF9fdTggKil0aV9tYW51Zl9kZXNjKTsKQEAgLTEzOTYsNyArMTM5NCw3IEBACiAKIAkJLy8gQ2hlY2sgZm9yIHZlcnNpb24gMgogCQlpZiAoIWlnbm9yZV9jcHVfcmV2ICYmIFRJX0dFVF9DUFVfUkVWSVNJT04odGlfbWFudWZfZGVzYy0+Q3B1UmV2X0JvYXJkUmV2KSA8IDIpIHsKLQkJCWRiZyAoIiVzIC0gV3JvbmcgQ1BVIFJldiAlZCAoTXVzdCBiZSAyKSIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZyAoIiVzIC0gV3JvbmcgQ1BVIFJldiAlZCAoTXVzdCBiZSAyKSIsIF9fZnVuY19fLAogCQkJICAgICBUSV9HRVRfQ1BVX1JFVklTSU9OKHRpX21hbnVmX2Rlc2MtPkNwdVJldl9Cb2FyZFJldikpOwogCQkJa2ZyZWUgKHRpX21hbnVmX2Rlc2MpOwogCQkJZ290byBTdGF5SW5Cb290TW9kZTsKQEAgLTE0MjAsNyArMTQxOCw3IEBACiAJCWJ1ZmZlcl9zaXplID0gKCgoMTAyNCAqIDE2KSAtIDUxMikgKyBzaXplb2Yoc3RydWN0IHRpX2kyY19pbWFnZV9oZWFkZXIpKTsKIAkJYnVmZmVyID0ga21hbGxvYyAoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewotCQkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGV2X2VyciAoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQkKQEAgLTE0NDAsMjAgKzE0MzgsMjAgQEAKIAkJaGVhZGVyLT5DaGVja1N1bSA9IGNzOwogCiAJCS8vIERvd25sb2FkIHRoZSBvcGVyYXRpb25hbCBjb2RlIAotCQlkYmcgKCIlcyAtIERvd25sb2FkaW5nIG9wZXJhdGlvbmFsIGNvZGUgaW1hZ2UgKFRJIFVNUCkiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIERvd25sb2FkaW5nIG9wZXJhdGlvbmFsIGNvZGUgaW1hZ2UgKFRJIFVNUCkiLCBfX2Z1bmNfXyk7CiAJCXN0YXR1cyA9IFRJRG93bmxvYWRDb2RlSW1hZ2UgKHNlcmlhbCwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CiAKIAkJa2ZyZWUgKGJ1ZmZlcik7CiAKIAkJaWYgKHN0YXR1cykgewotCSAgCQlkYmcgKCIlcyAtIEVycm9yIGRvd25sb2FkaW5nIG9wZXJhdGlvbmFsIGNvZGUgaW1hZ2UiLCBfX0ZVTkNUSU9OX18pOworCSAgCQlkYmcgKCIlcyAtIEVycm9yIGRvd25sb2FkaW5nIG9wZXJhdGlvbmFsIGNvZGUgaW1hZ2UiLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAKIAkJLy8gRGV2aWNlIHdpbGwgcmVib290CiAJCXNlcmlhbC0+cHJvZHVjdF9pbmZvLlRpTW9kZSA9IFRJX01PREVfVFJBTlNJVElPTklORzsKIAotICAJCWRiZyAoIiVzIC0gRG93bmxvYWQgc3VjY2Vzc2Z1bCAtLSBEZXZpY2UgcmVib290aW5nLi4uIiwgX19GVU5DVElPTl9fKTsKKyAgCQlkYmcgKCIlcyAtIERvd25sb2FkIHN1Y2Nlc3NmdWwgLS0gRGV2aWNlIHJlYm9vdGluZy4uLiIsIF9fZnVuY19fKTsKIAogCQkvKiByZXR1cm4gYW4gZXJyb3Igb24gcHVycG9zZSAqLwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0NjEsNyArMTQ1OSw3IEBACiAKIFN0YXlJbkJvb3RNb2RlOgogCS8vIEVwcm9tIGlzIGludmFsaWQgb3IgYmxhbmsgc3RheSBpbiBib290IG1vZGUKLQlkYmcgKCIlcyAtIDw8PDw8PDw8PDw8PDw8PFNUQVlJTkcgSU4gQk9PVCBNT0RFPj4+Pj4+Pj4+Pj4+IiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gU1RBWUlORyBJTiBCT09UIE1PREUiLCBfX2Z1bmNfXyk7CiAJc2VyaWFsLT5wcm9kdWN0X2luZm8uVGlNb2RlID0gVElfTU9ERV9CT09UOwogCiAJcmV0dXJuIDA7CkBAIC0xNDcyLDcgKzE0NzAsNyBAQAogewogCWludCBwb3J0X251bWJlciA9IHBvcnQtPnBvcnQtPm51bWJlciAtIHBvcnQtPnBvcnQtPnNlcmlhbC0+bWlub3I7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAJcG9ydC0+c2hhZG93X21jciB8PSBNQ1JfRFRSOwogCiAJcmV0dXJuIFRJV3JpdGVDb21tYW5kU3luYyAocG9ydC0+cG9ydC0+c2VyaWFsLT5kZXYsCkBAIC0xNDg3LDcgKzE0ODUsNyBAQAogewogCWludCBwb3J0X251bWJlciA9IHBvcnQtPnBvcnQtPm51bWJlciAtIHBvcnQtPnBvcnQtPnNlcmlhbC0+bWlub3I7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAJcG9ydC0+c2hhZG93X21jciAmPSB+TUNSX0RUUjsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtMTUwMiw3ICsxNTAwLDcgQEAKIHsKIAlpbnQgcG9ydF9udW1iZXIgPSBwb3J0LT5wb3J0LT5udW1iZXIgLSBwb3J0LT5wb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCXBvcnQtPnNoYWRvd19tY3IgfD0gTUNSX1JUUzsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtMTUxNyw3ICsxNTE1LDcgQEAKIHsKIAlpbnQgcG9ydF9udW1iZXIgPSBwb3J0LT5wb3J0LT5udW1iZXIgLSBwb3J0LT5wb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCXBvcnQtPnNoYWRvd19tY3IgJj0gfk1DUl9SVFM7CiAKIAlyZXR1cm4gVElXcml0ZUNvbW1hbmRTeW5jIChwb3J0LT5wb3J0LT5zZXJpYWwtPmRldiwKQEAgLTE1MzIsNyArMTUzMCw3IEBACiB7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydC0+bnVtYmVyIC0gcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCVVNUENfU0VUX0NMUl9MT09QQkFDSywKQEAgLTE1NDYsNyArMTU0NCw3IEBACiB7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydC0+bnVtYmVyIC0gcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCVVNUENfU0VUX0NMUl9MT09QQkFDSywKQEAgLTE1NjAsNyArMTU1OCw3IEBACiB7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydC0+bnVtYmVyIC0gcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCVVNUENfU0VUX0NMUl9CUkVBSywKQEAgLTE1NzQsNyArMTU3Miw3IEBACiB7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydC0+bnVtYmVyIC0gcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXJldHVybiBUSVdyaXRlQ29tbWFuZFN5bmMgKHBvcnQtPnBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCVVNUENfU0VUX0NMUl9CUkVBSywKQEAgLTE1ODgsNyArMTU4Niw3IEBACiB7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlkYmcgKCIlcyAtICV4IiwgX19GVU5DVElPTl9fLCBtY3IpOworCWRiZyAoIiVzIC0gJXgiLCBfX2Z1bmNfXywgbWNyKTsKIAogCWlmIChtY3IgJiBNQ1JfRFRSKQogCQlzdGF0dXMgPSBUSVNldER0ciAocG9ydCk7CkBAIC0xNjQyLDcgKzE2NDAsNyBAQAogCXN0cnVjdCBhc3luY19pY291bnQgKmljb3VudDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCi0JZGJnICgiJXMgLSAlMDJ4IiwgX19GVU5DVElPTl9fLCBtc3IpOworCWRiZyAoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBtc3IpOwogCiAJaWYgKG1zciAmIChFREdFUE9SVF9NU1JfREVMVEFfQ1RTIHwgRURHRVBPUlRfTVNSX0RFTFRBX0RTUiB8IEVER0VQT1JUX01TUl9ERUxUQV9SSSB8IEVER0VQT1JUX01TUl9ERUxUQV9DRCkpIHsKIAkJaWNvdW50ID0gJmVkZ2VfcG9ydC0+aWNvdW50OwpAQCAtMTY4MSw3ICsxNjc5LDcgQEAKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50ICppY291bnQ7CiAJX191OCBuZXdfbHNyID0gKF9fdTgpKGxzciAmIChfX3U4KShMU1JfT1ZFUl9FUlIgfCBMU1JfUEFSX0VSUiB8IExTUl9GUk1fRVJSIHwgTFNSX0JSRUFLKSk7CiAKLQlkYmcgKCIlcyAtICUwMngiLCBfX0ZVTkNUSU9OX18sIG5ld19sc3IpOworCWRiZyAoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBuZXdfbHNyKTsKIAogCWVkZ2VfcG9ydC0+c2hhZG93X2xzciA9IGxzcjsKIApAQCAtMTcxMiw3ICsxNzEwLDcgQEAKIAogc3RhdGljIHZvaWQgZWRnZV9pbnRlcnJ1cHRfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsICplZGdlX3NlcmlhbCA9IChzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKmVkZ2Vfc2VyaWFsID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0xNzI0LDcgKzE3MjIsNyBAQAogCV9fdTggbXNyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTE3MzUsMzQgKzE3MzMsMzQgQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICIKLQkJCSIlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJIiVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KIAogCWlmICghbGVuZ3RoKSB7Ci0JCWRiZyAoIiVzIC0gbm8gZGF0YSBpbiB1cmIiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIGRhdGEgaW4gdXJiIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCQkKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZlZGdlX3NlcmlhbC0+c2VyaWFsLT5kZXYtPmRldiwgX19GVU5DVElPTl9fLCBsZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCBfX2Z1bmNfXywgbGVuZ3RoLCBkYXRhKTsKIAkJCiAJaWYgKGxlbmd0aCAhPSAyKSB7Ci0JCWRiZyAoIiVzIC0gZXhwZWN0aW5nIHBhY2tldCBvZiBzaXplIDIsIGdvdCAlZCIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwkJZGJnICgiJXMgLSBleHBlY3RpbmcgcGFja2V0IG9mIHNpemUgMiwgZ290ICVkIiwgX19mdW5jX18sIGxlbmd0aCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlwb3J0X251bWJlciA9IFRJVU1QX0dFVF9QT1JUX0ZST01fQ09ERSAoZGF0YVswXSk7CiAJZnVuY3Rpb24gICAgPSBUSVVNUF9HRVRfRlVOQ19GUk9NX0NPREUgKGRhdGFbMF0pOwogCWRiZyAoIiVzIC0gcG9ydF9udW1iZXIgJWQsIGZ1bmN0aW9uICVkLCBpbmZvIDB4JXgiLAotCSAgICAgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgZnVuY3Rpb24sIGRhdGFbMV0pOworCSAgICAgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBmdW5jdGlvbiwgZGF0YVsxXSk7CiAJcG9ydCA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPnBvcnRbcG9ydF9udW1iZXJdOwogCWVkZ2VfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpZiAoIWVkZ2VfcG9ydCkgewotCQlkYmcgKCIlcyAtIGVkZ2VfcG9ydCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIGVkZ2VfcG9ydCBub3QgZm91bmQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJc3dpdGNoIChmdW5jdGlvbikgewpAQCAtMTc3MSwxMiArMTc2OSwxMiBAQAogCQlpZiAobHNyICYgVU1QX1VBUlRfTFNSX0RBVEFfTUFTSykgewogCQkJLyogU2F2ZSB0aGUgTFNSIGV2ZW50IGZvciBidWxrIHJlYWQgY29tcGxldGlvbiByb3V0aW5lICovCiAJCQlkYmcgKCIlcyAtIExTUiBFdmVudCBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4IiwKLQkJCSAgICAgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgbHNyKTsKKwkJCSAgICAgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBsc3IpOwogCQkJZWRnZV9wb3J0LT5sc3JfZXZlbnQgPSAxOwogCQkJZWRnZV9wb3J0LT5sc3JfbWFzayA9IGxzcjsKIAkJfSBlbHNlIHsKIAkJCWRiZyAoIiVzIC0gPT09PT0gUG9ydCAlZCBMU1IgU3RhdHVzID0gJTAyeCA9PT09PT0iLAotCQkJICAgICBfX0ZVTkNUSU9OX18sIHBvcnRfbnVtYmVyLCBsc3IpOworCQkJICAgICBfX2Z1bmNfXywgcG9ydF9udW1iZXIsIGxzcik7CiAJCQloYW5kbGVfbmV3X2xzciAoZWRnZV9wb3J0LCAwLCBsc3IsIDApOwogCQl9CiAJCWJyZWFrOwpAQCAtMTc4NSwxMyArMTc4MywxMyBAQAogCQkvKiBDb3B5IE1TUiBmcm9tIFVNUCAqLwogCQltc3IgPSBkYXRhWzFdOwogCQlkYmcgKCIlcyAtID09PT09IFBvcnQgJXUgTVNSIFN0YXR1cyA9ICUwMnggPT09PT09XG4iLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcG9ydF9udW1iZXIsIG1zcik7CisJCSAgICAgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBtc3IpOwogCQloYW5kbGVfbmV3X21zciAoZWRnZV9wb3J0LCBtc3IpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCWRldl9lcnIgKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBVbmtub3duIEludGVycnVwdCBjb2RlIGZyb20gVU1QICV4XG4iLAotCQkJIF9fRlVOQ1RJT05fXywgZGF0YVsxXSk7CisJCQkgX19mdW5jX18sIGRhdGFbMV0pOwogCQlicmVhazsKIAkJCiAJfQpAQCAtMTgwMCwxOSArMTc5OCwxOSBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpCiAJCWRldl9lcnIgKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWRcbiIsCi0JCQkgX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJIF9fZnVuY19fLCByZXR2YWwpOwogfQogCiBzdGF0aWMgdm9pZCBlZGdlX2J1bGtfaW5fY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gKHN0cnVjdCBlZGdlcG9ydF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHJldHZhbCA9IDA7CiAJaW50IHBvcnRfbnVtYmVyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTE4MjMsMTggKzE4MjEsMTggQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyICgmdXJiLT5kZXYtPmRldiwiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAlpZiAoc3RhdHVzID09IC1FUElQRSkKIAkJZ290byBleGl0OwogCiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCIlcyAtIHN0b3BwaW5nIHJlYWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCIlcyAtIHN0b3BwaW5nIHJlYWQhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE4NDMsNyArMTg0MSw3IEBACiAJaWYgKGVkZ2VfcG9ydC0+bHNyX2V2ZW50KSB7CiAJCWVkZ2VfcG9ydC0+bHNyX2V2ZW50ID0gMDsKIAkJZGJnICgiJXMgPT09PT0gUG9ydCAldSBMU1IgU3RhdHVzID0gJTAyeCwgRGF0YSA9ICUwMnggPT09PT09IiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHBvcnRfbnVtYmVyLCBlZGdlX3BvcnQtPmxzcl9tYXNrLCAqZGF0YSk7CisJCSAgICAgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBlZGdlX3BvcnQtPmxzcl9tYXNrLCAqZGF0YSk7CiAJCWhhbmRsZV9uZXdfbHNyIChlZGdlX3BvcnQsIDEsIGVkZ2VfcG9ydC0+bHNyX21hc2ssICpkYXRhKTsKIAkJLyogQWRqdXN0IGJ1ZmZlciBsZW5ndGgvcG9pbnRlciAqLwogCQktLXVyYi0+YWN0dWFsX2xlbmd0aDsKQEAgLTE4NTIsMTAgKzE4NTAsMTAgQEAKIAogCXR0eSA9IGVkZ2VfcG9ydC0+cG9ydC0+dHR5OwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCQlpZiAoZWRnZV9wb3J0LT5jbG9zZV9wZW5kaW5nKSB7Ci0JCQlkYmcgKCIlcyAtIGNsb3NlIGlzIHBlbmRpbmcsIGRyb3BwaW5nIGRhdGEgb24gdGhlIGZsb29yLiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcgKCIlcyAtIGNsb3NlIGlzIHBlbmRpbmcsIGRyb3BwaW5nIGRhdGEgb24gdGhlIGZsb29yLiIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCWVkZ2VfdHR5X3JlY3YoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCB0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCX0KQEAgLTE4NzQsNyArMTg3Miw3IEBACiAJc3Bpbl91bmxvY2soJmVkZ2VfcG9ydC0+ZXBfbG9jayk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VyciAoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkgX19mdW5jX18sIHJldHZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVkZ2VfdHR5X3JlY3Yoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuZ3RoKQpAQCAtMTg4NSw3ICsxODgzLDcgQEAKIAkJY250ID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBsZW5ndGgpOwogCQlpZiAoY250IDwgbGVuZ3RoKSB7CiAJCQlkZXZfZXJyKGRldiwgIiVzIC0gZHJvcHBpbmcgZGF0YSwgJWQgYnl0ZXMgbG9zdFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGxlbmd0aCAtIGNudCk7CisJCQkJX19mdW5jX18sIGxlbmd0aCAtIGNudCk7CiAJCQlpZihjbnQgPT0gMCkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTg5OSwxMSArMTg5NywxMSBAQAogCiBzdGF0aWMgdm9pZCBlZGdlX2J1bGtfb3V0X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcgKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnICgiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAllZGdlX3BvcnQtPmVwX3dyaXRlX3VyYl9pbl91c2UgPSAwOwogCkBAIC0xOTE2LDExICsxOTE0LDExIEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyAiCi0JCQkicmVjZWl2ZWQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkicmVjZWl2ZWQ6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAkvKiBzZW5kIGFueSBidWZmZXJlZCBkYXRhICovCkBAIC0xOTM4LDEzICsxOTM2LDEyIEBACiAJdTE2IG9wZW5fc2V0dGluZ3M7CiAJdTggdHJhbnNhY3Rpb25fdGltZW91dDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHBvcnQtPnR0eSkKLQkJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IGxvd19sYXRlbmN5OworCXBvcnQtPnR0eS0+bG93X2xhdGVuY3kgPSBsb3dfbGF0ZW5jeTsKIAogCXBvcnRfbnVtYmVyID0gcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vcjsKIAlzd2l0Y2ggKHBvcnRfbnVtYmVyKSB7CkBAIC0xOTYyLDcgKzE5NTksNyBAQAogCX0KIAogCWRiZyAoIiVzIC0gcG9ydF9udW1iZXIgPSAlZCwgdWFydF9iYXNlID0gJTA0eCwgZG1hX2FkZHJlc3MgPSAlMDR4IiwKLQkgICAgIF9fRlVOQ1RJT05fXywgcG9ydF9udW1iZXIsIGVkZ2VfcG9ydC0+dWFydF9iYXNlLCBlZGdlX3BvcnQtPmRtYV9hZGRyZXNzKTsKKwkgICAgIF9fZnVuY19fLCBwb3J0X251bWJlciwgZWRnZV9wb3J0LT51YXJ0X2Jhc2UsIGVkZ2VfcG9ydC0+ZG1hX2FkZHJlc3MpOwogCiAJZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAKQEAgLTE5NzMsNyArMTk3MCw3IEBACiAJc3RhdHVzID0gVElDbGVhckxvb3BCYWNrIChlZGdlX3BvcnQpOwogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCIlcyAtIGNhbm5vdCBzZW5kIGNsZWFyIGxvb3BiYWNrIGNvbW1hbmQsICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCQpAQCAtMTk5Miw3ICsxOTg5LDcgQEAKIAkJCSAgICAgVU1QX1BJUEVfVFJBTlNfVElNRU9VVF9FTkEgfCAKIAkJCSAgICAgKHRyYW5zYWN0aW9uX3RpbWVvdXQgPDwgMikpOwogCi0JZGJnICgiJXMgLSBTZW5kaW5nIFVNUENfT1BFTl9QT1JUIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyAtIFNlbmRpbmcgVU1QQ19PUEVOX1BPUlQiLCBfX2Z1bmNfXyk7CiAKIAkvKiBUZWxsIFRJIHRvIG9wZW4gYW5kIHN0YXJ0IHRoZSBwb3J0ICovCiAJc3RhdHVzID0gVElXcml0ZUNvbW1hbmRTeW5jIChkZXYsCkBAIC0yMDAyLDcgKzE5OTksNyBAQAogCQkJCQlOVUxMLAogCQkJCQkwKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwiJXMgLSBjYW5ub3Qgc2VuZCBvcGVuIGNvbW1hbmQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwiJXMgLSBjYW5ub3Qgc2VuZCBvcGVuIGNvbW1hbmQsICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTIwMTQsMTQgKzIwMTEsMTQgQEAKIAkJCQkJTlVMTCwKIAkJCQkJMCk7CiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsIiVzIC0gY2Fubm90IHNlbmQgc3RhcnQgRE1BIGNvbW1hbmQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwiJXMgLSBjYW5ub3Qgc2VuZCBzdGFydCBETUEgY29tbWFuZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCS8qIENsZWFyIFRYIGFuZCBSWCBidWZmZXJzIGluIFVNUCAqLwogCXN0YXR1cyA9IFRJUHVyZ2VEYXRhU3luYyAocG9ydCwgVU1QX1BPUlRfRElSX09VVCB8IFVNUF9QT1JUX0RJUl9JTik7CiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsIiVzIC0gY2Fubm90IHNlbmQgY2xlYXIgYnVmZmVycyBjb21tYW5kLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsIiVzIC0gY2Fubm90IHNlbmQgY2xlYXIgYnVmZmVycyBjb21tYW5kLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCkBAIC0yMDMzLDcgKzIwMzAsNyBAQAogCQkJCQkmZWRnZV9wb3J0LT5zaGFkb3dfbXNyLAkJCS8vIFRyYW5zZmVyQnVmZmVyCiAJCQkJCTEpOwkJCQkJLy8gVHJhbnNmZXJCdWZmZXJMZW5ndGgKIAlpZiAoc3RhdHVzKSB7Ci0gCQlkZXZfZXJyKCZwb3J0LT5kZXYsIiVzIC0gY2Fubm90IHNlbmQgcmVhZCBNU1IgY29tbWFuZCwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAJCWRldl9lcnIoJnBvcnQtPmRldiwiJXMgLSBjYW5ub3Qgc2VuZCByZWFkIE1TUiBjb21tYW5kLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCkBAIC0yMDUwLDcgKzIwNDcsNyBAQAogCQkvKiB3ZSBhcmUgdGhlIGZpcnN0IHBvcnQgdG8gYmUgb3BlbmVkLCBsZXQncyBwb3N0IHRoZSBpbnRlcnJ1cHQgdXJiICovCiAJCXVyYiA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl91cmI7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBubyBpbnRlcnJ1cHQgdXJiIHByZXNlbnQsIGV4aXRpbmdcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBubyBpbnRlcnJ1cHQgdXJiIHByZXNlbnQsIGV4aXRpbmdcbiIsIF9fZnVuY19fKTsKIAkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCQlnb3RvIHJlbGVhc2VfZXNfbG9jazsKIAkJfQpAQCAtMjA1OSw3ICsyMDU2LDcgQEAKIAkJdXJiLT5kZXYgPSBkZXY7CiAJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9LRVJORUwpOwogCQlpZiAoc3RhdHVzKSB7Ci0JCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCB2YWx1ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggdmFsdWUgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJZ290byByZWxlYXNlX2VzX2xvY2s7CiAJCX0KIAl9CkBAIC0yMDc0LDcgKzIwNzEsNyBAQAogCS8qIHN0YXJ0IHVwIG91ciBidWxrIHJlYWQgdXJiICovCiAJdXJiID0gcG9ydC0+cmVhZF91cmI7CiAJaWYgKCF1cmIpIHsKLQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gbm8gcmVhZCB1cmIgcHJlc2VudCwgZXhpdGluZ1xuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gbm8gcmVhZCB1cmIgcHJlc2VudCwgZXhpdGluZ1xuIiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KQEAgLTIwODQsMTMgKzIwODEsMTMgQEAKIAl1cmItPmRldiA9IGRldjsKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIgKCZwb3J0LT5kZXYsICIlcyAtIHJlYWQgYnVsayB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCB2YWx1ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSByZWFkIGJ1bGsgdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggdmFsdWUgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAogCSsrZWRnZV9zZXJpYWwtPm51bV9wb3J0c19vcGVuOwogCi0JZGJnKCIlcyAtIGV4aXRlZCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGV4aXRlZCIsIF9fZnVuY19fKTsKIAogCWdvdG8gcmVsZWFzZV9lc19sb2NrOwogCkBAIC0yMTA5LDcgKzIxMDYsNyBAQAogCWludCBwb3J0X251bWJlcjsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCSAKIAllZGdlX3NlcmlhbCA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKIAllZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0yMTI5LDcgKzIxMjYsNyBAQAogCiAJLyogYXNzdW1pbmcgd2UgY2FuIHN0aWxsIHRhbGsgdG8gdGhlIGRldmljZSwKIAkgKiBzZW5kIGEgY2xvc2UgcG9ydCBjb21tYW5kIHRvIGl0ICovCi0JZGJnKCIlcyAtIHNlbmQgdW1wY19jbG9zZV9wb3J0IiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc2VuZCB1bXBjX2Nsb3NlX3BvcnQiLCBfX2Z1bmNfXyk7CiAJcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCXN0YXR1cyA9IFRJV3JpdGVDb21tYW5kU3luYyAocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkJICAgICBVTVBDX0NMT1NFX1BPUlQsCkBAIC0yMTQ3LDcgKzIxNDQsNyBAQAogCW11dGV4X3VubG9jaygmZWRnZV9zZXJpYWwtPmVzX2xvY2spOwogCWVkZ2VfcG9ydC0+Y2xvc2VfcGVuZGluZyA9IDA7CiAKLQlkYmcoIiVzIC0gZXhpdGVkIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gZXhpdGVkIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgaW50IGVkZ2Vfd3JpdGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjb3VudCkKQEAgLTIxNTUsMTAgKzIxNTIsMTAgQEAKIAlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjE4NCw3ICsyMTgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2VfcG9ydC0+ZXBfbG9jaywgZmxhZ3MpOwogCkBAIC0yMjA2LDcgKzIyMDMsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJLyogc2V0IHVwIG91ciB1cmIgKi8KIAl1c2JfZmlsbF9idWxrX3VyYiAocG9ydC0+d3JpdGVfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKQEAgLTIyMTksNyArMjIxNiw3IEBACiAJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJZWRnZV9wb3J0LT5lcF93cml0ZV91cmJfaW5fdXNlID0gMDsKIAkJLy8gVE9ETzogcmVzY2hlZHVsZSBlZGdlX3NlbmQKIAl9IGVsc2UgewpAQCAtMjI0MCw3ICsyMjM3LDcgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjI1MSw3ICsyMjQ4LDcgQEAKIAlyb29tID0gZWRnZV9idWZfc3BhY2VfYXZhaWwoZWRnZV9wb3J0LT5lcF9vdXRfYnVmKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIH0KIApAQCAtMjI2MSw3ICsyMjU4LDcgQEAKIAlpbnQgY2hhcnMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGVkZ2VfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTIyNzIsNyArMjI2OSw3IEBACiAJY2hhcnMgPSBlZGdlX2J1Zl9kYXRhX2F2YWlsKGVkZ2VfcG9ydC0+ZXBfb3V0X2J1Zik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZV9wb3J0LT5lcF9sb2NrLCBmbGFncyk7CiAKLQlkYmcgKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIGNoYXJzKTsKKwlkYmcgKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiBjaGFyczsKIH0KIApAQCAtMjI4MiwxNCArMjI3OSwxNCBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyOTgsNyArMjI5NSw3IEBACiAJCXVuc2lnbmVkIGNoYXIgc3RvcF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CiAJCXN0YXR1cyA9IGVkZ2Vfd3JpdGUgKHBvcnQsICZzdG9wX2NoYXIsIDEpOwogCQlpZiAoc3RhdHVzIDw9IDApIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHdyaXRlIHN0b3AgY2hhcmFjdGVyLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgdG8gd3JpdGUgc3RvcCBjaGFyYWN0ZXIsICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJfQogCX0KIApAQCAtMjMxNSwxNCArMjMxMiwxNCBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIzMzEsNyArMjMyOCw3IEBACiAJCXVuc2lnbmVkIGNoYXIgc3RhcnRfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKIAkJc3RhdHVzID0gZWRnZV93cml0ZSAocG9ydCwgJnN0YXJ0X2NoYXIsIDEpOwogCQlpZiAoc3RhdHVzIDw9IDApIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHdyaXRlIHN0YXJ0IGNoYXJhY3RlciwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHdyaXRlIHN0YXJ0IGNoYXJhY3RlciwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0yMzQwLDcgKzIzMzcsNyBAQAogCWlmIChDX0NSVFNDVFModHR5KSkgewogCQlzdGF0dXMgPSByZXN0YXJ0X3JlYWQoZWRnZV9wb3J0KTsKIAkJaWYgKHN0YXR1cykKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gcmVhZCBidWxrIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHZhbHVlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHJlYWQgYnVsayB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCB2YWx1ZSAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJfQogCiB9CkBAIC0yMzkwLDEzICsyMzg3LDEzIEBACiAJaW50IHN0YXR1czsKIAlpbnQgcG9ydF9udW1iZXIgPSBlZGdlX3BvcnQtPnBvcnQtPm51bWJlciAtIGVkZ2VfcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBlZGdlX3BvcnQtPnBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgZWRnZV9wb3J0LT5wb3J0LT5udW1iZXIpOwogCiAJdHR5ID0gZWRnZV9wb3J0LT5wb3J0LT50dHk7CiAKIAljb25maWcgPSBrbWFsbG9jIChzaXplb2YgKCpjb25maWcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbmZpZykgewotCQlkZXZfZXJyICgmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIgKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNDEyLDIwICsyNDA5LDIwIEBACiAJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CiAJCWNhc2UgQ1M1OgogCQkJICAgIGNvbmZpZy0+YkRhdGFCaXRzID0gVU1QX1VBUlRfQ0hBUjVCSVRTOwotCQkJICAgIGRiZyAoIiVzIC0gZGF0YSBiaXRzID0gNSIsIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgZGJnICgiJXMgLSBkYXRhIGJpdHMgPSA1IiwgX19mdW5jX18pOwogCQkJICAgIGJyZWFrOwogCQljYXNlIENTNjoKIAkJCSAgICBjb25maWctPmJEYXRhQml0cyA9IFVNUF9VQVJUX0NIQVI2QklUUzsKLQkJCSAgICBkYmcgKCIlcyAtIGRhdGEgYml0cyA9IDYiLCBfX0ZVTkNUSU9OX18pOworCQkJICAgIGRiZyAoIiVzIC0gZGF0YSBiaXRzID0gNiIsIF9fZnVuY19fKTsKIAkJCSAgICBicmVhazsKIAkJY2FzZSBDUzc6CiAJCQkgICAgY29uZmlnLT5iRGF0YUJpdHMgPSBVTVBfVUFSVF9DSEFSN0JJVFM7Ci0JCQkgICAgZGJnICgiJXMgLSBkYXRhIGJpdHMgPSA3IiwgX19GVU5DVElPTl9fKTsKKwkJCSAgICBkYmcgKCIlcyAtIGRhdGEgYml0cyA9IDciLCBfX2Z1bmNfXyk7CiAJCQkgICAgYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCWNhc2UgQ1M4OgogCQkJICAgIGNvbmZpZy0+YkRhdGFCaXRzID0gVU1QX1VBUlRfQ0hBUjhCSVRTOwotCQkJICAgIGRiZyAoIiVzIC0gZGF0YSBiaXRzID0gOCIsIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgZGJnICgiJXMgLSBkYXRhIGJpdHMgPSA4IiwgX19mdW5jX18pOwogCQkJICAgIGJyZWFrOwogCX0KIApAQCAtMjQzMywzMiArMjQzMCwzMiBAQAogCQlpZiAoY2ZsYWcgJiBQQVJPREQpIHsKIAkJCWNvbmZpZy0+d0ZsYWdzIHw9IFVNUF9NQVNLX1VBUlRfRkxBR1NfUEFSSVRZOwogCQkJY29uZmlnLT5iUGFyaXR5ID0gVU1QX1VBUlRfT0REUEFSSVRZOwotCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gb2RkIiwgX19mdW5jX18pOwogCQl9IGVsc2UgewogCQkJY29uZmlnLT53RmxhZ3MgfD0gVU1QX01BU0tfVUFSVF9GTEFHU19QQVJJVFk7CiAJCQljb25maWctPmJQYXJpdHkgPSBVTVBfVUFSVF9FVkVOUEFSSVRZOwotCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX2Z1bmNfXyk7CiAJCX0KIAl9IGVsc2UgewogCQljb25maWctPmJQYXJpdHkgPSBVTVBfVUFSVF9OT1BBUklUWTsgCQotCQlkYmcoIiVzIC0gcGFyaXR5ID0gbm9uZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19mdW5jX18pOwogCX0KIAogCWlmIChjZmxhZyAmIENTVE9QQikgewogCQljb25maWctPmJTdG9wQml0cyA9IFVNUF9VQVJUX1NUT1BCSVQyOwotCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAyIiwgX19mdW5jX18pOwogCX0gZWxzZSB7CiAJCWNvbmZpZy0+YlN0b3BCaXRzID0gVU1QX1VBUlRfU1RPUEJJVDE7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJfQogCiAJLyogZmlndXJlIG91dCB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzICovCiAJaWYgKGNmbGFnICYgQ1JUU0NUUykgewogCQljb25maWctPndGbGFncyB8PSBVTVBfTUFTS19VQVJUX0ZMQUdTX09VVF9YX0NUU19GTE9XOwogCQljb25maWctPndGbGFncyB8PSBVTVBfTUFTS19VQVJUX0ZMQUdTX1JUU19GTE9XOwotCQlkYmcoIiVzIC0gUlRTL0NUUyBpcyBlbmFibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIFJUUy9DVFMgaXMgZW5hYmxlZCIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewotCQlkYmcoIiVzIC0gUlRTL0NUUyBpcyBkaXNhYmxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBSVFMvQ1RTIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOwogCQl0dHktPmh3X3N0b3BwZWQgPSAwOwogCQlyZXN0YXJ0X3JlYWQoZWRnZV9wb3J0KTsKIAl9CkBAIC0yNDcyLDE4ICsyNDY5LDE4IEBACiAJCWlmIChJX0lYT0ZGKHR0eSkpIHsKIAkJCWNvbmZpZy0+d0ZsYWdzIHw9IFVNUF9NQVNLX1VBUlRfRkxBR1NfSU5fWDsKIAkJCWRiZyAoIiVzIC0gSU5CT1VORCBYT04vWE9GRiBpcyBlbmFibGVkLCBYT04gPSAlMngsIFhPRkYgPSAlMngiLAotCQkJICAgICBfX0ZVTkNUSU9OX18sIGNvbmZpZy0+Y1hvbiwgY29uZmlnLT5jWG9mZik7CisJCQkgICAgIF9fZnVuY19fLCBjb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYpOwogCQl9IGVsc2UgewotCQkJZGJnICgiJXMgLSBJTkJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZyAoIiVzIC0gSU5CT1VORCBYT04vWE9GRiBpcyBkaXNhYmxlZCIsIF9fZnVuY19fKTsKIAkJfQogCiAJCS8qIGlmIHdlIGFyZSBpbXBsZW1lbnRpbmcgT1VUQk9VTkQgWE9OL1hPRkYgKi8KIAkJaWYgKElfSVhPTih0dHkpKSB7CiAJCQljb25maWctPndGbGFncyB8PSBVTVBfTUFTS19VQVJUX0ZMQUdTX09VVF9YOwogCQkJZGJnICgiJXMgLSBPVVRCT1VORCBYT04vWE9GRiBpcyBlbmFibGVkLCBYT04gPSAlMngsIFhPRkYgPSAlMngiLAotCQkJICAgICBfX0ZVTkNUSU9OX18sIGNvbmZpZy0+Y1hvbiwgY29uZmlnLT5jWG9mZik7CisJCQkgICAgIF9fZnVuY19fLCBjb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYpOwogCQl9IGVsc2UgewotCQkJZGJnICgiJXMgLSBPVVRCT1VORCBYT04vWE9GRiBpcyBkaXNhYmxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcgKCIlcyAtIE9VVEJPVU5EIFhPTi9YT0ZGIGlzIGRpc2FibGVkIiwgX19mdW5jX18pOwogCQl9CiAJfQogCkBAIC0yNTAyLDcgKzI0OTksNyBAQAogCiAJLyogRklYTUU6IFJlY29tcHV0ZSBhY3R1YWwgYmF1ZCBmcm9tIGRpdmlzb3IgaGVyZSAqLwogCi0JZGJnICgiJXMgLSBiYXVkIHJhdGUgPSAlZCwgd0JhdWRSYXRlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWQsIGNvbmZpZy0+d0JhdWRSYXRlKTsKKwlkYmcgKCIlcyAtIGJhdWQgcmF0ZSA9ICVkLCB3QmF1ZFJhdGUgPSAlZCIsIF9fZnVuY19fLCBiYXVkLCBjb25maWctPndCYXVkUmF0ZSk7CiAKIAlkYmcgKCJ3QmF1ZFJhdGU6ICAgJWQiLCAoaW50KSg0NjE1NTBMIC8gY29uZmlnLT53QmF1ZFJhdGUpKTsKIAlkYmcgKCJ3RmxhZ3M6ICAgIDB4JXgiLCBjb25maWctPndGbGFncyk7CkBAIC0yNTI1LDcgKzI1MjIsNyBAQAogCQkJCXNpemVvZigqY29uZmlnKSk7CiAJaWYgKHN0YXR1cykgewogCQlkYmcgKCIlcyAtIGVycm9yICVkIHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGNvbmZpZyB0byBkZXZpY2UiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAl9CiAKIAlrZnJlZSAoY29uZmlnKTsKQEAgLTI1NDEsMTIgKzI1MzgsMTIgQEAKIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCi0JZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywgCisJZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fZnVuY19fLAogCSAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcsIHR0eS0+dGVybWlvcy0+Y19pZmxhZyk7Ci0JZGJnKCIlcyAtIG9sZCBjbGZhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgLSBvbGQgY2xmYWcgJTA4eCBvbGQgaWZsYWcgJTA4eCIsIF9fZnVuY19fLAogCSAgICBvbGRfdGVybWlvcy0+Y19jZmxhZywgb2xkX3Rlcm1pb3MtPmNfaWZsYWcpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChlZGdlX3BvcnQgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMjU2MSw5ICsyNTU4LDExIEBACiB7CiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBpbnQgbWNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2VfcG9ydC0+ZXBfbG9jaywgZmxhZ3MpOwogCW1jciA9IGVkZ2VfcG9ydC0+c2hhZG93X21jcjsKIAlpZiAoc2V0ICYgVElPQ01fUlRTKQogCQltY3IgfD0gTUNSX1JUUzsKQEAgLTI1ODAsNiArMjU3OSw3IEBACiAJCW1jciAmPSB+TUNSX0xPT1BCQUNLOwogCiAJZWRnZV9wb3J0LT5zaGFkb3dfbWNyID0gbWNyOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZ2VfcG9ydC0+ZXBfbG9jaywgZmxhZ3MpOwogCiAJVElSZXN0b3JlTUNSIChlZGdlX3BvcnQsIG1jcik7CiAKQEAgLTI1OTIsOCArMjU5MiwxMSBAQAogCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOwogCXVuc2lnbmVkIGludCBtc3I7CiAJdW5zaWduZWQgaW50IG1jcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAogCW1zciA9IGVkZ2VfcG9ydC0+c2hhZG93X21zcjsKIAltY3IgPSBlZGdlX3BvcnQtPnNoYWRvd19tY3I7CkBAIC0yNjA1LDcgKzI2MDgsOCBAQAogCQkgIHwgKChtc3IgJiBFREdFUE9SVF9NU1JfRFNSKQk/IFRJT0NNX0RTUjogMCk7ICAvKiAweDEwMCAqLwogCiAKLQlkYmcoIiVzIC0tICV4IiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCWRiZygiJXMgLS0gJXgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGdlX3BvcnQtPmVwX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0yNjQ0LDMwICsyNjQ4LDMwIEBACiAJc3RydWN0IGFzeW5jX2ljb3VudCBjbm93OwogCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXY7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgPSAweCV4IiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgVElPQ0lOUToKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NJTlEiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCQlkYmcoIiVzIC0gKCVkKSBUSU9DSU5RIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAvLwkJCXJldHVybiBnZXRfbnVtYmVyX2J5dGVzX2F2YWlsKGVkZ2VfcG9ydCwgKHVuc2lnbmVkIGludCAqKSBhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DU0VSR0VUTFNSOgotCQkJZGJnKCIlcyAtICglZCkgVElPQ1NFUkdFVExTUiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIC8vCQkJcmV0dXJuIGdldF9sc3JfaW5mbyhlZGdlX3BvcnQsICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCQlkYmcoIiVzIC0gKCVkKSBUSU9DR1NFUklBTCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSAoJWQpIFRJT0NHU0VSSUFMIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGVkZ2VfcG9ydCwgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DU1NFUklBTDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NTU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAtICglZCkgVElPQ1NTRVJJQUwiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVElPQ01JV0FJVDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NNSVdBSVQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCQlkYmcoIiVzIC0gKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQljcHJldiA9IGVkZ2VfcG9ydC0+aWNvdW50OwogCQkJd2hpbGUgKDEpIHsKIAkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZlZGdlX3BvcnQtPmRlbHRhX21zcl93YWl0KTsKQEAgLTI2OTAsNyArMjY5NCw3IEBACiAJCQlicmVhazsKIAogCQljYXNlIFRJT0NHSUNPVU5UOgotCQkJZGJnICgiJXMgLSAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZyAoIiVzIC0gKCVkKSBUSU9DR0lDT1VOVCBSWD0lZCwgVFg9JWQiLCBfX2Z1bmNfXywKIAkJCSAgICAgcG9ydC0+bnVtYmVyLCBlZGdlX3BvcnQtPmljb3VudC5yeCwgZWRnZV9wb3J0LT5pY291bnQudHgpOwogCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZlZGdlX3BvcnQtPmljb3VudCwgc2l6ZW9mKGVkZ2VfcG9ydC0+aWNvdW50KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yNzA1LDcgKzI3MDksNyBAQAogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHN0YXR1czsKIAotCWRiZyAoIiVzIC0gc3RhdGUgPSAlZCIsIF9fRlVOQ1RJT05fXywgYnJlYWtfc3RhdGUpOworCWRiZyAoIiVzIC0gc3RhdGUgPSAlZCIsIF9fZnVuY19fLCBicmVha19zdGF0ZSk7CiAKIAkvKiBjaGFzZSB0aGUgcG9ydCBjbG9zZSAqLwogCVRJQ2hhc2VQb3J0IChlZGdlX3BvcnQsIDAsIDApOwpAQCAtMjcxNyw3ICsyNzIxLDcgQEAKIAl9CiAJaWYgKHN0YXR1cykgewogCQlkYmcgKCIlcyAtIGVycm9yICVkIHNlbmRpbmcgYnJlYWsgc2V0L2NsZWFyIGNvbW1hbmQuIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJfQogfQogCkBAIC0yNzM0LDcgKzI3MzgsNyBAQAogCS8qIGNyZWF0ZSBvdXIgcHJpdmF0ZSBzZXJpYWwgc3RydWN0dXJlICovCiAJZWRnZV9zZXJpYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWRnZXBvcnRfc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVkZ2Vfc2VyaWFsID09IE5VTEwpIHsKLQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbXV0ZXhfaW5pdCgmZWRnZV9zZXJpYWwtPmVzX2xvY2spOwpAQCAtMjc1MSwxMyArMjc1NSwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCWVkZ2VfcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZGdlcG9ydF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlZGdlX3BvcnQgPT0gTlVMTCkgewotCQkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCQlzcGluX2xvY2tfaW5pdCgmZWRnZV9wb3J0LT5lcF9sb2NrKTsKIAkJZWRnZV9wb3J0LT5lcF9vdXRfYnVmID0gZWRnZV9idWZfYWxsb2MoRURHRV9PVVRfQlVGX1NJWkUpOwogCQlpZiAoZWRnZV9wb3J0LT5lcF9vdXRfYnVmID09IE5VTEwpIHsKLQkJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSBPdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCQlrZnJlZShlZGdlX3BvcnQpOwogCQkJZ290byBjbGVhbnVwOwogCQl9CkBAIC0yNzg2LDcgKzI3OTAsNyBAQAogCWludCBpOwogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQ7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQllZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKTsKQEAgLTI4MTgsMTIgKzI4MjIsMTIgQEAKIAlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGludCB2ID0gc2ltcGxlX3N0cnRvdWwodmFsYnVmLCBOVUxMLCAwKTsKIAotCWRiZygiJXM6IHNldHRpbmcgdWFydF9tb2RlID0gJWQiLCBfX0ZVTkNUSU9OX18sIHYpOworCWRiZygiJXM6IHNldHRpbmcgdWFydF9tb2RlID0gJWQiLCBfX2Z1bmNfXywgdik7CiAKIAlpZiAodiA8IDI1NikKIAkJZWRnZV9wb3J0LT5iVWFydE1vZGUgPSB2OwogCWVsc2UKLQkJZGV2X2VycihkZXYsICIlcyAtIHVhcnRfbW9kZSAlZCBpcyBpbnZhbGlkXG4iLCBfX0ZVTkNUSU9OX18sIHYpOworCQlkZXZfZXJyKGRldiwgIiVzIC0gdWFydF9tb2RlICVkIGlzIGludmFsaWRcbiIsIF9fZnVuY19fLCB2KTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTMwMjgsOSArMzAzMiw2IEBACiAJLmRlc2NyaXB0aW9uCQk9ICJFZGdlcG9ydCBUSSAxIHBvcnQgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIJCT0gJmlvX2RyaXZlciwKIAkuaWRfdGFibGUJCT0gZWRnZXBvcnRfMXBvcnRfaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSAxLAotCS5udW1fYnVsa19pbgkJPSAxLAotCS5udW1fYnVsa19vdXQJCT0gMSwKIAkubnVtX3BvcnRzCQk9IDEsCiAJLm9wZW4JCQk9IGVkZ2Vfb3BlbiwKIAkuY2xvc2UJCQk9IGVkZ2VfY2xvc2UsCkBAIC0zMDYwLDkgKzMwNjEsNiBAQAogCS5kZXNjcmlwdGlvbgkJPSAiRWRnZXBvcnQgVEkgMiBwb3J0IGFkYXB0ZXIiLAogCS51c2JfZHJpdmVyCQk9ICZpb19kcml2ZXIsCiAJLmlkX3RhYmxlCQk9IGVkZ2Vwb3J0XzJwb3J0X2lkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luCT0gMSwKLQkubnVtX2J1bGtfaW4JCT0gMiwKLQkubnVtX2J1bGtfb3V0CQk9IDIsCiAJLm51bV9wb3J0cwkJPSAyLAogCS5vcGVuCQkJPSBlZGdlX29wZW4sCiAJLmNsb3NlCQkJPSBlZGdlX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKaW5kZXggOWIzOGEwOC4uZWE5MjRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCkBAIC01NzAsMTAgKzU3MCw3IEBACiAJLmRlc2NyaXB0aW9uID0JCSJQb2NrZXRQQyBQREEiLAogCS51c2JfZHJpdmVyID0gCQkmaXBhcV9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWlwYXFfaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKLQkubnVtX3BvcnRzID0JCTEsCisJLm51bV9wb3J0cyA9CQkyLAogCS5vcGVuID0JCQlpcGFxX29wZW4sCiAJLmNsb3NlID0JCWlwYXFfY2xvc2UsCiAJLmF0dGFjaCA9CQlpcGFxX3N0YXJ0dXAsCkBAIC01OTcsMTMgKzU5NCwxMyBAQAogCWludAkJCWksIHJlc3VsdCA9IDA7CiAJaW50CQkJcmV0cmllcyA9IGNvbm5lY3RfcmV0cmllczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlieXRlc19pbiA9IDA7CiAJYnl0ZXNfb3V0ID0gMDsKIAlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwYXFfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChwcml2ID09IE5VTEwpIHsKLQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwcml2KTsKQEAgLTY4Miw3ICs2NzksNyBAQAogCX0KIAogCWlmICghcmV0cmllcyAmJiByZXN1bHQpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBkb2luZyBjb250cm9sIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sCisJCWVycigiJXMgLSBmYWlsZWQgZG9pbmcgY29udHJvbCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sCiAJCSAgICByZXN1bHQpOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTY5NSw3ICs2OTIsNyBAQAogCiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXN1bHQpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtNzAzLDcgKzcwMCw3IEBACiAKIGVub21lbToKIAlyZXN1bHQgPSAtRU5PTUVNOwotCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKKwllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKIGVycm9yOgogCWlwYXFfZGVzdHJveV9saXN0cyhwb3J0KTsKIAlrZnJlZShwcml2KTsKQEAgLTcxNSw3ICs3MTIsNyBAQAogewogCXN0cnVjdCBpcGFxX3ByaXZhdGUJKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQkJIAogCS8qCiAJICogc2h1dCBkb3duIGJ1bGsgcmVhZCBhbmQgd3JpdGUKQEAgLTczMiwyMSArNzI5LDIxIEBACiAKIHN0YXRpYyB2b2lkIGlwYXFfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CSpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydAkqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwogCXVuc2lnbmVkIGNoYXIJCSpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50CQkJcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtNzYzLDcgKzc2MCw3IEBACiAJCSAgICAgIGlwYXFfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkKLQkJZXJyKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAlyZXR1cm47CiB9CiAKQEAgLTc3NCw3ICs3NzEsNyBAQAogCWludAkJCWJ5dGVzX3NlbnQgPSAwOwogCWludAkJCXRyYW5zZmVyX3NpemU7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQl0cmFuc2Zlcl9zaXplID0gbWluKGNvdW50LCBQQUNLRVRfU0laRSk7CkBAIC03OTksNyArNzk2LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAogCWlmIChwcml2LT5mcmVlX2xlbiA8PSAwKSB7Ci0JCWRiZygiJXMgLSB3ZSdyZSBzdHVmZmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdlJ3JlIHN0dWZmZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIApAQCAtODExLDEyICs4MDgsMTIgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3JpdGVfbGlzdF9sb2NrLCBmbGFncyk7CiAJaWYgKHBrdCA9PSBOVUxMKSB7Ci0JCWRiZygiJXMgLSB3ZSdyZSBzdHVmZmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdlJ3JlIHN0dWZmZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAogCW1lbWNweShwa3QtPmRhdGEsIGJ1ZiwgY291bnQpOwotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwgcGt0LT5kYXRhKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgcGt0LT5kYXRhKTsKIAogCXBrdC0+bGVuID0gY291bnQ7CiAJcGt0LT53cml0dGVuID0gMDsKQEAgLTgyOSw3ICs4MjYsNyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cml0ZV9saXN0X2xvY2ssIGZsYWdzKTsKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCQl9CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3JpdGVfbGlzdF9sb2NrLCBmbGFncyk7CkBAIC04NzIsMTcgKzg2OSwxNyBAQAogCiBzdGF0aWMgdm9pZCBpcGFxX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQJKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CSpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBpcGFxX3ByaXZhdGUJKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50CQkJcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODkyLDcgKzg4OSw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndyaXRlX2xpc3RfbG9jaywgZmxhZ3MpOwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAl9IGVsc2UgewogCQlwcml2LT5hY3RpdmUgPSAwOwpAQCAtOTA2LDcgKzkwMyw3IEBACiB7CiAJc3RydWN0IGlwYXFfcHJpdmF0ZQkqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMgLSBmcmVlbGVuICVkIiwgX19GVU5DVElPTl9fLCBwcml2LT5mcmVlX2xlbik7CisJZGJnKCIlcyAtIGZyZWVsZW4gJWQiLCBfX2Z1bmNfXywgcHJpdi0+ZnJlZV9sZW4pOwogCXJldHVybiBwcml2LT5mcmVlX2xlbjsKIH0KIApAQCAtOTE0LDcgKzkxMSw3IEBACiB7CiAJc3RydWN0IGlwYXFfcHJpdmF0ZQkqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMgLSBxdWV1ZWxlbiAlZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+cXVldWVfbGVuKTsKKwlkYmcoIiVzIC0gcXVldWVsZW4gJWQiLCBfX2Z1bmNfXywgcHJpdi0+cXVldWVfbGVuKTsKIAlyZXR1cm4gcHJpdi0+cXVldWVfbGVuOwogfQogCkBAIC05MzYsNyArOTMzLDcgQEAKIAogc3RhdGljIGludCBpcGFxX3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCWlmIChzZXJpYWwtPmRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUgIT0gMSkgewogCQllcnIoImFjdGl2ZSBjb25maWcgIyVkICE9IDEgPz8iLAogCQkJc2VyaWFsLT5kZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlKTsKQEAgLTk0Nyw3ICs5NDQsNyBAQAogCiBzdGF0aWMgdm9pZCBpcGFxX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaXBhcV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKaW5kZXggY2JlNTUzMC4uYmM4NWNhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYwpAQCAtMTY5LDE1ICsxNjksMTUgQEAKIAlpbnQgcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtMTk1LDcgKzE5NSw3IEBACiAJCQkgICBpcHdfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAlyZXR1cm47CiB9CiAKQEAgLTIwNiw3ICsyMDYsNyBAQAogCXU4ICpidWZfZmxvd19pbml0OwogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJYnVmX2Zsb3dfaW5pdCA9IGttZW1kdXAoYnVmX2Zsb3dfc3RhdGljLCAxNiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZfZmxvd19pbml0KQpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAkvKiAtLTE6IFRlbGwgdGhlIG1vZGVtIHRvIGluaXRpYWxpemUgKHdlIHRoaW5rKSBGcm9tIHNuaWZmcyB0aGlzIGlzIGFsd2F5cyB0aGUKIAkgKiBmaXJzdCB0aGluZyB0aGF0IGdldHMgc2VudCB0byB0aGUgbW9kZW0gZHVyaW5nIG9wZW5pbmcgb2YgdGhlIGRldmljZSAqLwotCWRiZygiJXM6IFNlbmRpbmcgU0lPX0lOSVQgKHdlIGd1ZXNzKSIsX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOiBTZW5kaW5nIFNJT19JTklUICh3ZSBndWVzcykiLF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LDApLAogCQkJCSBJUFdfU0lPX0lOSVQsCiAJCQkJIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKQEAgLTIzNCw3ICsyMzQsNyBAQAogCXVzYl9jbGVhcl9oYWx0KGRldiwgdXNiX3NuZGJ1bGtwaXBlKGRldiwgcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKSk7CiAKIAkvKi0tMjogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UgKi8JCi0JZGJnKCIlczogc2V0dGluZyB1cCBidWxrIHJlYWQgY2FsbGJhY2siLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczogc2V0dGluZyB1cCBidWxrIHJlYWQgY2FsbGJhY2siLF9fZnVuY19fKTsKIAl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgZGV2LAogCQkJICB1c2JfcmN2YnVsa3BpcGUoZGV2LCBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCiAJCQkgIHBvcnQtPmJ1bGtfaW5fYnVmZmVyLApAQCAtMjQyLDEwICsyNDIsMTAgQEAKIAkJCSAgaXB3X3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXN1bHQgPCAwKQotCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIocmVhZCBidWxrKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJLyotLTM6IFRlbGwgdGhlIG1vZGVtIHRvIG9wZW4gdGhlIGZsb29kZ2F0ZXMgb24gdGhlIHJ4IGJ1bGsgY2hhbm5lbCAqLwotCWRiZygiJXM6YXNraW5nIG1vZGVtIGZvciBSeFJlYWQgKFJYQlVMS19PTikiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczphc2tpbmcgbW9kZW0gZm9yIFJ4UmVhZCAoUlhCVUxLX09OKSIsX19mdW5jX18pOwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJCSBJUFdfU0lPX1JYQ1RMLAogCQkJCSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiRW5hYmxpbmcgYnVsayBSeFJlYWQgZmFpbGVkIChlcnJvciA9ICVkKVxuIiwgcmVzdWx0KTsKIAogCS8qLS00OiBzZXR1cCB0aGUgaW5pdGlhbCBmbG93Y29udHJvbCAqLwotCWRiZygiJXM6c2V0dGluZyBpbml0IGZsb3djb250cm9sICglcykiLF9fRlVOQ1RJT05fXyxidWZfZmxvd19pbml0KTsKKwlkYmcoIiVzOnNldHRpbmcgaW5pdCBmbG93Y29udHJvbCAoJXMpIixfX2Z1bmNfXyxidWZfZmxvd19pbml0KTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCQkgSVBXX1NJT19IQU5ERkxPVywKIAkJCQkgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULApAQCAtMjcyLDcgKzI3Miw3IEBACiAKIAogCS8qLS01OiByYWlzZSB0aGUgZHRyICovCi0JZGJnKCIlczpyYWlzaW5nIGR0ciIsX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOnJhaXNpbmcgZHRyIixfX2Z1bmNfXyk7CiAJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCiAJCQkJIElQV19TSU9fU0VUX1BJTiwKIAkJCQkgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULApAQCAtMjg1LDcgKzI4NSw3IEBACiAJCWRldl9lcnIoJnBvcnQtPmRldiwgInNldHRpbmcgZHRyIGZhaWxlZCAoZXJyb3IgPSAlZClcbiIsIHJlc3VsdCk7CiAKIAkvKi0tNjogcmFpc2UgdGhlIHJ0cyAqLwotCWRiZygiJXM6cmFpc2luZyBydHMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczpyYWlzaW5nIHJ0cyIsX19mdW5jX18pOwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJCSBJUFdfU0lPX1NFVF9QSU4sCiAJCQkJIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKQEAgLTMwNywxMiArMzA3LDEyIEBACiAJaW50IHJlc3VsdDsKIAogCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7Ci0JCWRiZygiJXM6IHR0eV9odW5nX3VwX3AgLi4uIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczogdHR5X2h1bmdfdXBfcCAuLi4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAkvKi0tMTogZHJvcCB0aGUgZHRyICovCi0JZGJnKCIlczpkcm9wcGluZyBkdHIiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczpkcm9wcGluZyBkdHIiLF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCQkgSVBXX1NJT19TRVRfUElOLAogCQkJCSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiZHJvcHBpbmcgZHRyIGZhaWxlZCAoZXJyb3IgPSAlZClcbiIsIHJlc3VsdCk7CiAKIAkvKi0tMjogZHJvcCB0aGUgcnRzICovCi0JZGJnKCIlczpkcm9wcGluZyBydHMiLF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczpkcm9wcGluZyBydHMiLF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCQkgSVBXX1NJT19TRVRfUElOLCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCiAJCQkJIElQV19QSU5fQ0xSUlRTLApAQCAtMzM4LDcgKzMzOCw3IEBACiAKIAogCS8qLS0zOiBwdXJnZSAqLwotCWRiZygiJXM6c2VuZGluZyBwdXJnZSIsX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOnNlbmRpbmcgcHVyZ2UiLF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCQkgSVBXX1NJT19QVVJHRSwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULAogCQkJCSAweDAzLApAQCAtMzczLDEzICszNzMsMTMgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAKIAlpZiAoc3RhdHVzKQogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKIH0KQEAgLTM4OSwxOCArMzg5LDE4IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCWludCByZXQ7CiAKLQlkYmcoIiVzOiBUT1A6IGNvdW50PSVkLCBpbl9pbnRlcnJ1cHQ9JWxkIiwgX19GVU5DVElPTl9fLAorCWRiZygiJXM6IFRPUDogY291bnQ9JWQsIGluX2ludGVycnVwdD0lbGQiLCBfX2Z1bmNfXywKIAkJY291bnQsIGluX2ludGVycnVwdCgpICk7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZwb3J0LT5sb2NrKTsKIAlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKIAkJc3Bpbl91bmxvY2tfYmgoJnBvcnQtPmxvY2spOwotCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKQEAgLTQwOSw3ICs0MDksNyBAQAogCWNvdW50ID0gbWluKGNvdW50LCBwb3J0LT5idWxrX291dF9zaXplKTsKIAltZW1jcHkocG9ydC0+YnVsa19vdXRfYnVmZmVyLCBidWYsIGNvdW50KTsKIAotCWRiZygiJXMgY291bnQgbm93OiVkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKCIlcyBjb3VudCBub3c6JWQiLCBfX2Z1bmNfXywgY291bnQpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+d3JpdGVfdXJiLCBkZXYsCiAJCQkgIHVzYl9zbmRidWxrcGlwZShkZXYsIHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyksCkBAIC00MjEsMTEgKzQyMSwxMSBAQAogCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgd2l0aCBlcnJvciA9ICVkIiwgX19mdW5jX18sIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGJnKCIlcyByZXR1cm5pbmcgJWQiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwlkYmcoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfSAKIApAQCAtNDQ4LDkgKzQ0OCw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJJUFdpcmVsZXNzIGNvbnZlcnRlciIsCiAJLnVzYl9kcml2ZXIgPSAJCSZ1c2JfaXB3X2RyaXZlciwKIAkuaWRfdGFibGUgPQkJdXNiX2lwd19pZHMsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLm9wZW4gPQkJCWlwd19vcGVuLAogCS5jbG9zZSA9CQlpcHdfY2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMKaW5kZXggNmI4MDNhYi4uMDA0ZDU3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lyLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pci11c2IuYwpAQCAtMTQ1LDkgKzE0NSw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJJUiBEb25nbGUiLAogCS51c2JfZHJpdmVyID0gCQkmaXJfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTEsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuc2V0X3Rlcm1pb3MgPQkJaXJfc2V0X3Rlcm1pb3MsCiAJLmF0dGFjaCA9CQlpcl9zdGFydHVwLApAQCAtMTk4LDE2ICsxOTUsMTYgQEAKIAkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCiAJCQkwLCBpZm51bSwgZGVzYywgc2l6ZW9mKCpkZXNjKSwgMTAwMCk7CiAJCi0JZGJnKCIlcyAtICByZXQ9JWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJZGJnKCIlcyAtICByZXQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKIAlpZiAocmV0IDwgc2l6ZW9mKCpkZXNjKSkgewogCQlkYmcoIiVzIC0gY2xhc3MgZGVzY3JpcHRvciByZWFkICVzICglZCkiLAotCQkJCV9fRlVOQ1RJT05fXywgCisJCQkJX19mdW5jX18sCiAJCQkJKHJldDwwKSA/ICJmYWlsZWQiIDogInRvbyBzaG9ydCIsCiAJCQkJcmV0KTsKIAkJZ290byBlcnJvcjsKIAl9CiAJaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfSVJEQSkgewotCQlkYmcoIiVzIC0gYmFkIGNsYXNzIGRlc2NyaXB0b3IgdHlwZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgY2xhc3MgZGVzY3JpcHRvciB0eXBlIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yOwogCX0KIAkKQEAgLTI1MSw3ICsyNDgsNyBAQAogCX0KIAogCWRiZyAoIiVzIC0gQmF1ZCByYXRlcyBzdXBwb3J0ZWQ6JXMlcyVzJXMlcyVzJXMlcyVzIiwKLQkJX19GVU5DVElPTl9fLAorCQlfX2Z1bmNfXywKIAkJKGlyZGFfZGVzYy0+d0JhdWRSYXRlICYgMHgwMDAxKSA/ICIgMjQwMCIgICAgOiAiIiwKIAkJKGlyZGFfZGVzYy0+d0JhdWRSYXRlICYgMHgwMDAyKSA/ICIgOTYwMCIgICAgOiAiIiwKIAkJKGlyZGFfZGVzYy0+d0JhdWRSYXRlICYgMHgwMDA0KSA/ICIgMTkyMDAiICAgOiAiIiwKQEAgLTI4NCwxMyArMjgxLDEzIEBACiAJY2hhciAqYnVmZmVyOwogCWludCByZXN1bHQgPSAwOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChidWZmZXJfc2l6ZSkgewogCQkvKiBvdmVycmlkZSB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZXMgKi8KIAkJYnVmZmVyID0ga21hbGxvYyAoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewotCQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJa2ZyZWUgKHBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwpAQCAtMjk5LDcgKzI5Niw3IEBACiAKIAkJYnVmZmVyID0ga21hbGxvYyAoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewotCQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJa2ZyZWUgKHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKQEAgLTMxOSwxNCArMzE2LDE0IEBACiAJCXBvcnQpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCBpcl9jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxwKQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQkgCiAJLyogc2h1dGRvd24gb3VyIGJ1bGsgcmVhZCAqLwogCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CkBAIC0zMzgsMTAgKzMzNSwxMCBAQAogCWludCByZXN1bHQ7CiAJaW50IHRyYW5zZmVyX3NpemU7CiAKLQlkYmcoIiVzIC0gcG9ydCA9ICVkLCBjb3VudCA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKKwlkYmcoIiVzIC0gcG9ydCA9ICVkLCBjb3VudCA9ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY291bnQpOwogCiAJaWYgKCFwb3J0LT50dHkpIHsKLQkJZGV2X2VyciAoJnBvcnQtPmRldiwgIiVzIC0gbm8gdHR5Pz8/XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyICgmcG9ydC0+ZGV2LCAiJXMgLSBubyB0dHk/Pz9cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNTEsNyArMzQ4LDcgQEAKIAlzcGluX2xvY2tfYmgoJnBvcnQtPmxvY2spOwogCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkgewogCQlzcGluX3VubG9ja19iaCgmcG9ydC0+bG9jayk7Ci0JCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOwpAQCAtMzg3LDcgKzM4NCw3IEBACiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewogCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0gZWxzZQogCQlyZXN1bHQgPSB0cmFuc2Zlcl9zaXplOwogCkBAIC0zOTYsMjIgKzM5MywyMiBAQAogCiBzdGF0aWMgdm9pZCBpcl93cml0ZV9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YSAoCiAJCWRlYnVnLAogCQkmcG9ydC0+ZGV2LAotCQlfX0ZVTkNUSU9OX18sCisJCV9fZnVuY19fLAogCQl1cmItPmFjdHVhbF9sZW5ndGgsCiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIApAQCAtNDIwLDE2ICs0MTcsMTYgQEAKIAogc3RhdGljIHZvaWQgaXJfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHJlc3VsdDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZygiJXMgLSBwb3J0IGNsb3NlZC4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBjbG9zZWQuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC00NDcsNyArNDQ0LDcgQEAKIAkJCXVzYl9zZXJpYWxfZGVidWdfZGF0YSAoCiAJCQkJZGVidWcsCiAJCQkJJnBvcnQtPmRldiwKLQkJCQlfX0ZVTkNUSU9OX18sCisJCQkJX19mdW5jX18sCiAJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLAogCQkJCWRhdGEpOwogCkBAIC00ODAsMTMgKzQ3NywxMyBAQAogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJlc3VsdCkKIAkJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCiAJCQlicmVhayA7CiAKIAkJZGVmYXVsdDoKIAkJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCQlfX0ZVTkNUSU9OX18sIAorCQkJCV9fZnVuY19fLAogCQkJCXN0YXR1cyk7CiAJCQlicmVhayA7CiAKQEAgLTUwMiw3ICs0OTksNyBAQAogCXNwZWVkX3QgYmF1ZDsKIAlpbnQgaXJfYmF1ZDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KTsKIApAQCAtNTU0LDcgKzU1MSw3IEBACiAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYiAocG9ydC0+d3JpdGVfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCS8qIE9ubHkgc3BlZWQgY2hhbmdlcyBhcmUgc3VwcG9ydGVkICovCiAJdHR5X3Rlcm1pb3NfY29weV9odyhwb3J0LT50dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pdXVfcGhvZW5peC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKaW5kZXggZmRlMTg4ZS4uOGEyMTc2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKQEAgLTk4LDEwICs5OCwxMCBAQAogCXByaXYtPndyaXRlYnVmID0ga3phbGxvYygyNTYsIEdGUF9LRVJORUwpOwogCWlmICghcHJpdi0+YnVmIHx8ICFwcml2LT5kYmdidWYgfHwgIXByaXYtPndyaXRlYnVmKSB7CiAJCWl1dV9mcmVlX2J1Zihwcml2KTsKLQkJZGJnKCIlcyBwcm9ibGVtIGFsbG9jYXRpb24gYnVmZmVyIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyBwcm9ibGVtIGFsbG9jYXRpb24gYnVmZmVyIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZGJnKCIlcyAtIFByaXZhdGVzIGJ1ZmZlcnMgYWxsb2NhdGlvbiBzdWNjZXNzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gUHJpdmF0ZXMgYnVmZmVycyBhbGxvY2F0aW9uIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOSw3ICsxMDksNyBAQAogewogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdjsKIAlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl1dV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JZGJnKCIlcy0gcHJpdiBhbGxvY2F0aW9uIHN1Y2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMtIHByaXYgYWxsb2NhdGlvbiBzdWNjZXNzIiwgX19mdW5jX18pOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWYgKGl1dV9hbGxvY19idWYocHJpdikpIHsKQEAgLTEzMCwxNyArMTMwLDE3IEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJaWYgKHByaXYpIHsKIAkJaXV1X2ZyZWVfYnVmKHByaXYpOwotCQlkYmcoIiVzIC0gSSB3aWxsIGZyZWUgYWxsIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIEkgd2lsbCBmcmVlIGFsbCIsIF9fZnVuY19fKTsKIAkJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQsIE5VTEwpOwogCi0JCWRiZygiJXMgLSBwcml2IGlzIG5vdCBhbnltb3JlIGluIHBvcnQgc3RydWN0dXJlIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHByaXYgaXMgbm90IGFueW1vcmUgaW4gcG9ydCBzdHJ1Y3R1cmUiLCBfX2Z1bmNfXyk7CiAJCWtmcmVlKHByaXYpOwogCi0JCWRiZygiJXMgcHJpdiBpcyBub3cga2ZyZWUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIHByaXYgaXMgbm93IGtmcmVlIiwgX19mdW5jX18pOwogCX0KIH0KIApAQCAtMTQ4LDIwICsxNDgsMjEgQEAKIAkJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKIHsKIAlzdHJ1Y3QgaXV1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQl0dHkgPSBwb3J0LT50dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgKCVkKSBtc2cgOiBTRVQgPSAweCUwNHgsIENMRUFSID0gMHglMDR4ICIsIF9fRlVOQ1RJT05fXywKKwkvKiBGSVhNRTogbG9ja2luZyBvbiB0aW9tc3RhdHVzICovCisJZGJnKCIlcyAoJWQpIG1zZyA6IFNFVCA9IDB4JTA0eCwgQ0xFQVIgPSAweCUwNHggIiwgX19mdW5jX18sCiAJICAgIHBvcnQtPm51bWJlciwgc2V0LCBjbGVhcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChzZXQgJiBUSU9DTV9SVFMpCiAJCXByaXYtPnRpb3N0YXR1cyA9IFRJT0NNX1JUUzsKIAogCWlmICghKHNldCAmIFRJT0NNX1JUUykgJiYgcHJpdi0+dGlvc3RhdHVzID09IFRJT0NNX1JUUykgewotCQlkYmcoIiVzIFRJT0NNU0VUIFJFU0VUIGNhbGxlZCAhISEiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIFRJT0NNU0VUIFJFU0VUIGNhbGxlZCAhISEiLCBfX2Z1bmNfXyk7CiAJCXByaXYtPnJlc2V0ID0gMTsKLQkJcmV0dXJuIDA7CiAJfQotCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzMsMTcgKzE3NCwyNCBAQAogc3RhdGljIGludCBpdXVfdGlvY21nZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGl1dV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXJldHVybiBwcml2LT50aW9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXJjID0gcHJpdi0+dGlvc3RhdHVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgaXV1X3J4Y21kKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTIwMyw3ICsyMTEsNyBAQAogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgcmVzdWx0OwogCWNoYXIgKmJ1Zl9wdHIgPSBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAogCS8qIFByZXBhcmUgdGhlIHJlc2V0IHNlcXVlbmNlICovCiAKQEAgLTIzMiwxOSArMjQwLDE5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGl1dV91cGRhdGVfc3RhdHVzX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgaXV1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdTggKnN0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KIAogCXN0ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JZGJnKCIlcyAtIGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gZW50ZXIiLCBfX2Z1bmNfXyk7CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAxKSB7CiAJCXN3aXRjaCAoc3RbMF0pIHsKIAkJY2FzZSAweDE6CkBAIC0yNjIsMTEgKzI3MCwxMSBAQAogCiBzdGF0aWMgdm9pZCBpdXVfc3RhdHVzX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCi0JZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJICB1c2JfcmN2YnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkJCSAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLApAQCAtMjc5LDcgKzI4Nyw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJbWVtc2V0KHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBJVVVfR0VUX1NUQVRFX1JFR0lTVEVSLCAxKTsKIAl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT53cml0ZV91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtMjk4LDcgKzMwNiw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlpbnQgYWN0dWFsID0gMDsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCkBAIC0zMDksOSArMzE3LDkgQEAKIAkJCSBjb3VudCwgJmFjdHVhbCwgSFogKiAxKTsKIAogCWlmIChzdGF0dXMgIT0gSVVVX09QRVJBVElPTl9PSykgewotCQlkYmcoIiVzIC0gZXJyb3IgPSAlMngiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBlcnJvciA9ICUyeCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSB3cml0ZSBPSyAhIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIE9LICEiLCBfX2Z1bmNfXyk7CiAJfQogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zMjIsNyArMzMwLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCWludCBhY3R1YWwgPSAwOwogCi0JZGJnKCIlcyAtIGVudGVyIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gZW50ZXIiLCBfX2Z1bmNfXyk7CiAKIAkvKiBzZW5kIHRoZSBkYXRhIG91dCB0aGUgYnVsayBwb3J0ICovCiAKQEAgLTMzMyw5ICszNDEsOSBAQAogCQkJIGNvdW50LCAmYWN0dWFsLCBIWiAqIDEpOwogCiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKSB7Ci0JCWRiZygiJXMgLSBlcnJvciA9ICUyeCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIGVycm9yID0gJTJ4IiwgX19mdW5jX18sIHN0YXR1cyk7CiAJfSBlbHNlIHsKLQkJZGJnKCIlcyAtIHJlYWQgT0sgISIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSByZWFkIE9LICEiLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTM1MCw3ICszNTgsNyBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJYnVmWzBdID0gSVVVX1NFVF9MRUQ7CiAJYnVmWzFdID0gUiAmIDB4RkY7CkBAIC0zNjMsOSArMzcxLDkgQEAKIAlzdGF0dXMgPSBidWxrX2ltbWVkaWF0ZShwb3J0LCBidWYsIDgpOwogCWtmcmVlKGJ1Zik7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKQotCQlkYmcoIiVzIC0gbGVkIGVycm9yIHN0YXR1cyA9ICUyeCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIGxlZCBlcnJvciBzdGF0dXMgPSAlMngiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAllbHNlCi0JCWRiZygiJXMgLSBsZWQgT0sgISIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBsZWQgT0sgISIsIF9fZnVuY19fKTsKIAlyZXR1cm4gSVVVX09QRVJBVElPTl9PSzsKIH0KIApAQCAtMzg0LDcgKzM5Miw3IEBACiAKIHN0YXRpYyB2b2lkIGl1dV9sZWRfYWN0aXZpdHlfb24oc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCWludCByZXN1bHQ7CiAJY2hhciAqYnVmX3B0ciA9IHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyOwogCSpidWZfcHRyKysgPSBJVVVfU0VUX0xFRDsKQEAgLTQwNSw3ICs0MTMsNyBAQAogCiBzdGF0aWMgdm9pZCBpdXVfbGVkX2FjdGl2aXR5X29mZihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHJlc3VsdDsKIAljaGFyICpidWZfcHRyID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaWYgKHhtYXMgPT0gMSkgewpAQCAtNDQzLDcgKzQ1MSw3IEBACiAJdW5zaWduZWQgaW50IFAyID0gMDsKIAlpbnQgZnJxID0gKGludClkd0ZycTsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKGZycSA9PSAwKSB7CiAJCXByaXYtPmJ1ZltDb3VudCsrXSA9IElVVV9VQVJUX1dSSVRFX0kyQzsKQEAgLTQ1Myw3ICs0NjEsNyBAQAogCiAJCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsICh1OCAqKSBwcml2LT5idWYsIENvdW50KTsKIAkJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCQlkYmcoIiVzIC0gd3JpdGUgZXJyb3IgIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSB3cml0ZSBlcnJvciAiLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJfSBlbHNlIGlmIChmcnEgPT0gMzU3OTAwMCkgewpAQCAtNTYyLDcgKzU3MCw3IEBACiAKIAlzdGF0dXMgPSBidWxrX2ltbWVkaWF0ZShwb3J0LCAodTggKikgcHJpdi0+YnVmLCBDb3VudCk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKQotCQlkYmcoIiVzIC0gd3JpdGUgZXJyb3IgIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIGVycm9yICIsIF9fZnVuY19fKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC01NzMsNyArNTgxLDcgQEAKIAl1OCByeGNtZCA9IElVVV9VQVJUX1JYOwogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKGl1dV9sZWQocG9ydCwgMHhGMDAwLCAwLCAwLCAweEZGKSA8IDApCiAJCXJldHVybiAtRUlPOwpAQCAtNTgxLDUwICs1ODksNTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsICZyeGNtZCwgMSk7CiAJCWlmIChzdGF0dXMgIT0gSVVVX09QRVJBVElPTl9PSykgewotCQkJZGJnKCIlcyAtIHVhcnRfZmx1c2hfd3JpdGUgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHVhcnRfZmx1c2hfd3JpdGUgZXJyb3IiLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAKIAkJc3RhdHVzID0gcmVhZF9pbW1lZGlhdGUocG9ydCwgJnByaXYtPmxlbiwgMSk7CiAJCWlmIChzdGF0dXMgIT0gSVVVX09QRVJBVElPTl9PSykgewotCQkJZGJnKCIlcyAtIHVhcnRfZmx1c2hfcmVhZCBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gdWFydF9mbHVzaF9yZWFkIGVycm9yIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCiAJCWlmIChwcml2LT5sZW4gPiAwKSB7Ci0JCQlkYmcoIiVzIC0gdWFydF9mbHVzaCBkYXRhbGVuIGlzIDogJWkgIiwgX19GVU5DVElPTl9fLAorCQkJZGJnKCIlcyAtIHVhcnRfZmx1c2ggZGF0YWxlbiBpcyA6ICVpICIsIF9fZnVuY19fLAogCQkJICAgIHByaXYtPmxlbik7CiAJCQlzdGF0dXMgPSByZWFkX2ltbWVkaWF0ZShwb3J0LCBwcml2LT5idWYsIHByaXYtPmxlbik7CiAJCQlpZiAoc3RhdHVzICE9IElVVV9PUEVSQVRJT05fT0spIHsKLQkJCQlkYmcoIiVzIC0gdWFydF9mbHVzaF9yZWFkIGVycm9yIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkYmcoIiVzIC0gdWFydF9mbHVzaF9yZWFkIGVycm9yIiwgX19mdW5jX18pOwogCQkJCXJldHVybiBzdGF0dXM7CiAJCQl9CiAJCX0KIAl9Ci0JZGJnKCIlcyAtIHVhcnRfZmx1c2hfcmVhZCBPSyEiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSB1YXJ0X2ZsdXNoX3JlYWQgT0shIiwgX19mdW5jX18pOwogCWl1dV9sZWQocG9ydCwgMCwgMHhGMDAwLCAwLCAweEZGKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgdm9pZCByZWFkX2J1Zl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0JZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgewogCQkJLyogcmVzY2hlZHVsZSBuZWVkZWQgKi8KIAkJfQogCQlyZXR1cm47CiAJfQogCi0JZGJnKCIlcyAtICVpIGNoYXJzIHRvIHdyaXRlIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWRiZygiJXMgLSAlaSBjaGFycyB0byB3cml0ZSIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoZGF0YSA9PSBOVUxMKQotCQlkYmcoIiVzIC0gZGF0YSBpcyBOVUxMICEhISIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBkYXRhIGlzIE5VTEwgISEhIiwgX19mdW5jX18pOwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoICYmIGRhdGEpIHsKIAkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CkBAIC02MzksNyArNjQ3LDcgQEAKIAlpbnQgcmVzdWx0OwogCWludCBpOwogCWNoYXIgKmJ1Zl9wdHIgPSBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAogCSpidWZfcHRyKysgPSBJVVVfVUFSVF9FU0M7CiAJKmJ1Zl9wdHIrKyA9IElVVV9VQVJUX1RYOwpAQCAtNjUyLDcgKzY2MCw3IEBACiAJCQlzcHJpbnRmKHByaXYtPmRiZ2J1ZiArIGkqMiAsCiAJCQkJIiUwMlgiLCBwcml2LT53cml0ZWJ1ZltpXSk7CiAJCXByaXYtPmRiZ2J1Zltwcml2LT53cml0ZWxlbitpKjJdID0gMDsKLQkJZGJnKCIlcyAtIHdyaXRpbmcgJWkgY2hhcnMgOiAlcyIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIHdyaXRpbmcgJWkgY2hhcnMgOiAlcyIsIF9fZnVuY19fLAogCQkgICAgcHJpdi0+d3JpdGVsZW4sIHByaXYtPmRiZ2J1Zik7CiAJfQogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPndyaXRlX3VyYiwgcG9ydC0+c2VyaWFsLT5kZXYsCkBAIC02NzEsNyArNjc5LDcgQEAKIHN0YXRpYyBpbnQgaXV1X3JlYWRfYnVmKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBsZW4pCiB7CiAJaW50IHJlc3VsdDsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LApAQCAtNjg0LDcgKzY5Miw3IEBACiAKIHN0YXRpYyB2b2lkIGl1dV91YXJ0X3JlYWRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJaW50IHN0YXR1czsKQEAgLTY5MywyMSArNzAxLDIxIEBACiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXByaXYtPnBvbGwrKzsKIAotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCiAJaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KIAlpZiAoZGF0YSA9PSBOVUxMKQotCQlkYmcoIiVzIC0gZGF0YSBpcyBOVUxMICEhISIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBkYXRhIGlzIE5VTEwgISEhIiwgX19mdW5jX18pOwogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAxICAmJiBkYXRhICE9IE5VTEwpCiAJCWxlbiA9IChpbnQpIGRhdGFbMF07CiAKIAlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMSkgewotCQlkYmcoIiVzIC0gdXJiLT5hY3R1YWxfbGVuZ3RoID0gJWkiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1cmItPmFjdHVhbF9sZW5ndGggPSAlaSIsIF9fZnVuY19fLAogCQkgICAgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJZXJyb3IgPSAxOwogCQlyZXR1cm47CkBAIC03MTYsNyArNzI0LDcgQEAKIAogCWlmIChsZW4gPiAwICYmIGVycm9yID09IDApIHsKIAkJZGJnKCIlcyAtIGNhbGwgcmVhZCBidWYgLSBsZW4gdG8gcmVhZCBpcyAlaSAiLAotCQkJX19GVU5DVElPTl9fLCBsZW4pOworCQkJX19mdW5jX18sIGxlbik7CiAJCXN0YXR1cyA9IGl1dV9yZWFkX2J1Zihwb3J0LCBsZW4pOwogCQlyZXR1cm47CiAJfQpAQCAtNzQyLDcgKzc1MCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkvKiBpZiBub3RoaW5nIHRvIHdyaXRlIGNhbGwgYWdhaW4gcnhjbWQgKi8KLQlkYmcoIiVzIC0gcnhjbWQgcmVjYWxsIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gcnhjbWQgcmVjYWxsIiwgX19mdW5jX18pOwogCWl1dV9sZWRfYWN0aXZpdHlfb2ZmKHVyYik7CiAJcmV0dXJuOwogfQpAQCAtNzUyLDcgKzc2MCw3IEBACiB7CiAJc3RydWN0IGl1dV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGludCBmbGFnczsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAogCWlmIChjb3VudCA+IDI1NikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03NzMsMTQgKzc4MSwxNCBAQAogCiBzdGF0aWMgdm9pZCByZWFkX3J4Y21kX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCi0JZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQkvKiBlcnJvciBzdG9wIGFsbCAqLwogCQlyZXR1cm47CiAJfQpAQCAtNzkxLDcgKzc5OSw3IEBACiAJCQkgIHBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXIsIDI1NiwKIAkJCSAgaXV1X3VhcnRfcmVhZF9jYWxsYmFjaywgcG9ydCk7CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwotCWRiZygiJXMgLSBzdWJtaXQgcmVzdWx0ID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcyAtIHN1Ym1pdCByZXN1bHQgPSAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCXJldHVybjsKIH0KIApAQCAtODEyLDEzICs4MjAsMTMgQEAKIAogCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsIGJ1ZiwgNCk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKSB7Ci0JCWRiZygiJXMgLSB1YXJ0X29uIGVycm9yIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHVhcnRfb24gZXJyb3IiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdWFydF9lbmFibGVfZmFpbGVkOwogCX0KIAkvKiAgaXV1X3Jlc2V0KCkgdGhlIGNhcmQgYWZ0ZXIgaXV1X3VhcnRfb24oKSAqLwogCXN0YXR1cyA9IGl1dV91YXJ0X2ZsdXNoKHBvcnQpOwogCWlmIChzdGF0dXMgIT0gSVVVX09QRVJBVElPTl9PSykKLQkJZGJnKCIlcyAtIHVhcnRfZmx1c2ggZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdWFydF9mbHVzaCBlcnJvciIsIF9fZnVuY19fKTsKIHVhcnRfZW5hYmxlX2ZhaWxlZDoKIAlrZnJlZShidWYpOwogCXJldHVybiBzdGF0dXM7CkBAIC04MzYsNyArODQ0LDcgQEAKIAogCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsIGJ1ZiwgMSk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKQotCQlkYmcoIiVzIC0gdWFydF9vZmYgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdWFydF9vZmYgZXJyb3IiLCBfX2Z1bmNfXyk7CiAKIAlrZnJlZShidWYpOwogCXJldHVybiBzdGF0dXM7CkBAIC05MzAsNyArOTM4LDcgQEAKIAogCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsIGRhdGFvdXQsIERhdGFDb3VudCk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKQotCQlkYmcoIiVzIC0gdWFydF9vZmYgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdWFydF9vZmYgZXJyb3IiLCBfX2Z1bmNfXyk7CiAJa2ZyZWUoZGF0YW91dCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTk1Miw3ICs5NjAsNyBAQAogCWlmICghc2VyaWFsKQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaXV1X3VhcnRfb2ZmKHBvcnQpOwogCWlmIChzZXJpYWwtPmRldikgewpAQCAtOTY5LDcgKzk3Nyw3IEBACiAJCX0KIAkJLyogZnJlZSB3cml0ZWJ1ZiAqLwogCQkvKiBzaHV0ZG93biBvdXIgdXJicyAqLwotCQlkYmcoIiVzIC0gc2h1dHRpbmcgZG93biB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHNodXR0aW5nIGRvd24gdXJicyIsIF9fZnVuY19fKTsKIAkJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CiAJCXVzYl9raWxsX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKQEAgLTk5MCw3ICs5OTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGl1dV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlcyAtICBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSAgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT53cml0ZV91cmItPnBpcGUpOwogCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT5yZWFkX3VyYi0+cGlwZSk7CiAKQEAgLTExMjcsNyArMTEzNSw3IEBACiAKIAlpdXVfdWFydF9mbHVzaChwb3J0KTsKIAotCWRiZygiJXMgLSBpbml0aWFsaXphdGlvbiBkb25lIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gaW5pdGlhbGl6YXRpb24gZG9uZSIsIF9fZnVuY19fKTsKIAogCW1lbXNldChwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciwgSVVVX1VBUlRfUlgsIDEpOwogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPndyaXRlX3VyYiwgcG9ydC0+c2VyaWFsLT5kZXYsCkBAIC0xMTM5LDExICsxMTQ3LDExIEBACiAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIgotCQkJIiBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCWl1dV9jbG9zZShwb3J0LCBOVUxMKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfSBlbHNlIHsKLQkJZGJnKCIlcyAtIHJ4Y21kIE9LIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHJ4Y21kIE9LIiwgX19mdW5jX18pOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTE1NCw5ICsxMTYyLDYgQEAKIAkJICAgLm5hbWUgPSAiaXV1X3Bob2VuaXgiLAogCQkgICB9LAogCS5pZF90YWJsZSA9IGlkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luID0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPSAxLAotCS5udW1fYnVsa19vdXQgPSAxLAogCS5udW1fcG9ydHMgPSAxLAogCS5vcGVuID0gaXV1X29wZW4sCiAJLmNsb3NlID0gaXV1X2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKaW5kZXggZWE3YmJhNi4uM2RmOGE2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCkBAIC0yNDQsMTMgKzI0NCwxMyBAQAogCiBzdGF0aWMgdm9pZCBrZXlzcGFuX3J4X3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiB9CiAKIAogc3RhdGljIHZvaWQga2V5c3Bhbl9yeF91bnRocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiB9CiAKIApAQCAtMjU4LDcgKzI1OCw3IEBACiB7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlIAkqcF9wcml2OwogCi0gCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworIAlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC0yODAsNyArMjgwLDcgQEAKIAl1bnNpZ25lZCBpbnQgCQkJY2ZsYWc7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJCSp0dHkgPSBwb3J0LT50dHk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsgCisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlkX2RldGFpbHMgPSBwX3ByaXYtPmRldmljZV9kZXRhaWxzOwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJfQogCQogCWRiZygiJXMgLSBmb3IgcG9ydCAlZCAoJWQgY2hhcnMpLCBmbGlwPSVkIiwKLQkgICAgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50LCBwX3ByaXYtPm91dF9mbGlwKTsKKwkgICAgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY291bnQsIHBfcHJpdi0+b3V0X2ZsaXApOwogCiAJZm9yIChsZWZ0ID0gY291bnQ7IGxlZnQgPiAwOyBsZWZ0IC09IHRvZG8pIHsKIAkJdG9kbyA9IGxlZnQ7CkBAIC0zODksMTEgKzM4OSwxMSBAQAogCQkvKiBDaGVjayB3ZSBoYXZlIGEgdmFsaWQgdXJiL2VuZHBvaW50IGJlZm9yZSB3ZSB1c2UgaXQuLi4gKi8KIAkJaWYgKCh0aGlzX3VyYiA9IHBfcHJpdi0+b3V0X3VyYnNbZmxpcF0pID09IE5VTEwpIHsKIAkJCS8qIG5vIGJ1bGsgb3V0LCBzbyByZXR1cm4gMCBieXRlcyB3cml0dGVuICovCi0JCQlkYmcoIiVzIC0gbm8gb3V0cHV0IHVyYiA6KCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gbm8gb3V0cHV0IHVyYiA6KCIsIF9fZnVuY19fKTsKIAkJCXJldHVybiBjb3VudDsKIAkJfQogCi0JCWRiZygiJXMgLSBlbmRwb2ludCAlZCBmbGlwICVkIiwgX19GVU5DVElPTl9fLCB1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgZmxpcCk7CisJCWRiZygiJXMgLSBlbmRwb2ludCAlZCBmbGlwICVkIiwgX19mdW5jX18sIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpLCBmbGlwKTsKIAogCQlpZiAodGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKIAkJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBwX3ByaXYtPnR4X3N0YXJ0X3RpbWVbZmxpcF0gKyAxMCAqIEhaKSkKQEAgLTQzNSwxNyArNDM1LDE3IEBACiAJdW5zaWduZWQgY2hhciAJCSpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOyAKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCWVuZHBvaW50ID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOwogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IG9uIGVuZHBvaW50ICVkLiIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cywgZW5kcG9pbnQpOworCQkgICAgX19mdW5jX18sIHN0YXR1cywgZW5kcG9pbnQpOwogCQlyZXR1cm47CiAJfQogCi0JcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJLyogMHg4MCBiaXQgaXMgZXJyb3IgZmxhZyAqLwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBzb21lIGJ5dGVzIGhhZCBlcnJvcnMsIGV2ZXJ5IGJ5dGUgaGFzIHN0YXR1cyAqLwotCQkJZGJnKCIlcyAtIFJYIGVycm9yISEhISIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gUlggZXJyb3IhISEhIiwgX19mdW5jX18pOwogCQkJZm9yIChpID0gMDsgaSArIDEgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkgKz0gMikgewogCQkJCWludCBzdGF0ID0gZGF0YVtpXSwgZmxhZyA9IDA7CiAJCQkJaWYgKHN0YXQgJiBSWEVSUk9SX09WRVJSVU4pCkBAIC00NzksNyArNDc5LDcgQEAKIAl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCWlmIChwb3J0LT5vcGVuX2NvdW50KQogCQlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19mdW5jX18sIGVycik7CiAJCX0KIAlyZXR1cm47CiB9CkBAIC00OTAsOSArNDkwLDkgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCXN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSAqcF9wcml2OwogCi0JcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAlwX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JZGJnICgiJXMgLSB1cmIgJWQiLCBfX0ZVTkNUSU9OX18sIHVyYiA9PSBwX3ByaXYtPm91dF91cmJzWzFdKTsgCisJZGJnICgiJXMgLSB1cmIgJWQiLCBfX2Z1bmNfXywgdXJiID09IHBfcHJpdi0+b3V0X3VyYnNbMV0pOwogCiAJaWYgKHBvcnQtPm9wZW5fY291bnQpCiAJCXVzYl9zZXJpYWxfcG9ydF9zb2Z0aW50KHBvcnQpOwpAQCAtNTAwLDcgKzUwMCw3IEBACiAKIHN0YXRpYyB2b2lkCXVzYTI2X2luYWNrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7IAorCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCQogfQogCkBAIC01MDksMTEgKzUwOSwxMSBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlICpwX3ByaXY7CiAKLQlwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCWlmIChwX3ByaXYtPnJlc2VuZF9jb250KSB7Ci0JCWRiZyAoIiVzIC0gc2VuZGluZyBzZXR1cCIsIF9fRlVOQ1RJT05fXyk7IAorCQlkYmcgKCIlcyAtIHNlbmRpbmcgc2V0dXAiLCBfX2Z1bmNfXyk7CiAJCWtleXNwYW5fdXNhMjZfc2VuZF9zZXR1cChwb3J0LT5zZXJpYWwsIHBvcnQsIHBfcHJpdi0+cmVzZW5kX2NvbnQgLSAxKTsKIAl9CiB9CkBAIC01MjgsMTQgKzUyOCwxNCBAQAogCWludCBvbGRfZGNkX3N0YXRlLCBlcnI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0Jc2VyaWFsID0gKHN0cnVjdCB1c2Jfc2VyaWFsICopIHVyYi0+Y29udGV4dDsKKwlzZXJpYWwgPSAgdXJiLT5jb250ZXh0OwogCiAJaWYgKHN0YXR1cykgewotCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSA5KSB7Ci0JCWRiZygiJXMgLSAlZCBieXRlIHJlcG9ydD8/IiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlkYmcoIiVzIC0gJWQgYnl0ZSByZXBvcnQ/PyIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC01NDMsNyArNTQzLDcgQEAKIAogI2lmIDAKIAlkYmcoIiVzIC0gcG9ydCBzdGF0dXM6IHBvcnQgJWQgY3RzICVkIGRjZCAlZCBkc3IgJWQgcmkgJWQgdG9mZiAlZCB0eG9mZiAlZCByeGVuICVkIGNyICVkIiwKLQkgICAgX19GVU5DVElPTl9fLCBtc2ctPnBvcnQsIG1zZy0+aHNraWFfY3RzLCBtc2ctPmdwaWFfZGNkLCBtc2ctPmRzciwgbXNnLT5yaSwgbXNnLT5fdHhPZmYsCisJICAgIF9fZnVuY19fLCBtc2ctPnBvcnQsIG1zZy0+aHNraWFfY3RzLCBtc2ctPmdwaWFfZGNkLCBtc2ctPmRzciwgbXNnLT5yaSwgbXNnLT5fdHhPZmYsCiAJICAgIG1zZy0+X3R4WG9mZiwgbXNnLT5yeEVuYWJsZWQsIG1zZy0+Y29udHJvbFJlc3BvbnNlKTsKICNlbmRpZgogCkBAIC01NTIsNyArNTUyLDcgQEAKIAogCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSBhbmQgcmV0cmlldmUgcHJpdmF0ZSBkYXRhICovCQogCWlmIChtc2ctPnBvcnQgPj0gc2VyaWFsLT5udW1fcG9ydHMpIHsKLQkJZGJnICgiJXMgLSBVbmV4cGVjdGVkIHBvcnQgbnVtYmVyICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPnBvcnQpOworCQlkYmcgKCIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWQiLCBfX2Z1bmNfXywgbXNnLT5wb3J0KTsKIAkJZ290byBleGl0OwogCX0KIAlwb3J0ID0gc2VyaWFsLT5wb3J0W21zZy0+cG9ydF07CkBAIC01NzYsMTQgKzU3NiwxNCBAQAogCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KIAl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19mdW5jX18sIGVycik7CiAJfQogZXhpdDogOwogfQogCiBzdGF0aWMgdm9pZAl1c2EyNl9nbG9jb250X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAJCiB9CiAKQEAgLTU5Nyw5ICs1OTcsOSBAQAogCXN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSAgICAgICAgICAgICAqcF9wcml2OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIApAQCAtNjA5LDExICs2MDksMTEgQEAKIAlkbyB7CiAJCWlmIChzdGF0dXMpIHsKIAkJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXggb24gZW5kcG9pbnQgJWQuIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cywgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKKwkJCSAgICBfX2Z1bmNfXywgc3RhdHVzLCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwkJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAkJZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCkBAIC02MjksNyArNjI5LDcgQEAKIAkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJaWYgKHBvcnQtPm9wZW5fY291bnQpCiAJCQlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX2Z1bmNfXywgZXJyKTsKIAkJCX0KIAkJcF9wcml2LT5pbl9mbGlwIF49IDE7CiAKQEAgLTYzOSw3ICs2MzksNyBAQAogCiBzdGF0aWMgdm9pZAl1c2EyOF9pbmFja19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZAl1c2EyOF9vdXRjb250X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKQEAgLTY0NywxMSArNjQ3LDExIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qga2V5c3Bhbl9wb3J0X3ByaXZhdGUgKnBfcHJpdjsKIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJaWYgKHBfcHJpdi0+cmVzZW5kX2NvbnQpIHsKLQkJZGJnICgiJXMgLSBzZW5kaW5nIHNldHVwIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnICgiJXMgLSBzZW5kaW5nIHNldHVwIiwgX19mdW5jX18pOwogCQlrZXlzcGFuX3VzYTI4X3NlbmRfc2V0dXAocG9ydC0+c2VyaWFsLCBwb3J0LCBwX3ByaXYtPnJlc2VuZF9jb250IC0gMSk7CiAJfQogfQpAQCAtNjY3LDE5ICs2NjcsMTkgQEAKIAlpbnQgb2xkX2RjZF9zdGF0ZTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlzZXJpYWwgPSAoc3RydWN0IHVzYl9zZXJpYWwgKikgdXJiLT5jb250ZXh0OworCXNlcmlhbCA9ICB1cmItPmNvbnRleHQ7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXgiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXgiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBrZXlzcGFuX3VzYTI4X3BvcnRTdGF0dXNNZXNzYWdlKSkgewotCQlkYmcoIiVzIC0gYmFkIGxlbmd0aCAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZGJnKCIlcyAtIGJhZCBsZW5ndGggJWQiLCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJZ290byBleGl0OwogCX0KIAotCS8qZGJnKCIlcyAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCIsIF9fRlVOQ1RJT05fXworCS8qZGJnKCIlcyAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCIsIF9fZnVuY19fCiAJICAgIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sIGRhdGFbNF0sIGRhdGFbNV0sCiAJICAgIGRhdGFbNl0sIGRhdGFbN10sIGRhdGFbOF0sIGRhdGFbOV0sIGRhdGFbMTBdLCBkYXRhWzExXSk7Ki8KIAkKQEAgLTY4OSw3ICs2ODksNyBAQAogCiAJCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSBhbmQgcmV0cmlldmUgcHJpdmF0ZSBkYXRhICovCQogCWlmIChtc2ctPnBvcnQgPj0gc2VyaWFsLT5udW1fcG9ydHMpIHsKLQkJZGJnICgiJXMgLSBVbmV4cGVjdGVkIHBvcnQgbnVtYmVyICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPnBvcnQpOworCQlkYmcgKCIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWQiLCBfX2Z1bmNfXywgbXNnLT5wb3J0KTsKIAkJZ290byBleGl0OwogCX0KIAlwb3J0ID0gc2VyaWFsLT5wb3J0W21zZy0+cG9ydF07CkBAIC03MTMsMTQgKzcxMywxNCBAQAogCQkvKiBSZXN1Ym1pdCB1cmIgc28gd2UgY29udGludWUgcmVjZWl2aW5nICovCiAJdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCX0KIGV4aXQ6IDsKIH0KIAogc3RhdGljIHZvaWQJdXNhMjhfZ2xvY29udF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogfQogCiAKQEAgLTczMSwxNSArNzMxLDE1IEBACiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlICpwX3ByaXY7CiAJaW50IGk7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKLQlzZXJpYWwgPSAoc3RydWN0IHVzYl9zZXJpYWwgKikgdXJiLT5jb250ZXh0OworCXNlcmlhbCA9ICB1cmItPmNvbnRleHQ7CiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKIAkJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJCWlmIChwX3ByaXYtPnJlc2VuZF9jb250KSB7Ci0JCQlkYmcgKCIlcyAtIHNlbmRpbmcgc2V0dXAiLCBfX0ZVTkNUSU9OX18pOyAKKwkJCWRiZyAoIiVzIC0gc2VuZGluZyBzZXR1cCIsIF9fZnVuY19fKTsKIAkJCWtleXNwYW5fdXNhNDlfc2VuZF9zZXR1cChzZXJpYWwsIHBvcnQsIHBfcHJpdi0+cmVzZW5kX2NvbnQgLSAxKTsKIAkJCWJyZWFrOwogCQl9CkBAIC03NTksMjEgKzc1OSwyMSBAQAogCWludCBvbGRfZGNkX3N0YXRlOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAotCXNlcmlhbCA9IChzdHJ1Y3QgdXNiX3NlcmlhbCAqKSB1cmItPmNvbnRleHQ7CisJc2VyaWFsID0gIHVyYi0+Y29udGV4dDsKIAogCWlmIChzdGF0dXMpIHsKLQkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSBzaXplb2Yoc3RydWN0IGtleXNwYW5fdXNhNDlfcG9ydFN0YXR1c01lc3NhZ2UpKSB7Ci0JCWRiZygiJXMgLSBiYWQgbGVuZ3RoICVkIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlkYmcoIiVzIC0gYmFkIGxlbmd0aCAlZCIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JLypkYmcoIiAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCIsIF9fRlVOQ1RJT05fXywgCisJLypkYmcoIiAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCIsIF9fZnVuY19fLAogCSAgICBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdLCBkYXRhWzVdLAogCSAgICBkYXRhWzZdLCBkYXRhWzddLCBkYXRhWzhdLCBkYXRhWzldLCBkYXRhWzEwXSk7Ki8KIAkKQEAgLTc4Miw3ICs3ODIsNyBAQAogCiAJCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSBhbmQgcmV0cmlldmUgcHJpdmF0ZSBkYXRhICovCQogCWlmIChtc2ctPnBvcnROdW1iZXIgPj0gc2VyaWFsLT5udW1fcG9ydHMpIHsKLQkJZGJnICgiJXMgLSBVbmV4cGVjdGVkIHBvcnQgbnVtYmVyICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPnBvcnROdW1iZXIpOworCQlkYmcgKCIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWQiLCBfX2Z1bmNfXywgbXNnLT5wb3J0TnVtYmVyKTsKIAkJZ290byBleGl0OwogCX0KIAlwb3J0ID0gc2VyaWFsLT5wb3J0W21zZy0+cG9ydE51bWJlcl07CkBAIC04MDcsMTQgKzgwNywxNCBAQAogCXVyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAKIAlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCX0KIGV4aXQ6CTsKIH0KIAogc3RhdGljIHZvaWQJdXNhNDlfaW5hY2tfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQJdXNhNDlfaW5kYXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQpAQCAtODI2LDE3ICs4MjYsMTcgQEAKIAl1bnNpZ25lZCBjaGFyIAkJKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAllbmRwb2ludCA9IHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKTsKIAogCWlmIChzdGF0dXMpIHsKLQkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCBvbiBlbmRwb2ludCAlZC4iLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXggb24gZW5kcG9pbnQgJWQuIiwgX19mdW5jX18sCiAJCSAgICBzdGF0dXMsIGVuZHBvaW50KTsKIAkJcmV0dXJuOwogCX0KIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJdHR5ID0gcG9ydC0+dHR5OwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CiAJCS8qIDB4ODAgYml0IGlzIGVycm9yIGZsYWcgKi8KQEAgLTg2Niw3ICs4NjYsNyBAQAogCXVyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJaWYgKHBvcnQtPm9wZW5fY291bnQpCiAJCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX2Z1bmNfXywgZXJyKTsKIAkJfQogfQogCkBAIC04NzksMTIgKzg3OSwxMiBAQAogCXVuc2lnbmVkIGNoYXIgCQkqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXNlcmlhbCA9IHVyYi0+Y29udGV4dDsKIAogCWlmIChzdGF0dXMpIHsKLQkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gc3RhdHVzOiAleCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC04OTgsNyArODk4LDcgQEAKIAkJCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSovCiAJCQlpZiAoZGF0YVtpXSA+PSBzZXJpYWwtPm51bV9wb3J0cykgewogCQkJCWRiZyAoIiVzIC0gVW5leHBlY3RlZCBwb3J0IG51bWJlciAlZCIsCi0JCQkJCV9fRlVOQ1RJT05fXywgZGF0YVtpXSk7CisJCQkJCV9fZnVuY19fLCBkYXRhW2ldKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2RhdGFbaSsrXV07CkBAIC05NDQsMTMgKzk0NCwxMyBAQAogCiAJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCi0JCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX2Z1bmNfXywgZXJyKTsKIH0KIAogLyogbm90IHVzZWQsIHVzYS00OSBkb2Vzbid0IGhhdmUgcGVyLXBvcnQgY29udHJvbCBlbmRwb2ludHMgKi8KIHN0YXRpYyB2b2lkIHVzYTQ5X291dGNvbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgdXNhOTBfaW5kYXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQpAQCAtOTYzLDE3ICs5NjMsMTcgQEAKIAl1bnNpZ25lZCBjaGFyIAkJKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7IAorCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJZW5kcG9pbnQgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXggb24gZW5kcG9pbnQgJWQuIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzLCBlbmRwb2ludCk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzLCBlbmRwb2ludCk7CiAJCXJldHVybjsKIAl9CiAKLQlwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAJCQl9IAogCQkJZWxzZSB7CiAJCQkvKiBzb21lIGJ5dGVzIGhhZCBlcnJvcnMsIGV2ZXJ5IGJ5dGUgaGFzIHN0YXR1cyAqLwotCQkJCWRiZygiJXMgLSBSWCBlcnJvciEhISEiLCBfX0ZVTkNUSU9OX18pOworCQkJCWRiZygiJXMgLSBSWCBlcnJvciEhISEiLCBfX2Z1bmNfXyk7CiAJCQkJZm9yIChpID0gMDsgaSArIDEgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkgKz0gMikgewogCQkJCQlpbnQgc3RhdCA9IGRhdGFbaV0sIGZsYWcgPSAwOwogCQkJCQlpZiAoc3RhdCAmIFJYRVJST1JfT1ZFUlJVTikKQEAgLTEwMjEsNyArMTAyMSw3IEBACiAJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlpZiAocG9ydC0+b3Blbl9jb3VudCkKIAkJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSAhPSAwKSB7Ci0JCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJZGJnKCIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZC4gKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCQl9CiAJcmV0dXJuOwogfQpAQCAtMTAzNywxNCArMTAzNywxNCBAQAogCWludCBvbGRfZGNkX3N0YXRlLCBlcnI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0Jc2VyaWFsID0gKHN0cnVjdCB1c2Jfc2VyaWFsICopIHVyYi0+Y29udGV4dDsKKwlzZXJpYWwgPSAgdXJiLT5jb250ZXh0OwogCiAJaWYgKHN0YXR1cykgewotCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyBzdGF0dXM6ICV4IiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IDE0KSB7Ci0JCWRiZygiJXMgLSAlZCBieXRlIHJlcG9ydD8/IiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlkYmcoIiVzIC0gJWQgYnl0ZSByZXBvcnQ/PyIsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMDczLDcgKzEwNzMsNyBAQAogCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KIAl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlkYmcoIiVzIC0gcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAoJWQpIiwgX19mdW5jX18sIGVycik7CiAJfQogZXhpdDoKIAk7CkBAIC0xMDg0LDExICsxMDg0LDExIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qga2V5c3Bhbl9wb3J0X3ByaXZhdGUgKnBfcHJpdjsKIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJaWYgKHBfcHJpdi0+cmVzZW5kX2NvbnQpIHsKLQkJZGJnICgiJXMgLSBzZW5kaW5nIHNldHVwIiwgX19GVU5DVElPTl9fKTsgCisJCWRiZyAoIiVzIC0gc2VuZGluZyBzZXR1cCIsIF9fZnVuY19fKTsKIAkJa2V5c3Bhbl91c2E5MF9zZW5kX3NldHVwKHBvcnQtPnNlcmlhbCwgcG9ydCwgcF9wcml2LT5yZXNlbmRfY29udCAtIDEpOwogCX0KIH0KQEAgLTExMDUsMTcgKzExMDUsMTcgQEAKIAlpbnQgb2xkX2RjZF9zdGF0ZTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzZXJpYWwgPSB1cmItPmNvbnRleHQ7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXgiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBub256ZXJvIHN0YXR1czogJXgiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBrZXlzcGFuX3VzYTY3X3BvcnRTdGF0dXNNZXNzYWdlKSkgewotCQlkYmcoIiVzIC0gYmFkIGxlbmd0aCAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZGJnKCIlcyAtIGJhZCBsZW5ndGggJWQiLCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAogCS8qIENoZWNrIHBvcnQgbnVtYmVyIGZyb20gbWVzc2FnZSBhbmQgcmV0cmlldmUgcHJpdmF0ZSBkYXRhICovCiAJaWYgKG1zZy0+cG9ydCA+PSBzZXJpYWwtPm51bV9wb3J0cykgewotCQlkYmcgKCIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+cG9ydCk7CisJCWRiZyAoIiVzIC0gVW5leHBlY3RlZCBwb3J0IG51bWJlciAlZCIsIF9fZnVuY19fLCBtc2ctPnBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTQ5LDcgKzExNDksNyBAQAogCXVyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCi0JCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWRiZygiJXMgLSByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX2Z1bmNfXywgZXJyKTsKIH0KIAogc3RhdGljIHZvaWQgdXNhNjdfZ2xvY29udF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCkBAIC0xMTU5LDcgKzExNTksNyBAQAogCXN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSAqcF9wcml2OwogCWludCBpOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc2VyaWFsID0gdXJiLT5jb250ZXh0OwogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CkBAIC0xMTY3LDcgKzExNjcsNyBAQAogCQlwX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAkJaWYgKHBfcHJpdi0+cmVzZW5kX2NvbnQpIHsKLQkJCWRiZyAoIiVzIC0gc2VuZGluZyBzZXR1cCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcgKCIlcyAtIHNlbmRpbmcgc2V0dXAiLCBfX2Z1bmNfXyk7CiAJCQlrZXlzcGFuX3VzYTY3X3NlbmRfc2V0dXAoc2VyaWFsLCBwb3J0LAogCQkJCQkJcF9wcml2LT5yZXNlbmRfY29udCAtIDEpOwogCQkJYnJlYWs7CkBAIC0xMTgzLDEwICsxMTgzLDExIEBACiAJaW50CQkJCWRhdGFfbGVuOwogCXN0cnVjdCB1cmIJCQkqdGhpc191cmI7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlkX2RldGFpbHMgPSBwX3ByaXYtPmRldmljZV9kZXRhaWxzOwogCisJLyogRklYTUU6IGxvY2tpbmcgKi8KIAlpZiAoZF9kZXRhaWxzLT5tc2dfZm9ybWF0ID09IG1zZ191c2E5MCkKICAgIAkJZGF0YV9sZW4gPSA2NDsKIAllbHNlCkBAIC0xMjAzLDEzICsxMjA0LDEzIEBACiAJCQlpZiAodGhpc191cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpCiAJCQkJcmV0dXJuIChkYXRhX2xlbik7CiAJfQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludCBrZXlzcGFuX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAKQEAgLTEyMjgsNyArMTIyOSw3IEBACiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWRfZGV0YWlscyA9IHBfcHJpdi0+ZGV2aWNlX2RldGFpbHM7CiAKLQlkYmcoIiVzIC0gcG9ydCVkLiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCVkLiIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogU2V0IHNvbWUgc2FuZSBkZWZhdWx0cyAqLwogCXBfcHJpdi0+cnRzX3N0YXRlID0gMTsKQEAgLTEyNTMsNyArMTI1NCw3IEBACiAJCXVzYl9jbGVhcl9oYWx0KHVyYi0+ZGV2LCB1cmItPnBpcGUpOwogCiAJCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKSkgIT0gMCkgewotCQkJZGJnKCIlcyAtIHN1Ym1pdCB1cmIgJWQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIGksIGVycik7CisJCQlkYmcoIiVzIC0gc3VibWl0IHVyYiAlZCBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCBpLCBlcnIpOwogCQl9CiAJfQogCkBAIC0xMjg5LDcgKzEyOTAsNyBAQAogCS8vbWRlbGF5KDEwMCk7CiAJLy9rZXlzcGFuX3NldF90ZXJtaW9zKHBvcnQsIE5VTEwpOwogCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHN0b3BfdXJiKHN0cnVjdCB1cmIgKnVyYikKQEAgLTEzMDUsNyArMTMwNiw3IEBACiAJc3RydWN0IGtleXNwYW5fc2VyaWFsX3ByaXZhdGUgCSpzX3ByaXY7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlIAkqcF9wcml2OwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAlzX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCQpAQCAtMTMyMCw3ICsxMzIxLDcgQEAKIAl9CiAKIAkvKndoaWxlIChwX3ByaXYtPm91dGNvbnRfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCWRiZygiJXMgLSB1cmIgaW4gcHJvZ3Jlc3MiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdXJiIGluIHByb2dyZXNzIiwgX19mdW5jX18pOwogCX0qLwogCiAJcF9wcml2LT5vdXRfZmxpcCA9IDA7CkBAIC0xNDg0LDEwICsxNDg1LDEwIEBACiAJaWYgKGVuZHBvaW50ID09IC0xKQogCQlyZXR1cm4gTlVMTDsJCS8qIGVuZHBvaW50IG5vdCBuZWVkZWQgKi8KIAotCWRiZyAoIiVzIC0gYWxsb2MgZm9yIGVuZHBvaW50ICVkLiIsIF9fRlVOQ1RJT05fXywgZW5kcG9pbnQpOworCWRiZyAoIiVzIC0gYWxsb2MgZm9yIGVuZHBvaW50ICVkLiIsIF9fZnVuY19fLCBlbmRwb2ludCk7CiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsJCS8qIE5vIElTTyAqLwogCWlmICh1cmIgPT0gTlVMTCkgewotCQlkYmcgKCIlcyAtIGFsbG9jIGZvciBlbmRwb2ludCAlZCBmYWlsZWQuIiwgX19GVU5DVElPTl9fLCBlbmRwb2ludCk7CisJCWRiZyAoIiVzIC0gYWxsb2MgZm9yIGVuZHBvaW50ICVkIGZhaWxlZC4iLCBfX2Z1bmNfXywgZW5kcG9pbnQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE1ODgsNyArMTU4OSw3IEBACiAJc3RydWN0IGNhbGxiYWNrcwkJKmNiYWNrOwogCWludAkJCQllbmRwOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCWRfZGV0YWlscyA9IHNfcHJpdi0+ZGV2aWNlX2RldGFpbHM7CkBAIC0xNjYyLDcgKzE2NjMsNyBAQAogCQlkaXYsCS8qIGRpdmlzb3IgKi8JCiAJCWNudDsJLyogaW52ZXJzZSBvZiBkaXZpc29yIChwcm9ncmFtbWVkIGludG8gODA1MSkgKi8KIAkJCi0JZGJnICgiJXMgLSAlZC4iLCBfX0ZVTkNUSU9OX18sIGJhdWRfcmF0ZSk7CisJZGJnICgiJXMgLSAlZC4iLCBfX2Z1bmNfXywgYmF1ZF9yYXRlKTsKIAogCQkvKiBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLi4uICAqLwogCWlmKCAoYjE2ID0gKGJhdWRfcmF0ZSAqIDE2TCkpID09IDApIHsKQEAgLTE2OTUsNyArMTY5Niw3IEBACiAJCSpyYXRlX2hpID0gKHU4KSAoKGNudCA+PiA4KSAmIDB4ZmYpOwogCX0KIAlpZiAocmF0ZV9sb3cgJiYgcmF0ZV9oaSkgewotCQlkYmcgKCIlcyAtICVkICUwMnggJTAyeC4iLCBfX0ZVTkNUSU9OX18sIGJhdWRfcmF0ZSwgKnJhdGVfaGksICpyYXRlX2xvdyk7CisJCWRiZyAoIiVzIC0gJWQgJTAyeCAlMDJ4LiIsIF9fZnVuY19fLCBiYXVkX3JhdGUsICpyYXRlX2hpLCAqcmF0ZV9sb3cpOwogCX0KIAkKIAlyZXR1cm4gKEtFWVNQQU5fQkFVRF9SQVRFX09LKTsKQEAgLTE3MDgsNyArMTcwOSw3IEBACiAJdTMyIAliMTYsCS8qIGJhdWQgcmF0ZSB0aW1lcyAxNiAoYWN0dWFsIHJhdGUgdXNlZCBpbnRlcm5hbGx5KSAqLwogCQkJZGl2OwkvKiBkaXZpc29yICovCQogCQkKLQlkYmcgKCIlcyAtICVkLiIsIF9fRlVOQ1RJT05fXywgYmF1ZF9yYXRlKTsKKwlkYmcgKCIlcyAtICVkLiIsIF9fZnVuY19fLCBiYXVkX3JhdGUpOwogCiAJCS8qIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8uLi4gICovCiAJaWYoIChiMTYgPSAoYmF1ZF9yYXRlICogMTZMKSkgPT0gMCkgCkBAIC0xNzMxLDcgKzE3MzIsNyBAQAogCQkqcmF0ZV9oaSA9ICh1OCkgKChkaXYgPj4gOCkgJiAweGZmKTsKIAkKIAlpZiAocmF0ZV9sb3cgJiYgcmF0ZV9oaSkgCi0JCWRiZyAoIiVzIC0gJWQgJTAyeCAlMDJ4LiIsIF9fRlVOQ1RJT05fXywgYmF1ZF9yYXRlLCAqcmF0ZV9oaSwgKnJhdGVfbG93KTsKKwkJZGJnICgiJXMgLSAlZCAlMDJ4ICUwMnguIiwgX19mdW5jX18sIGJhdWRfcmF0ZSwgKnJhdGVfaGksICpyYXRlX2xvdyk7CiAJCiAJcmV0dXJuIChLRVlTUEFOX0JBVURfUkFURV9PSyk7CiB9CkBAIC0xNzQ4LDcgKzE3NDksNyBAQAogCXU4CWJlc3RfcHJlc2NhbGVyOwogCWludAlpOwogCi0JZGJnICgiJXMgLSAlZC4iLCBfX0ZVTkNUSU9OX18sIGJhdWRfcmF0ZSk7CisJZGJnICgiJXMgLSAlZC4iLCBfX2Z1bmNfXywgYmF1ZF9yYXRlKTsKIAogCQkvKiBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvICovCiAJaWYoIChiMTYgPSBiYXVkX3JhdGUgKiAxNkwpID09IDApIHsKQEAgLTE3OTYsNyArMTc5Nyw3IEBACiAJfQogCWlmIChwcmVzY2FsZXIpIHsKIAkJKnByZXNjYWxlciA9IGJlc3RfcHJlc2NhbGVyOwotCQkvKiAgZGJnKCIlcyAtICVkICVkIiwgX19GVU5DVElPTl9fLCAqcHJlc2NhbGVyLCBkaXYpOyAqLworCQkvKiAgZGJnKCIlcyAtICVkICVkIiwgX19mdW5jX18sICpwcmVzY2FsZXIsIGRpdik7ICovCiAJfQogCXJldHVybiAoS0VZU1BBTl9CQVVEX1JBVEVfT0spOwogfQpAQCAtMTgwOSw3ICsxODEwLDcgQEAKIAkJZGl2LAkvKiBkaXZpc29yICovCQogCQljbnQ7CS8qIGludmVyc2Ugb2YgZGl2aXNvciAocHJvZ3JhbW1lZCBpbnRvIDgwNTEpICovCiAKLQlkYmcgKCIlcyAtICVkLiIsIF9fRlVOQ1RJT05fXywgYmF1ZF9yYXRlKTsKKwlkYmcgKCIlcyAtICVkLiIsIF9fZnVuY19fLCBiYXVkX3JhdGUpOwogCiAJCS8qIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8gKi8KIAlpZiAoKGIxNiA9IGJhdWRfcmF0ZSAqIDE2TCkgPT0gMCkKQEAgLTE4NDgsNyArMTg0OSw3IEBACiAJaWYgKHJhdGVfaGkpIHsKIAkJKnJhdGVfaGkgPSAodTgpICgoY250ID4+IDgpICYgMHhmZik7CiAJfQotCWRiZyAoIiVzIC0gJWQgT0suIiwgX19GVU5DVElPTl9fLCBiYXVkX3JhdGUpOworCWRiZyAoIiVzIC0gJWQgT0suIiwgX19mdW5jX18sIGJhdWRfcmF0ZSk7CiAJcmV0dXJuIChLRVlTUEFOX0JBVURfUkFURV9PSyk7CiB9CiAKQEAgLTE4NjQsNyArMTg2NSw3IEBACiAJc3RydWN0IHVyYgkJCQkqdGhpc191cmI7CiAJaW50IAkJCQkJZGV2aWNlX3BvcnQsIGVycjsKIAotCWRiZyAoIiVzIHJlc2V0PSVkIiwgX19GVU5DVElPTl9fLCByZXNldF9wb3J0KTsgCisJZGJnICgiJXMgcmVzZXQ9JWQiLCBfX2Z1bmNfXywgcmVzZXRfcG9ydCk7CiAKIAlzX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwpAQCAtMTg3NCwxMSArMTg3NSwxMSBAQAogCW91dGNvbnRfdXJiID0gZF9kZXRhaWxzLT5vdXRjb250X2VuZHBvaW50c1twb3J0LT5udW1iZXJdOwogCXRoaXNfdXJiID0gcF9wcml2LT5vdXRjb250X3VyYjsKIAotCWRiZygiJXMgLSBlbmRwb2ludCAlZCIsIF9fRlVOQ1RJT05fXywgdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSkpOworCWRiZygiJXMgLSBlbmRwb2ludCAlZCIsIF9fZnVuY19fLCB1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSk7CiAKIAkJLyogTWFrZSBzdXJlIHdlIGhhdmUgYW4gdXJiIHRoZW4gc2VuZCB0aGUgbWVzc2FnZSAqLwogCWlmICh0aGlzX3VyYiA9PSBOVUxMKSB7Ci0JCWRiZygiJXMgLSBvb3BzIG5vIHVyYi4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gb29wcyBubyB1cmIuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xODg3LDcgKzE4ODgsNyBAQAogCWlmICgocmVzZXRfcG9ydCArIDEpID4gcF9wcml2LT5yZXNlbmRfY29udCkKIAkJcF9wcml2LT5yZXNlbmRfY29udCA9IHJlc2V0X3BvcnQgKyAxOwogCWlmICh0aGlzX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQkvKiAgZGJnICgiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOyAqLworCQkvKiAgZGJnICgiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX2Z1bmNfXyk7ICovCiAJCW1kZWxheSg1KTsKIAkJcmV0dXJuKC0xKTsKIAl9CkBAIC0xOTAxLDcgKzE5MDIsNyBAQAogCQlpZiAoZF9kZXRhaWxzLT5jYWxjdWxhdGVfYmF1ZF9yYXRlCiAJCSAgICAocF9wcml2LT5iYXVkLCBkX2RldGFpbHMtPmJhdWRjbGssICZtc2cuYmF1ZEhpLAogCQkgICAgICZtc2cuYmF1ZExvLCAmbXNnLnByZXNjYWxlciwgZGV2aWNlX3BvcnQpID09IEtFWVNQQU5fSU5WQUxJRF9CQVVEX1JBVEUgKSB7Ci0JCQlkYmcoIiVzIC0gSW52YWxpZCBiYXVkIHJhdGUgJWQgcmVxdWVzdGVkLCB1c2luZyA5NjAwLiIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZygiJXMgLSBJbnZhbGlkIGJhdWQgcmF0ZSAlZCByZXF1ZXN0ZWQsIHVzaW5nIDk2MDAuIiwgX19mdW5jX18sCiAJCQkgICAgcF9wcml2LT5iYXVkKTsKIAkJCW1zZy5iYXVkTG8gPSAwOwogCQkJbXNnLmJhdWRIaSA9IDEyNTsJLyogVmFsdWVzIGZvciA5NjAwIGJhdWQgKi8KQEAgLTE5OTYsMTcgKzE5OTcsMTcgQEAKIAogCXRoaXNfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZCAoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZCAoJWQpIiwgX19mdW5jX18sIGVycik7CiAJfQogI2lmIDAKIAllbHNlIHsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKCVkKSBPSyAlZCBieXRlcyAoZW5kICVkKSIsIF9fRlVOQ1RJT05fXworCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoJWQpIE9LICVkIGJ5dGVzIChlbmQgJWQpIiwgX19mdW5jX18KIAkJICAgIG91dGNvbnRfdXJiLCB0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJICAgIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpKTsKIAl9CiAjZW5kaWYKIAotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga2V5c3Bhbl91c2EyOF9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCkBAIC0yMDIwLDcgKzIwMjEsNyBAQAogCXN0cnVjdCB1cmIJCQkJKnRoaXNfdXJiOwogCWludCAJCQkJCWRldmljZV9wb3J0LCBlcnI7CiAKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CiAJcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwpAQCAtMjAyOSw3ICsyMDMwLDcgQEAKIAogCS8qIG9ubHkgZG8gc29tZXRoaW5nIGlmIHdlIGhhdmUgYSBidWxrIG91dCBlbmRwb2ludCAqLwogCWlmICgodGhpc191cmIgPSBwX3ByaXYtPm91dGNvbnRfdXJiKSA9PSBOVUxMKSB7Ci0JCWRiZygiJXMgLSBvb3BzIG5vIHVyYi4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gb29wcyBubyB1cmIuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yMDM4LDcgKzIwMzksNyBAQAogCWlmICgocmVzZXRfcG9ydCArIDEpID4gcF9wcml2LT5yZXNlbmRfY29udCkKIAkJcF9wcml2LT5yZXNlbmRfY29udCA9IHJlc2V0X3BvcnQgKyAxOwogCWlmICh0aGlzX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQlkYmcgKCIlcyBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyBhbHJlYWR5IHdyaXRpbmciLCBfX2Z1bmNfXyk7CiAJCW1kZWxheSg1KTsKIAkJcmV0dXJuKC0xKTsKIAl9CkBAIC0yMDQ4LDcgKzIwNDksNyBAQAogCW1zZy5zZXRCYXVkUmF0ZSA9IDE7CiAJaWYgKGRfZGV0YWlscy0+Y2FsY3VsYXRlX2JhdWRfcmF0ZShwX3ByaXYtPmJhdWQsIGRfZGV0YWlscy0+YmF1ZGNsaywKIAkJJm1zZy5iYXVkSGksICZtc2cuYmF1ZExvLCBOVUxMLCBkZXZpY2VfcG9ydCkgPT0gS0VZU1BBTl9JTlZBTElEX0JBVURfUkFURSApIHsKLQkJZGJnKCIlcyAtIEludmFsaWQgYmF1ZCByYXRlIHJlcXVlc3RlZCAlZC4iLCBfX0ZVTkNUSU9OX18sIHBfcHJpdi0+YmF1ZCk7CisJCWRiZygiJXMgLSBJbnZhbGlkIGJhdWQgcmF0ZSByZXF1ZXN0ZWQgJWQuIiwgX19mdW5jX18sIHBfcHJpdi0+YmF1ZCk7CiAJCW1zZy5iYXVkTG8gPSAweGZmOwogCQltc2cuYmF1ZEhpID0gMHhiMjsJLyogVmFsdWVzIGZvciA5NjAwIGJhdWQgKi8KIAl9CkBAIC0yMTIyLDE2ICsyMTIzLDE2IEBACiAKIAl0aGlzX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZCIsIF9fZnVuY19fKTsKIAl9CiAjaWYgMAogCWVsc2UgewotCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIE9LICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIE9LICVkIGJ5dGVzIiwgX19mdW5jX18sCiAJCSAgICB0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CiAJfQogI2VuZGlmCiAKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGtleXNwYW5fdXNhNDlfc2VuZF9zZXR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLApAQCAtMjE0Niw3ICsyMTQ3LDcgQEAKIAlzdHJ1Y3QgdXJiCQkJCSp0aGlzX3VyYjsKIAlpbnQgCQkJCQllcnIsIGRldmljZV9wb3J0OwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTIxNTcsMTEgKzIxNTgsMTEgQEAKIAkvKiBXb3JrIG91dCB3aGljaCBwb3J0IHdpdGhpbiB0aGUgZGV2aWNlIGlzIGJlaW5nIHNldHVwICovCiAJZGV2aWNlX3BvcnQgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnKCIlcyAtIGVuZHBvaW50ICVkIHBvcnQgJWQgKCVkKSIsX19GVU5DVElPTl9fLCB1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgcG9ydC0+bnVtYmVyLCBkZXZpY2VfcG9ydCk7CisJZGJnKCIlcyAtIGVuZHBvaW50ICVkIHBvcnQgJWQgKCVkKSIsX19mdW5jX18sIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpLCBwb3J0LT5udW1iZXIsIGRldmljZV9wb3J0KTsKIAogCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiB1cmIgdGhlbiBzZW5kIHRoZSBtZXNzYWdlICovCiAJaWYgKHRoaXNfdXJiID09IE5VTEwpIHsKLQkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiIGZvciBwb3J0ICVkLiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiIGZvciBwb3J0ICVkLiIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yMTcxLDcgKzIxNzIsNyBAQAogCQlwX3ByaXYtPnJlc2VuZF9jb250ID0gcmVzZXRfcG9ydCArIDE7CiAKIAlpZiAodGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJLyogIGRiZyAoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsgKi8KKwkJLyogIGRiZyAoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19mdW5jX18pOyAqLwogCQltZGVsYXkoNSk7CiAJCXJldHVybigtMSk7CiAJfQpAQCAtMjE4OCw3ICsyMTg5LDcgQEAKIAkJaWYgKGRfZGV0YWlscy0+Y2FsY3VsYXRlX2JhdWRfcmF0ZQogCQkgICAgKHBfcHJpdi0+YmF1ZCwgZF9kZXRhaWxzLT5iYXVkY2xrLCAmbXNnLmJhdWRIaSwKIAkJICAgICAmbXNnLmJhdWRMbywgJm1zZy5wcmVzY2FsZXIsIGRldmljZV9wb3J0KSA9PSBLRVlTUEFOX0lOVkFMSURfQkFVRF9SQVRFICkgewotCQkJZGJnKCIlcyAtIEludmFsaWQgYmF1ZCByYXRlICVkIHJlcXVlc3RlZCwgdXNpbmcgOTYwMC4iLCBfX0ZVTkNUSU9OX18sCisJCQlkYmcoIiVzIC0gSW52YWxpZCBiYXVkIHJhdGUgJWQgcmVxdWVzdGVkLCB1c2luZyA5NjAwLiIsIF9fZnVuY19fLAogCQkJICAgIHBfcHJpdi0+YmF1ZCk7CiAJCQltc2cuYmF1ZExvID0gMDsKIAkJCW1zZy5iYXVkSGkgPSAxMjU7CS8qIFZhbHVlcyBmb3IgOTYwMCBiYXVkICovCkBAIC0yMzA3LDE3ICsyMzA4LDE3IEBACiAJCXRoaXNfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAl9CiAJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCX0KICNpZiAwCiAJZWxzZSB7Ci0JCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYiglZCkgT0sgJWQgYnl0ZXMgKGVuZCAlZCkiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYiglZCkgT0sgJWQgYnl0ZXMgKGVuZCAlZCkiLCBfX2Z1bmNfXywKIAkJCSAgIG91dGNvbnRfdXJiLCB0aGlzX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCSAgIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpKTsKIAl9CiAjZW5kaWYKIAotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga2V5c3Bhbl91c2E5MF9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCkBAIC0yMzMyLDcgKzIzMzMsNyBAQAogCWludCAJCQkJCWVycjsKIAl1OAkJCQkJCXByZXNjYWxlcjsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCXNfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKIAlwX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0yMzQwLDcgKzIzNDEsNyBAQAogCiAJLyogb25seSBkbyBzb21ldGhpbmcgaWYgd2UgaGF2ZSBhIGJ1bGsgb3V0IGVuZHBvaW50ICovCiAJaWYgKCh0aGlzX3VyYiA9IHBfcHJpdi0+b3V0Y29udF91cmIpID09IE5VTEwpIHsKLQkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBvb3BzIG5vIHVyYi4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTIzNDksNyArMjM1MCw3IEBACiAJaWYgKChyZXNldF9wb3J0ICsgMSkgPiBwX3ByaXYtPnJlc2VuZF9jb250KQogCQlwX3ByaXYtPnJlc2VuZF9jb250ID0gcmVzZXRfcG9ydCArIDE7CiAJaWYgKHRoaXNfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCWRiZyAoIiVzIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsKIAkJbWRlbGF5KDUpOwogCQlyZXR1cm4oLTEpOwogCX0KQEAgLTIzNjMsNyArMjM2NCw3IEBACiAJCWlmIChkX2RldGFpbHMtPmNhbGN1bGF0ZV9iYXVkX3JhdGUKIAkJICAgIChwX3ByaXYtPmJhdWQsIGRfZGV0YWlscy0+YmF1ZGNsaywgJm1zZy5iYXVkSGksCiAJCSAgICAgJm1zZy5iYXVkTG8sICZwcmVzY2FsZXIsIDApID09IEtFWVNQQU5fSU5WQUxJRF9CQVVEX1JBVEUgKSB7Ci0JCQlkYmcoIiVzIC0gSW52YWxpZCBiYXVkIHJhdGUgJWQgcmVxdWVzdGVkLCB1c2luZyA5NjAwLiIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZygiJXMgLSBJbnZhbGlkIGJhdWQgcmF0ZSAlZCByZXF1ZXN0ZWQsIHVzaW5nIDk2MDAuIiwgX19mdW5jX18sCiAJCQkgICAgcF9wcml2LT5iYXVkKTsKIAkJCXBfcHJpdi0+YmF1ZCA9IDk2MDA7CiAJCQlkX2RldGFpbHMtPmNhbGN1bGF0ZV9iYXVkX3JhdGUgKHBfcHJpdi0+YmF1ZCwgZF9kZXRhaWxzLT5iYXVkY2xrLCAKQEAgLTI0NTMsOSArMjQ1NCw5IEBACiAKIAl0aGlzX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKLQkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKSIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCBlcnIpOwogCX0KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGtleXNwYW5fdXNhNjdfc2VuZF9zZXR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLApAQCAtMjQ2OSw3ICsyNDcwLDcgQEAKIAlzdHJ1Y3QgdXJiCQkJCSp0aGlzX3VyYjsKIAlpbnQgCQkJCQllcnIsIGRldmljZV9wb3J0OwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTI0ODIsNyArMjQ4Myw3IEBACiAKIAkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiB1cmIgdGhlbiBzZW5kIHRoZSBtZXNzYWdlICovCiAJaWYgKHRoaXNfdXJiID09IE5VTEwpIHsKLQkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiIGZvciBwb3J0ICVkLiIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIG9vcHMgbm8gdXJiIGZvciBwb3J0ICVkLiIsIF9fZnVuY19fLAogCQkJcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTI0OTIsNyArMjQ5Myw3IEBACiAJaWYgKChyZXNldF9wb3J0ICsgMSkgPiBwX3ByaXYtPnJlc2VuZF9jb250KQogCQlwX3ByaXYtPnJlc2VuZF9jb250ID0gcmVzZXRfcG9ydCArIDE7CiAJaWYgKHRoaXNfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCS8qICBkYmcgKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7ICovCisJCS8qICBkYmcgKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsgKi8KIAkJbWRlbGF5KDUpOwogCQlyZXR1cm4oLTEpOwogCX0KQEAgLTI1MDgsNyArMjUwOSw3IEBACiAJCWlmIChkX2RldGFpbHMtPmNhbGN1bGF0ZV9iYXVkX3JhdGUKIAkJICAgIChwX3ByaXYtPmJhdWQsIGRfZGV0YWlscy0+YmF1ZGNsaywgJm1zZy5iYXVkSGksCiAJCSAgICAgJm1zZy5iYXVkTG8sICZtc2cucHJlc2NhbGVyLCBkZXZpY2VfcG9ydCkgPT0gS0VZU1BBTl9JTlZBTElEX0JBVURfUkFURSApIHsKLQkJCWRiZygiJXMgLSBJbnZhbGlkIGJhdWQgcmF0ZSAlZCByZXF1ZXN0ZWQsIHVzaW5nIDk2MDAuIiwgX19GVU5DVElPTl9fLAorCQkJZGJnKCIlcyAtIEludmFsaWQgYmF1ZCByYXRlICVkIHJlcXVlc3RlZCwgdXNpbmcgOTYwMC4iLCBfX2Z1bmNfXywKIAkJCSAgICBwX3ByaXYtPmJhdWQpOwogCQkJbXNnLmJhdWRMbyA9IDA7CiAJCQltc2cuYmF1ZEhpID0gMTI1OwkvKiBWYWx1ZXMgZm9yIDk2MDAgYmF1ZCAqLwpAQCAtMjYwMSw5ICsyNjAyLDkgQEAKIAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCi0JCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihzZXR1cCkgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihzZXR1cCkgZmFpbGVkICglZCkiLCBfX2Z1bmNfXywKIAkJCQllcnIpOwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGtleXNwYW5fc2VuZF9zZXR1cChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgcmVzZXRfcG9ydCkKQEAgLTI2MTIsNyArMjYxMyw3IEBACiAJc3RydWN0IGtleXNwYW5fc2VyaWFsX3ByaXZhdGUgKnNfcHJpdjsKIAljb25zdCBzdHJ1Y3Qga2V5c3Bhbl9kZXZpY2VfZGV0YWlscyAqZF9kZXRhaWxzOwogCi0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCWRfZGV0YWlscyA9IHNfcHJpdi0+ZGV2aWNlX2RldGFpbHM7CkBAIC0yNjQ3LDIwICsyNjQ4LDIwIEBACiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlCSpwX3ByaXY7CiAJY29uc3Qgc3RydWN0IGtleXNwYW5fZGV2aWNlX2RldGFpbHMJKmRfZGV0YWlsczsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyAoZF9kZXRhaWxzID0ga2V5c3Bhbl9kZXZpY2VzW2ldKSAhPSBOVUxMOyArK2kpCiAJCWlmIChkX2RldGFpbHMtPnByb2R1Y3RfaWQgPT0gbGUxNl90b19jcHUoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSkKIAkJCWJyZWFrOwogCWlmIChkX2RldGFpbHMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgLSB1bmtub3duIHByb2R1Y3QgaWQgJXhcbiIsIF9fRlVOQ1RJT05fXywgbGUxNl90b19jcHUoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CisJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIHVua25vd24gcHJvZHVjdCBpZCAleFxuIiwgX19mdW5jX18sIGxlMTZfdG9fY3B1KHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBTZXR1cCBwcml2YXRlIGRhdGEgZm9yIHNlcmlhbCBkcml2ZXIgKi8KIAlzX3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga2V5c3Bhbl9zZXJpYWxfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghc19wcml2KSB7Ci0JCWRiZygiJXMgLSBrbWFsbG9jIGZvciBrZXlzcGFuX3NlcmlhbF9wcml2YXRlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0ga21hbGxvYyBmb3Iga2V5c3Bhbl9zZXJpYWxfcHJpdmF0ZSBmYWlsZWQuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI2NzIsNyArMjY3Myw3IEBACiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCXBfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBfcHJpdikgewotCQkJZGJnKCIlcyAtIGttYWxsb2MgZm9yIGtleXNwYW5fcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIS4iLCBfX0ZVTkNUSU9OX18sIGkpOworCQkJZGJnKCIlcyAtIGttYWxsb2MgZm9yIGtleXNwYW5fcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIS4iLCBfX2Z1bmNfXywgaSk7CiAJCQlyZXR1cm4gKDEpOwogCQl9CiAJCXBfcHJpdi0+ZGV2aWNlX2RldGFpbHMgPSBkX2RldGFpbHM7CkBAIC0yNjg1LDE4ICsyNjg2LDE4IEBACiAJCXNfcHJpdi0+aW5zdGF0X3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHNfcHJpdi0+aW5zdGF0X3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIgIT0gMCkKLQkJCWRiZygiJXMgLSBzdWJtaXQgaW5zdGF0IHVyYiBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQlkYmcoIiVzIC0gc3VibWl0IGluc3RhdCB1cmIgZmFpbGVkICVkIiwgX19mdW5jX18sCiAJCQkJZXJyKTsKIAl9CiAJaWYgKHNfcHJpdi0+aW5kYXRfdXJiICE9IE5VTEwpIHsKIAkJc19wcml2LT5pbmRhdF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCQllcnIgPSB1c2Jfc3VibWl0X3VyYihzX3ByaXYtPmluZGF0X3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIgIT0gMCkKLQkJCWRiZygiJXMgLSBzdWJtaXQgaW5kYXQgdXJiIGZhaWxlZCAlZCIsIF9fRlVOQ1RJT05fXywKKwkJCWRiZygiJXMgLSBzdWJtaXQgaW5kYXQgdXJiIGZhaWxlZCAlZCIsIF9fZnVuY19fLAogCQkJCWVycik7CiAJfQogCQkJCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQga2V5c3Bhbl9zaHV0ZG93biAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKQEAgLTI3MDYsNyArMjcwNyw3IEBACiAJc3RydWN0IGtleXNwYW5fc2VyaWFsX3ByaXZhdGUgCSpzX3ByaXY7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlCSpwX3ByaXY7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJc19wcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uaAppbmRleCA3NGNlOGJjLi44ZDZlZDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmgKQEAgLTYzNiwxMCArNjM2LDYgQEAKIAl9LAogCS5kZXNjcmlwdGlvbgkJPSAiS2V5c3BhbiAtICh3aXRob3V0IGZpcm13YXJlKSIsCiAJLmlkX3RhYmxlCQk9IGtleXNwYW5fcHJlX2lkcywKLQkubnVtX2ludGVycnVwdF9pbgk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9pbnRlcnJ1cHRfb3V0CT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4JCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0CQk9IE5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cwkJPSAxLAogCS5hdHRhY2gJCQk9IGtleXNwYW5fZmFrZV9zdGFydHVwLAogfTsKQEAgLTY1MSwxMCArNjQ3LDYgQEAKIAl9LAogCS5kZXNjcmlwdGlvbgkJPSAiS2V5c3BhbiAxIHBvcnQgYWRhcHRlciIsCiAJLmlkX3RhYmxlCQk9IGtleXNwYW5fMXBvcnRfaWRzLAotCS5udW1faW50ZXJydXB0X2luCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2ludGVycnVwdF9vdXQJPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbgkJPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQJCT0gTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzCQk9IDEsCiAJLm9wZW4JCQk9IGtleXNwYW5fb3BlbiwKIAkuY2xvc2UJCQk9IGtleXNwYW5fY2xvc2UsCkBAIC02NzksMTAgKzY3MSw2IEBACiAJfSwKIAkuZGVzY3JpcHRpb24JCT0gIktleXNwYW4gMiBwb3J0IGFkYXB0ZXIiLAogCS5pZF90YWJsZQkJPSBrZXlzcGFuXzJwb3J0X2lkcywKLQkubnVtX2ludGVycnVwdF9pbgk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9pbnRlcnJ1cHRfb3V0CT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4JCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0CQk9IE5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cwkJPSAyLAogCS5vcGVuCQkJPSBrZXlzcGFuX29wZW4sCiAJLmNsb3NlCQkJPSBrZXlzcGFuX2Nsb3NlLApAQCAtNzA3LDEwICs2OTUsNiBAQAogCX0sCiAJLmRlc2NyaXB0aW9uCQk9ICJLZXlzcGFuIDQgcG9ydCBhZGFwdGVyIiwKIAkuaWRfdGFibGUJCT0ga2V5c3Bhbl80cG9ydF9pZHMsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSBOVU1fRE9OVF9DQVJFLAotCS5udW1faW50ZXJydXB0X291dAk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luCQk9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dAkJPSBOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMJCT0gNCwKIAkub3BlbgkJCT0ga2V5c3Bhbl9vcGVuLAogCS5jbG9zZQkJCT0ga2V5c3Bhbl9jbG9zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggYjFmYTVhMy4uZmY1NDIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTIwOCwxMyArMjA4LDEzIEBACiAJCQkJIDIwMDApOwogCWlmIChyZXN1bHQgPCAwKQogCQlkYmcoIiVzIC0gZXJyb3IgJWQgZnJvbSB1c2JfY29udHJvbF9tc2ciLCAKLQkJICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJICAgIF9fZnVuY19fLCByZXN1bHQpOwogfQogCiAKIHN0YXRpYyB2b2lkIGtleXNwYW5fcGRhX3J4X2ludGVycnVwdCAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogICAgICAgIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgaTsKQEAgLTIzMiwxMSArMjMyLDExIEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI3NCw3ICsyNzQsNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpCiAJCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCSAgICAgX19mdW5jX18sIHJldHZhbCk7CiB9CiAKIApAQCAtMzU4LDcgKzM1OCw3IEBACiAJCQkJdmFsdWUsIDAsIE5VTEwsIDAsIDIwMDApOwogCWlmIChyZXN1bHQgPCAwKQogCQlkYmcoIiVzIC0gZXJyb3IgJWQgZnJvbSB1c2JfY29udHJvbF9tc2ciLCAKLQkJICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJICAgIF9fZnVuY19fLCByZXN1bHQpOwogCS8qIHRoZXJlIGlzIHNvbWV0aGluZyBmdW5reSBhYm91dCB0aGlzLi4gdGhlIFRDU0JSSyB0aGF0ICdjdScgcGVyZm9ybXMKIAkgICBvdWdodCB0byB0cmFuc2xhdGUgaW50byBhIGJyZWFrX2N0bCgtMSksYnJlYWtfY3RsKDApIHBhaXIgSFovNAogCSAgIHNlY29uZHMgYXBhcnQsIGJ1dCBpdCBmZWVscyBsaWtlIHRoZSBicmVhayBzZW50IGlzbid0IGFzIGxvbmcgYXMgaXQKQEAgLTYwOCw3ICs2MDgsNyBAQAogCiBzdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV93cml0ZV9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGtleXNwYW5fcGRhX3ByaXZhdGUgKnByaXY7CiAKIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CkBAIC02MzYsMTQgKzYzNiwxOSBAQAogc3RhdGljIGludCBrZXlzcGFuX3BkYV9jaGFyc19pbl9idWZmZXIgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGtleXNwYW5fcGRhX3ByaXZhdGUgKnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKIAogCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAkvKiB3aGVuIHRocm90dGxlZCwgcmV0dXJuIGF0IGxlYXN0IFdBS0VVUF9DSEFSUyB0byB0ZWxsIHNlbGVjdCgpICh2aWEKIAkgICBuX3R0eS5jOm5vcm1hbF9wb2xsKCkgKSB0aGF0IHdlJ3JlIG5vdCB3cml0ZWFibGUuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSB8fCBwcml2LT50eF90aHJvdHRsZWQpCi0JCXJldHVybiAyNTY7Ci0JcmV0dXJuIDA7CisJCXJldCA9IDI1NjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC02NjUsMTEgKzY3MCwxMSBAQAogCQkJICAgICAxLAogCQkJICAgICAyMDAwKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWRiZygiJXMgLSByb29tcXVlcnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHJvb21xdWVyeSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCWlmIChyYyA9PSAwKSB7Ci0JCWRiZygiJXMgLSByb29tcXVlcnkgcmV0dXJuZWQgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSByb29tcXVlcnkgcmV0dXJuZWQgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmMgPSAtRUlPOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTY4OCw3ICs2OTMsNyBAQAogCXBvcnQtPmludGVycnVwdF9pbl91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCXJjID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJjKSB7Ci0JCWRiZygiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIGludCkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgaW50KSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC03MzIsNyArNzM3LDcgQEAKIAkJcmVjb3JkID0gJnhpcmNvbV9wZ3NfZmlybXdhcmVbMF07CiAjZW5kaWYKIAlpZiAocmVjb3JkID09IE5VTEwpIHsKLQkJZXJyKCIlczogdW5rbm93biB2ZW5kb3IsIGFib3J0aW5nLiIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXM6IHVua25vd24gdmVuZG9yLCBhYm9ydGluZy4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNzc5LDcgKzc4NCw3IEBACiAKIHN0YXRpYyB2b2lkIGtleXNwYW5fcGRhX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAJCiAJa2ZyZWUodXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSkpOwogfQpAQCAtNzkzLDkgKzc5OCw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJLZXlzcGFuIFBEQSAtIChwcmVyZW51bWVyYXRpb24pIiwKIAkudXNiX2RyaXZlciA9IAkJJmtleXNwYW5fcGRhX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGVfZmFrZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCWtleXNwYW5fcGRhX2Zha2Vfc3RhcnR1cCwKIH07CkBAIC04MTAsOSArODEyLDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIlhpcmNvbSAvIEVudHJlZ3JhIFBHUyAtIChwcmVyZW51bWVyYXRpb24pIiwKIAkudXNiX2RyaXZlciA9IAkJJmtleXNwYW5fcGRhX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGVfZmFrZV94aXJjb20sCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLmF0dGFjaCA9CQlrZXlzcGFuX3BkYV9mYWtlX3N0YXJ0dXAsCiB9OwpAQCAtODI2LDkgKzgyNSw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJLZXlzcGFuIFBEQSIsCiAJLnVzYl9kcml2ZXIgPSAJCSZrZXlzcGFuX3BkYV9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlX3N0ZCwKLQkubnVtX2ludGVycnVwdF9pbiA9CTEsCi0JLm51bV9idWxrX2luID0JCTAsCi0JLm51bV9idWxrX291dCA9CQkxLAogCS5udW1fcG9ydHMgPQkJMSwKIAkub3BlbiA9CQkJa2V5c3Bhbl9wZGFfb3BlbiwKIAkuY2xvc2UgPQkJa2V5c3Bhbl9wZGFfY2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCA1NTczNmRmLi5iMzk1YWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTEyNiw5ICsxMjYsNiBAQAogCS5kZXNjcmlwdGlvbiA9CSAgICAgIktMNUtVU0IxMDVEIC8gUGFsbUNvbm5lY3QiLAogCS51c2JfZHJpdmVyID0JICAgICAma2w1a3VzYjEwNWRfZHJpdmVyLAogCS5pZF90YWJsZSA9CSAgICAgaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPSAgMSwKLQkubnVtX2J1bGtfaW4gPQkgICAgIDEsCi0JLm51bV9idWxrX291dCA9CSAgICAgMSwKIAkubnVtX3BvcnRzID0JICAgICAxLAogCS5vcGVuID0JCSAgICAga2xzaV8xMDVfb3BlbiwKIAkuY2xvc2UgPQkgICAgIGtsc2lfMTA1X2Nsb3NlLApAQCAtMTk0LDcgKzE5MSw3IEBACiAJaWYgKHJjIDwgMCkKIAkJZXJyKCJDaGFuZ2UgcG9ydCBzZXR0aW5ncyBmYWlsZWQgKGVycm9yID0gJWQpIiwgcmMpOwogCWluZm8oIiVzIC0gJWQgYnl0ZSBibG9jaywgYmF1ZHJhdGUgJXgsIGRhdGFiaXRzICVkLCB1MSAlZCwgdTIgJWQiLAotCSAgICBfX0ZVTkNUSU9OX18sCisJICAgIF9fZnVuY19fLAogCSAgICBzZXR0aW5ncy0+cGt0bGVuLAogCSAgICBzZXR0aW5ncy0+YmF1ZHJhdGUsIHNldHRpbmdzLT5kYXRhYml0cywKIAkgICAgc2V0dGluZ3MtPnVua25vd24xLCBzZXR0aW5ncy0+dW5rbm93bjIpOwpAQCAtMjI1LDcgKzIyMiw3IEBACiAJX191OCBzdGF0dXNfYnVmW0tMU0lfU1RBVFVTQlVGX0xFTl0gPSB7IC0xLC0xfTsKIAlfX3UxNiBzdGF0dXM7CiAKLQlpbmZvKCIlcyAtIHNlbmRpbmcgU0lPIFBvbGwgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisJaW5mbygiJXMgLSBzZW5kaW5nIFNJTyBQb2xsIHJlcXVlc3QiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJjID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJICAgICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAogCQkJICAgICBLTDVLVVNCMTA1QV9TSU9fUE9MTCwKQEAgLTI0MCw3ICsyMzcsNyBAQAogCWVsc2UgewogCQlzdGF0dXMgPSBsZTE2X3RvX2NwdSgqKHUxNiAqKXN0YXR1c19idWYpOwogCi0JCWluZm8oIiVzIC0gcmVhZCBzdGF0dXMgJXggJXgiLCBfX0ZVTkNUSU9OX18sCisJCWluZm8oIiVzIC0gcmVhZCBzdGF0dXMgJXggJXgiLCBfX2Z1bmNfXywKIAkJICAgICBzdGF0dXNfYnVmWzBdLCBzdGF0dXNfYnVmWzFdKTsKIAogCQkqbGluZV9zdGF0ZV9wID0ga2xzaV8xMDVfc3RhdHVzMmxpbmVzdGF0ZShzdGF0dXMpOwpAQCAtMjY4LDcgKzI2NSw3IEBACiAJCXByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2xzaV8xMDVfcHJpdmF0ZSksCiAJCQkJCQkgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwcml2KSB7Ci0JCQlkYmcoIiVza21hbGxvYyBmb3Iga2xzaV8xMDVfcHJpdmF0ZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXNrbWFsbG9jIGZvciBrbHNpXzEwNV9wcml2YXRlIGZhaWxlZC4iLCBfX2Z1bmNfXyk7CiAJCQlpLS07CiAJCQlnb3RvIGVycl9jbGVhbnVwOwogCQl9CkBAIC0yOTgsNyArMjk1LDcgQEAKIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyAoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAogCQkJCQkJCUdGUF9LRVJORUwpOwogCQkJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikgewotCQkJCWVycigiJXMgLSBvdXQgb2YgbWVtb3J5IGZvciB1cmIgYnVmZmVycy4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWVycigiJXMgLSBvdXQgb2YgbWVtb3J5IGZvciB1cmIgYnVmZmVycy4iLCBfX2Z1bmNfXyk7CiAJCQkJZ290byBlcnJfY2xlYW51cDsKIAkJCX0KIAkJfQpAQCAtMzI4LDcgKzMyNSw3IEBACiB7CiAJaW50IGk7CiAJCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIHN0b3AgcmVhZHMgYW5kIHdyaXRlcyBvbiBhbGwgcG9ydHMgKi8KIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKQEAgLTM3Myw3ICszNzAsNyBAQAogCXN0cnVjdCBrbHNpXzEwNV9wb3J0X3NldHRpbmdzIGNmZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogZm9yY2UgbG93X2xhdGVuY3kgb24gc28gdGhhdCBvdXIgdHR5X3B1c2ggYWN0dWFsbHkgZm9yY2VzCiAJICogdGhlIGRhdGEgdGhyb3VnaApAQCAtNDE5LDcgKzQxNiw3IEBACiAKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmMpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmMpOworCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJjKTsKIAkJcmV0dmFsID0gcmM7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC00MzcsMTQgKzQzNCwxNCBAQAogCQllcnIoIkVuYWJsaW5nIHJlYWQgZmFpbGVkIChlcnJvciA9ICVkKSIsIHJjKTsKIAkJcmV0dmFsID0gcmM7CiAJfSBlbHNlIAotCQlkYmcoIiVzIC0gZW5hYmxlZCByZWFkaW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGVuYWJsZWQgcmVhZGluZyIsIF9fZnVuY19fKTsKIAogCXJjID0ga2xzaV8xMDVfZ2V0X2xpbmVfc3RhdGUocG9ydCwgJmxpbmVfc3RhdGUpOwogCWlmIChyYyA+PSAwKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlICgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQlwcml2LT5saW5lX3N0YXRlID0gbGluZV9zdGF0ZTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJZGJnKCIlcyAtIHJlYWQgbGluZSBzdGF0ZSAweCVseCIsIF9fRlVOQ1RJT05fXywgbGluZV9zdGF0ZSk7CisJCWRiZygiJXMgLSByZWFkIGxpbmUgc3RhdGUgMHglbHgiLCBfX2Z1bmNfXywgbGluZV9zdGF0ZSk7CiAJCXJldHZhbCA9IDA7CiAJfSBlbHNlCiAJCXJldHZhbCA9IHJjOwpAQCAtNDU5LDcgKzQ1Niw3IEBACiAJc3RydWN0IGtsc2lfMTA1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHJjOwogCi0JZGJnKCIlcyBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJbXV0ZXhfbG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKIAlpZiAoIXBvcnQtPnNlcmlhbC0+ZGlzY29ubmVjdGVkKSB7CkBAIC01MDIsNyArNDk5LDcgQEAKIAlpbnQgcmVzdWx0LCBzaXplOwogCWludCBieXRlc19zZW50PTA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQkvKiB0cnkgdG8gZmluZCBhIGZyZWUgdXJiICh3cml0ZSAwIGJ5dGVzIGlmIG5vbmUpICovCkBAIC01MTQsMjEgKzUxMSwyMSBAQAogCQlmb3IgKGk9MDsgaTxOVU1fVVJCUzsgaSsrKSB7CiAJCQlpZiAocHJpdi0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKIAkJCQl1cmIgPSBwcml2LT53cml0ZV91cmJfcG9vbFtpXTsKLQkJCQlkYmcoIiVzIC0gdXNpbmcgcG9vbCBVUkIgJWQiLCBfX0ZVTkNUSU9OX18sIGkpOworCQkJCWRiZygiJXMgLSB1c2luZyBwb29sIFVSQiAlZCIsIF9fZnVuY19fLCBpKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJCWlmICh1cmI9PU5VTEwpIHsKLQkJCWRiZygiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gbm8gbW9yZSBmcmVlIHVyYnMiLCBfX2Z1bmNfXyk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAogCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewogCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jIChVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCQllcnIoIiVzIC0gbm8gbW9yZSBrZXJuZWwgbWVtb3J5Li4uIiwgX19GVU5DVElPTl9fKTsKKwkJCQllcnIoIiVzIC0gbm8gbW9yZSBrZXJuZWwgbWVtb3J5Li4uIiwgX19mdW5jX18pOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAkJfQpAQCAtNTU0LDcgKzU1MSw3IEBACiAJCS8qIHNlbmQgdGhlIGRhdGEgb3V0IHRoZSBidWxrIHBvcnQgKi8KIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCQkJZ290byBleGl0OwogCQl9CiAJCWJ1ZiArPSBzaXplOwpAQCAtNTcwLDEzICs1NjcsMTMgQEAKIAogc3RhdGljIHZvaWQga2xzaV8xMDVfd3JpdGVfYnVsa19jYWxsYmFjayAoIHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHN0YXR1cykgewotCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLAogCQkgICAgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTYwMyw3ICs2MDAsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiAoY2hhcnMpOwogfQogCkBAIC02MjMsNyArNjIwLDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgcm9vbSk7CiAJcmV0dXJuIChyb29tKTsKIH0KIApAQCAtNjMxLDE4ICs2MjgsMTggQEAKIAogc3RhdGljIHZvaWQga2xzaV8xMDVfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGtsc2lfMTA1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHJjOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBUaGUgdXJiIG1pZ2h0IGhhdmUgYmVlbiBraWxsZWQuICovCiAJaWYgKHN0YXR1cykgewotCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CkBAIC02NTIsMTIgKzY0OSwxMiBAQAogCSAqLwogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCkgewogCQkvKiBlbXB0eSB1cmJzIHNlZW0gdG8gaGFwcGVuLCB3ZSBpZ25vcmUgdGhlbSAqLwotCQkvKiBkYmcoIiVzIC0gZW10cHkgVVJCIiwgX19GVU5DVElPTl9fKTsgKi8KKwkJLyogZGJnKCIlcyAtIGVtdHB5IFVSQiIsIF9fZnVuY19fKTsgKi8KIAkgICAgICAgOwogCX0gZWxzZSBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDw9IDIpIHsKLQkJZGJnKCIlcyAtIHNpemUgJWQgVVJCIG5vdCB1bmRlcnN0b29kIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gc2l6ZSAlZCBVUkIgbm90IHVuZGVyc3Rvb2QiLCBfX2Z1bmNfXywKIAkJICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLAorCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJCSAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAJfSBlbHNlIHsKIAkJaW50IGJ5dGVzX3NlbnQgPSAoKF9fdTggKikgZGF0YSlbMF0gKwpAQCAtNjY5LDEyICs2NjYsMTIgQEAKIAkJICogaW50ZXJtaXhlZCB0dHlfZmxpcF9idWZmZXJfcHVzaCgpcwogCQkgKiBGSVhNRQogCQkgKi8gCi0JCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLAorCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJCSAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAkJaWYgKGJ5dGVzX3NlbnQgKyAyID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CiAJCQlkYmcoIiVzIC0gdHJ5aW5nIHRvIHJlYWQgbW9yZSBkYXRhIHRoYW4gYXZhaWxhYmxlIgotCQkJICAgICIgKCVkIHZzLiAlZCkiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgIiAoJWQgdnMuICVkKSIsIF9fZnVuY19fLAogCQkJICAgIGJ5dGVzX3NlbnQrMiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCS8qIGNhcCBhdCBpbXBsaWVkIGxpbWl0ICovCiAJCQlieXRlc19zZW50ID0gdXJiLT5hY3R1YWxfbGVuZ3RoIC0gMjsKQEAgLTY5Nyw3ICs2OTQsNyBAQAogCQkgICAgICBwb3J0KTsKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmMpCi0JCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmMpOworCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmMpOwogfSAvKiBrbHNpXzEwNV9yZWFkX2J1bGtfY2FsbGJhY2sgKi8KIAogCkBAIC03MDUsMTIgKzcwMiwxNCBAQAogCQkJCSAgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3Qga2xzaV8xMDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQl1bnNpZ25lZCBpbnQgaWZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfaWZsYWc7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKKwl1bnNpZ25lZCBpbnQgaWZsYWcgPSB0dHktPnRlcm1pb3MtPmNfaWZsYWc7CiAJdW5zaWduZWQgaW50IG9sZF9pZmxhZyA9IG9sZF90ZXJtaW9zLT5jX2lmbGFnOwotCXVuc2lnbmVkIGludCBjZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwl1bnNpZ25lZCBpbnQgY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAJdW5zaWduZWQgaW50IG9sZF9jZmxhZyA9IG9sZF90ZXJtaW9zLT5jX2NmbGFnOwogCXN0cnVjdCBrbHNpXzEwNV9wb3J0X3NldHRpbmdzIGNmZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwZWVkX3QgYmF1ZDsKIAkKIAkvKiBsb2NrIHdoaWxlIHdlIGFyZSBtb2RpZnlpbmcgdGhlIHNldHRpbmdzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC03MTgsMTAgKzcxNywxMiBAQAogCS8qCiAJICogVXBkYXRlIGJhdWQgcmF0ZQogCSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpOworCiAJaWYoIChjZmxhZyAmIENCQVVEKSAhPSAob2xkX2NmbGFnICYgQ0JBVUQpICkgewogCSAgICAgICAgLyogcmVhc3NlcnQgRFRSIGFuZCAobWF5YmUpIFJUUyBvbiB0cmFuc2l0aW9uIGZyb20gQjAgKi8KIAkJaWYoIChvbGRfY2ZsYWcgJiBDQkFVRCkgPT0gQjAgKSB7Ci0JCQlkYmcoIiVzOiBiYXVkIHdhcyBCMCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzOiBiYXVkIHdhcyBCMCIsIF9fZnVuY19fKTsKICNpZiAwCiAJCQlwcml2LT5jb250cm9sX3N0YXRlIHw9IFRJT0NNX0RUUjsKIAkJCS8qIGRvbid0IHNldCBSVFMgaWYgdXNpbmcgaGFyZHdhcmUgZmxvdyBjb250cm9sICovCkBAIC03MzEsOCArNzMyLDggQEAKIAkJCW1jdF91MjMyX3NldF9tb2RlbV9jdHJsKHNlcmlhbCwgcHJpdi0+Y29udHJvbF9zdGF0ZSk7CiAjZW5kaWYKIAkJfQotCQkKLQkJc3dpdGNoKHR0eV9nZXRfYmF1ZF9yYXRlKHBvcnQtPnR0eSkpIHsKKwl9CisJc3dpdGNoKGJhdWQpIHsKIAkJY2FzZSAwOiAvKiBoYW5kbGVkIGJlbG93ICovCiAJCQlicmVhazsKIAkJY2FzZSAxMjAwOgpAQCAtNzYwLDM1ICs3NjEsMzYgQEAKIAkJCXByaXYtPmNmZy5iYXVkcmF0ZSA9IGtsNWt1c2IxMDVhX3Npb19iMTE1MjAwOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQllcnIoIktMU0kgVVNCLT5TZXJpYWwgY29udmVydGVyOiIKKwkJCWRiZygiS0xTSSBVU0ItPlNlcmlhbCBjb252ZXJ0ZXI6IgogCQkJICAgICIgdW5zdXBwb3J0ZWQgYmF1ZHJhdGUgcmVxdWVzdCwgdXNpbmcgZGVmYXVsdCIKIAkJCSAgICAiIG9mIDk2MDAiKTsKIAkJCXByaXYtPmNmZy5iYXVkcmF0ZSA9IGtsNWt1c2IxMDVhX3Npb19iOTYwMDsKKwkJCWJhdWQgPSA5NjAwOwogCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCApIHsKLQkJCWRiZygiJXM6IGJhdWQgaXMgQjAiLCBfX0ZVTkNUSU9OX18pOwotCQkJLyogRHJvcCBSVFMgYW5kIERUUiAqLwotCQkJLyogbWF5YmUgdGhpcyBzaG91bGQgYmUgc2ltdWxhdGVkIGJ5IHNlbmRpbmcgcmVhZAotCQkJICogZGlzYWJsZSBhbmQgcmVhZCBlbmFibGUgbWVzc2FnZXM/Ci0JCQkgKi8KLQkJCTsKLSNpZiAwCi0JCQlwcml2LT5jb250cm9sX3N0YXRlICY9IH4oVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKLSAgICAgICAgCQltY3RfdTIzMl9zZXRfbW9kZW1fY3RybChzZXJpYWwsIHByaXYtPmNvbnRyb2xfc3RhdGUpOwotI2VuZGlmCi0JCX0KIAl9CisJaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCApIHsKKwkJZGJnKCIlczogYmF1ZCBpcyBCMCIsIF9fZnVuY19fKTsKKwkJLyogRHJvcCBSVFMgYW5kIERUUiAqLworCQkvKiBtYXliZSB0aGlzIHNob3VsZCBiZSBzaW11bGF0ZWQgYnkgc2VuZGluZyByZWFkCisJCSAqIGRpc2FibGUgYW5kIHJlYWQgZW5hYmxlIG1lc3NhZ2VzPworCQkgKi8KKwkJOworI2lmIDAKKwkJcHJpdi0+Y29udHJvbF9zdGF0ZSAmPSB+KFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7CisgICAgICAgCQltY3RfdTIzMl9zZXRfbW9kZW1fY3RybChzZXJpYWwsIHByaXYtPmNvbnRyb2xfc3RhdGUpOworI2VuZGlmCisJfQorCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAKIAlpZiAoKGNmbGFnICYgQ1NJWkUpICE9IChvbGRfY2ZsYWcgJiBDU0laRSkpIHsKIAkJLyogc2V0IHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzICovCiAJCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewogCQljYXNlIENTNToKLQkJCWRiZygiJXMgLSA1IGJpdHMvYnl0ZSBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSA1IGJpdHMvYnl0ZSBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiA7CiAJCWNhc2UgQ1M2OgotCQkJZGJnKCIlcyAtIDYgYml0cy9ieXRlIG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIDYgYml0cy9ieXRlIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIDsKIAkJY2FzZSBDUzc6CkBAIC04MTAsNiArODEyLDggQEAKIAlpZiAoKGNmbGFnICYgKFBBUkVOQnxQQVJPREQpKSAhPSAob2xkX2NmbGFnICYgKFBBUkVOQnxQQVJPREQpKQogCSAgICB8fCAoY2ZsYWcgJiBDU1RPUEIpICE9IChvbGRfY2ZsYWcgJiBDU1RPUEIpICkgewogCQkKKwkJLyogTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH4oUEFSRU5CfFBBUk9ERHxDU1RPUEIpOwogI2lmIDAKIAkJcHJpdi0+bGFzdF9sY3IgPSAwOwogCkBAIC04MzcsNiArODQxLDggQEAKIAkgICAgfHwgKGlmbGFnICYgSVhPTikgIT0gKG9sZF9pZmxhZyAmIElYT04pCiAJICAgIHx8ICAoY2ZsYWcgJiBDUlRTQ1RTKSAhPSAob2xkX2NmbGFnICYgQ1JUU0NUUykgKSB7CiAJCQorCQkvKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNSVFNDVFM7CiAJCS8qIERyb3AgRFRSL1JUUyBpZiBubyBmbG93IGNvbnRyb2wgb3RoZXJ3aXNlIGFzc2VydCAqLwogI2lmIDAKIAkJaWYgKChpZmxhZyAmIElYT0ZGKSB8fCAoaWZsYWcgJiBJWE9OKSB8fCAoY2ZsYWcgJiBDUlRTQ1RTKSApCkBAIC04NjIsNyArODY4LDcgQEAKIAlzdHJ1Y3QgbWN0X3UyMzJfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgbWN0X3UyMzJfcHJpdmF0ZSAqKXBvcnQtPnByaXZhdGU7CiAJdW5zaWduZWQgY2hhciBsY3IgPSBwcml2LT5sYXN0X2xjcjsKIAotCWRiZygiJXNzdGF0ZT0lZCIsIF9fRlVOQ1RJT05fXywgYnJlYWtfc3RhdGUpOworCWRiZygiJXNzdGF0ZT0lZCIsIF9fZnVuY19fLCBicmVha19zdGF0ZSk7CiAKIAlpZiAoYnJlYWtfc3RhdGUpCiAJCWxjciB8PSBNQ1RfVTIzMl9TRVRfQlJFQUs7CkBAIC04NzcsNyArODgzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGxpbmVfc3RhdGU7Ci0JZGJnKCIlcyAtIHJlcXVlc3QsIGp1c3QgZ3Vlc3NpbmciLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSByZXF1ZXN0LCBqdXN0IGd1ZXNzaW5nIiwgX19mdW5jX18pOwogCiAJcmMgPSBrbHNpXzEwNV9nZXRfbGluZV9zdGF0ZShwb3J0LCAmbGluZV9zdGF0ZSk7CiAJaWYgKHJjIDwgMCkgewpAQCAtODg5LDcgKzg5NSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcHJpdi0+bGluZV9zdGF0ZSA9IGxpbmVfc3RhdGU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlkYmcoIiVzIC0gcmVhZCBsaW5lIHN0YXRlIDB4JWx4IiwgX19GVU5DVElPTl9fLCBsaW5lX3N0YXRlKTsKKwlkYmcoIiVzIC0gcmVhZCBsaW5lIHN0YXRlIDB4JWx4IiwgX19mdW5jX18sIGxpbmVfc3RhdGUpOwogCXJldHVybiAoaW50KWxpbmVfc3RhdGU7CiB9CiAKQEAgLTg5OCw3ICs5MDQsNyBAQAogewogCWludCByZXR2YWwgPSAtRUlOVkFMOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIC8qIGlmIHRoaXMgZXZlciBnZXRzIGltcGxlbWVudGVkLCBpdCBzaG91bGQgYmUgZG9uZSBzb21ldGhpbmcgbGlrZSB0aGlzOgogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CkBAIC05MjQsNyArOTMwLDcgQEAKIAogc3RhdGljIHZvaWQga2xzaV8xMDVfdGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwogfQogCkBAIC05MzIsMTIgKzkzOCwxMiBAQAogewogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJcG9ydC0+cmVhZF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0KQotCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLAorCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sCiAJCSAgICByZXN1bHQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKaW5kZXggMTdiM2JhZS4uNjkzZjAwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYwpAQCAtMTEzLDEwICsxMTMsNiBAQAogCS5kZXNjcmlwdGlvbiA9CQkiS09CSUwgVVNCIHNtYXJ0IGNhcmQgdGVybWluYWwiLAogCS51c2JfZHJpdmVyID0gCQkma29iaWxfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9pbnRlcnJ1cHRfb3V0ID0gCU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCTAsCi0JLm51bV9idWxrX291dCA9CQkwLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCWtvYmlsX3N0YXJ0dXAsCiAJLnNodXRkb3duID0JCWtvYmlsX3NodXRkb3duLApAQCAtMTM5LDcgKzEzNSw2IEBACiAJaW50IGZpbGxlZDsgIC8vIGluZGV4IG9mIHRoZSBsYXN0IGNoYXIgaW4gYnVmCiAJaW50IGN1cl9wb3M7IC8vIGluZGV4IG9mIHRoZSBuZXh0IGNoYXIgdG8gc2VuZCBpbiBidWYKIAlfX3UxNiBkZXZpY2VfdHlwZTsKLQlpbnQgbGluZV9zdGF0ZTsKIH07CiAKIApAQCAtMTYxLDcgKzE1Niw2IEBACiAJcHJpdi0+ZmlsbGVkID0gMDsKIAlwcml2LT5jdXJfcG9zID0gMDsKIAlwcml2LT5kZXZpY2VfdHlwZSA9IGxlMTZfdG9fY3B1KHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0JcHJpdi0+bGluZV9zdGF0ZSA9IDA7CiAKIAlzd2l0Y2ggKHByaXYtPmRldmljZV90eXBlKXsKIAljYXNlIEtPQklMX0FEQVBURVJfQl9QUk9EVUNUX0lEOgpAQCAtMTg5LDExICsxODMsMTEgQEAKICAJZm9yIChpID0gMDsgaSA8IGFsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CiAJCWVuZHBvaW50ID0gJmFsdHNldHRpbmctPmVuZHBvaW50W2ldOwogCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9vdXQoJmVuZHBvaW50LT5kZXNjKSkgewotCQkgCWRiZygiJXMgRm91bmQgaW50ZXJydXB0IG91dCBlbmRwb2ludC4gQWRkcmVzczogJWQiLCBfX0ZVTkNUSU9OX18sIGVuZHBvaW50LT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOworCQkgCWRiZygiJXMgRm91bmQgaW50ZXJydXB0IG91dCBlbmRwb2ludC4gQWRkcmVzczogJWQiLCBfX2Z1bmNfXywgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CiAJCSAJcHJpdi0+d3JpdGVfaW50X2VuZHBvaW50X2FkZHJlc3MgPSBlbmRwb2ludC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogIAkJfQogCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbigmZW5kcG9pbnQtPmRlc2MpKSB7Ci0JCSAJZGJnKCIlcyBGb3VuZCBpbnRlcnJ1cHQgaW4gIGVuZHBvaW50LiBBZGRyZXNzOiAlZCIsIF9fRlVOQ1RJT05fXywgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CisJCSAJZGJnKCIlcyBGb3VuZCBpbnRlcnJ1cHQgaW4gIGVuZHBvaW50LiBBZGRyZXNzOiAlZCIsIF9fZnVuY19fLCBlbmRwb2ludC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKIAkJIAlwcml2LT5yZWFkX2ludF9lbmRwb2ludF9hZGRyZXNzID0gZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzczsKIAkgCX0KIAl9CkBAIC0yMDQsNyArMTk4LDcgQEAKIHN0YXRpYyB2b2lkIGtvYmlsX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewogCWludCBpOwotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBzZXJpYWwtPnBvcnRbMF0tPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgc2VyaWFsLT5wb3J0WzBdLT5udW1iZXIpOwogCiAJZm9yIChpPTA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCXdoaWxlIChzZXJpYWwtPnBvcnRbaV0tPm9wZW5fY291bnQgPiAwKSB7CkBAIC0yMjQsOSArMjE4LDggQEAKIAlpbnQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDg7CiAJaW50IHdyaXRlX3VyYl90cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gODsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQlwcml2LT5saW5lX3N0YXRlID0gMDsKIAogCS8vIHNvbWVvbmUgc2V0cyB0aGUgZGV2IHRvIDAgaWYgdGhlIGNsb3NlIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKQEAgLTI1MiwxMCArMjQ1LDEwIEBACiAJCiAJLy8gYWxsb2NhdGUgd3JpdGVfdXJiCiAJaWYgKCFwb3J0LT53cml0ZV91cmIpIHsgCi0JCWRiZygiJXMgLSBwb3J0ICVkICBBbGxvY2F0aW5nIHBvcnQtPndyaXRlX3VyYiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAtIHBvcnQgJWQgIEFsbG9jYXRpbmcgcG9ydC0+d3JpdGVfdXJiIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCXBvcnQtPndyaXRlX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7ICAKIAkJaWYgKCFwb3J0LT53cml0ZV91cmIpIHsKLQkJCWRiZygiJXMgLSBwb3J0ICVkIHVzYl9hbGxvY191cmIgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAtIHBvcnQgJWQgdXNiX2FsbG9jX3VyYiBmYWlsZWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCWtmcmVlKHRyYW5zZmVyX2J1ZmZlcik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMjgxLDcgKzI3NCw3IEBACiAJCQkJICB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogCQkJCSAgS09CSUxfVElNRU9VVAogCQkpOwotCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgZ2V0X0hXX3ZlcnNpb24gVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCBnZXRfSFdfdmVyc2lvbiBVUkIgcmV0dXJuczogJWkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOwogCWRiZygiSGFyd2FyZSB2ZXJzaW9uOiAlaS4laS4laSIsIHRyYW5zZmVyX2J1ZmZlclswXSwgdHJhbnNmZXJfYnVmZmVyWzFdLCB0cmFuc2Zlcl9idWZmZXJbMl0gKTsKIAkKIAkvLyBnZXQgZmlybXdhcmUgdmVyc2lvbgpAQCAtMjk1LDcgKzI4OCw3IEBACiAJCQkJICB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogCQkJCSAgS09CSUxfVElNRU9VVAogCQkpOwotCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgZ2V0X0ZXX3ZlcnNpb24gVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCBnZXRfRldfdmVyc2lvbiBVUkIgcmV0dXJuczogJWkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOwogCWRiZygiRmlybXdhcmUgdmVyc2lvbjogJWkuJWkuJWkiLCB0cmFuc2Zlcl9idWZmZXJbMF0sIHRyYW5zZmVyX2J1ZmZlclsxXSwgdHJhbnNmZXJfYnVmZmVyWzJdICk7CiAKIAlpZiAocHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfQURBUFRFUl9CX1BST0RVQ1RfSUQgfHwgcHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfQURBUFRFUl9LX1BST0RVQ1RfSUQpIHsKQEAgLTMxMCw3ICszMDMsNyBAQAogCQkJCQkgIDAsCiAJCQkJCSAgS09CSUxfVElNRU9VVAogCQkJKTsKLQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCBzZXRfYmF1ZHJhdGUgVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgc2V0X2JhdWRyYXRlIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJCQogCQkvLyByZXNldCBhbGwgcXVldWVzCiAJCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyggcG9ydC0+c2VyaWFsLT5kZXYsIApAQCAtMzIzLDEzICszMTYsMTMgQEAKIAkJCQkJICAwLAogCQkJCQkgIEtPQklMX1RJTUVPVVQKIAkJCSk7Ci0JCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgcmVzZXRfYWxsX3F1ZXVlcyBVUkIgcmV0dXJuczogJWkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZXNldF9hbGxfcXVldWVzIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJfQogCWlmIChwcml2LT5kZXZpY2VfdHlwZSA9PSBLT0JJTF9VU0JUV0lOX1BST0RVQ1RfSUQgfHwgcHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfQURBUFRFUl9CX1BST0RVQ1RfSUQgfHwKIAkgICAgcHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfS0FBTl9TSU1fUFJPRFVDVF9JRCkgewogCQkvLyBzdGFydCByZWFkaW5nIChBZGFwdGVyIEIgJ2NhdXNlIFBOUCBzdHJpbmcpCiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKCBwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDICApOyAKLQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZWFkIFVSQiByZXR1cm5zOiAlaSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOworCQlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHJlYWQgVVJCIHJldHVybnM6ICVpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgcmVzdWx0KTsKIAl9CiAKIAlrZnJlZSh0cmFuc2Zlcl9idWZmZXIpOwpAQCAtMzM5LDcgKzMzMiw3IEBACiAKIHN0YXRpYyB2b2lkIGtvYmlsX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHBvcnQtPndyaXRlX3VyYikgewogCQl1c2Jfa2lsbF91cmIocG9ydC0+d3JpdGVfdXJiKTsKQEAgLTM1OSwxMSArMzUyLDExIEBACiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogLy8JY2hhciAqZGJnX2RhdGE7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gcG9ydCAlZCBSZWFkIGludCBzdGF0dXMgbm90IHplcm86ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHBvcnQtPm51bWJlciwgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzkzLDcgKzM4Niw3IEBACiAJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKLQlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHJlYWQgVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZWFkIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiB9CiAKIApAQCAtNDExLDIxICs0MDQsMjEgQEAKIAlzdHJ1Y3Qga29iaWxfcHJpdmF0ZSAqIHByaXY7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gcG9ydCAlZCB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgLSBwb3J0ICVkIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJaWYgKGNvdW50ID4gKEtPQklMX0JVRl9MRU5HVEggLSBwcml2LT5maWxsZWQpKSB7Ci0JCWRiZygiJXMgLSBwb3J0ICVkIEVycm9yOiB3cml0ZSByZXF1ZXN0IGJpZ2dlciB0aGFuIGJ1ZmZlciBzaXplIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQlkYmcoIiVzIC0gcG9ydCAlZCBFcnJvcjogd3JpdGUgcmVxdWVzdCBiaWdnZXIgdGhhbiBidWZmZXIgc2l6ZSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAkvLyBDb3B5IGRhdGEgdG8gYnVmZmVyCiAJbWVtY3B5IChwcml2LT5idWYgKyBwcml2LT5maWxsZWQsIGJ1ZiwgY291bnQpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBwcml2LT5idWYgKyBwcml2LT5maWxsZWQpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCBwcml2LT5idWYgKyBwcml2LT5maWxsZWQpOwogCiAJcHJpdi0+ZmlsbGVkID0gcHJpdi0+ZmlsbGVkICsgY291bnQ7CiAKQEAgLTQ1Nyw3ICs0NTAsNyBAQAogCiAJCQlwcml2LT5jdXJfcG9zID0gcHJpdi0+Y3VyX3BvcyArIGxlbmd0aDsKIAkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKCBwb3J0LT53cml0ZV91cmIsIEdGUF9OT0lPICk7Ci0JCQlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHdyaXRlIFVSQiByZXR1cm5zOiAlaSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOworCQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCB3cml0ZSBVUkIgcmV0dXJuczogJWkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOwogCQkJdG9kbyA9IHByaXYtPmZpbGxlZCAtIHByaXYtPmN1cl9wb3M7CiAKIAkJCWlmICh0b2RvID4gMCkgewpAQCAtNDc4LDcgKzQ3MSw3IEBACiAJCQlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJCQogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoIHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9OT0lPICk7IAotCQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZWFkIFVSQiByZXR1cm5zOiAlaSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOworCQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZWFkIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJCX0KIAl9CiAJcmV0dXJuIGNvdW50OwpAQCAtNDg3LDcgKzQ4MCw3IEBACiAKIHN0YXRpYyBpbnQga29iaWxfd3JpdGVfcm9vbSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQkvL2RiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCS8vZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAlyZXR1cm4gODsKIH0KIApAQCAtNTIyLDE2ICs1MTUsMTMgQEAKIAkJCQkgIEtPQklMX1RJTUVPVVQpOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCBnZXRfc3RhdHVzX2xpbmVfc3RhdGUgVVJCIHJldHVybnM6ICVpLiBTdGF0dXNsaW5lOiAlMDJ4IiwgCi0JICAgIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCByZXN1bHQsIHRyYW5zZmVyX2J1ZmZlclswXSk7CisJICAgIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCwgdHJhbnNmZXJfYnVmZmVyWzBdKTsKIAotCWlmICgodHJhbnNmZXJfYnVmZmVyWzBdICYgU1VTQkNSX0dTTF9EU1IpICE9IDApIHsKLQkJcHJpdi0+bGluZV9zdGF0ZSB8PSBUSU9DTV9EU1I7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+bGluZV9zdGF0ZSAmPSB+VElPQ01fRFNSOyAKLQl9Ci0KKwlyZXN1bHQgPSAwOworCWlmICgodHJhbnNmZXJfYnVmZmVyWzBdICYgU1VTQkNSX0dTTF9EU1IpICE9IDApCisJCXJlc3VsdCA9IFRJT0NNX0RTUjsKIAlrZnJlZSh0cmFuc2Zlcl9idWZmZXIpOwotCXJldHVybiBwcml2LT5saW5lX3N0YXRlOworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQgIGtvYmlsX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNTQ0LDYgKzUzNCw3IEBACiAJdW5zaWduZWQgY2hhciAqdHJhbnNmZXJfYnVmZmVyOwogCWludCB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gODsKIAorCS8qIEZJWE1FOiBsb2NraW5nID8gKi8KIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmICgocHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfVVNCVFdJTl9QUk9EVUNUX0lEKSB8fCAocHJpdi0+ZGV2aWNlX3R5cGUgPT0gS09CSUxfS0FBTl9TSU1fUFJPRFVDVF9JRCkpIHsKIAkJLy8gVGhpcyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGlvY3RsIGNhbGxzCkBAIC01NjcsOSArNTU4LDkgQEAKIAogCWlmIChwcml2LT5kZXZpY2VfdHlwZSA9PSBLT0JJTF9BREFQVEVSX0JfUFJPRFVDVF9JRCkgewogCQlpZiAoZHRyICE9IDApCi0JCQlkYmcoIiVzIC0gcG9ydCAlZCBTZXR0aW5nIERUUiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSBwb3J0ICVkIFNldHRpbmcgRFRSIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCWVsc2UKLQkJCWRiZygiJXMgLSBwb3J0ICVkIENsZWFyaW5nIERUUiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSBwb3J0ICVkIENsZWFyaW5nIERUUiIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coIHBvcnQtPnNlcmlhbC0+ZGV2LCAKIAkJCQkJICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDAgKSwgCiAJCQkJCSAgU1VTQkNSZXF1ZXN0X1NldFN0YXR1c0xpbmVzT3JRdWV1ZXMsCkBAIC01ODEsOSArNTcyLDkgQEAKIAkJCQkJICBLT0JJTF9USU1FT1VUKTsKIAl9IGVsc2UgewogCQlpZiAocnRzICE9IDApCi0JCQlkYmcoIiVzIC0gcG9ydCAlZCBTZXR0aW5nIFJUUyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSBwb3J0ICVkIFNldHRpbmcgUlRTIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCWVsc2UKLQkJCWRiZygiJXMgLSBwb3J0ICVkIENsZWFyaW5nIFJUUyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSBwb3J0ICVkIENsZWFyaW5nIFJUUyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coIHBvcnQtPnNlcmlhbC0+ZGV2LCAKIAkJCQkJICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDAgKSwgCiAJCQkJCSAgU1VTQkNSZXF1ZXN0X1NldFN0YXR1c0xpbmVzT3JRdWV1ZXMsCkBAIC01OTQsNyArNTg1LDcgQEAKIAkJCQkJICAwLAogCQkJCQkgIEtPQklMX1RJTUVPVVQpOwogCX0KLQlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHNldF9zdGF0dXNfbGluZSBVUkIgcmV0dXJuczogJWkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwlkYmcoIiVzIC0gcG9ydCAlZCBTZW5kIHNldF9zdGF0dXNfbGluZSBVUkIgcmV0dXJuczogJWkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCByZXN1bHQpOwogCWtmcmVlKHRyYW5zZmVyX2J1ZmZlcik7CiAJcmV0dXJuIChyZXN1bHQgPCAwKSA/IHJlc3VsdCA6IDA7CiB9CkBAIC02ODcsNyArNjc4LDcgQEAKIAkJCQkJICBLT0JJTF9USU1FT1VUCiAJCQkpOwogCQkKLQkJZGJnKCIlcyAtIHBvcnQgJWQgU2VuZCByZXNldF9hbGxfcXVldWVzIChGTFVTSCkgVVJCIHJldHVybnM6ICVpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJCWRiZygiJXMgLSBwb3J0ICVkIFNlbmQgcmVzZXRfYWxsX3F1ZXVlcyAoRkxVU0gpIFVSQiByZXR1cm5zOiAlaSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CiAJCWtmcmVlKHRyYW5zZmVyX2J1ZmZlcik7CiAJCXJldHVybiAocmVzdWx0IDwgMCkgPyAtRUZBVUxUIDogMDsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuYwppbmRleCBmYzFjZWE0Li41ZmMyY2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuYwpAQCAtMTQzLDkgKzE0Myw2IEBACiAJLmRlc2NyaXB0aW9uID0JICAgICAiTUNUIFUyMzIiLAogCS51c2JfZHJpdmVyID0gCSAgICAgJm1jdF91MjMyX2RyaXZlciwKIAkuaWRfdGFibGUgPQkgICAgIGlkX3RhYmxlX2NvbWJpbmVkLAotCS5udW1faW50ZXJydXB0X2luID0gIDIsCi0JLm51bV9idWxrX2luID0JICAgICAwLAotCS5udW1fYnVsa19vdXQgPQkgICAgIDEsCiAJLm51bV9wb3J0cyA9CSAgICAgMSwKIAkub3BlbiA9CQkgICAgIG1jdF91MjMyX29wZW4sCiAJLmNsb3NlID0JICAgICBtY3RfdTIzMl9jbG9zZSwKQEAgLTQwMiw3ICszOTksNyBAQAogCXN0cnVjdCBtY3RfdTIzMl9wcml2YXRlICpwcml2OwogCWludCBpOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJLyogTXkgc3BlY2lhbCBpdGVtcywgdGhlIHN0YW5kYXJkIHJvdXRpbmVzIGZyZWUgbXkgdXJicyAqLwpAQCAtNDI0LDcgKzQyMSw3IEBACiAJdW5zaWduZWQgY2hhciBsYXN0X2xjcjsKIAl1bnNpZ25lZCBjaGFyIGxhc3RfbXNyOwogCi0JZGJnKCIlcyBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogQ29tcGVuc2F0ZSBmb3IgYSBoYXJkd2FyZSBidWc6IGFsdGhvdWdoIHRoZSBTaXRlY29tIFUyMzItUDI1CiAJICogZGV2aWNlIHJlcG9ydHMgYSBtYXhpbXVtIG91dHB1dCBwYWNrZXQgc2l6ZSBvZiAzMiBieXRlcywKQEAgLTQ4OSw3ICs0ODYsNyBAQAogCXVuc2lnbmVkIGludCBjX2NmbGFnOwogCXVuc2lnbmVkIGludCBjb250cm9sX3N0YXRlOwogCXN0cnVjdCBtY3RfdTIzMl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCWRiZygiJXMgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogICAgCWlmIChwb3J0LT50dHkpIHsKIAkJY19jZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKQEAgLTUxNyw3ICs1MTQsNyBAQAogCiBzdGF0aWMgdm9pZCBtY3RfdTIzMl9yZWFkX2ludF9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBtY3RfdTIzMl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKQEAgLTUzNSwyMSArNTMyLDIxIEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoIXNlcmlhbCkgewotCQlkYmcoIiVzIC0gYmFkIHNlcmlhbCBwb2ludGVyLCBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGJhZCBzZXJpYWwgcG9pbnRlciwgZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAotICAgICAgICBkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKyAgICAgICAgZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJLyoKIAkgKiBXb3JrLWEtcm91bmQ6IGhhbmRsZSB0aGUgJ3VzdWFsJyBidWxrLWluIHBpcGUgaGVyZQpAQCAtNjA2LDcgKzYwMyw3IEBACiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJICAgICBfX2Z1bmNfXywgcmV0dmFsKTsKIH0gLyogbWN0X3UyMzJfcmVhZF9pbnRfY2FsbGJhY2sgKi8KIAogc3RhdGljIHZvaWQgbWN0X3UyMzJfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCkBAIC02MzYsNyArNjMzLDcgQEAKIAogICAgICAgICAvKiByZWFzc2VydCBEVFIgYW5kIFJUUyBvbiB0cmFuc2l0aW9uIGZyb20gQjAgKi8KIAlpZiAoKG9sZF9jZmxhZyAmIENCQVVEKSA9PSBCMCkgewotCQlkYmcoIiVzOiBiYXVkIHdhcyBCMCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXM6IGJhdWQgd2FzIEIwIiwgX19mdW5jX18pOwogCQljb250cm9sX3N0YXRlIHw9IFRJT0NNX0RUUiB8IFRJT0NNX1JUUzsKIAkJbWN0X3UyMzJfc2V0X21vZGVtX2N0cmwoc2VyaWFsLCBjb250cm9sX3N0YXRlKTsKIAl9CkBAIC02NDQsNyArNjQxLDcgQEAKIAltY3RfdTIzMl9zZXRfYmF1ZF9yYXRlKHNlcmlhbCwgcG9ydCwgdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KSk7CiAKIAlpZiAoKGNmbGFnICYgQ0JBVUQpID09IEIwICkgewotCQlkYmcoIiVzOiBiYXVkIGlzIEIwIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczogYmF1ZCBpcyBCMCIsIF9fZnVuY19fKTsKIAkJLyogRHJvcCBSVFMgYW5kIERUUiAqLwogCQljb250cm9sX3N0YXRlICY9IH4oVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKICAgICAgICAJCW1jdF91MjMyX3NldF9tb2RlbV9jdHJsKHNlcmlhbCwgY29udHJvbF9zdGF0ZSk7CkBAIC02OTksNyArNjk2LDcgQEAKIAl1bnNpZ25lZCBjaGFyIGxjcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlc3N0YXRlPSVkIiwgX19GVU5DVElPTl9fLCBicmVha19zdGF0ZSk7CisJZGJnKCIlc3N0YXRlPSVkIiwgX19mdW5jX18sIGJyZWFrX3N0YXRlKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJbGNyID0gcHJpdi0+bGFzdF9sY3I7CkBAIC03MTgsNyArNzE1LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29udHJvbF9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWNvbnRyb2xfc3RhdGUgPSBwcml2LT5jb250cm9sX3N0YXRlOwpAQCAtNzM1LDcgKzczMiw3IEBACiAJdW5zaWduZWQgaW50IGNvbnRyb2xfc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAljb250cm9sX3N0YXRlID0gcHJpdi0+Y29udHJvbF9zdGF0ZTsKQEAgLTc1Nyw3ICs3NTQsNyBAQAogc3RhdGljIGludCBtY3RfdTIzMl9pb2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZGJnKCIlc2NtZD0weCV4IiwgX19GVU5DVElPTl9fLCBjbWQpOworCWRiZygiJXNjbWQ9MHgleCIsIF9fZnVuY19fLCBjbWQpOwogCiAJLyogQmFzZWQgb24gY29kZSBmcm9tIGFjbS5jIGFuZCBvdGhlcnMgKi8KIAlzd2l0Y2ggKGNtZCkgewpAQCAtNzcyLDcgKzc2OSw3IEBACiAJCXJldHVybiAwOwogCiAJZGVmYXVsdDoKLQkJZGJnKCIlczogYXJnIG5vdCBzdXBwb3J0ZWQgLSAweCUwNHgiLCBfX0ZVTkNUSU9OX18sY21kKTsKKwkJZGJnKCIlczogYXJnIG5vdCBzdXBwb3J0ZWQgLSAweCUwNHgiLCBfX2Z1bmNfXyxjbWQpOwogCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzg3LDcgKzc4NCw3IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CkBAIC04MDksNyArODA2LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29udHJvbF9zdGF0ZTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKaW5kZXggNDBmM2EwMS4uNTBmMWZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCkBAIC0xMTgsMTEgKzExOCwxMSBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xODMsNyArMTgzLDcgQEAKIAlpZiAocmVzdWx0KQogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAogCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCV9fZnVuY19fLCByZXN1bHQpOwogCXJldHVybjsKIH0KIApAQCAtMjE0LDcgKzIxNCw3IEBACiAKIAlwb3J0ID0gbW9zNzcyMF9wb3J0LT5wb3J0OwogCi0JZGJnKCJFbnRlcmluZy4uLiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIkVudGVyaW5nLi4uJXMiLCBfX2Z1bmNfXyk7CiAKIAlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKQEAgLTM2Miw3ICszNjIsNyBAQAogCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAogCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKLQkJCWVycigiJXMtb3V0IG9mIG1lbW9yeSBmb3IgdXJiIGJ1ZmZlcnMuIiwgX19GVU5DVElPTl9fKTsKKwkJCWVycigiJXMtb3V0IG9mIG1lbW9yeSBmb3IgdXJiIGJ1ZmZlcnMuIiwgX19mdW5jX18pOwogCQkJdXNiX2ZyZWVfdXJiKG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0pOwogCQkJbW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSA9IE5VTEw7CiAJCQljb250aW51ZTsKQEAgLTQ3OSw3ICs0NzksNyBAQAogCQlpZiAocmVzcG9uc2UpCiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3BvbnNlKTsKKwkJCQlfX2Z1bmNfXywgcmVzcG9uc2UpOwogCX0KIAogCS8qIHNldCB1cCBvdXIgYnVsayBpbiB1cmIgKi8KQEAgLTQ5Miw3ICs0OTIsNyBAQAogCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXNwb25zZSkKIAkJZGV2X2VycigmcG9ydC0+ZGV2LAotCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyByZWFkIHVyYlxuIiwgX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisJCQkiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIHJlYWQgdXJiXG4iLCBfX2Z1bmNfXywgcmVzcG9uc2UpOwogCiAJLyogaW5pdGlhbGl6ZSBvdXIgaWNvdW50IHN0cnVjdHVyZSAqLwogCW1lbXNldCgmKG1vczc3MjBfcG9ydC0+aWNvdW50KSwgMHgwMCwgc2l6ZW9mKG1vczc3MjBfcG9ydC0+aWNvdW50KSk7CkBAIC01MjEsMTEgKzUyMSwxMSBAQAogCWludCBjaGFycyA9IDA7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0OwogCi0JZGJnKCIlczplbnRlcmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczplbnRlcmluZyAuLi4uLi4uLi4uLiIsIF9fZnVuY19fKTsKIAogCW1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpIHsKLQkJZGJnKCIlczpsZWF2aW5nIC4uLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlczpsZWF2aW5nIC4uLi4uLi4uLi4uIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTUzMyw3ICs1MzMsNyBAQAogCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXSAmJiBtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQogCQkJY2hhcnMgKz0gVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFOwogCX0KLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIGNoYXJzKTsKIAlyZXR1cm4gY2hhcnM7CiB9CiAKQEAgLTU4NSw3ICs1ODUsNyBAQAogCW11dGV4X3VubG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKIAltb3M3NzIwX3BvcnQtPm9wZW4gPSAwOwogCi0JZGJnKCJMZWF2aW5nICVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIkxlYXZpbmcgJXMiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1vczc3MjBfYnJlYWsoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQpAQCAtNTk0LDcgKzU5NCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKIAlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CiAKLQlkYmcoIkVudGVyaW5nICVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIkVudGVyaW5nICVzIiwgX19mdW5jX18pOwogCiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCkBAIC02MjcsMjAgKzYyNywyMSBAQAogCWludCByb29tID0gMDsKIAlpbnQgaTsKIAotCWRiZygiJXM6ZW50ZXJpbmcgLi4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXM6ZW50ZXJpbmcgLi4uLi4uLi4uLi4iLCBfX2Z1bmNfXyk7CiAKIAltb3M3NzIwX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKSB7Ci0JCWRiZygiJXM6bGVhdmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXM6bGVhdmluZyAuLi4uLi4uLi4uLiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJLyogRklYTUU6IExvY2tpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1VSQlM7ICsraSkgewogCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXSAmJiBtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQogCQkJcm9vbSArPSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkU7CiAJfQogCi0JZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJvb20pOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIHJvb20pOwogCXJldHVybiByb29tOwogfQogCkBAIC02NTcsNyArNjU4LDcgQEAKIAlzdHJ1Y3QgdXJiICAgICp1cmI7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqY3VycmVudF9wb3NpdGlvbiA9IGRhdGE7CiAKLQlkYmcoIiVzOmVudGVyaW5nIC4uLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOmVudGVyaW5nIC4uLi4uLi4uLi4uIiwgX19mdW5jX18pOwogCiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCkBAIC02NzksNyArNjgwLDcgQEAKIAl9CiAKIAlpZiAodXJiID09IE5VTEwpIHsKLQkJZGJnKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC02ODcsMTQgKzY4OCwxNCBAQAogCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAogCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQllcnIoIiVzIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLiIsIF9fZnVuY19fKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCX0KIAl0cmFuc2Zlcl9zaXplID0gbWluIChjb3VudCwgVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFKTsKIAogCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgY3VycmVudF9wb3NpdGlvbiwgdHJhbnNmZXJfc2l6ZSk7Ci0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHRyYW5zZmVyX3NpemUsCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdHJhbnNmZXJfc2l6ZSwKIAkJCSAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCS8qIGZpbGwgdXJiIHdpdGggZGF0YSBhbmQgc3VibWl0ICAqLwpAQCAtNzA4LDcgKzcwOSw3IEBACiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlieXRlc19zZW50ID0gc3RhdHVzOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNzI0LDcgKzcyNSw3IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcy0gcG9ydCAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMtIHBvcnQgJWRcbiIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC03MzYsMTEgKzczNywxMSBAQAogCQlyZXR1cm47CiAJfQogCi0JZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fZnVuY19fKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gbm8gdHR5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyB0dHkgYXZhaWxhYmxlIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC03NzMsMTUgKzc3NCwxNSBAQAogCQlyZXR1cm47CiAKIAlpZiAoIW1vczc3MjBfcG9ydC0+b3BlbikgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAotCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX2Z1bmNfXyk7CiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKCF0dHkpIHsKLQkJZGJnKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gbm8gdHR5IGF2YWlsYWJsZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTIyLDcgKzkyMyw3IEBACiAJX191MTYgcm91bmQ7CiAKIAotCWRiZygiJXMgLSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZHJhdGUpOworCWRiZygiJXMgLSAlZCIsIF9fZnVuY19fLCBiYXVkcmF0ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkaXZpc29yX3RhYmxlKTsgaSsrKSB7CiAJCWlmIChkaXZpc29yX3RhYmxlW2ldLmJhdWRyYXRlID09IGJhdWRyYXRlKSB7CkBAIC05NzMsMTUgKzk3NCwxNSBAQAogCXBvcnQgPSBtb3M3NzIwX3BvcnQtPnBvcnQ7CiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCi0JZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fZnVuY19fKTsKIAogCW51bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7Ci0JZGJnKCIlcyAtIHBvcnQgPSAlZCwgYmF1ZCA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGJhdWRyYXRlKTsKKwlkYmcoIiVzIC0gcG9ydCA9ICVkLCBiYXVkID0gJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBiYXVkcmF0ZSk7CiAKICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBEaXZpc29yICovCiAJc3RhdHVzID0gY2FsY19iYXVkX3JhdGVfZGl2aXNvcihiYXVkcmF0ZSwgJmRpdmlzb3IpOwogCWlmIChzdGF0dXMpIHsKLQkJZXJyKCIlcyAtIGJhZCBiYXVkIHJhdGUiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gYmFkIGJhdWQgcmF0ZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTEwMzQsMTYgKzEwMzUsMTYgQEAKIAlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghbW9zNzcyMF9wb3J0LT5vcGVuKSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJdHR5ID0gbW9zNzcyMF9wb3J0LT5wb3J0LT50dHk7CiAKLQlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19mdW5jX18pOwogCiAJbERhdGEgPSBVQVJUX0xDUl9XTEVOODsKIAlsU3RvcCA9IDB4MDA7CS8qIDEgc3RvcCBiaXQgKi8KQEAgLTEwNzgsMTQgKzEwNzksMTQgQEAKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJaWYgKGNmbGFnICYgUEFST0REKSB7CiAJCQlsUGFyaXR5ID0gVUFSVF9MQ1JfUEFSSVRZOwotCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gb2RkIiwgX19mdW5jX18pOwogCQl9IGVsc2UgewogCQkJbFBhcml0eSA9IChVQVJUX0xDUl9FUEFSIHwgVUFSVF9MQ1JfUEFSSVRZKTsKLQkJCWRiZygiJXMgLSBwYXJpdHkgPSBldmVuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwYXJpdHkgPSBldmVuIiwgX19mdW5jX18pOwogCQl9CiAKIAl9IGVsc2UgewotCQlkYmcoIiVzIC0gcGFyaXR5ID0gbm9uZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19mdW5jX18pOwogCX0KIAogCWlmIChjZmxhZyAmIENNU1BBUikKQEAgLTEwOTQsMTAgKzEwOTUsMTAgQEAKIAkvKiBDaGFuZ2UgdGhlIFN0b3AgYml0ICovCiAJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCWxTdG9wID0gVUFSVF9MQ1JfU1RPUDsKLQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewogCQlsU3RvcCA9IDB4MDA7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJfQogCiAjZGVmaW5lIExDUl9CSVRTX01BU0sJCTB4MDMJLyogTWFzayBmb3IgYml0cy9jaGFyIGZpZWxkICovCkBAIC0xMTcxLDcgKzExNzIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBiYXVkKTsKKwlkYmcoIiVzIC0gYmF1ZCByYXRlID0gJWQiLCBfX2Z1bmNfXywgYmF1ZCk7CiAJc3RhdHVzID0gc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlKG1vczc3MjBfcG9ydCwgYmF1ZCk7CiAJLyogRklYTUU6IG5lZWRzIHRvIHdyaXRlIGFjdHVhbCByZXN1bHRpbmcgYmF1ZCBiYWNrIG5vdCBqdXN0CiAJICAgYmxpbmRseSBkbyBzbyAqLwpAQCAtMTIxNyw3ICsxMjE4LDcgQEAKIAogCiAJaWYgKCFtb3M3NzIwX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyMjUsMTUgKzEyMjYsMTUgQEAKIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCi0JZGJnKCIlcyAtIGNmbGFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywKKwlkYmcoIiVzIC0gY2ZsYWcgJTA4eCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZywKIAkgICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSk7CiAKLQlkYmcoIiVzIC0gb2xkIGNmbGFnICUwOHggb2xkIGlmbGFnICUwOHgiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlcyAtIG9sZCBjZmxhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIG9sZF90ZXJtaW9zLT5jX2NmbGFnLAogCSAgICBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIGNoYW5nZSB0aGUgcG9ydCBzZXR0aW5ncyB0byB0aGUgbmV3IG9uZXMgc3BlY2lmaWVkICovCiAJY2hhbmdlX3BvcnRfc2V0dGluZ3MobW9zNzcyMF9wb3J0LCBvbGRfdGVybWlvcyk7CkBAIC0xMjcxLDcgKzEyNzIsNyBAQAogCiAJY291bnQgPSBtb3M3NzIwX2NoYXJzX2luX2J1ZmZlcihtb3M3NzIwX3BvcnQtPnBvcnQpOwogCWlmIChjb3VudCA9PSAwKSB7Ci0JCWRiZygiJXMgLS0gRW1wdHkiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0tIEVtcHR5IiwgX19mdW5jX18pOwogCQlyZXN1bHQgPSBUSU9DU0VSX1RFTVQ7CiAJfQogCkBAIC0xMjk2LDcgKzEyOTcsNyBAQAogCiAJcmVzdWx0ID0gdHR5LT5yZWFkX2NudDsKIAotCWRiZygiJXMoJWQpID0gJWQiLCBfX0ZVTkNUSU9OX18sICBtb3M3NzIwX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwlkYmcoIiVzKCVkKSA9ICVkIiwgX19mdW5jX18sICBtb3M3NzIwX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKIAlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCkBAIC0xMzc0LDcgKzEzNzUsNyBAQAogCQkgIHwgKChtc3IgJiBVQVJUX01TUl9EU1IpCT8gVElPQ01fRFNSOiAwKTsgIC8qIDB4MTAwICovCiAKIAotCWRiZygiJXMgLS0gJXgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcyAtLSAleCIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE0MTgsNDUgKzE0MTksNDUgQEAKIAlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCA9IDB4JXgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVElPQ0lOUToKIAkJLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KLQkJZGJnKCIlcyAoJWQpIFRJT0NJTlEiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQlkYmcoIiVzICglZCkgVElPQ0lOUSIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIGdldF9udW1iZXJfYnl0ZXNfYXZhaWwobW9zNzcyMF9wb3J0LAogCQkJCQkgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBUSU9DU0VSR0VUTFNSOgotCQlkYmcoIiVzICglZCkgVElPQ1NFUkdFVExTUiIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DU0VSR0VUTFNSIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gZ2V0X2xzcl9pbmZvKG1vczc3MjBfcG9ydCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgVElPQ01CSVM6CiAJY2FzZSBUSU9DTUJJQzoKIAljYXNlIFRJT0NNU0VUOgotCQlkYmcoIiVzICglZCkgVElPQ01TRVQvVElPQ01CSUMvVElPQ01TRVQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgKCVkKSBUSU9DTVNFVC9USU9DTUJJQy9USU9DTVNFVCIsIF9fZnVuY19fLAogCQkgICAgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIHNldF9tb2RlbV9pbmZvKG1vczc3MjBfcG9ydCwgY21kLAogCQkJCSAgICAgICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKTsKIAogCWNhc2UgVElPQ01HRVQ6Ci0JCWRiZygiJXMgKCVkKSBUSU9DTUdFVCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DTUdFVCIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIGdldF9tb2RlbV9pbmZvKG1vczc3MjBfcG9ydCwKIAkJCQkgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CiAKIAljYXNlIFRJT0NHU0VSSUFMOgotCQlkYmcoIiVzICglZCkgVElPQ0dTRVJJQUwiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQlkYmcoIiVzICglZCkgVElPQ0dTRVJJQUwiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCXJldHVybiBnZXRfc2VyaWFsX2luZm8obW9zNzcyMF9wb3J0LAogCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopYXJnKTsKIAogCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fZnVuY19fLCAgcG9ydC0+bnVtYmVyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFRJT0NNSVdBSVQ6Ci0JCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAoJWQpIFRJT0NNSVdBSVQiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCWNwcmV2ID0gbW9zNzcyMF9wb3J0LT5pY291bnQ7CiAJCXdoaWxlICgxKSB7CiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCkBAIC0xNDkwLDcgKzE0OTEsNyBAQAogCQlpY291bnQuYnJrID0gY25vdy5icms7CiAJCWljb3VudC5idWZfb3ZlcnJ1biA9IGNub3cuYnVmX292ZXJydW47CiAKLQkJZGJnKCIlcyAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fZnVuY19fLAogCQkgICAgcG9ydC0+bnVtYmVyLCBpY291bnQucngsIGljb3VudC50eCApOwogCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xNTA4LDcgKzE1MDksNyBAQAogCWludCBpOwogCWNoYXIgZGF0YTsKIAotCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoIXNlcmlhbCkgewogCQlkYmcoIkludmFsaWQgSGFuZGxlciIpOwpAQCAtMTUyMCw3ICsxNTIxLDcgQEAKIAkvKiBjcmVhdGUgb3VyIHByaXZhdGUgc2VyaWFsIHN0cnVjdHVyZSAqLwogCW1vczc3MjBfc2VyaWFsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1vc2NoaXBfc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1vczc3MjBfc2VyaWFsID09IE5VTEwpIHsKLQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNTMzLDcgKzE1MzQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCW1vczc3MjBfcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtb3NjaGlwX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKSB7Ci0JCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKIAkJCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCBOVUxMKTsKIAkJCWtmcmVlKG1vczc3MjBfc2VyaWFsKTsKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTU5Niw5ICsxNTk3LDYgQEAKIAkuZGVzY3JpcHRpb24JCT0gIk1vc2NoaXAgMiBwb3J0IGFkYXB0ZXIiLAogCS51c2JfZHJpdmVyCQk9ICZ1c2JfZHJpdmVyLAogCS5pZF90YWJsZQkJPSBtb3NjaGlwX3BvcnRfaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSAxLAotCS5udW1fYnVsa19pbgkJPSAyLAotCS5udW1fYnVsa19vdXQJCT0gMiwKIAkubnVtX3BvcnRzCQk9IDIsCiAJLm9wZW4JCQk9IG1vczc3MjBfb3BlbiwKIAkuY2xvc2UJCQk9IG1vczc3MjBfY2xvc2UsCkBAIC0xNjIwLDcgKzE2MTgsNyBAQAogewogCWludCByZXR2YWw7CiAKLQlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19mdW5jX18pOwogCiAJLyogUmVnaXN0ZXIgd2l0aCB0aGUgdXNiIHNlcmlhbCAqLwogCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJm1vc2NoaXA3NzIwXzJwb3J0X2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwppbmRleCBhZWViOWNiLi42YmNiODJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKQEAgLTQwMyw3ICs0MDMsNyBAQAogewogCXN0cnVjdCBhc3luY19pY291bnQgKmljb3VudDsKIAotCWRiZygiJXMgLSAlMDJ4IiwgX19GVU5DVElPTl9fLCBuZXdfbHNyKTsKKwlkYmcoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBuZXdfbHNyKTsKIAogCWlmIChuZXdfbHNyICYgU0VSSUFMX0xTUl9CSSkgewogCQkvLwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JbW9zNzg0MF9wb3J0ID0gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1cmItPmNvbnRleHQ7CisJbW9zNzg0MF9wb3J0ID0gdXJiLT5jb250ZXh0OwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CkBAIC00NTksMjEgKzQ1OSwyMSBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlkYmcoIiVzIHVyYiBidWZmZXIgc2l6ZSBpcyAlZFxuIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCWRiZygiJXMgbW9zNzg0MF9wb3J0LT5Nc3JMc3IgaXMgJWQgcG9ydCAlZFxuIiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgdXJiIGJ1ZmZlciBzaXplIGlzICVkXG4iLCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlkYmcoIiVzIG1vczc4NDBfcG9ydC0+TXNyTHNyIGlzICVkIHBvcnQgJWRcbiIsIF9fZnVuY19fLAogCSAgICBtb3M3ODQwX3BvcnQtPk1zckxzciwgbW9zNzg0MF9wb3J0LT5wb3J0X251bSk7CiAJZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXJlZ3ZhbCA9IChfX3U4KSBkYXRhWzBdOwotCWRiZygiJXMgZGF0YSBpcyAleFxuIiwgX19GVU5DVElPTl9fLCByZWd2YWwpOworCWRiZygiJXMgZGF0YSBpcyAleFxuIiwgX19mdW5jX18sIHJlZ3ZhbCk7CiAJaWYgKG1vczc4NDBfcG9ydC0+TXNyTHNyID09IDApCiAJCW1vczc4NDBfaGFuZGxlX25ld19tc3IobW9zNzg0MF9wb3J0LCByZWd2YWwpOwogCWVsc2UgaWYgKG1vczc4NDBfcG9ydC0+TXNyTHNyID09IDEpCkBAIC00ODcsNyArNDg3LDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGludGVycnVwdCB1cmJcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAl9CiB9CiAKQEAgLTU0MiwxMSArNTQyLDExIEBACiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fZnVuY19fLAogCQkgICAgc3RhdHVzKTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6Ci0JCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLAogCQkgICAgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTU1NCw3ICs1NTQsNyBAQAogCWxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKLQlzZXJpYWwgPSAoc3RydWN0IHVzYl9zZXJpYWwgKil1cmItPmNvbnRleHQ7CisJc2VyaWFsID0gdXJiLT5jb250ZXh0OwogCiAJLyogTW9zY2hpcCBnZXQgNSBieXRlcwogCSAqIEJ5dGUgMSBJSVIgUG9ydCAxIChwb3J0Lm51bWJlciBpcyAwKQpAQCAtNjE0LDcgKzYxNCw3IEBACiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAogCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJfQogfQogCkBAIC02ODUsMTkgKzY4NSwxOSBAQAogCQlyZXR1cm47CiAJfQogCi0JbW9zNzg0MF9wb3J0ID0gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1cmItPmNvbnRleHQ7CisJbW9zNzg0MF9wb3J0ID0gdXJiLT5jb250ZXh0OwogCWlmICghbW9zNzg0MF9wb3J0KSB7CiAJCWRiZygiJXMiLCAiTlVMTCBtb3M3ODQwX3BvcnQgcG9pbnRlciBcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopbW9zNzg0MF9wb3J0LT5wb3J0OwotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXNlcmlhbCA9IG1vczc4NDBfZ2V0X3VzYl9zZXJpYWwocG9ydCwgX19GVU5DVElPTl9fKTsKKwlzZXJpYWwgPSBtb3M3ODQwX2dldF91c2Jfc2VyaWFsKHBvcnQsIF9fZnVuY19fKTsKIAlpZiAoIXNlcmlhbCkgewogCQlkYmcoIiVzXG4iLCAiQmFkIHNlcmlhbCBwb2ludGVyICIpOwogCQlyZXR1cm47CkBAIC03NTIsNyArNzUyLDcgQEAKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IGk7CiAKLQltb3M3ODQwX3BvcnQgPSAoc3RydWN0IG1vc2NoaXBfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwltb3M3ODQwX3BvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3Bpbl9sb2NrKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9VUkJTOyBpKyspIHsKIAkJaWYgKHVyYiA9PSBtb3M3ODQwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldKSB7CkBAIC03NjcsNyArNzY3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2sobW9zNzg0MF9wb3J0LT5wb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhtb3M3ODQwX3BvcnQtPnBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIlBvcnQgUGFyYW5vaWEgZmFpbGVkIFxuIik7CiAJCXJldHVybjsKIAl9CkBAIC04MTUsMTQgKzgxNSwxNCBAQAogCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKIAlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICpwb3J0MDsKIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCi0JaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHNlcmlhbCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3NlcmlhbF9wYXJhbm9pYV9jaGVjayhzZXJpYWwsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIlNlcmlhbCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtODUxLDcgKzg1MSw3IEBACiAJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKIAkJCXVzYl9mcmVlX3VyYih1cmIpOwogCQkJbW9zNzg0MF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSA9IE5VTEw7Ci0JCQllcnIoIiVzLW91dCBvZiBtZW1vcnkgZm9yIHVyYiBidWZmZXJzLiIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzLW91dCBvZiBtZW1vcnkgZm9yIHVyYiBidWZmZXJzLiIsIF9fZnVuY19fKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJfQpAQCAtMTAzOSw3ICsxMDM5LDcgQEAKIAkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAocmVzcG9uc2UpIHsKIAkJCQllcnIoIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwKLQkJCQkgICAgX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisJCQkJICAgIF9fZnVuY19fLCByZXNwb25zZSk7CiAJCQl9CiAKIAkJfQpAQCAtMTA3Miw3ICsxMDcyLDcgQEAKIAkgICAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpOwogCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3BvbnNlKSB7Ci0JCWVycigiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGNvbnRyb2wgdXJiIiwgX19GVU5DVElPTl9fLAorCQllcnIoIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYiIsIF9fZnVuY19fLAogCQkgICAgcmVzcG9uc2UpOwogCX0KIApAQCAtMTExNiw3ICsxMTE2LDcgQEAKIAogCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfY2hhcnNfaW5fYnVmZmVyOmVudGVyaW5nIC4uLi4uLi4uLi4uIik7CiAKLQlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jayxmbGFncyk7Ci0JZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIGNoYXJzKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCBjaGFycyk7CiAJcmV0dXJuIGNoYXJzOwogCiB9CkBAIC0xMTcxLDcgKzExNzEsNyBAQAogCQkvKiBObyBhY3Rpdml0eS4uIGNvdW50IGRvd24gc2VjdGlvbiAqLwogCQl3YWl0LS07CiAJCWlmICh3YWl0ID09IDApIHsKLQkJCWRiZygiJXMgLSBUSU1FT1VUIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBUSU1FT1VUIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9IGVsc2UgewogCQkJLyogUmVzZXQgdGltZW91dCB2YWx1ZSBiYWNrIHRvIHNlY29uZHMgKi8KQEAgLTExOTUsMTIgKzExOTUsMTIgQEAKIAogCWRiZygiJXNcbiIsICJtb3M3ODQwX2Nsb3NlOmVudGVyaW5nLi4uIik7CiAKLQlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIlBvcnQgUGFyYW5vaWEgZmFpbGVkIFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlzZXJpYWwgPSBtb3M3ODQwX2dldF91c2Jfc2VyaWFsKHBvcnQsIF9fRlVOQ1RJT05fXyk7CisJc2VyaWFsID0gbW9zNzg0MF9nZXRfdXNiX3NlcmlhbChwb3J0LCBfX2Z1bmNfXyk7CiAJaWYgKCFzZXJpYWwpIHsKIAkJZGJnKCIlcyIsICJTZXJpYWwgUGFyYW5vaWEgZmFpbGVkIFxuIik7CiAJCXJldHVybjsKQEAgLTEzMTQsNyArMTMxNCw3IEBACiAJCS8qIE5vIGFjdGl2aXR5Li4gY291bnQgZG93biBzZWN0aW9uICovCiAJCXdhaXQtLTsKIAkJaWYgKHdhaXQgPT0gMCkgewotCQkJZGJnKCIlcyAtIFRJTUVPVVQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIFRJTUVPVVQiLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0gZWxzZSB7CiAJCQkvKiBSZXNldCB0aW1lb3V0IHZhbHVlIGJhY2sgdG8gc2Vjb25kcyAqLwpAQCAtMTMzNywxMiArMTMzNywxMiBAQAogCWRiZygiJXMgXG4iLCAiRW50ZXJpbmcgLi4uLi4uLi4uLi4iKTsKIAlkYmcoIm1vczc4NDBfYnJlYWs6IFN0YXJ0XG4iKTsKIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXNlcmlhbCA9IG1vczc4NDBfZ2V0X3VzYl9zZXJpYWwocG9ydCwgX19GVU5DVElPTl9fKTsKKwlzZXJpYWwgPSBtb3M3ODQwX2dldF91c2Jfc2VyaWFsKHBvcnQsIF9fZnVuY19fKTsKIAlpZiAoIXNlcmlhbCkgewogCQlkYmcoIiVzIiwgIlNlcmlhbCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuOwpAQCAtMTM5Miw3ICsxMzkyLDcgQEAKIAogCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfd3JpdGVfcm9vbTplbnRlcmluZyAuLi4uLi4uLi4uLiIpOwogCi0JaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX2Z1bmNfXykpIHsKIAkJZGJnKCIlcyIsICJJbnZhbGlkIHBvcnQgXG4iKTsKIAkJZGJnKCIlcyBcbiIsICIgbW9zNzg0MF93cml0ZV9yb29tOmxlYXZpbmcgLi4uLi4uLi4uLi4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTQxMyw3ICsxNDEzLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jaywgZmxhZ3MpOwogCiAJcm9vbSA9IChyb29tID09IDApID8gMCA6IHJvb20gLSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUgKyAxOwotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIAogfQpAQCAtMTQ4MCwxMyArMTQ4MCwxMyBAQAogCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIExJTkVfQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CiAjZW5kaWYKIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKLQlpZiAobW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2soc2VyaWFsLCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHNlcmlhbCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiU2VyaWFsIFBhcmFub2lhIGZhaWxlZCBcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTUxMiw3ICsxNTEyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jaywgZmxhZ3MpOwogCiAJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCWRiZygiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTUyMSw3ICsxNTIxLDcgQEAKIAkJICAgIGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewotCQkJZXJyKCIlcyBubyBtb3JlIGtlcm5lbCBtZW1vcnkuLi4iLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyKCIlcyBubyBtb3JlIGtlcm5lbCBtZW1vcnkuLi4iLCBfX2Z1bmNfXyk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CkBAIC0xNTQ3LDcgKzE1NDcsNyBAQAogCWlmIChzdGF0dXMpIHsKIAkJbW9zNzg0MF9wb3J0LT5idXN5W2ldID0gMDsKIAkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIHN0YXR1cyA9ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlieXRlc19zZW50ID0gc3RhdHVzOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMTU3Myw3ICsxNTczLDcgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBzdGF0dXM7CiAKLQlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTU5NCw3ICsxNTk0LDcgQEAKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gbm8gdHR5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBubyB0dHkgYXZhaWxhYmxlIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNjM0LDcgKzE2MzQsNyBAQAogCWludCBzdGF0dXM7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwogCi0JaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX2Z1bmNfXykpIHsKIAkJZGJnKCIlcyIsICJJbnZhbGlkIHBvcnQgXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2NDMsNyArMTY0Myw3IEBACiAJCXJldHVybjsKIAogCWlmICghbW9zNzg0MF9wb3J0LT5vcGVuKSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNjUxLDcgKzE2NTEsNyBAQAogCiAJdHR5ID0gcG9ydC0+dHR5OwogCWlmICghdHR5KSB7Ci0JCWRiZygiJXMgLSBubyB0dHkgYXZhaWxhYmxlIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE2ODgsNyArMTY4OCw3IEBACiAJaW50IHN0YXR1cyA9IDA7CiAJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNzAzLDcgKzE3MDMsNyBAQAogCSAgICB8ICgobXNyICYgTU9TNzg0MF9NU1JfUkkpID8gVElPQ01fUkkgOiAwKQogCSAgICB8ICgobXNyICYgTU9TNzg0MF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApOwogCi0JZGJnKCIlcyAtIDB4JTA0WCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwlkYmcoIiVzIC0gMHglMDRYIiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTcxNSwxMyArMTcxNSwxNCBAQAogCXVuc2lnbmVkIGludCBtY3I7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUocG9ydCk7CiAKIAlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogRklYTUU6IFdoYXQgbG9ja3MgdGhlIHBvcnQgcmVnaXN0ZXJzID8gKi8KIAltY3IgPSBtb3M3ODQwX3BvcnQtPnNoYWRvd01DUjsKIAlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCiAJCW1jciAmPSB+TUNSX1JUUzsKQEAgLTE3NTgsNyArMTc1OSw3IEBACiAJCQkJCSAgX191MTYgKiBjbGtfc2VsX3ZhbCkKIHsKIAotCWRiZygiJXMgLSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZFJhdGUpOworCWRiZygiJXMgLSAlZCIsIF9fZnVuY19fLCBiYXVkUmF0ZSk7CiAKIAlpZiAoYmF1ZFJhdGUgPD0gMTE1MjAwKSB7CiAJCSpkaXZpc29yID0gMTE1MjAwIC8gYmF1ZFJhdGU7CkBAIC0xODQxLDEyICsxODQyLDEyIEBACiAJCXJldHVybiAtMTsKIAogCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKW1vczc4NDBfcG9ydC0+cG9ydDsKLQlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHBvcnQtPnNlcmlhbCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3NlcmlhbF9wYXJhbm9pYV9jaGVjayhwb3J0LT5zZXJpYWwsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIkludmFsaWQgU2VyaWFsIFxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xODU1LDcgKzE4NTYsNyBAQAogCiAJbnVtYmVyID0gbW9zNzg0MF9wb3J0LT5wb3J0LT5udW1iZXIgLSBtb3M3ODQwX3BvcnQtPnBvcnQtPnNlcmlhbC0+bWlub3I7CiAKLQlkYmcoIiVzIC0gcG9ydCA9ICVkLCBiYXVkID0gJWQiLCBfX0ZVTkNUSU9OX18sCisJZGJnKCIlcyAtIHBvcnQgPSAlZCwgYmF1ZCA9ICVkIiwgX19mdW5jX18sCiAJICAgIG1vczc4NDBfcG9ydC0+cG9ydC0+bnVtYmVyLCBiYXVkUmF0ZSk7CiAJLy9yZXNldCBjbGtfdWFydF9zZWwgaW4gc3ByZWdPZmZzZXQKIAlpZiAoYmF1ZFJhdGUgPiAxMTUyMDApIHsKQEAgLTE5MTUsNyArMTkxNiw3IEBACiAJCS8qIENhbGN1bGF0ZSB0aGUgRGl2aXNvciAqLwogCiAJCWlmIChzdGF0dXMpIHsKLQkJCWVycigiJXMgLSBiYWQgYmF1ZCByYXRlIiwgX19GVU5DVElPTl9fKTsKKwkJCWVycigiJXMgLSBiYWQgYmF1ZCByYXRlIiwgX19mdW5jX18pOwogCQkJZGJnKCIlc1xuIiwgImJhZCBiYXVkIHJhdGUiKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KQEAgLTE5NjksMjIgKzE5NzAsMjIgQEAKIAogCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKW1vczc4NDBfcG9ydC0+cG9ydDsKIAotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBwb3J0IFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2socG9ydC0+c2VyaWFsLCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHBvcnQtPnNlcmlhbCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBTZXJpYWwgXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBtb3M3ODQwX3BvcnQtPnBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgbW9zNzg0MF9wb3J0LT5wb3J0LT5udW1iZXIpOwogCiAJaWYgKCFtb3M3ODQwX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIwMjMsMTQgKzIwMjQsMTQgQEAKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJaWYgKGNmbGFnICYgUEFST0REKSB7CiAJCQlsUGFyaXR5ID0gTENSX1BBUl9PREQ7Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gb2RkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwYXJpdHkgPSBvZGQiLCBfX2Z1bmNfXyk7CiAJCX0gZWxzZSB7CiAJCQlsUGFyaXR5ID0gTENSX1BBUl9FVkVOOwotCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IGV2ZW4iLCBfX2Z1bmNfXyk7CiAJCX0KIAogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBhcml0eSA9IG5vbmUiLCBfX2Z1bmNfXyk7CiAJfQogCiAJaWYgKGNmbGFnICYgQ01TUEFSKSB7CkBAIC0yMDQwLDEwICsyMDQxLDEwIEBACiAJLyogQ2hhbmdlIHRoZSBTdG9wIGJpdCAqLwogCWlmIChjZmxhZyAmIENTVE9QQikgewogCQlsU3RvcCA9IExDUl9TVE9QXzI7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAyIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJbFN0b3AgPSBMQ1JfU1RPUF8xOwotCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxIiwgX19mdW5jX18pOwogCX0KIAogCS8qIFVwZGF0ZSB0aGUgTENSIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgKi8KQEAgLTIxMDAsNyArMjEwMSw3IEBACiAJCWJhdWQgPSA5NjAwOwogCX0KIAotCWRiZygiJXMgLSBiYXVkIHJhdGUgPSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZCk7CisJZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19mdW5jX18sIGJhdWQpOwogCXN0YXR1cyA9IG1vczc4NDBfc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlKG1vczc4NDBfcG9ydCwgYmF1ZCk7CiAKIAkvKiBFbmFibGUgSW50ZXJydXB0cyAqLwpAQCAtMjE0MCwxNCArMjE0MSwxNCBAQAogCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWRiZygibW9zNzg0MF9zZXRfdGVybWlvczogU1RBUlRcbiIpOwotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBwb3J0IFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAKLQlpZiAobW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2soc2VyaWFsLCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHNlcmlhbCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBTZXJpYWwgXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTIxNjAsNyArMjE2MSw3IEBACiAJdHR5ID0gcG9ydC0+dHR5OwogCiAJaWYgKCFtb3M3ODQwX3BvcnQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIxNjgsMTEgKzIxNjksMTEgQEAKIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCi0JZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywKKwlkYmcoIiVzIC0gY2xmYWcgJTA4eCBpZmxhZyAlMDh4IiwgX19mdW5jX18sCiAJICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZywgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSk7Ci0JZGJnKCIlcyAtIG9sZCBjbGZhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgLSBvbGQgY2xmYWcgJTA4eCBvbGQgaWZsYWcgJTA4eCIsIF9fZnVuY19fLAogCSAgICBvbGRfdGVybWlvcy0+Y19jZmxhZywgUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKTsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogY2hhbmdlIHRoZSBwb3J0IHNldHRpbmdzIHRvIHRoZSBuZXcgb25lcyBzcGVjaWZpZWQgKi8KIApAQCAtMjIxMyw3ICsyMjE0LDcgQEAKIAogCWNvdW50ID0gbW9zNzg0MF9jaGFyc19pbl9idWZmZXIobW9zNzg0MF9wb3J0LT5wb3J0KTsKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0tIEVtcHR5IiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtLSBFbXB0eSIsIF9fZnVuY19fKTsKIAkJcmVzdWx0ID0gVElPQ1NFUl9URU1UOwogCX0KIApAQCAtMjI0MCw3ICsyMjQxLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopbW9zNzg0MF9wb3J0LT5wb3J0OwotCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19mdW5jX18pKSB7CiAJCWRiZygiJXMiLCAiSW52YWxpZCBwb3J0IFxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yMzE0LDcgKzIzMTUsNyBAQAogCSAgICB8KChtc3IgJiBNT1M3ODQwX01TUl9SSSkgPyBUSU9DTV9SSSA6IDApCS8qIDB4MDgwICovCiAJICAgIHwoKG1zciAmIE1PUzc4NDBfTVNSX0RTUikgPyBUSU9DTV9EU1IgOiAwKTsJLyogMHgxMDAgKi8KIAotCWRiZygiJXMgLS0gJXgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcyAtLSAleCIsIF9fZnVuY19fLCByZXN1bHQpOwogCiAJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIzNzEsNyArMjM3Miw3IEBACiAJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50OwogCWludCBtb3NyZXQgPSAwOwogCi0JaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX2Z1bmNfXykpIHsKIAkJZGJnKCIlcyIsICJJbnZhbGlkIHBvcnQgXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTIzODMsMzkgKzIzODQsMzkgQEAKIAogCXR0eSA9IG1vczc4NDBfcG9ydC0+cG9ydC0+dHR5OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCA9IDB4JXgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCQkvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLwogCiAJY2FzZSBUSU9DU0VSR0VUTFNSOgotCQlkYmcoIiVzICglZCkgVElPQ1NFUkdFVExTUiIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJZGJnKCIlcyAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIG1vczc4NDBfZ2V0X2xzcl9pbmZvKG1vczc4NDBfcG9ydCwgYXJncCk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBUSU9DTUJJUzoKIAljYXNlIFRJT0NNQklDOgogCWNhc2UgVElPQ01TRVQ6Ci0JCWRiZygiJXMgKCVkKSBUSU9DTVNFVC9USU9DTUJJQy9USU9DTVNFVCIsIF9fRlVOQ1RJT05fXywKKwkJZGJnKCIlcyAoJWQpIFRJT0NNU0VUL1RJT0NNQklDL1RJT0NNU0VUIiwgX19mdW5jX18sCiAJCSAgICBwb3J0LT5udW1iZXIpOwogCQltb3NyZXQgPQogCQkgICAgbW9zNzg0MF9zZXRfbW9kZW1faW5mbyhtb3M3ODQwX3BvcnQsIGNtZCwgYXJncCk7CiAJCXJldHVybiBtb3NyZXQ7CiAKIAljYXNlIFRJT0NNR0VUOgotCQlkYmcoIiVzICglZCkgVElPQ01HRVQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DTUdFVCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlyZXR1cm4gbW9zNzg0MF9nZXRfbW9kZW1faW5mbyhtb3M3ODQwX3BvcnQsIGFyZ3ApOwogCiAJY2FzZSBUSU9DR1NFUklBTDoKLQkJZGJnKCIlcyAoJWQpIFRJT0NHU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQlkYmcoIiVzICglZCkgVElPQ0dTRVJJQUwiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJcmV0dXJuIG1vczc4NDBfZ2V0X3NlcmlhbF9pbmZvKG1vczc4NDBfcG9ydCwgYXJncCk7CiAKIAljYXNlIFRJT0NTU0VSSUFMOgotCQlkYmcoIiVzICglZCkgVElPQ1NTRVJJQUwiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQlicmVhazsKIAogCWNhc2UgVElPQ01JV0FJVDoKLQkJZGJnKCIlcyAoJWQpIFRJT0NNSVdBSVQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCWNwcmV2ID0gbW9zNzg0MF9wb3J0LT5pY291bnQ7CiAJCXdoaWxlICgxKSB7CiAJCQkvL2ludGVycnVwdGlibGVfc2xlZXBfb24oJm1vczc4NDBfcG9ydC0+ZGVsdGFfbXNyX3dhaXQpOwpAQCAtMjQ1OCw3ICsyNDU5LDcgQEAKIAkJaWNvdW50LmJyayA9IGNub3cuYnJrOwogCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOwogCi0JCWRiZygiJXMgKCVkKSBUSU9DR0lDT1VOVCBSWD0lZCwgVFg9JWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgKCVkKSBUSU9DR0lDT1VOVCBSWD0lZCwgVFg9JWQiLCBfX2Z1bmNfXywKIAkJICAgIHBvcnQtPm51bWJlciwgaWNvdW50LnJ4LCBpY291bnQudHgpOwogCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpY291bnQsIHNpemVvZihpY291bnQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMjUyMSw3ICsyNTIyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQltb3M3ODQwX3BvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9zY2hpcF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkgewotCQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX2Z1bmNfXyk7CiAJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJaS0tOyAvKiBkb24ndCBmb2xsb3cgTlVMTCBwb2ludGVyIGNsZWFuaW5nIHVwICovCiAJCQlnb3RvIGVycm9yOwpAQCAtMjc5OSwxMiArMjgwMCw3IEBACiAJLmRlc2NyaXB0aW9uID0gRFJJVkVSX0RFU0MsCiAJLnVzYl9kcml2ZXIgPSAmaW9fZHJpdmVyLAogCS5pZF90YWJsZSA9IG1vc2NoaXBfcG9ydF9pZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9IDEsCS8vTlVNX0RPTlRfQ0FSRSwvLzEsCi0jaWZkZWYgY2hlY2sKLQkubnVtX2J1bGtfaW4gPSA0LAotCS5udW1fYnVsa19vdXQgPSA0LAogCS5udW1fcG9ydHMgPSA0LAotI2VuZGlmCiAJLm9wZW4gPSBtb3M3ODQwX29wZW4sCiAJLmNsb3NlID0gbW9zNzg0MF9jbG9zZSwKIAkud3JpdGUgPSBtb3M3ODQwX3dyaXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jCmluZGV4IDdmMzM3YzkuLjQzYzg4OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9uYXZtYW4uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbmF2bWFuLmMKQEAgLTYsNiArNiwxMCBAQAogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqCXZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUT0RPOgorICoJQWRkIHRlcm1pb3MgbWV0aG9kIHRoYXQgdXNlcyBjb3B5X2h3IGJ1dCBhbHNvIGtpbGxzIGFsbCBlY2hvCisgKglmbGFncyBhcyB0aGUgbmF2bWFuIGlzIHJ4IG9ubHkgc28gY2Fubm90IGVjaG8uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNDksMTUgKzUzLDE1IEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKQEAgLTcyLDI5ICs3NiwyOSBAQAogCWlmIChyZXN1bHQpCiAJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGludGVycnVwdCB1cmJcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIH0KIAogc3RhdGljIGludCBuYXZtYW5fb3BlbihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAocG9ydC0+aW50ZXJydXB0X2luX3VyYikgewotCQlkYmcoIiVzIC0gYWRkaW5nIGludGVycnVwdCBpbnB1dCBmb3IgdHJlbyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBhZGRpbmcgaW50ZXJydXB0IGlucHV0IGZvciB0cmVvIiwgX19mdW5jX18pOwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHJlc3VsdCkKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJfQogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkIG5hdm1hbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwogfQpAQCAtMTAyLDE2ICsxMDYsMTIgQEAKIHN0YXRpYyBpbnQgbmF2bWFuX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyoKIAkgKiBUaGlzIGRldmljZSBjYW4ndCB3cml0ZSBhbnkgZGF0YSwgb25seSByZWFkIGZyb20gdGhlIGRldmljZQotCSAqIHNvIHdlIGp1c3Qgc2lsZW50bHkgZWF0IGFsbCBkYXRhIHNlbnQgdG8gdXMgYW5kIHNheSBpdCB3YXMKLQkgKiBzdWNjZXNzZnVsbHkgc2VudC4KLQkgKiBFdmlsLCBJIGtub3csIGJ1dCBkbyB5b3UgaGF2ZSBhIGJldHRlciBpZGVhPwogCSAqLwotCi0JcmV0dXJuIGNvdW50OworCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBuYXZtYW5fZGV2aWNlID0gewpAQCAtMTIxLDkgKzEyMSw2IEBACiAJfSwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCiAJLnVzYl9kcml2ZXIgPQkJJm5hdm1hbl9kcml2ZXIsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLm9wZW4gPQkJCW5hdm1hbl9vcGVuLAogCS5jbG9zZSA9IAkJbmF2bWFuX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMKaW5kZXggZWU5NGQ5Ni4uN2I3NDIyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jCkBAIC05NSw5ICs5NSw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJaeVhFTCAtIG9tbmkubmV0IGxjZCBwbHVzIHVzYiIsCiAJLnVzYl9kcml2ZXIgPQkJJm9tbmluZXRfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CTEsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkyLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCW9tbmluZXRfYXR0YWNoLAogCS5vcGVuID0JCQlvbW5pbmV0X29wZW4sCkBAIC0xNTMsNyArMTUwLDcgQEAKIAogCW9kID0ga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBvbW5pbmV0X2RhdGEpLCBHRlBfS0VSTkVMICk7CiAJaWYoICFvZCApIHsKLQkJZXJyKCIlcy0ga21hbGxvYyglWmQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihzdHJ1Y3Qgb21uaW5ldF9kYXRhKSk7CisJCWVycigiJXMtIGttYWxsb2MoJVpkKSBmYWlsZWQuIiwgX19mdW5jX18sIHNpemVvZihzdHJ1Y3Qgb21uaW5ldF9kYXRhKSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgb2QpOwpAQCAtMTY2LDcgKzE2Myw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydAkqd3BvcnQ7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAl3cG9ydCA9IHNlcmlhbC0+cG9ydFsxXTsKIAl3cG9ydC0+dHR5ID0gcG9ydC0+dHR5OwpAQCAtMTc4LDcgKzE3NSw3IEBACiAJCSAgICAgIG9tbmluZXRfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkgewotCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTE4Niw3ICsxODMsNyBAQAogCiBzdGF0aWMgdm9pZCBvbW5pbmV0X2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwogfQogCkBAIC0xOTcsMTggKzE5NCwxOCBAQAogCiBzdGF0aWMgdm9pZCBvbW5pbmV0X3JlYWRfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgCSpwb3J0IAk9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgCSpwb3J0IAk9IHVyYi0+Y29udGV4dDsKIAl1bnNpZ25lZCBjaGFyIAkJKmRhdGEgCT0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJc3RydWN0IG9tbmluZXRfaGVhZGVyIAkqaGVhZGVyID0gKHN0cnVjdCBvbW5pbmV0X2hlYWRlciAqKSAmZGF0YVswXTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IGk7CiAJaW50IHJlc3VsdDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMzYsNyArMjMzLDcgQEAKIAkJICAgICAgb21uaW5ldF9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkKLQkJZXJyKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybjsKIH0KQEAgLTI1MSwxNyArMjQ4LDE3IEBACiAKIAlpbnQJCQlyZXN1bHQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAoMCk7CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZ3cG9ydC0+bG9jayk7CiAJaWYgKHdwb3J0LT53cml0ZV91cmJfYnVzeSkgewogCQlzcGluX3VubG9ja19iaCgmd3BvcnQtPmxvY2spOwotCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCXdwb3J0LT53cml0ZV91cmJfYnVzeSA9IDE7CkBAIC0yNzEsNyArMjY4LDcgQEAKIAogCW1lbWNweSAod3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyICsgT01OSU5FVF9EQVRBT0ZGU0VULCBidWYsIGNvdW50KTsKIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBjb3VudCwgd3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgd3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCWhlYWRlci0+b2hfc2VxIAk9IG9kLT5vZF9vdXRzZXErKzsKIAloZWFkZXItPm9oX2xlbiAJPSBjb3VudDsKQEAgLTI4NSw3ICsyODIsNyBAQAogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpIHsKIAkJd3BvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJfSBlbHNlCiAJCXJlc3VsdCA9IGNvdW50OwogCkBAIC0yOTgsMTIgKzI5NSwxMyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsIAkqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgCSp3cG9ydCAJPSBzZXJpYWwtPnBvcnRbMV07CiAKLQlpbnQgcm9vbSA9IDA7IC8vIERlZmF1bHQ6IG5vIHJvb20KKwlpbnQgcm9vbSA9IDA7IC8qIERlZmF1bHQ6IG5vIHJvb20gKi8KIAorCS8qIEZJWE1FOiBubyBjb25zaXN0ZW50IGxvY2tpbmcgZm9yIHdyaXRlX3VyYl9idXN5ICovCiAJaWYgKHdwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJcm9vbSA9IHdwb3J0LT5idWxrX291dF9zaXplIC0gT01OSU5FVF9IRUFERVJMRU47CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgcm9vbSk7CiAKIAlyZXR1cm4gKHJvb20pOwogfQpAQCAtMzExLDE1ICszMDksMTUgQEAKIHN0YXRpYyB2b2lkIG9tbmluZXRfd3JpdGVfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQogewogLyoJc3RydWN0IG9tbmluZXRfaGVhZGVyCSpoZWFkZXIgPSAoc3RydWN0IG9tbmluZXRfaGVhZGVyICAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsgKi8KLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0IAkqcG9ydCAgID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgCSpwb3J0ICAgPSAgdXJiLT5jb250ZXh0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICUweFxuIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICUweFxuIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMzMSw3ICszMjksNyBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKndwb3J0ID0gc2VyaWFsLT5wb3J0WzFdOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07Ci0JZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZyAoIiVzIiwgX19mdW5jX18pOwogCiAJdXNiX2tpbGxfdXJiKHdwb3J0LT53cml0ZV91cmIpOwogCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggZDEwMTAyNS4uZTRiZTJkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtMjgsNyArMjgsNyBAQAogICBkZXZpY2UgZmVhdHVyZXMuCiAqLwogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC43LjEiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC43LjIiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hdHRoaWFzIFVybGljaHMgPHNtdXJmQHNtdXJmLm5vcmlzLmRlPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBEcml2ZXIgZm9yIEdTTSBtb2RlbXMiCiAKQEAgLTMyNSw5ICszMjUsNiBAQAogCS5kZXNjcmlwdGlvbiAgICAgICA9ICJHU00gbW9kZW0gKDEtcG9ydCkiLAogCS51c2JfZHJpdmVyICAgICAgICA9ICZvcHRpb25fZHJpdmVyLAogCS5pZF90YWJsZSAgICAgICAgICA9IG9wdGlvbl9pZHMsCi0JLm51bV9pbnRlcnJ1cHRfaW4gID0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gICAgICAgPSBOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgICAgICA9IE5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyAgICAgICAgID0gMSwKIAkub3BlbiAgICAgICAgICAgICAgPSBvcHRpb25fb3BlbiwKIAkuY2xvc2UgICAgICAgICAgICAgPSBvcHRpb25fY2xvc2UsCkBAIC00MTEsMjQgKzQwOCwyNCBAQAogCiBzdGF0aWMgdm9pZCBvcHRpb25fcnhfdGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZCBvcHRpb25fcnhfdW50aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIG9wdGlvbl9icmVha19jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQogewogCS8qIFVuZm9ydHVuYXRlbHksIEkgZG9uJ3Qga25vdyBob3cgdG8gc2VuZCBhIGJyZWFrICovCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgb3B0aW9uX3NldF90ZXJtaW9zKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAJLyogRG9lc24ndCBzdXBwb3J0IG9wdGlvbiBzZXR0aW5nICovCiAJdHR5X3Rlcm1pb3NfY29weV9odyhwb3J0LT50dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKTsKIAlvcHRpb25fc2VuZF9zZXR1cChwb3J0KTsKQEAgLTQ1OCw2ICs0NTUsNyBAQAogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKKwkvKiBGSVhNRTogd2hhdCBsb2NrcyBwb3J0ZGF0YSBmaWVsZHMgPyAqLwogCWlmIChzZXQgJiBUSU9DTV9SVFMpCiAJCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAxOwogCWlmIChzZXQgJiBUSU9DTV9EVFIpCkBAIC00ODgsNyArNDg2LDcgQEAKIAogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlczogd3JpdGUgKCVkIGNoYXJzKSIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCWRiZygiJXM6IHdyaXRlICglZCBjaGFycykiLCBfX2Z1bmNfXywgY291bnQpOwogCiAJaSA9IDA7CiAJbGVmdCA9IGNvdW50OwpAQCAtNTA5LDcgKzUwNyw3IEBACiAJCQlkYmcoInVzYl93cml0ZSAlcCBmYWlsZWQgKGVycj0lZCkiLAogCQkJCXRoaXNfdXJiLCB0aGlzX3VyYi0+c3RhdHVzKTsKIAotCQlkYmcoIiVzOiBlbmRwb2ludCAlZCBidWYgJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXM6IGVuZHBvaW50ICVkIGJ1ZiAlZCIsIF9fZnVuY19fLAogCQkJdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSksIGkpOwogCiAJCS8qIHNlbmQgdGhlIGRhdGEgKi8KQEAgLTUzMSw3ICs1MjksNyBAQAogCX0KIAogCWNvdW50IC09IGxlZnQ7Ci0JZGJnKCIlczogd3JvdGUgKGRpZCAlZCkiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwlkYmcoIiVzOiB3cm90ZSAoZGlkICVkKSIsIF9fZnVuY19fLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC01NDQsMTQgKzU0MiwxNCBAQAogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzOiAlcCIsIF9fRlVOQ1RJT05fXywgdXJiKTsKKwlkYmcoIiVzOiAlcCIsIF9fZnVuY19fLCB1cmIpOwogCiAJZW5kcG9pbnQgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7Ci0JcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlczogbm9uemVybyBzdGF0dXM6ICVkIG9uIGVuZHBvaW50ICUwMnguIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzLCBlbmRwb2ludCk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzLCBlbmRwb2ludCk7CiAJfSBlbHNlIHsKIAkJdHR5ID0gcG9ydC0+dHR5OwogCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoKSB7CkBAIC01NTksNyArNTU3LDcgQEAKIAkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAkJfSBlbHNlIHsKLQkJCWRiZygiJXM6IGVtcHR5IHJlYWQgdXJiIHJlY2VpdmVkIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXM6IGVtcHR5IHJlYWQgdXJiIHJlY2VpdmVkIiwgX19mdW5jX18pOwogCQl9CiAKIAkJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLwpAQCAtNTY3LDcgKzU2NSw3IEBACiAJCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGVycikKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICIKLQkJCQkJIiglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJCSIoJWQpIiwgX19mdW5jX18sIGVycik7CiAJCX0KIAl9CiAJcmV0dXJuOwpAQCAtNTc5LDkgKzU3Nyw5IEBACiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCWludCBpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKIApAQCAtNTk5LDE5ICs1OTcsMTkgQEAKIHsKIAlpbnQgZXJyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlICpwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0JZGJnKCIlczogdXJiICVwIHBvcnQgJXAgaGFzIGRhdGEgJXAiLCBfX0ZVTkNUSU9OX18sdXJiLHBvcnQscG9ydGRhdGEpOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CisJZGJnKCIlczogdXJiICVwIHBvcnQgJXAgaGFzIGRhdGEgJXAiLCBfX2Z1bmNfXyx1cmIscG9ydCxwb3J0ZGF0YSk7CiAKIAlpZiAoc3RhdHVzID09IDApIHsKIAkJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqcmVxX3BrdCA9CiAJCQkJKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKil1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAogCQlpZiAoIXJlcV9wa3QpIHsKLQkJCWRiZygiJXM6IE5VTEwgcmVxX3BrdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXM6IE5VTEwgcmVxX3BrdFxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmICgocmVxX3BrdC0+YlJlcXVlc3RUeXBlID09IDB4QTEpICYmCkBAIC02MjEsNyArNjE5LDcgQEAKIAkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgKwogCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCkpOwogCi0JCQlkYmcoIiVzOiBzaWduYWwgeCV4IiwgX19GVU5DVElPTl9fLCBzaWduYWxzKTsKKwkJCWRiZygiJXM6IHNpZ25hbCB4JXgiLCBfX2Z1bmNfXywgc2lnbmFscyk7CiAKIAkJCW9sZF9kY2Rfc3RhdGUgPSBwb3J0ZGF0YS0+ZGNkX3N0YXRlOwogCQkJcG9ydGRhdGEtPmN0c19zdGF0ZSA9IDE7CkBAIC02MzMsMTEgKzYzMSwxMSBAQAogCQkJCQlvbGRfZGNkX3N0YXRlICYmICFwb3J0ZGF0YS0+ZGNkX3N0YXRlKQogCQkJCXR0eV9oYW5ndXAocG9ydC0+dHR5KTsKIAkJfSBlbHNlIHsKLQkJCWRiZygiJXM6IHR5cGUgJXggcmVxICV4IiwgX19GVU5DVElPTl9fLAorCQkJZGJnKCIlczogdHlwZSAleCByZXEgJXgiLCBfX2Z1bmNfXywKIAkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUscmVxX3BrdC0+YlJlcXVlc3QpOwogCQl9CiAJfSBlbHNlCi0JCWRiZygiJXM6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzOiBlcnJvciAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCiAJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyBJUlEgZGF0YSAqLwogCWlmIChzdGF0dXMgIT0gLUVTSFVURE9XTikgewpAQCAtNjQ1LDcgKzY0Myw3IEBACiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnIpCiAJCQlkYmcoIiVzOiByZXN1Ym1pdCBpbnRyIHVyYiBmYWlsZWQuICglZCkiLAotCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCQlfX2Z1bmNfXywgZXJyKTsKIAl9CiB9CiAKQEAgLTY1OCwxMyArNjU2LDE0IEBACiAKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAorCiAJZm9yIChpPTA7IGkgPCBOX09VVF9VUkI7IGkrKykgewogCQl0aGlzX3VyYiA9IHBvcnRkYXRhLT5vdXRfdXJic1tpXTsKIAkJaWYgKHRoaXNfdXJiICYmICF0ZXN0X2JpdChpLCAmcG9ydGRhdGEtPm91dF9idXN5KSkKIAkJCWRhdGFfbGVuICs9IE9VVF9CVUZMRU47CiAJfQogCi0JZGJnKCIlczogJWQiLCBfX0ZVTkNUSU9OX18sIGRhdGFfbGVuKTsKKwlkYmcoIiVzOiAlZCIsIF9fZnVuY19fLCBkYXRhX2xlbik7CiAJcmV0dXJuIGRhdGFfbGVuOwogfQogCkBAIC02NzksMTAgKzY3OCwxMiBAQAogCiAJZm9yIChpPTA7IGkgPCBOX09VVF9VUkI7IGkrKykgewogCQl0aGlzX3VyYiA9IHBvcnRkYXRhLT5vdXRfdXJic1tpXTsKKwkJLyogRklYTUU6IFRoaXMgbG9ja2luZyBpcyBpbnN1ZmZpY2llbnQgYXMgdGhpc191cmIgbWF5CisJCSAgIGdvIHVudXNlZCBkdXJpbmcgdGhlIHRlc3QgKi8KIAkJaWYgKHRoaXNfdXJiICYmIHRlc3RfYml0KGksICZwb3J0ZGF0YS0+b3V0X2J1c3kpKQogCQkJZGF0YV9sZW4gKz0gdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CiAJfQotCWRiZygiJXM6ICVkIiwgX19GVU5DVElPTl9fLCBkYXRhX2xlbik7CisJZGJnKCIlczogJWQiLCBfX2Z1bmNfXywgZGF0YV9sZW4pOwogCXJldHVybiBkYXRhX2xlbjsKIH0KIApAQCAtNjk1LDcgKzY5Niw3IEBACiAKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAkvKiBTZXQgc29tZSBzYW5lIGRlZmF1bHRzICovCiAJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDE7CkBAIC03MDcsNyArNzA4LDcgQEAKIAkJaWYgKCEgdXJiKQogCQkJY29udGludWU7CiAJCWlmICh1cmItPmRldiAhPSBzZXJpYWwtPmRldikgewotCQkJZGJnKCIlczogZGV2ICVwICE9ICVwIiwgX19GVU5DVElPTl9fLAorCQkJZGJnKCIlczogZGV2ICVwICE9ICVwIiwgX19mdW5jX18sCiAJCQkJdXJiLT5kZXYsIHNlcmlhbC0+ZGV2KTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC03MjEsNyArNzIyLDcgQEAKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycikgewogCQkJZGJnKCIlczogc3VibWl0IHVyYiAlZCBmYWlsZWQgKCVkKSAlZCIsCi0JCQkJX19GVU5DVElPTl9fLCBpLCBlcnIsCisJCQkJX19mdW5jX18sIGksIGVyciwKIAkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCQl9CiAJfQpAQCAtNzQ5LDcgKzc1MCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDA7CkBAIC03ODIsNyArNzgzLDcgQEAKIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CQkvKiBObyBJU08gKi8KIAlpZiAodXJiID09IE5VTEwpIHsKLQkJZGJnKCIlczogYWxsb2MgZm9yIGVuZHBvaW50ICVkIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIGVuZHBvaW50KTsKKwkJZGJnKCIlczogYWxsb2MgZm9yIGVuZHBvaW50ICVkIGZhaWxlZC4iLCBfX2Z1bmNfXywgZW5kcG9pbnQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTgwMSw3ICs4MDIsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CkBAIC04MjMsMTUgKzgyNCwxOCBAQAogCX0KIH0KIAorCisvKiogc2VuZCBSVFMvRFRSIHN0YXRlIHRvIHRoZSBwb3J0LgorICoKKyAqIFRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBTRVRfQ09OVFJPTF9MSU5FX1NUQVRFIGZyb20gdGhlIFBTVE4KKyAqIENEQy4KKyovCiBzdGF0aWMgaW50IG9wdGlvbl9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7Ci0KLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKLQotCWlmIChwb3J0LT5udW1iZXIgIT0gMCkKLQkJcmV0dXJuIDA7CisJaW50IGlmTnVtID0gc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC04NDQsNyArODQ4LDcgQEAKIAogCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAogCQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQkJMHgyMiwweDIxLHZhbCwwLE5VTEwsMCxVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJCQkJMHgyMiwweDIxLHZhbCxpZk51bSxOVUxMLDAsVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogCX0KIAogCXJldHVybiAwOwpAQCAtODU3LDcgKzg2MSw3IEBACiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCXU4ICpidWZmZXI7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogTm93IHNldHVwIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLwogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CkBAIC04NjUsNyArODY5LDcgQEAKIAkJcG9ydGRhdGEgPSBremFsbG9jKHNpemVvZigqcG9ydGRhdGEpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwb3J0ZGF0YSkgewogCQkJZGJnKCIlczoga21hbGxvYyBmb3Igb3B0aW9uX3BvcnRfcHJpdmF0ZSAoJWQpIGZhaWxlZCEuIiwKLQkJCQkJX19GVU5DVElPTl9fLCBpKTsKKwkJCQkJX19mdW5jX18sIGkpOwogCQkJcmV0dXJuICgxKTsKIAkJfQogCkBAIC04OTAsNyArODk0LDcgQEAKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIpCiAJCQlkYmcoIiVzOiBzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWQiLAotCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCQlfX2Z1bmNfXywgZXJyKTsKIAl9CiAKIAlvcHRpb25fc2V0dXBfdXJicyhzZXJpYWwpOwpAQCAtOTE0LDcgKzkxOCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogU3RvcCByZWFkaW5nL3dyaXRpbmcgdXJicyAqLwogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3RpNjg1OC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL290aTY4NTguYwppbmRleCBhMzg0N2Q2Li5kOTJiYjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3RpNjg1OC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vdGk2ODU4LmMKQEAgLTE3OSw5ICsxNzksNiBAQAogCQkubmFtZSA9CQkib3RpNjg1OCIsCiAJfSwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQkxLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLm9wZW4gPQkJCW90aTY4NThfb3BlbiwKIAkuY2xvc2UgPQkJb3RpNjg1OF9jbG9zZSwKQEAgLTIzOCwxMCArMjM1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMocG9ydCA9ICVkKSIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKChuZXdfc2V0dXAgPSBrbWFsbG9jKE9USTY4NThfQ1RSTF9QS1RfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogb3V0IG9mIG1lbW9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IG91dCBvZiBtZW1vcnkhXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIHdlIHdpbGwgdHJ5IGFnYWluICovCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZGVsYXllZF9zZXR1cF93b3JrLCBtc2Vjc190b19qaWZmaWVzKDIpKTsKIAkJcmV0dXJuOwpAQCAtMjU2LDcgKzI1Myw3IEBACiAJCQkJMTAwKTsKIAogCWlmIChyZXN1bHQgIT0gT1RJNjg1OF9DVFJMX1BLVF9TSVpFKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IGVycm9yIHJlYWRpbmcgc3RhdHVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcygpOiBlcnJvciByZWFkaW5nIHN0YXR1c1xuIiwgX19mdW5jX18pOwogCQlrZnJlZShuZXdfc2V0dXApOwogCQkvKiB3ZSB3aWxsIHRyeSBhZ2FpbiAqLwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmRlbGF5ZWRfc2V0dXBfd29yaywgbXNlY3NfdG9famlmZmllcygyKSk7CkBAIC0yODksMTIgKzI4NiwxMiBAQAogCXByaXYtPnNldHVwX2RvbmUgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMoKTogc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0ICE9IDApIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiCi0JCQkJIiB3aXRoIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJIiB3aXRoIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAl9CiB9CiAKQEAgLTMwNiw3ICszMDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBhbGxvdzsKIAotCWRiZygiJXMocG9ydCA9ICVkKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPmZsYWdzLndyaXRlX3VyYl9pbl91c2UpIHsKQEAgLTMzNCwxMiArMzMxLDEyIEBACiAJaWYgKGNvdW50ID09IDApIHsKIAkJcHJpdi0+ZmxhZ3Mud3JpdGVfdXJiX2luX3VzZSA9IDA7CiAKLQkJZGJnKCIlcygpOiBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0ICE9IDApIHsKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIgotCQkJCSIgd2l0aCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCSIgd2l0aCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAkJcmV0dXJuOwogCX0KQEAgLTM1Myw3ICszNTAsNyBAQAogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIgotCQkJICAgICAgICIgd2l0aCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJICAgICAgICIgd2l0aCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXByaXYtPmZsYWdzLndyaXRlX3VyYl9pbl91c2UgPSAwOwogCX0KIApAQCAtNDA0LDcgKzQwMSw3IEBACiAJc3RydWN0IG90aTY4NThfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyhwb3J0ID0gJWQsIGNvdW50ID0gJWQpIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKKwlkYmcoIiVzKHBvcnQgPSAlZCwgY291bnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CiAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gY291bnQ7CkBAIC00MjIsNyArNDE5LDcgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMocG9ydCA9ICVkKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcm9vbSA9IG90aTY4NThfYnVmX3NwYWNlX2F2YWlsKHByaXYtPmJ1Zik7CkBAIC00MzcsNyArNDM0LDcgQEAKIAlpbnQgY2hhcnMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWNoYXJzID0gb3RpNjg1OF9idWZfZGF0YV9hdmFpbChwcml2LT5idWYpOwpAQCAtNDU2LDEwICs0NTMsMTAgQEAKIAl1MTYgZGl2aXNvcjsKIAlpbnQgYnI7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXBvcnQtPnR0eSB8fCAhcG9ydC0+dHR5LT50ZXJtaW9zKSB7Ci0JCWRiZygiJXMoKTogbm8gdHR5IHN0cnVjdHVyZXMiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzKCk6IG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC01NzUsNyArNTcyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAl1c2JfY2xlYXJfaGFsdChzZXJpYWwtPmRldiwgcG9ydC0+d3JpdGVfdXJiLT5waXBlKTsKIAl1c2JfY2xlYXJfaGFsdChzZXJpYWwtPmRldiwgcG9ydC0+cmVhZF91cmItPnBpcGUpOwpAQCAtNTg0LDcgKzU4MSw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKChidWYgPSBrbWFsbG9jKE9USTY4NThfQ1RSTF9QS1RfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogb3V0IG9mIG1lbW9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IG91dCBvZiBtZW1vcnkhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNjEzLDEyICs2MTAsMTIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJa2ZyZWUoYnVmKTsKIAotCWRiZygiJXMoKTogc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0ICE9IDApIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiCi0JCQkgICAgICAgIiB3aXRoIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkgICAgICAgIiB3aXRoIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJb3RpNjg1OF9jbG9zZShwb3J0LCBOVUxMKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQpAQCAtNjM3LDE0ICs2MzQsMTQgQEAKIAlsb25nIHRpbWVvdXQ7CiAJd2FpdF9xdWV1ZV90IHdhaXQ7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiB3YWl0IGZvciBkYXRhIHRvIGRyYWluIGZyb20gdGhlIGJ1ZmZlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJdGltZW91dCA9IDMwICogSFo7CS8qIFBMMjMwM19DTE9TSU5HX1dBSVQgKi8KIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoJnBvcnQtPnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCWRiZygiJXMoKTogZW50ZXJpbmcgd2FpdCBsb29wIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzKCk6IGVudGVyaW5nIHdhaXQgbG9vcCIsIF9fZnVuY19fKTsKIAlmb3IgKDs7KSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmIChvdGk2ODU4X2J1Zl9kYXRhX2F2YWlsKHByaXYtPmJ1ZikgPT0gMApAQCAtNjU3LDcgKzY1NCw3IEBACiAJfQogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCWRiZygiJXMoKTogYWZ0ZXIgd2FpdCBsb29wIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzKCk6IGFmdGVyIHdhaXQgbG9vcCIsIF9fZnVuY19fKTsKIAogCS8qIGNsZWFyIG91dCBhbnkgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciAqLwogCW90aTY4NThfYnVmX2NsZWFyKHByaXYtPmJ1Zik7CkBAIC02NzgsNyArNjc1LDcgQEAKIAkqLwogCQl0aW1lb3V0ID0gMipIWjsKIAlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7Ci0JZGJnKCIlcygpOiBhZnRlciBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoKSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcygpOiBhZnRlciBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoKSIsIF9fZnVuY19fKTsKIAogCS8qIGNhbmNlbCBzY2hlZHVsZWQgc2V0dXAgKi8KIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kZWxheWVkX3NldHVwX3dvcmspOwpAQCAtNjg2LDcgKzY4Myw3IEBACiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCS8qIHNodXRkb3duIG91ciB1cmJzICovCi0JZGJnKCIlcygpOiBzaHV0dGluZyBkb3duIHVyYnMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMoKTogc2h1dHRpbmcgZG93biB1cmJzIiwgX19mdW5jX18pOwogCXVzYl9raWxsX3VyYihwb3J0LT53cml0ZV91cmIpOwogCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwpAQCAtNzA5LDcgKzcwNiw3IEBACiAJdTggY29udHJvbDsKIAogCWRiZygiJXMocG9ydCA9ICVkLCBzZXQgPSAweCUwOHgsIGNsZWFyID0gMHglMDh4KSIsCi0JCQkJX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHNldCwgY2xlYXIpOworCQkJCV9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHNldCwgY2xlYXIpOwogCiAJaWYgKCF1c2JfZ2V0X2ludGZkYXRhKHBvcnQtPnNlcmlhbC0+aW50ZXJmYWNlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NDEsNyArNzM4LDcgQEAKIAl1bnNpZ25lZCBwaW5fc3RhdGU7CiAJdW5zaWduZWQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMocG9ydCA9ICVkKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghdXNiX2dldF9pbnRmZGF0YShwb3J0LT5zZXJpYWwtPmludGVyZmFjZSkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNzY0LDcgKzc2MSw3IEBACiAJaWYgKChwaW5fc3RhdGUgJiBQSU5fRENEKSAhPSAwKQogCQlyZXN1bHQgfD0gVElPQ01fQ0Q7CiAKLQlkYmcoIiVzKCkgPSAweCUwOHgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcygpID0gMHglMDh4IiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtODExLDEzICs4MDgsOSBAQAogCXVuc2lnbmVkIGludCB4OwogCiAJZGJnKCIlcyhwb3J0ID0gJWQsIGNtZCA9IDB4JTA0eCwgYXJnID0gMHglMDhseCkiLAotCQkJCV9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQsIGFyZyk7CisJCQkJX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kLCBhcmcpOwogCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUQ0ZMU0g6Ci0JCQkvKiBGSVhNRSAqLwotCQkJcmV0dXJuIDA7Ci0KIAkJY2FzZSBUSU9DTUJJUzoKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmeCwgdXNlcl9hcmcsIHNpemVvZih4KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC04MjksMTEgKzgyMiwxMSBAQAogCQkJcmV0dXJuIG90aTY4NThfdGlvY21zZXQocG9ydCwgTlVMTCwgMCwgeCk7CiAKIAkJY2FzZSBUSU9DTUlXQUlUOgotCQkJZGJnKCIlcygpOiBUSU9DTUlXQUlUIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMoKTogVElPQ01JV0FJVCIsIF9fZnVuY19fKTsKIAkJCXJldHVybiB3YWl0X21vZGVtX2luZm8ocG9ydCwgYXJnKTsKIAogCQlkZWZhdWx0OgotCQkJZGJnKCIlcygpOiAweCUwNHggbm90IHN1cHBvcnRlZCIsIF9fRlVOQ1RJT05fXywgY21kKTsKKwkJCWRiZygiJXMoKTogMHglMDR4IG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXywgY21kKTsKIAkJCWJyZWFrOwogCX0KIApAQCAtODQ0LDEwICs4MzcsMTAgQEAKIHsKIAlpbnQgc3RhdGU7CiAKLQlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyhwb3J0ID0gJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzdGF0ZSA9IChicmVha19zdGF0ZSA9PSAwKSA/IDAgOiAxOwotCWRiZygiJXMoKTogdHVybmluZyBicmVhayAlcyIsIF9fRlVOQ1RJT05fXywgc3RhdGUgPyAib24iIDogIm9mZiIpOworCWRiZygiJXMoKTogdHVybmluZyBicmVhayAlcyIsIF9fZnVuY19fLCBzdGF0ZSA/ICJvbiIgOiAib2ZmIik7CiAKIAkvKiBGSVhNRSAqLwogLyoKQEAgLTg1NSw3ICs4NDgsNyBAQAogCQkJCSAgQlJFQUtfUkVRVUVTVCwgQlJFQUtfUkVRVUVTVF9UWVBFLCBzdGF0ZSwKIAkJCQkgIDAsIE5VTEwsIDAsIDEwMCk7CiAJaWYgKHJlc3VsdCAhPSAwKQotCQlkYmcoIiVzKCk6IGVycm9yIHNlbmRpbmcgYnJlYWsiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzKCk6IGVycm9yIHNlbmRpbmcgYnJlYWsiLCBfX2Z1bmNfXyk7CiAgKi8KIH0KIApAQCAtODY0LDcgKzg1Nyw3IEBACiAJc3RydWN0IG90aTY4NThfcHJpdmF0ZSAqcHJpdjsKIAlpbnQgaTsKIAotCWRiZygiJXMoKSIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcygpIiwgX19mdW5jX18pOwogCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0pOwpAQCAtODc4LDEzICs4NzEsMTMgQEAKIAogc3RhdGljIHZvaWQgb3RpNjg1OF9yZWFkX2ludF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgb3RpNjg1OF9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCB0cmFuc2llbnQgPSAwLCBjYW5fcmVjdiA9IDAsIHJlc3VibWl0ID0gMTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKIAlkYmcoIiVzKHBvcnQgPSAlZCwgc3RhdHVzID0gJWQpIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgc3RhdHVzKTsKKwkJCQlfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBzdGF0dXMpOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CkBAIC04OTUsMTEgKzg4OCwxMSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcygpOiB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGJnKCIlcygpOiBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC05MTYsNyArOTA5LDcgQEAKIAkJCQkJcHJpdi0+c2V0dXBfZG9uZSA9IDA7CiAJCQkJCXJlc3VibWl0ID0gMDsKIAkJCQkJZGJnKCIlcygpOiBzY2hlZHVsaW5nIHNldHVwX2xpbmUoKSIsCi0JCQkJCSAgICBfX0ZVTkNUSU9OX18pOworCQkJCQkgICAgX19mdW5jX18pOwogCQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmRlbGF5ZWRfc2V0dXBfd29yaywgMCk7CiAJCQkJfQogCQkJfQpAQCAtOTMxLDcgKzkyNCw3IEBACiAJCQkJCXByaXYtPnNldHVwX2RvbmUgPSAwOwogCQkJCQlyZXN1Ym1pdCA9IDA7CiAJCQkJCWRiZygiJXMoKTogc2NoZWR1bGluZyBzZXR1cF9saW5lKCkiLAotCQkJCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCQkJICAgIF9fZnVuY19fKTsKIAkJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kZWxheWVkX3NldHVwX3dvcmssIDApOwogCQkJCX0KIAkJCX0KQEAgLTk2MCw3ICs5NTMsNyBAQAogCQlpZiAocmVzdWx0ICE9IDApIHsKIAkJCXByaXYtPmZsYWdzLnJlYWRfdXJiX2luX3VzZSA9IDA7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcygpOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCwiCi0JCQkJCSIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0gZWxzZSB7CiAJCQlyZXN1Ym1pdCA9IDA7CiAJCX0KQEAgLTk3OSwyMCArOTcyLDIwIEBACiAJaWYgKHJlc3VibWl0KSB7CiAJCWludCByZXN1bHQ7CiAKLS8vCQlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fRlVOQ1RJT05fXyk7CisvLwkJZGJnKCIlcygpOiBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX2Z1bmNfXyk7CiAJCXVyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQgIT0gMCkgewogCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKIAkJCQkJIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIHdpdGgiCi0JCQkJCSIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyB2b2lkIG90aTY4NThfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXN0cnVjdCBvdGk2ODU4X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC0xMDAxLDcgKzk5NCw3IEBACiAJaW50IHJlc3VsdDsKIAogCWRiZygiJXMocG9ydCA9ICVkLCBzdGF0dXMgPSAlZCkiLAotCQkJCV9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBzdGF0dXMpOworCQkJCV9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHN0YXR1cyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXByaXYtPmZsYWdzLnJlYWRfdXJiX2luX3VzZSA9IDA7CkBAIC0xMDA5LDIwICsxMDAyLDIwIEBACiAKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCQlkYmcoIiVzKCk6IHBvcnQgaXMgY2xvc2VkLCBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMoKTogcG9ydCBpcyBjbG9zZWQsIGV4aXRpbmciLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJLyoKIAkJaWYgKHN0YXR1cyA9PSAtRVBST1RPKSB7CiAJCQkvLyBQTDIzMDMgbXlzdGVyaW91c2x5IGZhaWxzIHdpdGggLUVQUk9UTyByZXNjaGVkdWxlIHRoZSByZWFkCi0JCQlkYmcoIiVzIC0gY2F1Z2h0IC1FUFJPVE8sIHJlc3VibWl0dGluZyB0aGUgdXJiIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBjYXVnaHQgLUVQUk9UTywgcmVzdWJtaXR0aW5nIHRoZSB1cmIiLCBfX2Z1bmNfXyk7CiAJCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJlc3VsdCkKLQkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCXJldHVybjsKIAkJfQogCQkqLwotCQlkYmcoIiVzKCk6IHVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcygpOiB1bmFibGUgdG8gaGFuZGxlIHRoZSBlcnJvciwgZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTAzOCwyMCArMTAzMSwyMCBAQAogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcygpOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCwiCi0JCQkJCSIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyB2b2lkIG90aTY4NThfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgb3RpNjg1OF9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmVzdWx0OwogCiAJZGJnKCIlcyhwb3J0ID0gJWQsIHN0YXR1cyA9ICVkKSIsCi0JCQkJX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIHN0YXR1cyk7CisJCQkJX19mdW5jX18sIHBvcnQtPm51bWJlciwgc3RhdHVzKTsKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgpAQCAtMTA2MiwyMSArMTA1NSwyMSBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcygpOiB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlwcml2LT5mbGFncy53cml0ZV91cmJfaW5fdXNlID0gMDsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCS8qIGVycm9yIGluIHRoZSB1cmIsIHNvIHdlIGhhdmUgdG8gcmVzdWJtaXQgaXQgKi8KIAkJZGJnKCIlcygpOiBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKLQkJZGJnKCIlcygpOiBvdmVyZmxvdyBpbiB3cml0ZSIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQlkYmcoIiVzKCk6IG92ZXJmbG93IGluIHdyaXRlIiwgX19mdW5jX18pOwogCiAJCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAJCXBvcnQtPndyaXRlX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkLCIKLQkJCQkJIiBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJCQkiIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJfSBlbHNlIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTA4NiwxMSArMTA3OSwxMSBAQAogCiAJLy8gc2NoZWR1bGUgdGhlIGludGVycnVwdCB1cmIgaWYgd2UgYXJlIHN0aWxsIG9wZW4gKi8KIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKLQlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcygpOiBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX2Z1bmNfXyk7CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IGZhaWxlZCBzdWJtaXR0aW5nIGludCB1cmIsIgotCQkJCQkiIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJCSIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCmluZGV4IDJhZjc3ODUuLmM2MDVmYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKQEAgLTQxMCw3ICs0MTAsNyBAQAogCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJCSBTRVRfQ09OVFJPTF9SRVFVRVNULCBTRVRfQ09OVFJPTF9SRVFVRVNUX1RZUEUsCiAJCQkJIHZhbHVlLCAwLCBOVUxMLCAwLCAxMDApOwotCWRiZygiJXMgLSB2YWx1ZSA9ICVkLCByZXR2YWwgPSAlZCIsIF9fRlVOQ1RJT05fXywgdmFsdWUsIHJldHZhbCk7CisJZGJnKCIlcyAtIHZhbHVlID0gJWQsIHJldHZhbCA9ICVkIiwgX19mdW5jX18sIHZhbHVlLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTQyMCw3ICs0MjAsNyBAQAogCXN0cnVjdCBwbDIzMDNfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LAorCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LAogCQkJICAgICAgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gY291bnQ7CkBAIC00NDksNyArNDQ5LDcgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIgotCQkJIiBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQkvLyBUT0RPOiByZXNjaGVkdWxlIHBsMjMwM19zZW5kCiAJfQpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY291bnQpOworCWRiZygiJXMgLSBwb3J0ICVkLCAlZCBieXRlcyIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKIAogCWlmICghY291bnQpCiAJCXJldHVybiBjb3VudDsKQEAgLTQ4MywxMyArNDgzLDEzIEBACiAJaW50IHJvb20gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlyb29tID0gcGwyMzAzX2J1Zl9zcGFjZV9hdmFpbChwcml2LT5idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCByb29tKTsKIAlyZXR1cm4gcm9vbTsKIH0KIApAQCAtNDk5LDEzICs0OTksMTMgQEAKIAlpbnQgY2hhcnMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAljaGFycyA9IHBsMjMwM19idWZfZGF0YV9hdmFpbChwcml2LT5idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2hhcnMpOwogCXJldHVybiBjaGFyczsKIH0KIApAQCAtNTIxLDcgKzUyMSw3IEBACiAJaW50IGk7CiAJdTggY29udHJvbDsKIAotCWRiZygiJXMgLSAgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKCFwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkKSB7CkBAIC01NDUsNyArNTQ1LDkgQEAKIAogCWJ1ZiA9IGt6YWxsb2MoNywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19mdW5jX18pOworCQkvKiBSZXBvcnQgYmFjayBubyBjaGFuZ2Ugb2NjdXJyZWQgKi8KKwkJKnBvcnQtPnR0eS0+dGVybWlvcyA9ICpvbGRfdGVybWlvczsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTYzLDExICs1NjUsMTEgQEAKIAkJCWRlZmF1bHQ6CiAJCQljYXNlIENTODoJYnVmWzZdID0gODsJYnJlYWs7CiAJCX0KLQkJZGJnKCIlcyAtIGRhdGEgYml0cyA9ICVkIiwgX19GVU5DVElPTl9fLCBidWZbNl0pOworCQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gJWQiLCBfX2Z1bmNfXywgYnVmWzZdKTsKIAl9CiAKIAliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KTs7Ci0JZGJnKCIlcyAtIGJhdWQgPSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZCk7CisJZGJnKCIlcyAtIGJhdWQgPSAlZCIsIF9fZnVuY19fLCBiYXVkKTsKIAlpZiAoYmF1ZCkgewogCQlidWZbMF0gPSBiYXVkICYgMHhmZjsKIAkJYnVmWzFdID0gKGJhdWQgPj4gOCkgJiAweGZmOwpAQCAtNTgwLDEwICs1ODIsMTAgQEAKIAkvKiBGb3IgcmVmZXJlbmNlIGJ1Zls0XT0yIGlzIDIgc3RvcCBiaXRzICovCiAJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCWJ1Zls0XSA9IDI7Ci0JCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAyIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDIiLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJYnVmWzRdID0gMDsKLQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fZnVuY19fKTsKIAl9CiAKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKQEAgLTU5NCwxNCArNTk2LDE0IEBACiAJCS8qIEZvciByZWZlcmVuY2UgYnVmWzVdPTQgaXMgc3BhY2UgcGFyaXR5ICovCiAJCWlmIChjZmxhZyAmIFBBUk9ERCkgewogCQkJYnVmWzVdID0gMTsKLQkJCWRiZygiJXMgLSBwYXJpdHkgPSBvZGQiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIHBhcml0eSA9IG9kZCIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCWJ1Zls1XSA9IDI7Ci0JCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fZnVuY19fKTsKIAkJfQogCX0gZWxzZSB7CiAJCWJ1Zls1XSA9IDA7Ci0JCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBhcml0eSA9IG5vbmUiLCBfX2Z1bmNfXyk7CiAJfQogCiAJaSA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKQEAgLTY1Nyw3ICs2NTksNyBAQAogCWxvbmcgdGltZW91dDsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiB3YWl0IGZvciBkYXRhIHRvIGRyYWluIGZyb20gdGhlIGJ1ZmZlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC02OTUsNyArNjk3LDcgQEAKIAlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CiAKIAkvKiBzaHV0ZG93biBvdXIgdXJicyAqLwotCWRiZygiJXMgLSBzaHV0dGluZyBkb3duIHVyYnMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzaHV0dGluZyBkb3duIHVyYnMiLCBfX2Z1bmNfXyk7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CkBAIC03MTksNyArNzIxLDcgQEAKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHJlc3VsdDsKIAotCWRiZygiJXMgLSAgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChwcml2LT50eXBlICE9IEhYKSB7CiAJCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT53cml0ZV91cmItPnBpcGUpOwpAQCAtNzM3LDIyICs3MzksMjIgQEAKIAogCS8vRklYTUU6IG5lZWQgdG8gYXNzZXJ0IFJUUyBhbmQgRFRSIGlmIENSVFNDVFMgb2ZmCiAKLQlkYmcoIiVzIC0gc3VibWl0dGluZyByZWFkIHVyYiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIHN1Ym1pdHRpbmcgcmVhZCB1cmIiLCBfX2Z1bmNfXyk7CiAJcG9ydC0+cmVhZF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIgotCQkJIiBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXBsMjMwM19jbG9zZShwb3J0LCBOVUxMKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCi0JZGJnKCIlcyAtIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiwiCi0JCQkiIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkiIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJcGwyMzAzX2Nsb3NlKHBvcnQsIE5VTEwpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CkBAIC03OTIsNyArNzk0LDcgQEAKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAKLQlkYmcoIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAoJWQpIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXVzYl9nZXRfaW50ZmRhdGEocG9ydC0+c2VyaWFsLT5pbnRlcmZhY2UpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTgwOSw3ICs4MTEsNyBAQAogCQkgIHwgKChzdGF0dXMgJiBVQVJUX1JJTkcpCT8gVElPQ01fUkkgIDogMCkKIAkJICB8ICgoc3RhdHVzICYgVUFSVF9EQ0QpCT8gVElPQ01fQ0QgIDogMCk7CiAKLQlkYmcoIiVzIC0gcmVzdWx0ID0gJXgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZGJnKCIlcyAtIHJlc3VsdCA9ICV4IiwgX19mdW5jX18sIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtODUzLDE1ICs4NTUsMTUgQEAKIHN0YXRpYyBpbnQgcGwyMzAzX2lvY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZGJnKCIlcyAoJWQpIGNtZCA9IDB4JTA0eCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgKCVkKSBjbWQgPSAweCUwNHgiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBUSU9DTUlXQUlUOgotCQkJZGJnKCIlcyAoJWQpIFRJT0NNSVdBSVQiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAoJWQpIFRJT0NNSVdBSVQiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCQlyZXR1cm4gd2FpdF9tb2RlbV9pbmZvKHBvcnQsIGFyZyk7CiAKIAkJZGVmYXVsdDoKLQkJCWRiZygiJXMgbm90IHN1cHBvcnRlZCA9IDB4JTA0eCIsIF9fRlVOQ1RJT05fXywgY21kKTsKKwkJCWRiZygiJXMgbm90IHN1cHBvcnRlZCA9IDB4JTA0eCIsIF9fZnVuY19fLCBjbWQpOwogCQkJYnJlYWs7CiAJfQogCkBAIC04NzQsMTkgKzg3NiwxOSBAQAogCXUxNiBzdGF0ZTsKIAlpbnQgcmVzdWx0OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChicmVha19zdGF0ZSA9PSAwKQogCQlzdGF0ZSA9IEJSRUFLX09GRjsKIAllbHNlCiAJCXN0YXRlID0gQlJFQUtfT047Ci0JZGJnKCIlcyAtIHR1cm5pbmcgYnJlYWsgJXMiLCBfX0ZVTkNUSU9OX18sIHN0YXRlPT1CUkVBS19PRkYgPyAib2ZmIiA6ICJvbiIpOworCWRiZygiJXMgLSB0dXJuaW5nIGJyZWFrICVzIiwgX19mdW5jX18sIHN0YXRlPT1CUkVBS19PRkYgPyAib2ZmIiA6ICJvbiIpOwogCiAJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAogCQkJCSBCUkVBS19SRVFVRVNULCBCUkVBS19SRVFVRVNUX1RZUEUsIHN0YXRlLAogCQkJCSAwLCBOVUxMLCAwLCAxMDApOwogCWlmIChyZXN1bHQpCi0JCWRiZygiJXMgLSBlcnJvciBzZW5kaW5nIGJyZWFrID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRiZygiJXMgLSBlcnJvciBzZW5kaW5nIGJyZWFrID0gJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIH0KIAogc3RhdGljIHZvaWQgcGwyMzAzX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCkBAIC04OTQsNyArODk2LDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXY7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0pOwpAQCAtOTQzLDEzICs5NDUsMTMgQEAKIAogc3RhdGljIHZvaWQgcGwyMzAzX3JlYWRfaW50X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl1bnNpZ25lZCBpbnQgYWN0dWFsX2xlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IHJldHZhbDsKIAotCWRiZygiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzICglZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgpAQCAtOTU5LDE2ICs5NjEsMTYgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLAorCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19mdW5jX18sCiAJCSAgICBzdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sCiAJCSAgICBzdGF0dXMpOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywKIAkJCSAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJcGwyMzAzX3VwZGF0ZV9saW5lX3N0YXR1cyhwb3J0LCBkYXRhLCBhY3R1YWxfbGVuZ3RoKTsKQEAgLTk3OCwxMiArOTgwLDEyIEBACiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKIAkJCSIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCV9fZnVuY19fLCByZXR2YWwpOwogfQogCiBzdGF0aWMgdm9pZCBwbDIzMDNfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXN0cnVjdCBwbDIzMDNfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKQEAgLTk5NCwzMiArOTk2LDMyIEBACiAJdTggbGluZV9zdGF0dXM7CiAJY2hhciB0dHlfZmxhZzsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmIgc3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmIgc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCQlkYmcoIiVzIC0gcG9ydCBpcyBjbG9zZWQsIGV4aXRpbmcuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwb3J0IGlzIGNsb3NlZCwgZXhpdGluZy4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJaWYgKHN0YXR1cyA9PSAtRVBST1RPKSB7CiAJCQkvKiBQTDIzMDMgbXlzdGVyaW91c2x5IGZhaWxzIHdpdGggLUVQUk9UTyByZXNjaGVkdWxlCiAJCQkgKiB0aGUgcmVhZCAqLwogCQkJZGJnKCIlcyAtIGNhdWdodCAtRVBST1RPLCByZXN1Ym1pdHRpbmcgdGhlIHVyYiIsCi0JCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCSAgICBfX2Z1bmNfXyk7CiAJCQl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChyZXN1bHQpCiAJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIgogCQkJCQkiIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJZGJnKCIlcyAtIHVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB1bmFibGUgdG8gaGFuZGxlIHRoZSBlcnJvciwgZXhpdGluZy4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCS8qIGdldCB0dHlfZmxhZyBmcm9tIHN0YXR1cyAqLwpAQCAtMTAzOSw3ICsxMDQxLDcgQEAKIAkJdHR5X2ZsYWcgPSBUVFlfUEFSSVRZOwogCWVsc2UgaWYgKGxpbmVfc3RhdHVzICYgVUFSVF9GUkFNRV9FUlJPUikKIAkJdHR5X2ZsYWcgPSBUVFlfRlJBTUU7Ci0JZGJnKCIlcyAtIHR0eV9mbGFnID0gJWQiLCBfX0ZVTkNUSU9OX18sIHR0eV9mbGFnKTsKKwlkYmcoIiVzIC0gdHR5X2ZsYWcgPSAlZCIsIF9fZnVuY19fLCB0dHlfZmxhZyk7CiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKQEAgLTEwNTgsNyArMTA2MCw3IEBACiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpCiAJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIgotCQkJCSIgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJIiByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCX0KIAogCXJldHVybjsKQEAgLTEwNjYsMTIgKzEwNjgsMTIgQEAKIAogc3RhdGljIHZvaWQgcGwyMzAzX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCByZXN1bHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgpAQCAtMTA4MSwyMSArMTA4MywyMSBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKIAkJICAgIHN0YXR1cyk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwotCQlkYmcoIiVzIC0gT3ZlcmZsb3cgaW4gd3JpdGUiLCBfX0ZVTkNUSU9OX18pOwotCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCWRiZygiJXMgLSBPdmVyZmxvdyBpbiB3cml0ZSIsIF9fZnVuY19fKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sCiAJCSAgICBzdGF0dXMpOwogCQlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxOwogCQlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KQogCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSIKLQkJCQkiIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCQkiIHVyYiwgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQllbHNlCiAJCQlyZXR1cm47CiAJfQpAQCAtMTExNCw5ICsxMTE2LDYgQEAKIAl9LAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKIAkudXNiX2RyaXZlciA9IAkJJnBsMjMwM19kcml2ZXIsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLm9wZW4gPQkJCXBsMjMwM19vcGVuLAogCS5jbG9zZSA9CQlwbDIzMDNfY2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2FmZV9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zYWZlX3NlcmlhbC5jCmluZGV4IDRlNmRjYzE5Li45NGJkZGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2FmZV9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2FmZV9zZXJpYWwuYwpAQCAtMTk1LDE4ICsxOTUsMTcgQEAKIAogc3RhdGljIHZvaWQgc2FmZV9yZWFkX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl1bnNpZ25lZCBjaGFyIGxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKLQlpbnQgaTsKIAlpbnQgcmVzdWx0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyNywyOCArMjI2LDIwIEBACiAJaWYgKHNhZmUpIHsKIAkJX191MTYgZmNzOwogCQlpZiAoIShmY3MgPSBmY3NfY29tcHV0ZTEwIChkYXRhLCBsZW5ndGgsIENSQzEwX0lOSVRGQ1MpKSkgewotCiAJCQlpbnQgYWN0dWFsX2xlbmd0aCA9IGRhdGFbbGVuZ3RoIC0gMl0gPj4gMjsKLQogCQkJaWYgKGFjdHVhbF9sZW5ndGggPD0gKGxlbmd0aCAtIDIpKSB7Ci0KLQkJCQlpbmZvICgiJXMgLSBhY3R1YWw6ICVkIiwgX19GVU5DVElPTl9fLCBhY3R1YWxfbGVuZ3RoKTsKLQotCQkJCWZvciAoaSA9IDA7IGkgPCBhY3R1YWxfbGVuZ3RoOyBpKyspIHsKLQkJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIgKHBvcnQtPnR0eSwgZGF0YVtpXSwgMCk7Ci0JCQkJfQorCQkJCWluZm8gKCIlcyAtIGFjdHVhbDogJWQiLCBfX2Z1bmNfXywgYWN0dWFsX2xlbmd0aCk7CisJCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyhwb3J0LT50dHksIGRhdGEsIGFjdHVhbF9sZW5ndGgpOwogCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoIChwb3J0LT50dHkpOwogCQkJfSBlbHNlIHsKLQkJCQllcnIgKCIlcyAtIGluY29uc2lzdGVudCBsZW5ndGhzICVkOiVkIiwgX19GVU5DVElPTl9fLAorCQkJCWVyciAoIiVzIC0gaW5jb25zaXN0ZW50IGxlbmd0aHMgJWQ6JWQiLCBfX2Z1bmNfXywKIAkJCQkgICAgIGFjdHVhbF9sZW5ndGgsIGxlbmd0aCk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQllcnIgKCIlcyAtIGJhZCBDUkMgJXgiLCBfX0ZVTkNUSU9OX18sIGZjcyk7CisJCQllcnIgKCIlcyAtIGJhZCBDUkMgJXgiLCBfX2Z1bmNfXywgZmNzKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIgKHBvcnQtPnR0eSwgZGF0YVtpXSwgMCk7Ci0JCX0KKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyhwb3J0LT50dHksIGRhdGEsIGxlbmd0aCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoIChwb3J0LT50dHkpOwogCX0KIApAQCAtMjU5LDcgKzI1MCw4IEBACiAJCSAgICAgICBzYWZlX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CiAKIAlpZiAoKHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpKSkgewotCQllcnIgKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQllcnIgKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCS8qIEZJWE1FOiBOZWVkIGEgbWVjaGFuaXNtIHRvIHJldHJ5IGxhdGVyIGlmIHRoaXMgaGFwcGVucyAqLwogCX0KIH0KIApAQCAtMjc0LDI1ICsyNjYsMjUgQEAKIAkgICAgIGNvdW50KTsKIAogCWlmICghcG9ydC0+d3JpdGVfdXJiKSB7Ci0JCWRiZyAoIiVzIC0gd3JpdGUgdXJiIE5VTEwiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gKDApOworCQlkYmcgKCIlcyAtIHdyaXRlIHVyYiBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKIAl9CiAKIAlkYmcgKCJzYWZlX3dyaXRlIHdyaXRlX3VyYjogJWQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCIsCiAJICAgICBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCiAJaWYgKCFwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKLQkJZGJnICgiJXMgLSB3cml0ZSB1cmIgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCB6ZXJvIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuICgwKTsKKwkJZGJnICgiJXMgLSB3cml0ZSB1cmIgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCB6ZXJvIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGJnICgiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gKDApOworCQlkYmcgKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CiAJfQogCXNwaW5fbG9ja19iaCgmcG9ydC0+bG9jayk7CiAJaWYgKHBvcnQtPndyaXRlX3VyYl9idXN5KSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZwb3J0LT5sb2NrKTsKLQkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDE7CkBAIC0zMzIsNyArMzI0LDcgQEAKIAkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gY291bnQ7CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgY291bnQsIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKICNpZmRlZiBFQ0hPX1RYCiAJewogCQlpbnQgaTsKQEAgLTM0OSwyOCArMzQxLDMxIEBACiAJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlpZiAoKHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiIChwb3J0LT53cml0ZV91cmIsIEdGUF9LRVJORUwpKSkgewogCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7Ci0JCWVyciAoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZXJyICgiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXJldHVybiAwOwogCX0KLQlkYmcgKCIlcyB1cmI6ICVwIHN1Ym1pdHRlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+d3JpdGVfdXJiKTsKKwlkYmcgKCIlcyB1cmI6ICVwIHN1Ym1pdHRlZCIsIF9fZnVuY19fLCBwb3J0LT53cml0ZV91cmIpOwogCiAJcmV0dXJuIChjb3VudCk7CiB9CiAKIHN0YXRpYyBpbnQgc2FmZV93cml0ZV9yb29tIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCWludCByb29tID0gMDsJCS8vIERlZmF1bHQ6IG5vIHJvb20KKwlpbnQgcm9vbSA9IDA7CQkvKiBEZWZhdWx0OiBubyByb29tICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcgKCIlcyIsIF9fZnVuY19fKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJaWYgKHBvcnQtPndyaXRlX3VyYl9idXN5KQogCQlyb29tID0gcG9ydC0+YnVsa19vdXRfc2l6ZSAtIChzYWZlID8gMiA6IDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChyb29tKSB7CiAJCWRiZyAoInNhZmVfd3JpdGVfcm9vbSByZXR1cm5zICVkIiwgcm9vbSk7CiAJfQogCi0JcmV0dXJuIChyb29tKTsKKwlyZXR1cm4gcm9vbTsKIH0KIAogc3RhdGljIGludCBzYWZlX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCkBAIC0zOTQsOSArMzg5LDYgQEAKIAl9LAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKIAkudXNiX2RyaXZlciA9CQkmc2FmZV9kcml2ZXIsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzID0JCTEsCiAJLndyaXRlID0JCXNhZmVfd3JpdGUsCiAJLndyaXRlX3Jvb20gPQkJc2FmZV93cml0ZV9yb29tLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCmluZGV4IGVkNjc4ODEuLjI5MDc0YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICBVU0IgRHJpdmVyIGZvciBTaWVycmEgV2lyZWxlc3MKIAotICBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggIEtldmluIExsb3lkIDxsaW51eEBzaWVycmF3aXJlbGVzcy5jb20+CisgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCAgS2V2aW4gTGxveWQgPGtsbG95ZEBzaWVycmF3aXJlbGVzcy5jb20+CiAKICAgSU1QT1JUQU5UIERJU0NMQUlNRVI6IFRoaXMgZHJpdmVyIGlzIG5vdCBjb21tZXJjaWFsbHkgc3VwcG9ydGVkIGJ5CiAgIFNpZXJyYSBXaXJlbGVzcy4gVXNlIGF0IHlvdXIgb3duIHJpc2suCkBAIC0xNCw4ICsxNCw4IEBACiAgIFdob20gYmFzZWQgaGlzIG9uIHRoZSBLZXlzcGFuIGRyaXZlciBieSBIdWdoIEJsZW1pbmdzIDxodWdoQGJsZW1pbmdzLm9yZz4KICovCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYuMS4yLjgiCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIktldmluIExsb3lkIDxsaW51eEBzaWVycmF3aXJlbGVzcy5jb20+IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidi4xLjIuOWMiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIktldmluIExsb3lkIDxrbGxveWRAc2llcnJhd2lyZWxlc3MuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBEcml2ZXIgZm9yIFNpZXJyYSBXaXJlbGVzcyBVU0IgbW9kZW1zIgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMSw3ICszMSw2IEBACiAjZGVmaW5lIFNXSU1TX1VTQl9SRVFVRVNUX1NldFBvd2VyCTB4MDAKICNkZWZpbmUgU1dJTVNfVVNCX1JFUVVFU1RfU2V0Tm1lYQkweDA3CiAjZGVmaW5lIFNXSU1TX1VTQl9SRVFVRVNUX1NldE1vZGUJMHgwQgotI2RlZmluZSBTV0lNU19VU0JfUkVRVUVTVF9UWVBFX1ZTQ19TRVQJMHg0MAogI2RlZmluZSBTV0lNU19TRVRfTU9ERV9Nb2RlbQkJMHgwMDAxCiAKIC8qIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLwpAQCAtNTUsNyArNTQsNyBAQAogCWRldl9kYmcoJnVkZXYtPmRldiwgIiVzIiwgIlNFVCBQT1dFUiBTVEFURVxuIik7CiAJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKIAkJCVNXSU1TX1VTQl9SRVFVRVNUX1NldFBvd2VyLAkvKiBfX3U4IHJlcXVlc3QgICAgICAqLwotCQkJU1dJTVNfVVNCX1JFUVVFU1RfVFlQRV9WU0NfU0VULAkvKiBfX3U4IHJlcXVlc3QgdHlwZSAqLworCQkJVVNCX1RZUEVfVkVORE9SLAkJLyogX191OCByZXF1ZXN0IHR5cGUgKi8KIAkJCXN3aVN0YXRlLAkJCS8qIF9fdTE2IHZhbHVlICAgICAgICovCiAJCQkwLAkJCQkvKiBfX3UxNiBpbmRleCAgICAgICAqLwogCQkJTlVMTCwJCQkJLyogdm9pZCAqZGF0YSAgICAgICAgKi8KQEAgLTcwLDcgKzY5LDcgQEAKIAlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlcyIsICJERVZJQ0UgTU9ERSBTV0lUQ0hcbiIpOwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCiAJCQlTV0lNU19VU0JfUkVRVUVTVF9TZXRNb2RlLAkvKiBfX3U4IHJlcXVlc3QgICAgICAqLwotCQkJU1dJTVNfVVNCX1JFUVVFU1RfVFlQRV9WU0NfU0VULAkvKiBfX3U4IHJlcXVlc3QgdHlwZSAqLworCQkJVVNCX1RZUEVfVkVORE9SLAkJLyogX191OCByZXF1ZXN0IHR5cGUgKi8KIAkJCWVTV29jTW9kZSwJCQkvKiBfX3UxNiB2YWx1ZSAgICAgICAqLwogCQkJMHgwMDAwLAkJCQkvKiBfX3UxNiBpbmRleCAgICAgICAqLwogCQkJTlVMTCwJCQkJLyogdm9pZCAqZGF0YSAgICAgICAgKi8KQEAgLTg1LDcgKzg0LDcgQEAKIAlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlcyIsICJOTUVBIEVuYWJsZSBzZW50XG4iKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAogCQkJU1dJTVNfVVNCX1JFUVVFU1RfU2V0Tm1lYSwJLyogX191OCByZXF1ZXN0ICAgICAgKi8KLQkJCVNXSU1TX1VTQl9SRVFVRVNUX1RZUEVfVlNDX1NFVCwJLyogX191OCByZXF1ZXN0IHR5cGUgKi8KKwkJCVVTQl9UWVBFX1ZFTkRPUiwJCS8qIF9fdTggcmVxdWVzdCB0eXBlICovCiAJCQllbmFibGUsCQkJCS8qIF9fdTE2IHZhbHVlICAgICAgICovCiAJCQkweDAwMDAsCQkJCS8qIF9fdTE2IGluZGV4ICAgICAgICovCiAJCQlOVUxMLAkJCQkvKiB2b2lkICpkYXRhICAgICAgICAqLwpAQCAtMTA5LDYgKzEwOCwyNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgc2llcnJhX2NhbGNfaW50ZXJmYWNlKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJCWludCBpbnRlcmZhY2U7CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpwX2ludGVyZmFjZTsKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqcF9ob3N0X2ludGVyZmFjZTsKKworCQkvKiBHZXQgdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgcG9pbnRlciBmcm9tIHRoZSBzZXJpYWwgc3RydWN0ICovCisJCXBfaW50ZXJmYWNlID0gc2VyaWFsLT5pbnRlcmZhY2U7CisKKwkJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgaG9zdCBpbnRlcmZhY2Ugc3RydWN0dXJlICovCisJCXBfaG9zdF9pbnRlcmZhY2UgPSBwX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisKKwkJLyogcmVhZCB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgZm9yIHRoaXMgYWN0aXZlIGFsdHNldHRpbmcKKwkJICogdG8gZmluZCBvdXQgdGhlIGludGVyZmFjZSBudW1iZXIgd2UgYXJlIG9uCisJCSovCisJCWludGVyZmFjZSA9IHBfaG9zdF9pbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKworCQlyZXR1cm4gaW50ZXJmYWNlOworfQorCiBzdGF0aWMgaW50IHNpZXJyYV9wcm9iZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLAogCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewpAQCAtMTI0LDYgKzE0MywyMiBAQAogCWlmbnVtID0gc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAJdWRldiA9IHNlcmlhbC0+ZGV2OwogCisJCS8qIEZpZ3VyZSBvdXQgdGhlIGludGVyZmFjZSBudW1iZXIgZnJvbSB0aGUgc2VyaWFsIHN0cnVjdHVyZSAqLworCQlpZm51bSA9IHNpZXJyYV9jYWxjX2ludGVyZmFjZShzZXJpYWwpOworCisJCS8qCisJCSAqIElmIHRoaXMgaW50ZXJmYWNlIHN1cHBvcnRzIG1vcmUgdGhhbiAxIGFsdGVybmF0ZQorCQkgKiBzZWxlY3QgdGhlIDJuZCBvbmUKKwkJICovCisJCWlmIChzZXJpYWwtPmludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcgPT0gMikgeworCQkJZGV2X2RiZygmdWRldi0+ZGV2LAorCQkJCSJTZWxlY3RpbmcgYWx0IHNldHRpbmcgZm9yIGludGVyZmFjZSAlZFxuIiwKKwkJCQlpZm51bSk7CisKKwkJCS8qIFdlIGtub3cgdGhlIGFsdGVybmF0ZSBzZXR0aW5nIGlzIDEgZm9yIHRoZSBNQzg3ODUgKi8KKwkJCXVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGlmbnVtLCAxKTsKKwkJfQorCiAJLyogQ2hlY2sgaWYgaW4gaW5zdGFsbGVyIG1vZGUgKi8KIAlpZiAodHJ1aW5zdGFsbCAmJiBpZC0+ZHJpdmVyX2luZm8gPT0gREVWSUNFX0lOU1RBTExFUikgewogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlcyIsICJGT1VORCBUUlUtSU5TVEFMTCBERVZJQ0UoU1cpXG4iKTsKQEAgLTE1Niw3ICsxOTEsNyBAQAogCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxOSkgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTk1ICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMDIxKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA1OTdFICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMTIwKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgVVNCIERvbmdsZSA1OTVVICovCi0JeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMDIzKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCAqLworCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgxMTk5LCAweDAwMjMsIDB4RkYsIDB4RkYsIDB4RkYpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBDNTk3ICovCiAKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MDIpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3NTUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MDQpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3NTUgKi8KQEAgLTE2NCwxNSArMTk5LDIwIEBACiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODEyKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzc1ICYgQUMgODc1VSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgxMykgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc3NSAoVGhpbmtwYWQgaW50ZXJuYWwpICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODE1KSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzc1ICovCisJeyBVU0JfREVWSUNFKDB4MDNmMCwgMHgxZTFkKSB9LAkvKiBIUCBoczIzMDAgYS5rLmEgTUM4Nzc1ICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODIwKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4NzUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MjEpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg3NVUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MzIpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3ODAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgzMykgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc4MSovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODNCKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFXzFfUE9SVCB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzg1IENvbXBvc2l0ZSovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODUwKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4ODAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4NTEpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg4MSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4Njg1MikgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgODgwIEUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4NTMpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg4MSBFICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODU1KSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4ODAgVSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4Njg1NikgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgODgxIFUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4NTkpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfMV9QT1JUIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg4NSBFICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODVBKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFXzFfUE9SVCB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4ODUgRSAqLwogCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2NDY4KSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgTVAzRyAtIEVWRE8gKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY0NjkpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBNUDNHIC0gVU1UUy9IU1BBICovCkBAIC0yMTYsNyArMjU2LDcgQEAKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJX191MTYgaW50ZXJmYWNlID0gMDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIApAQCAtMjQ2LDI0ICsyODYsMjQgQEAKIAogc3RhdGljIHZvaWQgc2llcnJhX3J4X3Rocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgc2llcnJhX3J4X3VudGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZCBzaWVycmFfYnJlYWtfY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKIHsKIAkvKiBVbmZvcnR1bmF0ZWx5LCBJIGRvbid0IGtub3cgaG93IHRvIHNlbmQgYSBicmVhayAqLwotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNpZXJyYV9zZXRfdGVybWlvcyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCXR0eV90ZXJtaW9zX2NvcHlfaHcocG9ydC0+dHR5LT50ZXJtaW9zLCBvbGRfdGVybWlvcyk7CiAJc2llcnJhX3NlbmRfc2V0dXAocG9ydCk7CiB9CkBAIC0zMTcsMTQgKzM1NywxNCBAQAogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIGZyZWUgdXAgdGhlIHRyYW5zZmVyIGJ1ZmZlciwgYXMgdXNiX2ZyZWVfdXJiKCkgZG9lcyBub3QgZG8gdGhpcyAqLwogCWtmcmVlKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCWlmIChzdGF0dXMpCiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwogCS0tcG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnM7CkBAIC0zNDYsMTIgKzM4NiwxMiBAQAogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlkYmcoIiVzOiB3cml0ZSAoJWQgY2hhcnMpIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJZGJnKCIlczogd3JpdGUgKCVkIGNoYXJzKSIsIF9fZnVuY19fLCBjb3VudCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKIAlpZiAocG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMgPiBOX09VVF9VUkIpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKLQkJZGJnKCIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJcG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMrKzsKQEAgLTM3Myw3ICs0MTMsNyBAQAogCiAJbWVtY3B5KGJ1ZmZlciwgYnVmLCBjb3VudCk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ1ZmZlcik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgY291bnQsIGJ1ZmZlcik7CiAKIAl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlcmlhbC0+ZGV2LAogCQkJICB1c2Jfc25kYnVsa3BpcGUoc2VyaWFsLT5kZXYsCkBAIC0zODQsNyArNDI0LDcgQEAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgIgotCQkJIndpdGggc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCSJ3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJY291bnQgPSBzdGF0dXM7CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtNDE0LDE0ICs0NTQsMTQgQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlczogJXAiLCBfX0ZVTkNUSU9OX18sIHVyYik7CisJZGJnKCIlczogJXAiLCBfX2Z1bmNfXywgdXJiKTsKIAogCWVuZHBvaW50ID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOwotCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJcG9ydCA9ICB1cmItPmNvbnRleHQ7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXM6IG5vbnplcm8gc3RhdHVzOiAlZCBvbiBlbmRwb2ludCAlMDJ4LiIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cywgZW5kcG9pbnQpOworCQkgICAgX19mdW5jX18sIHN0YXR1cywgZW5kcG9pbnQpOwogCX0gZWxzZSB7CiAJCXR0eSA9IHBvcnQtPnR0eTsKIAkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtNDI5LDcgKzQ2OSw3IEBACiAJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCX0gZWxzZSB7Ci0JCQlkYmcoIiVzOiBlbXB0eSByZWFkIHVyYiByZWNlaXZlZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzOiBlbXB0eSByZWFkIHVyYiByZWNlaXZlZCIsIF9fZnVuY19fKTsKIAkJfQogCiAJCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KQEAgLTQ0NywxOSArNDg3LDE5IEBACiB7CiAJaW50IGVycjsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gIHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwotCWRiZygiJXM6IHVyYiAlcCBwb3J0ICVwIGhhcyBkYXRhICVwIiwgX19GVU5DVElPTl9fLHVyYixwb3J0LHBvcnRkYXRhKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOworCWRiZygiJXM6IHVyYiAlcCBwb3J0ICVwIGhhcyBkYXRhICVwIiwgX19mdW5jX18sIHVyYiwgcG9ydCwgcG9ydGRhdGEpOwogCiAJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcV9wa3QgPQogCQkJCShzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKIAkJaWYgKCFyZXFfcGt0KSB7Ci0JCQlkYmcoIiVzOiBOVUxMIHJlcV9wa3RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkYmcoIiVzOiBOVUxMIHJlcV9wa3RcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCQlpZiAoKHJlcV9wa3QtPmJSZXF1ZXN0VHlwZSA9PSAweEExKSAmJgpAQCAtNDY5LDcgKzUwOSw3IEBACiAJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyICsKIAkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpKTsKIAotCQkJZGJnKCIlczogc2lnbmFsIHgleCIsIF9fRlVOQ1RJT05fXywgc2lnbmFscyk7CisJCQlkYmcoIiVzOiBzaWduYWwgeCV4IiwgX19mdW5jX18sIHNpZ25hbHMpOwogCiAJCQlvbGRfZGNkX3N0YXRlID0gcG9ydGRhdGEtPmRjZF9zdGF0ZTsKIAkJCXBvcnRkYXRhLT5jdHNfc3RhdGUgPSAxOwpAQCAtNDgxLDExICs1MjEsMTEgQEAKIAkJCQkJb2xkX2RjZF9zdGF0ZSAmJiAhcG9ydGRhdGEtPmRjZF9zdGF0ZSkKIAkJCQl0dHlfaGFuZ3VwKHBvcnQtPnR0eSk7CiAJCX0gZWxzZSB7Ci0JCQlkYmcoIiVzOiB0eXBlICV4IHJlcSAleCIsIF9fRlVOQ1RJT05fXywKLQkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUscmVxX3BrdC0+YlJlcXVlc3QpOworCQkJZGJnKCIlczogdHlwZSAleCByZXEgJXgiLCBfX2Z1bmNfXywKKwkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUsIHJlcV9wa3QtPmJSZXF1ZXN0KTsKIAkJfQogCX0gZWxzZQotCQlkYmcoIiVzOiBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlczogZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAogCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgSVJRIGRhdGEgKi8KIAlpZiAoc3RhdHVzICE9IC1FU0hVVERPV04pIHsKQEAgLTQ5Myw3ICs1MzMsNyBAQAogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyKQogCQkJZGJnKCIlczogcmVzdWJtaXQgaW50ciB1cmIgZmFpbGVkLiAoJWQpIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJX19mdW5jX18sIGVycik7CiAJfQogfQogCkBAIC01MDIsMTQgKzU0MiwxNCBAQAogCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qIHRyeSB0byBnaXZlIGEgZ29vZCBudW1iZXIgYmFjayBiYXNlZCBvbiBpZiB3ZSBoYXZlIGFueSBmcmVlIHVyYnMgYXQKIAkgKiB0aGlzIHBvaW50IGluIHRpbWUgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKIAlpZiAocG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMgPiBOX09VVF9VUkIgKiAyIC8gMykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwotCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwpAQCAtNTE5LDEzICs1NTksMTUgQEAKIAogc3RhdGljIGludCBzaWVycmFfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCS8qCiAJICogV2UgY2FuJ3QgcmVhbGx5IGFjY291bnQgZm9yIGhvdyBtdWNoIGRhdGEgd2UKIAkgKiBoYXZlIHNlbnQgb3V0LCBidXQgaGFzbid0IG1hZGUgaXQgdGhyb3VnaCB0byB0aGUKIAkgKiBkZXZpY2UgYXMgd2UgY2FuJ3Qgc2VlIHRoZSBiYWNrZW5kIGhlcmUsIHNvIGp1c3QKIAkgKiB0ZWxsIHRoZSB0dHkgbGF5ZXIgdGhhdCBldmVyeXRoaW5nIGlzIGZsdXNoZWQuCisJICoKKwkgKiBGSVhNRTogc2hvdWxkIHdhbGsgdGhlIG91dHN0YW5kaW5nIHVyYnMgaW5mbwogCSAqLwogCXJldHVybiAwOwogfQpAQCAtNTQwLDcgKzU4Miw3IEBACiAKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAkvKiBTZXQgc29tZSBzYW5lIGRlZmF1bHRzICovCiAJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDE7CkBAIC01NTIsNyArNTk0LDcgQEAKIAkJaWYgKCF1cmIpCiAJCQljb250aW51ZTsKIAkJaWYgKHVyYi0+ZGV2ICE9IHNlcmlhbC0+ZGV2KSB7Ci0JCQlkYmcoIiVzOiBkZXYgJXAgIT0gJXAiLCBfX0ZVTkNUSU9OX18sCisJCQlkYmcoIiVzOiBkZXYgJXAgIT0gJXAiLCBfX2Z1bmNfXywKIAkJCQl1cmItPmRldiwgc2VyaWFsLT5kZXYpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTU5MCw3ICs2MzIsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAwOwpAQCAtNjIwLDcgKzY2Miw3IEBACiAJaW50IGk7CiAJaW50IGo7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogU2V0IERldmljZSBtb2RlIHRvIEQwICovCiAJc2llcnJhX3NldF9wb3dlcl9zdGF0ZShzZXJpYWwtPmRldiwgMHgwMDAwKTsKQEAgLTYzNSw3ICs2NzcsNyBAQAogCQlwb3J0ZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwb3J0ZGF0YSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvcnRkYXRhKSB7CiAJCQlkYmcoIiVzOiBrbWFsbG9jIGZvciBzaWVycmFfcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIS4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIGkpOworCQkJCQlfX2Z1bmNfXywgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzcGluX2xvY2tfaW5pdCgmcG9ydGRhdGEtPmxvY2spOwpAQCAtNjU2LDcgKzY5OCw3IEBACiAJCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQkJaWYgKHVyYiA9PSBOVUxMKSB7CiAJCQkJZGJnKCIlczogYWxsb2MgZm9yIGluIHBvcnQgZmFpbGVkLiIsCi0JCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJICAgIF9fZnVuY19fKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCS8qIEZpbGwgVVJCIHVzaW5nIHN1cHBsaWVkIGRhdGEuICovCkBAIC02NzgsNyArNzIwLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwpAQCAtNzA2LDkgKzc0OCw2IEBACiAJLmRlc2NyaXB0aW9uICAgICAgID0gIlNpZXJyYSBVU0IgbW9kZW0iLAogCS5pZF90YWJsZSAgICAgICAgICA9IGlkX3RhYmxlLAogCS51c2JfZHJpdmVyICAgICAgICA9ICZzaWVycmFfZHJpdmVyLAotCS5udW1faW50ZXJydXB0X2luICA9IE5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luICAgICAgID0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ICAgICAgPSBOVU1fRE9OVF9DQVJFLAogCS5jYWxjX251bV9wb3J0cwkgICA9IHNpZXJyYV9jYWxjX251bV9wb3J0cywKIAkucHJvYmUJCSAgID0gc2llcnJhX3Byb2JlLAogCS5vcGVuICAgICAgICAgICAgICA9IHNpZXJyYV9vcGVuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4MmQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKQEAgLTAsMCArMSwxMDcyIEBACisvKgorICogc3BjcDh4NSBVU0IgdG8gc2VyaWFsIGFkYXB0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExpbnhiICh4dWJpbi5saW5Ad29ybGRwbHVzLmNvbS5jbikKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTMSBDb3JwLgorICoKKyAqIE9yaWdpbmFsIGRyaXZlciBmb3IgMi42LjEwIHBsMjMwMyBkcml2ZXIgYnkKKyAqICAgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKKyAqIENoYW5nZXMgZm9yIDIuNi4yMCBieSBIYXJhbGQgS2xlaW4gPGhhcmlAdnQxMDAuYXQ+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgorCisKKy8qIFZlcnNpb24gSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gCSJ2MC4wNCIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgCSJTUENQOHg1IFVTQiB0byBzZXJpYWwgYWRhcHRvciBkcml2ZXIiCisKK3N0YXRpYyBpbnQgZGVidWc7CisKKyNkZWZpbmUgU1BDUDh4NV8wMDdfVklECQkweDA0RkMKKyNkZWZpbmUgU1BDUDh4NV8wMDdfUElECQkweDAyMDEKKyNkZWZpbmUgU1BDUDh4NV8wMDhfVklECQkweDA0ZmMKKyNkZWZpbmUgU1BDUDh4NV8wMDhfUElECQkweDAyMzUKKyNkZWZpbmUgU1BDUDh4NV9QSElMSVBTX1ZJRAkweDA0NzEKKyNkZWZpbmUgU1BDUDh4NV9QSElMSVBTX1BJRAkweDA4MWUKKyNkZWZpbmUgU1BDUDh4NV9JTlRFUk1BVElDX1ZJRAkweDA0RkMKKyNkZWZpbmUgU1BDUDh4NV9JTlRFUk1BVElDX1BJRAkweDAyMDQKKyNkZWZpbmUgU1BDUDh4NV84MzVfVklECQkweDA0ZmMKKyNkZWZpbmUgU1BDUDh4NV84MzVfUElECQkweDAyMzEKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShTUENQOHg1X1BISUxJUFNfVklEICwgU1BDUDh4NV9QSElMSVBTX1BJRCl9LAorCXsgVVNCX0RFVklDRShTUENQOHg1X0lOVEVSTUFUSUNfVklELCBTUENQOHg1X0lOVEVSTUFUSUNfUElEKX0sCisJeyBVU0JfREVWSUNFKFNQQ1A4eDVfODM1X1ZJRCwgU1BDUDh4NV84MzVfUElEKX0sCisJeyBVU0JfREVWSUNFKFNQQ1A4eDVfMDA4X1ZJRCwgU1BDUDh4NV8wMDhfUElEKX0sCisJeyBVU0JfREVWSUNFKFNQQ1A4eDVfMDA3X1ZJRCwgU1BDUDh4NV8wMDdfUElEKX0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CisKK3N0cnVjdCBzcGNwOHg1X3VzYl9jdHJsX2FyZyB7CisJdTggCXR5cGU7CisJdTgJY21kOworCXU4CWNtZF90eXBlOworCXUxNgl2YWx1ZTsKKwl1MTYJaW5kZXg7CisJdTE2CWxlbmd0aDsKK307CisKKy8qIHdhaXQgMzBzIGJlZm9yZSBjbG9zZSAqLworI2RlZmluZSBTUENQOHg1X0NMT1NJTkdfV0FJVAkoMzAqSFopCisKKyNkZWZpbmUgU1BDUDh4NV9CVUZfU0laRQkxMDI0CisKKworLyogc3BjcDh4NSBzcGVjIHJlZ2lzdGVyIGRlZmluZSAqLworI2RlZmluZSBNQ1JfQ09OVFJPTF9MSU5FX1JUUwkJMHgwMgorI2RlZmluZSBNQ1JfQ09OVFJPTF9MSU5FX0RUUgkJMHgwMQorI2RlZmluZSBNQ1JfRFRSCQkJCTB4MDEKKyNkZWZpbmUgTUNSX1JUUwkJCQkweDAyCisKKyNkZWZpbmUgTVNSX1NUQVRVU19MSU5FX0RDRAkJMHg4MAorI2RlZmluZSBNU1JfU1RBVFVTX0xJTkVfUkkJCTB4NDAKKyNkZWZpbmUgTVNSX1NUQVRVU19MSU5FX0RTUgkJMHgyMAorI2RlZmluZSBNU1JfU1RBVFVTX0xJTkVfQ1RTCQkweDEwCisKKy8qIHZlcmRvciBjb21tYW5kIGhlcmUgLCB3ZSBzaG91bGQgZGVmaW5lIG15c2VsZiAqLworI2RlZmluZSBTRVRfREVGQVVMVAkJCTB4NDAKKyNkZWZpbmUgU0VUX0RFRkFVTFRfVFlQRQkJMHgyMAorCisjZGVmaW5lIFNFVF9VQVJUX0ZPUk1BVAkJCTB4NDAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1RZUEUJCTB4MjEKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1NJWkVfNQkJMHgwMAorI2RlZmluZSBTRVRfVUFSVF9GT1JNQVRfU0laRV82CQkweDAxCisjZGVmaW5lIFNFVF9VQVJUX0ZPUk1BVF9TSVpFXzcJCTB4MDIKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1NJWkVfOAkJMHgwMworI2RlZmluZSBTRVRfVUFSVF9GT1JNQVRfU1RPUF8xCQkweDAwCisjZGVmaW5lIFNFVF9VQVJUX0ZPUk1BVF9TVE9QXzIJCTB4MDQKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9OT05FCTB4MDAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9PREQJCTB4MTAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9FVkVOCTB4MzAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9NQVNLCTB4RDAKKyNkZWZpbmUgU0VUX1VBUlRfRk9STUFUX1BBUl9TUEFDRQkweDkwCisKKyNkZWZpbmUgR0VUX1VBUlRfU1RBVFVTX1RZUEUJCTB4YzAKKyNkZWZpbmUgR0VUX1VBUlRfU1RBVFVTCQkJMHgyMgorI2RlZmluZSBHRVRfVUFSVF9TVEFUVVNfTVNSCQkweDA2CisKKyNkZWZpbmUgU0VUX1VBUlRfU1RBVFVTCQkJMHg0MAorI2RlZmluZSBTRVRfVUFSVF9TVEFUVVNfVFlQRQkJMHgyMworI2RlZmluZSBTRVRfVUFSVF9TVEFUVVNfTUNSCQkweDAwMDQKKyNkZWZpbmUgU0VUX1VBUlRfU1RBVFVTX01DUl9EVFIJCTB4MDEKKyNkZWZpbmUgU0VUX1VBUlRfU1RBVFVTX01DUl9SVFMJCTB4MDIKKyNkZWZpbmUgU0VUX1VBUlRfU1RBVFVTX01DUl9MT09QCTB4MTAKKworI2RlZmluZSBTRVRfV09SS0lOR19NT0RFCQkweDQwCisjZGVmaW5lIFNFVF9XT1JLSU5HX01PREVfVFlQRQkJMHgyNAorI2RlZmluZSBTRVRfV09SS0lOR19NT0RFX1UyQwkJMHgwMAorI2RlZmluZSBTRVRfV09SS0lOR19NT0RFX1JTNDg1CQkweDAxCisjZGVmaW5lIFNFVF9XT1JLSU5HX01PREVfUERNQQkJMHgwMgorI2RlZmluZSBTRVRfV09SS0lOR19NT0RFX1NQUAkJMHgwMworCisjZGVmaW5lIFNFVF9GTE9XQ1RMX0NIQVIJCTB4NDAKKyNkZWZpbmUgU0VUX0ZMT1dDVExfQ0hBUl9UWVBFCQkweDI1CisKKyNkZWZpbmUgR0VUX1ZFUlNJT04JCQkweGMwCisjZGVmaW5lIEdFVF9WRVJTSU9OX1RZUEUJCTB4MjYKKworI2RlZmluZSBTRVRfUkVHSVNURVIJCQkweDQwCisjZGVmaW5lIFNFVF9SRUdJU1RFUl9UWVBFCQkweDI3CisKKyNkZWZpbmUJR0VUX1JFR0lTVEVSCQkJMHhjMAorI2RlZmluZSBHRVRfUkVHSVNURVJfVFlQRQkJMHgyOAorCisjZGVmaW5lIFNFVF9SQU0JCQkJMHg0MAorI2RlZmluZSBTRVRfUkFNX1RZUEUJCQkweDMxCisKKyNkZWZpbmUgR0VUX1JBTQkJCQkweGMwCisjZGVmaW5lIEdFVF9SQU1fVFlQRQkJCTB4MzIKKworLyogaG93IGNvbWUgPz8/ICovCisjZGVmaW5lIFVBUlRfU1RBVEUJCQkweDA4CisjZGVmaW5lIFVBUlRfU1RBVEVfVFJBTlNJRU5UX01BU0sJMHg3NAorI2RlZmluZSBVQVJUX0RDRAkJCTB4MDEKKyNkZWZpbmUgVUFSVF9EU1IJCQkweDAyCisjZGVmaW5lIFVBUlRfQlJFQUtfRVJST1IJCTB4MDQKKyNkZWZpbmUgVUFSVF9SSU5HCQkJMHgwOAorI2RlZmluZSBVQVJUX0ZSQU1FX0VSUk9SCQkweDEwCisjZGVmaW5lIFVBUlRfUEFSSVRZX0VSUk9SCQkweDIwCisjZGVmaW5lIFVBUlRfT1ZFUlJVTl9FUlJPUgkJMHg0MAorI2RlZmluZSBVQVJUX0NUUwkJCTB4ODAKKworZW51bSBzcGNwOHg1X3R5cGUgeworCVNQQ1A4MjVfMDA3X1RZUEUsCisJU1BDUDgyNV8wMDhfVFlQRSwKKwlTUENQODI1X1BISUxJUF9UWVBFLAorCVNQQ1A4MjVfSU5URVJNQVRJQ19UWVBFLAorCVNQQ1A4MzVfVFlQRSwKK307CisKKy8qIDFzdCBpbiAxc3Qgb3V0IGJ1ZmZlciA0IGRyaXZlciAqLworc3RydWN0IHJpbmdidWYgeworCXVuc2lnbmVkIGludAlidWZfc2l6ZTsKKwljaGFyCQkqYnVmX2J1ZjsKKwljaGFyCQkqYnVmX2dldDsKKwljaGFyCQkqYnVmX3B1dDsKK307CisKKy8qIGFsbG9jIHRoZSByaW5nIGJ1ZiBhbmQgYWxsb2MgdGhlIGJ1ZmZlciBpdHNlbGYgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpbmdidWYgKmFsbG9jX3JpbmdidWYodW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHJpbmdidWYgKnBiOworCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYiA9IGttYWxsb2Moc2l6ZW9mKCpwYiksIEdGUF9LRVJORUwpOworCWlmIChwYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBiLT5idWZfYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocGItPmJ1Zl9idWYgPT0gTlVMTCkgeworCQlrZnJlZShwYik7CisJCXJldHVybiBOVUxMOworCX0KKworCXBiLT5idWZfc2l6ZSA9IHNpemU7CisJcGItPmJ1Zl9nZXQgPSBwYi0+YnVmX3B1dCA9IHBiLT5idWZfYnVmOworCisJcmV0dXJuIHBiOworfQorCisvKiBmcmVlIHRoZSByaW5nIGJ1ZiBhbmQgdGhlIGJ1ZmZlciBpdHNlbGYgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3JpbmdidWYoc3RydWN0IHJpbmdidWYgKnBiKQoreworCWlmIChwYiAhPSBOVUxMKSB7CisJCWtmcmVlKHBiLT5idWZfYnVmKTsKKwkJa2ZyZWUocGIpOworCX0KK30KKworLyogY2xlYXIgcGlwbyAsIGp1ZXN0IHJlcG9pbnQgdGhlIHBvaW50ZXIgaGVyZSAqLworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3JpbmdidWYoc3RydWN0IHJpbmdidWYgKnBiKQoreworCWlmIChwYiAhPSBOVUxMKQorCQlwYi0+YnVmX2dldCA9IHBiLT5idWZfcHV0OworfQorCisvKiBnZXQgdGhlIG51bWJlciBvZiBkYXRhIGluIHRoZSBwaXBvICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByaW5nYnVmX2F2YWlsX2RhdGEoc3RydWN0IHJpbmdidWYgKnBiKQoreworCWlmIChwYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKChwYi0+YnVmX3NpemUgKyBwYi0+YnVmX3B1dCAtIHBiLT5idWZfZ2V0KSAlIHBiLT5idWZfc2l6ZSk7Cit9CisKKy8qIGdldCB0aGUgbnVtYmVyIG9mIHNwYWNlIGluIHRoZSBwaXBvICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByaW5nYnVmX2F2YWlsX3NwYWNlKHN0cnVjdCByaW5nYnVmICpwYikKK3sKKwlpZiAocGIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICgocGItPmJ1Zl9zaXplICsgcGItPmJ1Zl9nZXQgLSBwYi0+YnVmX3B1dCAtIDEpICUgcGItPmJ1Zl9zaXplKTsKK30KKworLyogcHV0IGNvdW50IGRhdGEgaW50byBwaXBvICovCitzdGF0aWMgdW5zaWduZWQgaW50IHB1dF9yaW5nYnVmKHN0cnVjdCByaW5nYnVmICpwYiwgY29uc3QgY2hhciAqYnVmLAorCQkJCXVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKHBiID09IE5VTEwpCisJCXJldHVybiAwOworCisJbGVuICA9IHJpbmdidWZfYXZhaWxfc3BhY2UocGIpOworCWlmIChjb3VudCA+IGxlbikKKwkJY291bnQgPSBsZW47CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBwYi0+YnVmX2J1ZiArIHBiLT5idWZfc2l6ZSAtIHBiLT5idWZfcHV0OworCWlmIChjb3VudCA+IGxlbikgeworCQltZW1jcHkocGItPmJ1Zl9wdXQsIGJ1ZiwgbGVuKTsKKwkJbWVtY3B5KHBiLT5idWZfYnVmLCBidWYrbGVuLCBjb3VudCAtIGxlbik7CisJCXBiLT5idWZfcHV0ID0gcGItPmJ1Zl9idWYgKyBjb3VudCAtIGxlbjsKKwl9IGVsc2UgeworCQltZW1jcHkocGItPmJ1Zl9wdXQsIGJ1ZiwgY291bnQpOworCQlpZiAoY291bnQgPCBsZW4pCisJCQlwYi0+YnVmX3B1dCArPSBjb3VudDsKKwkJZWxzZSAvKiBjb3VudCA9PSBsZW4gKi8KKwkJCXBiLT5idWZfcHV0ID0gcGItPmJ1Zl9idWY7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyogZ2V0IGNvdW50IGRhdGEgZnJvbSBwaXBvICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9yaW5nYnVmKHN0cnVjdCByaW5nYnVmICpwYiwgY2hhciAqYnVmLAorCQkJCXVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKHBiID09IE5VTEwgfHwgYnVmID09IE5VTEwpCisJCXJldHVybiAwOworCisJbGVuID0gcmluZ2J1Zl9hdmFpbF9kYXRhKHBiKTsKKwlpZiAoY291bnQgPiBsZW4pCisJCWNvdW50ID0gbGVuOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJbGVuID0gcGItPmJ1Zl9idWYgKyBwYi0+YnVmX3NpemUgLSBwYi0+YnVmX2dldDsKKwlpZiAoY291bnQgPiBsZW4pIHsKKwkJbWVtY3B5KGJ1ZiwgcGItPmJ1Zl9nZXQsIGxlbik7CisJCW1lbWNweShidWYrbGVuLCBwYi0+YnVmX2J1ZiwgY291bnQgLSBsZW4pOworCQlwYi0+YnVmX2dldCA9IHBiLT5idWZfYnVmICsgY291bnQgLSBsZW47CisJfSBlbHNlIHsKKwkJbWVtY3B5KGJ1ZiwgcGItPmJ1Zl9nZXQsIGNvdW50KTsKKwkJaWYgKGNvdW50IDwgbGVuKQorCQkJcGItPmJ1Zl9nZXQgKz0gY291bnQ7CisJCWVsc2UgLyogY291bnQgPT0gbGVuICovCisJCQlwYi0+YnVmX2dldCA9IHBiLT5idWZfYnVmOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNwY3A4eDVfZHJpdmVyID0geworCS5uYW1lID0JCQkic3BjcDh4NSIsCisJLnByb2JlID0JCXVzYl9zZXJpYWxfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQkJdXNiX3NlcmlhbF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKKwkubm9fZHluYW1pY19pZCA9CTEsCit9OworCisKK3N0cnVjdCBzcGNwOHg1X3ByaXZhdGUgeworCXNwaW5sb2NrX3QgCWxvY2s7CisJc3RydWN0IHJpbmdidWYJKmJ1ZjsKKwlpbnQgCQl3cml0ZV91cmJfaW5fdXNlOworCWVudW0gc3BjcDh4NV90eXBlCXR5cGU7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZGVsdGFfbXNyX3dhaXQ7CisJdTggCQkJbGluZV9jb250cm9sOworCXU4IAkJCWxpbmVfc3RhdHVzOworCXU4IAkJCXRlcm1pb3NfaW5pdGlhbGl6ZWQ7Cit9OworCisvKiBkZXNjIDogd2hlbiBkZXZpY2UgcGx1ZyBpbix0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIGNhbGxlZC4KKyAqIHRoYW5rcyB0byB1c2Jfc2VyaWFsIHN1YnN5c3RlbSx0aGVuIGRvIGFsbW9zdCBldmVyeSB0aGluZ3MgZm9yIHVzLiBBbmQgd2hhdAorICogd2Ugc2hvdWxkIGRvIGp1c3QgYWxsb2MgdGhlIGJ1ZmZlciAqLworc3RhdGljIGludCBzcGNwOHg1X3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3sKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2OworCWludCBpOworCWVudW0gc3BjcDh4NV90eXBlIHR5cGUgPSBTUENQODI1XzAwN19UWVBFOworCisJaWYgKHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSAweDAyMDEpCisJCXR5cGUgPSBTUENQODI1XzAwN19UWVBFOworCWVsc2UgaWYgKHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSAweDAyMzEpCisJCXR5cGUgPSBTUENQODM1X1RZUEU7CisJZWxzZSBpZiAoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IDB4MDIzNSkKKwkJdHlwZSA9IFNQQ1A4MjVfMDA4X1RZUEU7CisJZWxzZSBpZiAoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IDB4MDIwNCkKKwkJdHlwZSA9IFNQQ1A4MjVfSU5URVJNQVRJQ19UWVBFOworCWVsc2UgaWYgKHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSAweDA0NzEgJiYKKwkJIHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yID09IDB4MDgxZSkKKwkJdHlwZSA9IFNQQ1A4MjVfUEhJTElQX1RZUEU7CisJZGV2X2RiZygmc2VyaWFsLT5kZXYtPmRldiwgImRldmljZSB0eXBlID0gJWRcbiIsIChpbnQpdHlwZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgeworCQlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAoIXByaXYpCisJCQlnb3RvIGNsZWFudXA7CisKKwkJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCQlwcml2LT5idWYgPSBhbGxvY19yaW5nYnVmKFNQQ1A4eDVfQlVGX1NJWkUpOworCQlpZiAocHJpdi0+YnVmID09IE5VTEwpCisJCQlnb3RvIGNsZWFudXAyOworCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKKwkJcHJpdi0+dHlwZSA9IHR5cGU7CisJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0gLCBwcml2KTsKKworCX0KKworCXJldHVybiAwOworCitjbGVhbnVwMjoKKwlrZnJlZShwcml2KTsKK2NsZWFudXA6CisJZm9yICgtLWk7IGkgPj0gMDsgLS1pKSB7CisJCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKTsKKwkJZnJlZV9yaW5nYnVmKHByaXYtPmJ1Zik7CisJCWtmcmVlKHByaXYpOworCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldICwgTlVMTCk7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCisvKiBjYWxsIHdoZW4gdGhlIGRldmljZSBwbHVnIG91dC4gZnJlZSBhbGwgdGhlIG1lbW9yeSBhbGxvY2VkIGJ5IHByb2JlICovCitzdGF0aWMgdm9pZCBzcGNwOHg1X3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGk7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdjsKKworCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CisJCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKTsKKwkJaWYgKHByaXYpIHsKKwkJCWZyZWVfcmluZ2J1Zihwcml2LT5idWYpOworCQkJa2ZyZWUocHJpdik7CisJCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldICwgTlVMTCk7CisJCX0KKwl9Cit9CisKKy8qIHNldCB0aGUgbW9kZW0gY29udHJvbCBsaW5lIG9mIHRoZSBkZXZpY2UuCisgKiBOT1RFIHNwY3A4MjUtMDA3IG5vdCBzdXBwb3J0ZWQgdGhpcyAqLworc3RhdGljIGludCBzcGNwOHg1X3NldF9jdHJsTGluZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1OCB2YWx1ZSwKKwkJCQllbnVtIHNwY3A4eDVfdHlwZSB0eXBlKQoreworCWludCByZXR2YWw7CisJdTggbWNyID0gMCA7CisKKwlpZiAodHlwZSA9PSBTUENQODI1XzAwN19UWVBFKQorCQlyZXR1cm4gLUVQRVJNOworCisJbWNyID0gKHVuc2lnbmVkIHNob3J0KXZhbHVlOworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAorCQkJCSBTRVRfVUFSVF9TVEFUVVNfVFlQRSwgU0VUX1VBUlRfU1RBVFVTLAorCQkJCSBtY3IsIDB4MDQsIE5VTEwsIDAsIDEwMCk7CisJaWYgKHJldHZhbCAhPSAwKQorCQlkZXZfZGJnKCZkZXYtPmRldiwgInVzYl9jb250cm9sX21zZyByZXR1cm4gJSN4XG4iLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIGdldCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBkZXZpY2UKKyAqIE5PVEUgc3BjcDgyNS0wMDcgbm90IHN1cHBvcnRlZCB0aGlzICovCitzdGF0aWMgaW50IHNwY3A4eDVfZ2V0X21zcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1OCAqc3RhdHVzLAorCQkJICAgZW51bSBzcGNwOHg1X3R5cGUgdHlwZSkKK3sKKwl1OCAqc3RhdHVzX2J1ZmZlcjsKKwlpbnQgcmV0OworCisJLyogSSByZXR1cm4gUGVybWl0ZWQgbm90IHN1cHBvcnQgaGVyZSBidXQgc2VlbSBpbnZhbCBkZXZpY2UKKwkgKiBpcyBtb3JlIGZpeCAqLworCWlmICh0eXBlID09IFNQQ1A4MjVfMDA3X1RZUEUpCisJCXJldHVybiAtRVBFUk07CisJaWYgKHN0YXR1cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1c19idWZmZXIgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOworCWlmICghc3RhdHVzX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJc3RhdHVzX2J1ZmZlclswXSA9IHN0YXR1c1swXTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkJICAgICAgR0VUX1VBUlRfU1RBVFVTLCBHRVRfVUFSVF9TVEFUVVNfVFlQRSwKKwkJCSAgICAgIDAsIEdFVF9VQVJUX1NUQVRVU19NU1IsIHN0YXR1c19idWZmZXIsIDEsIDEwMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9kYmcoJmRldi0+ZGV2LCAiR2V0IE1TUiA9IDB4JXAgZmFpbGVkIChlcnJvciA9ICVkKSIsCisJCQlzdGF0dXNfYnVmZmVyLCByZXQpOworCisJZGV2X2RiZygmZGV2LT5kZXYsICIweGMwOjB4MjI6MDo2ICAlZCAtIDB4JXAgIiwgcmV0LCBzdGF0dXNfYnVmZmVyKTsKKwlzdGF0dXNbMF0gPSBzdGF0dXNfYnVmZmVyWzBdOworCWtmcmVlKHN0YXR1c19idWZmZXIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogc2VsZWN0IHRoZSB3b3JrIG1vZGUuCisgKiBOT1RFIHRoaXMgZnVuY3Rpb24gbm90IHN1cHBvcnRlZCBieSBzcGNwODI1LTAwNyAqLworc3RhdGljIHZvaWQgc3BjcDh4NV9zZXRfd29ya01vZGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdTE2IHZhbHVlLAorCQkJCSB1MTYgaW5kZXgsIGVudW0gc3BjcDh4NV90eXBlIHR5cGUpCit7CisJaW50IHJldDsKKworCS8qIEkgcmV0dXJuIFBlcm1pdGVkIG5vdCBzdXBwb3J0IGhlcmUgYnV0IHNlZW0gaW52YWwgZGV2aWNlCisJICogaXMgbW9yZSBmaXggKi8KKwlpZiAodHlwZSA9PSBTUENQODI1XzAwN19UWVBFKQorCQlyZXR1cm47CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCSAgICAgIFNFVF9XT1JLSU5HX01PREVfVFlQRSwgU0VUX1dPUktJTkdfTU9ERSwKKwkJCSAgICAgIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgInZhbHVlID0gJSN4ICwgaW5kZXggPSAlI3hcbiIsIHZhbHVlLCBpbmRleCk7CisJaWYgKHJldCA8IDApCisJCWRldl9kYmcoJmRldi0+ZGV2LAorCQkJIlJUU0NUUyB1c2JfY29udHJvbF9tc2coZW5hYmxlIGZsb3djdHJsKSA9ICVkXG4iLCByZXQpOworfQorCisvKiBjbG9zZSB0aGUgc2VyaWFsIHBvcnQuIFdlIHNob3VsZCB3YWl0IGZvciBkYXRhIHNlbmRpbmcgdG8gZGV2aWNlIDFzdCBhbmQKKyAqIHRoZW4ga2lsbCBhbGwgdXJiLiAqLworc3RhdGljIHZvaWQgc3BjcDh4NV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNfY2ZsYWc7CisJaW50IGJwczsKKwlsb25nIHRpbWVvdXQ7CisJd2FpdF9xdWV1ZV90IHdhaXQ7CisJaW50IHJlc3VsdDsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CisKKwkvKiB3YWl0IGZvciBkYXRhIHRvIGRyYWluIGZyb20gdGhlIGJ1ZmZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJdGltZW91dCA9IFNQQ1A4eDVfQ0xPU0lOR19XQUlUOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+dHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAocmluZ2J1Zl9hdmFpbF9kYXRhKHByaXYtPmJ1ZikgPT0gMCB8fAorCQkgICAgdGltZW91dCA9PSAwIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOworCisJLyogY2xlYXIgb3V0IGFueSByZW1haW5pbmcgZGF0YSBpbiB0aGUgYnVmZmVyICovCisJY2xlYXJfcmluZ2J1Zihwcml2LT5idWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgZm9yIGNoYXJhY3RlcnMgdG8gZHJhaW4gZnJvbSB0aGUgZGV2aWNlICh0aGlzIGlzIGxvbmcgZW5vdWdoCisJICogZm9yIHRoZSBlbnRpcmUgYWxsIGJ5dGUgc3BjcDh4NSBoYXJkd2FyZSBidWZmZXIgdG8gZHJhaW4gd2l0aCBubworCSAqIGZsb3cgY29udHJvbCBmb3IgZGF0YSByYXRlcyBvZiAxMjAwIGJwcyBvciBtb3JlLCBmb3IgbG93ZXIgcmF0ZXMgd2UKKwkgKiBzaG91bGQgcmVhbGx5IGtub3cgaG93IG11Y2ggZGF0YSBpcyBpbiB0aGUgYnVmZmVyIHRvIGNvbXB1dGUgYSBkZWxheQorCSAqIHRoYXQgaXMgbm90IHVubmVjZXNzYXJpbHkgbG9uZykgKi8KKwlicHMgPSB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0LT50dHkpOworCWlmIChicHMgPiAxMjAwKQorCQl0aW1lb3V0ID0gbWF4KChIWioyNTYwKSAvIGJwcywgSFovMTApOworCWVsc2UKKwkJdGltZW91dCA9IDIqSFo7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCisJLyogY2xlYXIgY29udHJvbCBsaW5lcyAqLworCWlmIChwb3J0LT50dHkpIHsKKwkJY19jZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkJaWYgKGNfY2ZsYWcgJiBIVVBDTCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCXByaXYtPmxpbmVfY29udHJvbCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQlzcGNwOHg1X3NldF9jdHJsTGluZShwb3J0LT5zZXJpYWwtPmRldiwgMCAsIHByaXYtPnR5cGUpOworCQl9CisJfQorCisJLyoga2lsbCB1cmIgKi8KKwlpZiAocG9ydC0+d3JpdGVfdXJiICE9IE5VTEwpIHsKKwkJcmVzdWx0ID0gdXNiX3VubGlua191cmIocG9ydC0+d3JpdGVfdXJiKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWRldl9kYmcoJnBvcnQtPmRldiwKKwkJCQkidXNiX3VubGlua191cmIod3JpdGVfdXJiKSA9ICVkXG4iLCByZXN1bHQpOworCX0KKwlyZXN1bHQgPSB1c2JfdW5saW5rX3VyYihwb3J0LT5yZWFkX3VyYik7CisJaWYgKHJlc3VsdCkKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAidXNiX3VubGlua191cmIocmVhZF91cmIpID0gJWRcbiIsIHJlc3VsdCk7Cit9CisKKy8qIHNldCB0aGUgc2VyaWFsIHBhcmFtIGZvciB0cmFuc2Zlci4gd2Ugc2hvdWxkIGNoZWNrIGlmIHdlIHJlYWxseSBuZWVkIHRvCisgKiB0cmFuc2Zlci4gdGhlbiBpZiBiZSBzZXQgZmxvdyBjb250b3JsIHdlIHNob3VsZCBkbyB0aGlzIHRvby4gKi8KK3N0YXRpYyB2b2lkIHNwY3A4eDVfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwl1bnNpZ25lZCBpbnQgb2xkX2NmbGFnID0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWc7CisJdW5zaWduZWQgc2hvcnQgdWFydGRhdGE7CisJdW5zaWduZWQgY2hhciBidWZbMl0gPSB7MCwgMH07CisJaW50IGJhdWQ7CisJaW50IGk7CisJdTggY29udHJvbDsKKworCWlmICgoIXBvcnQtPnR0eSkgfHwgKCFwb3J0LT50dHktPnRlcm1pb3MpKQorCQlyZXR1cm47CisKKwkvKiBmb3IgdGhlIDFzdCB0aW1lIGNhbGwgdGhpcyBmdW5jdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJaWYgKCFwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkKSB7CisJCSoocG9ydC0+dHR5LT50ZXJtaW9zKSA9IHR0eV9zdGRfdGVybWlvczsKKwkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gQjExNTIwMCB8IENTOCB8IENSRUFEIHwKKwkJCQkJICAgICAgSFVQQ0wgfCBDTE9DQUw7CisJCXByaXYtPnRlcm1pb3NfaW5pdGlhbGl6ZWQgPSAxOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBjaGVjayB0aGF0IHRoZXkgcmVhbGx5IHdhbnQgdXMgdG8gY2hhbmdlIHNvbWV0aGluZyAqLworCWlmICghdHR5X3Rlcm1pb3NfaHdfY2hhbmdlKHBvcnQtPnR0eS0+dGVybWlvcywgb2xkX3Rlcm1pb3MpKQorCQlyZXR1cm47CisKKwkvKiBzZXQgRFRSL1JUUyBhY3RpdmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWNvbnRyb2wgPSBwcml2LT5saW5lX2NvbnRyb2w7CisJaWYgKChvbGRfY2ZsYWcgJiBDQkFVRCkgPT0gQjApIHsKKwkJcHJpdi0+bGluZV9jb250cm9sIHw9IE1DUl9EVFI7CisJCWlmICghKG9sZF9jZmxhZyAmIENSVFNDVFMpKQorCQkJcHJpdi0+bGluZV9jb250cm9sIHw9IE1DUl9SVFM7CisJfQorCWlmIChjb250cm9sICE9IHByaXYtPmxpbmVfY29udHJvbCkgeworCQljb250cm9sID0gcHJpdi0+bGluZV9jb250cm9sOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXNwY3A4eDVfc2V0X2N0cmxMaW5lKHNlcmlhbC0+ZGV2LCBjb250cm9sICwgcHJpdi0+dHlwZSk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCX0KKworCS8qIFNldCBCYXVkIFJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KTs7CisJc3dpdGNoIChiYXVkKSB7CisJY2FzZSAzMDA6CWJ1ZlswXSA9IDB4MDA7CWJyZWFrOworCWNhc2UgNjAwOglidWZbMF0gPSAweDAxOwlicmVhazsKKwljYXNlIDEyMDA6CWJ1ZlswXSA9IDB4MDI7CWJyZWFrOworCWNhc2UgMjQwMDoJYnVmWzBdID0gMHgwMzsJYnJlYWs7CisJY2FzZSA0ODAwOglidWZbMF0gPSAweDA0OwlicmVhazsKKwljYXNlIDk2MDA6CWJ1ZlswXSA9IDB4MDU7CWJyZWFrOworCWNhc2UgMTkyMDA6CWJ1ZlswXSA9IDB4MDc7CWJyZWFrOworCWNhc2UgMzg0MDA6CWJ1ZlswXSA9IDB4MDk7CWJyZWFrOworCWNhc2UgNTc2MDA6CWJ1ZlswXSA9IDB4MGE7CWJyZWFrOworCWNhc2UgMTE1MjAwOglidWZbMF0gPSAweDBiOwlicmVhazsKKwljYXNlIDIzMDQwMDoJYnVmWzBdID0gMHgwYzsJYnJlYWs7CisJY2FzZSA0NjA4MDA6CWJ1ZlswXSA9IDB4MGQ7CWJyZWFrOworCWNhc2UgOTIxNjAwOglidWZbMF0gPSAweDBlOwlicmVhazsKKy8qCWNhc2UgMTIwMDAwMDoJYnVmWzBdID0gMHgwZjsJYnJlYWs7ICovCisvKgljYXNlIDI0MDAwMDA6CWJ1ZlswXSA9IDB4MTA7CWJyZWFrOyAqLworCWNhc2UgMzAwMDAwMDoJYnVmWzBdID0gMHgxMTsJYnJlYWs7CisvKgljYXNlIDYwMDAwMDA6CWJ1ZlswXSA9IDB4MTI7CWJyZWFrOyAqLworCWNhc2UgMDoKKwljYXNlIDEwMDAwMDA6CisJCQlidWZbMF0gPSAweDBiOwlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoInNwY3A4MjUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJhdWRyYXRlICIKKwkJICAgICJyZXF1ZXN0ZWQsIHVzaW5nIGRlZmF1bHQgb2YgOTYwMC4iKTsKKwl9CisKKwkvKiBTZXQgRGF0YSBMZW5ndGggOiAwMDo1Yml0LCAwMTo2Yml0LCAxMDo3Yml0LCAxMTo4Yml0ICovCisJaWYgKGNmbGFnICYgQ1NJWkUpIHsKKwkJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJCWNhc2UgQ1M1OgorCQkJYnVmWzFdIHw9IFNFVF9VQVJUX0ZPUk1BVF9TSVpFXzU7CisJCQlicmVhazsKKwkJY2FzZSBDUzY6CisJCQlidWZbMV0gfD0gU0VUX1VBUlRfRk9STUFUX1NJWkVfNjsKKwkJCWJyZWFrOworCQljYXNlIENTNzoKKwkJCWJ1ZlsxXSB8PSBTRVRfVUFSVF9GT1JNQVRfU0laRV83OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgQ1M4OgorCQkJYnVmWzFdIHw9IFNFVF9VQVJUX0ZPUk1BVF9TSVpFXzg7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFNldCBTdG9wIGJpdDIgOiAwOjFiaXQgMToyYml0ICovCisJYnVmWzFdIHw9IChjZmxhZyAmIENTVE9QQikgPyBTRVRfVUFSVF9GT1JNQVRfU1RPUF8yIDoKKwkJCQkgICAgIFNFVF9VQVJUX0ZPUk1BVF9TVE9QXzE7CisKKwkvKiBTZXQgUGFyaXR5IGJpdDMtNCAwMTpPZGQgMTE6RXZlbiAqLworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlidWZbMV0gfD0gKGNmbGFnICYgUEFST0REKSA/CisJCVNFVF9VQVJUX0ZPUk1BVF9QQVJfT0REIDogU0VUX1VBUlRfRk9STUFUX1BBUl9FVkVOIDsKKwl9IGVsc2UKKwkJYnVmWzFdIHw9IFNFVF9VQVJUX0ZPUk1BVF9QQVJfTk9ORTsKKworCXVhcnRkYXRhID0gYnVmWzBdIHwgYnVmWzFdPDw4OworCisJaSA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKKwkJCSAgICBTRVRfVUFSVF9GT1JNQVRfVFlQRSwgU0VUX1VBUlRfRk9STUFULAorCQkJICAgIHVhcnRkYXRhLCAwLCBOVUxMLCAwLCAxMDApOworCWlmIChpIDwgMCkKKwkJZXJyKCJTZXQgVUFSVCBmb3JtYXQgJSN4IGZhaWxlZCAoZXJyb3IgPSAlZCkiLCB1YXJ0ZGF0YSwgaSk7CisJZGJnKCIweDIxOjB4NDA6MDowICAlZFxuIiwgaSk7CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCS8qIGVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KKwkJc3BjcDh4NV9zZXRfd29ya01vZGUoc2VyaWFsLT5kZXYsIDB4MDAwYSwKKwkJCQkgICAgIFNFVF9XT1JLSU5HX01PREVfVTJDLCBwcml2LT50eXBlKTsKKwl9CisJcmV0dXJuOworfQorCisvKiBvcGVuIHRoZSBzZXJpYWwgcG9ydC4gZG8gc29tZSB1c2Igc3lzdGVtIGNhbGwuIHNldCB0ZXJtaW9zIGFuZCBnZXQgdGhlIGxpbmUKKyAqIHN0YXR1cyBvZiB0aGUgZGV2aWNlLiB0aGVuIHN1Ym1pdCB0aGUgcmVhZCB1cmIgKi8KK3N0YXRpYyBpbnQgc3BjcDh4NV9vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBrdGVybWlvcyB0bXBfdGVybWlvczsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCXN0cnVjdCBzcGNwOHg1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHN0YXR1cyA9IDB4MzA7CisJLyogc3RhdHVzIDB4MzAgbWVhbnMgRFNSIGFuZCBDVFMgPSAxIG90aGVyIENEQyBSSSBhbmQgZGVsdGEgPSAwICovCisKKwlkYmcoIiVzIC0gIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT53cml0ZV91cmItPnBpcGUpOworCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT5yZWFkX3VyYi0+cGlwZSk7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCisJCQkgICAgICAweDA5LCAweDAwLAorCQkJICAgICAgMHgwMSwgMHgwMCwgTlVMTCwgMHgwMCwgMTAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpCisJCXByaXYtPmxpbmVfY29udHJvbCA9IE1DUl9EVFIgfCBNQ1JfUlRTOworCWVsc2UKKwkJcHJpdi0+bGluZV9jb250cm9sID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlzcGNwOHg1X3NldF9jdHJsTGluZShzZXJpYWwtPmRldiwgcHJpdi0+bGluZV9jb250cm9sICwgcHJpdi0+dHlwZSk7CisKKwkvKiBTZXR1cCB0ZXJtaW9zICovCisJaWYgKHBvcnQtPnR0eSkKKwkJc3BjcDh4NV9zZXRfdGVybWlvcyhwb3J0LCAmdG1wX3Rlcm1pb3MpOworCisJc3BjcDh4NV9nZXRfbXNyKHNlcmlhbC0+ZGV2LCAmc3RhdHVzLCBwcml2LT50eXBlKTsKKworCS8qIG1heSBiZSB3ZSBzaG91bGQgdXBkYXRlIHVhcnQgc3RhdHVzIGhlcmUgYnV0IG5vdyB3ZSBkaWQgbm90IGRvICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlwcml2LT5saW5lX3N0YXR1cyA9IHN0YXR1cyAmIDB4ZjAgOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIEZJWE1FOiBuZWVkIHRvIGFzc2VydCBSVFMgYW5kIERUUiBpZiBDUlRTQ1RTIG9mZiAqLworCisJZGJnKCIlcyAtIHN1Ym1pdHRpbmcgcmVhZCB1cmIiLCBfX2Z1bmNfXyk7CisJcG9ydC0+cmVhZF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCXNwY3A4eDVfY2xvc2UocG9ydCwgTlVMTCk7CisJCXJldHVybiAtRVBST1RPOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogYnVsayByZWFkIGNhbGwgYmFjayBmdW5jdGlvbi4gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgdXJiLiBpZiB0cmFuc2ZlcgorICogZmFpbGVkIHJldHVybi4gdGhlbiB1cGRhdGUgdGhlIHN0YXR1cyBhbmQgdGhlIHR0eSBzZW5kIGRhdGEgdG8gdHR5IHN1YnN5cy4KKyAqIHN1Ym1pdCB1cmIgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIHNwY3A4eDVfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBzcGNwOHg1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworCXU4IHN0YXR1cyA9IDA7CisJY2hhciB0dHlfZmxhZzsKKworCWRldl9kYmcoJnBvcnQtPmRldiwgInN0YXJ0LCB1cmItPnN0YXR1cyA9ICVkLCAiCisJCSJ1cmItPmFjdHVhbF9sZW5ndGggPSAlZFxuLCIsIHVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJLyogY2hlY2sgdGhlIHVyYiBzdGF0dXMgKi8KKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKCFwb3J0LT5vcGVuX2NvdW50KQorCQkJcmV0dXJuOworCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgeworCQkJLyogc3BjcDh4NSBteXN0ZXJpb3VzbHkgZmFpbHMgd2l0aCAtRVBST1RPICovCisJCQkvKiByZXNjaGVkdWxlIHRoZSByZWFkICovCisJCQl1cmItPnN0YXR1cyA9IDA7CisJCQl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiICwgR0ZQX0FUT01JQyk7CisJCQlpZiAocmVzdWx0KQorCQkJCWRldl9kYmcoJnBvcnQtPmRldiwKKwkJCQkJImZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiICVkXG4iLAorCQkJCQlyZXN1bHQpOworCQkJcmV0dXJuOworCQl9CisJCWRldl9kYmcoJnBvcnQtPmRldiwgInVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgdHR5X2ZsYWcgZnJvbSBzdGF0dXMgKi8KKwl0dHlfZmxhZyA9IFRUWV9OT1JNQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IHByaXYtPmxpbmVfc3RhdHVzOworCXByaXYtPmxpbmVfc3RhdHVzICY9IH5VQVJUX1NUQVRFX1RSQU5TSUVOVF9NQVNLOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkvKiB3YWtlIHVwIHRoZSB3YWl0IGZvciB0ZXJtaW9zICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkvKiBicmVhayB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcGFyaXR5LCB3aGljaCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKKwkgKiBmcmFtaW5nIGVycm9ycyAqLworCWlmIChzdGF0dXMgJiBVQVJUX0JSRUFLX0VSUk9SKQorCQl0dHlfZmxhZyA9IFRUWV9CUkVBSzsKKwllbHNlIGlmIChzdGF0dXMgJiBVQVJUX1BBUklUWV9FUlJPUikKKwkJdHR5X2ZsYWcgPSBUVFlfUEFSSVRZOworCWVsc2UgaWYgKHN0YXR1cyAmIFVBUlRfRlJBTUVfRVJST1IpCisJCXR0eV9mbGFnID0gVFRZX0ZSQU1FOworCWRldl9kYmcoJnBvcnQtPmRldiwgInR0eV9mbGFnID0gJWRcbiIsIHR0eV9mbGFnKTsKKworCXR0eSA9IHBvcnQtPnR0eTsKKwlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCArIDEpOworCQkvKiBvdmVycnVuIGlzIHNwZWNpYWwsIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBjaGFyICovCisJCWlmIChzdGF0dXMgJiBVQVJUX09WRVJSVU5fRVJST1IpCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKKwkJZm9yIChpID0gMDsgaSA8IHVyYi0+YWN0dWFsX2xlbmd0aDsgKytpKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW2ldLCB0dHlfZmxhZyk7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJfQorCisJLyogU2NoZWR1bGUgdGhlIG5leHQgcmVhZCBfaWZfIHdlIGFyZSBzdGlsbCBvcGVuICovCisJaWYgKHBvcnQtPm9wZW5fY291bnQpIHsKKwkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiICwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQpCisJCQlkZXZfZGJnKCZwb3J0LT5kZXYsICJmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiAlZFxuIiwKKwkJCQlyZXN1bHQpOworCX0KKworCXJldHVybjsKK30KKworLyogZ2V0IGRhdGEgZnJvbSByaW5nIGJ1ZmZlciBhbmQgdGhlbiB3cml0ZSB0byB1c2IgYnVzICovCitzdGF0aWMgdm9pZCBzcGNwOHg1X3NlbmQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlpbnQgY291bnQsIHJlc3VsdDsKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJaWYgKHByaXYtPndyaXRlX3VyYl9pbl91c2UpIHsKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAid3JpdGUgdXJiIHN0aWxsIHVzZWRcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBzZW5kIHRoZSAxc3QgdXJiIGZvciB3cml0dGluZyAqLworCW1lbXNldChwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciAsIDB4MDAgLCBwb3J0LT5idWxrX291dF9zaXplKTsKKwljb3VudCA9IGdldF9yaW5nYnVmKHByaXYtPmJ1ZiwgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCXBvcnQtPmJ1bGtfb3V0X3NpemUpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogdXBkYXRlIHRoZSB1cmIgc3RhdHVzICovCisJcHJpdi0+d3JpdGVfdXJiX2luX3VzZSA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBjb3VudDsKKwlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVzdWx0KSB7CisJCWRldl9kYmcoJnBvcnQtPmRldiwgImZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCisJCQlyZXN1bHQpOworCQlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKKwkJLyogVE9ETzogcmVzY2hlZHVsZSBzcGNwOHg1X3NlbmQgKi8KKwl9CisKKworCXNjaGVkdWxlX3dvcmsoJnBvcnQtPndvcmspOworfQorCisvKiB0aGlzIGlzIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHdyaXRlIHVyYi4gTk9URSB3ZSBzaG91bGQgbm90IHNsZWVwIGluCisgKiB0aGlzIHJvdXRpbmUuIGNoZWNrIHRoZSB1cmIgcmV0dXJuIGNvZGUgYW5kIHRoZW4gc3VibWl0IHRoZSB3cml0ZSB1cmIgYWdhaW4KKyAqIHRvIGhvbGQgdGhlIHdyaXRlIGxvb3AgKi8KK3N0YXRpYyB2b2lkIHNwY3A4eDVfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAidXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkXG4iLAorCQkJdXJiLT5zdGF0dXMpOworCQlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCS8qIGVycm9yIGluIHRoZSB1cmIsIHNvIHdlIGhhdmUgdG8gcmVzdWJtaXQgaXQgKi8KKwkJZGJnKCIlcyAtIE92ZXJmbG93IGluIHdyaXRlIiwgX19mdW5jX18pOworCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMTsKKwkJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWRldl9kYmcoJnBvcnQtPmRldiwKKwkJCQkiZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSB1cmIgJWRcbiIsIHJlc3VsdCk7CisJCWVsc2UKKwkJCXJldHVybjsKKwl9CisKKwlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKKworCS8qIHNlbmQgYW55IGJ1ZmZlcmVkIGRhdGEgKi8KKwlzcGNwOHg1X3NlbmQocG9ydCk7Cit9CisKKy8qIHdyaXRlIGRhdGEgdG8gcmluZyBidWZmZXIuIGFuZCB0aGVuIHN0YXJ0IHRoZSB3cml0ZSB0cmFuc2ZlciAqLworc3RhdGljIGludCBzcGNwOHg1X3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJWQgYnl0ZXNcbiIsIGNvdW50KTsKKworCWlmICghY291bnQpCisJCXJldHVybiBjb3VudDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJY291bnQgPSBwdXRfcmluZ2J1Zihwcml2LT5idWYsIGJ1ZiwgY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXNwY3A4eDVfc2VuZChwb3J0KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBzcGNwOHg1X3dhaXRfbW9kZW1faW5mbyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJCSAgIHVuc2lnbmVkIGludCBhcmcpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBwcmV2c3RhdHVzOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGNoYW5nZWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXByZXZzdGF0dXMgPSBwcml2LT5saW5lX3N0YXR1czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoMSkgeworCQkvKiB3YWtlIHVwIGluIGJ1bGsgcmVhZCAqLworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXN0YXR1cyA9IHByaXYtPmxpbmVfc3RhdHVzOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkJY2hhbmdlZCA9IHByZXZzdGF0dXNec3RhdHVzOworCisJCWlmICgoKGFyZyAmIFRJT0NNX1JORykgJiYgKGNoYW5nZWQgJiBNU1JfU1RBVFVTX0xJTkVfUkkpKSB8fAorCQkgICAgKChhcmcgJiBUSU9DTV9EU1IpICYmIChjaGFuZ2VkICYgTVNSX1NUQVRVU19MSU5FX0RTUikpIHx8CisJCSAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGNoYW5nZWQgJiBNU1JfU1RBVFVTX0xJTkVfRENEKSkgfHwKKwkJICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY2hhbmdlZCAmIE1TUl9TVEFUVVNfTElORV9DVFMpKSkKKwkJCXJldHVybiAwOworCisJCXByZXZzdGF0dXMgPSBzdGF0dXM7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGNwOHg1X2lvY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRiZygiJXMgKCVkKSBjbWQgPSAweCUwNHgiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NNSVdBSVQ6CisJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sICBwb3J0LT5udW1iZXIpOworCQlyZXR1cm4gc3BjcDh4NV93YWl0X21vZGVtX2luZm8ocG9ydCwgYXJnKTsKKworCWRlZmF1bHQ6CisJCWRiZygiJXMgbm90IHN1cHBvcnRlZCA9IDB4JTA0eCIsIF9fZnVuY19fLCBjbWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCitzdGF0aWMgaW50IHNwY3A4eDVfdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBzcGNwOHg1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBjb250cm9sOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlwcml2LT5saW5lX2NvbnRyb2wgfD0gTUNSX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlwcml2LT5saW5lX2NvbnRyb2wgfD0gTUNSX0RUUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCXByaXYtPmxpbmVfY29udHJvbCAmPSB+TUNSX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCXByaXYtPmxpbmVfY29udHJvbCAmPSB+TUNSX0RUUjsKKwljb250cm9sID0gcHJpdi0+bGluZV9jb250cm9sOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzcGNwOHg1X3NldF9jdHJsTGluZShwb3J0LT5zZXJpYWwtPmRldiwgY29udHJvbCAsIHByaXYtPnR5cGUpOworfQorCitzdGF0aWMgaW50IHNwY3A4eDVfdGlvY21nZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtY3I7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwltY3IgPSBwcml2LT5saW5lX2NvbnRyb2w7CisJc3RhdHVzID0gcHJpdi0+bGluZV9zdGF0dXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmVzdWx0ID0gKChtY3IgJiBNQ1JfRFRSKQkJCT8gVElPQ01fRFRSIDogMCkKKwkJICB8ICgobWNyICYgTUNSX1JUUykJCQk/IFRJT0NNX1JUUyA6IDApCisJCSAgfCAoKHN0YXR1cyAmIE1TUl9TVEFUVVNfTElORV9DVFMpCT8gVElPQ01fQ1RTIDogMCkKKwkJICB8ICgoc3RhdHVzICYgTVNSX1NUQVRVU19MSU5FX0RTUikJPyBUSU9DTV9EU1IgOiAwKQorCQkgIHwgKChzdGF0dXMgJiBNU1JfU1RBVFVTX0xJTkVfUkkpCT8gVElPQ01fUkkgIDogMCkKKwkJICB8ICgoc3RhdHVzICYgTVNSX1NUQVRVU19MSU5FX0RDRCkJPyBUSU9DTV9DRCAgOiAwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGdldCB0aGUgYXZhaWwgc3BhY2Ugcm9vbSBpbiByaW5nIGJ1ZmZlciAqLworc3RhdGljIGludCBzcGNwOHg1X3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWludCByb29tID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyb29tID0gcmluZ2J1Zl9hdmFpbF9zcGFjZShwcml2LT5idWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByb29tOworfQorCisvKiBnZXQgdGhlIG51bWJlciBvZiBhdmFpbCBkYXRhIGluIHdyaXRlIHJpbmcgYnVmZmVyICovCitzdGF0aWMgaW50IHNwY3A4eDVfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlpbnQgY2hhcnMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWNoYXJzID0gcmluZ2J1Zl9hdmFpbF9kYXRhKHByaXYtPmJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNoYXJzOworfQorCisvKiBBbGwgb2YgdGhlIGRldmljZSBpbmZvIG5lZWRlZCBmb3IgdGhlIHNwY3A4eDUgU0lPIHNlcmlhbCBjb252ZXJ0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kcml2ZXIgc3BjcDh4NV9kZXZpY2UgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0JVEhJU19NT0RVTEUsCisJCS5uYW1lID0JCSJTUENQOHg1IiwKKwl9LAorCS5pZF90YWJsZQkJPSBpZF90YWJsZSwKKwkubnVtX3BvcnRzCQk9IDEsCisJLm9wZW4gCQkJPSBzcGNwOHg1X29wZW4sCisJLmNsb3NlIAkJCT0gc3BjcDh4NV9jbG9zZSwKKwkud3JpdGUgCQkJPSBzcGNwOHg1X3dyaXRlLAorCS5zZXRfdGVybWlvcyAJCT0gc3BjcDh4NV9zZXRfdGVybWlvcywKKwkuaW9jdGwgCQkJPSBzcGNwOHg1X2lvY3RsLAorCS50aW9jbWdldCAJCT0gc3BjcDh4NV90aW9jbWdldCwKKwkudGlvY21zZXQgCQk9IHNwY3A4eDVfdGlvY21zZXQsCisJLndyaXRlX3Jvb20gCQk9IHNwY3A4eDVfd3JpdGVfcm9vbSwKKwkucmVhZF9idWxrX2NhbGxiYWNrIAk9IHNwY3A4eDVfcmVhZF9idWxrX2NhbGxiYWNrLAorCS53cml0ZV9idWxrX2NhbGxiYWNrCT0gc3BjcDh4NV93cml0ZV9idWxrX2NhbGxiYWNrLAorCS5jaGFyc19pbl9idWZmZXIgCT0gc3BjcDh4NV9jaGFyc19pbl9idWZmZXIsCisJLmF0dGFjaCAJCT0gc3BjcDh4NV9zdGFydHVwLAorCS5zaHV0ZG93biAJCT0gc3BjcDh4NV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwY3A4eDVfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3Rlcigmc3BjcDh4NV9kZXZpY2UpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9zZXJpYWxfcmVnaXN0ZXI7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZzcGNwOHg1X2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsZWRfdXNiX3JlZ2lzdGVyOworCWluZm8oRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OKTsKKwlyZXR1cm4gMDsKK2ZhaWxlZF91c2JfcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzcGNwOHg1X2RldmljZSk7CitmYWlsZWRfdXNiX3NlcmlhbF9yZWdpc3RlcjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BjcDh4NV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnNwY3A4eDVfZHJpdmVyKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJnNwY3A4eDVfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoc3BjcDh4NV9pbml0KTsKK21vZHVsZV9leGl0KHNwY3A4eDVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwppbmRleCAzYTM3NzY2Li5hMWM4YWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKQEAgLTI2NCw5ICsyNjQsNiBAQAogCS5kZXNjcmlwdGlvbgkJPSAiVEkgVVNCIDM0MTAgMSBwb3J0IGFkYXB0ZXIiLAogCS51c2JfZHJpdmVyCQk9ICZ0aV91c2JfZHJpdmVyLAogCS5pZF90YWJsZQkJPSB0aV9pZF90YWJsZV8zNDEwLAotCS5udW1faW50ZXJydXB0X2luCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4JCT0gTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0CQk9IDEsCiAJLm51bV9wb3J0cwkJPSAxLAogCS5hdHRhY2gJCQk9IHRpX3N0YXJ0dXAsCiAJLnNodXRkb3duCQk9IHRpX3NodXRkb3duLApAQCAtMjk1LDkgKzI5Miw2IEBACiAJLmRlc2NyaXB0aW9uCQk9ICJUSSBVU0IgNTA1MiAyIHBvcnQgYWRhcHRlciIsCiAJLnVzYl9kcml2ZXIJCT0gJnRpX3VzYl9kcml2ZXIsCiAJLmlkX3RhYmxlCQk9IHRpX2lkX3RhYmxlXzUwNTIsCi0JLm51bV9pbnRlcnJ1cHRfaW4JPSAxLAotCS5udW1fYnVsa19pbgkJPSAyLAotCS5udW1fYnVsa19vdXQJCT0gMiwKIAkubnVtX3BvcnRzCQk9IDIsCiAJLmF0dGFjaAkJCT0gdGlfc3RhcnR1cCwKIAkuc2h1dGRvd24JCT0gdGlfc2h1dGRvd24sCkBAIC00MTQsMTQgKzQwOCwxNCBAQAogCiAKIAlkYmcoIiVzIC0gcHJvZHVjdCAweCU0WCwgbnVtIGNvbmZpZ3VyYXRpb25zICVkLCBjb25maWd1cmF0aW9uIHZhbHVlICVkIiwKLQkgICAgX19GVU5DVElPTl9fLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwkgICAgX19mdW5jX18sIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAogCSAgICBkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zLAogCSAgICBkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlKTsKIAogCS8qIGNyZWF0ZSBkZXZpY2Ugc3RydWN0dXJlICovCiAJdGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAodGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbXV0ZXhfaW5pdCgmdGRldi0+dGRfb3Blbl9jbG9zZV9sb2NrKTsKQEAgLTQzMSw3ICs0MjUsNyBAQAogCS8qIGRldGVybWluZSBkZXZpY2UgdHlwZSAqLwogCWlmICh1c2JfbWF0Y2hfaWQoc2VyaWFsLT5pbnRlcmZhY2UsIHRpX2lkX3RhYmxlXzM0MTApKQogCQl0ZGV2LT50ZF9pc18zNDEwID0gMTsKLQlkYmcoIiVzIC0gZGV2aWNlIHR5cGUgaXMgJXMiLCBfX0ZVTkNUSU9OX18sIHRkZXYtPnRkX2lzXzM0MTAgPyAiMzQxMCIgOiAiNTA1MiIpOworCWRiZygiJXMgLSBkZXZpY2UgdHlwZSBpcyAlcyIsIF9fZnVuY19fLCB0ZGV2LT50ZF9pc18zNDEwID8gIjM0MTAiIDogIjUwNTIiKTsKIAogCS8qIGlmIHdlIGhhdmUgb25seSAxIGNvbmZpZ3VyYXRpb24sIGRvd25sb2FkIGZpcm13YXJlICovCiAJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgPT0gMSkgewpAQCAtNDY1LDcgKzQ1OSw3IEBACiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJdHBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGlfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAodHBvcnQgPT0gTlVMTCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWdvdG8gZnJlZV90cG9ydHM7CiAJCX0KQEAgLTQ3Nyw3ICs0NzEsNyBAQAogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0cG9ydC0+dHBfd3JpdGVfd2FpdCk7CiAJCXRwb3J0LT50cF93cml0ZV9idWYgPSB0aV9idWZfYWxsb2MoKTsKIAkJaWYgKHRwb3J0LT50cF93cml0ZV9idWYgPT0gTlVMTCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQkJa2ZyZWUodHBvcnQpOwogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWdvdG8gZnJlZV90cG9ydHM7CkBAIC01MTAsNyArNTA0LDcgQEAKIAlzdHJ1Y3QgdGlfZGV2aWNlICp0ZGV2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpOwogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKTsKQEAgLTUzOCw3ICs1MzIsNyBAQAogCQkJICAgICBUSV9QSVBFX1RJTUVPVVRfRU5BQkxFIHwgCiAJCQkgICAgIChUSV9UUkFOU0ZFUl9USU1FT1VUIDw8IDIpKTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC01NjMsMTAgKzU1NywxMCBAQAogCiAJLyogc3RhcnQgaW50ZXJydXB0IHVyYiB0aGUgZmlyc3QgdGltZSBhIHBvcnQgaXMgb3BlbmVkIG9uIHRoaXMgZGV2aWNlICovCiAJaWYgKHRkZXYtPnRkX29wZW5fcG9ydF9jb3VudCA9PSAwKSB7Ci0JCWRiZygiJXMgLSBzdGFydCBpbnRlcnJ1cHQgaW4gdXJiIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN0YXJ0IGludGVycnVwdCBpbiB1cmIiLCBfX2Z1bmNfXyk7CiAJCXVyYiA9IHRkZXYtPnRkX3NlcmlhbC0+cG9ydFswXS0+aW50ZXJydXB0X2luX3VyYjsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm8gaW50ZXJydXB0IHVyYlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm8gaW50ZXJydXB0IHVyYlxuIiwgX19mdW5jX18pOwogCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCWdvdG8gcmVsZWFzZV9sb2NrOwogCQl9CkBAIC01NzUsNDAgKzU2OSw0MCBAQAogCQl1cmItPmRldiA9IGRldjsKIAkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHN0YXR1cykgewotCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXQgaW50ZXJydXB0IHVyYiBmYWlsZWQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHN1Ym1pdCBpbnRlcnJ1cHQgdXJiIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJZ290byByZWxlYXNlX2xvY2s7CiAJCX0KIAl9CiAKIAl0aV9zZXRfdGVybWlvcyhwb3J0LCBwb3J0LT50dHktPnRlcm1pb3MpOwogCi0JZGJnKCIlcyAtIHNlbmRpbmcgVElfT1BFTl9QT1JUIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc2VuZGluZyBUSV9PUEVOX1BPUlQiLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9PUEVOX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCBvcGVuX3NldHRpbmdzLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IHNlbmQgb3BlbiBjb21tYW5kLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGNhbm5vdCBzZW5kIG9wZW4gY29tbWFuZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAotCWRiZygiJXMgLSBzZW5kaW5nIFRJX1NUQVJUX1BPUlQiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzZW5kaW5nIFRJX1NUQVJUX1BPUlQiLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9TVEFSVF9QT1JULAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGNhbm5vdCBzZW5kIHN0YXJ0IGNvbW1hbmQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IHNlbmQgc3RhcnQgY29tbWFuZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAotCWRiZygiJXMgLSBzZW5kaW5nIFRJX1BVUkdFX1BPUlQiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzZW5kaW5nIFRJX1BVUkdFX1BPUlQiLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9QVVJHRV9QT1JULAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgVElfUFVSR0VfSU5QVVQsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgY2xlYXIgaW5wdXQgYnVmZmVycywgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgY2xlYXIgaW5wdXQgYnVmZmVycywgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX1BVUkdFX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCBUSV9QVVJHRV9PVVRQVVQsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgY2xlYXIgb3V0cHV0IGJ1ZmZlcnMsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IGNsZWFyIG91dHB1dCBidWZmZXJzLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gdW5saW5rX2ludF91cmI7CiAJfQogCkBAIC02MTksMjcgKzYxMywyNyBAQAogCiAJdGlfc2V0X3Rlcm1pb3MocG9ydCwgcG9ydC0+dHR5LT50ZXJtaW9zKTsKIAotCWRiZygiJXMgLSBzZW5kaW5nIFRJX09QRU5fUE9SVCAoMikiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzZW5kaW5nIFRJX09QRU5fUE9SVCAoMikiLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9PUEVOX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCBvcGVuX3NldHRpbmdzLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IHNlbmQgb3BlbiBjb21tYW5kICgyKSwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2VuZCBvcGVuIGNvbW1hbmQgKDIpLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCWdvdG8gdW5saW5rX2ludF91cmI7CiAJfQogCi0JZGJnKCIlcyAtIHNlbmRpbmcgVElfU1RBUlRfUE9SVCAoMikiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBzZW5kaW5nIFRJX1NUQVJUX1BPUlQgKDIpIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfU1RBUlRfUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIDAsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2VuZCBzdGFydCBjb21tYW5kICgyKSwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2VuZCBzdGFydCBjb21tYW5kICgyKSwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAogCS8qIHN0YXJ0IHJlYWQgdXJiICovCi0JZGJnKCIlcyAtIHN0YXJ0IHJlYWQgdXJiIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc3RhcnQgcmVhZCB1cmIiLCBfX2Z1bmNfXyk7CiAJdXJiID0gcG9ydC0+cmVhZF91cmI7CiAJaWYgKCF1cmIpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBubyByZWFkIHVyYlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBubyByZWFkIHVyYlxuIiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KQEAgLTY0OSw3ICs2NDMsNyBAQAogCXVyYi0+ZGV2ID0gZGV2OwogCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIHN1Ym1pdCByZWFkIHVyYiBmYWlsZWQsICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gc3VibWl0IHJlYWQgdXJiIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIApAQCAtNjYzLDcgKzY1Nyw3IEBACiAJCXVzYl9raWxsX3VyYihwb3J0LT5zZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl91cmIpOwogcmVsZWFzZV9sb2NrOgogCW11dGV4X3VubG9jaygmdGRldi0+dGRfb3Blbl9jbG9zZV9sb2NrKTsKLQlkYmcoIiVzIC0gZXhpdCAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlkYmcoIiVzIC0gZXhpdCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTY3Niw3ICs2NzAsNyBAQAogCWludCBzdGF0dXM7CiAJaW50IGRvX3VubG9jazsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQkgCiAJdGRldiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKIAl0cG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTY5MywxMSArNjg3LDExIEBACiAKIAlwb3J0X251bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7CiAKLQlkYmcoIiVzIC0gc2VuZGluZyBUSV9DTE9TRV9QT1JUIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gc2VuZGluZyBUSV9DTE9TRV9QT1JUIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfQ0xPU0VfUE9SVCwKIAkJICAgICAoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2VuZCBjbG9zZSBwb3J0IGNvbW1hbmQsICVkXG4iICwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGNhbm5vdCBzZW5kIGNsb3NlIHBvcnQgY29tbWFuZCwgJWRcbiIgLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAogCS8qIGlmIG11dGV4X2xvY2sgaXMgaW50ZXJydXB0ZWQsIGNvbnRpbnVlIGFueXdheSAqLwogCWRvX3VubG9jayA9ICFtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnRkZXYtPnRkX29wZW5fY2xvc2VfbG9jayk7CkBAIC03MTAsNyArNzA0LDcgQEAKIAlpZiAoZG9fdW5sb2NrKQogCQltdXRleF91bmxvY2soJnRkZXYtPnRkX29wZW5fY2xvc2VfbG9jayk7CiAKLQlkYmcoIiVzIC0gZXhpdCIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyAtIGV4aXQiLCBfX2Z1bmNfXyk7CiB9CiAKIApAQCAtNzIwLDEwICs3MTQsMTAgQEAKIAlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC03NDYsNyArNzQwLDcgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NTUsNyArNzQ5LDcgQEAKIAlyb29tID0gdGlfYnVmX3NwYWNlX2F2YWlsKHRwb3J0LT50cF93cml0ZV9idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgcm9vbSk7CiAJcmV0dXJuIHJvb207CiB9CiAKQEAgLTc2Niw3ICs3NjAsNyBAQAogCWludCBjaGFycyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NzUsNyArNzY5LDcgQEAKIAljaGFycyA9IHRpX2J1Zl9kYXRhX2F2YWlsKHRwb3J0LT50cF93cml0ZV9idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAKLQlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIGNoYXJzKTsKIAlyZXR1cm4gY2hhcnM7CiB9CiAKQEAgLTc4NSwxNCArNzc5LDE0IEBACiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gbm8gdHR5IiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIHR0eSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODA4LDIxICs4MDIsMjEgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBzdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gbm8gdHR5IiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIG5vIHR0eSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChJX0lYT0ZGKHR0eSkgfHwgQ19DUlRTQ1RTKHR0eSkpIHsKIAkJc3RhdHVzID0gdGlfcmVzdGFydF9yZWFkKHRwb3J0LCB0dHkpOwogCQlpZiAoc3RhdHVzKQotCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgcmVzdGFydCByZWFkLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3QgcmVzdGFydCByZWFkLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJfQogfQogCkBAIC04MzQsMjQgKzgyOCwyNCBAQAogCXN0cnVjdCBhc3luY19pY291bnQgY25vdzsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2OwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCA9IDB4JTA0WCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgPSAweCUwNFgiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjbWQpOwogCiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBUSU9DR1NFUklBTDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NHU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAtICglZCkgVElPQ0dTRVJJQUwiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCXJldHVybiB0aV9nZXRfc2VyaWFsX2luZm8odHBvcnQsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DU1NFUklBTDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NTU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQkJZGJnKCIlcyAtICglZCkgVElPQ1NTRVJJQUwiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCXJldHVybiB0aV9zZXRfc2VyaWFsX2luZm8odHBvcnQsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DTUlXQUlUOgotCQkJZGJnKCIlcyAtICglZCkgVElPQ01JV0FJVCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJCWRiZygiJXMgLSAoJWQpIFRJT0NNSVdBSVQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkJCWNwcmV2ID0gdHBvcnQtPnRwX2ljb3VudDsKIAkJCXdoaWxlICgxKSB7CiAJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmdHBvcnQtPnRwX21zcl93YWl0KTsKQEAgLTg3Miw3ICs4NjYsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DR0lDT1VOVDoKLQkJCWRiZygiJXMgLSAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCB0cG9ydC0+dHBfaWNvdW50LnJ4LCB0cG9ydC0+dHBfaWNvdW50LnR4KTsKKwkJCWRiZygiJXMgLSAoJWQpIFRJT0NHSUNPVU5UIFJYPSVkLCBUWD0lZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIHRwb3J0LT50cF9pY291bnQucngsIHRwb3J0LT50cF9pY291bnQudHgpOwogCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ0cG9ydC0+dHBfaWNvdW50LCBzaXplb2YodHBvcnQtPnRwX2ljb3VudCkpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcmV0dXJuIDA7CkBAIC04OTQsMjAgKzg4OCwyMCBAQAogCWludCBwb3J0X251bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7CiAJdW5zaWduZWQgaW50IG1jcjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAlpZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19pZmxhZzsKIAotCWRiZygiJXMgLSBjZmxhZyAlMDh4LCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLCBjZmxhZywgaWZsYWcpOwotCWRiZygiJXMgLSBvbGQgY2xmYWcgJTA4eCwgb2xkIGlmbGFnICUwOHgiLCBfX0ZVTkNUSU9OX18sIG9sZF90ZXJtaW9zLT5jX2NmbGFnLCBvbGRfdGVybWlvcy0+Y19pZmxhZyk7CisJZGJnKCIlcyAtIGNmbGFnICUwOHgsIGlmbGFnICUwOHgiLCBfX2Z1bmNfXywgY2ZsYWcsIGlmbGFnKTsKKwlkYmcoIiVzIC0gb2xkIGNsZmFnICUwOHgsIG9sZCBpZmxhZyAlMDh4IiwgX19mdW5jX18sIG9sZF90ZXJtaW9zLT5jX2NmbGFnLCBvbGRfdGVybWlvcy0+Y19pZmxhZyk7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJY29uZmlnID0ga21hbGxvYyhzaXplb2YoKmNvbmZpZyksIEdGUF9LRVJORUwpOwogCWlmICghY29uZmlnKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk5MSw3ICs5ODUsNyBAQAogCQl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWQsIGJhdWQpOwogCiAJZGJnKCIlcyAtIEJhdWRSYXRlPSVkLCB3QmF1ZFJhdGU9JWQsIHdGbGFncz0weCUwNFgsIGJEYXRhQml0cz0lZCwgYlBhcml0eT0lZCwgYlN0b3BCaXRzPSVkLCBjWG9uPSVkLCBjWG9mZj0lZCwgYlVhcnRNb2RlPSVkIiwKLQlfX0ZVTkNUSU9OX18sIGJhdWQsIGNvbmZpZy0+d0JhdWRSYXRlLCBjb25maWctPndGbGFncywgY29uZmlnLT5iRGF0YUJpdHMsIGNvbmZpZy0+YlBhcml0eSwgY29uZmlnLT5iU3RvcEJpdHMsIGNvbmZpZy0+Y1hvbiwgY29uZmlnLT5jWG9mZiwgY29uZmlnLT5iVWFydE1vZGUpOworCV9fZnVuY19fLCBiYXVkLCBjb25maWctPndCYXVkUmF0ZSwgY29uZmlnLT53RmxhZ3MsIGNvbmZpZy0+YkRhdGFCaXRzLCBjb25maWctPmJQYXJpdHksIGNvbmZpZy0+YlN0b3BCaXRzLCBjb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYsIGNvbmZpZy0+YlVhcnRNb2RlKTsKIAogCWNwdV90b19iZTE2cygmY29uZmlnLT53QmF1ZFJhdGUpOwogCWNwdV90b19iZTE2cygmY29uZmlnLT53RmxhZ3MpOwpAQCAtMTAwMCw3ICs5OTQsNyBAQAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgKF9fdTggKiljb25maWcsCiAJCXNpemVvZigqY29uZmlnKSk7CiAJaWYgKHN0YXR1cykKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2V0IGNvbmZpZyBvbiBwb3J0ICVkLCAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgc3RhdHVzKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2V0IGNvbmZpZyBvbiBwb3J0ICVkLCAlZFxuIiwgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBzdGF0dXMpOwogCiAJLyogU0VUX0NPTkZJRyBhc3NlcnRzIFJUUyBhbmQgRFRSLCByZXNldCB0aGVtIGNvcnJlY3RseSAqLwogCW1jciA9IHRwb3J0LT50cF9zaGFkb3dfbWNyOwpAQCAtMTAwOSw3ICsxMDAzLDcgQEAKIAkJbWNyICY9IH4oVElfTUNSX0RUUiB8IFRJX01DUl9SVFMpOwogCXN0YXR1cyA9IHRpX3NldF9tY3IodHBvcnQsIG1jcik7CiAJaWYgKHN0YXR1cykKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBjYW5ub3Qgc2V0IG1vZGVtIGNvbnRyb2wgb24gcG9ydCAlZCwgJWRcbiIsIF9fRlVOQ1RJT05fXywgcG9ydF9udW1iZXIsIHN0YXR1cyk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gY2Fubm90IHNldCBtb2RlbSBjb250cm9sIG9uIHBvcnQgJWQsICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9udW1iZXIsIHN0YXR1cyk7CiAKIAlrZnJlZShjb25maWcpOwogfQpAQCAtMTAyMSwxNCArMTAxNSwxNyBAQAogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAJdW5zaWduZWQgaW50IG1zcjsKIAl1bnNpZ25lZCBpbnQgbWNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAJbXNyID0gdHBvcnQtPnRwX21zcjsKIAltY3IgPSB0cG9ydC0+dHBfc2hhZG93X21jcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCiAJcmVzdWx0ID0gKChtY3IgJiBUSV9NQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApCiAJCXwgKChtY3IgJiBUSV9NQ1JfUlRTKSA/IFRJT0NNX1JUUyA6IDApCkBAIC0xMDM4LDcgKzEwMzUsNyBAQAogCQl8ICgobXNyICYgVElfTVNSX1JJKSA/IFRJT0NNX1JJIDogMCkKIAkJfCAoKG1zciAmIFRJX01TUl9EU1IpID8gVElPQ01fRFNSIDogMCk7CiAKLQlkYmcoIiVzIC0gMHglMDRYIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCWRiZygiJXMgLSAweCUwNFgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMDQ5LDEyICsxMDQ2LDE0IEBACiB7CiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGludCBtY3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKIAltY3IgPSB0cG9ydC0+dHBfc2hhZG93X21jcjsKIAogCWlmIChzZXQgJiBUSU9DTV9SVFMpCkBAIC0xMDcwLDYgKzEwNjksNyBAQAogCQltY3IgJj0gflRJX01DUl9EVFI7CiAJaWYgKGNsZWFyICYgVElPQ01fTE9PUCkKIAkJbWNyICY9IH5USV9NQ1JfTE9PUDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHRpX3NldF9tY3IodHBvcnQsIG1jcik7CiB9CkBAIC0xMDgwLDcgKzEwODAsNyBAQAogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzOwogCi0JZGJnKCIlcyAtIHN0YXRlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGJyZWFrX3N0YXRlKTsKKwlkYmcoIiVzIC0gc3RhdGUgPSAlZCIsIF9fZnVuY19fLCBicmVha19zdGF0ZSk7CiAKIAlpZiAodHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTA5MiwxMyArMTA5MiwxMyBAQAogCQlUSV9MQ1JfQlJFQUssIGJyZWFrX3N0YXRlID09IC0xID8gVElfTENSX0JSRUFLIDogMCk7CiAKIAlpZiAoc3RhdHVzKQotCQlkYmcoIiVzIC0gZXJyb3Igc2V0dGluZyBicmVhaywgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSBlcnJvciBzZXR0aW5nIGJyZWFrLCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogfQogCiAKIHN0YXRpYyB2b2lkIHRpX2ludGVycnVwdF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHRpX2RldmljZSAqdGRldiA9IChzdHJ1Y3QgdGlfZGV2aWNlICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB0aV9kZXZpY2UgKnRkZXYgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gdGRldi0+dGRfc2VyaWFsOwogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydDsKQEAgLTExMTEsNyArMTExMSw3IEBACiAJaW50IHJldHZhbDsKIAlfX3U4IG1zcjsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTExMTksMzMgKzExMTksMzMgQEAKIAljYXNlIC1FQ09OTlJFU0VUOgogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046Ci0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMsICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXRkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAobGVuZ3RoICE9IDIpIHsKLQkJZGJnKCIlcyAtIGJhZCBwYWNrZXQgc2l6ZSwgJWQiLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CisJCWRiZygiJXMgLSBiYWQgcGFja2V0IHNpemUsICVkIiwgX19mdW5jX18sIGxlbmd0aCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoZGF0YVswXSA9PSBUSV9DT0RFX0hBUkRXQVJFX0VSUk9SKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXMgLSBoYXJkd2FyZSBlcnJvciwgJWRcbiIsIF9fRlVOQ1RJT05fXywgZGF0YVsxXSk7CisJCWRldl9lcnIoZGV2LCAiJXMgLSBoYXJkd2FyZSBlcnJvciwgJWRcbiIsIF9fZnVuY19fLCBkYXRhWzFdKTsKIAkJZ290byBleGl0OwogCX0KIAogCXBvcnRfbnVtYmVyID0gVElfR0VUX1BPUlRfRlJPTV9DT0RFKGRhdGFbMF0pOwogCWZ1bmN0aW9uID0gVElfR0VUX0ZVTkNfRlJPTV9DT0RFKGRhdGFbMF0pOwogCi0JZGJnKCIlcyAtIHBvcnRfbnVtYmVyICVkLCBmdW5jdGlvbiAlZCwgZGF0YSAweCUwMlgiLCBfX0ZVTkNUSU9OX18sIHBvcnRfbnVtYmVyLCBmdW5jdGlvbiwgZGF0YVsxXSk7CisJZGJnKCIlcyAtIHBvcnRfbnVtYmVyICVkLCBmdW5jdGlvbiAlZCwgZGF0YSAweCUwMlgiLCBfX2Z1bmNfXywgcG9ydF9udW1iZXIsIGZ1bmN0aW9uLCBkYXRhWzFdKTsKIAogCWlmIChwb3J0X251bWJlciA+PSBzZXJpYWwtPm51bV9wb3J0cykgewotCQlkZXZfZXJyKGRldiwgIiVzIC0gYmFkIHBvcnQgbnVtYmVyLCAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0X251bWJlcik7CisJCWRldl9lcnIoZGV2LCAiJXMgLSBiYWQgcG9ydCBudW1iZXIsICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9udW1iZXIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMTU3LDE3ICsxMTU3LDE3IEBACiAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBUSV9DT0RFX0RBVEFfRVJST1I6Ci0JCWRldl9lcnIoZGV2LCAiJXMgLSBEQVRBIEVSUk9SLCBwb3J0ICVkLCBkYXRhIDB4JTAyWFxuIiwgX19GVU5DVElPTl9fLCBwb3J0X251bWJlciwgZGF0YVsxXSk7CisJCWRldl9lcnIoZGV2LCAiJXMgLSBEQVRBIEVSUk9SLCBwb3J0ICVkLCBkYXRhIDB4JTAyWFxuIiwgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBkYXRhWzFdKTsKIAkJYnJlYWs7CiAKIAljYXNlIFRJX0NPREVfTU9ERU1fU1RBVFVTOgogCQltc3IgPSBkYXRhWzFdOwotCQlkYmcoIiVzIC0gcG9ydCAlZCwgbXNyIDB4JTAyWCIsIF9fRlVOQ1RJT05fXywgcG9ydF9udW1iZXIsIG1zcik7CisJCWRiZygiJXMgLSBwb3J0ICVkLCBtc3IgMHglMDJYIiwgX19mdW5jX18sIHBvcnRfbnVtYmVyLCBtc3IpOwogCQl0aV9oYW5kbGVfbmV3X21zcih0cG9ydCwgbXNyKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGRldiwgIiVzIC0gdW5rbm93biBpbnRlcnJ1cHQgY29kZSwgMHglMDJYXG4iLCBfX0ZVTkNUSU9OX18sIGRhdGFbMV0pOworCQlkZXZfZXJyKGRldiwgIiVzIC0gdW5rbm93biBpbnRlcnJ1cHQgY29kZSwgMHglMDJYXG4iLCBfX2Z1bmNfXywgZGF0YVsxXSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTE3NSwxOSArMTE3NSwxOSBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycihkZXYsICIlcyAtIHJlc3VibWl0IGludGVycnVwdCB1cmIgZmFpbGVkLCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCV9fZnVuY19fLCByZXR2YWwpOwogfQogCiAKIHN0YXRpYyB2b2lkIHRpX2J1bGtfaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IChzdHJ1Y3QgdGlfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRwb3J0LT50cF9wb3J0OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1cmItPmRldi0+ZGV2OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKQEAgLTExOTUsMTMgKzExOTUsMTMgQEAKIAljYXNlIC1FQ09OTlJFU0VUOgogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046Ci0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJdHBvcnQtPnRwX3RkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHBvcnQtPnRwX3dyaXRlX3dhaXQpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGV2X2VycihkZXYsICIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cywgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyApOworCQkJX19mdW5jX18sIHN0YXR1cyApOwogCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cG9ydC0+dHBfd3JpdGVfd2FpdCk7CiAJfQpAQCAtMTIxMCwxNiArMTIxMCwxNiBAQAogCQlnb3RvIGV4aXQ7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXMgLSBzdG9wcGluZyByZWFkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycihkZXYsICIlcyAtIHN0b3BwaW5nIHJlYWQhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAocG9ydC0+dHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsIGRldiwgX19GVU5DVElPTl9fLAorCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsIGRldiwgX19mdW5jX18sCiAJCQl1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCQlpZiAoIXRwb3J0LT50cF9pc19vcGVuKQotCQkJZGJnKCIlcyAtIHBvcnQgY2xvc2VkLCBkcm9wcGluZyBkYXRhIiwgX19GVU5DVElPTl9fKTsKKwkJCWRiZygiJXMgLSBwb3J0IGNsb3NlZCwgZHJvcHBpbmcgZGF0YSIsIF9fZnVuY19fKTsKIAkJZWxzZQogCQkJdGlfcmVjdigmdXJiLT5kZXYtPmRldiwgcG9ydC0+dHR5LCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKIAkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOwpAQCAtMTI0MSwxOCArMTI0MSwxOCBAQAogCXNwaW5fdW5sb2NrKCZ0cG9ydC0+dHBfbG9jayk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycihkZXYsICIlcyAtIHJlc3VibWl0IHJlYWQgdXJiIGZhaWxlZCwgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQlfX2Z1bmNfXywgcmV0dmFsKTsKIH0KIAogCiBzdGF0aWMgdm9pZCB0aV9idWxrX291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gKHN0cnVjdCB0aV9wb3J0ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHBvcnQtPnRwX3BvcnQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnVyYi0+ZGV2LT5kZXY7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXRwb3J0LT50cF93cml0ZV91cmJfaW5fdXNlID0gMDsKIApAQCAtMTI2MiwxMyArMTI2MiwxMyBAQAogCWNhc2UgLUVDT05OUkVTRVQ6CiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duLCAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duLCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cG9ydC0+dHBfd3JpdGVfd2FpdCk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzLCAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cG9ydC0+dHBfd3JpdGVfd2FpdCk7CiAJfQpAQCAtMTI4Niw3ICsxMjg2LDcgQEAKIAlkbyB7CiAJCWNudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuZ3RoKTsKIAkJaWYgKGNudCA8IGxlbmd0aCkgewotCQkJZGV2X2VycihkZXYsICIlcyAtIGRyb3BwaW5nIGRhdGEsICVkIGJ5dGVzIGxvc3RcbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoIC0gY250KTsKKwkJCWRldl9lcnIoZGV2LCAiJXMgLSBkcm9wcGluZyBkYXRhLCAlZCBieXRlcyBsb3N0XG4iLCBfX2Z1bmNfXywgbGVuZ3RoIC0gY250KTsKIAkJCWlmKGNudCA9PSAwKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMzA3LDcgKzEzMDcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKIApAQCAtMTMyOSw3ICsxMzI5LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCBjb3VudCwgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+d3JpdGVfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgIHVzYl9zbmRidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwKQEAgLTEzMzksNyArMTMzOSw3IEBACiAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXQgd3JpdGUgdXJiIGZhaWxlZCwgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBzdWJtaXQgd3JpdGUgdXJiIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQl0cG9ydC0+dHBfd3JpdGVfdXJiX2luX3VzZSA9IDA7IAogCQkvKiBUT0RPOiByZXNjaGVkdWxlIHRpX3NlbmQgKi8KIAl9IGVsc2UgewpAQCAtMTM1NywxNCArMTM1NywxNyBAQAogCiBzdGF0aWMgaW50IHRpX3NldF9tY3Ioc3RydWN0IHRpX3BvcnQgKnRwb3J0LCB1bnNpZ25lZCBpbnQgbWNyKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IHRpX3dyaXRlX2J5dGUodHBvcnQtPnRwX3RkZXYsCiAJCXRwb3J0LT50cF91YXJ0X2Jhc2VfYWRkciArIFRJX1VBUlRfT0ZGU0VUX01DUiwKIAkJVElfTUNSX1JUUyB8IFRJX01DUl9EVFIgfCBUSV9NQ1JfTE9PUCwgbWNyKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCWlmICghc3RhdHVzKQogCQl0cG9ydC0+dHBfc2hhZG93X21jciA9IG1jcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEzNzgsMjMgKzEzODEsMjMgQEAKIAlpbnQgcG9ydF9udW1iZXIgPSBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yOwogCXN0cnVjdCB0aV9wb3J0X3N0YXR1cyAqZGF0YTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCB0aV9wb3J0X3N0YXR1cyk7CiAJZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXN0YXR1cyA9IHRpX2NvbW1hbmRfaW5fc3luYyh0ZGV2LCBUSV9HRVRfUE9SVF9TVEFUVVMsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUK3BvcnRfbnVtYmVyKSwgMCwgKF9fdTggKilkYXRhLCBzaXplKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZ2V0IHBvcnQgc3RhdHVzIGNvbW1hbmQgZmFpbGVkLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGdldCBwb3J0IHN0YXR1cyBjb21tYW5kIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlnb3RvIGZyZWVfZGF0YTsKIAl9CiAKLQlkYmcoIiVzIC0gbHNyIDB4JTAyWCIsIF9fRlVOQ1RJT05fXywgZGF0YS0+YkxTUik7CisJZGJnKCIlcyAtIGxzciAweCUwMlgiLCBfX2Z1bmNfXywgZGF0YS0+YkxTUik7CiAKIAl0cG9ydC0+dHBfbHNyID0gZGF0YS0+YkxTUjsKIApAQCAtMTQ1NSw3ICsxNDU4LDcgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gbXNyIDB4JTAyWCIsIF9fRlVOQ1RJT05fXywgbXNyKTsKKwlkYmcoIiVzIC0gbXNyIDB4JTAyWCIsIF9fZnVuY19fLCBtc3IpOwogCiAJaWYgKG1zciAmIFRJX01TUl9ERUxUQV9NQVNLKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwpAQCAtMTQ5Myw3ICsxNDk2LDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHBvcnQtPnRwX3BvcnQ7CiAJd2FpdF9xdWV1ZV90IHdhaXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycSgmdHBvcnQtPnRwX2xvY2spOwogCkBAIC0xNjI1LDEyICsxNjI4LDEyIEBACiAJc3RydWN0IHRpX3dyaXRlX2RhdGFfYnl0ZXMgKmRhdGE7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnRkZXYtPnRkX3NlcmlhbC0+ZGV2LT5kZXY7CiAKLQlkYmcoIiVzIC0gYWRkciAweCUwOGxYLCBtYXNrIDB4JTAyWCwgYnl0ZSAweCUwMlgiLCBfX0ZVTkNUSU9OX18sIGFkZHIsIG1hc2ssIGJ5dGUpOworCWRiZygiJXMgLSBhZGRyIDB4JTA4bFgsIG1hc2sgMHglMDJYLCBieXRlIDB4JTAyWCIsIF9fZnVuY19fLCBhZGRyLCBtYXNrLCBieXRlKTsKIAogCXNpemUgPSBzaXplb2Yoc3RydWN0IHRpX3dyaXRlX2RhdGFfYnl0ZXMpICsgMjsKIAlkYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpIHsKLQkJZGV2X2VycihkZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTY0Niw3ICsxNjQ5LDcgQEAKIAkJKF9fdTggKilkYXRhLCBzaXplKTsKIAogCWlmIChzdGF0dXMgPCAwKQotCQlkZXZfZXJyKGRldiwgIiVzIC0gZmFpbGVkLCAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkZXZfZXJyKGRldiwgIiVzIC0gZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKIAlrZnJlZShkYXRhKTsKIApAQCAtMTY3Myw3ICsxNjc2LDcgQEAKIAlidWZmZXJfc2l6ZSA9IFRJX0ZJUk1XQVJFX0JVRl9TSVpFICsgc2l6ZW9mKHN0cnVjdCB0aV9maXJtd2FyZV9oZWFkZXIpOwogCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE2ODcsNyArMTY5MCw3IEBACiAJaGVhZGVyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoKF9fdTE2KShidWZmZXJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdGlfZmlybXdhcmVfaGVhZGVyKSkpOwogCWhlYWRlci0+YkNoZWNrU3VtID0gY3M7CiAKLQlkYmcoIiVzIC0gZG93bmxvYWRpbmcgZmlybXdhcmUiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBkb3dubG9hZGluZyBmaXJtd2FyZSIsIF9fZnVuY19fKTsKIAlmb3IgKHBvcyA9IDA7IHBvcyA8IGJ1ZmZlcl9zaXplOyBwb3MgKz0gZG9uZSkgewogCQlsZW4gPSBtaW4oYnVmZmVyX3NpemUgLSBwb3MsIFRJX0RPV05MT0FEX01BWF9QQUNLRVRfU0laRSk7CiAJCXN0YXR1cyA9IHVzYl9idWxrX21zZyhkZXYsIHBpcGUsIGJ1ZmZlcitwb3MsIGxlbiwgJmRvbmUsIDEwMDApOwpAQCAtMTY5OCwxMSArMTcwMSwxMSBAQAogCWtmcmVlKGJ1ZmZlcik7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBlcnJvciBkb3dubG9hZGluZyBmaXJtd2FyZSwgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIGVycm9yIGRvd25sb2FkaW5nIGZpcm13YXJlLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0JZGJnKCIlcyAtIGRvd25sb2FkIHN1Y2Nlc3NmdWwiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBkb3dubG9hZCBzdWNjZXNzZnVsIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwppbmRleCAyMTM4YmE4Li5hOTkzNGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAlpbnQgZ29vZF9zcG90OwogCi0JZGJnKCIlcyAlZCIsIF9fRlVOQ1RJT05fXywgbnVtX3BvcnRzKTsKKwlkYmcoIiVzICVkIiwgX19mdW5jX18sIG51bV9wb3J0cyk7CiAKIAkqbWlub3IgPSAwOwogCW11dGV4X2xvY2soJnRhYmxlX2xvY2spOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKIAkJKm1pbm9yID0gaTsKIAkJaiA9IDA7Ci0JCWRiZygiJXMgLSBtaW5vciBiYXNlID0gJWQiLCBfX0ZVTkNUSU9OX18sICptaW5vcik7CisJCWRiZygiJXMgLSBtaW5vciBiYXNlID0gJWQiLCBfX2Z1bmNfXywgKm1pbm9yKTsKIAkJZm9yIChpID0gKm1pbm9yOyAoaSA8ICgqbWlub3IgKyBudW1fcG9ydHMpKSAmJiAoaSA8IFNFUklBTF9UVFlfTUlOT1JTKTsgKytpKSB7CiAJCQlzZXJpYWxfdGFibGVbaV0gPSBzZXJpYWw7CiAJCQlzZXJpYWwtPnBvcnRbaisrXS0+bnVtYmVyID0gaTsKQEAgLTExNyw3ICsxMTcsNyBAQAogewogCWludCBpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzZXJpYWwgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAKIAlzZXJpYWwgPSB0b191c2Jfc2VyaWFsKGtyZWYpOwogCi0JZGJnKCIlcyAtICVzIiwgX19GVU5DVElPTl9fLCBzZXJpYWwtPnR5cGUtPmRlc2NyaXB0aW9uKTsKKwlkYmcoIiVzIC0gJXMiLCBfX2Z1bmNfXywgc2VyaWFsLT50eXBlLT5kZXNjcmlwdGlvbik7CiAKIAlzZXJpYWwtPnR5cGUtPnNodXRkb3duKHNlcmlhbCk7CiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXVuc2lnbmVkIGludCBwb3J0TnVtYmVyOwogCWludCByZXR2YWw7CiAJCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIGdldCB0aGUgc2VyaWFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0dHkgcG9pbnRlciAqLwogCXNlcmlhbCA9IHVzYl9zZXJpYWxfZ2V0X2J5X2luZGV4KHR0eS0+aW5kZXgpOwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOwogCkBAIC0yOTksMTEgKzI5OSwxMSBAQAogCWlmICghcG9ydCB8fCBwb3J0LT5zZXJpYWwtPmRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQogCQlnb3RvIGV4aXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZShzKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CisJZGJnKCIlcyAtIHBvcnQgJWQsICVkIGJ5dGUocykiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CiAKIAlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKIAkJcmV0dmFsID0gLUVJTlZBTDsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTMyMiwxMCArMzIyLDEwIEBACiAJaWYgKCFwb3J0KQogCQlnb3RvIGV4aXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTM0NCwxMCArMzQ0LDEwIEBACiAJaWYgKCFwb3J0KQogCQlnb3RvIGV4aXQ7CiAKLQlkYmcoIiVzID0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzID0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTM2NSwxMCArMzY1LDEwIEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZyAoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZyAoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzg0LDEwICszODQsMTAgQEAKIAlpZiAoIXBvcnQpCiAJCXJldHVybjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDAxLDEzICs0MDEsMTUgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0dmFsID0gLUVOT0RFVjsKIAorCWxvY2tfa2VybmVsKCk7CiAJaWYgKCFwb3J0KQogCQlnb3RvIGV4aXQ7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCwgY21kIDB4JS40eCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgMHglLjR4IiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAorCS8qIENhdXRpb24gLSBwb3J0LT5vcGVuX2NvdW50IGlzIEJLTCBwcm90ZWN0ZWQgKi8KIAlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKLQkJZGJnICgiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnICgiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC00MTYsOCArNDE4LDggQEAKIAkJcmV0dmFsID0gcG9ydC0+c2VyaWFsLT50eXBlLT5pb2N0bChwb3J0LCBmaWxlLCBjbWQsIGFyZyk7CiAJZWxzZQogCQlyZXR2YWwgPSAtRU5PSU9DVExDTUQ7Ci0KIGV4aXQ6CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTQyOCwxMCArNDMwLDEwIEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7Ci0JCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ0NiwxOSArNDQ4LDI0IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKLQlpZiAoIXBvcnQpCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIXBvcnQpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm47CisJfQogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghcG9ydC0+b3Blbl9jb3VudCkgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19mdW5jX18pOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBwYXNzIG9uIHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlmIGl0IGlzIGF2YWlsYWJsZSAqLwogCWlmIChwb3J0LT5zZXJpYWwtPnR5cGUtPmJyZWFrX2N0bCkKIAkJcG9ydC0+c2VyaWFsLT50eXBlLT5icmVha19jdGwocG9ydCwgYnJlYWtfc3RhdGUpOworCXVubG9ja19rZXJuZWwoKTsKIH0KIAogc3RhdGljIGludCBzZXJpYWxfcmVhZF9wcm9jIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKQEAgLTQ2OSw3ICs0NzYsNyBAQAogCW9mZl90IGJlZ2luID0gMDsKIAljaGFyIHRtcFs0MF07CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCWxlbmd0aCArPSBzcHJpbnRmIChwYWdlLCAidXNic2VyaW5mbzoxLjAgZHJpdmVyOjIuMFxuIik7CiAJZm9yIChpID0gMDsgaSA8IFNFUklBTF9UVFlfTUlOT1JTICYmIGxlbmd0aCA8IFBBR0VfU0laRTsgKytpKSB7CiAJCXNlcmlhbCA9IHVzYl9zZXJpYWxfZ2V0X2J5X2luZGV4KGkpOwpAQCAtNTE1LDEwICs1MjIsMTAgQEAKIAlpZiAoIXBvcnQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmICghcG9ydC0+b3Blbl9jb3VudCkgewotCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTUzNiwxMCArNTQzLDEwIEBACiAJaWYgKCFwb3J0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoIXBvcnQtPm9wZW5fY291bnQpIHsKLQkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC01NjUsNyArNTcyLDcgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQsIHdvcmspOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQogCWlmICghcG9ydCkKIAkJcmV0dXJuOwpAQCAtNTgxLDcgKzU4OCw3IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRvX3VzYl9zZXJpYWxfcG9ydChkZXYpOwogCi0JZGJnICgiJXMgLSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2LT5idXNfaWQpOworCWRiZyAoIiVzIC0gJXMiLCBfX2Z1bmNfXywgZGV2LT5idXNfaWQpOwogCXBvcnRfZnJlZShwb3J0KTsKIH0KIApAQCAtNjI3LDcgKzYzNCw3IEBACiAKIAlzZXJpYWwgPSBremFsbG9jKHNpemVvZigqc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZXJpYWwpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzZXJpYWwtPmRldiA9IHVzYl9nZXRfZGV2KGRldik7CkBAIC03MjIsNyArNzI5LDcgQEAKIAlzZXJpYWwgPSBjcmVhdGVfc2VyaWFsIChkZXYsIGludGVyZmFjZSwgdHlwZSk7CiAJaWYgKCFzZXJpYWwpIHsKIAkJdW5sb2NrX2tlcm5lbCgpOwotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04NTQsMjIgKzg2MSw2IEBACiAJc2VyaWFsLT5udW1faW50ZXJydXB0X2luID0gbnVtX2ludGVycnVwdF9pbjsKIAlzZXJpYWwtPm51bV9pbnRlcnJ1cHRfb3V0ID0gbnVtX2ludGVycnVwdF9vdXQ7CiAKLSNpZiAwCi0JLyogY2hlY2sgdGhhdCB0aGUgZGV2aWNlIG1lZXRzIHRoZSBkcml2ZXIncyByZXF1aXJlbWVudHMgKi8KLQlpZiAoKHR5cGUtPm51bV9pbnRlcnJ1cHRfaW4gIT0gTlVNX0RPTlRfQ0FSRSAmJgotCQkJCXR5cGUtPm51bV9pbnRlcnJ1cHRfaW4gIT0gbnVtX2ludGVycnVwdF9pbikKLQkJCXx8ICh0eXBlLT5udW1faW50ZXJydXB0X291dCAhPSBOVU1fRE9OVF9DQVJFICYmCi0JCQkJdHlwZS0+bnVtX2ludGVycnVwdF9vdXQgIT0gbnVtX2ludGVycnVwdF9vdXQpCi0JCQl8fCAodHlwZS0+bnVtX2J1bGtfaW4gIT0gTlVNX0RPTlRfQ0FSRSAmJgotCQkJCXR5cGUtPm51bV9idWxrX2luICE9IG51bV9idWxrX2luKQotCQkJfHwgKHR5cGUtPm51bV9idWxrX291dCAhPSBOVU1fRE9OVF9DQVJFICYmCi0JCQkJdHlwZS0+bnVtX2J1bGtfb3V0ICE9IG51bV9idWxrX291dCkpIHsKLQkJZGJnKCJ3cm9uZyBudW1iZXIgb2YgZW5kcG9pbnRzIik7Ci0JCWtmcmVlKHNlcmlhbCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLSNlbmRpZgotCiAJLyogZm91bmQgYWxsIHRoYXQgd2UgbmVlZCAqLwogCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIiVzIGNvbnZlcnRlciBkZXRlY3RlZFxuIiwKIAkJCXR5cGUtPmRlc2NyaXB0aW9uKTsKQEAgLTg4Myw3ICs4NzQsNyBAQAogCXNlcmlhbC0+bnVtX3BvcnRfcG9pbnRlcnMgPSBtYXhfZW5kcG9pbnRzOwogCXVubG9ja19rZXJuZWwoKTsKIAotCWRiZygiJXMgLSBzZXR0aW5nIHVwICVkIHBvcnQgc3RydWN0dXJlcyBmb3IgdGhpcyBkZXZpY2UiLCBfX0ZVTkNUSU9OX18sIG1heF9lbmRwb2ludHMpOworCWRiZygiJXMgLSBzZXR0aW5nIHVwICVkIHBvcnQgc3RydWN0dXJlcyBmb3IgdGhpcyBkZXZpY2UiLCBfX2Z1bmNfXywgbWF4X2VuZHBvaW50cyk7CiAJZm9yIChpID0gMDsgaSA8IG1heF9lbmRwb2ludHM7ICsraSkgewogCQlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvcnQpCkBAIC0xMDMxLDcgKzEwMjIsNyBAQAogCQlwb3J0LT5kZXYucmVsZWFzZSA9ICZwb3J0X3JlbGVhc2U7CiAKIAkJc25wcmludGYgKCZwb3J0LT5kZXYuYnVzX2lkWzBdLCBzaXplb2YocG9ydC0+ZGV2LmJ1c19pZCksICJ0dHlVU0IlZCIsIHBvcnQtPm51bWJlcik7Ci0JCWRiZyAoIiVzIC0gcmVnaXN0ZXJpbmcgJXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPmRldi5idXNfaWQpOworCQlkYmcgKCIlcyAtIHJlZ2lzdGVyaW5nICVzIiwgX19mdW5jX18sIHBvcnQtPmRldi5idXNfaWQpOwogCQlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJnBvcnQtPmRldik7CiAJCWlmIChyZXR2YWwpCiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJFcnJvciByZWdpc3RlcmluZyBwb3J0IGRldmljZSwgIgpAQCAtMTA5MCw3ICsxMDgxLDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCiAJdXNiX3NlcmlhbF9jb25zb2xlX2Rpc2Nvbm5lY3Qoc2VyaWFsKTsKLQlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnICgiJXMiLCBfX2Z1bmNfXyk7CiAKIAltdXRleF9sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOwogCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgTlVMTCk7CkBAIC0xMTc0LDcgKzExNjUsNyBAQAogCiAJcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZ1c2Jfc2VyaWFsX2J1c190eXBlKTsKIAlpZiAocmVzdWx0KSB7Ci0JCWVycigiJXMgLSByZWdpc3RlcmluZyBidXMgZHJpdmVyIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgLSByZWdpc3RlcmluZyBidXMgZHJpdmVyIGZhaWxlZCIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0X2J1czsKIAl9CiAKQEAgLTExODgsMjQgKzExNzksMjYgQEAKIAl1c2Jfc2VyaWFsX3R0eV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CiAJdXNiX3NlcmlhbF90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJdXNiX3NlcmlhbF90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwl1c2Jfc2VyaWFsX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7CisJdXNiX3NlcmlhbF90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOwogCXR0eV9zZXRfb3BlcmF0aW9ucyh1c2Jfc2VyaWFsX3R0eV9kcml2ZXIsICZzZXJpYWxfb3BzKTsKIAlyZXN1bHQgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHVzYl9zZXJpYWxfdHR5X2RyaXZlcik7CiAJaWYgKHJlc3VsdCkgewotCQllcnIoIiVzIC0gdHR5X3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gdHR5X3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdF9yZWdfZHJpdmVyOwogCX0KIAogCS8qIHJlZ2lzdGVyIHRoZSBVU0IgZHJpdmVyICovCiAJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZ1c2Jfc2VyaWFsX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJZXJyKCIlcyAtIHVzYl9yZWdpc3RlciBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gdXNiX3JlZ2lzdGVyIGZhaWxlZCIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0X3R0eTsKIAl9CiAKIAkvKiByZWdpc3RlciB0aGUgZ2VuZXJpYyBkcml2ZXIsIGlmIHdlIHNob3VsZCAqLwogCXJlc3VsdCA9IHVzYl9zZXJpYWxfZ2VuZXJpY19yZWdpc3RlcihkZWJ1Zyk7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJZXJyKCIlcyAtIHJlZ2lzdGVyaW5nIGdlbmVyaWMgZHJpdmVyIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWVycigiJXMgLSByZWdpc3RlcmluZyBnZW5lcmljIGRyaXZlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdF9nZW5lcmljOwogCX0KIApAQCAtMTIyMyw3ICsxMjE2LDcgQEAKIAlidXNfdW5yZWdpc3RlcigmdXNiX3NlcmlhbF9idXNfdHlwZSk7CiAKIGV4aXRfYnVzOgotCWVyciAoIiVzIC0gcmV0dXJuaW5nIHdpdGggZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJZXJyICgiJXMgLSByZXR1cm5pbmcgd2l0aCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCXB1dF90dHlfZHJpdmVyKHVzYl9zZXJpYWxfdHR5X2RyaXZlcik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYwppbmRleCAyNTdhNWU0Li5mOWZjOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYl9kZWJ1Zy5jCkBAIC0zNSw5ICszNSw2IEBACiAJCS5uYW1lID0JCSJkZWJ1ZyIsCiAJfSwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGUsCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAotCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKIAkubnVtX3BvcnRzID0JCTEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCmluZGV4IGMyYjAxZjcuLjVmYzIwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCkBAIC0xODksOSArMTg5LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIkhhbmRzcHJpbmcgVmlzb3IgLyBQYWxtIE9TIiwKIAkudXNiX2RyaXZlciA9CQkmdmlzb3JfZHJpdmVyLAogCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCTIsCi0JLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMgPQkJMiwKIAkub3BlbiA9CQkJdmlzb3Jfb3BlbiwKIAkuY2xvc2UgPQkJdmlzb3JfY2xvc2UsCkBAIC0yMTksOSArMjE2LDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIlNvbnkgQ2xpZSA1LjAiLAogCS51c2JfZHJpdmVyID0JCSZ2aXNvcl9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWNsaWVfaWRfNV90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCTIsCi0JLm51bV9idWxrX291dCA9CQkyLAogCS5udW1fcG9ydHMgPQkJMiwKIAkub3BlbiA9CQkJdmlzb3Jfb3BlbiwKIAkuY2xvc2UgPQkJdmlzb3JfY2xvc2UsCkBAIC0yNDksOSArMjQzLDYgQEAKIAkuZGVzY3JpcHRpb24gPQkJIlNvbnkgQ2xpZSAzLjUiLAogCS51c2JfZHJpdmVyID0JCSZ2aXNvcl9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWNsaWVfaWRfM181X3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCiAJLm51bV9wb3J0cyA9CQkxLAogCS5vcGVuID0JCQl2aXNvcl9vcGVuLAogCS5jbG9zZSA9CQl2aXNvcl9jbG9zZSwKQEAgLTI5MCw3ICsyODEsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKCFwb3J0LT5yZWFkX3VyYikgewogCQkvKiB0aGlzIGlzIG5lZWRlZCBmb3Igc29tZSBicmFpbiBkZWFkIFNvbnkgZGV2aWNlcyAqLwpAQCAtMzIyLDE2ICszMTMsMTYgQEAKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCV9fZnVuY19fLCByZXN1bHQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCQogCWlmIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKSB7Ci0JCWRiZygiJXMgLSBhZGRpbmcgaW50ZXJydXB0IGlucHV0IGZvciB0cmVvIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIGFkZGluZyBpbnRlcnJ1cHQgaW5wdXQgZm9yIHRyZW8iLCBfX2Z1bmNfXyk7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOwogCQlpZiAocmVzdWx0KQogCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJfQogZXhpdDoJCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTM0Myw3ICszMzQsNyBAQAogCXN0cnVjdCB2aXNvcl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGNoYXIgKnRyYW5zZmVyX2J1ZmZlcjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCQkgCiAJLyogc2h1dGRvd24gb3VyIHVyYnMgKi8KIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwpAQCAtMzc5LDEyICszNzAsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXM7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlpZiAocHJpdi0+b3V0c3RhbmRpbmdfdXJicyA+IFVSQl9VUFBFUl9MSU1JVCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCWRiZygiJXMgLSB3cml0ZSBsaW1pdCBoaXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSB3cml0ZSBsaW1pdCBoaXRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCXByaXYtPm91dHN0YW5kaW5nX3VyYnMrKzsKQEAgLTQwNiw3ICszOTcsNyBAQAogCiAJbWVtY3B5IChidWZmZXIsIGJ1ZiwgY291bnQpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBidWZmZXIpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sIGNvdW50LCBidWZmZXIpOwogCiAJdXNiX2ZpbGxfYnVsa191cmIgKHVyYiwgc2VyaWFsLT5kZXYsCiAJCQkgICB1c2Jfc25kYnVsa3BpcGUgKHNlcmlhbC0+ZGV2LApAQCAtNDE4LDcgKzQwOSw3IEBACiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkIHdpdGggc3RhdHVzID0gJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJY291bnQgPSBzdGF0dXM7CiAJCWdvdG8gZXJyb3I7CiAJfSBlbHNlIHsKQEAgLTQ0OSw3ICs0NDAsNyBAQAogCXN0cnVjdCB2aXNvcl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyoKIAkgKiBXZSByZWFsbHkgY2FuIHRha2UgYW55dGhpbmcgdGhlIHVzZXIgdGhyb3dzIGF0IHVzCkBAIC00NjAsNyArNDUxLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT5vdXRzdGFuZGluZ191cmJzID4gVVJCX1VQUEVSX0xJTUlUICogMiAvIDMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC00NzEsMTMgKzQ2MiwxNSBAQAogCiBzdGF0aWMgaW50IHZpc29yX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJLyogCiAJICogV2UgY2FuJ3QgcmVhbGx5IGFjY291bnQgZm9yIGhvdyBtdWNoIGRhdGEgd2UKIAkgKiBoYXZlIHNlbnQgb3V0LCBidXQgaGFzbid0IG1hZGUgaXQgdGhyb3VnaCB0byB0aGUKIAkgKiBkZXZpY2UsIHNvIGp1c3QgdGVsbCB0aGUgdHR5IGxheWVyIHRoYXQgZXZlcnl0aGluZwogCSAqIGlzIGZsdXNoZWQuCisJICoKKwkgKiBGSVhNRTogU2hvdWxkIHdhbGsgb3V0c3RhbmRpbmdfdXJicwogCSAqLwogCXJldHVybiAwOwogfQpAQCAtNDg1LDcgKzQ3OCw3IEBACiAKIHN0YXRpYyB2b2lkIHZpc29yX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgdmlzb3JfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQ5MywxMSArNDg2LDExIEBACiAJLyogZnJlZSB1cCB0aGUgdHJhbnNmZXIgYnVmZmVyLCBhcyB1c2JfZnJlZV91cmIoKSBkb2VzIG5vdCBkbyB0aGlzICovCiAJa2ZyZWUgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKQogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCS0tcHJpdi0+b3V0c3RhbmRpbmdfdXJiczsKQEAgLTUwOSw3ICs1MDIsNyBAQAogCiBzdGF0aWMgdm9pZCB2aXNvcl9yZWFkX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgdmlzb3JfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwpAQCAtNTE3LDE1ICs1MTAsMTUgQEAKIAlpbnQgcmVzdWx0OwogCWludCBhdmFpbGFibGVfcm9vbTsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewpAQCAtNTUxLDcgKzU0NCw3IEBACiAJCQkJICAgdmlzb3JfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KQotCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJfSBlbHNlIHsKIAkJcHJpdi0+YWN0dWFsbHlfdGhyb3R0bGVkID0gMTsKIAl9CkBAIC01NjAsNyArNTUzLDcgQEAKIAogc3RhdGljIHZvaWQgdmlzb3JfcmVhZF9pbnRfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IHJlc3VsdDsKIApAQCAtNTczLDExICs1NjYsMTEgQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNTg4LDE0ICs1ODEsMTQgQEAKIAkgKiBSdW1vciBoYXMgaXQgdGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIG5vdGlmeSB3aGVuIGRhdGEKIAkgKiBpcyByZWFkeSB0byBiZSByZWFkIGZyb20gdGhlIGJ1bGsgb25lcy4KIAkgKi8KLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIGV4aXQ6CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJX19mdW5jX18sIHJlc3VsdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZpc29yX3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQpAQCAtNjAzLDcgKzU5Niw3IEBACiAJc3RydWN0IHZpc29yX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT50aHJvdHRsZWQgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTYxNiw3ICs2MDksNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlc3VsdDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT50aHJvdHRsZWQgPSAwOwogCXByaXYtPmFjdHVhbGx5X3Rocm90dGxlZCA9IDA7CkBAIC02MjUsNyArNjE4LDcgQEAKIAlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpCi0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIH0KIAogc3RhdGljIGludCBwYWxtX29zXzNfcHJvYmUgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKQEAgLTYzOCwxMSArNjMxLDExIEBACiAJaW50IGk7CiAJaW50IG51bV9wb3J0cyA9IDA7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJdHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyAoc2l6ZW9mICgqY29ubmVjdGlvbl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cmFuc2Zlcl9idWZmZXIpIHsKLQkJZGV2X2VycihkZXYsICIlcyAtIGttYWxsb2MoJVpkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sCisJCWRldl9lcnIoZGV2LCAiJXMgLSBrbWFsbG9jKCVaZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sCiAJCQlzaXplb2YoKmNvbm5lY3Rpb25faW5mbykpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02NTUsNyArNjQ4LDcgQEAKIAkJCQkgIHNpemVvZigqY29ubmVjdGlvbl9pbmZvKSwgMzAwKTsKIAlpZiAocmV0dmFsIDwgMCkgewogCQlkZXZfZXJyKGRldiwgIiVzIC0gZXJyb3IgJWQgZ2V0dGluZyBjb25uZWN0aW9uIGluZm9ybWF0aW9uXG4iLAotCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQkJX19mdW5jX18sIHJldHZhbCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTcxNSw3ICs3MDgsNyBAQAogCQkJCSAgMHgwMiwgMzAwKTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJZGV2X2VycihkZXYsICIlcyAtIGVycm9yICVkIGdldHRpbmcgYnl0ZXMgYXZhaWxhYmxlIHJlcXVlc3RcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQlfX2Z1bmNfXywgcmV0dmFsKTsKIAlyZXR2YWwgPSAwOwogCiBleGl0OgpAQCAtNzMxLDExICs3MjQsMTEgQEAKIAl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXI7CiAJaW50IHJldHZhbDsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAl0cmFuc2Zlcl9idWZmZXIgPSAga21hbGxvYyAoc2l6ZW9mICgqY29ubmVjdGlvbl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cmFuc2Zlcl9idWZmZXIpIHsKLQkJZGV2X2VycihkZXYsICIlcyAtIGttYWxsb2MoJVpkKSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18sCisJCWRldl9lcnIoZGV2LCAiJXMgLSBrbWFsbG9jKCVaZCkgZmFpbGVkLlxuIiwgX19mdW5jX18sCiAJCQlzaXplb2YoKmNvbm5lY3Rpb25faW5mbykpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC03NDcsOSArNzQwLDkgQEAKIAkJCQkgIHNpemVvZiAoKmNvbm5lY3Rpb25faW5mbyksIDMwMCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCWRldl9lcnIoZGV2LCAiJXMgLSBlcnJvciAlZCBnZXR0aW5nIGNvbm5lY3Rpb24gaW5mb1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJCV9fZnVuY19fLCByZXR2YWwpOwogCWVsc2UKLQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmc2VyaWFsLT5kZXYtPmRldiwgX19GVU5DVElPTl9fLAorCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZzZXJpYWwtPmRldi0+ZGV2LCBfX2Z1bmNfXywKIAkJCQkgICAgICByZXR2YWwsIHRyYW5zZmVyX2J1ZmZlcik7CiAKIAlrZnJlZSAodHJhbnNmZXJfYnVmZmVyKTsKQEAgLTc2Miw3ICs3NTUsNyBAQAogCWludCByZXR2YWwgPSAwOwogCWludCAoKnN0YXJ0dXApIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzZXJpYWwtPmRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUgIT0gMSkgewogCQllcnIoImFjdGl2ZSBjb25maWcgIyVkICE9IDEgPz8iLApAQCAtODE2LDcgKzgwOSw3IEBACiAJaW50IHJlc3VsdDsKIAl1OCBkYXRhOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qCiAJICogTm90ZSB0aGF0IFBFRy0zMDAgc2VyaWVzIGRldmljZXMgZXhwZWN0IHRoZSBmb2xsb3dpbmcgdHdvIGNhbGxzLgpAQCAtODI3LDExICs4MjAsMTEgQEAKIAkJCQkgIFVTQl9SRVFfR0VUX0NPTkZJR1VSQVRJT04sIFVTQl9ESVJfSU4sCiAJCQkJICAwLCAwLCAmZGF0YSwgMSwgMzAwMCk7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJZGV2X2VycihkZXYsICIlczogZ2V0IGNvbmZpZyBudW1iZXIgZmFpbGVkOiAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKGRldiwgIiVzOiBnZXQgY29uZmlnIG51bWJlciBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAJaWYgKHJlc3VsdCAhPSAxKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGdldCBjb25maWcgbnVtYmVyIGJhZCByZXR1cm4gbGVuZ3RoOiAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQlkZXZfZXJyKGRldiwgIiVzOiBnZXQgY29uZmlnIG51bWJlciBiYWQgcmV0dXJuIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTg0MSwxMSArODM0LDExIEBACiAJCQkJICBVU0JfRElSX0lOIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKIAkJCQkgIDAsIDAsICZkYXRhLCAxLCAzMDAwKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBnZXQgaW50ZXJmYWNlIG51bWJlciBmYWlsZWQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoZGV2LCAiJXM6IGdldCBpbnRlcmZhY2UgbnVtYmVyIGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAlpZiAocmVzdWx0ICE9IDEpIHsKLQkJZGV2X2VycihkZXYsICIlczogZ2V0IGludGVyZmFjZSBudW1iZXIgYmFkIHJldHVybiBsZW5ndGg6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoZGV2LCAiJXM6IGdldCBpbnRlcmZhY2UgbnVtYmVyIGJhZCByZXR1cm4gbGVuZ3RoOiAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtODYzLDcgKzg1Niw3IEBACiAJICAgIChzZXJpYWwtPm51bV9pbnRlcnJ1cHRfaW4gPT0gMCkpCiAJCWdvdG8gZ2VuZXJpY19zdGFydHVwOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qCiAJKiBJdCBhcHBlYXJzIHRoYXQgVHJlb3MgYW5kIEt5b2NlcmFzIHdhbnQgdG8gdXNlIHRoZSAKQEAgLTg5NCw3ICs4ODcsNyBAQAogCiBzdGF0aWMgaW50IGNsaWVfNV9hdHRhY2ggKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCS8qIFRINTUgcmVnaXN0ZXJzIDIgcG9ydHMuIAogCSAgIENvbW11bmljYXRpb24gaW4gZnJvbSB0aGUgVVg1MC9USDU1IHVzZXMgYnVsa19pbl9lbmRwb2ludEFkZHJlc3MgZnJvbSBwb3J0IDAgCkBAIC05MTgsNyArOTExLDcgQEAKIAlzdHJ1Y3Qgdmlzb3JfcHJpdmF0ZSAqcHJpdjsKIAlpbnQgaTsKIAotCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7IGkrKykgewogCQlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFtpXSk7CkBAIC05MzEsNyArOTI0LDcgQEAKIAogc3RhdGljIGludCB2aXNvcl9pb2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkYmcoIiVzIC0gcG9ydCAlZCwgY21kIDB4JS40eCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgMHglLjR4IiwgX19mdW5jX18sIHBvcnQtPm51bWJlciwgY21kKTsKIAogCXJldHVybiAtRU5PSU9DVExDTUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKaW5kZXggMzg3MjZlZi4uZTk2YmY4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwpAQCAtMTY0LDkgKzE2NCw2IEBACiAJLmRlc2NyaXB0aW9uID0JCSJDb25uZWN0IFRlY2ggLSBXaGl0ZUhFQVQgLSAocHJlcmVudW1lcmF0aW9uKSIsCiAJLnVzYl9kcml2ZXIgPQkJJndoaXRlaGVhdF9kcml2ZXIsCiAJLmlkX3RhYmxlID0JCWlkX3RhYmxlX3ByZXJlbnVtZXJhdGlvbiwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fcG9ydHMgPQkJMSwKIAkucHJvYmUgPQkJd2hpdGVoZWF0X2Zpcm13YXJlX2Rvd25sb2FkLAogCS5hdHRhY2ggPQkJd2hpdGVoZWF0X2Zpcm13YXJlX2F0dGFjaCwKQEAgLTE4MCw5ICsxNzcsNiBAQAogCS5kZXNjcmlwdGlvbiA9CQkiQ29ubmVjdCBUZWNoIC0gV2hpdGVIRUFUIiwKIAkudXNiX2RyaXZlciA9CQkmd2hpdGVoZWF0X2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGVfc3RkLAotCS5udW1faW50ZXJydXB0X2luID0JTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ID0JCU5VTV9ET05UX0NBUkUsCiAJLm51bV9wb3J0cyA9CQk0LAogCS5hdHRhY2ggPQkJd2hpdGVoZWF0X2F0dGFjaCwKIAkuc2h1dGRvd24gPQkJd2hpdGVoZWF0X3NodXRkb3duLApAQCAtMjI1LDcgKzIxOSw3IEBACiBzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUgewogCXNwaW5sb2NrX3QJCWxvY2s7CiAJX191OAkJCWZsYWdzOwotCV9fdTgJCQltY3I7CisJX191OAkJCW1jcjsJCS8qIEZJWE1FOiBubyBsb2NraW5nIG9uIG1jciAqLwogCXN0cnVjdCBsaXN0X2hlYWQJcnhfdXJic19mcmVlOwogCXN0cnVjdCBsaXN0X2hlYWQJcnhfdXJic19zdWJtaXR0ZWQ7CiAJc3RydWN0IGxpc3RfaGVhZAlyeF91cmJfcTsKQEAgLTI4OCw3ICsyODIsNyBAQAogCWludCByZXNwb25zZTsKIAljb25zdCBzdHJ1Y3Qgd2hpdGVoZWF0X2hleF9yZWNvcmQgKnJlY29yZDsKIAkKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCQogCXJlc3BvbnNlID0gZXp1c2Jfc2V0X3Jlc2V0IChzZXJpYWwsIDEpOwogCkBAIC0yOTgsNyArMjkyLDcgQEAKIAkJCQkodW5zaWduZWQgY2hhciAqKXJlY29yZC0+ZGF0YSwgcmVjb3JkLT5kYXRhX3NpemUsIDB4YTApOwogCQlpZiAocmVzcG9uc2UgPCAwKSB7CiAJCQllcnIoIiVzIC0gZXp1c2Jfd3JpdGVtZW1vcnkgZmFpbGVkIGZvciBsb2FkZXIgKCVkICUwNFggJXAgJWQpIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3BvbnNlLCByZWNvcmQtPmFkZHJlc3MsIHJlY29yZC0+ZGF0YSwgcmVjb3JkLT5kYXRhX3NpemUpOworCQkJCV9fZnVuY19fLCByZXNwb25zZSwgcmVjb3JkLT5hZGRyZXNzLCByZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplKTsKIAkJCWJyZWFrOwogCQl9CiAJCSsrcmVjb3JkOwpAQCAtMzE1LDcgKzMwOSw3IEBACiAJCQkJKHVuc2lnbmVkIGNoYXIgKilyZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplLCAweGEzKTsKIAkJaWYgKHJlc3BvbnNlIDwgMCkgewogCQkJZXJyKCIlcyAtIGV6dXNiX3dyaXRlbWVtb3J5IGZhaWxlZCBmb3IgZmlyc3QgZmlybXdhcmUgc3RlcCAoJWQgJTA0WCAlcCAlZCkiLCAKLQkJCQlfX0ZVTkNUSU9OX18sIHJlc3BvbnNlLCByZWNvcmQtPmFkZHJlc3MsIHJlY29yZC0+ZGF0YSwgcmVjb3JkLT5kYXRhX3NpemUpOworCQkJCV9fZnVuY19fLCByZXNwb25zZSwgcmVjb3JkLT5hZGRyZXNzLCByZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplKTsKIAkJCWJyZWFrOwogCQl9CiAJCSsrcmVjb3JkOwpAQCAtMzI5LDcgKzMyMyw3IEBACiAJCQkJKHVuc2lnbmVkIGNoYXIgKilyZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplLCAweGEwKTsKIAkJaWYgKHJlc3BvbnNlIDwgMCkgewogCQkJZXJyKCIlcyAtIGV6dXNiX3dyaXRlbWVtb3J5IGZhaWxlZCBmb3Igc2Vjb25kIGZpcm13YXJlIHN0ZXAgKCVkICUwNFggJXAgJWQpIiwgCi0JCQkJX19GVU5DVElPTl9fLCByZXNwb25zZSwgcmVjb3JkLT5hZGRyZXNzLCByZWNvcmQtPmRhdGEsIHJlY29yZC0+ZGF0YV9zaXplKTsKKwkJCQlfX2Z1bmNfXywgcmVzcG9uc2UsIHJlY29yZC0+YWRkcmVzcywgcmVjb3JkLT5kYXRhLCByZWNvcmQtPmRhdGFfc2l6ZSk7CiAJCQlicmVhazsKIAkJfQogCQkrK3JlY29yZDsKQEAgLTU2Nyw3ICs1NjEsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDI7CiAJaW50IGk7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJLyogZnJlZSB1cCBvdXIgcHJpdmF0ZSBkYXRhIGZvciBvdXIgY29tbWFuZCBwb3J0ICovCiAJY29tbWFuZF9wb3J0ID0gc2VyaWFsLT5wb3J0W0NPTU1BTkRfUE9SVF07CkBAIC02MDQsNyArNTk4LDcgQEAKIAlpbnQJCXJldHZhbCA9IDA7CiAJc3RydWN0IGt0ZXJtaW9zCW9sZF90ZXJtOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXJldHZhbCA9IHN0YXJ0X2NvbW1hbmRfcG9ydChwb3J0LT5zZXJpYWwpOwogCWlmIChyZXR2YWwpCkBAIC02MzcsMTQgKzYzMSwxNCBAQAogCS8qIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlICovCiAJcmV0dmFsID0gc3RhcnRfcG9ydF9yZWFkKHBvcnQpOwogCWlmIChyZXR2YWwpIHsKLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXR2YWwpOwogCQlmaXJtX2Nsb3NlKHBvcnQpOwogCQlzdG9wX2NvbW1hbmRfcG9ydChwb3J0LT5zZXJpYWwpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiBleGl0OgotCWRiZygiJXMgLSBleGl0LCByZXR2YWwgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlkYmcoIiVzIC0gZXhpdCwgcmV0dmFsID0gJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC02NTcsNyArNjUxLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wMjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAltdXRleF9sb2NrKCZwb3J0LT5zZXJpYWwtPmRpc2NfbXV0ZXgpOwogCS8qIGZpbHAgaXMgTlVMTCB3aGVuIGNhbGxlZCBmcm9tIHVzYl9zZXJpYWxfZGlzY29ubmVjdCAqLwpAQCAtNzMyLDEwICs3MjYsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuICgwKTsKIAl9CiAKQEAgLTc1NCwxMyArNzQ4LDEzIEBACiAJCWJ5dGVzID0gKGNvdW50ID4gcG9ydC0+YnVsa19vdXRfc2l6ZSkgPyBwb3J0LT5idWxrX291dF9zaXplIDogY291bnQ7CiAJCW1lbWNweSAodXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiArIHNlbnQsIGJ5dGVzKTsKIAotCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgYnl0ZXMsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgYnl0ZXMsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAogCQl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBieXRlczsKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogCQkJc2VudCA9IHJlc3VsdDsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQlsaXN0X2FkZCh0bXAsICZpbmZvLT50eF91cmJzX2ZyZWUpOwpAQCAtNzg2LDcgKzc4MCw3IEBACiAJaW50IHJvb20gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCQogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaCh0bXAsICZpbmZvLT50eF91cmJzX2ZyZWUpCkBAIC03OTQsNyArNzg4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJcm9vbSAqPSBwb3J0LT5idWxrX291dF9zaXplOwogCi0JZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJvb20pOworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19mdW5jX18sIHJvb20pOwogCXJldHVybiAocm9vbSk7CiB9CiAKQEAgLTgwNCw3ICs3OTgsNyBAQAogCXN0cnVjdCB3aGl0ZWhlYXRfcHJpdmF0ZSAqaW5mbyA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBpbnQgbW9kZW1fc2lnbmFscyA9IDA7CiAKLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCiAJZmlybV9nZXRfZHRyX3J0cyhwb3J0KTsKIAlpZiAoaW5mby0+bWNyICYgVUFSVF9NQ1JfRFRSKQpAQCAtODIxLDcgKzgxNSw3IEBACiB7CiAJc3RydWN0IHdoaXRlaGVhdF9wcml2YXRlICppbmZvID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChzZXQgJiBUSU9DTV9SVFMpCiAJCWluZm8tPm1jciB8PSBVQVJUX01DUl9SVFM7CkBAIC04NDQsNyArODM4LDcgQEAKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzZXJzdHJ1Y3Q7CiAJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQsIGNtZCAweCUuNHgiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY21kKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kIDB4JS40eCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCQljYXNlIFRJT0NHU0VSSUFMOgpAQCAtODg2LDcgKzg4MCw3IEBACiAKIHN0YXRpYyB2b2lkIHdoaXRlaGVhdF9zZXRfdGVybWlvcyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewotCWRiZygiJXMgLXBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCWZpcm1fc2V0dXBfcG9ydChwb3J0KTsKIH0KIApAQCAtOTA0LDcgKzg5OCw3IEBACiAJaW50IGNoYXJzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaCh0bXAsICZpbmZvLT50eF91cmJzX3N1Ym1pdHRlZCkgewpAQCAtOTEzLDcgKzkwNyw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKIAotCWRiZyAoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCWRiZyAoIiVzIC0gcmV0dXJucyAlZCIsIF9fZnVuY19fLCBjaGFycyk7CiAJcmV0dXJuIGNoYXJzOwogfQogCkBAIC05MjMsNyArOTE3LDcgQEAKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUgKmluZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwogCWluZm8tPmZsYWdzIHw9IFRIUk9UVExFRDsKQEAgLTkzOSw3ICs5MzMsNyBAQAogCWludCBhY3R1YWxseV90aHJvdHRsZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwogCWFjdHVhbGx5X3Rocm90dGxlZCA9IGluZm8tPmZsYWdzICYgQUNUVUFMTFlfVEhST1RUTEVEOwpAQCAtOTYwLDcgKzk1NCw3IEBACiB7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAogCWlmIChzdGF0dXMpIHsKIAkJZGJnKCJub256ZXJvIHVyYiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKQEAgLTk3MSwyOCArOTY1LDI4IEBACiAKIHN0YXRpYyB2b2lkIGNvbW1hbmRfcG9ydF9yZWFkX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpjb21tYW5kX3BvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpjb21tYW5kX3BvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHdoaXRlaGVhdF9jb21tYW5kX3ByaXZhdGUgKmNvbW1hbmRfaW5mbzsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWludCByZXN1bHQ7CiAKLQlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJY29tbWFuZF9pbmZvID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKGNvbW1hbmRfcG9ydCk7CiAJaWYgKCFjb21tYW5kX2luZm8pIHsKLQkJZGJnICgiJXMgLSBjb21tYW5kX2luZm8gaXMgTlVMTCwgZXhpdGluZy4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcgKCIlcyAtIGNvbW1hbmRfaW5mbyBpcyBOVUxMLCBleGl0aW5nLiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoc3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQljb21tYW5kX2luZm8tPmNvbW1hbmRfZmluaXNoZWQgPSBXSElURUhFQVRfQ01EX0ZBSUxVUkU7CiAJCXdha2VfdXAoJmNvbW1hbmRfaW5mby0+d2FpdF9jb21tYW5kKTsKIAkJcmV0dXJuOwogCX0KIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmNvbW1hbmRfcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmY29tbWFuZF9wb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJaWYgKGRhdGFbMF0gPT0gV0hJVEVIRUFUX0NNRF9DT01QTEVURSkgewogCQljb21tYW5kX2luZm8tPmNvbW1hbmRfZmluaXNoZWQgPSBXSElURUhFQVRfQ01EX0NPTVBMRVRFOwpAQCAtMTAwMiwzOCArOTk2LDM4IEBACiAJCXdha2VfdXAoJmNvbW1hbmRfaW5mby0+d2FpdF9jb21tYW5kKTsKIAl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gV0hJVEVIRUFUX0VWRU5UKSB7CiAJCS8qIFRoZXNlIGFyZSB1bnNvbGljaXRlZCByZXBvcnRzIGZyb20gdGhlIGZpcm13YXJlLCBoZW5jZSBubyB3YWl0aW5nIGNvbW1hbmQgdG8gd2FrZXVwICovCi0JCWRiZygiJXMgLSBldmVudCByZWNlaXZlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBldmVudCByZWNlaXZlZCIsIF9fZnVuY19fKTsKIAl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gV0hJVEVIRUFUX0dFVF9EVFJfUlRTKSB7CiAJCW1lbWNweShjb21tYW5kX2luZm8tPnJlc3VsdF9idWZmZXIsICZkYXRhWzFdLCB1cmItPmFjdHVhbF9sZW5ndGggLSAxKTsKIAkJY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID0gV0hJVEVIRUFUX0NNRF9DT01QTEVURTsKIAkJd2FrZV91cCgmY29tbWFuZF9pbmZvLT53YWl0X2NvbW1hbmQpOwogCX0gZWxzZSB7Ci0JCWRiZygiJXMgLSBiYWQgcmVwbHkgZnJvbSBmaXJtd2FyZSIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBiYWQgcmVwbHkgZnJvbSBmaXJtd2FyZSIsIF9fZnVuY19fKTsKIAl9CiAJCiAJLyogQ29udGludWUgdHJ5aW5nIHRvIGFsd2F5cyByZWFkICovCiAJY29tbWFuZF9wb3J0LT5yZWFkX3VyYi0+ZGV2ID0gY29tbWFuZF9wb3J0LT5zZXJpYWwtPmRldjsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihjb21tYW5kX3BvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0KQotCQlkYmcoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRiZygiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogfQogCiAKIHN0YXRpYyB2b2lkIHdoaXRlaGVhdF9yZWFkX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3VyYl93cmFwICp3cmFwOwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUgKmluZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CiAJd3JhcCA9IHVyYl90b193cmFwKHVyYiwgJmluZm8tPnJ4X3VyYnNfc3VibWl0dGVkKTsKIAlpZiAoIXdyYXApIHsKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQllcnIoIiVzIC0gTm90IG15IHVyYiEiLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIC0gTm90IG15IHVyYiEiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJbGlzdF9kZWwoJndyYXAtPmxpc3QpOwpAQCAtMTA0MSwxNCArMTAzNSwxNCBAQAogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKIAkJbGlzdF9hZGQoJndyYXAtPmxpc3QsICZpbmZvLT5yeF91cmJzX2ZyZWUpOwogCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCXJldHVybjsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCiAJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZ3cmFwLT5saXN0LCAmaW5mby0+cnhfdXJiX3EpOwpAQCAtMTA2NSwxOCArMTA1OSwxOCBAQAogCiBzdGF0aWMgdm9pZCB3aGl0ZWhlYXRfd3JpdGVfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB3aGl0ZWhlYXRfcHJpdmF0ZSAqaW5mbyA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3VyYl93cmFwICp3cmFwOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlzcGluX2xvY2soJmluZm8tPmxvY2spOwogCXdyYXAgPSB1cmJfdG9fd3JhcCh1cmIsICZpbmZvLT50eF91cmJzX3N1Ym1pdHRlZCk7CiAJaWYgKCF3cmFwKSB7CiAJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19GVU5DVElPTl9fKTsKKwkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCWxpc3RfbW92ZSgmd3JhcC0+bGlzdCwgJmluZm8tPnR4X3VyYnNfZnJlZSk7CkBAIC0xMDg0LDcgKzEwNzgsNyBAQAogCiAJaWYgKHN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExMDQsNyArMTA5OCw3IEBACiAJaW50IHJldHZhbCA9IDA7CiAJaW50IHQ7CiAKLQlkYmcoIiVzIC0gY29tbWFuZCAlZCIsIF9fRlVOQ1RJT05fXywgY29tbWFuZCk7CisJZGJnKCIlcyAtIGNvbW1hbmQgJWQiLCBfX2Z1bmNfXywgY29tbWFuZCk7CiAKIAljb21tYW5kX3BvcnQgPSBwb3J0LT5zZXJpYWwtPnBvcnRbQ09NTUFORF9QT1JUXTsKIAljb21tYW5kX2luZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoY29tbWFuZF9wb3J0KTsKQEAgLTExMTgsNyArMTExMiw3IEBACiAJY29tbWFuZF9wb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiIChjb21tYW5kX3BvcnQtPndyaXRlX3VyYiwgR0ZQX05PSU8pOwogCWlmIChyZXR2YWwpIHsKLQkJZGJnKCIlcyAtIHN1Ym1pdCB1cmIgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZGJnKCIlcyAtIHN1Ym1pdCB1cmIgZmFpbGVkIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMTI5LDE5ICsxMTIzLDE5IEBACiAJCXVzYl9raWxsX3VyYihjb21tYW5kX3BvcnQtPndyaXRlX3VyYik7CiAKIAlpZiAoY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID09IGZhbHNlKSB7Ci0JCWRiZygiJXMgLSBjb21tYW5kIHRpbWVkIG91dC4iLCBfX0ZVTkNUSU9OX18pOworCQlkYmcoIiVzIC0gY29tbWFuZCB0aW1lZCBvdXQuIiwgX19mdW5jX18pOwogCQlyZXR2YWwgPSAtRVRJTUVET1VUOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJaWYgKGNvbW1hbmRfaW5mby0+Y29tbWFuZF9maW5pc2hlZCA9PSBXSElURUhFQVRfQ01EX0ZBSUxVUkUpIHsKLQkJZGJnKCIlcyAtIGNvbW1hbmQgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBjb21tYW5kIGZhaWxlZC4iLCBfX2Z1bmNfXyk7CiAJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID09IFdISVRFSEVBVF9DTURfQ09NUExFVEUpIHsKLQkJZGJnKCIlcyAtIGNvbW1hbmQgY29tcGxldGVkLiIsIF9fRlVOQ1RJT05fXyk7CisJCWRiZygiJXMgLSBjb21tYW5kIGNvbXBsZXRlZC4iLCBfX2Z1bmNfXyk7CiAJCXN3aXRjaCAoY29tbWFuZCkgewogCQkJY2FzZSBXSElURUhFQVRfR0VUX0RUUl9SVFM6CiAJCQkJaW5mbyA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTExODYsNyArMTE4MCw3IEBACiAJCWRlZmF1bHQ6CiAJCWNhc2UgQ1M4Oglwb3J0X3NldHRpbmdzLmJpdHMgPSA4OyAgIGJyZWFrOwogCX0KLQlkYmcoIiVzIC0gZGF0YSBiaXRzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRfc2V0dGluZ3MuYml0cyk7CisJZGJnKCIlcyAtIGRhdGEgYml0cyA9ICVkIiwgX19mdW5jX18sIHBvcnRfc2V0dGluZ3MuYml0cyk7CiAJCiAJLyogZGV0ZXJtaW5lIHRoZSBwYXJpdHkgKi8KIAlpZiAoY2ZsYWcgJiBQQVJFTkIpCkBAIC0xMjAyLDIxICsxMTk2LDIxIEBACiAJCQkJcG9ydF9zZXR0aW5ncy5wYXJpdHkgPSBXSElURUhFQVRfUEFSX0VWRU47CiAJZWxzZQogCQlwb3J0X3NldHRpbmdzLnBhcml0eSA9IFdISVRFSEVBVF9QQVJfTk9ORTsKLQlkYmcoIiVzIC0gcGFyaXR5ID0gJWMiLCBfX0ZVTkNUSU9OX18sIHBvcnRfc2V0dGluZ3MucGFyaXR5KTsKKwlkYmcoIiVzIC0gcGFyaXR5ID0gJWMiLCBfX2Z1bmNfXywgcG9ydF9zZXR0aW5ncy5wYXJpdHkpOwogCiAJLyogZmlndXJlIG91dCB0aGUgc3RvcCBiaXRzIHJlcXVlc3RlZCAqLwogCWlmIChjZmxhZyAmIENTVE9QQikKIAkJcG9ydF9zZXR0aW5ncy5zdG9wID0gMjsKIAllbHNlCiAJCXBvcnRfc2V0dGluZ3Muc3RvcCA9IDE7Ci0JZGJnKCIlcyAtIHN0b3AgYml0cyA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0X3NldHRpbmdzLnN0b3ApOworCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAlZCIsIF9fZnVuY19fLCBwb3J0X3NldHRpbmdzLnN0b3ApOwogCiAJLyogZmlndXJlIG91dCB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzICovCiAJaWYgKGNmbGFnICYgQ1JUU0NUUykKIAkJcG9ydF9zZXR0aW5ncy5oZmxvdyA9IChXSElURUhFQVRfSEZMT1dfQ1RTIHwgV0hJVEVIRUFUX0hGTE9XX1JUUyk7CiAJZWxzZQogCQlwb3J0X3NldHRpbmdzLmhmbG93ID0gV0hJVEVIRUFUX0hGTE9XX05PTkU7Ci0JZGJnKCIlcyAtIGhhcmR3YXJlIGZsb3cgY29udHJvbCA9ICVzICVzICVzICVzIiwgX19GVU5DVElPTl9fLAorCWRiZygiJXMgLSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgPSAlcyAlcyAlcyAlcyIsIF9fZnVuY19fLAogCSAgICAocG9ydF9zZXR0aW5ncy5oZmxvdyAmIFdISVRFSEVBVF9IRkxPV19DVFMpID8gIkNUUyIgOiAiIiwKIAkgICAgKHBvcnRfc2V0dGluZ3MuaGZsb3cgJiBXSElURUhFQVRfSEZMT1dfUlRTKSA/ICJSVFMiIDogIiIsCiAJICAgIChwb3J0X3NldHRpbmdzLmhmbG93ICYgV0hJVEVIRUFUX0hGTE9XX0RTUikgPyAiRFNSIiA6ICIiLApAQCAtMTIyNywxNSArMTIyMSwxNSBAQAogCQlwb3J0X3NldHRpbmdzLnNmbG93ID0gV0hJVEVIRUFUX1NGTE9XX1JYVFg7CiAJZWxzZQogCQlwb3J0X3NldHRpbmdzLnNmbG93ID0gV0hJVEVIRUFUX1NGTE9XX05PTkU7Ci0JZGJnKCIlcyAtIHNvZnR3YXJlIGZsb3cgY29udHJvbCA9ICVjIiwgX19GVU5DVElPTl9fLCBwb3J0X3NldHRpbmdzLnNmbG93KTsKKwlkYmcoIiVzIC0gc29mdHdhcmUgZmxvdyBjb250cm9sID0gJWMiLCBfX2Z1bmNfXywgcG9ydF9zZXR0aW5ncy5zZmxvdyk7CiAJCiAJcG9ydF9zZXR0aW5ncy54b24gPSBTVEFSVF9DSEFSKHBvcnQtPnR0eSk7CiAJcG9ydF9zZXR0aW5ncy54b2ZmID0gU1RPUF9DSEFSKHBvcnQtPnR0eSk7Ci0JZGJnKCIlcyAtIFhPTiA9ICUyeCwgWE9GRiA9ICUyeCIsIF9fRlVOQ1RJT05fXywgcG9ydF9zZXR0aW5ncy54b24sIHBvcnRfc2V0dGluZ3MueG9mZik7CisJZGJnKCIlcyAtIFhPTiA9ICUyeCwgWE9GRiA9ICUyeCIsIF9fZnVuY19fLCBwb3J0X3NldHRpbmdzLnhvbiwgcG9ydF9zZXR0aW5ncy54b2ZmKTsKIAogCS8qIGdldCB0aGUgYmF1ZCByYXRlIHdhbnRlZCAqLwogCXBvcnRfc2V0dGluZ3MuYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHBvcnQtPnR0eSk7Ci0JZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0X3NldHRpbmdzLmJhdWQpOworCWRiZygiJXMgLSBiYXVkIHJhdGUgPSAlZCIsIF9fZnVuY19fLCBwb3J0X3NldHRpbmdzLmJhdWQpOwogCiAJLyogZml4bWU6IHNob3VsZCBzZXQgdmFsaWRhdGVkIHNldHRpbmdzICovCiAJdHR5X2VuY29kZV9iYXVkX3JhdGUocG9ydC0+dHR5LCBwb3J0X3NldHRpbmdzLmJhdWQsIHBvcnRfc2V0dGluZ3MuYmF1ZCk7CkBAIC0xMzE4LDcgKzEzMTIsNyBAQAogCQljb21tYW5kX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoY29tbWFuZF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19mdW5jX18sIHJldHZhbCk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CkBAIC0xNDU0LDcgKzE0NDgsNyBAQAogCQl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQlsaXN0X2FkZCh0bXAsICZpbmZvLT5yeF91cmJzX2ZyZWUpOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKaW5kZXggN2U1MzMzMy4uMGY2ZDIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwpAQCAtMzIsOCArMzIsOCBAQAogCSAgdmVyYm9zZSBkZWJ1Z2dpbmcgbWVzc2FnZXMuCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9EQVRBRkFCCi0JYm9vbCAiRGF0YWZhYiBDb21wYWN0IEZsYXNoIFJlYWRlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiRGF0YWZhYiBDb21wYWN0IEZsYXNoIFJlYWRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBjZXJ0YWluIERhdGFmYWIgQ29tcGFjdEZsYXNoIHJlYWRlcnMuCiAJICBEYXRhZmFiIGhhcyBhIHdlYiBwYWdlIGF0IDxodHRwOi8vd3d3LmRhdGFmYWJ1c2EuY29tLz4uCkBAIC02OSw4ICs2OSw4IEBACiAJICBUaGVyZSBpcyBhIHdlYiBwYWdlIGF0IDxodHRwOi8vd3d3Lnppb2NvcnAuY29tL3Byb2R1Y3RzLz4uCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9VU0JBVAotCWJvb2wgIlVTQkFUL1VTQkFUMDItYmFzZWQgc3RvcmFnZSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiVVNCQVQvVVNCQVQwMi1iYXNlZCBzdG9yYWdlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvZGUgdG8gc3VwcG9ydCBzdG9yYWdlIGRldmljZXMKIAkgIGJhc2VkIG9uIHRoZSBTQ00vU2h1dHRsZSBVU0JBVC9VU0JBVDAyIHByb2Nlc3NvcnMuCkBAIC05MCwzMCArOTAsMzAgQEAKIAkgIC0gU2FuZGlzayBJbWFnZU1hdGUgU0REUi0wNWIKIAogY29uZmlnIFVTQl9TVE9SQUdFX1NERFIwOQotCWJvb2wgIlNhbkRpc2sgU0REUi0wOSAoYW5kIG90aGVyIFNtYXJ0TWVkaWEpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0JfU1RPUkFHRSAmJiBFWFBFUklNRU5UQUwKKwlib29sICJTYW5EaXNrIFNERFItMDkgKGFuZCBvdGhlciBTbWFydE1lZGlhKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIFNhbmRpc2sgU0REUi0wOQogCSAgU21hcnRNZWRpYSByZWFkZXIgaW4gdGhlIFVTQiBNYXNzIFN0b3JhZ2UgZHJpdmVyLgogCSAgQWxzbyB3b3JrcyBmb3IgdGhlIE1pY3JvdGVjaCBaaW8hIFNtYXJ0TWVkaWEgcmVhZGVyLgogCiBjb25maWcgVVNCX1NUT1JBR0VfU0REUjU1Ci0JYm9vbCAiU2FuRGlzayBTRERSLTU1IFNtYXJ0TWVkaWEgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFICYmIEVYUEVSSU1FTlRBTAorCWJvb2wgIlNhbkRpc2sgU0REUi01NSBTbWFydE1lZGlhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvZGUgdG8gc3VwcG9ydCB0aGUgU2FuZGlzayBTRERSLTU1CiAJICBTbWFydE1lZGlhIHJlYWRlciBpbiB0aGUgVVNCIE1hc3MgU3RvcmFnZSBkcml2ZXIuCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9KVU1QU0hPVAotCWJvb2wgIkxleGFyIEp1bXBzaG90IENvbXBhY3QgRmxhc2ggUmVhZGVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiTGV4YXIgSnVtcHNob3QgQ29tcGFjdCBGbGFzaCBSZWFkZXIiCisJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvZGUgdG8gc3VwcG9ydCB0aGUgTGV4YXIgSnVtcHNob3QKIAkgIFVTQiBDb21wYWN0Rmxhc2ggcmVhZGVyLgogCiBjb25maWcgVVNCX1NUT1JBR0VfQUxBVURBCi0JYm9vbCAiT2x5bXB1cyBNQVVTQi0xMC9GdWppIERQQy1SMSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiT2x5bXB1cyBNQVVTQi0xMC9GdWppIERQQy1SMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIE9seW1wdXMgTUFVU0ItMTAKIAkgIGFuZCBGdWppZmlsbSBEUEMtUjEgVVNCIENhcmQgcmVhZGVyL3dyaXRlciBkZXZpY2VzLgpAQCAtMTIyLDggKzEyMiw4IEBACiAJICBYRCBhbmQgU21hcnRNZWRpYSBjYXJkcy4KIAogY29uZmlnIFVTQl9TVE9SQUdFX09ORVRPVUNICi0JYm9vbCAiU3VwcG9ydCBPbmVUb3VjaCBCdXR0b24gb24gTWF4dG9yIEhhcmQgRHJpdmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UgJiYgSU5QVVRfRVZERVYgJiYgRVhQRVJJTUVOVEFMICYmICFQTQorCWJvb2wgIlN1cHBvcnQgT25lVG91Y2ggQnV0dG9uIG9uIE1heHRvciBIYXJkIERyaXZlcyIKKwlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFICYmIElOUFVUX0VWREVWCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIGFkZGl0aW9uYWwgY29kZSB0byBzdXBwb3J0IHRoZSBNYXh0b3IgT25lVG91Y2gKIAkgIFVTQiBoYXJkIGRyaXZlJ3Mgb25ldG91Y2ggYnV0dG9uLgpAQCAtMTQ1LDYgKzE0NSwxNyBAQAogCSAgb24gdGhlIHJlc3VsdGluZyBzY3NpIGRldmljZSBub2RlIHJldHVybnMgdGhlIEthcm1hIHRvIG5vcm1hbAogCSAgb3BlcmF0aW9uLgogCitjb25maWcgVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQgorCWJvb2wgIlNBVCBlbXVsYXRpb24gb24gQ3lwcmVzcyBVU0IvQVRBIEJyaWRnZSB3aXRoIEFUQUNCIgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBTQVQgKGF0YSBwYXNzIHRocm91Z2gpIG9uIGRldmljZXMgYmFzZWQKKwkgIG9uIHRoZSBDeXByZXNzIFVTQi9BVEEgYnJpZGdlIHN1cHBvcnRpbmcgQVRBQ0IuIFRoaXMgd2lsbCBhbGxvdyB5b3UKKwkgIHRvIHVzZSB0b29scyB0byB0dW5lIGFuZCBtb25pdG9yIHlvdXIgZHJpdmUgKGxpa2UgaGRwYXJtIG9yIHNtYXJ0Y3RsKS4KKworCSAgSWYgeW91IHNheSBubyBoZXJlIHlvdXIgZGV2aWNlIHdpbGwgc3RpbGwgd29yayB3aXRoIHRoZSBzdGFuZGFyZCB1c2IKKwkgIG1hc3Mgc3RvcmFnZSBjbGFzcy4KKwogY29uZmlnIFVTQl9MSUJVU1VBTAogCWJvb2wgIlRoZSBzaGFyZWQgdGFibGUgb2YgY29tbW9uIChvciB1c3VhbCkgc3RvcmFnZSBkZXZpY2VzIgogCWRlcGVuZHMgb24gVVNCCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQppbmRleCAwMjM5NjliLi40YzU5NmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKQEAgLTIxLDYgKzIxLDcgQEAKIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEpCSs9IGFsYXVkYS5vCiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0gpCSs9IG9uZXRvdWNoLm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSkJKz0ga2FybWEubwordXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IpICs9IGN5cHJlc3NfYXRhY2IubwogCiB1c2Itc3RvcmFnZS1vYmpzIDo9CXNjc2lnbHVlLm8gcHJvdG9jb2wubyB0cmFuc3BvcnQubyB1c2IubyBcCiAJCQlpbml0aWFsaXplcnMubyAkKHVzYi1zdG9yYWdlLW9iai15KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2N5cHJlc3NfYXRhY2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg4MjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBTdXBwb3J0IGZvciBlbXVsYXRpbmcgU0FUIChhdGEgcGFzcyB0aHJvdWdoKSBvbiBkZXZpY2VzIGJhc2VkCisgKiAgICAgICBvbiB0aGUgQ3lwcmVzcyBVU0IvQVRBIGJyaWRnZSBzdXBwb3J0aW5nIEFUQUNCLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXR0aGlldSBDYXN0ZXQgKGNhc3RldC5tYXR0aGlldUBmcmVlLmZyKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgorCisjaW5jbHVkZSAidXNiLmgiCisjaW5jbHVkZSAicHJvdG9jb2wuaCIKKyNpbmNsdWRlICJzY3NpZ2x1ZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKy8qCisgKiBBVEFDQiBpcyBhIHByb3RvY29sIHVzZWQgb24gY3lwcmVzcyB1c2I8LT5hdGEgYnJpZGdlIHRvCisgKiBzZW5kIHJhdyBBVEEgY29tbWFuZCBvdmVyIG1hc3Mgc3RvcmFnZQorICogVGhlcmUgaXMgYSBBVEFDQjIgcHJvdG9jb2wgdGhhdCBzdXBwb3J0IExCQTQ4IG9uIG5ld2VyIGNoaXAuCisgKiBNb3JlIGluZm8gdGhhdCBiZSBmb3VuZCBvbiBjeTdjNjgzMTBfOC5wZGYgYW5kIGN5N2M2ODMwMGNfOC5wZGYKKyAqIGRhdGFzaGVldCBmcm9tIGN5cHJlc3MuY29tLgorICovCit2b2lkIGN5cHJlc3NfYXRhY2JfcGFzc3Rocm91Z2goc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJdW5zaWduZWQgY2hhciBzYXZlX2NtbmRbTUFYX0NPTU1BTkRfU0laRV07CisKKwlpZiAobGlrZWx5KHNyYi0+Y21uZFswXSAhPSBBVEFfMTYgJiYgc3JiLT5jbW5kWzBdICE9IEFUQV8xMikpIHsKKwkJdXNiX3N0b3JfdHJhbnNwYXJlbnRfc2NzaV9jb21tYW5kKHNyYiwgdXMpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNhdmVfY21uZCwgc3JiLT5jbW5kLCBzaXplb2Yoc2F2ZV9jbW5kKSk7CisJbWVtc2V0KHNyYi0+Y21uZCwgMCwgc2l6ZW9mKHNyYi0+Y21uZCkpOworCisJLyogY2hlY2sgaWYgd2Ugc3VwcG9ydCB0aGUgY29tbWFuZCAqLworCWlmIChzYXZlX2NtbmRbMV0gPj4gNSkgLyogTVVMVElQTEVfQ09VTlQgKi8KKwkJZ290byBpbnZhbGlkX2ZsZDsKKwkvKiBjaGVjayBwcm90b2NvbCAqLworCXN3aXRjaCgoc2F2ZV9jbW5kWzFdID4+IDEpICYgMHhmKSB7CisJCWNhc2UgMzogLypubyBEQVRBICovCisJCWNhc2UgNDogLyogUElPIGluICovCisJCWNhc2UgNTogLyogUElPIG91dCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGludmFsaWRfZmxkOworCX0KKworCS8qIGZpcnN0IGJ1aWxkIHRoZSBBVEFDQiBjb21tYW5kICovCisJc3JiLT5jbWRfbGVuID0gMTY7CisKKwlzcmItPmNtbmRbMF0gPSAweDI0OyAvKiBiVlNDQlNpZ25hdHVyZSA6IHZlbmRvci1zcGVjaWZpYyBjb21tYW5kCisJICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBjYW4gY2hhbmdlLCBidXQgbW9zdChhbGwgPykgbWFudWZhY3R1cmVycworCQkJCQkJCWtlZXAgdGhlIGN5cHJlc3MgZGVmYXVsdCA6IDB4MjQgKi8KKwlzcmItPmNtbmRbMV0gPSAweDI0OyAvKiBiVlNDQlN1YkNvbW1hbmQgOiAweDI0IGZvciBBVEFDQiAqLworCisJc3JiLT5jbW5kWzNdID0gMHhmZiAtIDE7IC8qIGZlYXR1cmVzLCBzZWN0b3IgY291bnQsIGxiYSBsb3csIGxiYSBtZWQKKwkJCQkJCQkJbGJhIGhpZ2gsIGRldmljZSwgY29tbWFuZCBhcmUgdmFsaWQgKi8KKwlzcmItPmNtbmRbNF0gPSAxOyAvKiBUcmFuc2ZlckJsb2NrQ291bnQgOiA1MTIgKi8KKworCWlmIChzYXZlX2NtbmRbMF0gPT0gQVRBXzE2KSB7CisJCXNyYi0+Y21uZFsgNl0gPSBzYXZlX2NtbmRbIDRdOyAvKiBmZWF0dXJlcyAqLworCQlzcmItPmNtbmRbIDddID0gc2F2ZV9jbW5kWyA2XTsgLyogc2VjdG9yIGNvdW50ICovCisJCXNyYi0+Y21uZFsgOF0gPSBzYXZlX2NtbmRbIDhdOyAvKiBsYmEgbG93ICovCisJCXNyYi0+Y21uZFsgOV0gPSBzYXZlX2NtbmRbMTBdOyAvKiBsYmEgbWVkICovCisJCXNyYi0+Y21uZFsxMF0gPSBzYXZlX2NtbmRbMTJdOyAvKiBsYmEgaGlnaCAqLworCQlzcmItPmNtbmRbMTFdID0gc2F2ZV9jbW5kWzEzXTsgLyogZGV2aWNlICovCisJCXNyYi0+Y21uZFsxMl0gPSBzYXZlX2NtbmRbMTRdOyAvKiBjb21tYW5kICovCisKKwkJaWYgKHNhdmVfY21uZFsxXSAmIDB4MDEpIHsvKiBleHRlbmRlZCBiaXQgc2V0IGZvciBMQkE0OCAqLworCQkJLyogdGhpcyBjb3VsZCBiZSBzdXBwb3J0ZWQgYnkgYXRhY2IyICovCisJCQlpZiAoc2F2ZV9jbW5kWzNdIHx8IHNhdmVfY21uZFs1XSB8fCBzYXZlX2NtbmRbN10gfHwgc2F2ZV9jbW5kWzldCisJCQkJCXx8IHNhdmVfY21uZFsxMV0pCisJCQkJZ290byBpbnZhbGlkX2ZsZDsKKwkJfQorCX0KKwllbHNlIHsgLyogQVRBMTIgKi8KKwkJc3JiLT5jbW5kWyA2XSA9IHNhdmVfY21uZFszXTsgLyogZmVhdHVyZXMgKi8KKwkJc3JiLT5jbW5kWyA3XSA9IHNhdmVfY21uZFs0XTsgLyogc2VjdG9yIGNvdW50ICovCisJCXNyYi0+Y21uZFsgOF0gPSBzYXZlX2NtbmRbNV07IC8qIGxiYSBsb3cgKi8KKwkJc3JiLT5jbW5kWyA5XSA9IHNhdmVfY21uZFs2XTsgLyogbGJhIG1lZCAqLworCQlzcmItPmNtbmRbMTBdID0gc2F2ZV9jbW5kWzddOyAvKiBsYmEgaGlnaCAqLworCQlzcmItPmNtbmRbMTFdID0gc2F2ZV9jbW5kWzhdOyAvKiBkZXZpY2UgKi8KKwkJc3JiLT5jbW5kWzEyXSA9IHNhdmVfY21uZFs5XTsgLyogY29tbWFuZCAqLworCisJfQorCS8qIEZpbHRlciBTRVRfRkVBVFVSRVMgLSBYRkVSIE1PREUgY29tbWFuZCAqLworCWlmICgoc3JiLT5jbW5kWzEyXSA9PSBBVEFfQ01EX1NFVF9GRUFUVVJFUykKKwkJCSYmIChzcmItPmNtbmRbNl0gPT0gU0VURkVBVFVSRVNfWEZFUikpCisJCWdvdG8gaW52YWxpZF9mbGQ7CisKKwlpZiAoc3JiLT5jbW5kWzEyXSA9PSBBVEFfQ01EX0lEX0FUQSB8fCBzcmItPmNtbmRbMTJdID09IEFUQV9DTURfSURfQVRBUEkpCisJCXNyYi0+Y21uZFsyXSB8PSAoMTw8Nyk7IC8qIHNldCAgSWRlbnRpZnlQYWNrZXREZXZpY2UgZm9yIHRoZXNlIGNtZHMgKi8KKworCisJdXNiX3N0b3JfdHJhbnNwYXJlbnRfc2NzaV9jb21tYW5kKHNyYiwgdXMpOworCisJLyogaWYgdGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgQVRBQ0IKKwkgKi8KKwlpZiAoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OICYmCisJCQltZW1jbXAoc3JiLT5zZW5zZV9idWZmZXIsIHVzYl9zdG9yX3NlbnNlX2ludmFsaWRDREIsCisJCQkJc2l6ZW9mKHVzYl9zdG9yX3NlbnNlX2ludmFsaWRDREIpKSA9PSAwKSB7CisJCVVTX0RFQlVHUCgiY3lwcmVzcyBhdGFjYiBub3Qgc3VwcG9ydGVkID8/P1xuIik7CisJCWdvdG8gZW5kOworCX0KKworCS8qIGlmIGNrX2NvbmQgZmxhZ3MgaXMgc2V0LCBhbmQgdGhlcmUgd2Fzbid0IGNyaXRpY2FsIGVycm9yLAorCSAqIGJ1aWxkIHRoZSBzcGVjaWFsIHNlbnNlCisJICovCisJaWYgKChzcmItPnJlc3VsdCAhPSAoRElEX0VSUk9SIDw8IDE2KSAmJgorCQkJCXNyYi0+cmVzdWx0ICE9IChESURfQUJPUlQgPDwgMTYpKSAmJgorCQkJc2F2ZV9jbW5kWzJdICYgMHgyMCkgeworCQlzdHJ1Y3Qgc2NzaV9laF9zYXZlIHNlczsKKwkJdW5zaWduZWQgY2hhciByZWdzWzhdOworCQl1bnNpZ25lZCBjaGFyICpzYiA9IHNyYi0+c2Vuc2VfYnVmZmVyOworCQl1bnNpZ25lZCBjaGFyICpkZXNjID0gc2IgKyA4OworCQlpbnQgdG1wX3Jlc3VsdDsKKworCQkvKiBidWlsZCB0aGUgY29tbWFuZCBmb3IKKwkJICogcmVhZGluZyB0aGUgQVRBIHJlZ2lzdGVycyAqLworCQlzY3NpX2VoX3ByZXBfY21uZChzcmIsICZzZXMsIE5VTEwsIDAsIDApOworCQlzcmItPnNkYi5sZW5ndGggPSBzaXplb2YocmVncyk7CisJCXNnX2luaXRfb25lKCZzZXMuc2Vuc2Vfc2dsLCByZWdzLCBzcmItPnNkYi5sZW5ndGgpOworCQlzcmItPnNkYi50YWJsZS5zZ2wgPSAmc2VzLnNlbnNlX3NnbDsKKwkJc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJc3JiLT5zZGIudGFibGUubmVudHMgPSAxOworCQkvKiB3ZSB1c2UgdGhlIHNhbWUgY29tbWFuZCBhcyBiZWZvcmUsIGJ1dCB3ZSBzZXQKKwkJICogdGhlIHJlYWQgdGFza2ZpbGUgYml0LCBmb3Igbm90IGV4ZWN1dGluZyBhdGFjYiBjb21tYW5kLAorCQkgKiBidXQgcmVhZGluZyByZWdpc3RlciBzZWxlY3RlZCBpbiBzcmItPmNtbmRbNF0KKwkJICovCisJCXNyYi0+Y21uZFsyXSA9IDE7CisKKwkJdXNiX3N0b3JfdHJhbnNwYXJlbnRfc2NzaV9jb21tYW5kKHNyYiwgdXMpOworCQl0bXBfcmVzdWx0ID0gc3JiLT5yZXN1bHQ7CisJCXNjc2lfZWhfcmVzdG9yZV9jbW5kKHNyYiwgJnNlcyk7CisJCS8qIHdlIGZhaWwgdG8gZ2V0IHJlZ2lzdGVycywgcmVwb3J0IGludmFsaWQgY29tbWFuZCAqLworCQlpZiAodG1wX3Jlc3VsdCAhPSBTQU1fU1RBVF9HT09EKQorCQkJZ290byBpbnZhbGlkX2ZsZDsKKworCQkvKiBidWlsZCB0aGUgc2Vuc2UgKi8KKwkJbWVtc2V0KHNiLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCisJCS8qIHNldCBzaywgYXNjIGZvciBhIGdvb2QgY29tbWFuZCAqLworCQlzYlsxXSA9IFJFQ09WRVJFRF9FUlJPUjsKKwkJc2JbMl0gPSAwOyAvKiBBVEEgUEFTUyBUSFJPVUdIIElORk9STUFUSU9OIEFWQUlMQUJMRSAqLworCQlzYlszXSA9IDB4MUQ7CisKKwkJLyogWFhYIHdlIHNob3VsZCBnZW5lcmF0ZSBzaywgYXNjLCBhc2NxIGZyb20gc3RhdHVzIGFuZCBlcnJvcgorCQkgKiByZWdzCisJCSAqIChzZWUgMTEuMSBFcnJvciB0cmFuc2xhdGlvbiCtIEFUQSBkZXZpY2UgZXJyb3IgdG8gU0NTSSBlcnJvciBtYXApCisJCSAqIGFuZCBhdGFfdG9fc2Vuc2VfZXJyb3IgZnJvbSBsaWJhdGEuCisJCSAqLworCisJCS8qIFNlbnNlIGRhdGEgaXMgY3VycmVudCBhbmQgZm9ybWF0IGlzIGRlc2NyaXB0b3IuICovCisJCXNiWzBdID0gMHg3MjsKKwkJZGVzY1swXSA9IDB4MDk7IC8qIEFUQV9SRVRVUk5fREVTQ1JJUFRPUiAqLworCisJCS8qIHNldCBsZW5ndGggb2YgYWRkaXRpb25hbCBzZW5zZSBkYXRhICovCisJCXNiWzddID0gMTQ7CisJCWRlc2NbMV0gPSAxMjsKKworCQkvKiBDb3B5IHJlZ2lzdGVycyBpbnRvIHNlbnNlIGJ1ZmZlci4gKi8KKwkJZGVzY1sgMl0gPSAweDAwOworCQlkZXNjWyAzXSA9IHJlZ3NbMV07ICAvKiBmZWF0dXJlcyAqLworCQlkZXNjWyA1XSA9IHJlZ3NbMl07ICAvKiBzZWN0b3IgY291bnQgKi8KKwkJZGVzY1sgN10gPSByZWdzWzNdOyAgLyogbGJhIGxvdyAqLworCQlkZXNjWyA5XSA9IHJlZ3NbNF07ICAvKiBsYmEgbWVkICovCisJCWRlc2NbMTFdID0gcmVnc1s1XTsgIC8qIGxiYSBoaWdoICovCisJCWRlc2NbMTJdID0gcmVnc1s2XTsgIC8qIGRldmljZSAqLworCQlkZXNjWzEzXSA9IHJlZ3NbN107ICAvKiBjb21tYW5kICovCisKKwkJc3JiLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwl9CisJZ290byBlbmQ7CitpbnZhbGlkX2ZsZDoKKwlzcmItPnJlc3VsdCA9IChEUklWRVJfU0VOU0UgPDwgMjQpIHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCisJbWVtY3B5KHNyYi0+c2Vuc2VfYnVmZmVyLAorCQkJdXNiX3N0b3Jfc2Vuc2VfaW52YWxpZENEQiwKKwkJCXNpemVvZih1c2Jfc3Rvcl9zZW5zZV9pbnZhbGlkQ0RCKSk7CitlbmQ6CisJbWVtY3B5KHNyYi0+Y21uZCwgc2F2ZV9jbW5kLCBzaXplb2Yoc2F2ZV9jbW5kKSk7CisJaWYgKHNyYi0+Y21uZFswXSA9PSBBVEFfMTIpCisJCXNyYi0+Y21kX2xlbiA9IDEyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2N5cHJlc3NfYXRhY2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFkYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIFN1cHBvcnQgZm9yIGVtdWxhdGluZyBTQVQgKGF0YSBwYXNzIHRocm91Z2gpIG9uIGRldmljZXMgYmFzZWQKKyAqICAgICAgIG9uIHRoZSBDeXByZXNzIFVTQi9BVEEgYnJpZGdlIHN1cHBvcnRpbmcgQVRBQ0IuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hdHRoaWV1IENhc3RldCAoY2FzdGV0Lm1hdHRoaWV1QGZyZWUuZnIpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1lQUkVTU19BVEFDQl9IXworI2RlZmluZSBfQ1lQUkVTU19BVEFDQl9IXworZXh0ZXJuIHZvaWQgY3lwcmVzc19hdGFjYl9wYXNzdGhyb3VnaChzdHJ1Y3Qgc2NzaV9jbW5kKiwgc3RydWN0IHVzX2RhdGEqKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jCmluZGV4IDU1Yjk1MjAuLmEyOGQ0OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvbGlidXN1YWwuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiX3VzdWFsLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAvKgogICovCkBAIC0zMCw3ICszMSw3IEBACiAjZGVmaW5lIEJJQVNfTkFNRV9TSVpFICAoc2l6ZW9mKCJ1c2Itc3RvcmFnZSIpKQogc3RhdGljIGNvbnN0IGNoYXIgKmJpYXNfbmFtZXNbM10gPSB7ICJub25lIiwgInVzYi1zdG9yYWdlIiwgInViIiB9OwogCi1zdGF0aWMgc3RydWN0IHNlbWFwaG9yZSB1c3VfaW5pdF9ub3RpZnk7CitzdGF0aWMgREVGSU5FX01VVEVYKHVzdV9wcm9iZV9tdXRleCk7CiBzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHVzdV9lbmRfbm90aWZ5KTsKIHN0YXRpYyBhdG9taWNfdCB0b3RhbF90aHJlYWRzID0gQVRPTUlDX0lOSVQoMCk7CiAKQEAgLTE3OCwxMCArMTc5LDcgQEAKIAlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIEEgY29tcGxldGlvbiBkb2VzIG5vdCB3b3JrIGhlcmUgYmVjYXVzZSBpdCdzIGNvdW50ZWQuICovCi0JZG93bigmdXN1X2luaXRfbm90aWZ5KTsKLQl1cCgmdXN1X2luaXRfbm90aWZ5KTsKLQorCW11dGV4X2xvY2soJnVzdV9wcm9iZV9tdXRleCk7CiAJcmMgPSByZXF1ZXN0X21vZHVsZShiaWFzX25hbWVzW3R5cGVdKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXN1X2xvY2ssIGZsYWdzKTsKIAlpZiAocmMgPT0gMCAmJiAoc3QtPmZscyAmIFVTVV9NT0RfRkxfUFJFU0VOVCkgPT0gMCkgewpAQCAtMTk0LDYgKzE5Miw3IEBACiAJfQogCXN0LT5mbHMgJj0gflVTVV9NT0RfRkxfVEhSRUFEOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzdV9sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZ1c3VfcHJvYmVfbXV0ZXgpOwogCiAJY29tcGxldGVfYW5kX2V4aXQoJnVzdV9lbmRfbm90aWZ5LCAwKTsKIH0KQEAgLTIwNCwxMCArMjAzLDkgQEAKIHsKIAlpbnQgcmM7CiAKLQlzZW1hX2luaXQoJnVzdV9pbml0X25vdGlmeSwgMCk7Ci0KKwltdXRleF9sb2NrKCZ1c3VfcHJvYmVfbXV0ZXgpOwogCXJjID0gdXNiX3JlZ2lzdGVyKCZ1c3VfZHJpdmVyKTsKLQl1cCgmdXN1X2luaXRfbm90aWZ5KTsKKwltdXRleF91bmxvY2soJnVzdV9wcm9iZV9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKaW5kZXggOGMxZTI5NS4uM2ZjZGU5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwpAQCAtNzMsNiArNzMsNyBAQAogc3RhdGljIGludCBzbGF2ZV9hbGxvYyAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IGhvc3RfdG9fdXMoc2Rldi0+aG9zdCk7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpidWxrX2luX2VwOwogCiAJLyoKIAkgKiBTZXQgdGhlIElOUVVJUlkgdHJhbnNmZXIgbGVuZ3RoIHRvIDM2LiAgV2UgZG9uJ3QgdXNlIGFueSBvZgpAQCAtODQsMTIgKzg1LDEzIEBACiAJLyogU2NhdHRlci1nYXRoZXIgYnVmZmVycyAoYWxsIGJ1dCB0aGUgbGFzdCkgbXVzdCBoYXZlIGEgbGVuZ3RoCiAJICogZGl2aXNpYmxlIGJ5IHRoZSBidWxrIG1heHBhY2tldCBzaXplLiAgT3RoZXJ3aXNlIGEgZGF0YSBwYWNrZXQKIAkgKiB3b3VsZCBlbmQgdXAgYmVpbmcgc2hvcnQsIGNhdXNpbmcgYSBwcmVtYXR1cmUgZW5kIHRvIHRoZSBkYXRhCi0JICogdHJhbnNmZXIuICBTaW5jZSBoaWdoLXNwZWVkIGJ1bGsgcGlwZXMgaGF2ZSBhIG1heHBhY2tldCBzaXplCi0JICogb2YgNTEyLCB3ZSdsbCB1c2UgdGhhdCBhcyB0aGUgc2NzaSBkZXZpY2UgcXVldWUncyBETUEgYWxpZ25tZW50Ci0JICogbWFzay4gIEd1YXJhbnRlZWluZyBwcm9wZXIgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBidWZmZXIgd2lsbAotCSAqIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0IGJlY2F1c2UsIGV4Y2VwdCBhdCB0aGUgYmVnaW5uaW5nIGFuZAotCSAqIHRoZSBlbmQsIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgZm9sbG93IHBhZ2UgYm91bmRhcmllcy4gKi8KLQlibGtfcXVldWVfdXBkYXRlX2RtYV9hbGlnbm1lbnQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgKDUxMiAtIDEpKTsKKwkgKiB0cmFuc2Zlci4gIFdlJ2xsIHVzZSB0aGUgbWF4cGFja2V0IHZhbHVlIG9mIHRoZSBidWxrLUlOIHBpcGUKKwkgKiB0byBzZXQgdGhlIFNDU0kgZGV2aWNlIHF1ZXVlJ3MgRE1BIGFsaWdubWVudCBtYXNrLgorCSAqLworCWJ1bGtfaW5fZXAgPSB1cy0+cHVzYl9kZXYtPmVwX2luW3VzYl9waXBlZW5kcG9pbnQodXMtPnJlY3ZfYnVsa19waXBlKV07CisJYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsCisJCQlsZTE2X3RvX2NwdShidWxrX2luX2VwLT5kZXNjLndNYXhQYWNrZXRTaXplKSAtIDEpOworCQkJLyogd01heFBhY2tldFNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KIAogCS8qCiAJICogVGhlIFVGSSBzcGVjIHRyZWF0ZXMgdGhlIFBlcmlwaGVyYWwgUXVhbGlmaWVyIGJpdHMgaW4gYW4KQEAgLTEzMiw3ICsxMzQsNyBAQAogCQkvKiBEaXNrLXR5cGUgZGV2aWNlcyB1c2UgTU9ERSBTRU5TRSg2KSBpZiB0aGUgcHJvdG9jb2wKIAkJICogKFN1YkNsYXNzKSBpcyBUcmFuc3BhcmVudCBTQ1NJLCBvdGhlcndpc2UgdGhleSB1c2UKIAkJICogTU9ERSBTRU5TRSgxMCkuICovCi0JCWlmICh1cy0+c3ViY2xhc3MgIT0gVVNfU0NfU0NTSSkKKwkJaWYgKHVzLT5zdWJjbGFzcyAhPSBVU19TQ19TQ1NJICYmIHVzLT5zdWJjbGFzcyAhPSBVU19TQ19DWVBfQVRBQ0IpCiAJCQlzZGV2LT51c2VfMTBfZm9yX21zID0gMTsKIAogCQkvKiBNYW55IGRpc2tzIG9ubHkgYWNjZXB0IE1PREUgU0VOU0UgdHJhbnNmZXIgbGVuZ3RocyBvZgpAQCAtMjI2LDEyICsyMjgsMTIgQEAKIHsKIAlzdHJ1Y3QgdXNfZGF0YSAqdXMgPSBob3N0X3RvX3VzKHNyYi0+ZGV2aWNlLT5ob3N0KTsKIAotCVVTX0RFQlVHUCgiJXMgY2FsbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCVVTX0RFQlVHUCgiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBjaGVjayBmb3Igc3RhdGUtdHJhbnNpdGlvbiBlcnJvcnMgKi8KIAlpZiAodXMtPnNyYiAhPSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiBVU0JfU1RPUkFHRSAiRXJyb3IgaW4gJXM6IHVzLT5zcmIgPSAlcFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgdXMtPnNyYik7CisJCQlfX2Z1bmNfXywgdXMtPnNyYik7CiAJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCX0KIApAQCAtMjYwLDcgKzI2Miw3IEBACiB7CiAJc3RydWN0IHVzX2RhdGEgKnVzID0gaG9zdF90b191cyhzcmItPmRldmljZS0+aG9zdCk7CiAKLQlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJLyogdXMtPnNyYiB0b2dldGhlciB3aXRoIHRoZSBUSU1FRF9PVVQsIFJFU0VUVElORywgYW5kIEFCT1JUSU5HCiAJICogYml0cyBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBob3N0IGxvY2suICovCkBAIC0yOTcsNyArMjk5LDcgQEAKIAlzdHJ1Y3QgdXNfZGF0YSAqdXMgPSBob3N0X3RvX3VzKHNyYi0+ZGV2aWNlLT5ob3N0KTsKIAlpbnQgcmVzdWx0OwogCi0JVVNfREVCVUdQKCIlcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyBhbmQgZG8gdGhlIHJlc2V0ICovCiAJbXV0ZXhfbG9jaygmKHVzLT5kZXZfbXV0ZXgpKTsKQEAgLTMxMyw3ICszMTUsNyBAQAogCXN0cnVjdCB1c19kYXRhICp1cyA9IGhvc3RfdG9fdXMoc3JiLT5kZXZpY2UtPmhvc3QpOwogCWludCByZXN1bHQ7CiAKLQlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCXJlc3VsdCA9IHVzYl9zdG9yX3BvcnRfcmVzZXQodXMpOwogCXJldHVybiByZXN1bHQgPCAwID8gRkFJTEVEIDogU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IGJkZDQzMzQuLjY2MTBkMmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKQEAgLTExMCw3ICsxMTAsNyBAQAogICovCiBzdGF0aWMgdm9pZCB1c2Jfc3Rvcl9ibG9ja2luZ19jb21wbGV0aW9uKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgY29tcGxldGlvbiAqdXJiX2RvbmVfcHRyID0gKHN0cnVjdCBjb21wbGV0aW9uICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBjb21wbGV0aW9uICp1cmJfZG9uZV9wdHIgPSB1cmItPmNvbnRleHQ7CiAKIAljb21wbGV0ZSh1cmJfZG9uZV9wdHIpOwogfQpAQCAtMTk4LDcgKzE5OCw3IEBACiAJaW50IHN0YXR1czsKIAogCVVTX0RFQlVHUCgiJXM6IHJxPSUwMnggcnF0eXBlPSUwMnggdmFsdWU9JTA0eCBpbmRleD0lMDJ4IGxlbj0ldVxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmVxdWVzdCwgcmVxdWVzdHR5cGUsCisJCQlfX2Z1bmNfXywgcmVxdWVzdCwgcmVxdWVzdHR5cGUsCiAJCQl2YWx1ZSwgaW5kZXgsIHNpemUpOwogCiAJLyogZmlsbCBpbiB0aGUgZGV2cmVxdWVzdCBzdHJ1Y3R1cmUgKi8KQEAgLTI1MCw3ICsyNTAsNyBAQAogCQl1c2Jfc2V0dG9nZ2xlKHVzLT5wdXNiX2RldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwKIAkJCQl1c2JfcGlwZW91dChwaXBlKSwgMCk7CiAKLQlVU19ERUJVR1AoIiVzOiByZXN1bHQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCVVTX0RFQlVHUCgiJXM6IHJlc3VsdCA9ICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0zMzIsNyArMzMyLDcgQEAKIAlpbnQgcmVzdWx0OwogCiAJVVNfREVCVUdQKCIlczogcnE9JTAyeCBycXR5cGU9JTAyeCB2YWx1ZT0lMDR4IGluZGV4PSUwMnggbGVuPSV1XG4iLAotCQkJX19GVU5DVElPTl9fLCByZXF1ZXN0LCByZXF1ZXN0dHlwZSwKKwkJCV9fZnVuY19fLCByZXF1ZXN0LCByZXF1ZXN0dHlwZSwKIAkJCXZhbHVlLCBpbmRleCwgc2l6ZSk7CiAKIAkvKiBmaWxsIGluIHRoZSBkZXZyZXF1ZXN0IHN0cnVjdHVyZSAqLwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJdW5zaWduZWQgaW50IHBpcGUgPSB1cy0+cmVjdl9pbnRyX3BpcGU7CiAJdW5zaWduZWQgaW50IG1heHA7CiAKLQlVU19ERUJVR1AoIiVzOiB4ZmVyICV1IGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CisJVVNfREVCVUdQKCIlczogeGZlciAldSBieXRlc1xuIiwgX19mdW5jX18sIGxlbmd0aCk7CiAKIAkvKiBjYWxjdWxhdGUgdGhlIG1heCBwYWNrZXQgc2l6ZSAqLwogCW1heHAgPSB1c2JfbWF4cGFja2V0KHVzLT5wdXNiX2RldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOwpAQCAtMzkzLDcgKzM5Myw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCVVTX0RFQlVHUCgiJXM6IHhmZXIgJXUgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwlVU19ERUJVR1AoIiVzOiB4ZmVyICV1IGJ5dGVzXG4iLCBfX2Z1bmNfXywgbGVuZ3RoKTsKIAogCS8qIGZpbGwgYW5kIHN1Ym1pdCB0aGUgVVJCICovCiAJdXNiX2ZpbGxfYnVsa191cmIodXMtPmN1cnJlbnRfdXJiLCB1cy0+cHVzYl9kZXYsIHBpcGUsIGJ1ZiwgbGVuZ3RoLApAQCAtNDI0LDcgKzQyNCw3IEBACiAJCXJldHVybiBVU0JfU1RPUl9YRkVSX0VSUk9SOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgc2NhdHRlci1nYXRoZXIgcmVxdWVzdCBibG9jayAqLwotCVVTX0RFQlVHUCgiJXM6IHhmZXIgJXUgYnl0ZXMsICVkIGVudHJpZXNcbiIsIF9fRlVOQ1RJT05fXywKKwlVU19ERUJVR1AoIiVzOiB4ZmVyICV1IGJ5dGVzLCAlZCBlbnRyaWVzXG4iLCBfX2Z1bmNfXywKIAkJCWxlbmd0aCwgbnVtX3NnKTsKIAlyZXN1bHQgPSB1c2Jfc2dfaW5pdCgmdXMtPmN1cnJlbnRfc2csIHVzLT5wdXNiX2RldiwgcGlwZSwgMCwKIAkJCXNnLCBudW1fc2csIGxlbmd0aCwgR0ZQX05PSU8pOwpAQCAtNjAzLDcgKzYwMyw4IEBACiAJCXNjc2lfZWhfcHJlcF9jbW5kKHNyYiwgJnNlcywgTlVMTCwgMCwgVVNfU0VOU0VfU0laRSk7CiAKIAkJLyogRklYTUU6IHdlIG11c3QgZG8gdGhlIHByb3RvY29sIHRyYW5zbGF0aW9uIGhlcmUgKi8KLQkJaWYgKHVzLT5zdWJjbGFzcyA9PSBVU19TQ19SQkMgfHwgdXMtPnN1YmNsYXNzID09IFVTX1NDX1NDU0kpCisJCWlmICh1cy0+c3ViY2xhc3MgPT0gVVNfU0NfUkJDIHx8IHVzLT5zdWJjbGFzcyA9PSBVU19TQ19TQ1NJIHx8CisJCQkJdXMtPnN1YmNsYXNzID09IFVTX1NDX0NZUF9BVEFDQikKIAkJCXNyYi0+Y21kX2xlbiA9IDY7CiAJCWVsc2UKIAkJCXNyYi0+Y21kX2xlbiA9IDEyOwpAQCAtNzAwLDcgKzcwMSw3IEBACiAvKiBTdG9wIHRoZSBjdXJyZW50IFVSQiB0cmFuc2ZlciAqLwogdm9pZCB1c2Jfc3Rvcl9zdG9wX3RyYW5zcG9ydChzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JVVNfREVCVUdQKCIlcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCS8qIElmIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIGJsb2NrZWQgd2FpdGluZyBmb3IgYW4gVVJCLAogCSAqIGxldCdzIHdha2UgaXQgdXAuICBUaGUgdGVzdF9hbmRfY2xlYXJfYml0KCkgY2FsbApAQCAtMTEzNCw3ICsxMTM1LDcgQEAKIAogaW50IHVzYl9zdG9yX0NCX3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKLQlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJbWVtc2V0KHVzLT5pb2J1ZiwgMHhGRiwgQ0JfUkVTRVRfQ01EX1NJWkUpOwogCXVzLT5pb2J1ZlswXSA9IFNFTkRfRElBR05PU1RJQzsKQEAgLTExNDksNyArMTE1MCw3IEBACiAgKi8KIGludCB1c2Jfc3Rvcl9CdWxrX3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKLQlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIHVzYl9zdG9yX3Jlc2V0X2NvbW1vbih1cywgVVNfQlVMS19SRVNFVF9SRVFVRVNULCAKIAkJCQkgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggOTEyNTIwNy4uNzMyYmY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCkBAIC0xNzE5LDYgKzE3MTksMTQgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0NBUEFDSVRZX0hFVVJJU1RJQ1MpLAogCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKK1VOVVNVQUxfREVWKCAgMHgwNGI0LCAweDY4MzAsIDB4MDAwMCwgMHg5OTk5LAorCQkiQ3lwcmVzcyIsCisJCSJDeXByZXNzIEFUMkxQIiwKKwkJVVNfU0NfQ1lQX0FUQUNCLCBVU19QUl9CVUxLLCBOVUxMLAorCQkwKSwKKyNlbmRpZgorCiAvKiBDb250cm9sL0J1bGsgdHJhbnNwb3J0IGZvciBhbGwgU3ViQ2xhc3MgdmFsdWVzICovCiBVU1VBTF9ERVYoVVNfU0NfUkJDLCBVU19QUl9DQiwgVVNCX1VTX1RZUEVfU1RPUiksCiBVU1VBTF9ERVYoVVNfU0NfODAyMCwgVVNfUFJfQ0IsIFVTQl9VU19UWVBFX1NUT1IpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKaW5kZXggYWM2MTE0ZS4uYTg1NmVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC0xMDEsNiArMTAxLDkgQEAKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEKICNpbmNsdWRlICJrYXJtYS5oIgogI2VuZGlmCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKKyNpbmNsdWRlICJjeXByZXNzX2F0YWNiLmgiCisjZW5kaWYKIAogLyogU29tZSBpbmZvcm1hdGlvbmFsIGRhdGEgKi8KIE1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgRGhhcm0gPG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0PiIpOwpAQCAtMTg3LDcgKzE5MCw3IEBACiAJLyogV2FpdCB1bnRpbCBubyBjb21tYW5kIGlzIHJ1bm5pbmcgKi8KIAltdXRleF9sb2NrKCZ1cy0+ZGV2X211dGV4KTsKIAotCVVTX0RFQlVHUCgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCIlc1xuIiwgX19mdW5jX18pOwogCWlmICh1cy0+c3VzcGVuZF9yZXN1bWVfaG9vaykKIAkJKHVzLT5zdXNwZW5kX3Jlc3VtZV9ob29rKSh1cywgVVNfU1VTUEVORCk7CiAKQEAgLTIwNCw3ICsyMDcsNyBAQAogCiAJbXV0ZXhfbG9jaygmdXMtPmRldl9tdXRleCk7CiAKLQlVU19ERUJVR1AoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCVVTX0RFQlVHUCgiJXNcbiIsIF9fZnVuY19fKTsKIAlpZiAodXMtPnN1c3BlbmRfcmVzdW1lX2hvb2spCiAJCSh1cy0+c3VzcGVuZF9yZXN1bWVfaG9vaykodXMsIFVTX1JFU1VNRSk7CiAKQEAgLTIxNiw3ICsyMTksNyBAQAogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCi0JVVNfREVCVUdQKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBSZXBvcnQgdGhlIHJlc2V0IHRvIHRoZSBTQ1NJIGNvcmUgKi8KIAl1c2Jfc3Rvcl9yZXBvcnRfYnVzX3Jlc2V0KHVzKTsKQEAgLTIzNyw3ICsyNDAsNyBAQAogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCi0JVVNfREVCVUdQKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBNYWtlIHN1cmUgbm8gY29tbWFuZCBydW5zIGR1cmluZyB0aGUgcmVzZXQgKi8KIAltdXRleF9sb2NrKCZ1cy0+ZGV2X211dGV4KTsKQEAgLTI0OCw3ICsyNTEsNyBAQAogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCi0JVVNfREVCVUdQKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBSZXBvcnQgdGhlIHJlc2V0IHRvIHRoZSBTQ1NJIGNvcmUgKi8KIAl1c2Jfc3Rvcl9yZXBvcnRfYnVzX3Jlc2V0KHVzKTsKQEAgLTQzNCw3ICs0MzcsNyBAQAogLyogQXNzb2NpYXRlIG91ciBwcml2YXRlIGRhdGEgd2l0aCB0aGUgVVNCIGRldmljZSAqLwogc3RhdGljIGludCBhc3NvY2lhdGVfZGV2KHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0JVVNfREVCVUdQKCItLSAlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlVU19ERUJVR1AoIi0tICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBGaWxsIGluIHRoZSBkZXZpY2UtcmVsYXRlZCBmaWVsZHMgKi8KIAl1cy0+cHVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwpAQCAtNzA4LDYgKzcxMSwxMyBAQAogCQlicmVhazsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKKwljYXNlIFVTX1NDX0NZUF9BVEFDQjoKKwkJdXMtPnByb3RvY29sX25hbWUgPSAiVHJhbnNwYXJlbnQgU0NTSSB3aXRoIEN5cHJlc3MgQVRBQ0IiOworCQl1cy0+cHJvdG9faGFuZGxlciA9IGN5cHJlc3NfYXRhY2JfcGFzc3Rocm91Z2g7CisJCWJyZWFrOworI2VuZGlmCisKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC04MDYsNyArODE2LDcgQEAKIC8qIFJlbGVhc2UgYWxsIG91ciBkeW5hbWljIHJlc291cmNlcyAqLwogc3RhdGljIHZvaWQgdXNiX3N0b3JfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IHVzX2RhdGEgKnVzKQogewotCVVTX0RFQlVHUCgiLS0gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCItLSAlc1xuIiwgX19mdW5jX18pOwogCiAJLyogVGVsbCB0aGUgY29udHJvbCB0aHJlYWQgdG8gZXhpdC4gIFRoZSBTQ1NJIGhvc3QgbXVzdAogCSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQgc28gaXQgd29uJ3QgdHJ5IHRvIHF1ZXVlCkBAIC04MzIsNyArODQyLDcgQEAKIC8qIERpc3NvY2lhdGUgZnJvbSB0aGUgVVNCIGRldmljZSAqLwogc3RhdGljIHZvaWQgZGlzc29jaWF0ZV9kZXYoc3RydWN0IHVzX2RhdGEgKnVzKQogewotCVVTX0RFQlVHUCgiLS0gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJVVNfREVCVUdQKCItLSAlc1xuIiwgX19mdW5jX18pOwogCiAJa2ZyZWUodXMtPnNlbnNlYnVmKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwppbmRleCBjODE1YTQwLi5iZTc2MDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYworKysgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwpAQCAtODgsNyArODgsNyBAQAogCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmc2tlbF9kcml2ZXIsIHN1Ym1pbm9yKTsKIAlpZiAoIWludGVyZmFjZSkgewogCQllcnIgKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc3VibWlub3IpOworCQkgICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yMTIsNyArMjEyLDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX3NrZWwgKmRldjsKIAotCWRldiA9IChzdHJ1Y3QgdXNiX3NrZWwgKil1cmItPmNvbnRleHQ7CisJZGV2ID0gdXJiLT5jb250ZXh0OwogCiAJLyogc3luYy9hc3luYyB1bmxpbmsgZmF1bHRzIGFyZW4ndCBlcnJvcnMgKi8KIAlpZiAodXJiLT5zdGF0dXMpIHsKQEAgLTIyMCw3ICsyMjAsNyBAQAogCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKIAkJICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKQogCQkJZXJyKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCSAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCiAJCXNwaW5fbG9jaygmZGV2LT5lcnJfbG9jayk7CiAJCWRldi0+ZXJyb3JzID0gdXJiLT5zdGF0dXM7CkBAIC0zMDEsNyArMzAxLDcgQEAKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOwogCW11dGV4X3VubG9jaygmZGV2LT5pb19tdXRleCk7CiAJaWYgKHJldHZhbCkgewotCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAkJZ290byBlcnJvcl91bmFuY2hvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi5oCmluZGV4IDU4M2UwNDguLmMwODY4OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IuaApAQCAtMjMsNiArMjMsNyBAQAogCiBzdHJ1Y3QgdXNiX2RldmljZTsKIHN0cnVjdCB1c2JfZHJpdmVyOworc3RydWN0IHd1c2JfZGV2OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0zNDEsMTAzICszNDIsMTQ2IEBACiAKIHN0cnVjdCB1c2JfdHQ7CiAKLS8qCisvKioKICAqIHN0cnVjdCB1c2JfZGV2aWNlIC0ga2VybmVsJ3MgcmVwcmVzZW50YXRpb24gb2YgYSBVU0IgZGV2aWNlCisgKiBAZGV2bnVtOiBkZXZpY2UgbnVtYmVyOyBhZGRyZXNzIG9uIGEgVVNCIGJ1cworICogQGRldnBhdGg6IGRldmljZSBJRCBzdHJpbmcgZm9yIHVzZSBpbiBtZXNzYWdlcyAoZS5nLiwgL3BvcnQvLi4uKQorICogQHN0YXRlOiBkZXZpY2Ugc3RhdGU6IGNvbmZpZ3VyZWQsIG5vdCBhdHRhY2hlZCwgZXRjLgorICogQHNwZWVkOiBkZXZpY2Ugc3BlZWQ6IGhpZ2gvZnVsbC9sb3cgKG9yIGVycm9yKQorICogQHR0OiBUcmFuc2FjdGlvbiBUcmFuc2xhdG9yIGluZm87IHVzZWQgd2l0aCBsb3cvZnVsbCBzcGVlZCBkZXYsIGhpZ2hzcGVlZCBodWIKKyAqIEB0dHBvcnQ6IGRldmljZSBwb3J0IG9uIHRoYXQgdHQgaHViCisgKiBAdG9nZ2xlOiBvbmUgYml0IGZvciBlYWNoIGVuZHBvaW50LCB3aXRoIChbMF0gPSBJTiwgWzFdID0gT1VUKSBlbmRwb2ludHMKKyAqIEBwYXJlbnQ6IG91ciBodWIsIHVubGVzcyB3ZSdyZSB0aGUgcm9vdAorICogQGJ1czogYnVzIHdlJ3JlIHBhcnQgb2YKKyAqIEBlcDA6IGVuZHBvaW50IDAgZGF0YSAoZGVmYXVsdCBjb250cm9sIHBpcGUpCisgKiBAZGV2OiBnZW5lcmljIGRldmljZSBpbnRlcmZhY2UKKyAqIEBkZXNjcmlwdG9yOiBVU0IgZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBjb25maWc6IGFsbCBvZiB0aGUgZGV2aWNlJ3MgY29uZmlncworICogQGFjdGNvbmZpZzogdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCisgKiBAZXBfaW46IGFycmF5IG9mIElOIGVuZHBvaW50cworICogQGVwX291dDogYXJyYXkgb2YgT1VUIGVuZHBvaW50cworICogQHJhd2Rlc2NyaXB0b3JzOiByYXcgZGVzY3JpcHRvcnMgZm9yIGVhY2ggY29uZmlnCisgKiBAYnVzX21BOiBDdXJyZW50IGF2YWlsYWJsZSBmcm9tIHRoZSBidXMKKyAqIEBwb3J0bnVtOiBwYXJlbnQgcG9ydCBudW1iZXIgKG9yaWdpbiAxKQorICogQGxldmVsOiBudW1iZXIgb2YgVVNCIGh1YiBhbmNlc3RvcnMKKyAqIEBjYW5fc3VibWl0OiBVUkJzIG1heSBiZSBzdWJtaXR0ZWQKKyAqIEBkaXNjb25fc3VzcGVuZGVkOiBkaXNjb25uZWN0ZWQgd2hpbGUgc3VzcGVuZGVkCisgKiBAcGVyc2lzdF9lbmFibGVkOiAgVVNCX1BFUlNJU1QgZW5hYmxlZCBmb3IgdGhpcyBkZXZpY2UKKyAqIEBoYXZlX2xhbmdpZDogd2hldGhlciBzdHJpbmdfbGFuZ2lkIGlzIHZhbGlkCisgKiBAYXV0aG9yaXplZDogcG9saWN5IGhhcyBzYWlkIHdlIGNhbiB1c2UgaXQ7CisgKgkodXNlciBzcGFjZSkgcG9saWN5IGRldGVybWluZXMgaWYgd2UgYXV0aG9yaXplIHRoaXMgZGV2aWNlIHRvIGJlCisgKgl1c2VkIG9yIG5vdC4gQnkgZGVmYXVsdCwgd2lyZWQgVVNCIGRldmljZXMgYXJlIGF1dGhvcml6ZWQuCisgKglXVVNCIGRldmljZXMgYXJlIG5vdCwgdW50aWwgd2UgYXV0aG9yaXplIHRoZW0gZnJvbSB1c2VyIHNwYWNlLgorICoJRklYTUUgLS0gY29tcGxldGUgZG9jCisgKiBAYXV0aGVudGljYXRlZDogQ3J5cHRvIGF1dGhlbnRpY2F0aW9uIHBhc3NlZAorICogQHd1c2I6IGRldmljZSBpcyBXaXJlbGVzcyBVU0IKKyAqIEBzdHJpbmdfbGFuZ2lkOiBsYW5ndWFnZSBJRCBmb3Igc3RyaW5ncworICogQHByb2R1Y3Q6IGlQcm9kdWN0IHN0cmluZywgaWYgcHJlc2VudCAoc3RhdGljKQorICogQG1hbnVmYWN0dXJlcjogaU1hbnVmYWN0dXJlciBzdHJpbmcsIGlmIHByZXNlbnQgKHN0YXRpYykKKyAqIEBzZXJpYWw6IGlTZXJpYWxOdW1iZXIgc3RyaW5nLCBpZiBwcmVzZW50IChzdGF0aWMpCisgKiBAZmlsZWxpc3Q6IHVzYmZzIGZpbGVzIHRoYXQgYXJlIG9wZW4gdG8gdGhpcyBkZXZpY2UKKyAqIEB1c2JfY2xhc3NkZXY6IFVTQiBjbGFzcyBkZXZpY2UgdGhhdCB3YXMgY3JlYXRlZCBmb3IgdXNiZnMgZGV2aWNlCisgKglhY2Nlc3MgZnJvbSB1c2Vyc3BhY2UKKyAqIEB1c2Jmc19kZW50cnk6IHVzYmZzIGRlbnRyeSBlbnRyeSBmb3IgdGhlIGRldmljZQorICogQG1heGNoaWxkOiBudW1iZXIgb2YgcG9ydHMgaWYgaHViCisgKiBAY2hpbGRyZW46IGNoaWxkIGRldmljZXMgLSBVU0IgZGV2aWNlcyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGlzIGh1YgorICogQHBtX3VzYWdlX2NudDogdXNhZ2UgY291bnRlciBmb3IgYXV0b3N1c3BlbmQKKyAqIEBxdWlya3M6IHF1aXJrcyBvZiB0aGUgd2hvbGUgZGV2aWNlCisgKiBAdXJibnVtOiBudW1iZXIgb2YgVVJCcyBzdWJtaXR0ZWQgZm9yIHRoZSB3aG9sZSBkZXZpY2UKKyAqIEBhY3RpdmVfZHVyYXRpb246IHRvdGFsIHRpbWUgZGV2aWNlIGlzIG5vdCBzdXNwZW5kZWQKKyAqIEBhdXRvc3VzcGVuZDogZm9yIGRlbGF5ZWQgYXV0b3N1c3BlbmRzCisgKiBAcG1fbXV0ZXg6IHByb3RlY3RzIFBNIG9wZXJhdGlvbnMKKyAqIEBsYXN0X2J1c3k6IHRpbWUgb2YgbGFzdCB1c2UKKyAqIEBhdXRvc3VzcGVuZF9kZWxheTogaW4gamlmZmllcworICogQGNvbm5lY3RfdGltZTogdGltZSBkZXZpY2Ugd2FzIGZpcnN0IGNvbm5lY3RlZAorICogQGF1dG9fcG06IGF1dG9zdXNwZW5kL3Jlc3VtZSBpbiBwcm9ncmVzcworICogQGRvX3JlbW90ZV93YWtldXA6ICByZW1vdGUgd2FrZXVwIHNob3VsZCBiZSBlbmFibGVkCisgKiBAcmVzZXRfcmVzdW1lOiBuZWVkcyByZXNldCBpbnN0ZWFkIG9mIHJlc3VtZQorICogQGF1dG9zdXNwZW5kX2Rpc2FibGVkOiBhdXRvc3VzcGVuZCBkaXNhYmxlZCBieSB0aGUgdXNlcgorICogQGF1dG9yZXN1bWVfZGlzYWJsZWQ6IGF1dG9yZXN1bWUgZGlzYWJsZWQgYnkgdGhlIHVzZXIKKyAqIEBza2lwX3N5c19yZXN1bWU6IHNraXAgdGhlIG5leHQgc3lzdGVtIHJlc3VtZQogICoKLSAqIEZJWE1FOiBXcml0ZSB0aGUga2VybmVsZG9jIQotICoKKyAqIE5vdGVzOgogICogVXNiY29yZSBkcml2ZXJzIHNob3VsZCBub3Qgc2V0IHVzYmRldi0+c3RhdGUgZGlyZWN0bHkuICBJbnN0ZWFkIHVzZQogICogdXNiX3NldF9kZXZpY2Vfc3RhdGUoKS4KLSAqCi0gKiBAYXV0aG9yaXplZDogKHVzZXIgc3BhY2UpIHBvbGljeSBkZXRlcm1pbmVzIGlmIHdlIGF1dGhvcml6ZSB0aGlzCi0gKiAgICAgICAgICAgICAgZGV2aWNlIHRvIGJlIHVzZWQgb3Igbm90LiBCeSBkZWZhdWx0LCB3aXJlZCBVU0IKLSAqICAgICAgICAgICAgICBkZXZpY2VzIGFyZSBhdXRob3JpemVkLiBXVVNCIGRldmljZXMgYXJlIG5vdCwgdW50aWwgd2UKLSAqICAgICAgICAgICAgICBhdXRob3JpemUgdGhlbSBmcm9tIHVzZXIgc3BhY2UuIEZJWE1FIC0tIGNvbXBsZXRlIGRvYwogICovCiBzdHJ1Y3QgdXNiX2RldmljZSB7Ci0JaW50CQlkZXZudW07CQkvKiBBZGRyZXNzIG9uIFVTQiBidXMgKi8KLQljaGFyCQlkZXZwYXRoIFsxNl07CS8qIFVzZSBpbiBtZXNzYWdlczogL3BvcnQvcG9ydC8uLi4gKi8KLQllbnVtIHVzYl9kZXZpY2Vfc3RhdGUJc3RhdGU7CS8qIGNvbmZpZ3VyZWQsIG5vdCBhdHRhY2hlZCwgZXRjICovCi0JZW51bSB1c2JfZGV2aWNlX3NwZWVkCXNwZWVkOwkvKiBoaWdoL2Z1bGwvbG93IChvciBlcnJvcikgKi8KKwlpbnQJCWRldm51bTsKKwljaGFyCQlkZXZwYXRoIFsxNl07CisJZW51bSB1c2JfZGV2aWNlX3N0YXRlCXN0YXRlOworCWVudW0gdXNiX2RldmljZV9zcGVlZAlzcGVlZDsKIAotCXN0cnVjdCB1c2JfdHQJKnR0OyAJCS8qIGxvdy9mdWxsIHNwZWVkIGRldiwgaGlnaHNwZWVkIGh1YiAqLwotCWludAkJdHRwb3J0OwkJLyogZGV2aWNlIHBvcnQgb24gdGhhdCB0dCBodWIgKi8KKwlzdHJ1Y3QgdXNiX3R0CSp0dDsKKwlpbnQJCXR0cG9ydDsKIAotCXVuc2lnbmVkIGludCB0b2dnbGVbMl07CQkvKiBvbmUgYml0IGZvciBlYWNoIGVuZHBvaW50Ci0JCQkJCSAqIChbMF0gPSBJTiwgWzFdID0gT1VUKSAqLworCXVuc2lnbmVkIGludCB0b2dnbGVbMl07CiAKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcGFyZW50OwkvKiBvdXIgaHViLCB1bmxlc3Mgd2UncmUgdGhlIHJvb3QgKi8KLQlzdHJ1Y3QgdXNiX2J1cyAqYnVzOwkJLyogQnVzIHdlJ3JlIHBhcnQgb2YgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqcGFyZW50OworCXN0cnVjdCB1c2JfYnVzICpidXM7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50IGVwMDsKIAotCXN0cnVjdCBkZXZpY2UgZGV2OwkJLyogR2VuZXJpYyBkZXZpY2UgaW50ZXJmYWNlICovCisJc3RydWN0IGRldmljZSBkZXY7CiAKLQlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3I7LyogRGVzY3JpcHRvciAqLwotCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZzsJLyogQWxsIG9mIHRoZSBjb25maWdzICovCisJc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciBkZXNjcmlwdG9yOworCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZzsKIAotCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmFjdGNvbmZpZzsvKiB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnICphY3Rjb25maWc7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcF9pblsxNl07CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcF9vdXRbMTZdOwogCi0JY2hhciAqKnJhd2Rlc2NyaXB0b3JzOwkJLyogUmF3IGRlc2NyaXB0b3JzIGZvciBlYWNoIGNvbmZpZyAqLworCWNoYXIgKipyYXdkZXNjcmlwdG9yczsKIAotCXVuc2lnbmVkIHNob3J0IGJ1c19tQTsJCS8qIEN1cnJlbnQgYXZhaWxhYmxlIGZyb20gdGhlIGJ1cyAqLwotCXU4IHBvcnRudW07CQkJLyogUGFyZW50IHBvcnQgbnVtYmVyIChvcmlnaW4gMSkgKi8KLQl1OCBsZXZlbDsJCQkvKiBOdW1iZXIgb2YgVVNCIGh1YiBhbmNlc3RvcnMgKi8KKwl1bnNpZ25lZCBzaG9ydCBidXNfbUE7CisJdTggcG9ydG51bTsKKwl1OCBsZXZlbDsKIAotCXVuc2lnbmVkIGNhbl9zdWJtaXQ6MTsJCS8qIFVSQnMgbWF5IGJlIHN1Ym1pdHRlZCAqLwotCXVuc2lnbmVkIGRpc2Nvbl9zdXNwZW5kZWQ6MTsJLyogRGlzY29ubmVjdGVkIHdoaWxlIHN1c3BlbmRlZCAqLwotCXVuc2lnbmVkIGhhdmVfbGFuZ2lkOjE7CQkvKiB3aGV0aGVyIHN0cmluZ19sYW5naWQgaXMgdmFsaWQgKi8KLQl1bnNpZ25lZCBhdXRob3JpemVkOjE7CQkvKiBQb2xpY3kgaGFzIHNhaWQgd2UgY2FuIHVzZSBpdCAqLwotCXVuc2lnbmVkIHd1c2I6MTsJCS8qIERldmljZSBpcyBXaXJlbGVzcyBVU0IgKi8KLQlpbnQgc3RyaW5nX2xhbmdpZDsJCS8qIGxhbmd1YWdlIElEIGZvciBzdHJpbmdzICovCisJdW5zaWduZWQgY2FuX3N1Ym1pdDoxOworCXVuc2lnbmVkIGRpc2Nvbl9zdXNwZW5kZWQ6MTsKKwl1bnNpZ25lZCBwZXJzaXN0X2VuYWJsZWQ6MTsKKwl1bnNpZ25lZCBoYXZlX2xhbmdpZDoxOworCXVuc2lnbmVkIGF1dGhvcml6ZWQ6MTsKKyAJdW5zaWduZWQgYXV0aGVudGljYXRlZDoxOworCXVuc2lnbmVkIHd1c2I6MTsKKwlpbnQgc3RyaW5nX2xhbmdpZDsKIAogCS8qIHN0YXRpYyBzdHJpbmdzIGZyb20gdGhlIGRldmljZSAqLwotCWNoYXIgKnByb2R1Y3Q7CQkJLyogaVByb2R1Y3Qgc3RyaW5nLCBpZiBwcmVzZW50ICovCi0JY2hhciAqbWFudWZhY3R1cmVyOwkJLyogaU1hbnVmYWN0dXJlciBzdHJpbmcsIGlmIHByZXNlbnQgKi8KLQljaGFyICpzZXJpYWw7CQkJLyogaVNlcmlhbE51bWJlciBzdHJpbmcsIGlmIHByZXNlbnQgKi8KKwljaGFyICpwcm9kdWN0OworCWNoYXIgKm1hbnVmYWN0dXJlcjsKKwljaGFyICpzZXJpYWw7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVsaXN0OwogI2lmZGVmIENPTkZJR19VU0JfREVWSUNFX0NMQVNTCiAJc3RydWN0IGRldmljZSAqdXNiX2NsYXNzZGV2OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1VTQl9ERVZJQ0VGUwotCXN0cnVjdCBkZW50cnkgKnVzYmZzX2RlbnRyeTsJLyogdXNiZnMgZGVudHJ5IGVudHJ5IGZvciB0aGUgZGV2aWNlICovCisJc3RydWN0IGRlbnRyeSAqdXNiZnNfZGVudHJ5OwogI2VuZGlmCi0JLyoKLQkgKiBDaGlsZCBkZXZpY2VzIC0gdGhlc2UgY2FuIGJlIGVpdGhlciBuZXcgZGV2aWNlcwotCSAqIChpZiB0aGlzIGlzIGEgaHViIGRldmljZSksIG9yIGRpZmZlcmVudCBpbnN0YW5jZXMKLQkgKiBvZiB0aGlzIHNhbWUgZGV2aWNlLgotCSAqCi0JICogRWFjaCBpbnN0YW5jZSBuZWVkcyBpdHMgb3duIHNldCBvZiBkYXRhIHN0cnVjdHVyZXMuCi0JICovCiAKLQlpbnQgbWF4Y2hpbGQ7CQkJLyogTnVtYmVyIG9mIHBvcnRzIGlmIGh1YiAqLworCWludCBtYXhjaGlsZDsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqY2hpbGRyZW5bVVNCX01BWENISUxEUkVOXTsKIAotCWludCBwbV91c2FnZV9jbnQ7CQkvKiB1c2FnZSBjb3VudGVyIGZvciBhdXRvc3VzcGVuZCAqLwotCXUzMiBxdWlya3M7CQkJLyogcXVpcmtzIG9mIHRoZSB3aG9sZSBkZXZpY2UgKi8KLQlhdG9taWNfdCB1cmJudW07CQkvKiBudW1iZXIgb2YgVVJCcyBzdWJtaXR0ZWQgZm9yCi0JCQkJCSAgIHRoZSB3aG9sZSBkZXZpY2UgKi8KKwlpbnQgcG1fdXNhZ2VfY250OworCXUzMiBxdWlya3M7CisJYXRvbWljX3QgdXJibnVtOwogCi0JdW5zaWduZWQgbG9uZyBhY3RpdmVfZHVyYXRpb247CS8qIHRvdGFsIHRpbWUgZGV2aWNlIGlzIG5vdCBzdXNwZW5kZWQgKi8KKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV9kdXJhdGlvbjsKIAogI2lmZGVmIENPTkZJR19QTQotCXN0cnVjdCBkZWxheWVkX3dvcmsgYXV0b3N1c3BlbmQ7IC8qIGZvciBkZWxheWVkIGF1dG9zdXNwZW5kcyAqLwotCXN0cnVjdCBtdXRleCBwbV9tdXRleDsJCS8qIHByb3RlY3RzIFBNIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGF1dG9zdXNwZW5kOworCXN0cnVjdCBtdXRleCBwbV9tdXRleDsKIAotCXVuc2lnbmVkIGxvbmcgbGFzdF9idXN5OwkvKiB0aW1lIG9mIGxhc3QgdXNlICovCi0JaW50IGF1dG9zdXNwZW5kX2RlbGF5OwkJLyogaW4gamlmZmllcyAqLwotCXVuc2lnbmVkIGxvbmcgY29ubmVjdF90aW1lOwkvKiB0aW1lIGRldmljZSB3YXMgZmlyc3QgY29ubmVjdGVkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X2J1c3k7CisJaW50IGF1dG9zdXNwZW5kX2RlbGF5OworCXVuc2lnbmVkIGxvbmcgY29ubmVjdF90aW1lOwogCi0JdW5zaWduZWQgYXV0b19wbToxOwkJLyogYXV0b3N1c3BlbmQvcmVzdW1lIGluIHByb2dyZXNzICovCi0JdW5zaWduZWQgZG9fcmVtb3RlX3dha2V1cDoxOwkvKiByZW1vdGUgd2FrZXVwIHNob3VsZCBiZSBlbmFibGVkICovCi0JdW5zaWduZWQgcmVzZXRfcmVzdW1lOjE7CS8qIG5lZWRzIHJlc2V0IGluc3RlYWQgb2YgcmVzdW1lICovCi0JdW5zaWduZWQgcGVyc2lzdF9lbmFibGVkOjE7CS8qIFVTQl9QRVJTSVNUIGVuYWJsZWQgZm9yIHRoaXMgZGV2ICovCi0JdW5zaWduZWQgYXV0b3N1c3BlbmRfZGlzYWJsZWQ6MTsgLyogYXV0b3N1c3BlbmQgYW5kIGF1dG9yZXN1bWUgKi8KLQl1bnNpZ25lZCBhdXRvcmVzdW1lX2Rpc2FibGVkOjE7ICAvKiAgZGlzYWJsZWQgYnkgdGhlIHVzZXIgKi8KLQl1bnNpZ25lZCBza2lwX3N5c19yZXN1bWU6MTsJLyogc2tpcCB0aGUgbmV4dCBzeXN0ZW0gcmVzdW1lICovCisJdW5zaWduZWQgYXV0b19wbToxOworCXVuc2lnbmVkIGRvX3JlbW90ZV93YWtldXA6MTsKKwl1bnNpZ25lZCByZXNldF9yZXN1bWU6MTsKKwl1bnNpZ25lZCBhdXRvc3VzcGVuZF9kaXNhYmxlZDoxOworCXVuc2lnbmVkIGF1dG9yZXN1bWVfZGlzYWJsZWQ6MTsKKwl1bnNpZ25lZCBza2lwX3N5c19yZXN1bWU6MTsKICNlbmRpZgorCXN0cnVjdCB3dXNiX2RldiAqd3VzYl9kZXY7CiB9OwogI2RlZmluZQl0b191c2JfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdXNiX2RldmljZSwgZGV2KQogCkBAIC04OTgsMTAgKzk0MiwxMSBAQAogICoJYW5kIHNob3VsZCBub3JtYWxseSBiZSB0aGUgc2FtZSBhcyB0aGUgbW9kdWxlIG5hbWUuCiAgKiBAcHJvYmU6IENhbGxlZCB0byBzZWUgaWYgdGhlIGRyaXZlciBpcyB3aWxsaW5nIHRvIG1hbmFnZSBhIHBhcnRpY3VsYXIKICAqCWludGVyZmFjZSBvbiBhIGRldmljZS4gIElmIGl0IGlzLCBwcm9iZSByZXR1cm5zIHplcm8gYW5kIHVzZXMKLSAqCWRldl9zZXRfZHJ2ZGF0YSgpIHRvIGFzc29jaWF0ZSBkcml2ZXItc3BlY2lmaWMgZGF0YSB3aXRoIHRoZQorICoJdXNiX3NldF9pbnRmZGF0YSgpIHRvIGFzc29jaWF0ZSBkcml2ZXItc3BlY2lmaWMgZGF0YSB3aXRoIHRoZQogICoJaW50ZXJmYWNlLiAgSXQgbWF5IGFsc28gdXNlIHVzYl9zZXRfaW50ZXJmYWNlKCkgdG8gc3BlY2lmeSB0aGUKICAqCWFwcHJvcHJpYXRlIGFsdHNldHRpbmcuICBJZiB1bndpbGxpbmcgdG8gbWFuYWdlIHRoZSBpbnRlcmZhY2UsCi0gKglyZXR1cm4gYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KKyAqCXJldHVybiAtRU5PREVWLCBpZiBnZW51aW5lIElPIGVycm9ycyBvY2N1cmVkLCBhbiBhcHByb3ByaWF0ZQorICoJbmVnYXRpdmUgZXJybm8gdmFsdWUuCiAgKiBAZGlzY29ubmVjdDogQ2FsbGVkIHdoZW4gdGhlIGludGVyZmFjZSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZSwgdXN1YWxseQogICoJYmVjYXVzZSBpdHMgZGV2aWNlIGhhcyBiZWVuIChvciBpcyBiZWluZykgZGlzY29ubmVjdGVkIG9yIHRoZQogICoJZHJpdmVyIG1vZHVsZSBpcyBiZWluZyB1bmxvYWRlZC4KQEAgLTkxNiwxMCArOTYxLDcgQEAKICAqIEBwcmVfcmVzZXQ6IENhbGxlZCBieSB1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZSgpIHdoZW4gdGhlIGRldmljZQogICoJaXMgYWJvdXQgdG8gYmUgcmVzZXQuCiAgKiBAcG9zdF9yZXNldDogQ2FsbGVkIGJ5IHVzYl9yZXNldF9jb21wb3NpdGVfZGV2aWNlKCkgYWZ0ZXIgdGhlIGRldmljZQotICoJaGFzIGJlZW4gcmVzZXQsIG9yIGluIGxpZXUgb2YgQHJlc3VtZSBmb2xsb3dpbmcgYSByZXNldC1yZXN1bWUKLSAqCShpLmUuLCB0aGUgZGV2aWNlIGlzIHJlc2V0IGluc3RlYWQgb2YgYmVpbmcgcmVzdW1lZCwgYXMgbWlnaHQKLSAqCWhhcHBlbiBpZiBwb3dlciB3YXMgbG9zdCkuICBUaGUgc2Vjb25kIGFyZ3VtZW50IHRlbGxzIHdoaWNoIGlzCi0gKgl0aGUgcmVhc29uLgorICoJaGFzIGJlZW4gcmVzZXQKICAqIEBpZF90YWJsZTogVVNCIGRyaXZlcnMgdXNlIElEIHRhYmxlIHRvIHN1cHBvcnQgaG90cGx1Z2dpbmcuCiAgKglFeHBvcnQgdGhpcyB3aXRoIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLC4uLikuICBUaGlzIG11c3QgYmUgc2V0CiAgKglvciB5b3VyIGRyaXZlcidzIHByb2JlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZC4KQEAgLTE0MTEsNiArMTQ1Myw3IEBACiBleHRlcm4gaW50IHVzYl91bmxpbmtfdXJiKHN0cnVjdCB1cmIgKnVyYik7CiBleHRlcm4gdm9pZCB1c2Jfa2lsbF91cmIoc3RydWN0IHVyYiAqdXJiKTsKIGV4dGVybiB2b2lkIHVzYl9raWxsX2FuY2hvcmVkX3VyYnMoc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcik7CitleHRlcm4gdm9pZCB1c2JfdW5saW5rX2FuY2hvcmVkX3VyYnMoc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcik7CiBleHRlcm4gdm9pZCB1c2JfYW5jaG9yX3VyYihzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCB1c2JfYW5jaG9yICphbmNob3IpOwogZXh0ZXJuIHZvaWQgdXNiX3VuYW5jaG9yX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogZXh0ZXJuIGludCB1c2Jfd2FpdF9hbmNob3JfZW1wdHlfdGltZW91dChzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yLApAQCAtMTY2MSwxMyArMTcwNCwxMiBAQAogI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZvcm1hdCAiXG4iICwgXAotCV9fRklMRV9fICwgIyMgYXJnKQotI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQgIlxuIiAsIFwKLQlfX0ZJTEVfXyAsICMjIGFyZykKLSNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIgZm9ybWF0ICJcbiIgLCBcCi0JX19GSUxFX18gLCAjIyBhcmcpCi0KKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUgIjogIiBcCisJZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIiBcCisJZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgS0JVSUxEX01PRE5BTUUgIjogIiBcCisJZm9ybWF0ICJcbiIgLCAjIyBhcmcpCiAKICNlbmRpZiAgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9hdWRpby5oIGIvaW5jbHVkZS9saW51eC91c2IvYXVkaW8uaAppbmRleCAyZGZlZWYxLi44Y2IwMjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9hdWRpby5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2F1ZGlvLmgKQEAgLTUwLDQgKzUwLDQgQEAKIAlfX3U4ICBiYUludGVyZmFjZU5yW25dOwkJCQkJXAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKIAotI2VuZGlmCisjZW5kaWYgLyogX19MSU5VWF9VU0JfQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvY2RjLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaAppbmRleCA5NGVlNGVjLi43MWU1MmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaApAQCAtNiw2ICs2LDkgQEAKICAqIGZpcm13YXJlIGJhc2VkIFVTQiBwZXJpcGhlcmFscy4KICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX0NEQ19ICisjZGVmaW5lIF9fTElOVVhfVVNCX0NEQ19ICisKICNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19BQ00JCQkweDAyCiAjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQJCTB4MDYKICNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19XSENNCQkJMHgwOApAQCAtMjIxLDMgKzIyNCw0IEBACiAJX19sZTE2CXdMZW5ndGg7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorI2VuZGlmIC8qIF9fTElOVVhfVVNCX0NEQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jaDkuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCmluZGV4IDYxNjk0MzguLjdlMGQzMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCkBAIC02Niw4ICs2Niw4IEBACiAjZGVmaW5lIFVTQl9SRUNJUF9FTkRQT0lOVAkJMHgwMgogI2RlZmluZSBVU0JfUkVDSVBfT1RIRVIJCQkweDAzCiAvKiBGcm9tIFdpcmVsZXNzIFVTQiAxLjAgKi8KLSNkZWZpbmUgVVNCX1JFQ0lQX1BPUlQgCQkJMHgwNAotI2RlZmluZSBVU0JfUkVDSVBfUlBJUEUgCQkweDA1CisjZGVmaW5lIFVTQl9SRUNJUF9QT1JUCQkJMHgwNAorI2RlZmluZSBVU0JfUkVDSVBfUlBJUEUJCTB4MDUKIAogLyoKICAqIFN0YW5kYXJkIHJlcXVlc3RzLCBmb3IgdGhlIGJSZXF1ZXN0IGZpZWxkIG9mIGEgU0VUVVAgcGFja2V0LgpAQCAtMTAyLDEwICsxMDIsMTYgQEAKICNkZWZpbmUgVVNCX1JFUV9MT09QQkFDS19EQVRBX1JFQUQJMHgxNgogI2RlZmluZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0VfRFMJMHgxNwogCisvKiBUaGUgTGluayBQb3dlciBNYW5nZW1lbnQgKExQTSkgRUNOIGRlZmluZXMgVVNCX1JFUV9URVNUX0FORF9TRVQgY29tbWFuZCwKKyAqIHVzZWQgYnkgaHVicyB0byBwdXQgcG9ydHMgaW50byBhIG5ldyBMMSBzdXNwZW5kIHN0YXRlLCBleGNlcHQgdGhhdCBpdAorICogZm9yZ290IHRvIGRlZmluZSBpdHMgbnVtYmVyIC4uLgorICovCisKIC8qCiAgKiBVU0IgZmVhdHVyZSBmbGFncyBhcmUgd3JpdHRlbiB1c2luZyBVU0JfUkVRX3tDTEVBUixTRVR9X0ZFQVRVUkUsIGFuZAogICogYXJlIHJlYWQgYXMgYSBiaXQgYXJyYXkgcmV0dXJuZWQgYnkgVVNCX1JFUV9HRVRfU1RBVFVTLiAgKFNvIHRoZXJlCi0gKiBhcmUgYXQgbW9zdCBzaXh0ZWVuIGZlYXR1cmVzIG9mIGVhY2ggdHlwZS4pCisgKiBhcmUgYXQgbW9zdCBzaXh0ZWVuIGZlYXR1cmVzIG9mIGVhY2ggdHlwZS4pICBIdWJzIG1heSBhbHNvIHN1cHBvcnQgYQorICogbmV3IFVTQl9SRVFfVEVTVF9BTkRfU0VUX0ZFQVRVUkUgdG8gcHV0IHBvcnRzIGludG8gTDEgc3VzcGVuZC4KICAqLwogI2RlZmluZSBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRAkJMAkvKiAocmVhZCBvbmx5KSAqLwogI2RlZmluZSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAJMQkvKiBkZXYgbWF5IGluaXRpYXRlIHdha2V1cCAqLwpAQCAtMTgwLDYgKzE4Niw3IEBACiAjZGVmaW5lIFVTQl9EVF9XSVJFTEVTU19FTkRQT0lOVF9DT01QCTB4MTEKICNkZWZpbmUgVVNCX0RUX1dJUkVfQURBUFRFUgkJMHgyMQogI2RlZmluZSBVU0JfRFRfUlBJUEUJCQkweDIyCisjZGVmaW5lIFVTQl9EVF9DU19SQURJT19DT05UUk9MCQkweDIzCiAKIC8qIENvbnZlbnRpb25hbCBjb2RlcyBmb3IgY2xhc3Mtc3BlY2lmaWMgZGVzY3JpcHRvcnMuICBUaGUgY29udmVudGlvbiBpcwogICogZGVmaW5lZCBpbiB0aGUgVVNCICJDb21tb24gQ2xhc3MiIFNwZWMgKDMuMTEpLiAgSW5kaXZpZHVhbCBjbGFzcyBzcGVjcwpAQCAtNTc0LDcgKzU4MSw5IEBACiAJLyogTk9URTogIHRoZXJlIGFyZSBhY3R1YWxseSBmb3VyIGRpZmZlcmVudCBTVVNQRU5ERUQKIAkgKiBzdGF0ZXMsIHJldHVybmluZyB0byBQT1dFUkVELCBERUZBVUxULCBBRERSRVNTLCBvcgogCSAqIENPTkZJR1VSRUQgcmVzcGVjdGl2ZWx5IHdoZW4gU09GIHRva2VucyBmbG93IGFnYWluLgorCSAqIEF0IHRoaXMgbGV2ZWwgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4gTDEgYW5kIEwyCisJICogc3VzcGVuZCBzdGF0ZXMuICAoTDIgYmVpbmcgb3JpZ2luYWwgVVNCIDEuMSBzdXNwZW5kLikKIAkgKi8KIH07CiAKLSNlbmRpZgkvKiBfX0xJTlVYX1VTQl9DSDlfSCAqLworI2VuZGlmIC8qIF9fTElOVVhfVVNCX0NIOV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9nX3ByaW50ZXIuaCBiL2luY2x1ZGUvbGludXgvdXNiL2dfcHJpbnRlci5oCmluZGV4IDBjNWVhMWUuLjYxNzhmZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2dfcHJpbnRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2dfcHJpbnRlci5oCkBAIC0xOCw2ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2lmbmRlZiBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSAogCiAjZGVmaW5lIFBSSU5URVJfTk9UX0VSUk9SCTB4MDgKICNkZWZpbmUgUFJJTlRFUl9TRUxFQ1RFRAkweDEwCkBAIC0yOSwzICszMSw1IEBACiAgKi8KICNkZWZpbmUgR0FER0VUX0dFVF9QUklOVEVSX1NUQVRVUwlfSU9SKCdnJywgMHgyMSwgdW5zaWduZWQgY2hhcikKICNkZWZpbmUgR0FER0VUX1NFVF9QUklOVEVSX1NUQVRVUwlfSU9XUignZycsIDB4MjIsIHVuc2lnbmVkIGNoYXIpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0LmggYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAppbmRleCBmMzI5NTI5Li5kODEyOGY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaApAQCAtODQ2LDQgKzg0Niw0IEBACiAKIGV4dGVybiB2b2lkIHVzYl9lcF9hdXRvY29uZmlnX3Jlc2V0KHN0cnVjdCB1c2JfZ2FkZ2V0ICopIF9fZGV2aW5pdDsKIAotI2VuZGlmCS8qIF9fTElOVVhfVVNCX0dBREdFVF9IICovCisjZW5kaWYgLyogX19MSU5VWF9VU0JfR0FER0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXRmcy5oCmluZGV4IGMyOTFhYjEuLmVhNDVmMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0ZnMuaApAQCAtMSwxMSArMSwzIEBACi0jaWZuZGVmIF9fTElOVVhfVVNCX0dBREdFVEZTX0gKLSNkZWZpbmUgX19MSU5VWF9VU0JfR0FER0VURlNfSAotCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3RsLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+Ci0KIC8qCiAgKiBGaWxlc3lzdGVtIGJhc2VkIHVzZXItbW9kZSBBUEkgdG8gVVNCIEdhZGdldCBjb250cm9sbGVyIGhhcmR3YXJlCiAgKgpAQCAtMjMsNiArMTUsMTQgQEAKICAqIHRoZW4gcGVyZm9ybWluZyBkYXRhIHRyYW5zZmVycyBieSByZWFkaW5nIG9yIHdyaXRpbmcuCiAgKi8KIAorI2lmbmRlZiBfX0xJTlVYX1VTQl9HQURHRVRGU19ICisjZGVmaW5lIF9fTElOVVhfVVNCX0dBREdFVEZTX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorCiAvKgogICogRXZlbnRzIGFyZSBkZWxpdmVyZWQgb24gdGhlIGVwMCBmaWxlIGRlc2NyaXB0b3IsIHdoZW4gdGhlIHVzZXIgbW9kZSBkcml2ZXIKICAqIHJlYWRzIGZyb20gdGhpcyBmaWxlIGRlc2NyaXB0b3IgYWZ0ZXIgd3JpdGluZyB0aGUgZGVzY3JpcHRvcnMuICBEb24ndApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvaW5wdXQuaCBiL2luY2x1ZGUvbGludXgvdXNiL2lucHV0LmgKaW5kZXggNzE2ZTBjYy4uMGUwMTBiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvaW5wdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9pbnB1dC5oCkBAIC0xLDYgKzEsMyBAQAotI2lmbmRlZiBfX1VTQl9JTlBVVF9ICi0jZGVmaW5lIF9fVVNCX0lOUFVUX0gKLQogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNSBEbWl0cnkgVG9yb2tob3YKICAqCkBAIC05LDYgKzYsOSBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX0lOUFVUX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfSU5QVVRfSAorCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CkBAIC0yMiw0ICsyMiw0IEBACiAJaWQtPnZlcnNpb24gPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKIH0KIAotI2VuZGlmCisjZW5kaWYgLyogX19MSU5VWF9VU0JfSU5QVVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvaW93YXJyaW9yLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9pb3dhcnJpb3IuaAppbmRleCBkZTZmMzgwLi40ZmQ2NTEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9pb3dhcnJpb3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9pb3dhcnJpb3IuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0lPV0FSUklPUl9IXwotI2RlZmluZSBfSU9XQVJSSU9SX0hfCisjaWZuZGVmIF9fTElOVVhfVVNCX0lPV0FSUklPUl9ICisjZGVmaW5lIF9fTElOVVhfVVNCX0lPV0FSUklPUl9ICiAKICNkZWZpbmUgQ09ERU1FUkNTX01BR0lDX05VTUJFUgkweEMwCS8qIGxpa2UgQ09kZSBNZXJjZW5hcmllcyAqLwogCkBAIC0zOSw0ICszOSw0IEBACiAqLwogI2RlZmluZSBJT1dfR0VUSU5GTyBfSU9SKENPREVNRVJDU19NQUdJQ19OVU1CRVIsIDMsIHN0cnVjdCBpb3dhcnJpb3JfaW5mbykKIAotI2VuZGlmICAvKiBfSU9XQVJSSU9SX0hfICovCisjZW5kaWYgLyogX19MSU5VWF9VU0JfSU9XQVJSSU9SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2lzcDExNnguaCBiL2luY2x1ZGUvbGludXgvdXNiL2lzcDExNnguaAppbmRleCA2N2QyODI2Li45NmNhMTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9pc3AxMTZ4LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvaXNwMTE2eC5oCkBAIC0xLDkgKzEsMTEgQEAKLQogLyoKICAqIEJvYXJkIGluaXRpYWxpemF0aW9uIGNvZGUgc2hvdWxkIHB1dCBvbmUgb2YgdGhlc2UgaW50byBkZXYtPnBsYXRmb3JtX2RhdGEKICAqIGFuZCBwbGFjZSB0aGUgaXNwMTE2eCBvbnRvIHBsYXRmb3JtX2J1cy4KICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX0lTUDExNlhfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9JU1AxMTZYX0gKKwogc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSB7CiAJLyogRW5hYmxlIGludGVybmFsIHJlc2lzdG9ycyBvbiBkb3duc3RyZWFtIHBvcnRzICovCiAJdW5zaWduZWQgc2VsMTVLcmVzOjE7CkBAIC0yNywzICsyOSw1IEBACiAJICovCiAJdm9pZCAoKmRlbGF5KSAoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZGVsYXkpOwogfTsKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX0lTUDExNlhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oIGIvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oCmluZGV4IDgwNjI0YzUuLjFkMTA0MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL21pZGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9taWRpLmgKQEAgLTEwOSw0ICsxMDksNCBAQAogCV9fdTggIGJhQXNzb2NKYWNrSURbbl07CQkJCQlcCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQogCi0jZW5kaWYKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9NSURJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL25ldDIyODAuaCBiL2luY2x1ZGUvbGludXgvdXNiL25ldDIyODAuaAppbmRleCBlYzg5N2NiLi45NmNhNTQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9uZXQyMjgwLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvbmV0MjI4MC5oCkBAIC0xLDExICsxLDcgQEAKIC8qCiAgKiBOZXRDaGlwIDIyODAgaGlnaC9mdWxsIHNwZWVkIFVTQiBkZXZpY2UgY29udHJvbGxlci4KICAqIFVubGlrZSBtYW55IHN1Y2ggY29udHJvbGxlcnMsIHRoaXMgb25lIHRhbGtzIFBDSS4KLSAqLwotI2lmbmRlZiBfX0xJTlVYX1VTQl9ORVQyMjgwX0gKLSNkZWZpbmUgX19MSU5VWF9VU0JfTkVUMjI4MF9ICi0KLS8qCisgKgogICogQ29weXJpZ2h0IChDKSAyMDAyIE5ldENoaXAgVGVjaG5vbG9neSwgSW5jLiAoaHR0cDovL3d3dy5uZXRjaGlwLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBCcm93bmVsbAogICoKQEAgLTI0LDYgKzIwLDkgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX05FVDIyODBfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9ORVQyMjgwX0gKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogTkVUMjI4MCBNRU1PUlkgTUFQUEVEIFJFR0lTVEVSUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivb3RnLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaAppbmRleCBlMDA3MDc0Li4xZGIyNWQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaApAQCAtMSwxMSArMSwxMyBAQAogLyogVVNCIE9URyAoT24gVGhlIEdvKSBkZWZpbmVzICovCi0KIC8qCisgKgogICogVGhlc2UgQVBJcyBtYXkgYmUgdXNlZCBiZXR3ZWVuIFVTQiBjb250cm9sbGVycy4gIFVTQiBkZXZpY2UgZHJpdmVycwogICogKGZvciBlaXRoZXIgaG9zdCBvciBwZXJpcGhlcmFsIHJvbGVzKSBkb24ndCB1c2UgdGhlc2UgY2FsbHM7IHRoZXkKICAqIGNvbnRpbnVlIHRvIHVzZSBqdXN0IHVzYl9kZXZpY2UgYW5kIHVzYl9nYWRnZXQuCiAgKi8KIAorI2lmbmRlZiBfX0xJTlVYX1VTQl9PVEdfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9PVEdfSAogCiAvKiBPVEcgZGVmaW5lcyBsb3RzIG9mIGVudW1lcmF0aW9uIHN0YXRlcyBiZWZvcmUgZGV2aWNlIHJlc2V0ICovCiBlbnVtIHVzYl9vdGdfc3RhdGUgewpAQCAtMTI5LDMgKzEzMSw1IEBACiAKIC8qIGZvciBPVEcgY29udHJvbGxlciBkcml2ZXJzIChhbmQgbWF5YmUgb3RoZXIgc3R1ZmYpICovCiBleHRlcm4gaW50IHVzYl9idXNfc3RhcnRfZW51bShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCB1bnNpZ25lZCBwb3J0X251bSk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9PVEdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvcXVpcmtzLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9xdWlya3MuaAppbmRleCAxZjk5OWVjLi43ZjZjNjAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9xdWlya3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9xdWlya3MuaApAQCAtNCw2ICs0LDkgQEAKICAqIGJlbG9uZyBoZXJlLgogICovCiAKKyNpZm5kZWYgX19MSU5VWF9VU0JfUVVJUktTX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfUVVJUktTX0gKKwogLyogc3RyaW5nIGRlc2NyaXB0b3JzIG11c3Qgbm90IGJlIGZldGNoZWQgdXNpbmcgYSAyNTUtYnl0ZSByZWFkICovCiAjZGVmaW5lIFVTQl9RVUlSS19TVFJJTkdfRkVUQ0hfMjU1CTB4MDAwMDAwMDEKIApAQCAtMTIsMyArMTUsNSBAQAogCiAvKiBkZXZpY2UgY2FuJ3QgaGFuZGxlIFNldC1JbnRlcmZhY2UgcmVxdWVzdHMgKi8KICNkZWZpbmUgVVNCX1FVSVJLX05PX1NFVF9JTlRGCQkweDAwMDAwMDA0CisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9RVUlSS1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivcm5kaXNfaG9zdC5oIGIvaW5jbHVkZS9saW51eC91c2Ivcm5kaXNfaG9zdC5oCmluZGV4IGVkYzFkNGEuLjI5ZDY0NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3JuZGlzX2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9ybmRpc19ob3N0LmgKQEAgLTE3LDEwICsxNyw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAotCi0jaWZuZGVmCV9fUk5ESVNfSE9TVF9ICi0jZGVmaW5lCV9fUk5ESVNfSE9TVF9ICi0KKyNpZm5kZWYJX19MSU5VWF9VU0JfUk5ESVNfSE9TVF9ICisjZGVmaW5lCV9fTElOVVhfVVNCX1JORElTX0hPU1RfSAogCiAvKgogICogQ09OVFJPTCB1c2VzIENEQyAiZW5jYXBzdWxhdGVkIGNvbW1hbmRzIiB3aXRoIGZ1bmt5IG5vdGlmaWNhdGlvbnMuCkBAIC0yNzAsNSArMjY4LDQgQEAKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqCiBybmRpc190eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIGdmcF90IGZsYWdzKTsKIAotI2VuZGlmCS8qIF9fUk5ESVNfSE9TVF9IICovCi0KKyNlbmRpZgkvKiBfX0xJTlVYX1VTQl9STkRJU19IT1NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKaW5kZXggMjFiNGExYy4uOGY4OTFjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKQEAgLTEwLDcgKzEwLDYgQEAKICAqCiAgKi8KIAotCiAjaWZuZGVmIF9fTElOVVhfVVNCX1NFUklBTF9ICiAjZGVmaW5lIF9fTElOVVhfVVNCX1NFUklBTF9ICiAKQEAgLTE0Niw4ICsxNDUsNiBAQAogfTsKICNkZWZpbmUgdG9fdXNiX3NlcmlhbChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9zZXJpYWwsIGtyZWYpCiAKLSNkZWZpbmUgTlVNX0RPTlRfQ0FSRQk5OQotCiAvKiBnZXQgYW5kIHNldCB0aGUgc2VyaWFsIHByaXZhdGUgZGF0YSBwb2ludGVyIGhlbHBlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqdXNiX2dldF9zZXJpYWxfZGF0YShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewpAQCAtMTY1LDE4ICsxNjIsNiBAQAogICoJdXNlZCBpbiB0aGUgc3lzbG9nIG1lc3NhZ2VzIHdoZW4gYSBkZXZpY2UgaXMgaW5zZXJ0ZWQgb3IgcmVtb3ZlZC4KICAqIEBpZF90YWJsZTogcG9pbnRlciB0byBhIGxpc3Qgb2YgdXNiX2RldmljZV9pZCBzdHJ1Y3R1cmVzIHRoYXQgZGVmaW5lIGFsbAogICoJb2YgdGhlIGRldmljZXMgdGhpcyBzdHJ1Y3R1cmUgY2FuIHN1cHBvcnQuCi0gKiBAbnVtX2ludGVycnVwdF9pbjogSWYgYSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoaXMgbWFueSBpbnRlcnJ1cHQtaW4KLSAqCWVuZHBvaW50cywgaXQgd29uJ3QgYmUgc2VudCB0byB0aGUgZHJpdmVyJ3MgYXR0YWNoKCkgbWV0aG9kLgotICoJKEJ1dCBpdCBtaWdodCBzdGlsbCBiZSBzZW50IHRvIHRoZSBwcm9iZSgpIG1ldGhvZC4pCi0gKiBAbnVtX2ludGVycnVwdF9vdXQ6IElmIGEgZGV2aWNlIGRvZXNuJ3QgaGF2ZSB0aGlzIG1hbnkgaW50ZXJydXB0LW91dAotICoJZW5kcG9pbnRzLCBpdCB3b24ndCBiZSBzZW50IHRvIHRoZSBkcml2ZXIncyBhdHRhY2goKSBtZXRob2QuCi0gKgkoQnV0IGl0IG1pZ2h0IHN0aWxsIGJlIHNlbnQgdG8gdGhlIHByb2JlKCkgbWV0aG9kLikKLSAqIEBudW1fYnVsa19pbjogSWYgYSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoaXMgbWFueSBidWxrLWluCi0gKgllbmRwb2ludHMsIGl0IHdvbid0IGJlIHNlbnQgdG8gdGhlIGRyaXZlcidzIGF0dGFjaCgpIG1ldGhvZC4KLSAqCShCdXQgaXQgbWlnaHQgc3RpbGwgYmUgc2VudCB0byB0aGUgcHJvYmUoKSBtZXRob2QuKQotICogQG51bV9idWxrX291dDogSWYgYSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoaXMgbWFueSBidWxrLW91dAotICoJZW5kcG9pbnRzLCBpdCB3b24ndCBiZSBzZW50IHRvIHRoZSBkcml2ZXIncyBhdHRhY2goKSBtZXRob2QuCi0gKgkoQnV0IGl0IG1pZ2h0IHN0aWxsIGJlIHNlbnQgdG8gdGhlIHByb2JlKCkgbWV0aG9kLikKICAqIEBudW1fcG9ydHM6IHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IHBvcnRzIHRoaXMgZGV2aWNlIHdpbGwgaGF2ZS4KICAqIEBjYWxjX251bV9wb3J0czogcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSBob3cgbWFueSBwb3J0cyB0aGlzCiAgKglkZXZpY2UgaGFzIGR5bmFtaWNhbGx5LiAgSXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHByb2JlKCkKQEAgLTIxMiwxMCArMTk3LDYgQEAKIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciB7CiAJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CiAJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlOwotCWNoYXIJbnVtX2ludGVycnVwdF9pbjsKLQljaGFyCW51bV9pbnRlcnJ1cHRfb3V0OwotCWNoYXIJbnVtX2J1bGtfaW47Ci0JY2hhcgludW1fYnVsa19vdXQ7CiAJY2hhcgludW1fcG9ydHM7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRyaXZlcl9saXN0OwpAQCAtMzQwLDUgKzMyMSw1IEBACiAKIAogCi0jZW5kaWYJLyogaWZkZWYgX19MSU5VWF9VU0JfU0VSSUFMX0ggKi8KKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9TRVJJQUxfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9zbDgxMS5oIGIvaW5jbHVkZS9saW51eC91c2Ivc2w4MTEuaAppbmRleCA4NzczNzNkLi4zYWZlNGQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9zbDgxMS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL3NsODExLmgKQEAgLTEsOSArMSwxMSBAQAotCiAvKgogICogYm9hcmQgaW5pdGlhbGl6YXRpb24gc2hvdWxkIHB1dCBvbmUgb2YgdGhlc2UgaW50byBkZXYtPnBsYXRmb3JtX2RhdGEKICAqIGFuZCBwbGFjZSB0aGUgc2w4MTFocyBvbnRvIHBsYXRmb3JtX2J1cyBuYW1lZCAic2w4MTEtaGNkIi4KICAqLwogCisjaWZuZGVmIF9fTElOVVhfVVNCX1NMODExX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfU0w4MTFfSAorCiBzdHJ1Y3Qgc2w4MTFfcGxhdGZvcm1fZGF0YSB7CiAJdW5zaWduZWQJY2FuX3dha2V1cDoxOwogCkBAIC0yNCwzICsyNiw0IEBACiAJLyogdm9pZAkJKCpjbG9ja19lbmFibGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlzX29uKTsgKi8KIH07CiAKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9TTDgxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaCBiL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCmluZGV4IGUwNTAxZGEuLmJhMDlmZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCkBAIC0xOSwxMCArMTksOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKLQotI2lmbmRlZglfX1VTQk5FVF9ICi0jZGVmaW5lCV9fVVNCTkVUX0gKLQorI2lmbmRlZglfX0xJTlVYX1VTQl9VU0JORVRfSAorI2RlZmluZQlfX0xJTlVYX1VTQl9VU0JORVRfSAogCiAvKiBpbnRlcmZhY2UgZnJvbSB1c2JuZXQgY29yZSB0byBlYWNoIFVTQiBuZXR3b3JraW5nIGxpbmsgd2UgaGFuZGxlICovCiBzdHJ1Y3QgdXNibmV0IHsKQEAgLTIxMSw0ICsyMDksNCBAQAogCXByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZtdCAiXG4iICwgKHVzYm5ldCktPm5ldC0+bmFtZSAsICMjIGFyZyk7IFwKIAogCi0jZW5kaWYJLyogX19VU0JORVRfSCAqLworI2VuZGlmIC8qIF9fTElOVVhfVVNCX1VTQk5FVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCAwYTQwZGZhLi5kOWEzYmJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTg1LDYgKzg1LDcgQEAKICNkZWZpbmUgVVNfU0NfTE9DS0FCTEUJMHgwNwkJLyogUGFzc3dvcmQtcHJvdGVjdGVkICovCiAKICNkZWZpbmUgVVNfU0NfSVNEMjAwICAgIDB4ZjAJCS8qIElTRDIwMCBBVEEgKi8KKyNkZWZpbmUgVVNfU0NfQ1lQX0FUQUNCIDB4ZjEJCS8qIEN5cHJlc3MgQVRBQ0IgKi8KICNkZWZpbmUgVVNfU0NfREVWSUNFCTB4ZmYJCS8qIFVzZSBkZXZpY2UncyB2YWx1ZSAqLwogCiAvKiBQcm90b2NvbHMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiZGV2aWNlX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3VzYmRldmljZV9mcy5oCmluZGV4IDE3Y2IxMDguLjMxMThlZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiZGV2aWNlX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2JkZXZpY2VfZnMuaApAQCAtNzcsOCArNzcsMTEgQEAKIAl1bnNpZ25lZCBjaGFyIHNsb3c7CiB9OwogCi0jZGVmaW5lIFVTQkRFVkZTX1VSQl9TSE9SVF9OT1RfT0sgICAgICAgICAgMQotI2RlZmluZSBVU0JERVZGU19VUkJfSVNPX0FTQVAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVVNCREVWRlNfVVJCX1NIT1JUX05PVF9PSwkweDAxCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9JU09fQVNBUAkJMHgwMgorI2RlZmluZSBVU0JERVZGU19VUkJfTk9fRlNCUgkJMHgyMAorI2RlZmluZSBVU0JERVZGU19VUkJfWkVST19QQUNLRVQJMHg0MAorI2RlZmluZSBVU0JERVZGU19VUkJfTk9fSU5URVJSVVBUCTB4ODAKIAogI2RlZmluZSBVU0JERVZGU19VUkJfVFlQRV9JU08JCSAgIDAKICNkZWZpbmUgVVNCREVWRlNfVVJCX1RZUEVfSU5URVJSVVBUCSAgIDEKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCA1OGE5NDk0Li42NGVjNGI4IDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC0xODg5LDYgKzE4ODksMTMgQEAKIAkJCQlXQVJOKCJrZnJlZShOVUxMKSBpcyBzYWZlIHRoaXMgY2hlY2sgaXMgcHJvYmFiYWxseSBub3QgcmVxdWlyZWRcbiIgLiAkaGVyZXByZXYpOwogCQkJfQogCQl9CisjIGNoZWNrIGZvciBuZWVkbGVzcyB1c2JfZnJlZV91cmIoKSBjaGVja3MKKwkJaWYgKCRwcmV2bGluZSA9fiAvXGJpZlxzKlwoKFteXCldKilcKS8pIHsKKwkJCW15ICRleHByID0gJDE7CisJCQlpZiAoJGxpbmUgPX4gL1xidXNiX2ZyZWVfdXJiXChcUSRleHByXEVcKTsvKSB7CisJCQkJV0FSTigidXNiX2ZyZWVfdXJiKE5VTEwpIGlzIHNhZmUgdGhpcyBjaGVjayBpcyBwcm9iYWJhbGx5IG5vdCByZXF1aXJlZFxuIiAuICRoZXJlcHJldik7CisJCQl9CisJCX0KIAogIyB3YXJuIGFib3V0ICNpZmRlZnMgaW4gQyBmaWxlcwogIwkJaWYgKCRsaW5lID1+IC9eLiNccyppZih8bilkZWYvICYmICgkcmVhbGZpbGUgPX4gL1wuYyQvKSkgewo=